zoukankan      html  css  js  c++  java
  • 关于欧几里得算法,裴蜀定理,扩展欧几里得算法证明与解析

    欧几里得算法

    注:欧几里得算法是用来计算最大公约数的一个算法.主要的代码实现如下:

    int gcd(int a,int b){
        return !b?a:gcd(b,a%b);
    } 

    如果这个式子成立的话,不断重复利用这个式子来计算,直到a和b中有一个数变为 0的时候,就可以求出了他们的最大公约数。

     举个例子:我们要求gcd(15,30)

    运行如下:gcd(15,30)=gcd(30,15)=gcd(15,0)此时的15便是gcd(15,30)

    证明过程:

    设g = gcd(a,b),

    若使gcd(a,b) = gcd(b,a%b)成立的话,

    我们要证明g|b,g|a%b

    因为g|b

    所以我们要证明a%b

    ∵a%b = a−b * n/m

    ∴g|a%b

    裴蜀定理:

    定义:对于不定方程:a*x + b*y = c,判断此不定方程有整数解的条件是gcd(a,b)|c

    如何证明?

    证明过程:

     对于gcd(a,b)∤c时,

    显然gcd(a,b) | (a*x + b*y)如果存在整数解的话,gcd(a,b)|c

     gcd(a,b)dgcd(a,b)∤d 这个线性方程不存在整数解。

    扩展欧几里得算法(简称扩欧):

    扩欧就是用来求a*x+b*y=gcd(a,b)的一组整数解的算法

    原理:

    当b = 0时

    x = 1,y = 0是方程a*x+b*y=gcd(a,b)的一组解.

    当b ≠ 0时

    a*x1+b*y1 = a*y2+b*(x2-a/b*y2)

    证明过程:

    a*x1 + b*y1 = gcd(a,b)

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

    ∵gcd(a,b) = gcd(b,a%b)

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

           =b*x2+(a - [a/b]*b)*y2

           =b*x2+a*y2-[a/b]*b*y2

           =a*y2 + b(x2 - [a/b]*y2)

    ∴x1 = y2,y1 = x2 - [a/b]*y2 

    代码如下:

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

    最后的x,y就是二元一次不定方程的一组解

  • 相关阅读:
    中国计算机学会推荐国际学术刊物 会议和期刊目录
    Windows运行(Win+R)快速启动所有程序(自定义)
    解决 Page 'http://localhost:63342/v3/js/math/math.map' requested without authorization页面未授权问题
    如何设置计算机IP地址
    VSCode 设置中文语言
    任意文件夹打开CMD命令窗口
    User-Agent
    关于deepin linux15.6-15.9.1系统播放视频卡顿解决办法
    TCP/IP协议
    HTTP协议
  • 原文地址:https://www.cnblogs.com/tpgzy/p/9084816.html
Copyright © 2011-2022 走看看