扩展欧几里得算法

1.原先的欧几里得算法(又名辗转相除法):

设两个整数a,b, 有a与b的最大公约数等于b与a mod b的最大公约数
即gcd(a,b)=gcd(b,b%a)

证明:
(充分性)
设整数a,b,gcd,其中gcd为a,b的最大公约数。那么有gcd%a=0,gcd%b=0,
设k=a mod b,即 a=mb+k(m为任意整数),k=a-mb,
由于gcd可以被a,b整除,所以k也可以被gcd整除。
所以gcd(a,b)=gcd(b,a mod b)
(必要性)
设k=a mod b,即a=mb+k(m为任意整数),
若k可以整除gcd和b,同理则gcd必可以被a整除。
所以gcd(b,a mod b)=gcd(a,b)

代码实现:

int GCD(int a,int b)
{
return (b>0)?gcd(a,b):a;
}

该算法有如下性质:gcd(a,b)=gcd(|a|,|b|),

**

2.扩展欧几里得算法

**
主要表达式为:ax+by=gcd(a,b)

ax+by=gcd(a,b) 其中a,b>=0,且a和b不能同时为0. gcd(a,b)为a和b的最大公约数

其主要作用为已知数a,b来求解一组(非唯一解)x,y的值,也可以用作解出乘法逆元。
证明:

  • 设ax+by=k,其中a,b>=0,x,y未知,k为a,b的最大公约数 由欧几里得定律知:gcd(a,b)=gcd(b,a mod b)
  • 所以以b代a,以a mod b代b, 得到方程2: bx1+(a mod b)y2=k 其中 a mod b=(a-a/b*b)(整除)
  • 代入化简得: x1=y,y=x-a/b *y2

若a,b两个参数中有负数,则可以进行以下处理(以a为例):
将a以-a代替,同时将x以-x代替,维持等式等价,得到|a|(-x)+by=gcd(|a|,b),继续进行计算。
一个判断方法如下:

if(a<0)
{
a=-a,x=-x;
}

代码实现:

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

3.实际应用时的一些问题

1.解二元一次方程
我们已知ax+by=(a,b)(ab>0)这样一个式子,如何利用它去解形如ax+by=c这样的二元一次方程呢?
可以通过一些等式等价变换实现:

  • 设二元一次方程ax+by=c(a,b,c∈Z),
  • 等式两边同乘(a,b)/c ,(其中(a,b)为a和b的最大公约数。)
    得到a*(a,b)/cx+b(a,b)/c*y=(a,b) 。
  • 令x0=((a,b)/c)x ,y0=((a,b)/c)y,利用扩展欧几里得解得x0
  • 将x0乘以c/(a,b)以得到x1,x1即为所求解

很多题目都会要求你得到一个最小整数解,由于x1很有可能为负数,那么还需要处理一下x1来得到答案。

  • 已知在ax+by=c中,a(x1+(b/c))+b(y1-(a/c))=ax1+ab/c+by1-ab/c=c,与原式等价
  • 那么在最后的处理中可以通过x1+n(b/c)这种方式来控制其范围。

一段实现代码:

//已知ax1+by1=c
int tmp1=b/c;
x1=((x1%tmp1)+tmp1)%tmp1;

因为x1对tmp1进行取余,倘若x1为负数,由于取余结果与被除数(因为取余本质上是带余除法)的符号一致,所以会得到一个负数x2,且由于取余其值被控制在了tmp1范围之内(-tmp1<x2≤0),在后边加上一个tmp1使得其值必然为正数(tmp1≥x2>0),且为最小整数解。

倘若x1为正数,则首先控制它的值的范围在[0,tmp1)之间,加上tmp1(这步针对于负数),使得其值域变为[tmp1,2tmp1),取余,得到一个[0,tmp1)之间的值。
处理后,所得x1即为所求。
2.求乘法逆元
逆元的概念:乘法逆元,是指数学领域群G中任意一个元素a,都在G中有唯一的逆元a‘,具有性质a×a’=a’×a=e,其中e为该群的单位元。

通俗一点解释,就是同余方程里的倒数,即存在一个数x使得ax≡1(mod b)
成立,其中(a,b)=1,此时称x为a的逆元,可记作x=inv(a)(inverse的缩写).

那么这和扩展欧几里得定理有什么关系呢?首先,我们注意到了那个同余方程,即ax≡1(mod b),根据同余的性质,这个方程可以写成ax=1+by 其中b,y∈z.
喜闻乐见的方程ax+(-by)=1出现了,由于我们所求的是x,所以y的符号无关紧要,直接套用EXGCD求解x的最小整数解即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值