2 Lập trình và thực thi trên máy tính một số thuật toán số
2.2 Kiểm tra số nguyên tố
2.2.1 Lập trình trên chương trình Pascal
Ý tưởng Số nguyên tố là số chia cho 1 và chính nó. Giả sử số vừa nhập vào là n, ta cho i chạy từ 2 đến n−1, nếu n chia hết cho i trong bất cứ lần lặp nào thì có nghĩa là n không nguyên tố, nếu không chia hết cho bất cứ lần lặp nào thì n là số nguyên tố.
PROGRAM kiem tra so nguyen to; USES crt;
VAR n,i,a:INTEGER; BEGIN
Clrscr;
Write(’nhap vao 1so:’); readln(n);
a:=0;
For i:=2 to n do
if(n mod i=0)then a:=a+1;
if a< 2 then writeln(n,’ la so nguyen to’) else writeln(n,’ khong la so nguyen to’); Readln;
END.
Ví dụ 2.12 Kiểm tra xem số 3041975 có phải là số nguyên tố hay không Chạy chương trình trên Pascal ta có kết quả như sau
Nhap vao 1so:3041975 Ket qua
Ví dụ 2.13 Viết chương trình in ra tất cả các số nguyên tố bé hơn hoặc bằng n (giải thuật sàng Eratosthenes).
Mã chương trình
Program Chuong trinh kiem tra va in so nguyen to; uses crt; var n, i, j:longint; ok:boolean; Begin clrscr; write(’Nhap n: ’); readln(n);
write(‘cac so nguyen to nho hon ’, n, ’ la ’); for i:= 2 to n do begin ok:=true; for j:= 2 to i-1 do if i mod j =0 then ok:=false; if ok then write(i, ’; ’); end; readln; End.
Ví dụ 2.14 In ra tất cả các số nguyên tố bé hơn hoặc bằng 1000. Chạy chương trình trên Pascal ta được kết quả sau
Nhap n:1000
Cac so nguyen to nho hon 1000 la
2; 3; 5; 7; 11; 13; 17; 19; 23; 29; 31; 37; 41; 43; 47; 53; 59; 61; 67; 73; 79; 83; 89; 97; 101; 103; 107; 109; 113; 127; 131; 137; 139; 149, 154; 157; 163; 167; 173; 179; 181; 191; 193; 197; 199; 211; 223; 227; 229; 233; 239; 241; 251; 257; 263; 269; 271; 277; 281; 283; 293; 307; 311; 313; 317; 331; 337; 347; 349; 353; 359; 367; 373; 379; 383; 389; 397; 401; 409; 419; 421; 431; 433; 439; 443; 449; 457; 461; 463; 467; 491; 499; 503; 509; 521; 523; 541; 547; 557; 563; 569; 571; 577; 587; 593; 599; 601; 607; 613; 617; 619; 631; 641; 643; 647; 653; 659; 661; 673; 677; 683; 691; 701; 709; 719; 727; 733; 739; 743; 751; 757; 761; 769; 773; 787; 797; 809; 811; 821; 823; 829; 839; 853; 857; 859; 863; 877; 881; 883; 887; 907; 911; 919; 929; 937; 941; 947; 953; 967; 971; 977; 983; 991; 997.
2.2.2 Tính toán trên Maple
Muốn kiểm tra một số có phải là số nguyên tố hay không ta dùng lệnh
[> isprime(a);
Ví dụ 2.15 Kiểm tra xem 210219871988 và 21283 có là số nguyên tố hay không.
[> isprime(210219871988);
false [> isprime(21283);
Kiểm tra số Carmichael
Ta thực hiện các bước theo ví dụ sau. Ví dụ 2.16 (Bài 27, [2])
Chứng minh rằng 294409 là một số Carmichael. Giải
Trước hết ta nhập vào số nguyên dương n cần kiểm tra
[> n:=294409;
n:=294409 Kiểm tra xem n có là số nguyên tố hay không?
[> isprime(n);
False
Nếu n là số nguyên tố thì nó không phải là số Carmichael. Ngược lại, ta tiếp tục phân tích n thành tích các thừa số nguyên tố
[> L:=ifactor(n);
L:=(37)(73)(109)
Nếu có một thừa số có số mũ lớn hơn 1 thì kết luận n không phải là số Carmichael, ngược lại ta tiếp tục kiểm tra. Trước tiên ta lập danh sách các thừa số nguyên tố (có trong phân tích nêu trên) q = [q1, q2, ...qk] bằng lệnh sau:
[> q:=[37,73,109];
q:=[37,73,109]
Sau đó tiến hành kiểm tra tính chia hết của các phép chia số n−1 cho các số (qi−1), i = 1,2, ...k. Việc này cũng tương đương với việc xem các thành phần trong danh sách các phần dư có bằng 0 hay không bằng lệnh
[> [seq(irem(n-1,q[i]-1),i=1..nops(q))]; [0,0,0]
Nếu trong danh sách đó có thành phần khác 0 thì n không phải số Carmichael, ngược lại cho kết quả là số Carmichael.
Kết quả cho thấy số 294409 là số Carmichael. Kiểm tra số giả nguyên tố
Muốn kiểm tra n có phải số giả nguyên tố cơ sở a hay không ta chỉ cần chỉ ra rằng n không phải là số nguyên tố sau đó kiểm tra điều kiện
(an−a) modn = 0,
có được thỏa mãn hay không. Các bước được thực hiện qua ví dụ sau. Ví dụ 2.17 Kiểm tra xem số 56348327841 có là số giả nguyên tố cơ sở 2 hay không?
Nhập vào hai số nguyên a, n bằng các lệnh
[> n:=56348327841; a:=2;
n:=56348327841 a:=2 Kiểm tra xem n có là số nguyên tố hay không
[> isprime(n);
false
Nếu n là số nguyên tố thì nó không phải là số giả nguyên tố. Ngược lại, ta tiến hành kiểm tra điều kiện (an−a) modn = 0 có được thỏa mãn hay không bằng lệnh
[> is(a&∧n −a mod n = 0);
false
Nếu kết quả là true thì n đúng là số giả nguyên tố cơ sở a ngược lại thì không phải. Kết quả cho thấy số 56348327841 không phải là số giả nguyên tố cơ sở 2.
Ví dụ 2.18 Kiểm tra xem số 1373653 có là số giả nguyên tố cơ sở 3 hay không? [> n:=1373653; a:=3; n:=1373653 a:=3 [> isprime(n); false [> is(a&∧n−a mod n = 0);
true
Kết quả cho thấy số 1373653 là số giả nguyên tố cơ sở 3. Kiểm tra số giả nguyên tố mạnh
Muốn kiểm tra số nguyên dương lẻ n có phải số giả nguyên tố mạnh cơ sở a hay không ta chỉ cần chỉ ra rằng n không phải là số nguyên tố sau đó kiểm tra xem nó có trải qua được kiểm tra Miller hay không. Qui trình kiểm tra Miller được thực hiện qua các bước sau.
Bước 1. Phân tích n−1 ra thừa số nguyên tố
[> ifactor(n−1);
Bước 2. Từ kết quả phân tích trên ta biết n − 1 có thể viết dưới dạng
n−1 = 2st (trong đó s là số tự nhiên bất kì còn t là một số lẻ), ta kiểm tra xem điều kiện sau đây có thỏa mãn hay không
[> is(a&∧t mod n= 1);
Nếu kết quả là true thì n là số giả nguyên tố mạnh cơ sở a, ngược lại thì ta kiểm tra điều kiện a2jt+ 1 mod n = 0 có được thỏa mãn với một j nào đó trong khoảng từ 0 cho đến s−1 hay không. Nếu tồn tại j thì kết luận
n là số giả nguyên tố mạnh cơ sở a, ngược lại ta kết luận là không phải. Có thể thực hiện điều này bằng lệnh sau
[> seq(a&∧((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ở a ngược lại ta kết luận là không phải.
Ví dụ 2.19 Kiểm tra xem số 2532601 có phải số giả nguyên tố mạnh cơ sở 3 hay không? [> n:=25326001; a:=3; n:=25326001 a:=3 [> isprime(n); false [> ifactor(n−1); (2)4(3)3(5)3(7)(67) Ta có [> s:=4; t := 3∧3∗5∧3∗7∗67; s:=4 t:=1582875
[> is(a&∧t mod n= 1);
false
Ta kiểm tra tiếp
[> seq(a&∧((2∧j)∗t) + 1 mod n, j = 0..s−1); 0,2,2,2
Một số ví dụ áp dụng
Bài 1 Chứng minh các số sau đây là số Carmichael:
1729, 294409, 56052391, 118901521, 172947529. Bài 2 (Bài 28 [5])
Chứng minh rằng 6601 là một số Carmichael.
Bài 3 Chứng minh rằng 1373653 là số giả nguyên tố cơ sở 2, 3 nhưng không là số giả nguyên tố cơ sở 5,7.
Bài 4 Chứng minh rằng 25326001 là số giả nguyên tố mạnh cơ sở 2, 3,5 nhưng không là số giả nguyên tố mạnh cơ sở 7.