快速線性篩法的原理和值得借鑑的方法 解析演算法

2021-06-27 01:45:15 字數 962 閱讀 2089

篩法求素數就是先認定所有的數是素數(int a[10000]=),再通過一些方法把合數踢掉(a[i']=1)

一般篩法的思想是:從2開始找,素數的倍數(1倍、2倍、3倍,,,)

為合數。它的缺點是會重複篩除一些合數        (     像篩除3*5之後又會篩除5*3,這樣會使複雜度很大)

快速線性篩法的特點就是不會重複篩除乙個合數。它的原理是

前提是:乙個合數

i=p1*p2*...*pn, pi都是素數(2<=i<=n),  pi<=pj  ( i<=j )

p1是最小的係數。這樣每乙個合數就有乙個確定的表示方法,不會重複。(像12=2*2*3)

no.1:我們現在規定乙個合數由兩個數得到。

no.2:那麼合數有兩種。1.素數*素數=合數   2.乙個最小的素數*合數=合數

篩除:

如果遇到i為素數,那麼乙個大的素數 i 乘以不大於 i 的素數,這樣篩除的數跟之前的是不會重複的

如果遇到i為合數,我們只認為合數由乙個最小的素數*合數得到,也不會重複(就像12=2*6而不是12=3*4)

那麼**來了

#includeusing namespace std;      

const long n = 200000;

long prime[n] = ,num_prime = 0;

int isnotprime[n] = ;

int main()

}

return 0;

}

線性篩法的應用

by qw 線性篩法最基礎的功能就是求 1,n 中的素數,以此為基礎,可以對他進行一些變形。變形後的線性 篩法可以實現許多其他的功能。下文中的tot均指一定區間內的質數個數 先看一道簡單的問題 求 1,n 中的m個數的最大質因子的序數 hdoj2136 這個問題可以利用線性篩法打乙個質數表,然後二分...

神奇的線性篩法

所謂線性篩法,顧名思義它是線性的篩素數的方法,所以是o n 的int getprime int lim 這是普通篩法 int getprime int lim 這是線性篩法 某神犇已經測過,我直接上結果 可以發現,普通篩法將每個質數的倍數都篩掉,每個合數都被篩了它的質因子次 that s too s...

乘法逆元的線性篩法

目錄位址 對於已知模數 m 求出在模 m 意義下,1 n 的逆元 n leq m 1 n 較大,只支援 o n 複雜度的演算法 一般保證 m 是質數,否則有的數不存在逆元 由遞推的方法 o n 考慮模 m 意義下 1 equiv 1 mod m 考慮求 n 的逆元,可知 m lfloor rfloo...