歐幾裏德算法與擴展歐幾裏德算法
阿新 • • 發佈:2017-05-13
線性同余 線性同余方程 歐幾裏德 其中 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)求解模的逆元;
歐幾裏德算法與擴展歐幾裏德算法