1. 程式人生 > >歐幾裏德算法與擴展歐幾裏德算法

歐幾裏德算法與擴展歐幾裏德算法

線性同余 線性同余方程 歐幾裏德 其中 acc 公約數 ret ide 百度

歐幾裏得算法就是我們常說的輾轉相除法,輾轉相除法可以用來求最大公約數,知道最大公約數還可以求最小公倍數。gcd在好像也有庫函數__gcd

技術分享
int Gcd(int a, int b)
{
    while(b != 0)
    {
      int r = b;
      b = a % b;
      a = r;
    }
    return a;
}
非遞歸方法 技術分享
int gcd(int a,int b)
{return b ? gcd(b,a%b) : a;}
遞歸方法

擴展歐幾裏得算法是在解決一個什麽問題呢,解方程,解二元一次方程的通解。

擴展歐幾裏得算法是歐幾裏得算法(又叫輾轉相除法)的擴展。除了計算a、b兩個整數的最大公約數,此算法還能找到整數x、y(其中一個很可能是負數)。通常談到最大公因子時, 我們都會提到一個非常基本的事實: 給予二整數 a 與 b, 必存在有整數 x 與 y 使得ax + by = gcd(a,b)。有兩個數a,b,對它們進行輾轉相除法,可得它們的最大公約數——這是眾所周知的。然後,收集輾轉相除法中產生的式子,倒回去,可以得到ax+by=gcd(a,b)的整數解。by百度百科

技術分享
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;
}
非遞歸方法 技術分享
int exgcd(int m,int n,int &x,int &y)
{
    int x1,y1,x0,y0;
    x0=1; y0=0;
    x1=0; y1=1;
    x
=0; y=1; int r=m%n; int q=(m-r)/n; while(r) { x=x0-q*x1; y=y0-q*y1; x0=x1; y0=y1; x1=x; y1=y; m=n; n=r; r=m%n; q=(m-r)/n; } return n; }
遞歸方法

擴展歐幾裏德算法的應用主要有以下三方面:

(1)求解不定方程;

(2)求解模線性方程(線性同余方程);

(3)求解模的逆元;

歐幾裏德算法與擴展歐幾裏德算法