V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2



Podobné dokumenty
Dijkstrův algoritmus

Úvod do programování

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

Mimo samotné správnosti výsledku vypočteného zapsaným algoritmem je ještě jedno

Násobení pomocí sčítání

Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Digitální učební materiál

10 Důkazové postupy pro algoritmy

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk

Programování I. Martin Pergel,

NPRG030 Programování I RNDr.Tomáš Holan, Ph.D. 4.patro, č

Algoritmizace složitost rekurzivních algoritmů. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Matematická logika. Rostislav Horčík. horcik

Úvod do programování 7. hodina

NMIN101 Programování 1 2/2 Z --- NMIN102 Programování /2 Z, Zk

Sada 1 - Základy programování

Lineární algebra : Násobení matic a inverzní matice

Obsah. Euler-Fermatova věta. Reziduální aritmetika. 3. a 4. přednáška z kryptografie

Vrcholová barevnost grafu

Příklady: (y + (sin(2*x) + 1)*2)/ /2 * 5 = 8.5 (1+3)/2 * 5 = /(2 * 5) = 1.3. Pavel Töpfer, 2017 Programování 1-3 1

Lineární algebra : Násobení matic a inverzní matice

Závěrečná zkouška z informatiky 2011

FIT ČVUT MI-LOM Lineární optimalizace a metody. Dualita. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Programování I. Martin Pergel, 10. října Martin Pergel, Programování I

Testování prvočíselnosti

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

Časová a prostorová složitost algoritmů

Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.

TGH05 - aplikace DFS, průchod do šířky

53. ročník Matematické olympiády 2003/2004

TGH05 - aplikace DFS, průchod do šířky

Binární vyhledávací stromy pokročilé partie

Časová složitost / Time complexity

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

Poslední nenulová číslice faktoriálu

Principy indukce a rekursivní algoritmy

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Systém přirozené dedukce výrokové logiky

Hranová konzistence. Arc consistency AC. Nejprve se zabýváme binárními CSP. podmínka odpovídá hraně v grafu podmínek

Už známe datové typy pro representaci celých čísel i typy pro representaci

Základy algoritmizace a programování

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Program a životní cyklus programu

Příklad. Řešte v : takže rovnice v zadání má v tomto případě jedno řešení. Pro má rovnice tvar

NPRG030 Programování I, 2018/19 1 / :25:37

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

TGH06 - Hledání nejkratší cesty

Základy řazení. Karel Richta a kol.

Základy matematické analýzy

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

Fibonacciho čísla na střední škole

Přijímací zkouška na navazující magisterské studium 2017

Digitální učební materiál

TGH06 - Hledání nejkratší cesty

Lenka Zalabová. Ústav matematiky a biomatematiky, Přírodovědecká fakulta, Jihočeská univerzita. zima 2012

NMIN101 Programování 1 2/2 Z --- NMIN102 Programování /2 Z, Zk

Lineární algebra : Polynomy

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Union-Find problém. Kapitola 1

Úvod do informatiky. Miroslav Kolařík

Anotace. Dynamické programování, diskrétní simulace.

Cykly. Základy programování 1 Martin Kauer (Tomáš Kühr)

Digitální učební materiál

Zavedení a vlastnosti reálných čísel

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Rekurentní rovnice, strukturální indukce

Algoritmizace. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Přijímací zkouška na navazující magisterské studium 2015

Věta o dělení polynomů se zbytkem

Příklad 1/23. Pro rostoucí spojité fukce f(x), g(x) platí f(x) Ω(g(x)). Z toho plyne, že: a) f(x) Ο(g(x)) b) f(x) Θ(g(x)) d) g(x) Ω(f(x))

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Doba běhu daného algoritmu/programu. 1. Který fragment programu z následujících dvou proběhne rychleji?

Úvod do problematiky

Učební texty k státní bakalářské zkoušce Matematika Základy lineárního programování. študenti MFF 15. augusta 2008

Algoritmy I, složitost

5. přednáška - Rozklad problému na podproblémy

Konstrukce relace. Postupně konstruujeme na množině všech stavů Q relace i,

ALGEBRA. Téma 4: Grupy, okruhy a pole

Programovani v Maplu Procedura

Digitální učební materiál

Identifikátory označují objekty v programu používané (proměnné, typy, podprogramy).

Implementace LL(1) překladů

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem

= je prostý orientovaný graf., formálně c ( u, v) 0. dva speciální uzly: zdrojový uzel s a cílový uzel t. Dále budeme bez

Univerzita Karlova v Praze Pedagogická fakulta

