欧拉函数(转)
来源:互联网 发布: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