PDA

View Full Version : Một số vấn đề về số nguyên!



black hole
20-10-2004, 22:51
Hồi trước mình có tham khảo được một số thuật toán về số nguyên, post lên đây để các bạn tham khảo. (chủ yếu là trong cuốn sách "Số học và thuật toán" của Hà Huy Khoái. Đây là một cuốn sách rất hay, nhưng hơi khó kiếm đặc biệt là với các bạn không ở HN hay TP HCM).

black hole
22-10-2004, 22:01
Xin lỗi mọi người vì không post bài,
Với lại hình như forum này không hỗ trợ latex thì phải,
Thôi đành phải gõ kiểu củ chuối này vậy.

Tháng 8 năm 2002, ba tác giả Manindra Agrawal, Neeraj Kayal vaf Nitin Saxena (Viện công nghệ Kanpur - Ấn Độ) công bố thuật toán kiểm tra tính nguyên tố với độ phức tạp đa thức (thường gọi là thuật toán AKS). Tuy nhiên với bậc đa thức khá cao (khoảng O(log12n)), thuật toán chưa chứng tỏ được tính hiệu quả rõ rệt trong tính toán thực tiễn (cho đến nay). Nhưng về mặt lí thuyết thì thuật toán này có ý nghĩa lớn vì vấn đề này đã thu hút sự quan tâm nghiên cứu của rất nhiều người trong một thời gian dài. Thuật toán AKS sử dụng những kiến thức khá sơ cấp với ý tưởng rất mạch lạc, rõ ràng. Thuật toán xuất phát từ ý tưởng sau đây:
Số nguyên p là số nguyên tố khi và chỉ khi đẳng thức sau đúng với một số nguyên a nào đó nguyên tố cùng nhau với p:

(x - a)^p ≡ x^p – a (mod p) (*)

Nhưng việc kiểm tra đẳng thức trên không phải là đơn giản (khi p đủ lớn), cho nên người ta cho rút gọn hai vế của đẳng thức trên theo modulo đa thức x^r – 1 (với r là một số nguyên tố có tính chất đặc biệt sẽ được mô tả trong thuật toán) và sau đó lại rút gọn các hệ số của kết quả thu được (hai đa thức) theo modulo p. Tức là có hệ thức sau:

(x - a)^p ≡ x^p – a (mod x^r - 1, p) (**)

Biểu thức (**) có thể xảy ra trong một số trường hợp p là hợp số. Nhưng người ta đã chứng minh được rằng không có hợp sô p nào thoả mãn (**) với mọi a nằm trong khoảng 1 < a < 2√r * logp. Như vậy việc kiểm tra (**) với mọi a nằm trong vùng này tương đương với việc kiểm tra tính nguyên tố của p với độ phức tạp đa thức.

THUẬT TOÁN:

Input n > 0

Bước 1: Nếu n có dạng a^b với b>1 thì kết thúc và thông báo “n là hợp số”, nếu không thì cho r := 2;
Bước 2: Kiểm tra r < n, nếu đúng thì thực hiện tiếp bước 3.
Bước 3: Kiểm tra gcd(n, r) nếu khác 1 thì kết thúc và thông báo “n là hợp số”, nếu là 1 thì kiểm tra tính nguyên tố của r, khi r là nguyên tố ta thực hiện tiếp bước 4, nếu không ta tăng r lên một đơn vị rồi quay lại bước 2.
Bước 4: Gọi q là ước nguyên tố lớn nhất của r – 1, tiến hành kiểm tra nếu q >= 4√r * logn và n^((r-1)/2) ≠ 1 (mod r) thì thực hiện tiếp bước 5, ngược lại ta tăng r thêm một đơn vị rồi quay lại bước 2.
Bước 5: Kiểm tra a <= 2√r * logn, nếu đúng ta thực hiện bước 6, nếu sai ta kết thúc và thông báo “n là số nguyên tố”.
Bước 6: Nếu (x - a)^n ≠ x^n – a (mod x^r – 1, n) ta kết thúc và thông báo “n là hợp số”, ngược lại ta tăng a lên một đơn vị rồi quay trở lại bước 5



Với thuật toán này thì phần cài đặt có hơi phức tạp,
tuy nhiên cũng có thể cố.

ktvnguyenchien
22-10-2004, 22:09
Bước 1: Nếu n có dạng a^b với b>1 thì kết thúc và thông báo “n là hợp số”, nếu không thì cho r := 2
Làm sao để xác định được a, b???

black hole
22-10-2004, 22:19
SỐ GIẢ NGUYÊN TỐ

Giả sử b là một số nguyên dương. Nếu n là hợp số nguyên dương và b^n ≡ b (mod n) thì n được gọi là số giả nguyên tố cơ sở b.
Trong trường hợp (n,b) = 1, ta thường dùng định nghĩa tương đương: b^(n-1) ≡ 1 (mod n).
Nói chung trong bất kì một khoảng nào thì số giả nguyên tố ít hơn rất nhiều so với số nguyên tố. Như vậy các số thoả mãn định lí Fermat bé có nhiều khả năng là số nguyên tố. Tuy nhiên đối với mọi cơ sở tuỳ ý, số các số giả nguyên tố là vô hạn.

