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 Z*p 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 (mod p) điều này có nghĩa là :
h(g-m)q = gr (mod p). Với phân tích nhƣ vậy, chúng ta có chiến lƣợc nhƣ sau:
- Tính tất cả các lũy thừa của g theo modulo p: g0, g1, …, gm-1 (mod p), - Trƣớc hết, tính g-m
(mod p), tiếp theo, ta tính h(g-m)q (mod p) với q = 0, 1, 2, … cho đến khi xuất hiện q thỏa mãn h(g-m)q ≡ qr (mod p) 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 (mod 31) = 21. Sau đó, ta tính đƣợc 3-6 (mod 31) = 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 (mod 31), h(g-m)4 = 6.24 ≡ 3 (mod 31),
Đến đây ta thấy h(g-m)4 = g1 (mod p). Đ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.