6.4.2.1 Thuật toán Fermat
Theo định lý Fermat, nếu 𝑛 là số nguyên tố và 𝑎 là số nguyên bất kỳ, 1 ≤ 𝑎 ≤ 𝑛 − 1
thì 𝑎𝑛−1 ≡ 1 (𝑚𝑜𝑑 𝑛). Do đó, cho trước một số nguyên 𝑛, nếu tìm được một giá trị
𝑎 sao cho 𝑎𝑛−1 ≢ 1 (𝑚𝑜𝑑 𝑛) thì 𝑛 chắn chắn là hợp số. Chiều ngược lại của định lý không đúng, nghĩa là nếu một số nguyên 𝑛 thỏa 𝑎𝑛−1 ≡ 1 (𝑚𝑜𝑑 𝑛) thì chưa chắc 𝑛
là số nguyên tố. Trong trường hợp này ta gọi 𝑛 là số giả nguyên tố cơ sở 𝑎. Thuật toán kiểm tra Fermat như sau [40, tr.136-137]:
Fermat(n, t)
Đầu vào: số nguyên lẻ 𝑛 ≥ 3 và tham số an toàn 𝑡 ≥ 118.
Đầu ra: n là “số nguyên tố” hay “hợp số” (1) Với mỗi𝑖 = 1 → 𝑡
(1.1) Chọn một số ngẫu nhiên 𝑎, 2 ≤ 𝑎 ≤ 𝑛 − 2. (1.2) 𝑟 ← 𝑎𝑛−1 𝑚𝑜𝑑 𝑛.
(1.3) Nếu𝑟 ≠ 1thì trả về “hợp số”. (2) Trả về “số nguyên tố”.
Thuật toán 6.3. Kiếm tra tính nguyên tố theo xác suất Fermat
18
Nếu xác suất để một hợp số vượt qua phép thử (được kết luận là số nguyên tố) là 𝑝 ≤ 1 thì xác suất để nó vượt qua 𝑡 phép thử là 𝑝𝑡 (rất thấp khi 𝑡 lớn).
Do không thể nào kiểm tra hết mọi giá trị 𝑎 nên khi thuật toán này kết luận 𝑛 là “số nguyên tố” thì không có bằng chứng nào chứng minh 𝑛 thật sự là số nguyên tố. Một số 𝑛 là số giả nguyên tố với nhiều cơ sở 𝑎 thì khả năng nó là số nguyên tố là rất lớn. Tuy nhiên, tồn tại các số giả nguyên tố với mọi cơ sở a, đó là số Carmichael. Số
Carmichael là hợp số nguyên 𝑛 thỏa mãn 𝑎𝑛−1 ≡ 1 (𝑚𝑜𝑑 𝑛) với mọi số nguyên dương 𝑎 sao cho (𝑛, 𝑎) = 1.
Như vậy, kiểm tra Fermat sẽ kết luận sai khi gặp các số Carmichael. Phần tiếp theo sẽ trình bày các thuật toán kiểm tra mạnh hơn thường được sử dụng.
6.4.2.2 Thuật toán Solovay-Strassen
Robert Solovay và Volker Strassen đã phát triển thuật toán kiểm tra tính nguyên tố theo xác suất [55]. Thuật toán này sử dụng ký hiệu Jacobi phục vụ cho việc kiểm tra xem 𝑝 có phải là số nguyên tố hay không.
Thuật toán kiểm tra Solovay-Strassen như sau [40, tr.137-138]:
Solovay-Strassen(n, t)
Đầu vào: số nguyên lẻ 𝑛 ≥ 3 và tham số an toàn 𝑡 ≥ 1.
Đầu ra: n là “số nguyên tố” hay “hợp số” (1) Với mỗi𝑖 = 1 → 𝑡
(1.1) Chọn một số ngẫu nhiên 𝑎, 2 ≤ 𝑎 ≤ 𝑛 − 2. (1.2) 𝑟 ← 𝑎𝑛−1 𝑚𝑜𝑑 𝑛.
(1.3) Nếu𝑟 ≠ 1thì trả về “hợp số”. (2) Trả về “số nguyên tố”.
Thuật toán 6.4. Kiểm tra tính nguyên tố theo xác suất Solovay-Strassen
Nếu 𝑛 là hợp số, xác suất của số ngẫu nhiên 𝑎 cho biết 𝑛 chắc chắn không là số nguyên tố không ít hơn 50%. Lập lại phép thử 𝑡 lần với 𝑡 giá trị ngẫu nhiên khác nhau của 𝑎, xác suất để một hợp số 𝑛 qua tất cả 𝑡 phép thử không lớn hơn 1
2 𝑡
.
Đây là thuật toán được sử dụng phổ biến đầu tiên cùng với sự phát triển của hệ mã khóa công khai, đặc biệt là hệ mã RSA. Tuy nhiên, hiện nay nó được thay thế bởi thuật toán Miller Rabin hiệu quả hơn và luôn cho kết quả chính xác.
6.4.2.3 Thuật toán Miller Rabin
Thuật toán khá dễ hiểu và được nhiều người sử dụng được phát triển bởi Michael Rabin, dựa trên một phần ý tưởng của Gary Miller [41], [46]. Đây là thuật toán kiểm
tra tính xác suất được sử dụng hầu hết trong thực thế, cũng được biết đến như là kiểm tra số giả nguyên tố mạnh. Nó là phiên bản đơn giản hóa của thuật toán được đề nghị trong đề xuất của chuẩn chữ ký số DSS.
Kiểm tra Miller Rabin dựa trên định lý sau:
Cho 𝑛 là một số nguyên tố lẻ, cho 𝑛 − 1 = 2𝑠𝑟 trong đó 𝑟 là số lẻ.
Cho 𝑎 là số nguyên bất kỳ sao cho 𝑔𝑐𝑑(𝑎, 𝑛) = 1. Lúc này 𝑎𝑟 ≡ 1 (𝑚𝑜𝑑 𝑛) hoặc
𝑎2𝑗𝑟 ≡ 1 𝑚𝑜𝑑 𝑛 với j nào đó, 0 ≤ 𝑗 ≤ 𝑠 − 1.
Thuật toán kiểm tra Miller-Rabin như sau [40, tr.138-140]:
Miller-Rabin(n, t)
Đầu vào: số nguyên lẻ 𝑛 ≥ 3 và tham số an toàn 𝑡 ≥ 1.
Đầu ra: n là “số nguyên tố” hay “hợp số” (1) Tính 𝑟 lẻ và 𝑠 với 𝑛 − 1 = 2𝑠𝑟. (2) Với mỗi𝑖 = 1 → 𝑡 (2.1) Chọn một số ngẫu nhiên 𝑎, 2 ≤ 𝑎 ≤ 𝑛 − 2. (2.2) 𝑦 ← 𝑎𝑟 𝑚𝑜𝑑 𝑛. (2.3) Nếu𝑦 ≠ 1 và 𝑦 ≠ 𝑛 − 1thì 𝑗 ← 1. Trong khi𝑗 ≤ 𝑠 − 1 và 𝑦 ≠ 𝑛 − 1 𝑦 ← 𝑦2 𝑚𝑜𝑑 𝑛. Nếu𝑦 = 1thì trả về “hợp số”. 𝑗 ← 𝑗 + 1. Nếu𝑦 ≠ 𝑛 − 1thì trả về “hợp số”. (3) Trả về “số nguyên tố”.
Thuật toán 6.5. Kiếm tra tính nguyên tố theo xác suất Miller Rabin
Xác suất của một hợp số 𝑛 vượt qua phép thử giảm nhanh hơn qua các phép thử sau. Ba phần tư các giá trị có thể của 𝑎 cho biết 𝑛 là hợp số. Điều đó có nghĩa là xác suất cho một hợp số 𝑛 vượt qua 𝑡 phép thử không nhiều hơn 1
4 𝑡
. Số nguyên vượt qua phép thử Miller-Rabin được gọi là số giả nguyên tố mạnh.
6.4.3 Nhận xét
Cả hai thuật toán Miller-Rabin và Solovay-Strassen đều chính xác khi biến cố đầu vào là số nguyên tố hoặc hợp số. Tuy nhiên, không có lý do gì để sử dụng kiểm tra Solovay-Strassen (và kiểm tra Fermat) vì kiểm tra Miller-Rabin tốt hơn rất nhiều:
Kiểm tra Solovay-Strassen tốn rất nhiều chi phí trong tính toán.
Kiểm tra Solovay-Strassen khó thực thi do liên quan đến tính ký hiệu Jacobi.
Xác suất sai của kiểm tra Solovay-Strassen được chặn trên bởi 12 𝑡 trong khi xác suất sai của thuật toán Miller-Rabin được chặn trên bởi 14 𝑡.
Nếu một số nguyên lẻ 𝑘-bit có thể chia hết bởi số nguyên tố nhỏ, nó sẽ tốn ít chi phí hơn để phát hiện ra bằng cách sử dụng thuật toán chia thử hơn là sử dụng kiểm tra Miller-Rabin. Do xác suất một số nguyên ngẫu nhiên 𝑛 có số chia nguyên tố nhỏ là rất cao, trước khi áp dụng kiểm tra Miller-Rabin, 𝑛 nên được kiểm tra với các số chia nhỏ bé hơn biên 𝐵 định trước. Việc này có thể thực hiện bằng cách chia 𝑛 cho tất cả các số nguyên tố nhỏ hơn 𝐵, hoặc bằng cách tính ước số chung lớn nhất của 𝑛 và tích của một vài số nguyên tố ≤ 𝐵. Tỷ lệ của các số nguyên lẻ 𝑛 không bị loại trừ bởi việc chia thử này là 1 −1
𝑝
3≤𝑝≤𝐵 , xấp xỉ 1.12
ln 𝐵 (theo định lý Mertens). Ví dụ, nếu
𝐵 = 256 thì chỉ có 20% số nguyên tố lẻ vượt qua bước chia thử, nghĩa là 80% bị loại bỏ trước khi kiểm tra chi phí cao Miller-Rabin được thực hiện.
Vấn đề là chọn biên 𝐵 bao nhiêu là tối ưu. Trong thực nghiệm, nguời ta chọn
𝐵 = 𝐸/𝐷 với 𝐸 là thời gian thực hiện của một phép lũy thừa modulo 𝑘-bit đầy đủ và
𝐷 là thời gian cần thiếu để loại trừ một số nguyên tố nhỏ là số chia của số nguyên
𝑘-bit. Các số nguyên lẻ bé hơn 𝐵 có thể được tính toán trước và chưa sẵn trong một bảng. Nếu có ít bộ nhớ, giá trị 𝐵 nhỏ hơn giá trị tối ưu có thể được sử dụng.
Gọi 𝑝𝑘,𝑡 là xác suất một hợp số 𝑘-bit vượt qua 𝑡 phép thử. Kiểm tra Miller-Rabin cho ta 𝑝𝑘,𝑡 ≤ 14 𝑡 với 𝑡 phép thử. Tuy nhiên, các chứng minh theo xác suất cho thấy số phép thử 𝑡 cần thiết ít hơn rất nhiều nhưng vẫn đạt được cùng xác suất sai, cụ thể như sau [40, tr.146-148]: (1) 𝑝𝑘,1 < 𝑘242− 𝑘 với 𝑘 ≥ 2. (2) 𝑝𝑘,𝑡 < 𝑘3/22𝑡𝑡−1/242− 𝑡𝑘 với (𝑡 = 2, 𝑘 ≥ 88) hoặc (3 ≤ 𝑡 ≤ 𝑘9, 𝑘 ≥ 21). (3) 𝑝𝑘,𝑡 < 7 20𝑘2−5𝑡 +1 7𝑘15/42−𝑘/2−2𝑡 + 12𝑘2−𝑘/4−3𝑡 với 𝑘 9 ≤ 𝑡 ≤𝑘 4, 𝑘 ≥ 21. (4) 𝑝𝑘,𝑡 <1 7𝑘15/42−𝑘/2−2𝑡 với 𝑡 ≥ 𝑘 4, 𝑘 ≥ 21.
Ví dụ, nếu 𝑘 = 512 và 𝑡 = 6, theo (2), xác suất để một hợp số 𝑘-bit vượt qua 𝑡 phép thử là 𝑝𝑘,𝑡 ≤ 1 2 88 thay vì 𝑝𝑘,𝑡 ≤ 1 4 6 = 1 2 12
. Như vậy, ta không cần thiết phải sử dụng 𝑡 = 44 để có được xác suất sai là 1
4 44
= 12 88. Điều này làm giảm chi phí tính toán rất nhiều nhưng vẫn đạt được độ chính xác rất cao.
Trong thực hành, người ta thường hài lòng với xác suất sai bé hơn hay bằng 12 80. Dựa vào kết quả trên, ta có công thức sau để xác định giá trị 𝑡 sao cho hợp số nguyên
𝑘-bit vượt qua 𝑡 phép thử Miller-Rabin với xác suất bé hơn 1
2 80 là: 𝑡 = 50 27 8 4 2 𝑘𝑖 𝑘 < 100 𝑘𝑖 100 ≤ 𝑘 < 256 𝑘𝑖 256 ≤ 𝑘 < 512 𝑘𝑖 512 ≤ 𝑘 < 1024 𝑘𝑖 𝑘 ≥ 1024
Các thử nghiệm nhằm đánh giá tính hiệu quả của các thuật toán này sẽ được lần lượt trình bày ở Chương 7.