ホーム > libalgo

素因数分解

概要

正の整数を素因数分解する.最初に素数リストを作っておくと少し速くなる.素数表を使ったときの計算量は素数定理を参照.

計算量

素で $O(\sqrt n)$.素数表を用いると $O(\sqrt{n}/\log n)$ くらい.

使い方

$n$ を素因数分解し,素因数(first)とその指数(second)の vector のペアを返す.

実装

std::pair<std::vector<ll>, std::vector<ll>> prime_factor_decomp(ll n) {
    std::vector<ll> p, e;
    ll m = n;
    for (ll i = 2; i * i <= n; i++) {
        if (m % i != 0) continue;
        int c = 0;
        while (m % i == 0) c++, m /= i;
        p.push_back(i);
        e.push_back(c);
    }
    if (m > 1) {
        p.push_back(m);
        e.push_back(1);
    }
    return std::make_pair(p, e);
}

//@require eratosthenes.cc
std::pair<std::vector<ll>, std::vector<ll>> prime_factor_decomp_fast(ll n) {
    static const auto ps = make_primes(32000);  // sqrt(10^9)
    std::vector<ll> p, e;
    ll m = n;
    for (auto &i : ps) {
        if (i * i > n) break;
        if (m % i != 0) continue;
        int c = 0;
        while (m % i == 0) c++, m /= i;
        p.push_back(i);
        e.push_back(c);
    }
    if (m > 1) {
        p.push_back(m);
        e.push_back(1);
    }
    return std::make_pair(p, e);
}