Dicsőségtabló Beadós programozási feladatok Hallgatói munkák 2017 2018
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 2
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) 3
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) 4
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ó). 5
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 6
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 7
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) 8
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 9
Carmichael számok A program felülete, futási kép és eredmény (részlet) 10
Carmichael számok A kód lényegi része 11
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 12
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 13