大素數的檢驗

2021-04-21 02:23:30 字數 1146 閱讀 4481

費馬小定理:

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這四個數。

反證法,假如結論不成立的話,那麼就是說有兩個小於p的正整數m和n使得na和ma除以p的餘數相同。不妨假設n>m,

則p可以整除a(n-m)。但p是素

數,那麼a和n-m中至少有乙個含有因子p。這顯然是不可能的,因為a和n-m都比p小。

用同余式表述,我們證明了:

(p-1)! ≡ a * 2a * 3a * … * (p-1)a (mod p)

也即:(p-1)! ≡ (p-1)! * a^(p-1) (mod p)

兩邊同時除以(p-1)!,就得到了我們的最終結論:

1 ≡ a^(p-1) (mod p)

費馬小定裡的尤拉推廣:a^φ(m) ≡ 1 (mod m)(其中

φ(m)為與m互質的數的個數)

證明與費馬小定理類似

但是費馬小定理的逆命題並不正確,即,當滿足a^(p-1) mod p = 1的數p不一定是素數,例如p=341,a=2,

而此時p=11*13

後來,人們又發現了561, 645, 1105等數都表明a=2時fermat小定理的逆命題不成立。雖然這樣的數不多,

但不能忽視它們的存在。於是,人們把所

有能整除2^(n-1)-1的合數n叫做偽素數(pseudoprime),意思就是告訴人們這個素數是假的。

不滿足2^(n-1) mod n = 1的n一定不是素數;如果滿足的話則多半是素數。這樣,乙個比試除法效率更高的

素性判斷方法出現了:製作一張偽素數

表,記錄某個範圍內的所有偽素數,那麼所有滿足2^(n-1) mod n = 1且不在偽素數表中的n就是素數。之所以

這種方法更快,是因為我們可以使用

二分法快速計算2^(n-1) mod n 的值,這在計算機的幫助下變得非常容易;在計算機中也可以用二分查詢有序

數列、hash錶開雜湊、構建trie樹等

方法使得查詢偽素數表效率更高。

檢驗大素數 公尺勒隨機測試

miller rabin 概率演算法,能處理10 19範圍數 include include include include include includeusing namespace std const int s 20 隨機演算法判定次數,s越大,判錯概率越小 計算 a b c.a,b都是lo...

素數檢驗法

數的素性檢驗方法問題在近幾年得到了飛速的發展,過去,要檢驗乙個數 n 是否是素數,最簡單的方法是用試除法,用小於n的平方根以下的所有素數去除n,若都除不盡,則n就是素數,否則為合數.這對於比較小的數來說還適用,若用計算機編成程式,對於10位數,幾乎瞬間即可完成,對於乙個20位數,則需要2個小時,對於...

Miller Rabin大質數檢驗

質數檢驗有不少演算法,一般使用的質數檢驗複雜度是 o sqrt 又如線性篩可以在 o n 的時間內求出所有1 n的質數 但是,當n非常大,連 o sqrt 的複雜度也難以接受時,上述演算法便不能滿足要求 這篇blog記錄了一些關於miller rabin演算法的內容 a equiv1 pmod p ...