一:在我们学习欧拉函数之前我们先来了解两个相关的概念,大家在学习数论的时候可能也知道
1:同余类
模的同余类指的是模 m余数相同的整数构成的集合(其实就是同余)
2:完系
在模m的m个A0,A1,A2,....... Am-1同余类中,每一类Ai中取一个数ai,则a0,a1,a2--
....叫做模m的一个完全剩余系(简称完系)。显然,完系中的m个数分别属于m个不同的剩余类
二:知道了上面两个之后 接下来就是欧拉函数的基本概念
在数论,对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明。
.
三:欧拉函数的基本性质
1:当p是素数时,φ§=p-1。
2:欧拉函数是积性函数,但不是完全积性函数。
当且只当n可以分解成两个互质的整数之积,n = p1 × p2,则φ(n) = φ(p1p2) = φ(p1)φ(p2)
特别的,对于两个素数p,q, φ(pq)=(p-1)(q-1)。(RSA算法应用)
3当n>2时,φ(n)都是偶数,也即φ(n)≡0(mod2)。
简单证明,因为若n是质数p的k次幂,φ(n)=pk-pk-1=(p-1)pk-1
当p为2时,pk-1必为偶数;
当p>2时,(p-1)必为偶数。
四、欧拉函数的计算方法
1:素数分解法:(对于不了解素数分解法不了解的话,可以看一下这篇文章 素数分解法)
前置知识:对于一个正整数N的素数幂分解N=P1q1P2q2…Pnqn,其中,Pi为素数(1≤i≤n)。
我们可以有基本性质中的第二条性质可以得到:
φ(N)=φ(P1q1P2q2…Pnqn)=φ(P1q)φ(P2q2)…φ(Pnqn)(pn为底数,qn为指数)
有了这个方程我们就可以写出实现算法的代码了
const int N =100000+10 ,cnt; // N 数的大小 , cnt 素数的个数
int primes[N] ; //存储所有素数
int euler[N] ; //存储每个数的欧拉函数
bool st[N] ; //st[x] 存储x是否被筛掉
void get_eulers(int n ){
euler[1] = 1 ;
for(int i =2 ;i<=n ;i++){
if(!st[i]){
primes[cnt++] = i ;
euler[i] = i-1 ;
}
for(int j = 0 ;prime[j]<=n/i;j++){
int t= primes[j]*i ;
st[t] = true ;
if(i%primes[j]==0){
euler[t] = euler[i]*primes[j];
break ;
}
euler[t] = euler[i]*(primes[j]-1);
}
}
}
二:编程思维
欧拉函数的定义
φ(N)=N∗∏(1−1/p)=(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)……(1-1/pn)(P是数N的质因数)
然后这里就直接模拟一遍就可以了
//求欧拉函数
int phi(int x){
int res= x ;
for(int i =2 ;i<=x/i ;i++){
if(x%i==0){
res = res/ i *(i-1);
while(x%i==0){
x/= i ;
}
}
}
if(x>1){
res = res / x *(x-1);
}
return res ;
}
五:欧拉定理证明
证明我这里就不给出了,可以去网上自己找一找相关的证明,去理解