数论——欧拉函数

数论——欧拉函数定义小于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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Js保留两位小数_前端小数点保留两位方法

    Js保留两位小数_前端小数点保留两位方法js保留两位小数的方法js保留两位小数的方法如下1、toFixed()方法需注意,保留两位小数,将数值类型的数据改变成了字符串类型2、Math.floor(),不四舍五入,向下取整注意,不改变数据类型3、字符串匹配注意,先将数据转换为字符串,最后再转为数值类型4、四舍五入保留2位小数(若第二位小数为0,则保留一位小数)注意,数据类型不变5、四舍五入保留2位小数(不够位数,则用0替补)注意,数据类…

    2022年8月10日
    7
  • a b在java中的意思是什么意思_java中”a=”+a “b=”+b是什么意思?

    a b在java中的意思是什么意思_java中”a=”+a “b=”+b是什么意思?展开全部1、在JAVA程序中由String和“+”参与的运算变量都会被转为字符类型,可以理解为先把32313133353236313431303231363533e4b893e5b19e31333335313237变量转为字符型然后在进行字符拼接。publicclassTest{publicstaticvoidmain(String[]args){intintnum=9;lon…

    2022年7月8日
    33
  • js数组对象转字符串方法_数组表示

    js数组对象转字符串方法_数组表示Js数组转对象(特殊格式)arr:[{},{},{}]转化为obj:{ {},{},{}}利用ES6语法:letobj={…arr};

    2022年9月10日
    0
  • apache负载均衡配置_apache反向代理配置

    apache负载均衡配置_apache反向代理配置一般来说,负载均衡就是将客户端的请求分流给后端的各个真实服务器,达到负载均衡的目的。还有一种方式是用两台服务器,一台作为主服务器(Master),另一台作为热备份(HotStandby),请求全部分给主服务器,在主服务器当机时,立即切换到备份服务器,以提高系统的整体可第一次看到这个标题时我也很惊讶,Apache居然还能做负载均衡?真是太强大了。经过一番调查后发现的确可以,而且功能一点都不差。这都归功于mod_proxy这个模块。不愧是强大的Apache啊。废话少说,下面就来解释一下负载均衡的设置方..

    2022年9月8日
    0
  • BP神经网络预测实例(matlab代码,神经网络工具箱)

    BP神经网络预测实例(matlab代码,神经网络工具箱)目录辛烷值的预测matlab代码实现工具箱实现参考学习b站:数学建模学习交流bp神经网络预测matlab代码实现过程辛烷值的预测【改编】辛烷值是汽油最重要的品质指标,传统的实验室检测方法存在样品用量大,测试周期长和费用高等问题,不适用于生产控制,特别是在线测试。近年发展起来的近红外光谱分析方法(NIR),作为一种快速分析方法,已广泛应用于农业、制药、生物化工、石油产品等领域。其优越性是无损检测、低成本、无污染,能在线分析,更适合于生产和控制的需要。实验采集得到50组汽油样品(辛烷值已通过其他方法测

    2022年6月20日
    22
  • jira webhook发消息_jenkins webhook

    jira webhook发消息_jenkins webhookJIRAWebhookWebhook1处理webhook事件2变量替换3过滤器3.1JQL3.2Webhook事件类型3.2.1插件和系统事件3.2.2问题时间3.2.3版本事件3.2.4项目事件3.2.5用户事件3.2.6特征状态事件3.2.7备注事件3.2.8Confluencewebhook事件3.3例程请求3.4例程响应3.4.1Confluence…

    2025年7月13日
    0

发表回复

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

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