欧拉函数

Posted nioh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧拉函数相关的知识,希望对你有一定的参考价值。

$phi(n)$即小于n且与n互素的整数个数。
由容斥定理可得公式:

$phi(n)=sum_{Ssubseteq {left { p_{1},p_{2},...,p_{k} ight }}}(-1)^{left | S ight |}frac{n}{prod_{p_{i}in S}p_{i}}$

可经过化简得:

$phi(n)=n(1-frac{1}{p_{1}})(1-frac{1}{p_{2}})cdots (1-frac{1}{p_{k}})$

单个求法:

int euler_phi(int n) {
    int m = (int)sqrt(n + 0.5);
    int ans = n;
    for(int i = 2; i <= m; i++) if(n % i == 0) {
        ans = ans / i * (i - 1);
        while(n % i == 0) n /= i; 
    }
    if(n > 1) ans = ans / n * (n - 1);
    return ans;
}

求1~n中所有数的欧拉函数值(类似素数筛法):

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

时间复杂度O(nloglogn)。

 

以上是关于欧拉函数的主要内容,如果未能解决你的问题,请参考以下文章

欧拉Euler函数

HDU 2588 GCD(欧拉函数)

蓝桥杯必备算法一:欧拉函数

数论之旅4---欧拉函数的证明及代码实现(我会证明都是骗人的╮( ̄▽ ̄)╭)

欧拉函数性质与求法 [数论][欧拉函数]

欧拉筛欧拉函数