當前位置:首頁 » 操作系統 » 擴展歐幾里得演算法

擴展歐幾里得演算法

發布時間: 2022-02-01 06:58:41

『壹』 關於擴展歐幾里得演算法有點不明白,請大神指教

這是通過數學計算出來的(所以,學好數學很重要),其實你應該仔細理解該演算法的原理!如下內容摘自:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html
擴展歐幾里德演算法
基本演算法:對於不完全為 0 的非負整數 a,b,gcd(a,b)表示 a,b 的最大公約數,必然存在整數對 x,y ,使得 gcd(a,b)=ax+by。
證明:設 a>b。
1,顯然當 b=0,gcd(a,b)=a。此時 x=1,y=0;
2,ab!=0 時
設 ax1+by1=gcd(a,b);
bx2+(a mod b)y2=gcd(b,a mod b);
根據樸素的歐幾里德原理有 gcd(a,b)=gcd(b,a mod b);
則:ax1+by1=bx2+(a mod b)y2;
即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;
根據恆等定理得:x1=y2; y1=x2-(a/b)*y2;
這樣我們就得到了求解 x1,y1 的方法:x1,y1 的值基於 x2,y2.
上面的思想是以遞歸定義的,因為 gcd 不斷的遞歸求解一定會有個時候 b=0,所以遞歸可以結束。

『貳』 擴展歐幾里得演算法 好懂一點

歐幾里德演算法又稱輾轉相除法,用於計算兩個整數a,b的最大公約數。其計算原理依賴於下面的定理:
定理:gcd(a,b) = gcd(b,a
mod b)
證明:a可以表示成a = kb +
r,則r = a mod b
假設d是a,b的一個公約數,則有
d|a,
d|b,而r = a - kb,因此d|r
因此d是(b,a
mod b)的公約數
假設d 是(b,a
mod b)的公約數,則
d | b , d
|r ,但是a = kb +r
因此d也是(a,b)的公約數
因此(a,b)和(b,a mod
b)的公約數是一樣的,其最大公約數也必然相等,得證
歐幾里德演算法就是根據這個原理來做的,其演算法用C++語言描述為:
int
Gcd(int a, int b)
{
if(b ==
0)
return a;
return
Gcd(b, a % b);
}
當然你也可以寫成迭代形式:
int
Gcd(int a, int b)
{
while(b !=
0)
{
int r = b;
b = a % b;
a =
r;
}
return
a;
}
本質上都是用的上面那個原理。
補充:
擴展歐幾里德演算法是用來在已知a,
b求解一組x,y使得a*x+b*y=Gcd(a,b)(解一定存在,根據數論中的相關定理)。擴展歐幾里德常用在求解模線性方程及方程組中。下面是一個使
用C++的實現:
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;
}
把這個實現和Gcd的遞歸實現相比,發現多了下面的x,y賦值過程,這就是擴展歐幾里德演算法的精髓。
可以這樣思考:
對於a' = b,
b' = a % b 而言,我們求得 x, y使得 a'x + b'y = Gcd(a', b')
由於b' = a
% b = a - a / b * b (註:這里的/是程序設計語言中的除法)
那麼可以得到:
a'x + b'y
= Gcd(a', b') ===>
bx + (a - a / b * b)y = Gcd(a', b') = Gcd(a, b)
===>
ay +b(x - a / b*y) = Gcd(a, b)
因此對於a和b而言,他們的相對應的p,q分別是
y和(x-a/b*y).
在網上看了很多關於不定方程方程求解的問題,可都沒有說全,都只說了一部分,看了好多之後才真正弄清楚不定方程的求解全過程,步驟如下:
求a * x
+ b * y = n的整數解。
1、先計算Gcd(a,b),若n不能被Gcd(a,b)整除,則方程無整數解;否則,在方程兩邊同時除以Gcd(a,b),得到新的不定方程a'
* x + b' * y = n',此時Gcd(a',b')=1;
2、利用上面所說的歐幾里德演算法求出方程a' * x + b' * y = 1的一組整數解x0,y0,則n' * x0,n' *
y0是方程a' * x + b' * y = n'的一組整數解;
3、根據數論中的相關定理,可得方程a'
* x + b' * y = n'的所有整數解為:
x = n' * x0 + b' * t
y = n' * y0 - a' * t
(t為整數)

上面的解也就是a * x + b * y = n 的全部整數解。
步驟如下:
擴展歐幾里德演算法-求解不定方程,線性同餘方程:
解不定方程ax + by = n的步驟如下:

(1)計算gcd(a, b). 若gcd(a, b)不能整除n,則方程無整數解;否則,在方程的兩邊同除以gcd(a, b),
得到新的不定方程a'x + b'y = n',此時gcd(a', b') = 1

