整数的素数幂分解
算数基本定理
一个整数可以唯一的表示成素数的乘积。
如何求一个整数的素数幂分解
对一个整数的素数幂分解,是用试除法依次判断所有小于的素数是否是它的因子,如果是,则记录这个素数及对应的幂次;并且将该素因子除干净,并且更新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( * )的复杂度下计算整数的欧拉函数。