整数的素数幂分解
算数基本定理
一个整数可以唯一的表示成素数的乘积。
如何求一个整数的素数幂分解
对一个整数的素数幂分解,是用试除法依次判断所有小于 n \sqrt n n的素数是否是它的因子,如果是,则记录这个素数及对应的幂次;并且将该素因子除干净,并且更新n。
- 找到一个小于等于 n \sqrt n n的素因子。(若找不到且n>1,则n是素数)。
- 记录该素因子 p i p_i pi及对应的幂次 a i a_i ai
- 更新n:
n = n p i a i n = \frac{n}{p_i^{a_i}} n=piain
代码
/*
算数基本定理: 一个整数可以唯一的表示成素数的乘积
整数的素数幂格式可以称为唯一分解式
*/
#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 ) \phi(n) ϕ(n)。指的是小于n且与n互素的正整数个数。素数p的欧拉函数 ϕ ( p ) = p − 1 \phi(p)=p-1 ϕ(p)=p−1
若已知n的素因子,共m个,则 ϕ ( n ) \phi(n) ϕ(n)可以通过公式计算:
ϕ ( n ) = n ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) . . . ( 1 − 1 p m ) \phi(n) = n(1-{1\over p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_m}) ϕ(n)=n(1−p1