素數篩法詳解

2021-10-19 15:31:01 字數 2760 閱讀 5201

在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數稱為素數,也叫質數

1.算術基本定理:任何乙個大於1的自然數 n,如果n不為質數,那麼n可以唯一分解成有限個質數的乘積。

2. 若乙個數 n 可以進行因數分解,則得到的兩個數一定是有乙個》=sqrt(n),另乙個<=sqrt(n)。

以下介紹3種常見的素數篩法。

此方法一般用於判斷單個數是否為素數。時間複雜度為o(√n) 。

現設要判斷n是否為素數,

列舉從2到√n的所有自然數,若這些數都不是n的因數,則n為質數。

#include

#include

#include

#include

int visit[

100000

],n,sum;

//visit[i]=1說明i不是素數

int prime_permutation[

100000];

//陣列prime_permutation儲存得到的素數

//樸素篩法

int******_sieve

(int n)

}return1;

//n為質數

}

時間複雜度:o(nloglogn)。此法一般用於質數的區間篩選,即選出區間(2,n)中的質數。

由當前已經找到的素數,從後面的數中篩去當前素數的倍數。

#include

#include

#include

#include

int visit[

100000

],n,sum;

//visit[i]=1說明i不是素數

int prime_permutation[

100000];

//陣列prime_permutation儲存得到的素數

//埃氏篩法

interatosthenes_sieve

(int n)

//n為右界}}

return0;

}

某些合數會被多次篩除,從而導致運算重複。

例如對於合數6,(設右界n=7)

時間複雜度:o(n)。此法一般用於質數的區間篩選,即選出區間(2,n)中的質數。

#include

#include

#include

#include

int visit[

100000

],n,sum;

//visit[i]=1說明i不是素數

int prime_permutation[

100000];

//陣列prime_permutation儲存得到的素數

//尤拉篩法

inteuler_sieve

(int n)

//n為右界

for(j=

0;j(i*prime_permutation[j]

<=n)

;j++)}

}return0;

}

尤拉篩法是在埃氏篩法的基礎上進行了優化。它的核心思想是保證每個合數僅被它最小的質因子篩除一次。這裡的質因子是指儲存在陣列prime_permutation中的質數。

著重注意下面這段**中的注釋:

for

(j=0

;j(i*prime_permutation[j]

<=n)

;j++

)}

尤拉篩法的難點就在於如何理解if(i%prime_permutation[j]==0)這條判斷語句的作用。

#include

#include

#include

#include

int visit[

100000

],n,sum;

//visit[i]=1說明i不是素數

int prime_permutation[

100000];

//陣列prime_permutation儲存得到的素數

//樸素篩法

int******_sieve

(int n)

}return1;

}//埃氏篩法

interatosthenes_sieve

(int n)

//n為右界}}

return0;

}//尤拉篩法

inteuler_sieve

(int n)

//n為右界

for(j=

0;j(i*prime_permutation[j]

<=n)

;j++)}

}return0;

}int

main()

memset

(prime_permutation,0,

sizeof

(prime_permutation));

printf

("\n");

//使用尤拉篩法篩選素數並輸出結果

euler_sieve

(n);

for(i=

0;i)return0;

}

素數篩法(素數篩 線性篩)

求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...

篩法求素數 線性篩法求素數

2021年更新版 篩法求素數 線性篩法求素數 要理解篩法求素數首先要知道乙個定理,整數唯一分解定理 任意大於等於2的正整數都有且只有一種方式寫出其質因子的乘積表示式。a p1p2p3p4 pn pi是素數且pi pj eg 2 2 4 22 12 223 36 2233 也就是說任意乙個合數都能分成...

Eratosthenes篩法(素數篩)

最一般的素數篩思想很簡單,對於不超過maxx的每個非負整數p,刪除2p,3p,4p,然後剩下的就是素數,複雜度o nlogn 因為對內層迴圈n 2 n 3 n n 小於 1 1 2 1 3 1 n ln n 1 其中 為尤拉常數 0.577218 應當注意,1不是素數哦 這樣已經不慢,但由於所有非素...