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