快速求質數辦法

2021-05-28 12:18:11 字數 2193 閱讀 9634

2010-08-22 01:28

410人閱讀收藏

舉報 tag 素數  數論

素數總是乙個比較常涉及到的內容,掌握求素數的方法是一項基本功。

基本原則就是題目如果只需要判斷少量數字是否為素數,直接列舉因子2 。。n^(0.5) ,看看能否整除n。

如果需要判斷的次數較多,則先用下面介紹的辦法預處理。

首先先介紹一般的線性篩法求素數

view plain

copy to clipboard

print?

void make_prime()    

return;    

}     

這種方法比較好理解,初始時,假設全部都是素數,當找到乙個素數時,顯然這個素數乘上另外乙個數之後都是合數,把這些合數都篩掉,即演算法名字的由來。

但仔細分析能發現,這種方法會造成重複篩除合數,影響效率。比如10,在i=2的時候,k=2*15篩了一次;在i=5,k=5*6 的時候又篩了一次。所以,也就有了快速線性篩法。

快速線性篩法沒有冗餘,不會重複篩除乙個數,所以「幾乎」是線性的,雖然從**上分析,時間複雜度並不是o(n)。先上**

view plain

copy to clipboard

print?

#include

using

namespace std;      

const

long n = 200000;      

long prime[n] = ,num_prime = 0;      

int isnotprime[n] = ;      

int main()      

}      

return 0;      

}      

首先,先明確乙個條件,任何合數都能表示成一系列素數的積。

不管 i 是否是素數,都會執行到「關鍵處1」,

如果 i 都是是素數的話,那簡單,乙個大的素數 i 乘以不大於 i 的素數,這樣篩除的數跟之前的是不會重複的。不過篩出的數各個素數係數的冪都是1. n=p1*p2*p3...的形式 pi之間不相等

如果 i 是合數,此時 i 可以表示成遞增素數相乘 i=p1*p2*...*pn, pi都是素數(1<=i<=n)  pi<=pj ( i<=j )

p1是最小的係數。

根據「關鍵處2」的定義,當p1==prime[j] 的時候,篩除就終止了,也就是說,只能篩出不大於p1的質數

*i 。

我們可以直觀地舉個例子。i=2*3*5

此時能篩除 2*i ,不能篩除 3*i

如果能篩除3*i 的話,當 i' 等於 i'=3*3*5 時,篩除2*i' 就和前面重複了。

根據上面紅字的條件,現在分析乙個數會不會被重複篩除。

設這個數為 x=p1*p2*...*pn, pi都是素數(1<=i<=n)  ,  pi<=pj ( i<=j )

對於 i ,第乙個能滿足篩除 x 的數 i 必然為 i=p2*p3...*pn(p2可以與p1相等或不等),而且滿足條件的 i 也只有乙個。所以不會重複刪除。

我還是希望用通俗的話來解釋,所以上面並沒有用嚴格的數學方式來證明。

再模擬乙個模型,比如說我們要找出 n 中2個不同的數的所有組合 ,1<=i<=n, 1<=j<=n,

我們會這麼寫

for (i=1; ifor (j=i+1; j<=n; ++j)

我們取 j=i+1 便能保證組合不會重複。快速篩法大概也是這個道理。

1樓提供的方法,我整理下

//偶數顯然不行,所以先去掉偶數。可以看作上面第一種的優化吧。

view plain

copy to clipboard

print?

我推薦這個演算法! 易於理解。 只算奇數部分,時空效率都還不錯!   

half=size/2;   

int sn = (int) sqrt(size);   

for (i = 0; i < half; i++) p[i] = true;// 初始化全部奇數為素數。p[0]對應3,即p[i]對應2*i+3 

for (i = 0; i < sn; i++)   

}   

//素數都存放在 p 陣列中,p[i]=true代表 i+i+2 是素數。

//舉例,3是素數,按3*3,3*5,3*7...的次序篩選,因為只儲存奇數,所以不用刪3*4,3*6....

篩法快速求素數 leetcode計數質數

在演算法競賽中經常會遇到求質數的問題,這種題目一般都是要求出一定範圍內 0,n 所有的質數或者質數的個數。最直接的思路就是根據質數的定義來判定乙個數是不是質數 即乙個數不能被除1和它本身外的任何數整除 如果我們需要對所有的數都這樣進行判斷,那麼當n非常非常大的時候,這種演算法的時間開銷就會非常大,大...

如何用mysql求質數 求質數的幾種演算法

1 根據質數的定義求 質數定義 只能被1或者自身整除的自然數 不包括1 稱為質數。利用它的定義可以迴圈判斷該數除以比它小的每個自然數 大於1 如果有能被它整除的,則它就不是質數。對應 是 輸出從2到max的所有質數 public static void prime intmax i count if...

python怎麼求質數 Python中質數怎麼找?

質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。python中怎麼查詢質數呢?1 首先我們建立乙個空的list 然後我們知道2是最小的質數,於是我們把2新增進這個空白的list 2 之後我們開始迴圈,第乙個數從3開始 用3除以小於3的質數,沒有小於它的質數能被它整除 我們將3再...