拓展欧几里得算法-数论代码笔记(超级细节)

1.拓展欧几里得算法介绍

我们知道欧几里得算法是用来求解最大公约数的,那么拓展欧几里得算法是用来干嘛的呢?

先给个题:

给定a,b,求一组x,y,使得ax+by=gcd(a,b)

你可能很好奇这有什么用呢?

别急,先听我把这个介绍完,然后我会介绍它的两个应用,分别是解线性方程ax+by=c与解一次同余方程ax\equiv b(mod \ m)

回到ax+by=gcd(a,b),我们需要知道一个定理:

裴蜀定理
对于任意正整数a,b;一定存在非零整数x,y,使得:
ax + by = gcd(a,b)
其中gcd(a,b)指a和b的最大公约数

 拓展欧几里得算法的作用就是找出满足裴蜀定理的一组 x 和 y。

下面我将介绍计算的流程,首先我先剧透一下,这与拓展欧几里得算法与欧几里得算法类似,都是一个递归程序。使用子递归程序的结果来更新本程序的返回值。

算法如下:

ax+by=gcd(a,b)

b=0时,x =1, y=0(是不是感觉很像欧几里得算法的判断条件)

b \neq 0时,  这里能体现出为什么这个算法叫拓展欧几里得算法,因为要用到欧几里得算法的一个结论gcd(a,b) = gcd(b, a \% b)

我们使用裴蜀定理可以知道:

b{x}'+(a\%b){y}' = gcd(b, a\%b)

现在我们来看看这个{x}',{y}'到底与x,y有什么关系,如果我们能建立这个关系,我们就能够写成一个递归程序。

a \% b = a - \lfloor { \frac{a}{b}} \rfloor \times b

b{x}'+ (a - \lfloor { \frac{a}{b}} \rfloor \times b) {y}' = gcd(b, a\%b)

a{y}' + b({x}' - \lfloor \frac{a}{b} \rfloor{y}') = gcd(b, a \% b) = gcd(a, b)

故而我们有x = {y}', y = {x}' - \lfloor \frac{a}{b} \rfloor \times {y}'

所以,直接上代码(使用引用传递值可能有点绕)

int exgcd(int a, int b, int &x, int &y)
{
    if (!b)
    {
        x = 1; y = 0;
        return a;
    }
    int d = exgcd(b, a % b, y, x); //这句话的意思是,用当前y来保存子递归程序的x',x来保存y'
    y -= (a/b) * x;// 这里是因为刚刚推出的式子 y = x' - (a/b) * y' = y - (a/b) * x;
    return d; //返回值不用管
}

2.应用一:求解一般方程ax + by = c

刚刚我们知道ax+by = gcd(a,b)有整数解,而且解也能算出来。

那么显然当cgcd(a, b)的倍数时,这个方程有解。

d = gcd(a,b)

我们有那么特殊解{x}' = x_0 \times \frac{c}{d}, {y}' = y_0 \times \frac{c}{d}

而通解 = 特解 + 齐次解

方程ax + by = 0的解是{x}'' = k \frac{b}{d}, {y}'' = -k \frac{a}{d}, k是整数。

所以通解是x = {x}'+{x}'', y = {y}' + {y}''

3. 应用二:解一次同余方程ax\equiv b(mod \ m)

乍一看没法没法用ax+by=c

但是别急, 我们可以设ax = -mc + b, 那么我们就有ax + mc = b

是不是一模一样啊。

有解条件是gcd(a,m) | b,有解的话直接用上面的方法求就可以了。

特别地,如果你还记得上一篇博客里面的费马小定理,当b = 1am互质的时候,xa的乘法逆元,即x = pow(a, m-2),用快速幂计算就可以啦。

对自己有信心的可以去尝试P1082 [NOIP2012 提高组] 同余方程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值