zoukankan      html  css  js  c++  java
  • 欧拉函数

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

    ---φ函数的值  通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数(小于等于1)就是1本身)。 (注意:每种质因数只一个。比如12=2*2*3那么φ(12)=12*(1-1/2)*(1-1/3)=4
     
    ---若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1)-1,因为除了p的倍数外,其他数都跟n互质。
    (证明:P^k有p*p*p....*p个p,共P^k个p)
    设n为正整数,以 φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值,这里函数φ:N→N,n→φ(n)称为欧拉函数。
     
    ----与N互质所有数的和:sum=n*φ(n)/2;//因为所有大于2的欧拉函数值都是偶数,所以/不会丢失数据
    ----欧拉函数的证明:
    --容斥原理:A∪B∪C = A+B+C - A∩B - B∩C - C∩A +A∩B∩C 证明链接:http://wenku.baidu.com/view/374f4f8fc1c708a1284a4484.html
    --因为任意正整数都可以唯一表示成如下形式:
                         k=p1^a1*p2^a2*……*pi^ai;(即分解质因数形式)
        可以推出:E(k)=(p1-1)(p2-1)……(pi-1)*(p1^(a1-1))(p2^(a2-1))……(pi^(ai-1))
                   =k*(p1-1)(p2-1)……(pi-1)/(p1*p2*……pi);
                   =k*(1-1/p1)*(1-1/p2)....(1-1/pk) //    (其中p1,p2,...pk互为质数。)
     
    欧拉函数模板:
     
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
        int T,temp,ans,n;
        cin>>T;
        while(T--)
        {
            cin>>n;
            temp=n;
            ans=n;
            for(int i=2; i*i<=n; i++)//寻找所有质因数
            {
                if(n%i==0)
                {
                    ans=ans/i*(i-1);
                    n/=i;
                    while(n%i==0)
                    {
                        n/=i;
                    }
                }
            }
            if(n!=1)
            {
                ans=ans/n*(n-1);
            }
            printf("%d
    ",temp==1?0:ans);
        }
        return 0;
    }

     ps:

    每个合数都可以写成几个质数(也可称为素数)相乘的形式,这几个质数就都叫做这个合数的质因数。如果一个质数是某个数的因数,那么就说这个质数是这个数的质因数。而这个因数一定是一个质数(1除外)。(用于数字分解)

    ------正整数的因数分解可将正整数表示为一连串的质因子相乘,质因子如重复可以指数表示。根据算术基本定理,任何正整数皆有独一无二的质因子分解式。只有一个质因子的正整数为质数

     例子:

    • 1没有质因子。
    • 5只有1个质因子,5本身。(5是质数。)
    • 6的质因子是2和3。(6 = 2 × 3)
    • 2、4、8、16等只有1个质因子:2(2是质数,4 = 2,8 = 2,如此类推。)
    • 10有2个质因子:2和5。(10 = 2 × 5)
    分解质因数的方法是先用一个合数的最小质因数去除这个合数,得出的数若是一个质数,就写成这个合数相乘形式;若是一个合数就继续按原来的方法,直至最后是一个质数 。
    分解质因数的有两种表示方法,除了大家最常用知道的“短除分解法”之外
    分解质因数对解决一些自然数乘积的问题有很大的帮助,同时又为求最大公约数最小公倍数做了重要的铺垫。
    Pollard Rho因数分解
    1975年,John M. Pollard提出了第二种因数分解的方法,Pollard Rho快速因数分解。该算法时间复杂度为O(n^(1/4))。

    计算方法

    短除法
    最大公因数的一种方法,也可用来求最小公倍数
    求几个数最大公因数的方法,开始时用观察比较的方法,即:先把每个数的因数找出来,然后再找出公因数,最后在公因数中找出最大公因数。
    例如:求12与18的最大公因数。
    12的因数有:1、2、3、4、6、12。
    18的因数有:1、2、3、6、9、18。
    12与18的公因数有:1、2、3、6。
    12与18的最大公因数是6。
    这种方法对求两个以上数的最大公因数,特别是数目较大的数,显然是不方便的。于是又采用了给每个数分别分解质因数的方法。
    12=2×2×3
    18=2×3×3
    12与18都可以分成几种形式不同的乘积,但分成质因数连乘积就只有以上一种,而且不能再分解了。所分出的质因数无疑都能整除原数,因此这些质因数也都是原数的约数。从分解的结果看,12与18都有公约数2和3,而它们的乘积2×3=6,就是 12与18的最大公约数。
    采用分解质因数的方法,也是采用短除的形式,只不过是分别短除,然后再找公约数和最大公约数。如果把这两个数合在一起短除,则更容易找出公约数和最大公约数。
    从短除中不难看出,12与18都有公约数2和3,它们的乘积2×3=6就是12与18的最大公约数。与前边分别分解质因数相比较,可以发现:不仅结果相同,而且短除法竖式左边就是这两个数的公共质因数,而两个数的最大公约数,就是这两个数的公共质因数的连乘积。
    实际应用中,是把需要计算的两个或多个数放置在一起,进行短除。
    在计算多个数的最小公倍数时,对其中任意两个数存在的约数都要算出,其它无此约数的数则原样落下。最后把所有约数和最终剩下无法约分的数连乘即得到最小公倍数。
    只含有1个质因数的数一定是亏数
  • 相关阅读:
    Python爬虫开源项目代码,爬取微信、淘宝、豆瓣、知乎、新浪微博、QQ、去哪网等 代码整理
    python ---split()函数讲解
    常见的操作系统及linux发展史
    第五次作业
    第四次软件工程作业
    软件工程——第三次作业
    软件工程--第二次作业
    软件工程--第一次作业
    在SQL Server中调用.NET程序集
    c#中使用ABCpdf处理PDF,so easy
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/4125572.html
Copyright © 2011-2022 走看看