如何利用迴圈不變數證明演算法的部分正確性

2021-03-03 21:11:08 字數 3587 閱讀 2684

1樓:坎平源廈

理論證明(要考慮種特殊情況),再實驗(用隨機數測試,再做排序誤檢測函式,通量實驗),應該.

如何利用迴圈不變式證明演算法部分正確性

2樓:匿名使用者

就是個思想,說明正確演算法的迴圈過程中總是存在一個維持不變的特性,這個特性一直保持到迴圈結束乃至演算法結束,這樣就可以保證演算法的正確了。比方說插入排序,演算法每次迴圈後,前n個數一定是排好序的(n為已經迴圈的次數)。由於這個特性一直成

如何證明這種歐幾里得演算法的正確性

3樓:蕭甜舔

歐幾里德演算法又稱輾轉相除法,用於計算兩個整數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.

用java利用for迴圈 計算1

int sum 0 for int i 1 i 100 i system.out.println sum sum public static void main string args system.out.println sum public class test while num 100 sy...

php如何利用迴圈輸出資料庫表中所有記錄

問題肯定在你編寫的 上,請把 貼出來看看。你可以先換成foreach迴圈試一下。mysql select db infosystem link 選擇資料庫 q select from info sql查詢語句 mysql query set names gb2312 rs mysql query q...

「利用方程方法將無限迴圈小數,「利用方程方法將無限迴圈小數0321321321轉化為分數形式。」這道題怎摸做

321 999 0.321321321.1000 321.321321.321.321321.0.321321.321,即 0.321321.1000 1 3210.321321.321 999 如何將無限迴圈小數0.1666666.寫成分數的形式?無限迴圈小數襲0.1666666.寫成分數的bai...