1樓:電燈劍客
演算法本身的正確性用
邏輯推理來證明,和數學定理類似
實現演算法的程式的正確性則是兩碼事
簡單的程式也用邏輯推理來證明,稍複雜的可以用某些專門驗證程式正確性的程式來驗證,再複雜的就沒什麼好辦法了,事實上很多複雜的程式在比較極端的輸入下或多或少都會有點問題
如何證明這種歐幾里得演算法的正確性
2樓:蕭甜舔
歐幾里德演算法又稱輾轉相除法,用於計算兩個整數a,b的最大公約數.其計算原理依賴於下面的定理:
定理:***(a,b) = ***(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***(int a,int b)
當然你也可以寫成迭代形式:
int***(int a,int b)
returna;}
本質上都是用的上面那個原理.
補充:擴充套件歐幾里德演算法是用來在已知a,
b求解一組x,y使得a*x+b*y=***(a,b)(解一定存在,根據數論中的相關定理).擴充套件歐幾里德常用在求解模線性方程及方程組中.下面是一個使
用c++的實現:
&y)int r =
ex***(b,a % b,x,y);
int t =
x;x =
y;y = t - a
/ b * y;
returnr;}
把這個實現和***的遞迴實現相比,發現多了下面的x,y賦值過程,這就是擴充套件歐幾里德演算法的精髓.
可以這樣思考:
對於a' = b,
b' = a % b 而言,我們求得 x,y使得 a'x + b'y = ***(a',b')
由於b' = a
% b = a - a / b * b (注:這裡的/是程式設計語言中的除法)
那麼可以得到:
a'x + b'y
= ***(a',b') ===>
bx + (a - a / b * b)y = ***(a',b') = ***(a,b)
===>
ay +b(x - a / b*y) = ***(a,b)
因此對於a和b而言,他們的相對應的p,q分別是
y和(x-a/b*y).
在網上看了很多關於不定方程方程求解的問題,可都沒有說全,都只說了一部分,看了好多之後才真正弄清楚不定方程的求解全過程,步驟如下:
求a * x
+ b * y = n的整數解.
1、先計算***(a,b),若n不能被***(a,b)整除,則方程無整數解;否則,在方程兩邊同時除以***(a,b),得到新的不定方程a'
* x + b' * y = n',此時***(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)計算***(a,b).若***(a,b)不能整除n,則方程無整數解;否則,在方程的兩邊同除以***(a,b),
得到新的不定方程a'x + b'y = n',此時***(a',b') = 1
(2)求出不定方程a'x + b'y = 1的一組整數解x0,y0,則n'x0,n'y0是方程a'x + b'y = n'的一組整數解.
(3)根據&@^%w#&定理,可得方程a'x + b'y = n'的所有整數解為:
x = n'x0 + b't
y = n'y0 - a't
(t為整數)
這也就是方程ax + by = n的所有整數解
利用擴充套件的歐幾里德演算法,計算***(a,b)和滿足d = ***(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 ***(a,b:longint):longint;
var i:longint;
begin
if a=0 then exit(b);
if b=0 then exit(a);
***:=***(b,a mod b);
end;
procedure extend_***(a,b:longint;var x,y:longint);
var i,j:longint;
begin
if b=0 then
begin
x:=1;
y:=0;
exit
end;
extend_***(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:=***(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_***(a,b,x,y);
x:=c*x;
y:=c*y;
writeln(x,' ',y);
end.
計算教學中如何正確處理算理和演算法的關係
計算的算理是指計算的理論依據,通俗地講就是計算的道理。算理一般由數學概念 定律 性質等構成,用來說明計算過程的合理性和科學性。計算的演算法是計算的基本程式或方法,是算理指導下的一些人為規定,用來說明計算過程中的規則和邏輯順序。算理和演算法既有聯絡,又有區別。算理是客觀存在的規律,主要回答 為什麼這樣...
如何用遺傳演算法實現多變數的最優化問題
將多個變數的數值編碼編排進去,進行組合,只需要增長基因個體的長度,但是要明確每個變數具體的位置,然後讓每個變數轉化成二進位制的等長編碼,組合在一起,就可以來運算了。具體操作步驟如下 1 首先要利用一個矩陣去跟蹤每組迭代的結果的大小 2 然後,要構造一個譯碼矩陣fieldd,由bs2rv函式將種群ch...
如何提高預算的正確性,如何提高預算編制的規範化與科學性
一 不斷提高預算編制水平。財政預算作為國家行使分配職能,保障社會經濟健康 協調發展的重要手段,預算編制水平直接影響財政預算執行的結果。預算編制中主要的問題是部門預算批覆滯後,給預算執行帶來不利影響,因些要提高部門預算到位率 預算編制不夠細化,預算執行中隨意性很大 預算編制不科學,預算編制內容不完整。...