欧几里德 和 拓展欧几里德算法

本文详细介绍了欧几里德算法及其拓展欧几里德算法,用于求解最大公约数和判断、求解整数线性同余方程的解。通过证明和例子阐述了算法原理,并提供了相关代码实现。同时,讨论了如何运用这些算法解决实际的数论问题,如求模运算和大规模数的处理。
摘要由CSDN通过智能技术生成

一.欧几里德

欧几里德是用来求最大公约数的算法
其算法的中心思想为:

设a,b的最大公约数为c,则c一定也是a%b的最大公约数

证明方法很多,下面列出最简单的一个:
令 :a = xc; b = yc ; a = bk + r

(1) 证明 c 为 r 的约数

$r = a - b*k = xc - ykc = c(x - ky) $
故 c 为 r 的一个约数,证毕

(2) 证明 c 为 b和r的最大公约数

b = y ∗ c b = y*c b=yc
r = ( x − k y ) ∗ c r = (x - ky)*c r=(xky)c
故问题转化为 : 证明 y 和 (x - ky) 互质

我们可以使用反证法:
假设y 和 (x - ky)存在公因子 t
y = p t y = pt y=pt
x − k y = q t x - ky = qt xky=qt
则 $x = ky + qt = kpt + qt = (kp + q) * t $

则说明 t 也是 x,y的公因子
但是
由初始定义:
a = x ∗ c a = x*c a=xc
b = y ∗ c b = y*c b=yc
若x,y存在公因子t,则 c*t 才为 a,b的最大公因子,则与初始条件 c 为 a,b的最大公因子矛盾。
故假设不成立。
即 y 和 (x - ky) 互质
因为

b = yc
r = (x-k
y)*c

故 c 为 b,r的最大公约数,证毕

设gcd(a,b)为a,b,的最大公约数,则
==> gcd(a,b) = gcd(b,r) = gcd(b,a%b)

代码:

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

二.拓展欧几里德

已知一个问题:

已知a,b,c均为整数 问对于ax + by = c来说是否存在整数解,如果存在则求出任意一组整数解

此问题我第一次是见于HDU的校赛,不过只是需要求解是否存在(原题大概是问一个三元一次方程ax + by + cz = d,在a,b,c,d确定的情况下存在多少组解)
此题正解是背包,而我是通过移项枚举z的值,然后快速判断二元一次方程是否存在解来判断方案数量。

但当时没学拓欧,就各种乱搞WA了8次,最后YY出了一个快速判断的公式,终于AC。
后来才知道,其实跟拓欧有着很大的联系。

回到开始的问题:

(一)对于判断是否有整数解,其实很简单,就判断一下:

c % gcd(a,b) == 0 是否成立
其实这是很容易想通的,令:
r = g c d ( a , b ) r = gcd(a,b) r=gcd(a,b)
则无论如果改变x,y的大小,对于ax + by 每次改变的值一定是r的倍数,因为
(a+b) ,(a-b), a, b,a+2b,a - 2b…都是r的倍数

如果c 不是 r的倍数,则一定不存在整数解。

(二)至于某一组x,y的值:

则可以用拓展欧几里德来求解:
首先考虑特殊情况:
a ∗ 1 + b ∗ 0 = g c d ( a , b ) = a a*1 + b*0 = gcd(a,b) = a a1+b0=gcd(a,b)=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值