12 11 k k k n
2.4.6. Kiểm tra số giả nguyên tố Fermat mạnh
Bước 1: Phân tích số n ra thừa số nguyên tố .
[> ifactor(n -1);
Bước 2: Từ kết quả phân tích trên chúng ta biết rằng n - 1 có thể viết dưới dạng n - 1 = 2st (s là số tự nhiên bất kỳ, t là một số lẻ). Ta kiểm tra điều kiện:
[>is(b&^t mod n= 1) ;
Nếu điều kiện trên nghiệm đúng (lệnh cho giá trị true ) thì n là số giả nguyên tố mạnh cơ sở b, ngược lại ta kiểm tra điều kiện sau :
[> is(b&^t-1 mod n = 0) ;
Nếu lệnh cho giá trị true thì n là số giả nguyên tố mạnh cơ sở b .
Nếu kết quả là false ta tiếp tục kiểm tra điều kiện b2jt + =1 0(mod )n
có được thoả mãn với một j nào đó trong khoảng từ 0 đến s - 1 hay không. Nếu có một j như vậy thì kết luận n là số giả nguyên tố mạnh cơ sở b, ngược lại ta kết luận không phải. Có thể thực hiện điều này bằng lệnh sau đây :
[> seq (b&^( (2^j)*t)+1 mod n, j= 0..s-1) ;
Kết quả của lệnh là một dãy bao gồm s số tự nhiên, nếu có một số trong dãy đó bằng 0 thì kết luận n là số giả nguyên tố mạnh cơ sở b, ngược lại là không phải.
Ví dụ. Kiểm tra số 25326001 có phải là số nguyên tố Fermat mạnh cơ sở 2 [> n:=25326001; b:=2; n:=25326001 b:=2 [> isprime(n); false [> factor(n-1); ( ) ( ) ( ) ( ) ( )4 3 3 2 3 5 7 67 Ta có, [> s:=4; t:=3^3*5^3*7*67; s:=4 t:=1582875
[> is(b&^t mod n = 1);
false
Ta kiểm tra tiếp
[> is(b&^t-1 mod n = 0);
false
[> seq (b&^ ((2^j)*t)+1 mod n, j = 0..s-1);
0, 2, 2, 2
Như vậy số 25326001 là số giả nguyên tố mạnh cơ sở 2. Với b = 3; 5 ta cũng có kết quả tương tự . Nhưng với b = 7 ta có :
[> n:=25326001; b:=7; n:=25326001 b:=7 [> s:=4; t:=3^3*5^3*7*67; s:=4 t:=1582875 [> is(b&^t mod n = 1); false [> is(b&^t-1 mod n = 0); false
[> seq (b&^ ((2^j)*t)+1 mod n, j= 0.. s-1);
19453142, 16857741, 11448588, 10127251
Vậy, số 25326001 là số giả nguyên tố Fermat mạnh cơ sở 2, 3, 5 nhưng không là số giả nguyên tố Fermat mạnh cơ sở 7.