Diszkrét matematika 1. el adás mgyongyi@ms.sapientia.ro Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia 2019, szi félév
Követelmények, osztályozás Végs jegy: (írásbeli jegy + laborjegy)/2, ahol mindkét jegy el kell érje a 5 értéket. Jelenlét: a laborgyakorlat kötelez, hiányzás esetén kötelez az óra pótlása, ellenkez esetben nem lehet részt venni az els vizsgaalkalmon (egy tanévben 3 vizsgaalkalom van, kett közvetlenül az oktatási id szak után, a harmadik sszel van és ezért zetni kell). akinek a laborjegye legalább 7 az használhatja végs jegyként ezt a jegyet a félév során kétszer lesz laborfelmér, ahol mindkét jegy el kell érje a 5-t; a két jegy átlaga képezi a laborjegyet.
Követelmények Az els vizsga egy 9 pontos írásbeli tételsorból áll. Ez alkotja az írásbeli jegyet. Ezen csak akkor lehet részt venni, ha a laborjegy legalább 5. A második és harmadik vizsga szintén egy 9 pontos írásbeli tételsorból (ez alkotja az írásbeli jegyet, ha nem sikerül átmen jegyet szerezni az els alkalom során, vagy ha javítani szeretnénk), majd egy ezt követ feladatsorból áll, amelyeket számítógépen kell leprogramozni (ez alkotja a laborjegyet). A laborjegy, ha 5 felett van, akkor használható egész évben.
Könyvészet Bege A., Kása Z., Algoritmikus kombinatorika és számelmélet, Egyetemi Kiadó, Kolozsvár, 2006. Freud R., Gyarmati E., Számelmélet, Nemzeti Tankönyvkiadó, Budapest, 2000. Cormen T.H., Leiserson C.E., Rivest R.L., Algoritmusok, M szaki Könyvkiadó, Budapest, 2001. Lovász L., Pelikán J., Vesztergombi K., Diszkrét matematika, Typotex, Budapest, 2006. Rónyai L. Ivanyos G., Szabó R., Algoritmusok, Typotex, Budapest, 2004 Rosen K.H., Discrete Mathematics and its Applications, McGrawHill, New-York, 2012. Magnus Lie Hetland M.L., Beginning Python: From Novice to Professional, 2nd edition, Apress, 2008. https://realpython.com/ http://nyelvek.inf.elte.hu/leirasok/python/
Áttekint Számok, számlálási problémák számok, számtartományok sajátos számsorozatok: Fibonacci számok számok ábrázolása, számrendszerek Számelméleti alapfogalmak prímszámok, prímtesztel algoritmusok legnagyobb közös osztó, legkisebb közös többszörös, az eukleidészi algoritmus és változatai kongruenciák, kongruencia rendszerek, Kínai maradéktétel, egész számok faktorizációja, alkalmazás: az RSA klasszikus algoritmusa, Die-Helmann kulcscsere.
Áttekint Kódolási technikák az ASCII kód, a base64 kód Álvéletlen-szám generátorok Lineáris kongruencián alapuló generátor A közép-négyzet módszer a Python álvéletlen számgenerátora Kombinatorika Lexicograkus sorrend, permutációk, kombinációk, variációk
Bevezet diszkrét matematika algoritmusok, minden algoritmust, programot Python programozási nyelvben írunk, verzió: Python 3.7.0, https://www.python.org/ a Python 1991-ben jelent meg, Guido van Rossum kezdte el fejleszteni, Python, tulajdonságok: magasszint adatszerkezetek: listák, ennesek (tuple), stringek, halmazok, stb., dinamikus típusosság, automatikus memóriakezelés, objektum orientáltság, rövid programok írása gyors és egyszer interpreter: a saját utasításait bemen adatként kezeli, ezeket átalakítja a futtató gép utasításává, majd rögtön futtatja, ellentétben a fordító (kompilátor) típusú programozási nyelvekkel a Python tulajdonképpen nem interpreter: byte kódot fordít és futtat
Python, elemi kódsorok Példák: a Python instalálása, majd indítása után megjelenik egy ablak egy kétsoros standard szöveggel (Python verzió szám, stb.) és a prompt: > a prompt után kifejezések, utasítások írhatóak, amelyeket a Python interpretere rögtön kiértékel: >>> print ("Hello vilag!") Hello vilag! >>> 251 + 965 1216 >>> 2 ** 100 1267650600228229401496703205376 #A Python 3.7.0 tetszoleges nagy, egész számokkal is tud muveleteket vegezn >>> import math >>> math.sqrt(10) 3.1622776601683795
Python, elemi kódsorok Példák: >>> x = 10 #enter-t kell nyomni! >>> y = 13 #enter-t kell nyomni! >>> if x > y: print (x,' nagyobb, mint ',y) #enter-t kell nyomni!! else: print (y, ' nagyobb vagy egyenlo, mint ', x) #ketszer kell enter-t nyomni!! 13 nagyobb vagy egyenlo, mint 10 >>> for i in range(10): print (i) #ugyeljunk a tordelesre!! 0 1... 9
Python, szintaxis Megjegyzések, "kommentek" használata: egysoros megjegyzés: #ez egy egysoros megjegyzés többsoros megjegyzés: """ez egy többsoros megjegyzés"""
Python, elemi kódsorok Példák: >>> for i in range(10): print (i, end = " ") 0 1 2 3 4 5 6 7 8 9 >>> for i in range(10): print (i, end = "") 0123456789 >>> for i in range(10): print (2 ** i, end = " ") 1 2 4 8 16 32 64 128 256 512
A programírás lépései az interpreterbe beírt kifejezések, utasítások elvesznek, ha kilépünk a Pythonból, IDLE (integrated development environment): a Python standard fejleszt i környezete, programszerkesztésre, mentésre, állomány megnyításra, futtatásra ad lehet séget, a kódszerkeszt t a File/New File menüpontból lehet elindítani a kódszerkeszt menüpontjai: File/New File -új állomány létrehozása; File/Save -állomány mentése, Run/Run Module vagy Ctrl + F5 -a program futtatása a Python shell-b l stb. Python program: scriptnek is mondják
A programírás lépései mentsük el eload1.py néven azt az állományt, amelybe a következ kódsorokat tettük: n = 20 for i in range(n): print (i/2, end = ", ") IDLE alól való futtatás: Ctrl + F5 az eredmény (2-vel való valós osztás): 0.0, 0.5, 1.0, 1.5, 2.0,..., 9.0, 9.5, parancssorból való futtatás: Windows: be kell állítani a PATH környezetváltozót (environment variable), úgy hogy megadjuk a python.exe állomány elérési útvonalát (System/Advanced system settings) a parancssorban a CD rendszerparanccsal kiválasztjuk azt a mappát, ahol az eload1.py állomány van futtatás: C:\> python eload1.py futtatás: kétszer klikkelve az eload1.py-on
Python, szintaxis A programozási nyelvek egyik alapfogalma a változó: A változók értékek tárolását teszik lehet vé, a pontos jelentés programozási nyelvekt l függ en változik. A változók értéke: értékadás, értékmodósító utasításokkal határozzuk meg. A változók típusa: a típus alapján d l el, hogy a milyen fajta értékeket kezel/tárol. A változókkal végzett m veletsorok képezik a programírás alapjait. Python változó: nincs explicit változódeklarálás. A változódeklarálás automatikus, pl. értékadás során. más alapfogalomak: operátor, függvény: Az értékadó operátor az egyenl ség (=). A print függvény kiértékeli a zárójelben megadott kifejezést, és az eredményt kiírja a standard kimenetre. input - adatbeviteli függvény, a beviteli értéket át kell alakítani
Alaptípusok/osztályok a Pythonban Kezd programozók számára az osztályok és típusok egy fogalmat jelölnek, jelzik hogy milyen fajta adattal dolgozunk. Egy adott érték típusa pont olyan fontos informatikai fogalom, mint az érték. alaptípusok: int, oat, str, bool >>> type(103373189) <class 'int'> >>> type(106.909) <class 'float'> >>> type(true) <class 'bool'> >>> type('helo vilag') <class 'str'> >>> type("helo vilag") <class 'str'> Karakterláncok (str) jelölésére egyformán használhatjuk a ', illetve " szimbólumokat
Típusok közötti átalakítások Egész számmá alakítunk: >>> int(23.11) 23 >>> int(23.0) 23 >>> int(-23.900) -23 >>> int(10/3) 3 >>> int('23 szo') Traceback (most recent call last): File "<pyshell#25>", line 1, in <module> int('23 szo') ValueError: invalid literal for int() with base 10: '23 szo'
Típusok közötti átalakítások Valós számmá alakítunk: >>> float(15) 15.0 >>> float('23.67') 23.67 Karakterlánc típussá alakítunk: >>> str(12) '12' >>> str(12.67) '12.67' >>> str(true) 'True'
Python, szintaxis más alapfogalmak: utasítás, operátor, függvény: kommenteljük ki az el z kódsorokat (használjunk # -t a sorok elején) és most írjuk a következ ket az eload1.py állományba: print ("n:", end = " ") n = int(input()) for i in range(1, n + 1): print ("az osztasi egészrész", i, "-el: ", end = "") print (n // i) az eredmény: n: 6 az osztasi egeszresz 1 -el: 6 az osztasi egeszresz 2 -el: 3 az osztasi egeszresz 3 -el: 2 az osztasi egeszresz 4 -el: 1 az osztasi egeszresz 5 -el: 1 az osztasi egeszresz 6 -el: 1
Algoritmusok Pythonban 1. feladat Határozzuk meg a beolvasott számok legkisebbikét, függvényt alkalmazva. Saját függvényeket is írhatunk, kommenteljük ki a korábban írt kódsorokat és írjuk a következ ket az eload1.py állományba: def fugv1(): print ('n:', end = " ") n = int (input()) IDLE alól való fordítás: Ctrl + F5 IDLE alól való fordítás után: >>> fugv1() print ('x:', end = " ") x = int (input()) m = x for i in range (0, n-1): print ('x:', end = " ") x = int (input()) if x < m: m = x return m ÁRTON Gyöngyvér
Python, szintaxis A függvények a bemeneti értéken/értékhalmazon elvégeznek egy m veletsort meghatározva egy kimeneti értéket/értékhalmazt. Python függvénydeniálás: def <fvnév> ( <paramlista> ) : <fügvtörzs> Az utolsó sorban lev return utasítás teszi lehet vé, hogy a függvény értéket adjon vissza, az el z példánál a függvény visszatéríti a legkisebb értéket a beolvasott értékek közül a Python esetében nem kötelez a return használata.
Python, szintaxis a range függvény egy számsorozatot generál, a megadott határértékekkel a for ciklusutasítás deniálása: for <elem> in <halmaz> : <ciklustörzs> A for a halmaz minden elem elemére végrehajtja a ciklustörzs részt. az if elágazásutasítás deniálása: if <kif> : <elágazástörzs> (elif < kif > : <elágazástörzs>) [else : <elágazástörzs>] ha igaz a megfelel kif kifejezés, akkor a megfelel elágazástörzs hajtódik végre. Az elif, else ágak nem kötelez ek.
Algoritmusok Pythonban 2. feladat Végezzünk alap aritmetikai m veleteket. def muveletek (x, y): return (x + y, x - y, x * y, x // y, x % y, x / y ) def fugv2(): print ('x:', end = " ") x = int (input()) print ('y:', end = " ") y = int (input()) e1, e2, e3, e4, e5, e6 = muveletek(x, y) print ("osszeg: ", e1) print ("kulonbseg: ", e2) print ("szorzat: ", e3) print ("osztasi egeszresz: ", e4) print ("osztasi maradek: ", e5) print ("valos osztas: ", e6)
Algoritmusok Pythonban Az eload1.py állományba írt függvények bármelyike, fordítás után meghívható, a Python shell-ben: >>> muveletek (25, 3) (28, 22, 75, 8, 1, 8.333333333333334) >>> fugv2() x: 91 y: 42 osszeg: 133 kulonbseg: 49 szorzat: 3822 osztasi egeszresz: 2 osztasi maradek: 7 valos osztas: 2.1666666666666665 Vegyük észre, hogy a fugv2 meghívja a muveletek függvényt. A fugv2-nek nincs bemeneti paramétere, a muveletek-nek azonban két bemeneti paraméter értékét kell megadni.
Alapm veletek karakterláncokkal: +, * operátorok >>> str1 = "Diszkrét" >>> str2 = " Matematika" >>> str3 = " I. félév" >>> strt = str1 + str2 + str3 >>> print (strt) 'Diszkrét Matematika I. félév' >>> strt = 3 * 'Helo ' >>> strt 'Helo Helo Helo '
Algoritmusok Pythonban 3. feladat Készítsünk meghívót az Egyetem Napja alkalmából! def meghivo(): diakok = ['Mari', 'Szabi', 'Kati', 'Feri'] for d in diakok: meghivo1 = 'Kedves ' + d + '! \n\ntisztelettel meghívjuk az Egyetem' meghivo2 = '\nnapja alkalmából tartott eloadássorozatra!\n\n' print (meghivo1 + meghivo2) >>> meghivo() Kedves Mari! Tisztelettel meghívjuk az Egyetem Napja alkalmából tartott eloadássorozatra! Kedves Szabi!...