数论学习笔记(中)

上一篇:数论学习笔记(上)

五、乘法逆元

逆元(Inverse element)定义:逆元素是指一个可以取消另一给定元素运算的元素,在数学里,逆元素广义化了加法中的加法逆元乘法中的倒数

(from百度百科)

通俗点讲,就是用来取消某一运算,取消加法运算就是加上这个数的相反数,取消乘法运算就是乘上这个数的倒数

但如果在mod的意义下时就不能单纯的乘上一个倒数了

比如要计算a/b mod m时,不能直接计算a*(1/b) mod m

这时就要找一个整数c,使得a*c mod m=a/b mod m

c就是在mod m意义下b的乘法逆元了

所以满足性质

如果m为质数,则任何一个数都有关于它的逆元,如果它是合数就不一定了

在题目中一般m都是质数

==================================================================================================

求一个数在mod m意义下的逆元有以下三种方法

受限于篇幅,就不一一证明了,可参考以下其他博客

1.快速幂求逆

ll ksm(ll x,ll k,ll mod){
	x%=mod;
	ll ans=1LL;
	while (k){
		if (k&1){
			ans=(ans*x)%mod;
		}
		x=(x*x)%mod;
		k/=2;
	}
	return ans;
}

ll inv(ll x,ll m){
	return ksm(x,m-2,m);
}

2.扩展欧几里得求逆

就是解一个同余方程

代码见上篇

3.递归求逆

一次性用递归式求1~n的逆元

int main(){
	int n,p;
	rd(n) rd(p)
	inv[1]=1;
	for (int i=2;i<=n;i++){
		inv[i]=(ll)(p-p/i)*inv[p%i]%p;
	}
	for (int i=1;i<=n;i++){
		printf("%d\n",inv[i]);
	}
}

六、中国剩余定理

中国剩余定理(Chinese remainder theorem)就是孙子定理(什么名字。。。),最早出现在南北朝时期的数学著作《孙子算经》,故名

它用于解一元一次同余式的解,形如:

《孙子算经》上有个叫做“物不知数”的问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?即一个整数除以三余二,除以五余三,除以七余二,求这个整数。

根据玄学的小学奥数知识,不难得出这个数最小为23,如何用程序求解呢?

先说方法:

有一个前提,就是m1,m2...mn两两互质

对于方程组,记,把它转化为n个同余方程:,最终答案为

证明:

同余方程:等同于

如果我们又有一组同余方程,把它们加起来:

以此类推,如果把n个这样的方程的解加起来,即

就能对于所有的i,使得,即满足原方程组

至于怎么解,只需令,带入得

用扩展欧几里得解出后算出x值即可

又易证若x是这个方程的解,那么x+k*M也是方程的解

代码:

ll w[1000],m[1000],n;

ll exgcd(ll a,ll b,ll &x,ll &y){
	if (b==0){
		x=1LL,y=0LL;
		return a;
	}
	ll gcd=exgcd(b,a%b,y,x);
	y-=x*(a/b);
	return gcd;
}

int CRT(void){
	ll M=1LL;
	for (int i=1;i<=n;i++){
		M*=m[i];
	}
	ll ans=0LL;
	for (int i=1;i<=n;i++){
		ll now=M/m[i],x,y;
		exgcd(m[i],now,x,y);
		ans=(ans+y*now*w[i])%M;
	}
	return (ans%M+M)%M;//求最小正数解 
}

==================================================================================================

但是,如果,m1~mn不两两互质,这种方法就无法解决了

这时要把n个方程合并为1个方程

方法和代码可以参考其他博客

七、欧拉函数(一)

首先看看定义:

欧拉函数又称函数,表示1~n中与n互质的个数

,因为1,3,5,7都与8互质

它有以下性质:

1.若n为质数,则,因为质数和任何小于它的正整数都互质

2.若n为质数,则,证明:

