• 欧拉函数


    欧拉函数
    在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。例如φ(8)=4,因为1,3,5,7均和8互质。
    简介
      φ函数的值
      φ(1)=1(唯一和1互质的数就是1本身)。
      若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。p的倍数的个数p^k/p=p^(k-1)
      欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)。
    特殊性质:当n为奇数时,φ(2n)=φ(n), 证明于上述类似。
    欧拉函数的编程实现
      利用欧拉函数和它本身不同质因数的关系,用筛法计算出某个范围内所有数的欧拉函数值。
    欧拉函数和它本身不同质因数的关系:欧拉函数ψ(N)=N{∏p|N}(1-1/p)。(p是数N的质因数)
    如:
      ψ(10)=10×(1-1/2)×(1-1/5)=4;
      ψ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8;
      ψ(49)=49×(1-1/7)=42。

    下面这个程序是计算≤x的所有数的欧拉函数(phi)

    这里写代码片
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    
    using namespace std;
    
    const int N=1000010;
    bool p[N];
    int sshu[N];
    int x,phi[N];
    
    void EE()  //埃氏筛法 
    {
        memset(p,1,sizeof(p));
        int i,j;
        for (i=2;i*i<=N;i++)
           for (j=2;i*j<=N;j++)
               p[i*j]=0;
        for (i=2;i<=N;i++)
            if (p[i])
                sshu[0]++,sshu[sshu[0]]=i;
        return;
    }
    
    void doit()
    {
        int i,j;
        for (i=1;i<=x;i++) phi[i]=i;
        for (i=1;sshu[i]<=x&&sshu[i];i++)  //最大数是x
        {
            for (j=sshu[i];j<=x;j+=sshu[i])
                phi[j]=phi[j]/sshu[i]*(sshu[i]-1);  
                //拥有sshu[i]这个质因子的数都要*(1-1/sshu[i]) 
        }    //此处注意先/再*,否则范围较大时会溢出
        for (i=1;i<=x;i++)
            printf("phi(%d) : %d
    ",i,phi[i]);
        return;
    }
    
    int main()
    {
        scanf("%d",&x);
        EE();
        doit();
        return 0;
    }
  • 相关阅读:
    servlet学习之servletAPI编程常用的接口和类
    问题解决
    HTTP Status 500 – Internal Server Error
    用数组模拟队列
    稀疏数组
    值传递机制及几道网红题目
    关于Tomcat配置问题
    Servlet学习笔记
    面向对象笔记
    数组中涉及的常见算法
  • 原文地址:https://www.cnblogs.com/wutongtong3117/p/7673629.html
Copyright © 2020-2023  润新知