数论基础_素数相关
1.素數判定
普通的算法即O(sqrt(N))的試除法,高級些的Miller_Rabin素數測試.
但NOIP似乎用不著Miller_Rabin,試除法又非常簡單,就不在這里寫了.
2.求素數
篩法是比較常見的方法.埃拉托色尼斯篩法可以對付一般的題目了.
但我想寫寫線性篩法.
先給code:
const MAX=1000000; var Prime:array[0..MAX] of longint;v:array[0..MAX] of boolean;procedure GetPrime;var i,j,tmp,size:longint;beginsize:=0;fillchar(v,sizeof(v),0);for i:=2 to MAX dobeginif not v[i] thenbegininc(size);prime[size]:=i;end;j:=1;while (j<=size)and(prime[j]*i<MAX) dobeginv[i*prime[j]]:=true;if i mod prime[j]=0 then break;inc(j);end;end;end;beginGetPrime; end.算法的核心在于while循環內的語句.
首先,prime[j]一定是i的最小質因子,因此也是i*prime[j]的最小質因子.
然后又有了這句話:if i mod prime[j]=0 then break;
于是算法就保證了每個合數只被它的最小質因子篩去,且僅篩去一次.
那么會不會漏掉某些合數沒有篩去呢?不會.
因為i*prime[j'](j'>j)一定被prime[j]乘上以后的某個更大的i'篩去。
∵i'*prime[j]=i*prime[j']
∴i'=i/prime[j]*prime[j']>i
所以是O(N)效率的.
線性篩法的作用不只是求素數,以后還會寫到其他的應用.
轉載于:https://www.cnblogs.com/exponent/archive/2011/08/09/2131869.html
總結