• 欧拉函数


    什么是欧拉函数

    欧拉函数是小于x的整数中与x互质的数的个数,特殊的 φ(1) = 1.

    如何计算欧拉函数

    其中p1,p2,.....pn为x的所有质因数,x是正整数。

    欧拉函数的几个性质

    1、对于质数p φ(p)=p-1.

    2、若p为质数,n = pk,则 φ(n) = pk - pk-1

    3、欧拉函数是积性函数,但不是完全积性函数(不互质也满足等式)。若m,n互质,则φ(m*n)=φ(m)*φ(n).

    4、当n>2时,φ(n)* n / 2 (n > 1).

    5、小于n且与n互质的数的总和为:φ(n)* n / 2 (n > 1).

    6.n =  dn φ(d),即n的因数(包括1和它自己)的欧拉函数之和等于n

     

    求欧拉函数

     1、求单个欧拉函数

    int euler(int n)
    {
        int ans = n ;
        for(int i = 2 ; i * i <= n ; i++)
        {
            if(n % i == 0)
            {
                ans -= ans / i ; // 跟据欧拉函数的通项公式展开一步一步算
                while(n % i == 0)//确保i为n的质因数
                {
                    n /= i ;
                }
            }
        }
        if(n > 1) ans -= ans/n ;//最后可能还剩下一个质因数没有除,例如10的欧拉函数
        return ans ;
    }
    

    2、埃拉托斯特尼筛求欧拉函数

    void euler(int n)//求1-n的欧拉函数
    {
        for(int i = 2 ; i <= n ; i++) phi[i] = i ;
        for(int i = 2 ; i*i <= n ; i++)
        {
            if(phi[i] == i) // 表示i为质数
            {
                for(int j = i ; j <= n ; j += i)
                {
                    phi[j] = phi[j] / i * (i-1) ;//将i的倍数更新
                }
            }
        }
    }
    

       欧拉筛求欧拉函数

    void euler(int n)//求1-n的欧拉函数
    {
        memset(vis , true , sizeof(vis));
        int cnt = 0 ;
        for(int i = 2 ; i <= n ; i++)
        {
            if(vis[i])
            {
                prime[cnt++] = i ;
                phi[i] = i - 1 ;
            }
            for(int j = 0 ; j < cnt && prime[j] * i <= n ; j++)
            {
                vis[i*prime[j]] = 0 ;
                if(i % prime[j] == 0)//保证每一个数都被它最小质因数筛去
                {
                    phi[i*prime[j]] = phi[i] * prime[j] ;
                    break ;
                }
                else{
                    phi[i*prime[j]] = phi[i] * phi[prime[j]];//i与prime[j]互质可以根据欧拉函数的积性函数性质求
                }
            }
        }
    }
    

    参考博客https://blog.csdn.net/liuzibujian/article/details/81086324

  • 相关阅读:
    shell安装kettle
    shell安装jdk
    shell脚本之系统初始化设置(设置selinux、设置ulimit、设置firewalld、设置time_zone)
    关闭防火墙
    todo的使用
    Android Dagger2.0 学习一下
    Android零碎知识点
    windows7 服务中上找不到mysql
    AS 3.1 多library合并打包成aar的正确方式(fat-aar)
    Alexander的Python机器学习 之目录分析。
  • 原文地址:https://www.cnblogs.com/nonames/p/12168777.html
Copyright © 2020-2023  润新知