Diszkrét matematika 2. előadás Sapientia Egyetem, Műszaki és Humántudományok Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2016, őszi félév
Miről volt szó az elmúlt előadáson? Követelmények, könyvészet Áttekintő Számtartományok: természetes számok, egész számok, Alapműveletek, típusok, algoritmusok Python-ban
Miről lesz szó? A gyorshatványozás algoritmusa - iteratív, rekurzív változatok. Számtartományok: racionális számok, irracionális számok Racionális számok sorozatba rendezése legnagyobb közös osztó algoritmusa, rekurzív változat Lánctörtek racionális számok lánctört jegyei
1. feladat: határozzuk meg 2 100 értékét. ** operátorral, az eredmény long típusú érték lesz, ami a Pythonban végtelen precizitású egész értéket jelent, ezt az eredmény végén megjelenő L szimbólum jelzi. >>> 2**100 1267650600228229401496703205376L Hány szorzást végez az algoritmus az eredmény meghatározásához?
Létezik olyan algoritmus, amely 2 100 meghatározásakor 9 darab szorzást végez. Hogyan?? A gyorshatványozás algoritmusával, amely logaritmikus futási idejű. Mit jelent ez? 2. feladat: határozzuk meg x n értékét. def my_pow (x, n): res = 1 while n <> 0: if n % 2 == 1: res = res * x x = x * x n = n / 2 return res >>> my_pow(2, 100) 1267650600228229401496703205376L
3. feladat: a gyorshatványozás, rekurzív (1)változat def my_pow1 (x, n): if n == 0: return 1 if n % 2 == 0: return my_pow1 (x * x, n / 2) return x * my_pow1 (x * x, n / 2) >>> my_pow1(2, 100) 1267650600228229401496703205376L A gyorshatványozás, rekurzív (2)változat: def my_pow2 (x, n): if n == 0: return 1 temp = my_pow2 (x, n/2) if n % 2 == 1: return x * temp * temp else: return temp * temp
Racionális számok halmazjelölés: Q = { a : a, b Z, b 0}, b egész számok rendezett párjaként is felfoghatóak, tulajdonságok: kommutatívitás, asszociatívítás, disztributívítás, a racionális számok halmaza zárt az összeadásra, kivonásra, szorzásra, osztásra nézve, összeadásra, szorzásra nézve minden elemnek lesz inverz eleme, sűrűn rendezett halmazt alkotnak: bármely két racionális szám között van egy harmadik, végtelen sok alakban feĺırhatóak irreducibilis tört, sorozatba rendezhetőek, tizedes tört alak: véges vagy végtelen szakaszos törtek.
4. feladat: határozzuk meg egy adott racionális szám irreducibilis alakját. a x y racionális számot az (x, y) számpárral fogjuk jelölni, egy tört irreducibilis, ha a számláló és nevező legnagyobb közös osztója 1 meg kell határozni két szám legnagyobb közös osztóját: eukleidészi algoritmus (rekurzív változat) def ialak (a, b): l = lnko(a, b) return (a/l, b/l) # két szám legnagyobb közös osztója, eukleideszi algoritmus def lnko(a, b): temp = a % b if temp == 0: return b return lnko(b, temp)
Racionális számok A racionális számok halmaza megszámlálható: a racionális számok halmaza felsorolható, azaz létezik egy számsorozat, amelyet a racionális számok alkotnak : r 1, r 2,..., r n,..., bármelyik racionális szám feĺırható p/q alakba:
5. feladat: Az előző oldalon megadott sorrend szerint írassuk ki az első 55 racionális számot, I. módszer. def aracionalis (k): for j in range(1, k+1): print (j, k+1-j), print def racionalis (n): for k in range(1, n+1): aracionalis (k) >>> racionalis (10) (1, 1) (1, 2) (2, 1) (1, 3) (2, 2) (3, 1)...... (3, 8) (4, 7) (5, 6) (6, 5) (7, 4) (8, 3) (9, 2) (10, 1)
Az 5. feladat segédfüggvény nélkül, egymásba ágyazott for ciklus-sal: def racionalis1 (n): for k in range(1, n+1): for j in range(1, k+1): print (j, k+1-j), print Lesznek olyan racionális számok, amelyek többször is megjelennek a generált számok között?! Ha egy számpárból képezhető racionális szám nem irreducubilis, akkor azt jelenti, hogy már egyszer ki volt generálva az 5. feladat befejezése házi feladat.
Az 5. feladat lista adatszerkezettel, a listába számpárok kerülnek: def aracionalisl (k): #az L listát üres listaként inicializáljuk: L = [] for j in range(1, k+1): #az L lista végéhez hozzáfuzunk egy számpárt: L = L + [(j, k+1-j)] return L Megjegyzések, kommentek használata: egysoros megjegyzés: #ez egy egysoros megjegyzés többsoros megjegyzés: """ez egy többsoros megjegyzés"""
6. feladat: Írassuk ki az első n racionális számot, alkalmazva a következő algoritmust: az x után következő racionális szám: 2 x + 1 x reciproka, y y y ahol alsó egész részt jelent, II. módszer. pl: pl: 5 2 5 2 2 5 2 5 3 3 + 1 5 2 = 2 2 + 1 5 2 = 5 5 2 = (10 5) 2 = 5 2 2 5 + 1 5 3 = 2 1 + 1 5 3 = (9 5) 3 = 4 3 3 4 Ezzel a módszerrel a következő listát kapjuk: (1, 1) (1, 2), (2, 1) (1, 3), (3, 2), (2, 3), (3, 1) (1, 4), (4, 3), (3, 5), (5, 2), (2, 5), (5, 3), (3, 4), (4, 1)...
6. feladat: a feladat megoldásához több függvényt is meg kell írni Az x y racionális szám utáni racionális szám meghatározása: def nextrac (x, y): nrx = (2 * (x/y) + 1) * y - x nry = y g = lnko (nrx, nry) return (nry / g, nrx / g)
6. feladat: A számpárok kíıratása: def lista1 (x, y, n): print(x, y) for i in range (0, n): (x, y) = nextrac(x, y) print (x, y), meghívás: lista1 (1, 1, 7)
6. feladat: A számpárok listában való eltárolása: def lista2 (x, y, n): L = [(x, y)] for i in range (0, n): (x, y) = nextrac(x, y) L = L + [(x, y)] return L meghívás: lista2 (1, 1, 7)
Irracionális számok halmazjelölés: Q, azok a számok, melyek nem írhatóak fel két egész szám hányadosaként, azaz a végtelen, nem szakaszos tizedes törtek, híresebb irracionális számok: 2 = 1.4142..., π = 3.1415..., e = 2.7182..., φ = 1+ 5 = 1.6118..., az aranyarány. 2 a számítástechnika az irracionális számok közeĺıtett értékét tudja meghatározni lánctörtek segítségével könnyedén meglehet határozni a közeĺıtett érték tízedesjegyeit
Lánctörtek (Continued fraction) A lánctört egy emeletes tört, amely kétféle alakban is megadható, ahol a két alak átalakítható egymásba: a 0 + a 1 + b 1 a 2 + b 2 b 3 a 3 + b4... d 0 + d 1 + 1 d 2 + 1 1 d 3 + 1... A második alak esetében a [d 0, d 1, d 2, d 3,... ] számsorozatot a lánctört jegyeinek hívják. Megállapíthajuk, hogy: a racionális számok véges lánctörtek, az irracionális számok végtelen lánctörtek.
Lánctörtek, példa Alakítsuk át 37 -t lánctörtté: 13 37 = 2 + 1 13 1 + 1 = [2, 1, 5, 2] = 2.(846153) 5 + 1 2 Alakítsuk át 41 -t lánctörtté: 11 41 = 3 + 1 11 1 + 1 2 + 1 = [3, 1, 2, 1, 2] = 3.(72) 1 + 1 2
7. feladat: határozzuk meg az x y def lanct(x, y): L = [] while 1: L += [x / y] r = x % y if r == 0: break x = y y = r return L racionális számnak megfelelő lánctört jegyeit >>> lanct(89, 63) [1, 2, 2, 2, 1, 3] >>> lanct(89, 55) [1, 1, 1, 1, 1, 1, 1, 1, 2]