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