小的个数中,与不互质的数一定是n的倍数,即为n*k(k=1,2,3,...,),共有

所以

3.若a,b互质,则,证明:

如过直接从互质的角度,这有点难证,不妨从不互质的角度来看:

1~a中有个数与他不互质,1~b中有个数与他不互质

因为a,b互质,所以与a不互质的数和与b不互质的数没有重合

如果一个数与a不互质,那么那个数的倍数也与它不互质

所以个数乘以[1~b]中所有数都与a*b互质,这样就产生了个与a*b不互质的数

同理,也产生了个与a*b不互质的数

但是如果直接把它们加起来,就产生了重复,重复的数是个数与个数的乘积

所以要减去

所以化简得

4.把一个数x分解质因数得,则

理解:1~x中有x个数,每乘上一个,就把个pi的倍数,也就是把与x公因数为pi的数约去了

当然也可以由性质2和3严谨证明

5.若p是质数,p|x,则,证明:

==================================================================================================

求一个数的欧拉函数:用性质4即可

代码略

欧拉函数的线性筛法:

一次性求出~的值,时间为o(n),可同质数一起筛出来

先证明一个引理:若p是质数,x mod p不为0,则x,p互质,则

代码:

int check[inf],p[inf],phi[inf],pcnt=0;
void getphi(void){  
    check[1]=check[0]=1;  
    phi[1]=1;
    for (int i=2;i<inf;i++){  
        if (!check[i]){
            p[++pcnt]=i;
            phi[i]=i-1;\\根据性质1 
        }  
        for (int j=1;j<=pcnt && p[j]*i<inf;j++){  
            check[p[j]*i]=1;
            if (i%p[j]==0){
            	phi[i*p[j]]=phi[i]*p[j];\\根据性质5
                break;  
            }  
            phi[i*p[j]]=phi[i]*(p[j]-1);\\根据引理 
        }  
    }  
    return;  
}  

八、欧拉函数(二)

先讲一个非常有用的定理——欧拉定理:

若n,a为正整数且互质,则有

证明:

设小于n并与n互质的数为

又有数集m,使得

则有引理1:数集m中没有任意两个数关于n同余,反证法:

若有,则  

但a与n互质且,所以

引理2:数集m中,,反证法:

如果有mi使得,设r=

则:,

   

但gcd(n,a*xi)=0,gcd(n,r*(q-k))=r,所以,矛盾

所以由两个引理得:数集m的某一种排列能关于n依次同余于

      

  ,所以约去

如果n是质数,则,就是著名的费马小定理了:

 (p是质数)

用费马小定理可以证明逆元的第一种求法

==================================================================================================

再来看看由欧拉函数拓展出的相关定义:

阶:如果a,m互质,m>1且满足的最小正整数t称为a关于m的阶,记作

有性质:所有满足的t都有 (可根据mod的周期性理解)

又因为欧拉定理:,则

阶的定义主要是为原根作铺垫:

若对于a,m(a,m互质)使得,则称a为m的一个原根

也就是满足为关于t的方程的最小整数解

原根有一个重要的性质:

1.如果g为m的原根,则数集的某一种排列能依次关于m同余于1~m中于m互质的个数

证法类似于证欧拉定理的两个引理,即用反证法证出:数集G中没有任意两个数关于m同余和

2.一个数有原根的充分必要条件是它能表示为的形式(p为质数,e为正整数),如2,3,4,6,7等都有原根

然而我太菜不会证。。。

3.一个数n如果有原根,它的原根个数为,特别地,若n为质数,则其原根个数为

然而还是不会证。。。

如何求一个数的原根:

 

 

(持续施工中。。。)

 

参考文献:

1.百度百科

2.某篇博客

3.某篇论文

2.信息学奥赛之数学一本通 (林厚从 著) (东南大学出版社)

 

p.s 本人水平有限,如有错误,多多谅解,敬请指出

下一篇:以后会有的

 

Inverse element

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值