Các thuật toán phân tích số trong lập trình C++

MỤC LỤC

Thuật toán sàng bậc hai

Tử tởng chủ đạo của một loạt khá lớn các thuật toán phân tích số nh phơng pháp đặc biệt của Euler, phơng pháp phân tích các dạng chính phơng của Danien Shanks, phơng pháp khai triển liên phân số của Morrison và Brillhart, phơng pháp sàng bậc hai của Pomerance. Chý ý rằng có thể có nhiều giá trị ri khác nhau đợc ứng cùng với một véc tơ v nhng một cách hình thức ta có thể coi k+1 véc tơ khác nhau thu từ việc ứng k+1 giá trị r có đợc ở trên. Từ kết quả trên chúng ta thấy rằng nếu tồn tại giá trị x theo yêu cầu Q(x) phân tích hoàn toàn trong cơ sở và không quá B thì ta có thể tìm đợc nó chỉ cần trong lân cận B của 0.

Nh vậy không phải toàn bộ các số nguyên tố trong đều cần phải đợc biểu diễn (đúng hơn là chỉ có khoảng một nửa số nguyên tố trong cơ sở là có mặt trong biểu diễn của các Q(x)) do đó để thu đợc hệ phụ thuộc tuyến tính nêu trong phân tích trên thì thờng chỉ cần số phơng trình khoảng già nửa số các nguyên tố trong cơ sở là đủ. Nếu p≡1 mod 4 thì việc tìm các giá trị x tơng tự có thể bằng một thuật toán gần đa thức. trình trên luôn luôn có duy nhất nghiệm). Tất cả các phân tích đợc nêu ở trên mặc dù cha đủ chặt chẽ cho sự đảm bảo thành công của việc tìm các thặng d bậc hai nhỏ trong lớp Q(x) mà chỉ dừng ở mức độ thể hiện một mô tả bớc tìm kiếm này sẽ đợc thông qua một quá trình.

Thuật toán Dixon và sàng bậc hai

Nếu có thể tìm đợc một tập con các aj sao cho tổng theo modulo 2 là vector (0,. ., 0) thì tích của các xj tơng ứng sẽ sử dụng mỗi nhân tử trong B một số chẵn lần. Đây là lý do cho thấy đồng d thức (thiết lập theo tích) sẽ phân tích thành công đợc n. , aC sao cho tổng theo modulo 2 là một vector toàn chứa số 0 chính là bài toán tìm sự phụ thuộc tuyến tính (trên Z2) của các vector này.

Với C > B, sự phụ thuộc tuyến tính này nhất định phải tồn tại và ta có thể dễ dàng tìm đợc bằng phơng pháp loại trừ Gaux. Tuy nhiên khi B càng lớn thì ta càng phải gom nhiều đồng d thức hơn trớc khi có thể tìm đợc một quan hệ phụ thuộc.

Phơng pháp p-1: Thuật toán Pollard thứ nhất

Hiển nhiên việc giả định Q chỉ có nghĩa khi và chỉ khi p-1 là ớc của Q, trong trờng hợp p-1 chỉ có các ớc nguyên tố nhỏ tức là p-1=q1logNq1..qklogNqk. Tất nhiên các số mũ trong khai triển của Q là quá d thừa do đó các lựa chọn tiếp theo của chúng ta sẽ là cố giảm các số mũ này đến mức thấp nhất có thể, cách làm cụ thể cho việc này sẽ đợc mô tả cụ thể trong thuật toán. Vấn đề kế tiếp là việc tìm kiếm có khả thi hay không, nói một cách khác chúng ta phải trả lời câu hỏi “ liệu có tồn tại hay không số a có bậc không là ớc của p-1?”.

Chú ý: Thuật toán của Pollard mà chúng tôi trình bày ở trên giống bất cứ thuật toán trình bày trong các tài liệu khác nh của [Riesel], [Stinson]. Chính yếu tố cha đáp ứng mà các thuật toán khác sẽ gặp phải gcd(b-1, N)=1 ngay cả khi b-1#0 đúng hơn là ngay cả khi a là phần tử có bậc không là ớc của p-1 trong khi của thuật toán của chúng tôi với trờng hợp này chắc chắn sẽ thành công.

Phơng pháp ρ : Thuật toán Pollard thứ hai

Thứ nhất ta có thể kiểm chứng đợc rằng nếu p-1 chỉ có các ớc trong k số nguyên tố đầu tiên thì cha chắc p-1 đã là ớc của Q= q1!..qk!. Tiếp đến trong thuật toán của chúng tôi, mỗi khi xét một giá trị a chúng tôi vét toàn bộ khả năng về bậc của nó. Giá trị Q cuối cùng trong trờng hợp không thành công của thuật toán chính là bậc của a và khi này Q|p-1.

Nh vậy tại bớc thứ i chúng ta đã xét đến i+1 cặp khác nhau và cũng dễ dàng nhận ra rằng các cặp đợc xét trong mọi bớc là không giống nhau do đó hiển nhiên với p bớc chúng ta đã có p cặp khác nhau đợc xét đến và nh đã phân tích ở trên, thuật toán sẽ thành công với xác xuất >0.5.Nói một cách khác thuật toán của Pollard đợc thực hiện trong Ο( p) bớc.

