尤拉篩找素數

2022-01-12 23:08:58 字數 2907 閱讀 9506

任何合數都可以表示為多個素數的乘積,合數肯定有乙個最小的質因子,通過這個最小質因子篩掉合數,保留素數。

aizu0009:求小於或等於n的素數個數

n∈[1,999999]

#include#include

#include

#include

using

namespace

std;

const

int maxa=1000010

;int

prime[maxa];

bool

flag[maxa];

intcnt,n;

void

find_prime()

}cout

}int

main()}/*

模擬尤拉篩:

判斷25以內的素數

數字 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

判斷 f f f f f f f f f f f f f f f f

i=2;i<=25; yes;prime[0]=2;cnt=1;

forj=0;j<1 && 2*2<=25; flag[4]=false; if(2%prime[0]==0) yes break;

j=1;j<1 && no

i=3;i<=25; yes;prime[1]=3;cnt=2;

forj=0;j<2 && 2*3<=25; flag[6]=false; if(3%prime[0]==0) no

j=1;j<2 && 3*3<=25; flag[9]=false; if(3%prime[1]==0) yes break;

i=4;i<=25; no;

forj=0;j<2 && 2*4<=25; flag[8]=false; if(4%prime[0]==0) yes break;

i=5;i<=25; yes;prime[2]=5;cnt=3;

forj=0;j<3 && 2*5<=25; flag[10]=false; if(5%prime[0]==0) no

j=1;j<3 && 3*5<=25; flag[15]=false; if(5%prime[1]==0) no

j=2;j<3 && 5*5<=25; flag[25]=false; if(5%prime[2]==0) yes break;

i=6;i<=25; no;

forj=0;j<3 && 2*6<=25; flag[12]=false; if(6%prime[0]==0) yes;break;

i=7;i<=25; yes;prime[3]=7;cnt=4

forj=0;j<4 && 2*7<=25; flag[14]=false; if(7%prime[0]==0) no

j=1;j<4 && 3*7<=25; flag[21]=false; if(7%prime[1]==0) no

j=2;j<4 && 5*7=35;break;

i=8;i<=25; no

forj=0;j<4 && 2*8<=25; flag[16]=false; if(8%prime[0]==0) yes;break;

i=9;i<=25; no

forj=0;j<4 && 2*9<=25; flag[18]=false; if(9%prime[0]==0) no;

j=1;j<4 && 3*9=27;break;

i=10;i<=25; no

forj=0;j<4 && 2*10<=25; flag[20]=false; if(10%prime[0]==0) yes;break;

i=11;i<=25; yes;prime[4]=11;cnt=5

forj=0;j<5 && 2*11<=25; flag[22]=false; if(11%prime[0]==0) no

j=1;j<5 && 3*11=33;break;

i=12;i<=25; no;

forj=0;j<5 && 2*12<=25; flag[24]=false; if(12%prime[0]==0) yes;break;

i=13;i<=25; yes;prime[5]=13;cnt=6

forj=0;j<6 && 2*13=26 break;

i=14;no

forbreak;

i=15;no

forbreak;

i=16;no

forbreak;

i=17; yesprime[6]=17;cnt=7

forbreak;

i=18;no

forbreak;

i=19; yes; prime[7]=19,cnt=8

forbreak;

i=20; no

forbreak;

i=21; no

forbreak;

i=22; no

forbreak;

i=23; yes; prime[8]=23;cnt=9

forbreak;

i=24;no

forbreak;

i=25;no

forbreak;

*/

線性篩素數(尤拉篩)

尤拉篩是o n 複雜度的篩素數演算法,1秒內埃篩能處理1e6的資料,而1e7的資料就必須用尤拉篩了。埃篩的基本思想是 素數的倍數一定是合數。尤拉篩基本思想是 任何數與素數的乘積一定是合數 演算法概述 遍歷 2,n 的所有數i,內層迴圈遍歷已經找到的素數prime j 將i prime j 標記為合數...

尤拉篩 素數 基礎

求乙個數是不是素數,我們最開始用到的方法是從2開始跑到這個數的前一項,如若這些數都不能被這個數整除,那麼就稱這個數是素數 素數的概念是除了1和它本身之外不再有其他因數 除了1 我們稱這樣的數為素數。如果我們就按一般思路去實現求解這個數是不是素數,那麼會用for迴圈從2開始跑到這個數的前一項,每個數都...

尤拉函式 素數篩

尤拉發現求小於等於n的正整數中有多少個數與n互質可以用這個公式 euler x x 1 1 p1 1 1 p2 1 1 p3 1 1 p4 1 1 pn 其中p1,p2 pn為x的所有素因數,x是不為0的整數。euler 1 1 唯一和1互質的數就是1本身 尤拉公式的延伸 乙個數的所有質因子之和是e...