Zastosowania algorytmu Euklidesa

Transkrypt

Zastosowania algorytmu Euklidesa
(C)2005 RoG@j
Zastosowania
algorytmu Euklidesa
2005-04-07
Przelewanie wody
!
Problem przelewania wody
Rozszerzony Euklides
Algorytm i jego realizacja
Kod w VBA
Kiedy zadanie ma rozwiązanie
!
!
!
Aby zadanie miało rozwiązanie musi być:
mx + ny = k
Równanie to dla danych m, n i k ma
rozwiązanie x i y gdy k jest równe NWD(m,n)
- k może być również wielokrotnością
NWD(m,n)
Aby to zadanie rozwiązać należy zastosować
algorytm Euklidesa niejako od tyłu.
Krok po kroku… (1)
!
Zapiszmy kolejne kroki przyjmując, że
a0=n, a1=m, al+1=0, al=NWD(m,n)
!
!
!
!
!
!
Alg 25
a0 = q1a1 + a2
a1 = q2a2 + a3
…
al-1 = qlal + al+1
Szukamy NWD(m,n)=mx+ny
Będziemy tworzyć ciągi x i y…
Dysponując dwoma czerpakami o
pojemności m=4 i n=6 litrów, pustym
pojemnikiem o nieograniczonej pojemności i
nieograniczoną ilością wody napełnij
pojemnik k=14 litrami wody przy założeniu,
że wodę można wlewać lub wylewać z
pojemnika tylko pełnymi czerpakami.
!
X i y to liczby „ruchów” (wlań i wylań) czerpaków
min
Równanie diofantyczne
!
!
Prowadzi to do tzw. rozszerzonej wersji
algorytmu Euklidesa
Przedstawiane równanie jest szczególnym
przypadkiem równania diofantycznego, w
którym współczynniki są liczbami całkowitymi
i rozwiązanie również składa się z liczb
całkowitych
Krok po kroku… (2)
!
!
ai=mxi+nyi dla i=0,1,2,…,l
Po zakończeniu algorytmu końcowe wartości
będą rozwiązaniem
Jak wyznaczać elementy ciągów x i y?
!
!
!
n = a0 = mx0 + ny0, czyli x0 = 0, y0 = 0
m = a1 = mx1 + ny1, czyli x1 = 1, y1 = 0
Po dodatkowych przekształceniach mamy:
xi+1 = xi-1 - qixi
oraz
yi+1 = yi-1 - qiyi
1
(C)2005 RoG@j
2005-04-07
Krok po kroku… (3)
i
ai
0
21
1
12
2
qi
Rozszerzony Euklides
xi
yi
!
0
1
!
1
1
0
9
1
-1
1
3
3
3
2
-1
4
0
Kolejne kroki…
!
!
!
!
!
!
q = a div a’
z = a’ a’ = a – q a’
z = x’ x’ = x – q x’
z = y’ y’ = y – q y’
a=z
x=z
y=z
!
!
a=n,
x=0,
y=1,
a’=m
x’=1
y’=0
!
!
Nie będziemy ani omawiać skąd się wziął ten
algorytm, ani dowodzić jego poprawności
Spróbuj wykonać ten algorytm (rozwiązać
zadanie przelewania wody) dla
następujących argumentów
!
!
Pojemności czerpaków wynoszą 12 i 21 litrów
W naczyniu mają pozostać 3 litry wody
Krok 4: Wróć do kroku 2
Kod w VBA (1)
Sub Eukl2()
Dim m As Long
Dim n As Long
Dim k As Long
Dim a As Long
Dim a_ As Long
Dim x As Long
Dim x_ As Long
Dim y As Long
Dim y_ As Long
Dim q As Long
Dim z As Long
Alg 25
!
Co z tym zrobić?
Krok 2: Jeśli a’=0 to a=NWD(m,n)
x i y stanowią rozwiązanie problemu
mx+ny=k dla k=NWD(m,n) KONIEC
Krok 3: Wykonaj przypisania
!
!
Dane: Dwie liczby naturalne m i n (m<=n)
Wyniki: NWD (m,n)
x, y dla równania mx+ny=k
Krok 1: Przypisanie wartości poczatkowych
Kod w VBA (2)
m = InputBox("m")
n = InputBox("n")
k = InputBox("k")
…
MsgBox x &Chr(13)& y
End Sub
Do Until a_ = 0
q = a \ a_
a = n
a_ = m
x = 0
x_ = 1
y = 1
y_ = 0
z = a_
a_ = a - q * a_
a = z
z = x_
x_ = x - q * x_
x = z
z = y_
y_ = y - q * y_
y = z
Loop
2

Podobne dokumenty