素數判定演算法

2021-09-26 03:38:52 字數 2317 閱讀 4168

1. 素數判定問題

素數判定問題是乙個非常常見的問題,本文介紹了常用的幾種判定方法。

2. 原始演算法

素數的定義是,除了能被1和它本身整除而不能被其他任何數整除的數。根據素數定義 只需要用2到n-1去除n,如果都除不盡,則n是素數,否則,只要其中有乙個數能整除則n不是素數。

bool is_primer1(int num) 

} return false;

}

3. 改進演算法

n不是素數,則n可表示為a*b,其中2<=a<=b<=n-1,則a,b中必有乙個數滿足:14. 篩選演算法

更高效地素數判斷方法應該是將素數預先儲存到乙個素數表中,當判斷乙個數是否為素數時,直接查表即可。這種方法需要解決兩個問題:

(1) 怎樣快速得到素數表?(採用篩選方法)

(2) 怎樣減少素數表的大小?(採用位圖資料結構)

對於1到n全部整數,逐個判斷它們是否是素數,找出乙個非素數,就把它挖掉,最後剩下的就是素數。具體方法是:

<1> 定義is_primer[i] = true;

<2> 從2開始,依次遍歷整個is_primer(直到sqrt(n)),如果is_primer[i]=true,則is_primer[n*i]=false

如1,2,3,4,5,6,7,8,9,10,則

從2開始遍歷:

is_primer[2]=true,則is_primer[4]= is_primer[6]= is_primer[8]= is_primer[10]= true

is_primer[3]=true,則is_primer[6]= is_primer[9]= true

為了減少記憶體使用率,演算法使用了點陣圖資料結構,關於位圖,可參考:

bool load_primer_table1() 

}}bool load_primer_table2() else

} int upper = sqrt(int_max);

for(i = 1; i <= upper; i++)

}}bool is_primer3(long num)

5. 優化的篩選演算法

(1) 儲存方式優化

仍然採用位圖方式儲存,只不過是點陣圖中只儲存奇數,這樣一下子節省了一半空間(需要的空間僅為4g/(32*2)=64mb)

儲存空間優化後,演算法效率也會提公升很多,如:1,2,…,30

只需儲存3,5,7,9,11,13,15,17,19,21,23,25,27,29

i=0, is_primer[0] =true, 把下標[3][6][9][12],即9,15,21,27,標為false

i=1, s_primer[0] =true,把下標為[6][11],即15,25標為false

i=2, 2*i+3>sqrt(30),結束

即:i=s, 把下標為s(2*t+1)+3t,其中,t=1,2,3,…中所有的的is_primer置為false

(2) 優化刪選演算法

a是素數,則下乙個起點是a*a,把後面的所有的a*a+2*i*a篩掉。即欲求n以內的素數,就先把sqrt(n)內的素數求出來,用已經求得的素數來篩出後面的合數。

6. 總結

至今為止,沒有任何人發現素數的分布規律,也沒有人能用乙個公式計算出所有的素數。關於素數的很多的有趣的性質或者科學家的努力,如:

(1) 高斯猜測,n以內的素數個數大約與n/ln(n)相當,或者說,當n很大時,兩者數量級相同。這就是著名的素數定理。

(2) 十七世紀費馬猜測,2的2^n次方+1,n=0,1,2…時是素數,這樣的數叫費馬素數,可惜當n=5時,2^32+1就不是素數,至今也沒有找到第六個費馬素數。

(3) 18世紀發現的最大素數是2^31-1,19世紀發現的最大素數是2^127-1,20世紀末人類已知的最大素數是2^859433-1,用十進位制表示,這是乙個258715位的數字。

(4) 孿生素數猜想:差為2的素數有無窮多對。目前知道的最大的孿生素數是1159142985×2^2304-1和1159142985×2^2304+1。

(5) 歌德**猜想:大於2的所有偶數均是兩個素數的和,大於5的所有奇數均是三個素數之和。其中第二個猜想是第乙個的自然推論,因此歌德**猜想又被稱為1+1問題。我國數學家陳景潤證明了1+2,即所有大於2的偶數都是乙個素數和只有兩個素數因數的合數的和。國際上稱為陳氏定理。(摘自《

7. 參考資料

素數判定 Miller Rabin 演算法

談到素數判定,首先想到的兩種便是暴力判定與篩法,實現非常簡單,在此不提。但在分解大質數時,由於數字過大,使得暴力判定會超時,篩法會超空間 可使用有技巧的限制空間篩法,但數字過大仍然過不了 這時,我們就要引入非完美大質數判定演算法 miller rabin演算法。下面一段引自sunshine cfbs...

演算法 Miller Robbin素數判定

目錄 三 小結 我們以前都是怎麼判斷素數的呢 試除法 若乙個正整數n為合數,則存在乙個能整除n的數k,其中 2 leqslant k leqslant sqrt n 具體實施如下 inline int is prime int n return 1 這種方法的時間複雜度為 o sqrt n 現在,我...

演算法雜項 快速判定素數 素數表

問題描述,如何快速判斷乙個數x是否為素數?傳統思維 對於數n,從i 2,3,4,5 到 n 1 判斷 n能否被i整除,如果全部不能整除,則n是素數,只要有乙個能除盡,則n不是素數 事實上,為了壓縮迴圈次數,可將判斷範圍從2 n 1改為2 sqrt n 但是我們如果要列印乙個比較大的素數表呢?比如列印...