数论——欧拉函数

数论——欧拉函数定义小于n的正整数中与n互质的数的数目(φ(1)=1)通式证明:设p是N的质因子,1~N中p的倍数有p,2p,3p,…,(N/p)*p,共N/p个。同理,若q也是N的质因子,则1~N中q的倍

大家好,又见面了,我是你们的朋友全栈君。

定义

小于n的正整数中与n互质的数的数目(φ(1)=1)

通式

<span role="heading" aria-level="2">数论——欧拉函数

证明:

  设p是N的质因子,1~N中p的倍数有p,2p,3p,…,(N/p)*p,共N/p个。

  同理,若q也是N的质因子,则1~N中q的倍数有N/q个。

  根据容斥原理,1~N中除去q的倍数与p的倍数后,数的个数为N – N/p – N/q + N/(pq) = N(1 – 1/p)(1 – 1/q)。

  而要求1~N中与N互质的数的个数,只需将N的所有质因子的倍数全部除去即可。

  利用容斥原理,因式分解后即可得到上式。

性质

(以下只列举我们需要用到的一些性质)

我们用phi(N)表示欧拉函数。

  • 当N为质数时,显然phi(N)=N-1。
  • 2.根据算数基本定理,N=p1C1*p2C2*…*pkCk 。设N的最小质因子为p,当p的指数为1时,phi(N)=(p-1)*phi(N/p)。
  • 3. 当p的指数不为1时,同2可证得phi(N)=p*phi(N/p)。

2的证明:

  根据欧拉函数通式,

  phi(N)=N*(p1-1)/p1*(p2-1)/p2*…*(pk-1)/pk,

  phi(N/p1)=N/p1*(p2-1)/p2*…*(pk-1)/pk,

  其中p1即为N的最小质因子,比较两式即可得证。

直接法

模板题链接:欧拉函数

代码实现:

int Euler(int x)
{
    int res=x;for(int i=2;i<=x/i;i++)
    {
        if(x%i==0)
        {
            res=res/i*(i-1);
            while(x%i==0)x/=i;
        }
    }
    if(x>1)res=res/x*(x-1);

    return res;
}

线性筛法

根据前面的欧拉线性筛质数的算法(可参考本人博客:数论——质数筛法),由于它在筛选的同时也求出了每个数的最小质因子,故而在其基础上求出欧拉函数即可。

模板题链接:筛法求欧拉函数

代码如下:

typedef long long ll;
const int N = 1000010;

int n;
int prime[N],cnt,v[N];
int phi[N];

ll Euler_prime(int n)
{
    phi[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!v[i])
        {
            prime[++cnt]=i;
            phi[i]=i-1;
        }
        for(int j=1;prime[j]<=n/i;j++)
        {
            int p=prime[j];
            v[p*i]=1;
            if(i%prime[j]==0)
            {
                phi[i*p]=p*phi[i];
                break;
            }
            phi[i*p]=(p-1)*phi[i];
        }
    }
    ll res=0;
    for(int i=1;i<=n;i++)res+=phi[i];
    return res;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155353.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hashmap和hashtable的区别,说法错误的是_javamap的用法

    hashmap和hashtable的区别,说法错误的是_javamap的用法HashMap和Hashtable的区别一、HashMap简介HashMap是在JDK1.2中引入的Map的实现类。1.HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。2.HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurren…

    2022年9月18日
    5
  • Java NIO详解[通俗易懂]

    Java NIO详解[通俗易懂]JAVANIO简介NIO与IO的对比

    2022年7月8日
    18
  • 使用PyCharm开发树莓派

    使用PyCharm开发树莓派目录安装并激活 PyCharm 通过 ssh 连接到树莓派 前提 树莓派具备联网功能 即可通过 SSH 连接到树莓派 为了便于开发 如果不是直接使用网线 推荐让树莓派去连接其他热点 比如手机热点 宿舍路由器等 这样是为了能让树莓派上网 方便后期一些包的安装 当连接手机热点时 需要知道树莓派被分配的 ip 查询方式可以看文章 如何查看连接到手机热点的树莓派 IP 地址 注意 PyCharm 社区版没有连接 ssh 的功能 确认 Windows 电脑和树莓派在同一个网络里 在你的 Windows 电脑上安装 PyC

    2025年10月22日
    5
  • 深入浅出Nginx

    深入浅出Nginx

    2022年2月15日
    76
  • linux发起iscsi_iscsi自动连接

    linux发起iscsi_iscsi自动连接1、存储介质1)磁盘阵列:磁盘阵列是一种采用RAID技术、冗余技术和在线维护技术制造的一种高性能、高可用的磁盘存储设备。2)IP-SAN存储:SAN(StorageAreaNetwork-存储区域网络):是计算机信息处理技术中的一种架构,它将服务器和远程的计算机存储设备(如磁盘阵列、磁带库)连接起来,使得这些存储设备看起来就像是本地一样。SAN就理解成存储虚拟化,而IP-SAN就是采

    2022年8月23日
    8
  • maven学习笔记—–jar查找groupid、artifactid

    maven学习笔记—–jar查找groupid、artifactid在 pom xml 文件中加入我们需要 jar 包的依赖 往往不知道是哪个目录下的 也就是 groupid 是什么 解决方法如下 http mvnrepositor com 登录该网站 输入你想引入的 jar 包 然后根据结果集点击进去 举例比如说 hibernate commons annotations 点击进去看到页面最上面一行如下所示 home org hibernate hiber

    2025年7月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号