整數的素數冪分解

算數基本定理

一個整數可以唯一的表示成素數的乘積。

如何求一個整數的素數冪分解

對一個整數的素數冪分解,是用試除法依次判斷所有小於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)的複雜度下計算整數的歐拉函數。

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