欧拉函数(转载)
来源:互联网 发布:shake it动作数据 编辑:程序博客网 时间:2024/05/29 15:01
欧拉函数的定义:
在数论中,对于正整数N,少于或等于N ([1,N]),且与N互质的正整数(包括1)的个数,记作φ(n)。
φ函数的值:
φ(x)=x(1-1/p(1))(1-1/p(2))(1-1/p(3))(1-1/p(4))…..(1-1/p(n))
φ(1)=1(唯一和1互质的数,且小于等于1)。注意:每种质因数只有一个。
例如:
φ(10)=10×(1-1/2)×(1-1/5)=4;
1 3 7 9
φ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8;
φ(49)=49×(1-1/7)=42;
欧拉函数的性质:
(1) p^k型欧拉函数:
若N是质数p(即N=p), φ(n)= φ(p)=p-p^(k-1)=p-1。
若N是质数p的k次幂(即N=p^k),φ(n)=p^k-p^(k-1)=(p-1)p^(k-1)。
(2)mn型欧拉函数
设n为正整数,以φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值。若m,n互质,φ(mn)=(m-1)(n-1)=φ(m)φ(n)。
(3)特殊性质:
若n为奇数时,φ(2n)=φ(n)。
对于任何两个互质 的正整数a,n(n>2)有:a^φ(n)=1 mod n (恒等于)此公式即 欧拉定理
当n=p 且 a与素数p互质(即:gcd(a,p)=1)则上式有: a^(p-1)=1 mod n (恒等于)此公式即 费马小定理
欧拉函数相关的证明:
(1) p^k型的欧拉函数的证明:
对于给定的一个素数p: φ(p)=p-1 那么容易证明φ(n)=p^k-p^(k-1)
已知少于或等于p^k的正整数的个数为p^k-1,其中和p^k不互质的正整数有{ p×1,p×2,…,p×(p^(k-1)-1)},共计p^(k-1)-1个
故: φ(n) = p^k-1-(p^(k-1)-1)=p^k-p^(k-1)。
(2) mn型的欧拉函数的证明:
因为:x=mn m与n互质(即:gcd(m,n)=1);根据中国剩余定理Z(x)和Z(m)×Z(n)之间存在一一映射,所以x的完全余数集(见下面参考)中的元素的个数Z(x)等于Z(m)×Z(n)元素的个数;而Z(m)×Z(n)= φ(m)φ(n)
故有: φ(mn) =φ(m)φ(n) 成立。
(3)任意正整数的欧拉函数的相关证明:
任意一个整数n都可以表示为其质因子的乘积:
n=(p(1)*k(1)) *(p(2)*k(2)) *(p(3)*k(3))…(p(i)*k(i))*…*(p(I)*k(I)) 其中I为n 的质因子的个数。
根据(1)(2)的结论,很容易得出它的欧拉函数为:
φ(n)=n(1-1/p(1))(1-1/p(2))(1-1/p(3))(1-1/p(4))…..(1-1/p(i)) 其中I为n 的质因子的个数。
对于任意n>2,2|φ(n) 必定存在 p(i)-1是偶数
欧拉定理的相关证明:
(1) 令Z(n)={ X(1),X(2),…,X(φ(n)) } S={ a*X(1) mod n, a*X(2) mod n ,…,a*X(φ(n)) mod n },则 Z(n)=S。
1)因为a与n互质(即:gcd(a,n)=1), X(i)(1≤i≤φ(n))与n互质(即:gcd(X(i),n)=1);所以
a*X(i)与n互质(即:gcd(a*X(i),n)=1),故 a*X(i) mod n ∈ Z(n)。
2)若i≠j,那么 X(i)≠X(j) ,又有a与n互质(即:gcd(a,n)==1),则可得出: a*(X(i)) mod n ≠a*X(j) mod n (消去定律)。
(2) a^(φ(n))*X(1)*X(2)*X(3)*…*X(φ(n)) mod n
=(a*X(1))*(a*X(2))*(a*X(3))*…*(a*X(φ(n))) mod n
=(a*X(1) mod n)*(a*X(2) mod n)*(a*X(3) mod n)*…*(a*X(φ(n)) mod n) mod n
=X(1)*X(2)*X(3)*…*X(φ(n)) mod n。
对比等式左右两端,因为X(i)(1≤i≤φ(n))与n互质(即:gcd(X(i),n)==1) ,
故: a^φ(n)=1 mod n (恒等于)成立。
费马小定理的相关证明:
若正整数 a与素数p互质,则有a^(p-1)=1 mod n(恒等于)
由于φ(p)=p-1 且 a^φ(n)=1 mod n ,又有此处的p==n;
故:a^(p-1)=1 mod n成立。
此定理可以用来简化幂的模运算:
例如: 计算 7^222的个位数,实际上是求7^222被10除的余数。
且7与10互质,φ(10)=1,由欧拉定理知7^4= 1mod 10
故7^222=(7^4)^55*(7^2)=>(1^55)*(7^2)=>49=>9 mod 10
欧拉函数的延伸:
于或等于n的数中,与n互质的数的总和为:φ(x) * x / 2 (n>1)。
相关知识参考:
完全余数集合:
定义小于 n 且和 n 互质的数构成的集合为 Z(n) ,称呼这个集合为 n 的完全余数集合。 显然 |Z(n)| =φ(n) 。
同余定理:
如果 a mod b = c 则有(a+kb) mod b =c(k为非0整数) 如果 a mod b = c 则有(ka) mod b =kc (k为正整数) (a+b) mod c =((a mod c)+(b mod c )) mod c; (a*b) mod c=((a mod c)*(b mod c)) mod c
欧拉函数模板
(1)直接求小于或等于n,且与n互质的个数:
int Euler(int n){ int ret=n; for(int i=2; i<=sqrt(n); i++) if(n%i==0) { ret=ret/i*(i-1);//先进行除法防止溢出(ret=ret*(1-1/p(i))) while(n%i==0) n/=i; } if(n>1) ret=ret/n*(n-1); return ret;}
筛选模板:求[1,n]之间每个数的质因数的个数
#define size 1000001int euler[size];void Init(){ memset(euler,0,sizeof(euler)); euler[1]=1; for(int i=2; i<size; i++) if(!euler[i]) for(int j=i; j<size; j+=i) { if(!euler[j]) euler[j]=j; euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出 }}
代码:
/*#include<stdio.h>#include<math.h>int main(){ int N,ans; while(~scanf("%d",&N)){ ans=N; for(int i=2;i<=sqrt(N);i++) if(N%i==0){ ans=ans/i*(i-1); while(N%i==0)N/=i; } if(N>1)ans=ans/N*(N-1); printf("%d\n",ans); } return 0;}*/#include<stdio.h>#include<string.h>const int MAXN=1000010;int dp[MAXN];int main(){ memset(dp,0,sizeof(dp)); dp[1]=1; for(int i=2; i<MAXN; i++) { if(dp[i])continue; for(int j=i; j<MAXN; j+=i) { if(!dp[j])dp[j]=j; dp[j]=dp[j]/i*(i-1); } } int N; while(~scanf("%d",&N))printf("%d\n",dp[N]); return 0;}
博客转载自:handsomecui
- 欧拉函数(转载)
- The Euler function(欧拉函数筛选)(转载)
- 51nod - 1136 欧拉函数(欧拉函数)
- 51nod 1136 欧拉函数(欧拉函数)
- 欧拉函数(模板)
- 欧拉函数(转)
- 欧拉函数(一)
- 欧拉函数(二)
- 欧拉函数(数学)
- hdu4556(欧拉函数)
- 欧拉函数(模板)
- 欧拉函数(模板)
- LghtOJ1370(欧拉函数)
- poj2407Relatives(欧拉函数)
- sdoi2008(欧拉函数)
- (模板)欧拉函数
- hdu1787(欧拉函数)
- hdu2588(欧拉函数)
- oozie_mail
- Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
- 构造函数析构函数抛出异常
- 【Caffe】源码解析----caffe.proto (转载)
- zunionstore异常:CROSSSLOT Keys in request don't hash to the same slot
- 欧拉函数(转载)
- 封装Ajax
- uva 340
- 英语音节
- java.lang.Cloneable 实现深clone和浅clone
- Spring事务为什么不会自动回滚?Spring事务怎样才会自动回滚?事务自动回滚条件及手动回滚
- 《leetcode》longest-consecutive-sequence
- 循环的嵌套
- git 406