Processing math: 100%

seekworser's Library

This documentation is automatically generated by online-judge-tools/verification-helper


Project maintained by seekworser Hosted on GitHub Pages — Theme by mattgraham

:warning: euler_phi.hpp
(competitive/math/euler_phi.hpp)

euler_phi

オイラーのトーシェント関数(n以下のnと互いに疎な自然数の個数)を計算する。 計算量O(N)

inv

素数でないmodに対する逆元を計算する。 xmodは互いに素である必要がある。

euler_phi_table

n以下の整数について、トーシェント関数を列挙する。 計算量O(nloglogn)

参考: https://manabitimes.jp/math/667

Depends on

Required by

Code

#pragma once
#include "competitive/std/std.hpp"
ll euler_phi(ll n) {
    ll ret = n;
    for(ll i = 2; i * i <= n; i++) {
        if(n % i == 0) {
            ret -= ret / i;
            while(n % i == 0) n /= i;
        }
    }
    if(n > 1) ret -= ret / n;
    return ret;
}
ll inv(ll x, ll mod) {
    return powm(x, euler_phi(mod)-1, mod);
}
vector<ll> euler_phi_table(ll n) {
    vector<ll> euler(n + 1);
    rep(i, n+1) {
        euler[i] = i;
    }
    rep(i, 2, n+1) {
        if(euler[i] == i) {
            rep(j, i, n+1, i) {
                euler[j] /= i;
                euler[j] *= (i - 1);
            }
        }
    }
    return euler;
}
/**
 * @brief euler_phi.hpp
 * @docs docs/math/euler_phi.md
 */
Back to top page