欧拉函数(转)

来源:互联网 发布:java html 转 xhtml 编辑:程序博客网 时间:2024/06/06 05:43
相关题目: http://acm.hdu.edu.cn/showproblem.php?pid=2824 pku 2478(与前n个数互质的个数的求和) http://acm.hdu.edu.cn/showproblem.php?pid=3508 素因子的积 http://acm.hdu.edu.cn/showproblem.php?pid=2710 题目很简单,就是输出N个数素数因子最大的那一个 http://acm.hdu.edu.cn/showproblem.php?pid=3307 (欧拉 + 推导公式 + gcd) http://acm.hdu.edu.cn/showproblem.php?pid=1299 (求因子个数)  http://acm.pku.edu.cn/JudgeOnline/problem?id=2480 欧拉求所有因子的和 http://acm.pku.edu.cn/JudgeOnline/problem?id=2407 很水的欧拉  http://acm.hdu.edu.cn/showproblem.php?pid=1787 典型 欧拉函数http://acm.hdu.edu.cn/showproblem.php?pid=3501 欧拉函数求小于N且与N不互质的正整数之和在数论中,欧拉定理(也称费马-欧拉定理)是一个关于同余的性质。欧拉定理表明,若n,a为正整数,且n,a互素,(a,n) = 1,则 a^φ(n) ≡ 1 (mod n)推论:对于互质的数a、n,满足a^(φ(n)+1) ≡ a (mod n)费马定理:   a是不能被质数p整除的正整数,则有a^(p-1) ≡ 1 (mod p)  证明这个定理非常简单,由于φ(p) = p-1,代入欧拉定理即可证明。  同样有推论:对于不能被质数p整除的正整数a,有a^p ≡ a (mod p)若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。  欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)。  特殊性质:当n为奇数时,φ(2n)=φ(n), 证明于上述类似。欧拉性质:phi(n) >= sqrt(n / 2) n > 0n > 6  phi(n) >= sqrt(n)n 为合数  phi(n) <= n - sqrt(n)推论一:欧拉函数ψ(N)的值为偶数。推论二:对于任意素数p有ψ(p)=p-1推论三:设N为质数P的平方,即N=P×P,则ψ(N)=(P-1)×P。推论四:设N为质数p的n次方(n≥2)则ψ(N)=N×(1-1/p)推论五:设N为两个不同质数p,q之积,N=p ×q,则ψ(N)=(p-1)×(q-1)。推论六:对一切正整数n,有φ(p^n)=[p^(n-1)]*(p-1)欧拉函数的定义:E(k)=([1,n-1]中与n互质的整数个数). 因为任意正整数都可以唯一表示成如下形式:                     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)     ps:在程序中利用欧拉函数如下性质,可以快速求出欧拉函数的值(a为N的质因素)若(N%a==0 && (N/a)%a==0) 则有:E(N)=E(N/a)*a;若(N%a==0 && (N/a)%a!=0) 则有:E(N)=E(N/a)*(a-1);跟据上面的公式,可以得到关于欧拉函数的递推关系:假设素数p能整除n,那么如果p还能整除n / p, PHI(n) = PHI(n / p) * p;如果p不能整除n / p, PHI(n) = PHI(n / p) * (p - 1);得数学结论:一个整数的所有因子数等于其每个素因子的个数加一之后的乘积(1+p1)(1+p2)…(1+pn)因子和: 若 k=p1^a1*p2^a2...*pi^ai   F(k) = (p1^0+...+p1^a1)*(p2^0+...+p2^a2)*...*(pi^0 + ... + pi^ai)  ,其中p1、p2、...、pn分别为该整数的所有n个素因子P1、P2、...Pn的相应个数。思想:得到一个整数所有素因子。由素因子的组合构造其所有的因子。一个整数的素因子还有一个特点,就是超过其平方根值的素因子最多只有一个结合率((a+b) mod p + c)mod p = (a + (b+c) mod p) mod p((a*b) mod p * c)mod p = (a * (b*c) mod p) mod p交换率(a + b) mod p = (b+a) mod p (a × b) mod p = (b × a) mod p分配率((a +b)mod p × c) mod p = ((a × c) mod p + (b × c) mod p) mod p定理(消去律):如果gcd(c,p) = 1 ,则 ac ≡ bc mod p 可以推出 a ≡ b mod p(拉格朗日四平方和定理)每个自然数均可表示成4个平方数之和。3个平方数之和不能表示形式如4k(8n+ 7)的数。 如果在一个正整数的因数分解式中,没有一个数有形式如4k+3的质数次方,该正整数可以表示成两个平方数之和。char mark[10000] = {0}; int prime[1230];int size = 0;int phi[10000];int main () {    int i, j;    /*筛法求素数*/    for (i = 2; i < 10000; i++) {        if (!mark[i]) prime[size++] = i;        for (j = 0; j < size && prime[j] * i < 10000; j++) {            mark[prime[j] * i] = 1;            if (i % prime[j] == 0) break;        }    }    /*求欧拉函数*/    phi[1] = 1;    for (i = 2; i < 10000; i++) {        if (!mark[i]) {            phi[i] = i - 1;            continue;        }        for (j = 0; j < size && prime[j] * prime[j] <= i; j++) {            if (i % prime[j] == 0) {                if (i / prime[j] % prime[j] == 0)                    phi[i] = prime[j] * phi[i / prime[j]];                else                    phi[i] = (prime[j] - 1) * phi[i / prime[j]];                break;            }        }    }    return 0;}从别人那里学到的对求欧拉函数部分的优化,使每个数的欧拉函数只由它的最小素因子求出:    phi[1] = 1;    for (i = 1; i < 10000; i++) {        for (j = 0; j < size && prime[j] * i <= 10000; j++) {            if (i % prime[j] == 0) {                phi[prime[j] * i] = prime[j] * phi[i];                break;            }            else {                phi[prime[j] * i] = phi[i] * (prime[j] - 1);            }        }    }在实际代码过程可以和搜索质数的"筛子法"相结合, 因为"筛子法"相当于优先找到了每个数的最小质因子.const int size = 1000001;int factor[size];    //factor[n]记录了n的最小质因子bool visited[size];   int phy[size];       //phy[n]记录了与n互质且小于n的个数. void getPrime(){        memset(factor, -1, sizeof(factor));        memset(visited, false, sizeof(visited));        for (int i=2; i<size; i++)        {                if (visited[i])                {//这部分是递归关系的实现                        int k = i/factor[i];                        if (k%factor[i] == 0)                        {                                phy[i] = phy[k]*factor[i];                        }else{                                phy[i] = phy[k]*(factor[i] - 1);                        }                        continue;                }                phy[i] = i -1; //i本身是质数, 与i互质的个数为i-1.                for (int j=i+i; j<size; j+=i)                {                        visited[j] = true;                        if (factor[j] == -1)                        {                                factor[j] = i; //用i筛的过程, 就找到了每个以i为最小质因子的数.                        }                }        }结合率((a+b) mod p + c)mod p = (a + (b+c) mod p) mod p((a*b) mod p * c)mod p = (a * (b*c) mod p) mod p交换率(a + b) mod p = (b+a) mod p (a × b) mod p = (b × a) mod p分配率((a +b)mod p × c) mod p = ((a × c) mod p + (b × c) mod p) mod p定理(消去律):如果gcd(c,p) = 1 ,则 ac ≡ bc mod p 可以推出 a ≡ b mod p(拉格朗日四平方和定理)  每个自然数均可表示成4个平方数之和。3个平方数之和不能表示形式如4k(8n+ 7)的数。 如果在一个正整数的因数分解式中,没有一个数有形式如4k+3的质数次方,该正整数可以表示成两个平方数之和。http://hi.baidu.com/xiehuixb/blog/item/a14cfd3967df1ffbb211c7dc.htmlhttp://menjitianya2007.blog.163.com/blog/#m=0&t=1&c=fks_095074086095082075083085074064093083080066082080095http://hi.baidu.com/xiehuixb/blog