Stromy, haldy, prioritní fronty

C# konzole Podíl dvou čísel, podmínka IF

59. ročník Matematické olympiády 2009/2010

Základní datové struktury III: Stromy, haldy

Regulární výrazy. Definice Množina regulárních výrazů nad abecedou Σ, označovaná RE(Σ), je definována induktivně takto:

Pomocný text. Polynomy

Transkript:

Euklidův algoritmus Doprovodný materiál pro cvičení Programování I. NPRM044 Autor: Markéta Popelová Datum: 31.10.2010 Euklidův algoritmus verze 1.0 Zadání: Určete největšího společného dělitele dvou zadaných přirozených čísel a 0 a b 0. Vstup: a 0, b 0. Výstup: NSD(a 0, b 0 ). Algoritmus: 1. a a 0, b b 0. (Do a dosad a 0 a do b dosad b 0.) 2. Dokud a b: 2.1. Jestliže a < b : 2.1.1. a b. (Prohod a a b.) 2.2. a a b. (Do a dosad a b.) 3. Vrat a. (Výsledek je a.) Důkaz konečnosti: V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2 kladná (přirozená) čísla a odečítáme vždy menší od většího, tak nemůžeme získat číslo záporné. Nemůžeme získat ani 0, nebot to by se stalo jen tehdy, že by čísla byla stejná - v takovém případě bychom již skončili a vydali výsledek. Proto bude mít a + b stále kladnou hodnotu. A jelikož se pokaždé alespoň o jedna sníží, tak proběhne nejvýše a + b průchodů cyklem - a pak algoritmus skončí. Důkaz správnosti: Pozorování: Pro a > b platí: d a & d b d a b & d b. Důkaz. 2. 1. Necht d je společný dělitel čísel a i b. Pak existují přirozená čísla x a y, že Pak ale d je i dělitelem a b, nebot A triviálně d dělí i b. a = d x a b = d y. a b = d x d y = d (x y). Necht d je dělitel a b i b. Pak existují přirozená čísla x a y, že Pak d je dělitelem i a, nebot a b = d x a b = d y. a = a b + b = d x + d y = d (x + y). 1

Důsledek: Pro a > b platí NSD(a, b) = NSD(a b, b). Důkaz. Jelikož všichni dělitelé a a b dělí i a b a b a naopak, tak i ten největší musí být stejný. Tedy NSD(a, b) = NSD(a b, b). Pozorování: Pro jakákoliv přirozená a, b platí: NSD(a, b) = NSD(b, a). Pozorování: Po celou dobu běhu algoritmu platí invariant NSD(a 0, b 0 ) = NSD(a, b). Důkaz. (Matematickou indukcí dle doby běhu algoritmu) 1. Na začátku algoritmu (před prvním průchodem cyklem) to triviálně platí. NSD(a 0, b 0 ) = NSD(a 0, b 0 ) 2. (IP) Necht jsme na konci n-tého průchodu cyklem. Hodnoty v a a b si označme a a b. Necht pro tyto a a b platí indukční předpoklad: NSD(a 0, b 0 ) = (a, b). 3. (IK) Co se děje v následujícím průchodu cyklem? Nejdříve možná prohodíme a a b, to ale víme, že největší společný dělitel nemění. Neboli NSD(a, b) = NSD(b, a). Pak ale jen do a uložíme a b. A to jsme si taktéž ukázali, že největší společný dělitel nemění: NSD(a, b) = NSD(a b, b). Tedy největší společný dělitel čísel a, b před tímto průchodem cyklem je stejný jako před příštím průchodem cyklem. Pozorování: NSD(a, a) = a. Důsledek: Algoritmus vydá po konečně mnoha krocích správný výsledek. Odhad pamět ové složitosti: Pamět ová složitost je konstantní, nebot nám ke všem výpočtům si stačí pamatovat jen dvě čísla aktuální a a b a možná jedna pomocná proměnná na výměnu. Tedy M(n) Θ(1). Odhad časové složitosti: Již při důkazu konečnosti jsme ukázali, že algoritmus uskuteční nejvýše a + b průchodů cyklem. V jednom průchodu cyklem se provede konstantně mnoho operací (výměna dvou proměnných, odečtení a uložená výsledku). Tedy můžeme časovou složitost odhadhnout shora T (n) O(a + b). Implementace v Pascalu: program NSD1; {Načte dvě čísla ze vstupu a vypíše na výstup jejich největšího společného dělitele. K tomu využívá euklidův algoritmus 1.0, tedy tak dlouho odečítám menší číslo od většího, až dostanu dvě stejná čísla, což je NSD zadaných čísel.} var a,b,pom : integer; read(a,b); while (a <> b) do if (a < b) then a := a-b; write(a); end. 2

