4. Các thuật toán kiểm tra số nguyên tố
4.1. Một số ký hiệu toán học
4.1.1. Ký hiệu Lagrăng (Legendre Symbol)
Ký hiệu L(a,p) đƣợc đi ̣nh nghi ̃a với a là một số nguyên và p là một số nguyên tố lớn hơn 2. Nó nhận ba giá trị 0, 1, -1 :
L(a,p) = 0 nếu a chia hết cho p.
L(a,p) = 1 nếu a QN (a là thặng dƣ bậc 2 modulo p).
L(a,p) = -1 nếu a QN (a không là thặng dƣ bậc 2 modulo p). Một phƣơng pháp dễ dàng để tính toán ra L(a,p) là :
4.1.2. Ký hiệu Jacobi (Jacobi Symbol)
Ký hiệu Jacobi đƣợc viết là J (a,n), nó là sự khái quát hoá của ký hiệu Lagrăng , nó đi ̣nh nghi ̃a cho bất kỳ cặp số nguyên a và n nào. Ký hiệu Jacobi là một chức năng trên tập hợp số thặng dƣ thấp của ƣớc số n và có thể tính toán theo công thƣ́c sau:
Nếu n là số nguyên tố, thì J(a,n) = 1 nếu a là thặng dƣ bậc hai modulo n .
Nếu n là số nguyên tố , thì J(a,n) = -1 nếu a không là thặng dƣ bậc hai modulo n .
Nếu n khôn g phải là số nguyên tố thì Jacobi (a,n) sẽ đƣợc tính theo công thức sau:
J(a,n)=J(h,p1) J(h,p2) . . . J(h,pm) với p1,p2. . .,pm là các thừa số lớn nhất của n.
Thuật toán này tính ra số Jacobi tuần hoàn theo công thƣ́c sau : 1. J(1,k) = 1
2. J(ab,k) = J(a,k) J(b,k)
3. J(2,k) =1 Nếu (k2-1)/8 là chia hết và J(2,k) = -1 trong các trƣờng hợp khác. 4. J(b,a) = J((b mod a),a)
5. Nếu GCD(a,b)=1 :
a. J(a,b) J(b,a) = 1 nếu (a-1)(b-1)/4 là chia hết. b. J(a,b) J(b,a) = -1 nếu (a-1)(b-1)/4 là còn dƣ. Sau đây là thuật toán trong ngôn ngƣ̃ C :
int jacobi(int a,int b) { int a1,a2; if(a>=b) a%=b; if(a==0) return 0; if(a==1) return 1; if(a==2) if(((b*b-1)/8)%2==0) return 1; else return -1;
if(a&b&1) (cả a và b đều là số dƣ) if(((a-1)*(b-1)/4)%2==0) return +jacobi(b,a); else return -jacobi(b,a); if(gcd(a,b)==1) if(((a-1)*(b-1)/4)%2==0) return +jacobi(b,a); else return -jacobi(b,a);
return jacobi(a1,b) * jacobi(a2,b); }
Trên thƣ̣c tế có thể tính đƣợc ký hiệu Jacobi một cách thuận lợi hơn nếu dƣ̣a vào 1 trong các tính chất sau, giả sử m, n là các số nguyên lẻ, a, b Z:
(i) J(a*b, n) = J(a, n) * J(b, n) do đó J(a2, n) = 1. (ii) J(a, m*n) = J(a, m) * J(a, n).
(iii) nếu a b (mod n) thì J(a, n) = J(b, n). (iv) J(1, n) = 1.
(v) J(-1, n) = (-1)(n-1)/2
(vi) J(m, n) = J(n, m) * (-1)(m-1)*(n-1)/4