孙子定理(中国剩余定理)

中国剩余定理

中国剩余定理这样描述,给出以下一元线性同余方程组

                                        

给出你n个ai和mi,求出符合题意的X值,一般输出最小解。

孙子定理(中国剩余定理)_第1张图片

ti 要用扩展欧几里得算法e_gcd()计算。

证明参照:点击打开链接

孙子定理(中国剩余定理)_第2张图片

看个例子

一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作《 孙子算经》卷下第二十六题,叫做“物不知数”问题,原文如下:
有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。《 孙子算经》中首次提到了同余方程组问题,以及以上具体问题的解法,因此在中文数学文献中也会将中国剩余定理称为孙子定理。
宋朝数学家 秦九韶于1247年《 数书九章》卷一、二《大衍类》对“物不知数”问题做出了完整系统的解答。明朝数学家 程大位将解法编成易于上口的《孙子歌诀》:
三人同行七十稀,五树梅花廿一支,七子团圆正半月,除百零五使得知
这个歌诀给出了模数为3、5、7时候的同余方程的秦九韶解法。意思是:将除以3得到的余数乘以70,将除以5得到的余数乘以21,将除以7得到的余数乘以15,全部加起来后减去105(或者105的倍数),得到的余数就是答案。比如说在以上的物不知数问题里面,按歌诀求出的结果就是23。

例题中三个模数 m1=3,m2=5,m3=7;

余数a1=2,a2=3,a3=2;

M=105,M1=35 , M2=21,M3=15;

t1=2,t2=1,t3=1;

70=t1*M1,21=t2*M2,15=t3*M3 

X =( a1 * t1 * M1 + a2 * t2 * M2 + a3 * t3 * M3)%M=( 2 * 2 * 35 + 3 * 1 * 21 + 2 * 2 * 15)%105=23

代码实现

//n个mi互质 
ll m[101];ll a[101];//m[]存放互质的数,a[]存放余数 
void e_gcd(ll a,ll b,ll &x, ll &y){//计算逆元 
	if(b==0){
		x=1;y=0;return;
	}
	e_gcd(b,a%b,x,y);
	ll temp=x;
	x=y;
	y=temp-a/b*y;
}
ll CRT(){
	ll M=1;
	for(int i=0;i
中国剩余数定理是适用于n个mi两两互质的情况的,还有不互质的呢,待续。。。。。。


你可能感兴趣的:(ACM算法规整,数论)