Phép thử Fermat kiểm tra "n có thể là số nguyên tố hay không" bằng cách chọn một cơ số a (1<a<n, gcd(a,n)=1) và kiểm tra:
an−1≡1(modn).
Nếu điều này sai với một cơ số a nào đó, chắc chắn n là hợp số (a là "nhân chứng" — witness). Tuy nhiên nếu điều này đúng, n chưa chắc là số nguyên tố — a khi đó được gọi là một kẻ nói dối Fermat (Fermat liar). Đặc biệt, tồn tại các hợp số gọi là số Carmichael (ví dụ 561=3×11×17) mà mọi cơ số a nguyên tố cùng nhau với n đều là kẻ nói dối — phép thử Fermat hoàn toàn bị đánh lừa với các số này, đó là lý do các hệ thống mật mã hiện đại dùng Miller-Rabin thay vì Fermat thuần túy.
Cho một số nguyên n và danh sách k cơ số a1,…,ak (với 1<ai<n). Với mỗi cơ số ai thỏa gcd(ai,n)=1, kiểm tra xem ain−1modn có bằng 1 hay không (tức ai có phải kẻ nói dối Fermat đối với n hay không — bất kể n thực sự nguyên tố hay hợp số). Các cơ số ai có gcd(ai,n)=1 bị loại, không tính vào kết quả.
In ra số lượng cơ số ai (trong số các cơ số hợp lệ, tức nguyên tố cùng nhau với n) thỏa mãn ain−1≡1(modn).
Input:
561 6
2 5 7 13 17 19
Output:
5
Giải thích: 561=3×11×17 là số Carmichael. Trong 6 cơ số, cơ số 17 có gcd(17,561)=17=1 nên bị loại; 5 cơ số còn lại (2,5,7,13,19) đều nguyên tố cùng nhau với 561 và đều thỏa a560≡1(mod561) (tức đều là kẻ nói dối Fermat) — minh họa đúng tính chất của số Carmichael.
Dòng 1: hai số nguyên n và k. Dòng 2: k số nguyên a1,…,ak, cách nhau bởi dấu cách.
Một dòng duy nhất: số lượng cơ số hợp lệ (nguyên tố cùng nhau với n) thỏa ain−1≡1(modn).
Ví dụ:
Đầu vào:
1105 5
2 3 7 9 11
Đầu ra:
5
Đầu vào:
561 6
2 5 7 13 17 19
Đầu ra:
5
Đang tải editor...