1、欧拉函数
1∼N 中与 N 互质的数的个数被称为欧拉函数,记为
ϕ
(
N
)
\phi(N)
ϕ(N)。
若在算数基本定理中,N=
p
1
k
1
p
2
k
2
p
3
k
3
.
.
.
p
n
k
n
p_1^{k1}p_2^{k2}p_3^{k3}...p_n^{kn}
p1k1p2k2p3k3...pnkn,则有
ϕ ( N ) = N ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) . . . ( 1 − 1 p n ) \phi(N) = N(1-\frac{1}{p_1})(1-\frac{1}{p_2}) ...(1-\frac{1}{p_n}) ϕ(N)=N(1−p11)(1−p21)...(1−pn1)
这个公式可以这样推导:
一到N中,一共有N个数字。其中,
p
1
p_1
p1的倍数,一共有
N
p
1
\frac{N}{p_1}
p1N个,同理
p
2
p_2
p2的倍数有
N
p
2
\frac{N}{p_2}
p2N个,后面同理。这些个数字一定都不是质数,所以要把他们减去。但是还有些数既是
p
1
p_1
p1和
p
2
p_2
p2等类似两个质因数的倍数,这些数字都在前面减了两次,需要把多减的一次加上。但是还有是三个质因数倍数的数字,一开始被减掉了3次,后来又被加上了3次,所以还是要再减掉1次…于是我们得到了下面的式子
ϕ
(
N
)
=
N
−
N
p
1
−
N
p
2
−
.
.
.
−
N
p
n
+
N
p
1
p
2
+
N
p
1
p
3
+
.
.
.
N
p
n
−
1
p
n
−
N
p
1
p
2
p
3
−
N
p
1
p
3
p
4
−
.
.
−
N
p
n
−
2
p
n
−
1
p
n
.
.
.
\phi(N) = N - \frac{N}{p_1} - \frac{N}{p_2} - ... - \frac{N}{p_n}+\frac{N}{p_1p_2}+\frac{N}{p_1p_3} +...\frac{N}{p_{n-1}p_{n}}-\frac{N}{p_1p_2p_3}-\frac{N}{p_1p_3p_4} - ..-\frac{N}{p_{n-2}p_{n-1}p_{n}}...
ϕ(N)=N−p1N−p2N−...−pnN+p1p2N+p1p3N+...pn−1pnN−p1p2p3N−p1p3p4N−..−pn−2pn−1pnN...
整理后就可以得到上面的式子
int n,res;
//分解质因数,并套用公式
for(int i = 2; i <= n / i; i ++)
{
if(n % i == 0)
{
res = res / i * (i - 1);
while(n % i == 0)
{
n /= i;
}
}
if(n > 1) res = res / n * (n - 1);
}
2、筛法求欧拉函数
这种方法是用来解决求1-N中每个数的欧拉函数。过程中利用了质数的线性筛法
ps:利用线性筛法可以同时求出不少东西
这里我们先给出代码,再来解释合理性
for(int i = 2; i <= n; i ++)
{
if(!st[i]) {
p[cnt ++] = i;
phi[i] = i - 1;
}
for(int j = 0; p[j] <= n / i; j ++)
{
st[p[j] * i] = true;
if(i % p[j] == 0) {
phi[i * p[j]] = p[j] * phi[i];
break;
}
phi[i * p[j]] = (p[j]- 1) * phi[i];
}
}
phi[i]用来记录i的欧拉函数值,p用来记录所有的质数,st用来表示哪些数还未筛掉。
这里phi[i]的记录分成了三类
- i为质数的时候
因为质数与所有除了1和其自身的数字之外互质,所以应该是i-1 - 当i % p[j] == 0的时候
此时i * p[j]的所有质因数与i的所有质因数相同,也就是
phi[i * p[j]] = i * p[j] * ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) . . . ( 1 − 1 p n ) (1-\frac{1}{p_1})(1-\frac{1}{p_2}) ...(1-\frac{1}{p_n}) (1−p11)(1−p21)...(1−pn1)=p[j] * ϕ ( i ) \phi(i) ϕ(i) = p[j] * phi[i] - 当i%p[j] != 0的时候
此时i*p[j]与i的质因数不相同,i*p[j]还多一个p[j],有下面的式子
phi[i * p[j]] = i * p[j] * ( 1 − 1 p 1 ) . . . ( 1 − 1 p j ) . . . ( 1 − 1 p n ) = p [ j ] ∗ ( 1 − 1 p j ) ϕ ( i ) = ( p [ j ] − 1 ) ∗ p h i [ i ] (1-\frac{1}{p_1})...(1-\frac{1}{p_j}) ...(1-\frac{1}{p_n})=p[j] *(1-\frac{1}{p_j}) \phi(i) = (p[j] -1)* phi[i] (1−p11)...(1−pj1)...(1−pn1)=p[j]∗(1−pj1)ϕ(i)=(p[j]−1)∗phi[i]