(2)求出不定方程a'x + b'y = 1的一組整數解x0, y0,則n'x0,n'y0是方程a'x + b'y = n'的一組整數解。

(3)根據[email protected]^%W#&定理,可得方程a'x + b'y = n'的所有整數解為:
x = n'x0 + b't
y = n'y0 - a't
(t為整數)
這也就是方程ax + by = n的所有整數解

利用擴展的歐幾里德演算法,計算gcd(a, b)和滿足d = gcd(a, b) = ax0 + by0的x0和y0,
也就是求出了滿足a'x0 + b'y0 = 1的一組整數解。因此可得:
x = n/d * x0 + b/d * t
y = n/d * y0 - a/d * t
(t是整數)

program oujilide;
var i,j,a,b,c,d,x,y:longint;
function gcd(a,b:longint):longint;
var i:longint;
begin
if a=0 then exit(b);
if b=0 then exit(a);
gcd:=gcd(b,a mod b);
end;
procere extend_gcd(a,b:longint;var x,y:longint);
var i,j:longint;
begin
if b=0 then
begin
x:=1;
y:=0;
exit
end;
extend_gcd(b,a mod b,x,y);
i:=x;
x:=y;
y:=i-(a div b)*x;
end;
begin
assign(input,'oujilide.in');
reset(input);
assign(output,'oujilide.out');
rewrite(output);
read(a,b,c);
d:=gcd(a,b);
if c mod d=0 then begin a:=a div d; b:=b div d; c:=c div d; end
else begin writeln('No answer!'); exit; end;
extend_gcd(a,b,x,y);
x:=c*x;
y:=c*y;
writeln(x,' ',y);
end.

『叄』 擴展歐幾里得演算法PASCAL

gcd(a,b)=ax+by
gcd(b,a mod b) = bx'+(a mod b) y'
=bx'+ ( a- (a div b) *b)y'
=bx'+ ay'- (a div b) *b *y'
=ay'+ b(x'- (a div b) y')
因為gcd(a,b)=gcd(b , a mod b)
所以ax+by=ay'+ b(x'- (a div b) y')
x=y'
y=x'- (a div b) y'

var
a,b,x,y,k:integer;

function extended_gcd(a,b:longint; var x,y:longint):longint;
var
t:longint;
begin
if b=0 then
begin
x:=1; y:=0;
exit(a);
end;
extended_gcd:=extended_gcd(b,a mod b , x, y);
t:=x;
x:=y;
y:=t - (a div b)*y;
end;

begin
readln(a,b);
k:=extended_gcd(a,b,x,y);
writeln(a,'*(',x,')+',b,'*(',y,')=',k);

readln;
end.

分給的也忒少了

『肆』 擴展歐幾里得演算法

//歐幾米德演算法 //演算法描述:給定兩個正整數m和n,求他們的最大公因子。 //1.[求余數]用m除以n並令r為所得余數 //2.[余數為0]若r=0,則演算法結束,n即為所求答案 //3.[互換]置m←n,n←r,並返回步驟1。 #include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { int n,m; int r; cout << "輸入兩個數(M,N):"; cin >> m >> n; cout << m << "和" << n << "的最大公約數為"; while(r!=0) { r=m %n; m=n; n=r; } cout << m<< endl; system("PAUSE"); return EXIT_SUCCESS; }

麻煩採納,謝謝!

『伍』 擴展歐幾里德演算法是什麼

擴展歐幾里德演算法是用來在已知a, b求解一組x,y,使它們滿足貝祖等式: ax+by = gcd(a, b) =d(解一定存在,根據數論中的相關定理)。擴展歐幾里德常用在求解模線性方程及方程組中。

下面是一個使用C++的實現:

intexGcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
intr=exGcd(b,a%b,x,y);
intt=x;x=y;y=t-a/b*y;
return r;
}

把這個實現和Gcd的遞歸實現相比,發現多了下面的x,y賦值過程,這就是擴展歐幾里德演算法的精髓。

熱點內容
des演算法破解 發布:2023-02-01 11:01:31 瀏覽:556
安卓機關機設置在哪裡 發布:2023-02-01 10:58:43 瀏覽:202
密碼箱有什麼樣子 發布:2023-02-01 10:57:15 瀏覽:899
集合文件夾 發布:2023-02-01 10:56:18 瀏覽:63
刺刀編程 發布:2023-02-01 10:56:07 瀏覽:380
90番號ftp 發布:2023-02-01 10:56:07 瀏覽:815
ftp刪除命令 發布:2023-02-01 10:52:25 瀏覽:876
qq空間訪問排名 發布:2023-02-01 10:51:39 瀏覽:867
qq泄露資料庫 發布:2023-02-01 10:44:22 瀏覽:154
登錄賬號與密碼如何記住 發布:2023-02-01 10:39:36 瀏覽:44