目錄位址
算術基本定理可以表述為:對任意大於 \(1\) 的自然數,若不為質數,則一定能且只能寫成一種有限個質數乘積的形式
或者可以表述為:對 \(\forall n\in n\) 且 \(n>1\) ,對所有的 \(m\) 個小於等於 \(n\) 質數 \(p_\) ,\(\displaystyle n=\prod_^mp_i^,p_i\in prime,c_i\in n\) 存在且唯一存在
我們用歸納法證明:考慮合數 \(n\) ,假設 \(n\) 以內的數要麼都是質數,要麼所有合數都符合上述定理
當 \(n\) 為最小的合數 \(4\) 時,\(n=2\times 2=2^2\) 符合上述定理
其它情況下,因為 \(n\) 為合數,所以一定存在 \(a,b\in n\) 且 \(1使得 \(n=a\times b\)
設一共有 \(m\) 個小於等於 \(n\) 的質數 \(p_\)
由於 \(a因此 \(a\) 符合上述定理
故 \(a\) 可唯一地寫作 \(\displaystyle a=\prod_^p_i^,p_i\in prime,c_i\in n\)
\(\because a
\(\therefore m_a\leq m\)
\(\therefore a\) 可唯一地寫作 \(\displaystyle a=\prod_^p_i^\cdot\prod_^mp_i^0,p_i\in prime,c_i\in n\)
我們令 \(d_i=\begin
ca_i,0
故 \(a\) 可唯一地寫作 \(\displaystyle a=\prod_^mp_i^,p_i\in prime,d_i\in n\)
同理,我們可以將 \(b\) 唯一地寫作 \(\displaystyle b=\prod_^mp_i^,p_i\in prime,e_i\in n\)
因此 \(n\) 可唯一地寫作 \(\displaystyle n=a\times b=\prod_^mp_i^\cdot\prod_^mp_i^=\prod_^mp_i^,p_i\in prime,d_i\in n,e_i\in n\)
令 \(c_i=d_i+e_i\) 因此,證得上述結論
綜上,算術基本定理得證
由算數基本定理,我們得到,乙個大於 \(1\) 的自然數,一定能分解為若干個質數的乘積
下面我們來具體考慮如何劃分:
首先,定理的成立表明:對 \(n\) 以內的 \(m\) 個質數 \(p_\) ,保證 \(n=\prod_^mp_i^,p_i\in prime,c_i\in n\) 這一等式中的 \(c_i\) 都是唯一確定的
因此,將 \(n\) 劃分為質數,即求出 \(c_\)
首先,十分顯然:我們可以花費 \(o(n)\) 的時間篩出 \(n\) 以內的質數,然後乙個乙個去實驗
int prime[maxn],cntprime=0,c[maxn]=;
sieve_prime(int n)
...sieve_prime(n);
int copy=n;
for(int i=1;i<=cntprime;i++)
}
\(n\) 以內的質數個數大概 \(\) 個,每個質因數被除的記憶體迴圈,複雜度為 \(o(\log n)\)
因此,分解的複雜度為 \(o(n)\) ,加上前面篩素數,總複雜度 \(o(n)\)
通過細心觀察可以發現:對於大於等於 \(\sqrt n\) 的質因數,一定不會存在超過乙個
若存在兩個大於等於 \(\sqrt n\) 的質因數,設它們分別為 \(p_a,p_b,p_a\leq p_b\)
單這兩個質因數的乘積 \(p_a\times p_b\leq \sqrt n\times \sqrt n=n\) 就注定了不可能同時是 \(n\) 的因數
因此大於等於 \(\sqrt n\) 的質因數,一定不會存在超過乙個
所以我們只需要花費 \(o(\sqrt n)\) 將 \(\sqrt n\) 以內的質數篩出來,然後重複上述操作
最後得到的如果是 \(1\) ,則代表沒有大於 \(\sqrt n\) 的質因數;否則,剩下的本身就是質因數
int prime[maxn],cntprime=0,c[maxn]=;
sieve_prime(int n)
...sieve_prime( (int)sqrt(n) );//或者在函式裡面改為 i*i<=n
int copy=n;
for(int i=1;i<=cntprime;i++)
}if(copy!=1)
因為 \(\sqrt n\) 以內的質數個數大概 \(}=\),每個質數的複雜度為 \(o(\log n)\)
因此分解的複雜度為 \(o(\sqrt n)\) ,加上篩質數的複雜度
總複雜度 \(o(\sqrt n)\)
質因數分解
題目16 將乙個正整數分解質因數。例如 輸入90,列印出90 2 3 3 5。程式分析 對n進行分解質因數,應先找到乙個最小的質數k,然後按下述步驟完 成 1 如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。2 如果n k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新...
質因數分解
短除法 求乙個數分解質因數,要從最小的質數除起,一直除到結果為質數為止。分解質因數的算式的叫短除法 和除法的性質差不多,還可以用來求多個個數的公因式 求 最大公因數的一種方法,也可用來求 最小公倍數。求幾個數最大公因數 的方法,開始時用觀察比較的方法,即 先把每個數的因數找出來,然後再找出公因數,最...
質因數分解
講乙個數分解為幾個質數相乘的結果 int a maxn 用來存質因數 int b maxn 用來存質因數的個數 int main if n 1 不能忘記這一步操作 輸出 第1種寫法 a a a b b b b c c printf 第一種寫法 for int i 1 i tot i else pri...