从gcd到扩展中国剩余定理

本文由一个初三的小蒟蒻作,如有笔误,请指出:

part 1:gcd

    gcd是指最大公约数,这在信息学中是一个十分基础的技能了,而求gcd的过程也十分的简单,核心就是一条式子:

    gcd(a,b)=gcd(b,a mod b)

    而当b为0时,a就是最大公约数。证明就不写了吧(我才不告诉你我不会)

    代码如下:

int gcd(int a,int b){
	if (!b) return a;
	return gcd(b,a%b);
}

    整个过程其实就是用递归实现。

    请原谅我奇丑无比的码风。

part 2:扩展gcd

    到这里,我们就要来讲一些实用的东西了,我们先来看这样一个问题:

    a*x+b*y=gcd(a,b)

    已知a,b,求x,y的一组解。

    这个问题简单的一看是完全没有头绪,但我们想一想,这题因为式子里有gcd,那么肯定与gcd有着千丝万缕的关系:

    对于这下面两个式子,我们有没有什么想法?

    a*x+b*y=gcd(a,b)   与    b*x1+(a mod b)*y1=gcd(b,a mod b)

    很好,我们可以发现gcd(a,b)=gcd(b,a mod b)这个我们得出的结论,那么我们也就可以发现这样的一个式子:

    a*x+b*y=b*x1+(a mod b)*y1

    我们在这里先引入一个结论(证明很简单):a mod b=a-b*(a/b)  其中这a/b是要下取整的,以后我们就用Z来代表这里的a/b。

    那么我们的式子就变成了这样:

    a*x+b*y=b*x1+(a-b*Z)*y1

    我们再把它变一下形,得到:

    a*x+b*y=a*y1+b*(x1-Z*y1)

    假如我们已经求出来了x1与y1的值,那么我们就可以知道x与y的值!也就是说,有:x=y1且y=x1-Z*y1。

    那么我们怎么去求x1与y1呢?这时我们可以用递归,而且这里的过程与gcd极其相似!因为我们把(a,b)变成了(b,a mod b)!那么我们在gcd的过程之中顺带计算就好了。

    代码如下:

void exgcd(int a,int b,int &x,int &y){
	if (!b){
		x=1; y=0;
		return ;
	}
	int x1,y1,Z=a/b;
	exgcd(b,a%b,x1,y1);
	x=y1;
	y=x1-Z*y1;
}

    我来解释一下当b为零时的边界条件为什么会是这样:

    当b为0时,我们就有a*x+0*y=gcd(a,0)=a,那么x一定为1,那么y为0。

    这个程序最终的x,y就是一组合法解。

    到此,扩展gcd完结撒花。

part 3:中国剩余定理

    (终于写到中国剩余定理了)

    在说中国剩余定理之前,先得引入一个定义:

一次同余方程组,详细定义可以去看某度,但一张图还是最直接的:

这里是k个一次同余方程,把它们联立在一起,就是一次同余方程组,而中国剩余定理,就是解决这一次同余方程组的。

最近因为个人原因,可能更新较慢,望谅解……

未完待续……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值