素数筛选以及优化分析
生活随笔
收集整理的這篇文章主要介紹了
素数筛选以及优化分析
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
素?cái)?shù)篩選法的思想:對(duì)于不超過N的每個(gè)正整數(shù),刪除2P,3P,4P……,當(dāng)處理完所有數(shù)之后,還沒有被刪除的就是素?cái)?shù)。
按照上述思想寫成的簡(jiǎn)單篩選法代碼如下:
下面我們想想如何改進(jìn):
1.由唯一分解定理:每個(gè)正整數(shù)可以寫成n=a1^p1*a2^p2……(其中a1,a2是質(zhì)數(shù))
改進(jìn)代碼:
memset(vis,0,sizeof(vis)); for(int i=2;i*i<=m;i++) if(!vis[i])//判斷i是質(zhì)數(shù), for(int j=i*i;j<=n;j+=i) vis[j]=1;//直接從i*i開始這個(gè)改進(jìn)了的代碼也會(huì)有重復(fù)篩選的情況存在,比如數(shù)16,81等
下面給出最優(yōu)的歐拉篩法,真正的o(n)復(fù)雜度
const int N=1000000+5; int check[N],prime[N]; memset(prime,0,sizeof(prime)); memset(check,0,sizeof(check)); int ptot=0; for(int i=2;i<=n;i++){ if(!check[i]) prime[ptot++]=i; for(int j=0;j<ptot;j++){ if(prime[j]*i>n) break; check[prime[j]*i)=1; if(i%prime[j]==0) break;//區(qū)別第二個(gè)代碼的一步 } }歐拉篩法和第二個(gè)代碼 思想類似,只是多了關(guān)鍵了一步,“ifi%prime[j]==0) break;"
為什么要這樣做呢?
分析第二個(gè)代碼,它極大地避免了重復(fù)的篩選,它的外層篩選只選取質(zhì)數(shù),內(nèi)層循環(huán)避免了2*3和3*2的這種重復(fù)篩選
但是像24這種既可以分解為2*12,又可以分解為3*8的來(lái)說,第二個(gè)代碼就沒有避免對(duì)24的重復(fù)篩選。
下面給出歐拉篩法里面關(guān)鍵一步的原理證明
總結(jié)
以上是生活随笔為你收集整理的素数筛选以及优化分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Atom + Texlive 配置
- 下一篇: 素数筛选_变形