zoukankan      html  css  js  c++  java
  • 扩展欧几里得定理基础讲解 代码及证明

    知识储备
    1 . 朴素欧几里得原理:gcd(a,b) == gcd(b,a % b)
    2 . 负数取模:忽略符号返回绝对值就好了
    3 . 模数原理:对于整数a,b必然存在整数k使得a % b == a - k * b,
    且此时k == a / b向下取整
    定理内容
    对于正整数a,b,必然存在整数(不一定是正数)x,y,
    使得ax+by==gcd(x,y)

    证明

    (来自SDFZ-SPLI的援助)
    把两边同时除以gcd(x,y),由朴素欧几里得定理可以得到恒等式,说明一定存在至少一组解使得$ax+by==gcd(x,y)

    求解过程

    a*x1+b*y1=gcd(a, b);
    b*x2+gcd(a%b)*y2=gcd(b, a%b);

    ∵gcd(a, b)==gcd(b, a%b)
    ∴a*x1+b*y1==b*x2+(a%b)*y2

    ∵对于a和b存在整数k使得a % b == a - k * b
    ∴a%b可以拆成a-k*b,k==(a / b 向下取整)

    ∴a * x1 + b * y1 == b * x2 + ( a - k * b ) * y2 【把k==(a / b 向下取整)代入】
    ∴a * x1 + b * y1 == b * x2 + ( a - ( a / b ) * b ) * y2
    即a * x1 + b * y1 == b * x2 + a * y2 - b * ( a / b ) * y2
    所以有a * x1 + b * y1 == a * y2 + b * ( x2 - ( a / b ) * y2 )
    观察上式可知 x1 = y2 , y1 = x2 - a / b * y2
    可能上面五行是小学数学?不是很难吧

    所以得出结论:x1,y1是由x2,y2得来的

    那么x2,y2也一定是由x3,y3得来的,所以我们来递归吧
    但递归需要终止条件:
    记得在辗转相除法求最大公约数的时候,我们的递归终止条件是一方为0,那我们现在也可以参考一下,先递归gcd(a , b),当b==0时,此时a的值就是我们要的最大公约数,再根据扩展欧几里得定律a * x + b * y == gcd(a , b),将a = a,b = 0带入,可以求出x和y的值,此时x == 1,y == 0,在这里终止递归。

    代码实现

    清楚了原理以后代码应该很简单吧

    int exGcd(int a,int b,int &x,int &y)
    {
        if(b==0)
        {
            x=1;y=0;
            return a;
        }
        int r=exGcd(b,a%b,x,y);
        int t=x;x=y;y=t-a/b*y;
        return r;
    }
  • 相关阅读:
    sublime text3 常用插件安装
    eclipse 快捷键
    数组去重及数组的prototype原型
    如何用angularjs给从后台传来数据添加链接
    【转载】Java Web的web.xml文件作用及基本配置
    【转】数据库几种范式
    Socket编程
    进程间的五种通信方式介绍
    进程与线程的区别
    【转载】程序员必知之浮点数运算原理详解
  • 原文地址:https://www.cnblogs.com/floatiy/p/9472356.html
Copyright © 2011-2022 走看看