KIỂM TRA MILLER VÀ SỐ GIẢ NGUYÊN TỐ MẠNH ( Thuật toán Rabin - Miller)

Giả sử n là số nguyên dương lẻ, n-1 = 2^s * t, trong đó s là số nguyên không âm, t là số nguyên dương lẻ. Ta nói n trải qua được kiểm tra Miller cơ sở b, nếu hoặc b^t ≡ 1 (mod n) hoặc b^(t * 2^j) ≡ -1 (mod n) với j nào đó (0 ≤ j ≤ s-1).
Số nguyên n được gọi là giả nguyên tố mạnh cơ sở b nếu nó là hợp số và trải qua được kiểm tra Miller cơ sở b.
Như vậy các số giả nguyên tố mạnh lại còn ít hơn cả các số giả nguyên tố.

Từ đó ta có thể dùng kiểm tra Miller để kiểm tra tính nguyên tố của những số không lớn lắm. Số giả nguyên tố mạnh lẻ cơ sở 2 bé nhất là 2047. Như vậy, nếu n lẻ và n < 2047, thì n là nguyên tố nếu nó trải qua kiểm tra Miller. Tương tự vậy, số 1373653, là số giả nguyên tố mạnh lẻ bé nhất cơ sở 2 và 3. Đối với cơ sở 2, 3 và 5 thì số giả nguyên tố mạnh lẻ bé nhất là 25326001. Trong trường hợp cơ sở 2, 3, 5, 7 thì số đó là 3215031751.
Cách làm trên chỉ có thể dùng để kiểm tra những số nguyên tố không lớn lắm, còn đối với các số lớn thì chúng ta sẽ dùng thuật toán xác suất dựa theo định lí sau.
Nếu n là một hợp số dương lẻ thì tồn tại không quá (n-1)/4 cơ sở b (0<b<n), sao cho n trải qua được kiểm tra Miller đối với các cơ sở đó.
Từ định lí này suy ra rằng, nếu số b được chọn ngẫu nhiên trong khoảng (0 < b < n) thì n kiểm trải qua kiểm tra Miller cơ sở b với xác suất bé hơn 1/4. Như vậy, nếu ta chọn k số ngẫu nhiên thì xác suất để n trải qua được kiểm tra Miller đối với k cơ sở đó là 1 - 1/(4^k). Khi k đủ lớn (ví dụ k = 20) thì xác suất đó là quá nhỏ, do đó nếu n có thể trải qua kiểm tra Miller với 20 cơ sở ngẫu nhiên thì có thể tin “hầu chắc chắn” n là số nguyên tố.
Từ đó ta có thuật toán sau. ( thuật toán Rabin - Miller)

Cho N >2 lẻ thuật toán sau đây xác định rằng N là hợp số, hoặc đưa ra thông báo N là số nguyên tố với xác suất lớn hơn 1 – 1/(4^20) (=0.99999999999909050529822707176208).

Step1: (Xuất phát) Đặt q = N-1, t = 0, và nếu q chẵn thì q := q/2, t:= t+1 (lặp cho đến khi q lẻ, do đó ta có N = 2^t q, với q lẻ). Sau đó đặt c = 20.
Step2: (Chọn a mới). Chọn ngẫu nhiên số a trong khoảng 1<a<N. Đặt e:= 0, b := a^q mod N. Nếu b = 1 chuyển sang Step4.
Step3: (bình phương) Nếu b ≠ ±1 (mod N) và e < t-2 thì ta đặt b:= b^2 mod N, e := e+1. Nếu b ≠ N - 1, in ra thông báo “N là hợp số” và kết thúc thuật toán.
Step4: Đặt c:= c-1. Nếu c> 0 thì, chuyển sang Step2. Nếu c = 0 thì đưa ra thông báo “N là số nguyên tố”.

Người ta đã chứng minh được rằng thuật toán Rabin_Miller hết O(k * (log n)^3) phép tính bit.

Cũng có một số thuật toán kiểm tra tính nguyên tố của một số theo xác suất khác nữa, trong đó có thuất toán Euler. với độ phức tạp thời gian cũng như trên nhưng tính chính xác thì kém hơn 1 – 1/(2^k) tất nhiên là không đáng kể. Nhưng để hiểu được thuật toán này thì cần phải có một kiến thức toán về thặng dư khá vững nên tôi xin phép không đề cập đến ở đây.


Cai này cài đặt rất dễ, kiểm tra số nguyên tố cỡ vài nghìn chữ số chỉ mất vài giây.

hieusua
27-12-2004, 22:29
Bác Black hole ơi, tui cũng có cùng câu hỏi dzới ktvnguyenchien đó, mà bác lặn đi đâu mất gòi ? Còn nhìu thuật toán về vấn đề này lắm mà :D