第一種用得比較多:篩法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...