整數的素數冪分解
算數基本定理
一個整數可以唯一的表示成素數的乘積。
如何求一個整數的素數冪分解
對一個整數的素數冪分解,是用試除法依次判斷所有小於的素數是否是它的因子,如果是,則記錄這個素數及對應的冪次;並且將該素因子除乾淨,並且更新n。
- 找到一個小於等於的素因子。(若找不到且n>1,則n是素數)。
- 記錄該素因子pi及對應的冪次ai
- 更新n = n / (piai)
代碼
/*
算數基本定理: 一個整數可以唯一的表示成素數的乘積
整數的素數冪格式可以稱爲唯一分解式
*/
#include <iostream>
#include <vector>
using namespace std;
struct node
{
int prime; // 素因子
int cnts; // 冪次
};
// 求整數的素數冪分解式
vector<node> solve(int n)
{
vector<node> res;
// 整數1, 特殊處理
if (n == 1) return res;
// 當cur_prime ^ 2 > n時, n是素數
// 否則, n可以分解成兩個數的乘積, 其中必有一個小於cur_prime
for (int cur_prime = 2; cur_prime * cur_prime <= n; cur_prime++)
{
// n % cur_prime == 0時, cur_prime不可能是合數
// 因爲n中組成cur_prime的素數都已經被消去了
if (n % cur_prime == 0)
{
int cnt = 0;
while (n % cur_prime == 0)
{
n /= cur_prime;
cnt++;
}
res.push_back({cur_prime, cnt});
}
}
if (n > 1) res.push_back({n, 1});
return res;
}
歐拉函數
歐拉函數,。指的是小於n且與n互素的整數個數。
若已知n的素因子,則可以通過公式計算:
因此結合上面素數冪分解方法,可以在O( * )的複雜度下計算整數的歐拉函數。