素數與素數檢測

2021-06-23 00:18:48 字數 1520 閱讀 5722

一.試除法

根據素數的定義,假設要判斷的自然數為n,那麼最簡單的方法便是用2~(n-1)之間的數字依次列舉試除一遍,如果能整除,那說明這個數不是素數,顯然,此種演算法的效率極低。初學c語言的人會使用另一種改進的試除法,那便是除數不用取遍2~(n-1),而是取2~(int)sqrt(n),但是當n很大時,此種演算法的時間消耗也很大,也是不可取的。

二.篩選法

篩選法事一種比較高效的判斷素數的方法,能夠一次性的篩選除某個區間的素數。演算法的基本原理也是利用了素數的定義,在某個範圍內,依次去掉2的倍數,3的倍數,5的倍數……以此類推,一直到所有小於或等於n的數字的倍數都被去掉為止。這就像一面篩子,把某個區間範圍內滿足條件的數留下來,其餘的數字去掉,最後判斷此區間內的某個數是否為素數時,時間複雜度就為o(1)。很顯然,時間的主要消耗都在於數字的篩選上。利用給陣列單元置零的方法來實現,建立乙個陣列a[i],i=1、2、3……,用memset()函式將其全部置1,當i不是素數,則將a[i]置零

#define max n  /*n為設定的某個數,確定乙個判斷區間*/

int isprime[max];

void is_prime1()

return(n*k)%m;

}void prime(int n)

}int main()

printf("%d\n",sum);

}return 0;

}

優化的**,下面是上面的效率的大約20倍

#include#includeint pr[8]=;  //對應每次加相應的數 得出全部素數和部分合數(7+ ->) 11 13 17 19 23 29 31 37  41 43..

int prime(int n)

if(n%i==0)

return 0;

}return 1;

}int main()

return ans;

}bool miller_rabbin(int n,int a)

__int64 k=qpow(a,s,n);

if(k==1)

return true;

for(j=0;j五.   aks演算法

2023年提出的aks演算法,利用了代數數論、有限域中的深刻結論,是乙個確定性的多項式演算法。ask演算法描述如下:

輸入奇數n,判斷n為素數或者合數。

步驟:1.  輸入n>1;

2.  若

3.  找r>0,滿足

4.  任意的0 < a <= r,計算(a,n),如果n>(a,n)>1,則輸出合數;

5.  n <= r,輸出素數;

6.  for a=1 to

7.  輸出素數。

以上的介紹可見,素數的判斷有許多方法,在數字規模不同的情況下,可以選擇不同的演算法。篩選法容易理解,一定程度上效率得到提高,可是卻受到記憶體的限制,而公尺勒拉賓演算法是一種不確定演算法,卻是高效演算法。aks演算法又給我們開啟了乙個新境界,更多的啟發,相信在今後的分析研究中,將有更高效的演算法出現。

python素數演算法 Python素數檢測的方法

因子檢測 檢測因子,時間複雜度o n 1 2 def is prime n if n 2 return false for i in xrange 2,int n 0.5 1 if n i 0 return false return true 費馬小定理 如果n是乙個素數,a是小於n的任意正整數,那...

素數與素數篩

素數篩法 線性篩法 啊,耳熟能詳。素數又稱質數,乙個大於1 11的自然數,除了1 11和它本身外,不能被其他自然數整除,換句話說就是該數除了1 11和它本身以外不再有其他的因數 否則稱為合數。啊!1 11不是素數啊 啊,也耳熟能詳了,暴力列舉一下除1 11和本身的自然數是否會被整除。bool is ...

素數檢測演算法

因為1既不是素數也不是合數,所以下面的實現 中不考慮小於2的情況。本文以c語言進行講解,建議對著完整的原始碼看。最原始 最粗暴的方法就是從頭到尾逐個進行檢測,一旦遇到可被整除的數馬上返回false bool is prime 1 int n return true 該演算法時間複雜度為n2 n 2對...