Dicsőségtabló Beadós programozási feladatok Hallgatói munkák 2017 2018
Pi számjegyeinek előállítása Készítő: Écsi Julius (MI, levelező, 2017) Elméleti háttér A π nevezetes konstans számjegyeinek előállítása már több ezer éve foglalkoztatja a tudósokat/kutatókat. A kézi számításokkal végigküzdött hosszú évszázadok után a számítógépes korszak hozott igazi áttörést ezen a területen. Az 1970-es évektől több új, direkt számítógépre optimalizált algoritmust is kifejlesztettek, amelyek gyors konvergenciát biztosítanak. Feltétlenül érdemes összehasonlítani az elkészült implementációk hatékonyságát is. Algoritmus Három nevezetes algoritmust implementálunk, ezek a következők: Machin módszere (1706 k.), a Chudnovsky testvérek algoritmusa (1990 k.) és a Bailey Borwein Plouffe algoritmus (1996 k.) Programozási környezet, fejlesztőeszközök Nyelv: Python 3.6 IDE: JetBrains PyCharm Mérésábrázolás: MS Excel 2016 2
Pi számjegyeinek előállítása Bailey Borwein Plouffe módszer Képlet Képlet implementációja Generáló eljárás Pontosság beállítása Generálás 3
Pi számjegyeinek előállítása Machin formula Képlet Képlet implementációja Generáló eljárás Pontosság beállítása Generálás Segédfüggvény Euler-féle arkusztangens a pontosabb számításért 4
Pi számjegyeinek előállítása Chudnovsky algoritmus Képlet Képlet implementációja Generáló eljárás Pontosság beállítása Generálás Segédfüggvény Newton-féle gyökszámítás a pontosabb számításért 5
Pi számjegyeinek előállítása Hatékonysági elemzés, összesítés Rendszerjellemzők Futási eredmények Sebességkülönbségek Jól látható a sebességnövekedés 6
Pi számjegyeinek előállítása Hatékonysági elemzés, összesítés/2. A Chudnovsky módszer futása (CPU és memória használat) 7
Számítástudomány Pi számjegyeinek előállítása A π 10000 jegyre 8
Eratoszthenész szitája Készítő: Maurer Márton (GI, nappali, 2017) Elméleti háttér A szita a neves ókori görög matematikus, Eratoszthenész módszere, amelynek segítségével egyszerű kizárásos algoritmussal meghatározhatjuk a prímszámokat 1 és n között Algoritmus Írjuk fel a számokat 1-től n-ig. Az 1-et már inicializáláskor kidobjuk, hiszen tudjuk róla, hogy nem prím, mivel Z-ben egység. A 2 az első szám, ami nincs lehúzva, ez lesz az első prím; az összes többszörösét húzzuk le a listáról Válasszuk ki a következő nem lehúzott számot (ez most a 3), ez lesz a következő prím. Ennek a számnak a többszöröseit is húzzuk le a listáról. Az előző lépés ismétlése, amíg a következő le nem húzott szám értéke kisebb mint Programozási környezet, jellemzők Java, NetBeans IDE 8.1 alatt GUI 9
Eratoszthenész szitája Futási idő, hatékonyság A futási idő alapvetően n nagyságától függ. (Tudjuk, hogy nagyobb n-ekre az eljárás már nem hatékony, ill. direkt módon nem is alkalmazható.) Minden egyes szitálás alatt végig kell nézni a teljes listát (O(n) maradékos osztás) A program felülete (részletek) Az n szám bekérése Végeredmény (n = 10000 esetén, a 2567 vizsgálata) 10
Eratoszthenész szitája A kód bemutatása 1. Szitál(int szám): lefuttatja a vizsgálatot a megadott szitáló szám -mal Akkor szitálja ki a vizsgált számot, ha az osztható maradék nélkül a szitáló számmal (azaz annak többszöröse) Fontos, hogy az éppen vizsgált szám ne úgy szitálódjon ki, mint a többszörösei (akkor a 1 szitálja ki, ami a prímszámot jelenti a programban) 11
Eratoszthenész szitája A kód bemutatása 2.: színek Egy táblázat (JTable) celláinak a módosításához felül kell definiálni az alapértelmezett cellákra vonatkozó Renderer utasítást. Ezek után már egyszerűen beállíthatjuk egy cella háttérszínét, ha tudjuk, hogy milyen színnel kell kitölteni (SzínVálasztó). 12
Eratoszthenész szitája A kód bemutatása 3.: színek (folyt.) SzínVálasztó(int szám): Kikeresi az szl listából a megadott számot és a hozzá tartozó színt Ha nem találjuk a listában a számot, akkor az utolsó színhez hozzárendeljük, majd egy új színt adunk a listához, aminek az RGB színkódját 0 és 255 közötti véletlenszámokból generáljuk 13
Eratoszthenész szitája A kód bemutatása 4.: színek (folyt.) A színekhez tartozó számok jelentése, és az alapértelmezett színek elhelyezkedése a listában Az első 11 prímszám mindig ugyanazt a színt kapja Szám 1 2 szám Jelentés Prímszám vagy nem kezelt szám A színhez nincs szám rendelve A szám szitálta ki 14
Eratoszthenész szitája A kód bemutatása 5.: a felhasználói interfész frissítése TáblaFrissít() a táblázat összes cellájának háttérszínét beállítja a megfelelő színre FeliratFrissít() a bal alsó sarokban található feliratokat frissíti (Lépésszám, Utolsó vizsgált elem) SzínFrissít() az utolsó használt színt megjeleníti a bal alsó sarokban Egyéb érdekesség, korlátok A program Integer adattípust használ a számok tárolásához. Ennek felső korlátját (2 147 483 647) nem léphetjük túl. Ez a korlát is csak elvi, mert ténylegesen csak jóval kevesebb számot lehet a memóriában elhelyezni (1 és n között minden számot tárolnunk kell) 15
Készítő: Maurer Márton (GI, nappali, 2017) Elméleti háttér Az Enigma üzenetek titkosítására és visszafejtésére használt, német gyártmányú, forgótárcsás, elektromechanikus berendezés A gép fő részei: billentyűzet, közös tengelyen forgó tárcsák, tárcsaléptető mechanizmus Az első változatok az 1920-as évek végén kerültek forgalomba, de a gép igazi nagy karrierje a II. világháború eseményeihez köthető A szövetségesek Alan Turing matematikus vezetésével, elektromechanikus számítógépekkel (pl. Turing-bomba) fel tudták törni a németek titkos üzeneteit (tengeralattjárók irányítása) Az Enigma szó a görög (αίνιγµα) szóból ered, amelynek jelentése: rejtély, rejtvény Az Enigma szimmetrikus kulcsú titkosítást használ; ennek hátránya, hogy mind az üzenetet kódolónak, mind a dekódolónak ismernie kell a titkos kulcsot A felhasznált külső képek forrása: Wikipedia (commons) 16
Algoritmus (szimuláció) Beállítjuk az Enigmát Választható a tárcsák száma, típusa, beállítása, ill. kapocstáblát is alkalmazhatunk (lásd később) Beírjuk a kódolandó/dekódolandó üzenetet A program betűnként (a tárcsák állásának megfelelően) kódolja/dekódolja az üzenetet, és hozzáfűzi az eredmény végéhez az új kódolt/dekódolt betűt Az Enigma belső működését később részletesen bemutatjuk Programozási környezet, jellemzők Java, NetBeans IDE 8.1 alatt GUI Futási idő, hatékonyság A futási idő függ a titkosítandó üzenet hosszától a tárcsák számától (hány elemen kell átküldeni egy betűt) a tárcsák típusától (forog/nem forog) 17
A program felülete (részletek) Tárcsák beállítása Betű illetve Szám (Enigma Z) állapotban 18
A program felülete (részletek) Titkosítás eredménye a HADITENGERESZET szóra (SLIMJMJKDCEWTVY) Dekódolás a SLIMJMJKDCEWTVY üzenetre (HADITENGERESZET) Tárcsák: V (X), BETA, V (G), III (O), I (A) Kapocstábla: alaphelyzet (nincs átkötés) 19
Az Enigma működése 1. (Az ábra kissé leegyszerűsített, a valóságban 26 lámpa és billentyű stb.) Ha a kezelő leüt egy billentyűt (2), akkor az akkumulátorból (1) elkezd folyni az áram, ami átfolyik a tárcsákon (5), megfordul (6) újra átfolyik a tárcsákon (5), ezek után egy lámpán (9) keresztül zárva az áramkört kódolja a karaktert A kapocstábla (7-8) segítségével a felhasználónak módja nyílik betűk kicserélésére (pl.: A-t Q-ra és Q-t A-ra). A karaktercsere végbemegy az üzenet kódolása előtt (3) és után (7-8) is. A kapocstábla használata növeli az üzenet titkosításának erősségét A német szárazföldi haderőnél három, a haditengerészetnél négy tárcsát alkalmaztak 20
Az Enigma működése 2. Tárcsák A leütések után a tárcsák elfordul(hat)nak, így az egyes betűk kódolása más és más lesz. Ezért nehéz az üzenet statisztikai módszerekkel való feltörése. Megj.: a haditengerészet által használt BETA és GAMMA tárcsák nem forognak. Ez is nehezítette a feltörést. Az ábrán látjuk, ahogy az áram átfolyik az egymás után kapcsolt tárcsákon és megfordul a fordítóban Az A betű két egymást követő leütésnél más és más betűt ad a példában először G-t, utána pedig C-t A két leütés között a jobb oldali tárcsa egyet már elfordult 21
Tárcsák felépítése Ezek vannak beépítve a programba 22
Fordítótárcsák felépítése Ezek vannak beépítve a programba 23
Kapocstábla A kapocstábla a gép elején, a billentyűzet alatt található Használatával 13 betűpár felcserélésére van lehetőség. A képen két betűpárt cseréltek fel: S-O és J-A. Az első években 6, később 5-8 átkötést használtak, de 1939-től mindig tízet 24
Példafutás az üzenet kódolásának (küldésének) lépései Példánkban a A haderő főparancsnokságának üzenetet kell kódolnunk a hónap 31. napján 1. Tárcsák kiválasztása Az adott napra vonatkozó kódkönyv-bejegyzést használjuk (minden napra megadták a megfelelő beállításokat az Enigmához). A Walzenlage oszlop tartalmazza a tárcsák típusazonosítóját. A kiválasztott tárcsák a III, a I és a IV (betű)tárcsa 2. Tárcsák beállítása A tárcsák beállítása a Ringstellung oszlopban található Minden betűt számokkal helyettesítettek, a szám a betű ábécében található helyét jelenti A betűk így: A (01), Q (17), V (22) 25
Példafutás (folyt.) 1 2. Tárcsák kiválasztása és beállítása 26
Példafutás (folyt.) 3. Kapocstábla beállítása A Steckerverbindungen oszlopaiban található a kapocstábla beállítása. A megadott betűpárokat kellett összekötni az Enigma elején. 27
Példafutás (folyt.) 4. Véletlen szó kitalálása (indikátor) Ennek indoka: ha a szövetségesek megszereznének egy kódkönyvet, akkor se lehessen egyértelműen feltörni a kódolt üzeneteket Ez minden üzenetnél (elvileg) más és más volt, így a kódolt üzeneteket (elvileg) sehogy sem lehetett összehasonlítani egy másik kódolt üzenettel (ez nehezítette a feltörést) A rejtjelező tisztek azonban nem feltétlenül tartották be ezt a szabályt, és gyakran ugyanazt a szót használták fel több üzenetnél Konkrét példánkban az EIN szót fogjuk használni, mivel 3 tárcsánk van 5. Véletlen szó kódolása Ennek indoka: a későbbiekben ezzel a szóval történik az üzenet tényleges kódolása Viszont mivel ez a szó minden üzenetnél más volt, ezért ezt közölni kellett a dekódolást végző tisztel is A szót kétszer kellett elküldeni, hogy az esetleges zavarok miatt bekövetkezett torzulást vissza lehessen állítani A gyakorlatban legalább háromszoros küldés lenne szükséges, hogy biztos lehessen a helyreállítás, de ezt a németek nem tartották biztonságosnak 28
Példafutás (folyt.) 5. Véletlenszerű szó kódolása Mivel a szavunk az EIN volt, ezért először az EINEIN szót fogjuk kódolni a beállított Enigmán Üzenetünk első fele: AVBYLV 29
Példafutás (folyt.) 6. A véletlenül választott szó beállítása a tárcsán Fontos, hogy semmi mást nem változtattunk az Enigmán A Kapocstábla és a tárcsák azonosítója változatlan 30
Példafutás (folyt.) 7. Tényleges üzenet kódolása Üzenetünk a A haderő főparancsnokságának. Ezt kell ténylegesen kódolni. Szabályok: a szóközöket és írásjeleket egy X betűvel, az ékezetes betűket pedig ékezetmentes párjukkal helyettesítjük Ezen felül még sok egyéb szabály is volt, de ezeket a példánkban most nem kell alkalmazni Így a kódolandó üzenet: axhaderoxfoparancsnoksaganak Eredmény: FLPOYSIWAOCHIACUFJZXLQMPWXFU 31
Példafutás (folyt.) A hét lépés utáni teljes kódolt üzenet: AVBYLV FLPO YSIW AOCH IACU FJZX LQMP WXFU Ezt az üzenetet kell(ett) továbbítani a másik félnek. Ezt leggyakrabban morze kóddal végezték el. Az üzenetet a könnyebb kezelés érdekében négyes csoportokba rendezték Képek: Enigma logó és Turing bomba (reprodukció) 32
Példafutás az üzenet dekódolásának (fogadásának) lépései A hónap 31. napján megérkezett hozzánk morze kóddal a következő rejtjelezett üzenet: AVBYLV FLPO YSIW AOCH IACU FJZX LQMP WXFU 1. Enigma beállítása Lépéseit a kódolásnál már taglaltuk, meg kell ismételni a fenti 1 3. pontokban leírtakat 33
Példafutás (folyt.) 2. Üzenet elejének dekódolása Az Üzemmódot át kell állítani Dekódolás-ra Az üzenetet a kitalált szóval kódoltuk, ezért simán az alapbeállításokkal dekódolva nem kapunk értelmes eredményt (zárójeles rész): EINEIN { ZVHRWKLXZVKVSBICALAZHOAJULGD } 34
Példafutás (folyt.) 2. Üzenet elejének dekódolása (folyt.) Eredmény (idáig): EINEIN {ZVHRWKLXZVKVSBICALAZHOAJULGD} Mivel a tényleges üzenetet a kitalált szóval kódoltuk, nyilvánvaló, hogy a lényegi üzenetet nem tudtuk még dekódolni Kollégánk csak a véletlenül kitalált szót kódolta ezzel a módszerrel (kétszer) Emiatt az üzenet első 6 betűje viszont tényleg dekódolva van (EINEIN) Látjuk, hogy az első 3, illetve a második 3 karakterből felépülő szó megegyezik 3. Véletlen szó beállítása az Enigmán Hasonlóan, mint a kódolásnál mutatott 6. lépésben 35
Példafutás (folyt.) 4. Üzenet dekódolása Az eddigiek ismertében már dekódolni tudjuk az üzenetet Fontos, hogy az első 6 karaktert nem szabad ilyenkor dekódolni, mert akkor a tárcsák nem lesznek megfelelő helyzetben és hibás eredményt kapunk Eredmény: AXHADEROXFOPARANCSNOKSAGANAK 36
Példafutás (folyt.) Az Enigmától kapott eredmény: EINEIN AXHADEROXFOPARANCSNOKSAGANAK A szabályok ismeretében vissza tudjuk nyerni az eredeti üzenetet AXHADEROXFOPARANCSNOKSAGANAK A HADERO FOPARANCSNOKSAGANAK A HADERŐ FŐPARANCSNOKSÁGÁNAK 37
A kód bemutatása 1. Kódolás(): feladata az üzenet betűinek kódolása A betűt szimbolizáló jel végigmegy az összes tárcsán, majd megfordul és visszafelé is végigmegy a tárcsákon. Az így kapott betű lesz az eredmény. Lásd: Enigma működése slide-ok Minden egyes betűkódolás után legalább egy tárcsa elfordul (Forgatás(i);) 38
A kód bemutatása 2. DeKódolás(): feladata az üzenet dekódolása Hasonlóan a kódoláshoz, itt is szükség van oda-fordulás-vissza lépések lejátszásához Itt is szükséges minden betű dekódolása után forgatni a tárcsákat Kódolás(String betű): visszaadja, hogy a tárcsa milyen betűvé kódolja a megadott karaktert Dekódolás(String betű): megadja, hogy melyik betű kódolása esetén kapnánk az argumentumban megadott karaktert 39
A kód bemutatása 3. Fordítás(int i): a tárcsákat kódoló listájában található betűket kell forgatnia minden kódolt betű után Az első tárcsa minden karakter után fordul(t) egyet. A többi (kettős léptetés nincs lekódolva) mindig csak akkor fordul(t) ha az előtte lévő körbeér(t). Emiatt az 5 tárcsás betű-enigma minden 26 5 (11 881 376) karakter után ugyanúgy kódol. Mivel az üzenetek általában csak néhány száz betűből álltak, ugyanaz a tárcsaállás egy üzeneten belül kétszer nem fordulhatott elő. 40
A kód bemutatása 4. Forgatás(String betű): a megadott betűre forgatja a tárcsa kódoló listáját A lenti táblázat az I betűtárcsa A és B állását mutatja A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A állás E K M F L G D Q V Z N T O W Y H X U S P A I B R C J B állás K M F L G D Q V Z N T O W Y H X U S P A I B R C J E 41
Az Enigma kód biztonságossága Egy kódolás biztonságosságát alapvetően a köv. tényezők határozzák meg: A teljes kulcstér mérete Az erős rész nagysága a teljes kulcstéren belül Van-e (számottevő) esély az emberi hibák megjelenésére Egy öt tárcsás Enigma esetén a teljes kulcstér mérete: 250 11 881 376 150 738 274 937 250 4,4775 10 23 Első tényező: tárcsák kiválasztása, 2. tényező ( 26 5 ): tárcsák helyzete + ábécégyűrűknek a tárcsákhoz viszonyított helyzete, 3. tényező: kapocstábla-átkötések (10 átkötéssel) A kód erejét azonban többféle tényező gyengíti, pl. a kapocstábla helyzete, ami az üzenet végéig fix (monoalfabetikus rejtjel) Más hasonló tényezők szintén gyengítik a kódot, végül az erős kódrész csak néhány millióra zsugorodik vissza Ez ugyan kézi módon még mindig lényegében feltörhetetlen lenne, de már a II. vh. idején átvizsgálható volt elektromechanikai (gépi) módszerekkel 42
Carmichael számok Készítő: Lukácsi Róbert (GI, levelező, 2016) Elméleti háttér A Carmichael-féle számok olyan erős pszeudoprímek, amelyek szinte mindig becsapják a Fermat-tesztet. Konkrétan, csak azok a b alapok buktatják le őket, amikor b n. Felderítésük elméleti és gyakorlati szempontból is fontos. A legkisebb ilyen szám az 561 = 3 11 17. Algoritmus A matematikai meghatározás alapján Programozási környezet, jellemzők Java, NetBeans IDE 8.1 alatt GUI Futási idő, hatékonyság A vizsgált tartományban (kb. 2 bájtos egészek) barátságos futási teljesítmény Egyéb érdekes tapasztalatok BigInteger adattípus (beépítve), hatékonyan támogatja a nagypontosságú aritmetikát Néhány további adattípus-jellegzetességet később kiemelten bemutatunk 43
Carmichael számok A program felülete, futási kép és eredmény (részlet) Szemléltetésként minden n-hez relatív prím alapot kiírunk 44
Carmichael számok A kód lényegi része
Carmichael számok A BigInteger osztály néhány használt metódusa.isprobableprime(valószínűség) egy BigInteger típusú számról eldönti (nagy valószínűséggel), hogy prímszám-e (tdk. prímjelölt-teszt) A valószínűség átadási értékként változtatható.nextprobableprime() megadja az adott BigInteger utáni következő prímet (prímjelöltet).modpow(,) moduláris hatványozás, kiszámítja az a b (mod c) értéket ( okos algoritmus a háttérben, a közbülső lépéseknél is mod c dolgozik).gcd() két BigInteger típusú szám lnko-ját számítja ki.add(),.substract(),.multiply(),.divide() matematikai +,, * és / műveletek BigInteger típusú számokra.compareto(),.equals() két BigInteger típusú szám megfelelő összehasonlítása (<, =, <> stb.) Egyéb érdekes BigInteger sajátosság BigInteger.ZERO, BigInteger.ONE stb. konstansok létrehozhatók, ezzel kiváltva a folyamatos.valueof() kiértékelést 46
Carmichael számok A BigInteger osztály két figyelemre méltó gyári eljárása.multiply(): látható, hogy az implementációban a Karacuba szorzómódszert (is) használják.passesmillerrabin(,): prímteszt eljárások hívják meg 47