K NWD abaa K bb K = ⇒ = ⋅ ∧ = ⋅ , gdzie , L NWD a bb abc L bb L

Transkrypt

K NWD abaa K bb K = ⇒ = ⋅ ∧ = ⋅ , gdzie , L NWD a bb abc L bb L
Największy Wspólny Dzielnik NWD – dowód poprawności Algorytmu Euklidesa
Największy wspólny dzielnik liczb naturalnych a, b oznaczamy przez NWD(a,b).
Własności (bardzo łatwe do udowodnienia):
Lemat
1. NWD(a,a)=a
2. NWD(a,b)=NWD(a – b,b) jeśli a > b
3. NWD(a,b)=NWD(a,b – a) jeśli a < b
Dowód (tylko wariantu 2).
Niech a > b oraz niech
K = NWD ( a, b ) ⇒ a = aK ⋅ K ∧ b = bK ⋅ K , gdzie aK , bK > 0 , aK > bK , przy czym K > 0 jest
największą liczbą o tej własności oraz niech
(*)
L = NWD ( a − b, b ) ⇒ a − b = cL ⋅ L ∧ b = bL ⋅ L , gdzie cL , bL > 0 , przy czym L > 0 jest
największą liczbą o tej własności.
(**)
Z (*) wynika, Ŝe a − b = ( aK − bK ) ⋅ K stąd K dzieli a – b (oraz oczywiście K dzieli b).
A zatem na pewno K ≤ L na mocy (**).
Z (**) wynika, Ŝe a = a − b + b = ( cL + bL ) ⋅ L stąd L dzieli a (oraz oczywiście L dzieli b).
A zatem na pewno L ≤ K na mocy (*).
Stąd K = L .
CND.
Algorytm Euklidesa
start
naturalne a, b, nwd, A, B ;
czytaj a ;
czytaj b ;
A=a;
B=b;
dopóty dopóki a ≠ b wykonuj
jeśli a > b to a = a − b ;
w przeciwnym przypadku b = b − a ;
nwd = a ;
wyświetl A ;
wyświetl B ;
wyświetl nwd ;
koniec
Rozpatrzmy funkcję zdaniową P ( a, b ) zdefiniowaną następująco:
P ( a, b ) =  a > 0 ∧ b > 0 ∧ NWD ( a, b ) = NWD ( A, B ) 
gdzie a, b, A, B są identyfikatorami zmiennych zdefiniowanych w Algorytmie Euklidesa
Dowód poprawności algorytmu sprowadza się do stwierdzenia, Ŝe funkcja zadaniowa
P ( a, b ) jest prawdziwa w kaŜdym kroku algorytmu oraz, Ŝe liczba kroków algorytmu
jest liczbą skończoną.
Dowód (por. np. Turski W.M., Propedeutyka Informatyki, PWN).
Bezpośrednio przed rozpoczęciem iteracji funkcja P ( a, b ) jest oczywiście prawdziwa pod
warunkiem, Ŝe wczytamy liczby naturalne a i b.
Iteracja jest wykonywana pod warunkiem, Ŝe a ≠ b , czyli mamy albo przypadek a > b albo
przypadek a < b .
Jeśli a > b , to działanie wykonywane w obrębie iterowanej instrukcji nie zmieni b, natomiast
a pozostanie dodatnie. Ponadto będzie prawdziwa relacja NWD ( a, b ) = NWD ( A, B ) na mocy
Lematu (wariant 2). A zatem wartość logiczna funkcji P ( a, b ) będzie prawdą.
Podobne rozumowanie przeprowadzamy dla przypadku a < b .
Iteracja moŜe zakończyć się tylko w przypadku kiedy a = b , przy czym zawsze będzie
spełniony warunek a > 0 ∧ b > 0 . A zatem funkcja P ( a, b ) takŜe i w tym szczególnym
przypadku będzie miała wartość logiczną prawda (mówimy wtedy, Ŝe funkcja P ( a, b ) jest
niezmiennikiem iteracji). Instrukcje, które następują po instrukcji pętli nie mają juŜ wpływu
na wartość logiczną funkcji P ( a, b ) .
ZauwaŜmy ponadto, Ŝe jeśli a = b , to na mocy Lematu (wariant 1)
NWD (a, b) = NWD (a, a ) = a i skoro funkcja P ( a, b ) jest prawdziwa w kaŜdym kroku
algorytmu (jak to zostało wykazane wyŜej), więc NWD ( A, B ) = a = nwd (po podstawieniu a
do nwd ).
Pozostaje jeszcze do udowodnienia, Ŝe iteracja musi się zakończyć, ale zauwaŜmy, Ŝe wobec
zmniejszania liczby dodatniej o liczbę dodatnią w taki sposób, Ŝe wynik zawsze pozostaje
dodatni, nie jest zatem moŜliwe (wobec załoŜonej skończoności wczytywanych liczb a i b)
aby instrukcje te mogły być powtarzane nieskończoną liczbę razy.
CND.