zoukankan      html  css  js  c++  java
  • 浅谈扩展欧几里得算法

    一.算法简析

      扩展欧几里得算法(又称exgcd),是来求解形如下面格式方程的解。

                ax + by = c

      其中abc已经给出,xy为待求解的变量。

      扩欧算法规定,当 c%gcd(a,b)!=0的时候,上面方程不存在整数解。

      这个结论可以由贝祖定理推出:

      即如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)

      当上面的方程有解时,我们可以一定得到一组特解。下面我们就要推导下求特解的过程。

    二.算法推导

      首先,我们知道gcd(a,b) = gcd(b,a%b),再由上面的式子,我们可以推导得到

                    ax1+by1 = gcd(a,b) = gcd(b,a%b) = bx2 +(a%b)y2  

      而a%b又等于a - a/b*b(此处除法为向下取整)

      根据等式两边对应项对应相等的原则,我们可以得到以下关系

                             x1 = y2

                                y1 = x2 - a/b*b*y2

      通过比较辗转相除法,考虑递归解决问题,应用上面的式子,我们可以发现连接递归上下层的是gcd(a,b) = gcd(b,a%b),因此,递归的终止条件是b==0,此时将x=1,y = 0。

      然后根据上面x1y1x2y2的关系,就可以不断递归推导出原方程的解。详细细节可以看代码。

    三.代码实现

    typedef long long ll;
    void exgcd(ll a,ll b,ll& x1,ll& y1)
    {
        if(b==0)
        {
            x1 = 1;
            y1 = 0;
            return ;
        }
        ll x2,y2;
        exgcd(b,a%b,x2,y2);
        x1 = y2;
        y1 = (x2-a/b*y2);
        return ;
    }

    四.相关例题

     

  • 相关阅读:
    jquery的$.与$.fn的区别
    jquery加载页面的方法
    创业股权究竟如何分配--新浪创业训练营
    创业者要处理好的10大关系
    洪泰基金投资经理殷鹏:肯定不投的八类项目
    创业初期股权如何分配-------陈楠心血总结
    排序总结
    如何快速进入一门领域,学习新的知识
    虚拟机的设置
    华为大数据项目fusionInsight
  • 原文地址:https://www.cnblogs.com/baihualiaoluan/p/12238606.html
Copyright © 2011-2022 走看看