欧拉函数
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)。
以上是关于欧拉函数的主要内容,如果未能解决你的问题,请参考以下文章