Cho p là một số nguyên tố, thuật toán bước Baby bước Giant của Shank là một thuật toán tính logarithm rời rạc của số nguyên h thuộc *
p
Z với cơ số g và theo modulo p. Thuật toán này nhanh hơn thuật toán vét cạn với số phép toán trung bình là
( log )
O p p .
Ý tưởng của thuật toán như sau: Giả sử m p
, khi đó nếu x là logarithm rời rạc của h ta có thể viết x=mq+r với q là số nguyên nào đó và 0 r m . Bởi vậy, ta có đẳng thức:
h = gx = gmqgr(modp) điều này có nghĩa là :
h(g-m)q=gr(modp).
- Tính tất cả các lũy thừa của g theo modulo p: g0, g1, …, gm-1(modp),
- Trước hết, tính g-m(modp), tiếp theo, ta tính h(g-m)q(modp) với q=0, 1, 2, … cho đến khi xuất hiện q thỏa mãn h(g-m)q≡qr(modp) với 0 r m nào đó.
Khi đó, logarithm rời rạc của h trong *
p
Z theo cơ số g bằng x=mq+r.
Ví dụ, chọn p=31, và ta có thể kiểm tra g=3 là phần tử nguyên thủy của * 31
Z . Giả sử ta cần tìm logarithm rời rạc của h=6.
Các bước thực hiện như sau: - Tính m p6
và tính 6 lũy thừa của g: go=1, g1 = 3, g2 = 3, g3 = 27, g4 = 81≡19(mod31), g5 = g4 g≡19*3≡26(mod31).
- Tiếp theo, chúng ta tính g-1=3-1(mod31). Áp dụng thuật toán Euclide mở rộng ta có 3-
1
(mod31)=21. Sau đó, ta tính được 3-6(mod31)=2. Đến đây, ta tính h(g-m)q=6.2q với các giá trị của q chạy từ 0 tăng lên:
h(g-m)0=6.20=6, h(g-m)1=6.21=12, h(g-m)2=6.22=24,
h(g-m)3=6.23≡17(mod31), h(g-m)4=6.24≡3(mod31),
Đến đây ta thấy h(g-m)4=g1(modp). Điều nay có nghĩa là h≡g4m+1≡g4.6+1≡g25. Vậy logarithm rời rạc của h=6 là 25.