C 實現質因數分解

2021-06-26 19:24:25 字數 2080 閱讀 4801

質數(prime number)又稱素數,有無限個。乙個大於1的

自然數,除了1和它本身外,不能被其他自然數

整除(除0以外)的數稱之為素數(質數);否則稱為

合數。根據

算術基本定理

,每乙個比1大的整數,要麼本身是乙個質數,要麼可以寫成一系列質數的乘積;而且如果不考慮這些質數在乘積中的順序,那麼寫出來的形式是唯一的。最小的質數是2。

質因數(或質因子

)在數論

裡是指能整除給定正整數的

質數。兩個沒有共同質因子的正整數稱為互質

。因為1沒有質因子,1

與任何正整數(包括1本身)都是互質

。正整數的因數分解

可將正整數表示為一連串的質因子相乘,質因子如重複可以指數

表示。根據算術基本定理

,任何正整數皆有獨一無二的質因子分解式。

只有乙個質因子的正整數為質數。綜上所述質因數分解是唯一的。

質因數分解的經典演算法是:

pollard rho因數分解(prime decomposition)

2023年,john m. pollard提出了第二種因數分解的方法,pollard rho快速因數分解。該演算法時間複雜度為o(n^(1/4))。

分解質因數**:

將乙個正整數分解質因數。例如:輸入90,列印出90=2*3*3*5。

程式分析:對n進行分解質因數,應先找到乙個最小的質數k,然後按下述步驟完成: 

(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。

(2)如果n<>k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新的正整數你n,

重複執行第一步。

(3)如果n不能被k整除,則用k+1作為k的值,重複執行第一步。

另外在編寫程式的時候還要用到的乙個定理是:

判斷乙個自然數是否是質數,只用看從2到根號n是否能整除n。也就是說,

乙個合數的最小正因子必小於根號n。

對於上面定理的簡單思考證明:

首先,約數是成對出現的。比如24,你找到個約數3,那麼一定有個約數8,因為24/3=8。

然後,這對約數必須乙個在根號n之前,乙個在根號n之後。因為都在根號n之前的話,

乘積一定小於n(根號nx根號n=n),同樣,都在根號n之後的話,乘積一定大於n。

所以,如果你在根號n之前都找不到約數的話,那麼根號n之後就不會有了。

如果n (n>=2)沒有小於等於根號n,大於1的約數,那麼n必然是質數。

假設n不是質數,並且不含有小於等於根號n的約數。

因為n是合數,那麼n必然可以寫成n=p*q,並且p和q大於1。根據假設,p和q都大於根號n。那麼p*q>n,矛盾

具體程式:

程式用到了cmath標頭檔案。

cmath是c++語言中的庫函式,其中的c表示函式是來自c標準庫的函式,math為數學常用庫函式

cmath庫函式列表:

c語言提供了以下的

數學函式,要使用這些函式時,在程式檔案頭必須加入:

#include

編譯時,必須加上引數「-lm」(表示鏈結至數學函式庫),例如「gcc -lm test.c」。

函式之自變數與傳回之值型別見自變數或函式前之型別宣告。

函式已經在「math.h」或其它標頭檔宣告過了,因此在使用時不必再加型別宣告,例如「y=sin(x);」,不用寫成「y=double sin(double x);」。

#include

#include

using namespace std;

void primedecomposition(int k)

else

break; }

}cout<} }

//另外一種寫法

/*void analyse(int n)  

上面的演算法效率並不高,還有改進的效率更好的演算法。 1:

如果追求速度的話,可以先列乙個質數表陣列,然後從小到大試,能少做很多嘗試。用查質數表的方法會快很多

關於問題的引申:如何判斷乙個數是不是素數

參考:

質因數分解

題目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...