zoukankan      html  css  js  c++  java
  • 欧拉函数 + 线性求法

    欧拉函数:

    在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。此函数以其首名研究者欧拉命名(Euler'so totient function),它又称为Euler's totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。

    求法:

    ①基本公式:φ(n)=n×Π(p|n且p为质数)(1-1/p)

    证明: 对于因子p,n以内所有p的倍数的数有n/p个。

    利用容斥,有因子p1,p2时,n以内互质的数的个数是:n-n/p1-n/p2+n/(p1×p2)=n(1-1/p1-1/p2+1/(p1×p2)=n(1-1/p1)(1-1/p2)

    以此类推可以推出公式。 利用质因数分解可以n^1/2求出来

    ②性质:

    1.若a为质数,φ[a]=a-1;

    证明显然

    2.若a为质数,a mod b=0,φ[a×b]=φ[b]×a

    证明: 因为所有a的因子都是b的因子,所以在φ[b]基础上乘a即可。(考虑公式)

    3.若a,b互质,φ[a×b]=φ[a]×φ[b] (当a为质数时,if b mod !=0 ,φ[a×b]=φ[a]×φ[b])

    证明:a的质因子和b的质因子没有相同的,而ab的质因子必然在a、b中出现过,所以直接相乘就可以,(考虑公式)

    线性求euler

    int m[n],phi[n],p[n],nump;
    //m[i]标记i是否为素数,0为素数,1不为素数;p是存放素数的数组;nump是当前素数个数;phi[i]为欧拉函数
    int make()
    {
            phi[1]=1;
        for (int i=2;i<=n;i++)
        {
            if (!m[i])//i为素数
            {
                p[++nump]=i;//将i加入素数数组p中
                phi[i]=i-1;//因为i是素数,由特性得知    
            }    
            for (int j=1;j<=nump&&p[j]*i<n;j++)  //用当前已的到的素数数组p筛,筛去p[j]*i
            {
                m[p[j]*i]=1;//可以确定i*p[j]不是素数 
                if (i%p[j]==0) //看p[j]是否是i的约数,因为素数p[j],等于判断i和p[j]是否互质 
                {
                    phi[p[j]*i]=phi[i]*p[j]; //性质2
                    break;
                }
                else phi[p[j]*i]=phi[i]*(p[j]-1); //互质,性质3,其中p[j]-1就是phi[p[j]]   
            }
        }
    }
  • 相关阅读:
    java 基础(Collections 工具类的常用方法)
    Java 基础( Map 实现类: Properties)
    Java 基础(Map)
    Java 基础(集合三)
    Java 基础(集合二)
    Java 基础(集合一)
    Java 基础(Annotation)
    CentOS7 系统 springboot应用启动脚本
    GenericObjectPool源码分析
    问题springboot项目启动报错
  • 原文地址:https://www.cnblogs.com/Miracevin/p/9031706.html
Copyright © 2011-2022 走看看