欧拉函数的推导过程(简单向)

一:引入:

给定任意正整数X,求小于或等于X的正整数中,与X互质的数的个数,而求这些个数的方法即为欧拉函数。设φ(n)为欧拉函数,则其公式为:

φ(n)=n(1−1/X1)(1−1/X2)…(1−1/Xn)

n可以用若干个质数的幂相乘表示,而X则为质数

二:证明:

 (1)当n为1时:

φ(1)=1;

(2)当n为质数时:

φ(n)=n-1  因为质数与小于其的数均互质,因此为n-1;

(3)当n为质数时:

φ(pk)=pk−pk-1   原因:因为p为质数,只有当某个数不包括p时,才可能与其互质,由于包含p的数有(1*p,2*p,3*p,........,pk-1*p)即pk-1个数,所以将它们减掉,剩下的就是和pk互质的数

(4)当n可以用质数表示时:

一:当n可以用若干个质数相乘时,例:φ(n)=φ(p1*p2)=φ(p1)*φ(p2)

二:因为任意一个数都可以用若干个质数的幂相乘表示,即n=p1x1*p2x2.....

此时,φ(n)=φ(p1x1)*φ(p2x2),因为p为质数,所以φ(px)=px-px-1,由此可得:

φ(n)=p1x1*(1-1/p1)*p2x2*(1-1/p2)因为p1x1*p2x2=n,所以φ(n)=n*(1-1/p1)*(1-1/p2).

由此衍生出总公式:φ(n)=n(1−1/X1)(1−1/X2)…(1−1/Xn)

三:代码实现:

相信只要能看懂我的鬼画符式的解释应该就可以敲出来了,我先抛砖引玉:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int x;
    cin>>x;
    while(x--)
    {
        int n;
        cin>>n;
        int res=n;
        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);
        cout<<res<<endl;
    }
}

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值