在演算法實現中,演算法的正確性如何保證

2021-03-19 18:19:32 字數 3494 閱讀 2001

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...

如何提高預算的正確性,如何提高預算編制的規範化與科學性

一 不斷提高預算編制水平。財政預算作為國家行使分配職能,保障社會經濟健康 協調發展的重要手段,預算編制水平直接影響財政預算執行的結果。預算編制中主要的問題是部門預算批覆滯後,給預算執行帶來不利影響,因些要提高部門預算到位率 預算編制不夠細化,預算執行中隨意性很大 預算編制不科學,預算編制內容不完整。...