zoukankan      html  css  js  c++  java
  • 欧拉函数入门理解

    含义

    欧拉函数:phi(n)     1-n这个区间里面和n互质的个数有多少个

    公式

    先化解出最简质因子乘式

    n=p1^a1*p2*a2.....*px^ax

    那么就是公式就是

    phi(n)=n*((p1-1)/p1)*((p2-1)/p2)....((px-1)/px)=n*(1-1/p1)*(1-1/p2).....(1-1/px)

    解析

    首先我们为什么是这个公式呢,首先要求互质,那么就说明化成最简公式后,两个数之间没有相同的质因子

    那么我们算下1-n中有多少个又p1这个因子,那么个数就是n/p1,算有多少个p2因子的数也是一样的道理

    但是我们要还要加上我们删两次的数,也就是包含p1*p2因子的数,所以我们公式也就是

    假设只有这两个质因子,那么

    phi(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所有的质因子即可

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #define maxn 200005
    #define mod 1000000007
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    ll n;
    ll phi(ll x){
        ll sum=x;
        for(int i=2;i<=sqrt(x);i++){
            if(x%i==0){
                sum=sum/i*(i-1);
                while(x%i==0) x/=i;//把i因子都除尽,因为每个质因子还有次方,我们要全部除掉
            }
        }
        if(x>1) sum=sum/x*(x-1);//最后这个质因子有可能超过sqrt,所以没有被除到
        return sum; 
    }
    int main(){
        while(cin>>n){
            cout<<phi(n)<<"
    ";
        }
    } 

    欧拉函数两条性质

    1,n>1时,1-n中与n互质的数的和为    n*phi(n)/2;

    解释:因为gcd(n,x) = gcd(n,n-x)   所以当gcd(n,x)=1 n和x互质时  那么说明  n和n-x肯定也互质   ,所以都是成对出现的 一对加起来就是n,这样一平均就是每个数的和为n/2

    2,phi(a*b) = phi(a)*phi(b)

    解释:因为化简成最简式子后是一样的 

  • 相关阅读:
    装饰器 转载自 http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
    no_merge hint
    优化实例- not use hash to avoid temp space issue
    明日计划
    优化实例- not in 和 not exists
    insert into varchar2(8000)
    图像的批处理
    图像数据类型及颜色空间转换
    图像的读取,显示与保存(基于skimage模块)
    图像直方图
  • 原文地址:https://www.cnblogs.com/Lis-/p/11004617.html
Copyright © 2011-2022 走看看