整数的素数幂分解

算数基本定理

一个整数可以唯一的表示成素数的乘积。

如何求一个整数的素数幂分解

对一个整数的素数幂分解,是用试除法依次判断所有小于n\sqrt n的素数是否是它的因子,如果是,则记录这个素数及对应的幂次;并且将该素因子除干净,并且更新n。

  1. 找到一个小于等于n\sqrt n的素因子。(若找不到且n>1,则n是素数)。
  2. 记录该素因子pi及对应的幂次ai
  3. 更新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)\phi(n)。指的是小于n且与n互素的整数个数。
若已知n的素因子,则ϕ(n)\phi(n)可以通过公式计算:
ϕ(n)=n(11p1)(11p2)...(11pk) \phi(n) = n(1-{1\over p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_k})
因此结合上面素数幂分解方法,可以在O(n\sqrt n * log2n\log_2 n)的复杂度下计算整数的欧拉函数。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章