素數打表(三種篩選法)

2021-06-18 23:31:07 字數 1281 閱讀 9336

第一種用得比較多:篩法1:eraosthenes(愛拉托斯尼篩法)篩法:

for(i=2;i<=1000;i++)  

if(!s[i])

但是第一種如果是大於百萬級以上的話就……有點吃力了……因為其中有重複計算過的素數,這就不必要了!比如:10這個數,當2或者5的時候都被實行了一次s[10]=1;所以為了減少不必要的,就有了第二種……

第二種用得比較少,

篩法2:

一種線性篩素數的方法(複雜度是o(n)):

void get_prime()

}}/*可以用均攤分析的方法來分析演算法的複雜度,由於每

個合數都唯一的被它的最小素因子篩一次,而每個合

數的最小素因子都是唯一的,總複雜度是o(n) */

第三種比較懸……判斷是不是素數是個概率問題,不過可以讓概率減小到很小……這就是miller rabin演算法:

數論學家利用費馬小定理研究出了多種素數測試方法,目前最快的演算法是拉賓公尺勒測試演算法,(現在不是最快,印度的一名老師和他的兩個本科生的演算法是最快的:印度理工學院電腦科學與工程學系的科學家馬寧德拉·阿格拉瓦和他的兩位在校本科生尼拉葉·卡雅爾和尼汀·薩克斯特納)其過程如下:

(1)計算奇數m,使得n=(2**r)*m+1

(2)選擇隨機數a(3)對於任意i(4)或者,若a**m mod n = 1,則n通過隨機數a的測試

(5)讓a取不同的值對n進行5次測試,若全部通過則判定n為素數

若n 通過一次測試,則n 不是素數的概率為 25%,若n 通過t 次測試,則n 不是

素數的概率為1/4**t。事實上取t 為5 時,n 不是素數的概率為 1/128,n 為素數的

概率已經大於99.99%。

在實際應用中,可首先用300—500個小素數對n 進行測試,以提高拉賓公尺勒測試

通過的概率,從而提高測試速度。而在生成隨機素數時,選取的隨機數最好讓 r=0,

則可省去步驟(3) 的測試,進一步提高測試速度

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

bool witness(int a,int n)

return (d!=1);

}bool rabin_miller(int n,int s)

{ int j,a;

for(j=0; j

三種素數篩選法詳解 轉

第一種 剔除2 3 4 5 6 的倍數 在i從2開始的增一變化過程中,剔除i的倍數即j i j是大於等於2的自然數,j的上限是問題規模m 為了減少重複步驟,可以每當i遞增到等於第乙個沒有被剔除的 素 數時再剔除該數的倍數,重複上述過程至i到達問題規模m的平方根 1 需要說明的三個問題 假設迴圈到第n...

三種素數篩選方法

第一種 剔除2 3 4 5 6 的倍數 在i從2開始的增一變化過程中,剔除i的倍數即j i j是大於等於2的自然數,j的上限是問題規模m 為了減少重複步驟,可以每當i遞增到等於第乙個沒有被剔除的 素 數時再剔除該數的倍數,重複上述過程至i到達問題規模m的平方根 1 需要說明的三個問題 假設迴圈到第n...

素數篩選的三種方法

第一種 剔除2 3 4 5 6 的倍數 在i從2開始的增一變化過程中,剔除i的倍數即j i j是大於等於2的自然數,j的上限是問題規模m 為了減少重複步驟,可以每當i遞增到等於第乙個沒有被剔除的 素 數時再剔除該數的倍數,重複上述過程至i到達問題規模m的平方根 1 需要說明的三個問題 假設迴圈到第n...