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之文件处理命令
    Linux基础命令
    rip实验
    Linux基础之磁盘分区
    mysql安装
    centos Apache、php、mysql默认安装路径
    You probably tried to upload too large file. Please refer to documentation for ways to workaround this limit.
    Wrong permissions on configuration file, should not be world writable!
    机器会学习么 学习总结
    实验 5 Spark SQL 编程初级实践
  • 原文地址:https://www.cnblogs.com/tpgzy/p/9084816.html
Copyright © 2011-2022 走看看