欧拉函数

欧拉函数

欧拉函数(Euler's totient function),即 φ(n)\varphi(n) ,表示的是小于等于 nnnn 互质的数的个数。

比如说 φ(1)=1\varphi(1) = 1

nn 是质数的时候,显然有 φ(n)=n1\varphi(n) = n - 1

利用唯一分解定理,我们可以把一个整数唯一地分解为质数幂次的乘积。

n=i=1npikin = \prod_{i=1}^{n}p_i^{k_i} ,其中 pip_i 是质数,那么 φ(n)=n×i=1spi1pi\varphi(n) = n \times \prod_{i = 1}^s{\dfrac{p_i - 1}{p_i}}

欧拉定理

gcd(a,m)=1\gcd(a, m) = 1 ,则 aφ(m)1(modm)a^{\varphi(m)} \equiv 1 \pmod{m}

费马小定理

pp 为素数, gcd(a,p)=1\gcd(a, p) = 1 ,则 ap11(modp)a^{p - 1} \equiv 1 \pmod{p}

威尔逊定理

(p1)!1(modp)(p-1)!\equiv-1\pmod{p}

pp 为质数,则 pp 可整除 (p1)!+1(p-1)!+1

筛法求欧拉函数

void phi_table()
{
    for (int i = 1; i < maxn; i++) {
        phi[i] = i;
    }
    for (int i = 2; i < maxn; i++) {
        if (phi[i] == i) {
            for (int j = i; j < maxn; j += i) {
                phi[j] = phi[j] / i * (i - 1);
            }
        }
    }
}

Pollard Rho 算法求欧拉函数

ll get_phi(int n)
{
    ll res = 1;
    for (int i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) {
            n /= i;
            res *= i - 1;
            while (n % i == 0) {
                n /= i;
                res *= i;
            }
        }
    }
    if (n > 1) {
        res *= n - 1;
    }
    return res;
}

最后更新于

这有帮助吗?