前置知识
互质:互质是公约数只有1的两个整数,叫做互质整数。
欧拉函数定义
1∼N−1中与N互质的数的个数被称为欧拉函数,记为ϕ(N)。
若在算数基本定理中,N=pa11pa22…pamm,则:
ϕ(N)=N⋅p1−1p1⋅p2−1p2⋅…⋅pm−1pm
欧拉函数推导
首先我们要知道1,2,3…N−1,N与N互质的个数是1∼N数列去除N的质因子的倍数。
例如N=10,即1,2,3,4,5,6,7,8,9,10去除N的质因子的倍数,则1,
2,3,4,5,6,7,8,9,10.显然,1,3,7,9与10互质。
由上方结论使用容斥原理进行数学推导如下:
∵
①.从1~n中去掉p_1,p_2,…,p_k的所有倍数的个数,即
n←n-\frac{n}{p_1}-\frac{n}{p_2}-…-\frac{n}{p_k}
②.由容斥原理,p_i \cdot p_j的倍数被①减了两次,所以加上所有p_i\cdot p_j的倍数的个数(其中p_i,p_j是p_1∼p_k的组合),即
n←n+\frac{n}{p_1\cdot p_2}+\frac{n}{p_1\cdot p_3}+…+\frac{n}{p_{k-1}\cdot p_k}
③.减去所有p_i\cdot p_j \cdot p_k的倍数个数,即
n←n-\frac{n}{p_1\cdot p_2\cdot p_3}-\frac{n}{p_1\cdot p_2 \cdot p_4}-…-\frac{n}{p_{k-2}\cdot p_{k-1}\cdot p_k}
④.同理,加上所有p_i\cdot p_j \cdot p_k \cdot p_l的倍数个数,即
n←n+\frac{n}{p_1\cdot p_2\cdot p_3\cdot p_4}+\frac{n}{p_1\cdot p_2 \cdot p_3\cdot p_5}+…+\frac{n}{p_{k-3}\cdot p_{k-2}\cdot p_{k-1}\cdot {p_k}}
\textbf{⋮}
因此,
\phi(n)=n-\frac{n}{p_1}-\frac{n}{p_2}-…-\frac{n}{p_k}\\ +\frac{n}{p_1\cdot p_2}+\frac{n}{p_1\cdot p_3}+…+\frac{n}{p_{k-1}\cdot p_k}\\ -\frac{n}{p_1\cdot p_2\cdot p_3}-\frac{n}{p_1\cdot p_2 \cdot p_4}-…-\frac{n}{p_{k-2}\cdot p_{k-1}\cdot p_k}\\ +\frac{n}{p_1\cdot p_2\cdot p_3\cdot p_4}+\frac{n}{p_1\cdot p_2 \cdot p_3\cdot p_5}+…+\frac{n}{p_{k-3}\cdot p_{k-2}\cdot p_{k-1}\cdot {p_k}}\\ -…
也就是n减去奇数个质因子的倍数个数,加上偶数个质因子的倍数个数,循环往复。将上式等价变形,得到
\phi(n)=n\cdot(1-\frac{1}{p_1})\cdot(1-\frac{1}{p_2})…\cdot(1-\frac{1}{p_k})
证必。
int phi(int x)
{
int res = x;
for (int i = 2; i <= x / i; i ++ )
if (x % i == 0)
{
res = res / i * (i - 1);
while (x % i == 0) x /= i;
}
if (x > 1) res = res / x * (x - 1);
return res;
}