数论2——扩展欧几里得、裴蜀定理

一.最大公约数与最小公倍数

gcd:一般的,设a1, a2, a3, ......, ak是k个正整数,如果尊在一个整数d,使得d|a1,......,d|ak,那么d则为a1, ......, ak的公约数,在所有的公约数,最大的称为最大公约数。

lcm:同上(最小公倍数)

定理:lcm(a, b) * gcd(a, b) = a * b

粗略的理解:(有详细的公式可以查略,太难打了),两个数的最大公因数是两个数公共质因数的乘积,两个数的最小公倍数是两个数互相没有的质因数的乘积,所以lcm和gcd相乘,就是这两个数的乘积了。

二.辗转相除法

gcd(a, b) = gcd(b, a % b) (b \neq 0)

证明:设gcd(a, b) = p, a = kp, b = gp, 因为p是啊a,b最大公约数,所以k,g互质。

a % b = (k * p) % (g * p) = (k % g) * p

gcd(b, a % b) = gcd(g * p, (k % g) * p) = p

因为k,g互质,所以gcd(a, b) = gcd(b, a % b) (b \neq 0)(都等于p嘛)

三.裴蜀定理(贝祖定理)

1.对于不定方程组ax + by = m,其有解的充要条件是gcd(a, b)\mid m,也就是说m是a,b最大公约数的倍数。

证明:

设s为ax + by = m的最小的正整数解,那么我们就是要证明s = gcd(a, b),也就是s | gcd(a, b), gcd(a, b) | s.

s = ax_{0} + by_{0}

因为gcd(a, b)\mid ax_{0}

gcd(a, b)\mid by_{0}

所以gcd(a, b)\mid (ax_{0} + by_{0}),就是gcd(a, b)\mid s

a = qs + r (0 \leq r< s)

所以r = a % s = a - q(ax_{0} + by_{0}) = a(1 - qx_{0}) + b(-qy_{0})

 发现r和s均可以转换成一样的线性方程,0 <= r < s, s又是最小的正整数解,所以r = 0

所以s | a,同理可以得到s | b

所以s | gcd(a, b),

得证

2.裴蜀定理的充分性

d = mp

ax_{0} + by_{0} = m

ax_{0}p + by_{0}p = d = mp

x = x_{0}p, y = y_{0}p

3.裴蜀定理的必要性

ax + by = m有解,则gcd(a, b)\mid m成立

因为ax + by = m有解,所以整数x, y使ax + by = m成立

因为gcd(a, b)\mid a, gcd(a, b)\mid b

所以gcd(a, b)\mid m

 4.裴蜀定理引理一

如果a, b为正整数,而且a, b互质,则不存在小于b的正整数k使得k * a \equiv 0(%b)

证明:(反证法)

如果\ni a < k < b满足k * a \equiv 0(%b)

 那么,b | k * a, 那么k*a中一定包含b的所有质因子

又因为gcd(a, b) = 1, 所以a中没有包含b的质因子

所以k是b的倍数,因为0 < k < b所以不成立

5.裴蜀定理推论

如果a,b为正整数,而且a,b互质,那么0, a, a * 2, a * 3, ...... , a * (b - 1)这些数mod b, 余数互不相等

反证法证明:

如果存在两个同的数i * a, j * a(0 < j < i < b), 它们模b的余数相等,那么(i - j) * a % b的余数就是0,0 < i - j < b, 矛盾

6.裴蜀定理引理二

如果a,b互质,则必定存在一个整数k,满足k * a % b = 1

根据推论,0, a, 2 * a, ......, (b - 1) * a 模b的结果互不相同,所以模的结果又b个,都在0 ~ b - 1之间,所以存在。

根据引理2,如果a,b互质,则必定存在一个整数k,满足k * a % b = 1

 就是k * a - b * p = 1

这与a_{x} + b_{y} = 1是同理的,同样可以证明裴蜀定理

四.扩展欧几里得算法exgcd

可以在已经知道a,b的情况下,求不定方程a_{x} + b_{y} = gcd(a, b)的一组整数解。

分析:

ax_{1} + by_{1} = gcd(a, b),再设bx_{2} + (a % b)y2 = gcd(b, a % b)

所以ax_{1} + by_{1} = bx_{2} + (a % b)y_{2}

ax_{1} + by_{1} = ay_{2} + b(x_{2} - a / b) * y_{2}

我们只需要求其中的一组解,所以直接让x1 = y2, y1 = (x2 - a / b) * y2就可以了(注意a/b向下取整)

我们就会发现,1是由2推出来的,2应该也是由3推来的(事实证明也就是这样的)

所以我们可以用递归来解决这个问题,当求解到xn,yn的时候,axn + byn = a(就是最大公约数,注意回归到式子最初始的样子,ax_{1} + by_{1} = ay_{2} + b(x_{2} - a / b) * y_{2}的本质就是等于gcd(a, b)), xn = 1, yn = 0

void exgcd(ll a, ll b)
{
	if(b <= 0)
	{
		x = 1, y = 0 ;
		return ;
	}	
	else
	{
		exgcd(b, a % b) ;
		ll t = x ;
		x = y ;
		y = t - a / b * y ;
		return ;
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值