欧拉函数证明与代码实现

欧拉函数

  • 定义
    对于正整数n小于等于n的数中与n互质的数的个数记为φ(n),即为欧拉函数
  • 欧拉公式
    由算数基本定理任意一个正整数都可以写作n=p1a1p2a2pkak
    那么φ(n)=ni=1k(11pi)
  • 数学证明
    首先φ(n)是一个积性函数
    φ(a1a2)=φ(a1)φ(a2)这个的证明这里不作叙述可看这个链接积性证明
    然后从1到一个数pnan一共有pnan个数其中与其不互质的有pn,2pn,3pnpnan(pnan1pn)一共有pnan1个数,所以与其互质的一共有pnan(11pn)
    所以有:

φ(n)=φ(p1a1)φ(p2a2)φ(pkak)=p1a1(11p1)p2a2(11p2)pkak=ni=1k(11pi)

  • 代码实现
#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int a;
        scanf("%d",&a);
        int res=a;
        for(int i=2;i<=a/i;i++)
        {
            if(a%i==0)
            {
                res=res/i*(i-1);//注意先除再乘防止爆int
            }
            while(a%i==0)
            {
                a/=i;
            }
        }
        if(a>1)
        {
            res=res/a*(a-1);
        }
        printf("%d\n",res);
    }
    
    
    return 0;
}
  • 代码细节
    注意res=res/i*(i-1)这里要先除再乘防止爆int 可能会有疑问我们推导的公式中11pi是一个小数但是c++里/是向下取整的,那么这里会不会有问题呢?其实是完全没问题的 我们可以看到只有当a%i==0时我们才会进行res的操作并且每次循环中a至少都和res除i除的一样多也就是说只要a中有约数 i 那么res中也一定有 i 一定不会出现小数。

Written with StackEdit中文版.

posted @   Taco_gu  阅读(169)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示