【数论专题】欧拉函数

一、概念

欧拉函数,是表示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)=(p1)pa1
    那么接下来给伪证:
    ∵p为素数
    p a p^a pa只含有因数p,并且有a个
    那么我们只需要把a个p去掉,那么它就是一个素数,根据性质1,可得(p-1),去掉p的倍数之后剩下的就是 p a − 1 p^{a-1} pa1,即 ( p − 1 ) ∗ p a − 1 (p-1)*p^{a-1} (p1)pa1

  • 如果i mod p=0,那么 φ ( i ∗ p ) = p ∗ φ ( i ) φ(i*p)=p*φ(i) φ(ip)=pφ(i)
    用唯一分解定理很好可以证明

  • 函数的积性, φ ( i ∗ j ) = φ ( i ) ∗ φ ( j ) φ(i*j)=φ(i)*φ(j) φ(ij)=φ(i)φ(j)

  • 如果i mod p≠0,那么 φ ( i ∗ p ) = φ ( i ) ∗ ( p − 1 ) φ(i*p)=φ(i)*(p-1) φ(ip)=φ(i)(p1)
    口胡证明:i mod p 不为0且p为质数,所以i与p互质,那么根据积极性可以得知 φ ( i ∗ p ) = φ ( i ) ∗ φ ( p ) φ(i*p)=φ(i)*φ(p) φ(ip)=φ(i)φ(p),其中 φ ( p ) = p − 1 φ(p)=p-1 φ(p)=p1,所以满足

三、求法

知道些性质之后,我们是可以来推到次函数的求法了呢?
我们先将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=a1b1a2b2a3b3akbk

因为φ(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)=na1na2na3nakn
将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(1a11)(1a21)(1a31)(1ak1)

于是欧拉函数的公式就这么推导出来了

代码实现

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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值