Euklidův algoritmus verze 2.0 Pozorování: Pokud bylo jedno číslo o mnoho větší než druhé, algoritmus zbytečně dlouho odečítá menší od většího. Těchto několik kroků by se dalo nahradit výpočtem zbytku po dělení. To přesně provádí operace modulo. Předpokládejme, že tato operace (např. pro čísla typu integer) trvá konstantně dlouho. Pak můžeme původní algoritmus zrychlit. Zadání, vstup a výstup jsou stejné jako u Euklidova algoritmu verze 1.0. Změníme pouze algoritmus a implementaci + si dokážeme lepší časovou složitost. Algoritmus: 1. a a 0, b b 0. (Do a dosad a 0 a do b dosad b 0.) 2. Jestliže a < b: 2.1. a b. (Prohod a a b.) 3. Dokud b 0: 3.1. a a mod b. (Do a dosad a mod b. Tím je určitě a < b.) 3.2. a b. (Prohod a a b, aby zase platilo a b.) 4. Vrat a. (Výsledek je a.) Důkaz správnosti: Rozmysleme si, že tento algoritmus oproti verzi 1.0 je jiný jen v tom, že několik průchodů cyklem s odečítáním nahradíme jedním dělením se zbytkem. Pro představu (o kolik kroků si můžeme pomoci) se podívejme na tento příklad: Necht a = 51 a b = 5, tak hodnoty a, b po jednotlivých průchodech cyklem jsou: 46; 5 41; 5 36; 5 29; 5 26; 5 19; 5 16; 5 9; 5 6; 5 1; 5 1; 1 Místo toho algoritmus verze 2.0 pro stejné vstupní hodnoty bude probíhat: 5; 1 1; 0 A jelikož je jinak tento algoritmus stejný jako ten předchozí, je i tento algoritmus správný, tedy počítá největší společný dělitel dvou čísel. Změní se jen, jak dlouho mu to trvá. A na to se podívejme hned v následujícím odstavci. Odhad časové a pamět ové složitosti: Pozorování: Jsme-li někde v průběhu Euklidova algoritmu verze 2.0 (na začátku průchodu cyklem), pak se během následujících dvou iterací a i b změnší alespoň dvakrát. Důkaz. Označme si a 0, b 0 před iteracemi. Po první iteraci jejich hodnoty označme a 1, b 1. Po druhé iteraci je označme a 2, b Platí tedy a 1 = b 0 b 1 = a 0 mod b 0 Chceme ukázat, že a 2 = b 1 b 2 = a 1 mod b 1. a 2 a 0 2 a b 2 b 0 3

Nejdříve si uvědomme, že pro čísla x > y pokud z = x mod y, tak x < y (zbytek po dělení y bude určitě menší než y). Pak platí následující vztahy: b 1 = a 0 mod b 0 b 1 < b 0, b 2 = a 1 mod b 1 = b 0 mod b 1 b 2 < b 1. (a) Necht platí b 1 b0 Pak b 2 < b 1 b 0 (b) Jinak b 1 > b0 Pak ale (plyne z obrázku) b 2 < b 0 Obdobně ukážeme, že Z průběhu algoritmu víme, že Následuje úvaha analogická jako u b: a 2 < a 0 a 1 = b 0 < a 0 a 1 < a 0, a 2 = b 1 = a 0 mod b 0 = a 0 mod a 1 a 2 < a 1. (a) Necht platí a 1 a0 Pak a 2 < a 1 a 0 (b) Jinak a 1 > a0 Pak ale a 2 < a 0 Díky předchozímu tvrzení víme, že počet iterací Euklidova algoritmu verze 2.0 bude nejvýše 2 ( log 2 a + log 2 b ). Proto platí, že asymptotická časová složitost tohoto vylepšeného algoritmu je O(log a + log b). Pamět ová složitost je stejně jako u předchozího algoritmu konstantní. 4

Implementace v Pascalu: program NSD2; {Načte dvě čísla ze vstupu a vypíše na výstup jejich největšího společného dělitele. K tomu využívá euklidův algoritmus 2.0, tedy dlouhé odečítání z verze 1.0 nahradí operací modulo.} var a,b,pom : integer; read(a,b); if (a < b) then while ( b <> 0 ) do a := a mod b; write(a); end. 5