数论专题-欧拉函数的求法

数论专题-欧拉函数求法

φ(m),即小于m的m个数中与m互质的数的个数
这次讲φ(m)=m*(1-1/p1)*(1-1/p2)……

前言

先点关注,不迷路
大家好,我是于斯为盛
先给大家道个歉,上次许诺要讲这个的,前一段有点忙,一直托到现在
这个证明稍微有点长
我们慢慢来
废话不多说
讲得不好勿喷~

证明

证明分几步走,大家不要着急

定理1

若m1,m2互素,x,y分别跑遍m1,m2的完全剩余系
则xm2+ym1跑遍m1m2的完全剩余系

证明

xi通过m1个整数
yi通过m2个整数
所以xim2+yim1通过m1m2个整数
我们只需证明这m1m2个整数对Mod m1m2两两不同余就可以
(因为m1m2的完全剩余系只有m1m2个整数)

任给x1 y1 x2 y2
xi跑遍m1的完全剩余系
yi跑遍m2的完全剩余系
假设x1m2+y1m1≡x2m2+y2m1 Mod m1m2
我们可得方程
x1m2+y1m1=x2m2+y2m1+km1m2(k不一定为正整数) 方程1

方程1 Mod m1
x1m2≡x2m2 Mod m1
由于(m1,m2)=1
可得x1≡x2 Mod m1
因为x1,x2跑遍m1的完全剩余系
所以x1=x2

方程1 Mod m2
y1m1≡y2m1 Mod m2
由于(m1,m2)=1
可得y1≡y2 Mod m2
因为y1,y2跑遍m2的完全剩余系
所以y1=y2

综上所述,方程1成立的条件是x1=x2且y1=y2
所以形如x1m2+x2m1的式子在Mod m1m2互不相等
证毕

证明完全剩余系是为了后续将简化剩余系写成这种形式

定理2

若m1,m2互素,x,y分别跑遍m1,m2的简化剩余系
则xm2+ym1跑遍m1m2的简化剩余系

证明

定理1可知
当x跑遍m1的完全剩余系
当y跑遍m2的完全剩余系
且(m1,m2)=1
xm2+ym1跑遍m1m1的完全剩余系
所以m1m2的简化剩余系可以写成xm2+ym1的形式

当(m1,m2)=1,(m1,x)=1时(即x跑遍m1的简化剩余系,y跑遍m2的简化剩余系)
所以(m2x,m1)=1
所以(m2x+m1y,m1)=1

同理可证(m2x+m1y,m2)=1
所以(m2x+m1y,m1m2)=1
即当x跑遍m1的简化剩余系,y跑遍m2的简化剩余系时
xm2+ym1包含在m1m2的简化剩余系中

当(m2x+m1y,m1m2)=1时
(m2x+m1y,m1)=1
(m2x,m1)=1
又有(m2,m1)=1
所以(x,m1)=1
同理可得(y,m2)=1
即当xm1+ym2跑遍m1m2的简化剩余系时
x包含在m1的简化剩余系,y包含在m2的简化剩余系

所以
x跑遍m1的简化剩余系,y跑遍m2的简化剩余系
等价于
xm1+ym2跑遍m1m2的简化剩余系
证毕

推论

x通过φ(m1)个数
y通过φ(m2)个数
所以xm1+ym2通过φ(m1)×φ(m2)个数

又因为xm1+ym2通过φ(m1m2)个数(m1m2的简化剩余系)
所以当(m1,m2)=1时
φ(m1)×φ(m2)=φ(m1m2

定理三

当p为素数时
φ(pe)=pe-pe-1

证明

小于等于pe的正整数一共pe个数
而m为素数,即(pe,i)=1时必有 p|i
而美m个数中就有一个时m的倍数
所以与pe有公因子的数有pe/p=pe-1
所以φ(p)=pe-pe-1
证毕

核心证明

设:m=p1e1×p2e2……(唯一分解定理,pi为素数)
定理2的推论可知
φ(m)=φ(p1e1×p2e2……)

=φ(p1e1)×φ(p2e2……)

=……

=φ(p1e1)×φ(p2e2)……

定理3可知
φ(piei)=piei-piei-1=(1-1/piei)×piei
---------------------------^ 即同除piei再同乘piei

那么原式=φ(p1e1)×φ(p2e2)……

=(1-1/p1e1)×p1e1 ×(1-1/p2e2)×p2e2……

=(p1e1×p2e2……)×(1-1/p1e1)×(1-1/p2e2)……

=m×(1-1/p1e1)×(1-1/p2e2)……
证毕

代码

void GenPhi(int &phi, int m){
     
	Phi=_m;
	int curM=_m;//为了和后面的控制变量区分开,我这里是把m设为全局变量
	for(int i=2; i*i<=_m; i++){
     
		
		if(_use[i]){
     
			continue;//_use[i]是判断和数的数组
		}
		
		if(curM%i==0){
     
			_fai/=i;
			_fai*=i-1;//发现因子,*(1-1/pi^ei)
		
			while(curM%i==0){
     
				curM/=i;//除掉因子
				//cout<
			}
		}
		
		if(curM==1){
     
			break;
		}

		for(int m=i; m*i<=10000; m++){
     
			_use[i*m]=true;//标记合数
		}
	}
	
	//cout<
	
	if(curM!=1){
     	
		_phi/=curM;
		_phi*=curM-1;
	}
	//cout<<_fai<
}

应用

讲了这么多,欧拉函数也会求了
那么,它有什么用?
后续的应用给大家推荐一个
免费课程及附件.

我以后也应该会写

结尾

另外,大家不要忘了点个关注呀~

好了,差不多说完了
如果有 错误/优化/疑问 欢迎提出
WeChat:wxid_ffe28hxx677f32
(其实是我想认识大佬)
——by 于斯为盛

你可能感兴趣的:(数学,数论,算法)