線性篩法(尤拉篩法)

2021-06-26 02:59:41 字數 859 閱讀 2194

嗯在剛剛(沒錯就是在幾分鐘之前!)我學會了線性篩法

實在是乙個很好的篩法

正常的篩法,都會對乙個數篩多次

但是尤拉篩法不會

尤拉篩法是用它的最大因數去篩   別跟我說最小質因數,那個很難讓人理解 雖然最小質因數和最大因數是一樣的

我們假設乙個數k,它是t的最大因數

容易知道t是不唯一的

那我們要乘以乙個質數得到k

那這個質數應該是什麼呢?

如果我們傻傻地把k和所有質數乘一起,那就會不符合「k是最大因數了「對吧

那我們應該怎麼搞呢?

我們把質因數從小到大列舉過去,如果一旦遇到乙個k mod it =0的,就break

為什麼呢?

假設乙個質數y

k*y把它因式分解後,最小質因數是k的最小質因數和y之間的較小值

那麼最大因數就是這個數除以最小質因數麼。。

如果y<=[k 的 最小質因數],那麼k*y的最小質因數就是y,最大因數就是k,是滿足條件的

反之則不滿足條件

而it正是k的最小質因數,所以在it之前的都可以篩,但是it之後的就不符合了

code:

for i:=2 to n do

begin

if not(prime[i]) then begin inc(tot); ant[tot]:=i; end;

for j:=1 to tot do

begin

if ant[j]*i>n then break;

prime[ant[j]*i]:=true;

if (i mod ant[j]=0) then break;

end;

end;

線性篩法(尤拉篩)

從前有乙個素數篩法叫埃拉託斯特尼篩法,它的思想很簡單,把1 n以內素數的整數倍的數字劃掉,留下的就全是素數,但是它的複雜度是o nlglgn 對於大量不友好資料會跪,於是線性曬登場了。include using namespace std int prime 1100000 primesize,ph...

素數線性篩法(尤拉篩)

之前寫的埃式篩法複雜度達o n log n lo gn o n logn logn o n lo gn l ogn 在大數字的時候可能複雜度還不夠理想。這種做法對於乙個合數有可能會篩了多次,導致重複做功。引入尤拉篩法能夠解決這種多次篩同乙個數字的情況,理論演算法複雜度o n o n o n 精髓在於...

線性篩法求素數(埃氏篩法 尤拉篩法)

篩法都是初始化把所有數都先設為素數,然後篩除合數。理解起來比較簡單,就是從小到大的列舉每乙個數,標記它的所有倍數都是合數 非素數 放到u i 為false,u中的下標對應的就是這個數的值。bool u maxn int num,su maxn 1.埃氏篩法 void prime 從小到大的篩選素數,...