Kiểm tra số nguyên tố

Một phần của tài liệu Các thuật toán cơ bản trong lý thuyết số (Trang 48 - 55)

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.

Một phần của tài liệu Các thuật toán cơ bản trong lý thuyết số (Trang 48 - 55)

Tải bản đầy đủ (PDF)

(89 trang)