NhËn xÐt

    Để tiện tiếp thu phơng pháp p±1 trớc hết chúng tôi xin điểm lại một số kết quả chính yếu nhất liên quan đến dãy Lucas ( các định nghĩa liên quan và các chứng minh của các kết quả đợc đa ra có thể tìm đọc trong [Riesel], [Kranakis]. hay một sách giáo khoa số học bất kỳ). Thuật toán trên rõ ràng có hiệu quả trong cả hai trờng hợp p+1 hoặc p-1 chỉ gồm các ớc nguyên tố nhỏ, tuy nhiên căn cứ vào công thức tính các giá trị của dãy Lucas ta thấy ngay rằng hệ số nhân của thuật toán này là lớn hơn nhiều so với thuật toán của Pollard trong trờng hợp cùng phân tích đợc N với ớc p của nó có p-1 chỉ gồm những ớc nhỏ boỉ vì thay cho viƯc tính một luỹ thừa thông thờng thì thuật toán của Lucas phải tính một luỹ thừa của một ma trận. Tuy nhiên, trong trờng hợp đơn giản nhất khi mà xi đợc định nghĩa chỉ qua xi-1 và không qua bất kỳ một xk nào khác thì dẫy này đợc lặp lại theo chu kỳ ngay khi một phần tử xj.

    Nếu a>b, thì cách tìm này sẽ phát hiện ra chu kỳ chỉ sau một vài chu kỳ đầy đủ đã bỏ qua, nhng cuối cùng thế nào cũng tìm đợc chu kỳ của dẫy. Thứ ba, việc sử dụng thuật toán Euclid cần đợc tổ chức một cách hữu hiệu sao cho thời gian tính toán không quá nhiều trong phép tìm ớc chung lớn nhất (N, x2i-xi) (mod N)=1. Tuy nhiên, lại xảy ra một vấn đề là sự lựa chọn này không sinh ra đợc các số nguyên đủ ngắn nhiên để cho một chu kỳ ngắn chỉ gồm C P bớc đối với dẫy {xi}.

    Bây giờ xk sẽ tăng theo cấp số nhân của x2k0, và sẽ vợt qua ranh giới đợc gọi là đủ lớn rất nhanh.Vì thế chúng ta thấy rằng số lợng các thừa số nguyên tố ≤G của yi (tích của i+1 số của lớn) sẽ xấp xỉ (i+1) lnlnG. Trực giác có thể cho thấy rằng phơng pháp p của Pollard là C p và do vậy có thể kết luận rằng thừa số C mà ta đa ra trong thực tế không hẳn là hừng số mà nó thay đổi rất chậm cùng với p. Mô hình đại số của phơng pháp p Pollard có gì đó hơi thô, nhng tuy nhiên chúng ta vẫn có thể sử dụng để nghiên cứu cải tiến phơng pháp này và cũng sử dungj để bàn về một vấn đề rất quan trọng : Tốc độ của một thuật toán phân tích thừa số.

    Nếu N có một vài ớc, thì có thể xảy ra hiện tợng một số ớc này bị rút ra giữa hai lần tính toán liên tiếp sử dụng thuật toán Euclid giống hệt nh trong phơng pháp (p-1). Để có thể chuyển mô hình này thành một chơng trình có thể chạy trên máy, chúng ta phải sử dụng ít nhấ là các biến có thể chạy trên máy, chúng ta phải sử ít nhất là các biến có độ chính xác gấp đôi, hoặc tốt hơn là với độ chính xác cao hơn nữa để sao cho các phép nhân không gây ra sự tràn ô. Hơn nữa, sẽ có lợi nếu không thực hiện các tính toán tìm ớc số chúng lớn nhất bằng thuật toán Euclid tại những điểm cách đều mà nên dùng một khoảng nhỏ hơn khi bắt đầu, rồi sau đó mới tăng dần khoảng này lên tới 100 hoặc lớn hơn.

    Xây dựng phần mềm phân tích các số dạng 2 n -1

    Sơ đồ xuất phát

    Phân tích hệ thống

    Tơng tự nh phép cộng ta có thể thực hiện các phép trừ trên số lớn. Định lý là cơ sở giúp ta đoán nhanh thơng của 2 số lớn X/Y với điều kiện X<qY. WORD chia_WORD(SL TU_SO,WORD mau_so,SL THUONG_SO) {LONG nho=0,dem;.

    Cài đặt chơng trình

      - Nếu đọc hết tệp mà thơng cuối cùng không trùng với bất kỳ số nào trong tệp hoặc không chia hết cho bất cứ số nào trong tệp nào thì phải phân tích xem thơng này có phải là số nguyên tố không bằng cách dùng hàm nguyên_to_SL. Nếu xác định thơng này là nguyên tố thì dừng chơng trình và kết luận là “ phân tích hoàn toàn”. Nếu UCLN này lớn hơn 1 thì đây sẽ là một ớc của Z và in ra đã tìm đợc ớc.

      Sơ đồ khối của các Modulo thuộc chơng trình

      Tài liệu dẫn và tham khảo

      [Lều Tân] Lều Đức Tân, Một số thuật toán kiểm tra nhanh tính nguyên tố đối với một số lớp số, Luận án phó tiến sĩ, Hà nội 1993.