Analiza algorytmu Euklidesa

Z Lem
Skocz do: nawigacji, wyszukiwania

Należy udowodnić że algorytm zawsze kończy obliczenia.

Zacznijmy od obserwacji, że algorytm Euklidesa w niestandardowym modelu liczb naturalnych może nie zakończyć obliczeń.

Na jakich podstawach ma się oprzeć dowód własności stop algorytmu?

Algorytmiczne aksjomaty liczb naturalnych:

(N1) (n)(n+10)
(N2) (n)(m)(n+1=m+1n=m)
(N3) (n)[m:=0;while mn do n:=n+1 od](m=n)

Możemy zdefiniować relacje mniejszości

Definicja

x\lty df ¬(x=y)[r:=0;while rxrydor:=r+1od](r=x)

             Definicja

xy df [r:=0;while rxrydor:=r+1od](r=x)

oraz operację odejmowania

Definicja

Jeśli y<x

to operacja odejmowania jest określona tak

x.y df [r:=y; q:=0;while rx dor:=r+1; q:=q+1 od;](wynik=q)

i operację dodawania

Definicja Operacja dodawania jest określona tak

x+y df [r:=x; q:=0;while qy dor:=r+1; q:=q+1 od;](wynik=r)


Lemat (aksjomat Archimedesa)

Jeśli 0\ltn<m

to \color{blue} \left[\begin{array}{l}   r:=n;  \\  \mathbf{while}\ r \leq m \   \mathbf{do}  \quad r:=r+n;  \  \mathbf{od}; \\  \end{array} \right]  (r\gtm)

Dowód własności stop algorytmu Euklidesa

Gdyby algorytm Euklidesa miał obliczenie nieskończone dla pewnych liczb naturalnych n i m to stanowiłoby to zaprzeczenie aksjomatu (N3) liczb naturalnych.

W algorytmie występuje pętla zewnętrzna i dwie po kolei pętle wewnętrzne. W każdym przypadku obliczenia pętli wewnętrznych są skończone. Wynika to wprost z aksjomatu (N3). Nieco trudniej jest zauważyć, że obliczenie pętli wewnętrznej jest także skończone. Wychodząc z drugiej pętli wewnętrznej osiągnęliśmy większą z dwu liczb n, m zaczynając od zera i dodając pracowicie jeden. W każdym kolejnym wykonaniu instrukcji iterowanych w pętli zewnętrznej większa z liczb n,m jest zmniejszana bo nm

. Więc, po conajwyżej max(n,m)
powtórzeniach pętli zewnętrznej, algorytm Euklidesa, w tej postaci, zatrzyma się. Ale po kolei: Z aksjomatu (N3) wynika, że

{r:=0;while rn do r:=r+1 od} r=n

Wykorzystując następującą regułę wnioskowania

αβwhile β do K od ¬βwhile α do K od ¬α

wnioskujemy, że

{r:=0;while rnrm do r:=r+1 od} (r=nr=m)

Z założenia nm

wynika, że

{r:=0;while rnrm do r:=r+1 od} (r=min(n,m))

Udowodniliśmy więc, że

{if nmthenr:=0;while rnrm do r:=r+1 od;if r=nthenn_mniejsze:=true; max:=melsen_mniejsze:=false; max:=nfi;fi} ((r=nn\ltm)(r=mm\gtn)max=max(n,m))

Jeszcze raz korzystamy z aksjomatu (N3)

{r:=0;while rmax do r:=r+1 od} r=max

{if nmthenr:=0;while rnrm do r:=r+1 od;if r=nthenn_mniejsze:=true; max:=melsen_mniejsze:=false; max:=nfi;r:=0;while rmax do r:=r+1 odfi} (r=maxmax=max(n,m))

Skorzystam z prawa przerwania i wznowienia podróży

{r:=0;while rmax(n,m)dor:=r+1od;} (r=max(n,m)){r:=0;while rmin(n,m)dor:=r+1od;if r=nthenn_mniejsze:=true;max:=melsen_mniejsze:=false;max:=nfi;while rmaxdor:=r+1od} (r=max(n,m))

by uzyskać

{if nmthenr:=0;while rnrm do r:=r+1 od;if r=nthenn_mniejsze:=true; max:=melsen_mniejsze:=false; max:=nfi;q:=0while rmaxdor:=r+1; q:=q+1odfi}((r=maxmax=max(n,m))((n_mniejszeq=mn)(¬n_mniejszen=nm)))

w tym programie wstawiam instrukcję

if n\_mniejsze then m:=q else n := q fi

{if nmthenr:=0;while rnrm do r:=r+1 od;if r=nthenn_mniejsze:=true; max:=melsen_mniejsze:=false; max:=nfi;q:=0while rmaxdor:=r+1; q:=q+1od;if n_mniejsze then m:=q else n:=q fi;fi} (r=maxmax=max(n,m))

Dowód poprawności algorytmu Euklidesa

Należy wykazać, że wynik algorytmu Euklidesa to największy wspólny dzielnik.

Z postaci programu widać, że wynik jest największą liczbą n

, mniejszą od max(x,y)
taką, że ... n|x
i n|y
. Algorytm wyznacza ciąg par {ni,mi}
taki, że

n1,m1=x,y
ni+1,mi+1={nimi,migdy ni\gtmini,minigdy ni\ltminiezdefiniowanygdy ni=mi

zachodzi przy tym

NWD(ni+1,mi+1)=NWD(ni,mi)

Ciąg wartości max(ni,mi)

jest ciągiem ściśle malejącym.

przejdź do algorytmu Euklidesa
powrót do wybrane przykłady