素數檢驗法

2021-04-13 09:38:35 字數 2609 閱讀 8074

數的素性檢驗方法問題在近幾年得到了飛速的發展,過去,要檢驗乙個數 n 是否是素數,最簡單的方法是用試除法,用小於n的平方根以下的所有素數去除n,若都除不盡,則n就是素數,否則為合數.這對於比較小的數來說還適用,若用計算機編成程式,對於10位數,幾乎瞬間即可完成,對於乙個20位數,則需要2個小時,對於乙個50位數就需要一百億年,令人吃驚的是,要檢驗乙個一百位數,需要的時間就猛增到10^36年.到了2023年,這種困難的情況得到了改觀,阿德曼(adleman),魯梅利(rumely),科恩(cohen),和倫斯特拉(lenstra)研究出一種非常複雜的技巧,現在以他們的名字的首字母命名的arcl檢驗法,檢驗乙個20位數只消10秒鐘,對於乙個50位數用15秒鐘,100位數用40秒鐘,如果要他檢驗乙個1000位數,只要用乙個星期也就夠了.但是大部分的素性檢驗法都不能分解出因數來,只能回答乙個數是否是素數.

我們知道,費馬小定理是現代素數判定方法的基礎,如果該定理的逆命題成立那該多好,只要計算一下ap-a是否能被p整除,能則p是素數,否則p是和數.遺憾的是這只對1定理一:設n>1是乙個奇數,如果對於n-1的每乙個素因子q存在乙個整數a使得:

an-1 = 1 (mod n), and

a(n-1)/q ≠ 1 (mod n);

則n是素數.

這個定理的不足之處是需要知道n-1的全部因子,那麼能不能不需要如此呢?下面乙個定理是泊柯林頓(pocklingdon)在2023年發現的:

泊柯林頓定理:設n-1=qkr,這裡q是素數,並且r不能被q整除.如果存在乙個整數a使得an-1=1並且

***(a(n-1)/q-1,n) = 1,則n的每乙個素因子q都具有qkr+1的形式.

利用這個定理,我們可以將定理一改進如下:

定理二:假定 n-1 = fr, 這裡 f>r, ***(f,r)=1 並且已知 f的素因子分解.如果對於f的每乙個素因子q 都存在乙個整數a >1 使得

an-1 = 1 (mod n)

***(a(n-1)/q-1,n) = 1;

則 n 是素數. (注意對每乙個 q 都可以用不同的 a).

定理二還可以進一步改進如下:如果 f在我們轉向另一種檢驗法之前,讓我們把如下定理二的兩種應用記述如下:

佩班(pepin)檢驗法(1877): 讓 f(n) 第n個費馬數 ( f(n) = 22n+1) 並且 n>1.

f(n) 是素數當且僅當

3(f(n)-1)/2 = -1 (mod f(n)).

定理三 : 讓 n = h.qk+1 且 q 是素數 並且 qk > h. 如果存在乙個整數a使得 an-1 = 1 (mod n), 並且 ***(a(n-1)/q-1,n) = 1, 則 n 是素數.

2. n+1 檢驗法和lucas-lehmer檢驗法

有許多已知的大素數具有形式n-1, 而 n 是很容易分解因數的,為什麼這些形式的數能被檢驗呢?因為對它們可以應用一種類似於費馬小定理的有趣定理來對付它們.

假定我們選擇兩個整數 p 和 q 使得 p2-4q 不是模 n的乙個平方剩餘, 則多項式 x2-px+q 有兩個不同的根, 其中之一是 r = (p+sqrt(p2-4q))/2, 並且很容易推導出 r 的冪具有如下形式:

引理 1: rm = (v(m) + u(m)sqrt(p2-4q))/2

這裡 u 和 v 分別定義如下:

u(0) = 0, u(1) = 1, u(m) = pu(m-1) - qu(m-2)

v(0) = 2, v(1) = p, v(m) = pv(m-1) - qv(m-2)

這就是關於 p 和 q的盧卡斯序列. 乙個眾所周知的特例是令 p=1, q=-1, 則 u(m) 斐波拿契數列.盧卡斯序列有許多特性,使得它們能很快地進行計算(用一種類似於我們在計算 xm 時所用的重複平方的方法):

u(2m) = u(m)v(m)

v(2m) = v(m)2-2qm

現在我們來敘述這種類似於費馬小定理的定理:

引理 2: p, q 和 r 同上 (使得 p2-4q 不是模 n的乙個平方剩餘),

讓 2r = a+bsqrt(p2-4q) (mod n) .

如果 n 素數, 則 2rn = a-bsqrt(p2-4q) (mod n).

這樣說有點太混亂, 讓我們用我們的 u 序列(即sqrt(p2-4q)的係數). 

引理 3: (p, q 同上) 如果 n 是素數, 則 u(n+1) = 0 (mod n).

現在我們可以重新敘述一下定理了:

定理 4: 讓 n > 1 是乙個奇整數. 如果對於 n+1 的每乙個素因子 r 都存在相應的素數 p 和 q (這裡 p2-4q 不是 n 的平方剩餘)使得:

u(n+1) = 0 (mod n),並且

u((n+1)/r) is not 0 (mod n);

則 n 是素數.(確定乙個數 d 是否是 modulo n 的乙個平方剩餘很容易用 jacobi 符號來決定,這在任何一本數論書中都可以找到.)

乙個重要的有趣特例是設s(k) = v(2k+1)/22k

盧卡斯-萊默檢驗法(1930): 讓 m(n) 是第 n 個梅森素數 (即 m(n) = 2n-1). m(n) 是素數當且僅當    s(n-2) = 0 (mod m(n)) 這裡 s(0) = 4 並且 s(k+1) = s(k)2-2.

這個檢驗法計算特別快,因為它不需要做乘法,只要做移位即可.編寫程式也很容易.

大素數的檢驗

費馬小定理 a p 1 mod p 1 p是素數 a0 首先我們證明這樣乙個結論 如果p是乙個素數的話,那麼對任意乙個小於p的正整數a,a,2a,3a,p 1 a 除以p的餘數正好是乙個1到p 1的 排列。例如,5是素數,3,6,9,12除以5的餘數分別為3,1,4,2,正好就是1到4這四個數。反證...

又見素數(素數篩法)

又見素數 time limit 2000ms memory limit 65536k total submit 287 accepted 24 description 給定乙個正整數n n 10000000 求n 包含 以內素數的個數。input 第一行為乙個整數t t 1000 表示測試資料的組數...

素數篩法求素數

素數篩類似於打表標記,預先處理掉非素數的數,即素數的倍數 任意非素數都可以由幾個素數相乘得到 於是效率比暴力求解快得多。埃氏篩法的效率為o n loglog n 簡單易懂,但是會重複標記,比如當i為2時,6會被標記掉,然而當i為3時,6又會被重複標記,這樣的重複訪問加大了時間複雜度,於是有了尤拉篩。...