嗯在剛剛(沒錯就是在幾分鐘之前!)我學會了線性篩法
實在是乙個很好的篩法
正常的篩法,都會對乙個數篩多次
但是尤拉篩法不會
尤拉篩法是用它的最大因數去篩 別跟我說最小質因數,那個很難讓人理解 雖然最小質因數和最大因數是一樣的
我們假設乙個數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 從小到大的篩選素數,...