一、概念
欧拉函数,是表示1~n中与n互质的元素的个数,记为 φ ( n ) φ(n) φ(n)。
二、性质
-
如果n为某一素数p,显然 φ ( p ) φ(p) φ(p)为p-1
-
如果n为某一素数的幂次,那么:
φ ( p a ) = ( p − 1 ) ∗ p a − 1 φ(p^a)=(p-1)*p^ {a-1} φ(pa)=(p−1)∗pa−1
那么接下来给伪证:
∵p为素数
∴ p a p^a pa只含有因数p,并且有a个
那么我们只需要把a个p去掉,那么它就是一个素数,根据性质1,可得(p-1),去掉p的倍数之后剩下的就是 p a − 1 p^{a-1} pa−1,即 ( p − 1 ) ∗ p a − 1 (p-1)*p^{a-1} (p−1)∗pa−1 -
如果i mod p=0,那么 φ ( i ∗ p ) = p ∗ φ ( i ) φ(i*p)=p*φ(i) φ(i∗p)=p∗φ(i)
用唯一分解定理很好可以证明 -
函数的积性, φ ( i ∗ j ) = φ ( i ) ∗ φ ( j ) φ(i*j)=φ(i)*φ(j) φ(i∗j)=φ(i)∗φ(j)
-
如果i mod p≠0,那么 φ ( i ∗ p ) = φ ( i ) ∗ ( p − 1 ) φ(i*p)=φ(i)*(p-1) φ(i∗p)=φ(i)∗(p−1)
口胡证明:i mod p 不为0且p为质数,所以i与p互质,那么根据积极性可以得知 φ ( i ∗ p ) = φ ( i ) ∗ φ ( p ) φ(i*p)=φ(i)*φ(p) φ(i∗p)=φ(i)∗φ(p),其中 φ ( p ) = p − 1 φ(p)=p-1 φ(p)=p−1,所以满足
三、求法
知道些性质之后,我们是可以来推到次函数的求法了呢?
我们先将n分解质因数得:
n
=
a
1
b
1
∗
a
2
b
2
∗
a
3
b
3
∗
…
…
∗
a
k
b
k
n=a1^{b1}*a2^{b2}*a3^{b3}*……*ak^{bk}
n=a1b1∗a2b2∗a3b3∗……∗akbk
因为φ(n)求的是与n互质的数的个数,所以其中不能有n的因数,即不能出现a1,a2,a3……ak的倍数。
那么我们来转换思路,n个数之中存在多少个a1的倍数,多少个a2的倍数……多少个ak的倍数呢?
显然有n/a1个a1的倍数,n/a2个a2的倍数……有n/ak个ak的倍数。
所以
φ
(
n
)
=
n
−
n
a
1
−
n
a
2
−
n
a
3
−
…
…
−
n
a
k
φ(n)=n-\frac{n}{a1} -\frac{n}{a2}-\frac{n}{a3}-……-\frac{n}{ak}
φ(n)=n−a1n−a2n−a3n−……−akn
将n提取出来得到:
φ
(
n
)
=
n
∗
(
1
−
1
a
1
)
∗
(
1
−
1
a
2
)
∗
(
1
−
1
a
3
)
∗
…
…
∗
(
1
−
1
a
k
)
φ(n)=n*(1-\frac{1}{a1})*(1-\frac{1}{a2})*(1-\frac{1}{a3})*……*(1-\frac{1}{ak})
φ(n)=n∗(1−a11)∗(1−a21)∗(1−a31)∗……∗(1−ak1)
于是欧拉函数的公式就这么推导出来了
代码实现
LL phi(LL x){
LL s=x,t=x;
for (LL i=2;i*i<=t;i++)
if (x%i==0){
s=s*(i-1)/i;
while (x%i==0) x/=i;
}
if (x>1) s=s*(x-1)/x;
return s;
}