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就是二元一次不定方程的一组解

  • 相关阅读:
    Linux与Mac通信
    练习
    删除重复文件
    解压压缩文件
    查询压缩文件的大小
    修改文件夹和文件名字
    删除文件和文件夹
    移动文件和文件夹
    shutil复制文件夹
    shutil复制文件
  • 原文地址:https://www.cnblogs.com/tpgzy/p/9084816.html
Copyright © 2011-2022 走看看