給出乙個自然數表(1,2,…,n),要求盡可能快的找出其中的質數,應該怎麼做?
有兩種思路:一種是遍歷,乙個個找質數,一種是去掉所有的合數.那麼選擇哪一種呢?
不管怎樣,先來看看如何判定質數或者合數.
質數和合數的判定
質數和合數的定義在這不多講.為判斷是質數還是合數,最經典的方案就是遍歷小於該數的所有整數(除了1),如果出現整除,那就不是.
就像這樣:
while(i=2;i但這樣需要掃瞄n-1次,對於大數而言要花相當多的時間,顯然不是優解.那麼在這裡引入乙個定理:
t he
orem
:∀x∈
z且x是
合數∃1
≤a≤x
使得a∣
x\\ \forall x\in\mathbb且\ x是合數\\ \exists 1\le a\leq \sqrt \\使得 a|x
theore
m:∀x
∈z且x
是合數∃
1≤a≤
x使得
a∣x對該定理用反證法證明:
p ro
of:f
or合數
x,∃整
數對(a
,b),
ab˙=
x.(a
!=0a
ndb!
=0)i
fa
nd
b
ab
˙
原假設不
成立.q
.e.d
\\ for 合數x,\\ \exists 整數對(a,b),a\dot b=x.(a!=0 and b!=0)\\ if a< \sqrt\ and\ b< \sqrt\\ \rightarrow a\dot b < x\\ \therefore 原假設不成立.\\ q.e.d
proof:
for合
數x,∃
整數對(
a,b)
,ab˙
=x.(
a!=0
andb
!=0)
ifaandb
→ab˙
原假設不
成立.q
.e.d
所以現在提出第乙個改進:
只用掃瞄到x
\sqrt
x即可判斷是否為質數.
篩法結合上一部分,下面提出乙個在自然數表中找出質數表的乙個改進方法:
在x
\sqrt
x範圍內找出質數;
清除這些質數的整數倍;
完成.
清 除所
有質數的
整數倍⟺
清除所有
合數
清除所有質數的整數倍\iff 清除所有合數
清除所有質數
的整數倍
⟺清除所
有合數二者是等價的嗎?
下面是解釋:
自然的,是乙個整數的整數倍的數一定是合數.所以若清除了所有的合數必然清除所有質數的整數倍.由此必要性得證.
下面是充分性:
先引入乙個定理:
t he
orem
:∀x∈
n+x=
∏i=1
nai,
ai∈n
+且ai
是質
數\\ \forall x \in\mathbb\\ x=\prod_^\ a_i,\\ a_i\in\mathbb且a_i是質數
theore
m:∀x
∈n+x
=i=1
∏na
i,a
i∈n
+且ai
是質數
下面是證明:
p ro
of:對
於質數a
,可分解
為1a˙
,成立.
對於合數
b,一定
可以分解
為∏i=
1nmi
,mi∈
n+對於
mi,若
為質數,
則分解停
止.若為
合數,則
按照上一
條,可以
分解為∏
i=1n
mi′,
mi′∈
n+以上
過程均成
立直到m
ik均為
質數
.對於質數a,可分解為1\dot a,成立.\\ 對於合數b,一定可以分解為\\ \prod_^\ m_i,m_i\in\mathbb\\ 對於m_i,若為質數,則分解停止.\\若為合數,則按照上一條,可以分解為 \prod_^\ m'_i,m'_i\in\mathbb\\ 以上過程均成立直到m^_i均為質數.
proof:
對於質數
a,可分
解為1a
˙,成立
.對於合
數b,一
定可以分
解為i=
1∏n
mi,
mi∈
n+對於
mi,
若為質數
,則分解
停止.若
為合數,
則按照上
一條,可
以分解為
i=1∏
nmi
′,m
i′∈
n+以上
過程均成
立直到m
ik均
為質數.
於是∀ais
合數∃m
is質數
m∣
a\forall a\ is\ 合數\\ \exists m\ is\ 質數\\ m|a\\
∀ais合數
∃mis
質數m∣
a充分性得證.
那麼:按照這個方法進行質數的篩選,有:
for(a=1;a<=sqrt(x);a++)
} else
}
就是這樣了. 質數中的質數(質數篩法)
如果乙個質數,在質數列表中的編號也是質數,那麼就稱之為質數中的質數。例如 3 5分別是排第2和第3的質數,所以他們是質數中的質數。現在給出乙個數n,求 n的最小的質數中的質數是多少 可以考慮用質數篩法來做 input 輸入乙個數n n 10 6 output 輸出 n的最小的質數中的質數。input...
普通質數篩法
二 埃氏篩 三.尤拉篩法 4.質數距離 從暴力的直接迴圈開始,一步步對演算法進行優化,一步步簡化時間複雜度,並盡可能討論各種篩法的優劣,以及其中每一步的意義。思路直接,容易被像我們這樣的新手第一時間想到,乙個質數,除了1和它本身以外不再有其他因數,那麼想知道乙個數是不是質數,乾脆直接去看看它有幾個因...
質數線性篩法 O n
埃氏篩法o nloglogn 仍會重複標記合數 such as i 2時 12 2 6,先會被 2 標記已是合數 i 3時 12 3 4,又被標記了一次 我們在生成乙個需要標記的合數時,每次只向現有的數中乘上乙個質因子,並且讓它是所生成合數的最小質因子 code include include us...