30
Programování: základní konstrukce, příklady IB111 Programování a algoritmizace 2010

ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Programování: základní konstrukce, příklady

IB111 Programování a algoritmizace

2010

Page 2: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Připomenutí z minule, ze cvičení

proměnné, výrazy, operaceřízení výpočtu: if, for, whilefunkcepříklady: faktoriál, převod na binární zápis, dělitelé,prvočísla

Page 3: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Z DÚ: ciferný součet

if n % 10 == 0:f = 0 + f

elif n % 10 == 1:f = 1 + f

elif n % 10 == 2:f = 2 + f

elif n % 10 == 3:f = 3 + f

elif n % 10 == 4:f = 4 + f

...

Page 4: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Z DÚ: čtverec

def ctverec(n):for i in range(1, n):

print "*" * iif i == n-1:

p = 1while n+1 > p:

print "*" * nn = n - 1

Page 5: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Příklad: Největší společný dělitel

vstup: přirozená čísla a, bvýstup: největší společný dělitel a, bpříklad: 180, 252

Jak na to?

Page 6: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Naivní algoritmus I

projít všechny čísla od 1 do min(a, b)pro každé vyzkoušet, zda dělí a i bvzít největší

Page 7: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Naivní algoritmus II

„školníÿ algoritmusnajít všechny dělitele čísel a, bprojít dělitele, vybrat společné, vynásobitpříklad:

180 = 22 · 32 · 5504 = 23 · 32 · 7NSD = 22 · 32 = 36

Page 8: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Euclidův algoritmus: základ

základní myšlenka: pokud a > b, pak:

NSD(a, b) = NSD(a − b, b)

příklad:

krok a b1 504 1802 324 1803 180 1444 144 365 108 366 72 367 36 368 36 0

Page 9: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Operace modulo

modulo = zbytek po dělenípříklady:

13 mod 5 = 328 mod 4 = 014 mod 3 = 218 mod 7 = ??29 mod 13 = ??

Page 10: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Euclidův algoritmus: vylepšení

vylepšená základní myšlenka: pokud a > b, pak:

NSD(a, b) = NSD(a mod b, b)

krok a b1 504 1802 180 1443 144 365 36 366 36 0

Page 11: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Euclidův algoritmus: pseudokód

odčítací varianta, bez rekurze

def nsd(a,b):if a == 0:

return bwhile b != 0:

if a > b:a = a - b

else:b = b - a

return a

Page 12: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Euclidův algoritmus: pseudokód

modulo varianta, rekurzivně

def nsd(a,b):if b == 0:

return aelse:

return nsd(b, a % b)

Page 13: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Příklady

160, 7557, 33

Page 14: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Efektivita algoritmů

proč byly první dva algoritmy označeny jako „naivníÿ?časová náročnost algoritmu:

naivní: exponenciální vůči počtu cifereuclidův: lineární vůči počtu cifer

různé algoritmy se mohou výrazně lišit svou efektivnostíčasto rozdíl použitelné vs nepoužitelnévíce později

Page 15: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Příklad: hledání všech dělitelů

vstup: číslo Nvýstup: seznam všech dělitelů Nco když chceme nejen dělitele vypsat, ale dále s nimipracovat

Page 16: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Pole (seznamy)

„více položek za sebou v pevném pořadíÿindexováno od nuly!základní koncept dostupný ve všech jazycích: „poleÿ(array), položky stejného typu, pevně daná délka

Page 17: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Seznamy v Pythonu

seznam (list), n-tice (tuple)položky mohou být různého typuvariabilní délkaindexování i od konce (pomocí záporných čísel)

Page 18: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Seznamy: použití v Pythonu

s = [] # deklarace prázdného seznamus = [3, 4, 1, 8 ]s[2] # indexace prvku, s[2] = 1s[-1] # indexace od konce, s[-1] = 8s[2] = 15 # změna prvkus.append(6) # přidání prvkus[1:4] # indexace intervalu, s[1:4] = [4, 15, 8]len(s) # délka seznamu, len(s) = 5t = [ 3, "pes", [2, 7], -8.3 ]

# seznam může obsahovat různé typy

Page 19: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Python: seznamy a cyklus for

cyklus for – přes prvky seznamurange – vrací seznam číseltypické použití: for i in range(n)ale můžeme třeba i:for x in ["pes", "kocka", "prase"]:

Page 20: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Objekty, hodnoty, aliasy

parametry funkcí – pouze volání hodnotou(narozdíl např. od Pascalu: volání hodnotou a odkazem)měnitelné objekty (např. seznam) však funkce může měnitvíce na cvičeních, později

Page 21: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Řetězce

řetězec ∼ seznam znakůpráce s řetězcem analogická práci s seznamem(indexování, . . .)řetězec je však neměnitelný (immutable)

Page 22: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Prvočísla

dělitelné jen 1 a sebou samýmpředmět zájmu matematiků od pradávna, cca od 70. let(moderní kryptologie) i důležité aplikaceproblémy s prvočísly:

výpis (počet) prvočísel v intervalutest prvočíselnostirozklad na prvočísla (hledání dělitelů)

Page 23: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Eratosthenovo síto

problém: výpis prvočísel od 2 do nalgoritmus: opakuj:

označ další neškrtnuté číslo na seznamu jako prvočíslovšechny násobky tohoto čísla vyškrtni

Page 24: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Test prvočíselnosti

ProblémVstup: číslo nVýstup: ANO/NE (je/není prvočíslo)

Page 25: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Test prvočíselnosti: naivní algoritmus

zkoušíme všechny možné dělitele od 2 do n − 1vylepšení:

dělíme pouze lichými číslydělíme pouze čísly tvaru 6k ± 1dělíme pouze do

√n

Page 26: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Test prvočíselnosti: chytřejší algoritmy

náhodnostní algoritmypolynomiální deterministický algoritmus (objeven 2002)(vysoce) nad rámec tohoto kurzuumí se to dělat rychle

Page 27: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Rozklad na prvočísla

rozklad na prvočísla = faktorizacenaivní algoritmy:

průchod všech možných dělitelůzlepšení podobně jako u testů prvočíselnosti

chytřejší algoritmy:složitá matematikaaktivní výzkumná oblastneumí se to dělat rychlemax cca 200 ciferná čísla

Page 28: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Aplikace: asymetrická kryptologie

Page 29: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Asymetrická kryptologie: realizace

jednosměrné funkcejednoduché vypočítat jedním směremobtížné druhým (inverze)ilustrace: míchání barev

RSA (Rivest, Shamir, Adleman) algoritmusjednosměrná funkce: násobení prvočísel (inverze =faktorizace)veřejný klíč: součin velkých prvočíselbezpečnost ∼ nikdo neumí provádět efektivně faktorizacivyužití modulární aritmetiky, Eulerovy věty, . . .

Page 30: ProgramovÆní: zÆkladní konstrukce, płíklady · 2010. 10. 11. · IB111 Programování a algoritmizace Created Date: 10/8/2010 9:25:02 AM

Další důležité programátorské konstrukce

vstup/výstup (input/output, IO):standardní IOsoubory

dělení projektu do více souborů (packages), použitíknihovensložitější datové typy, objekty

viz další přednášky, cvičení, samostudium