Diszkrét matematika 5. előadás Sapientia Egyetem, Műszaki és Humántudományok Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2015, őszi félév
Miről volt szó az elmúlt előadáson? számtani, mértani, harmonikus számsorozatok sajátos számsorozatok: a faktoriális függvény Stirling számok Fibonacci számok Lucas számok Catalan számok algoritmusok Python-ban
Miről lesz szó? aranymetszés, aranyarány a Fibonacci, Lucas számokkal való kapcsolat számrendszerek számrendszerek közötti átalakítások számok összeadása, szorzása bináris számrendszerben
Aranymetszés, aranyarány (Golden Ratio) két mennyiség, a, b, a > b az aranymetszés szerint aránylik egymáshoz, ha fennáll: a b = a + b def = ϕ a a ϕ meghatározása érdekében feĺırhatjuk: a + b a = 1 + 1 a, azaz fennáll: b ϕ = 1 + 1 ϕ ϕ2 = ϕ + 1 megoldva a fenti egyenletet kapjuk, hogy ϕ = 1 + 5 2 a ϕ irracionális szám = 1.61803... és ˆϕ = 1 5 2 = 0.61803...
Aranyarány, alkalmazások építészet: Parthenon homlokzatának arányértékei: logok: Toyota, Mercedesz, stb. Pentagramma (szabályos ötszög): természet: napraforgó spirlajai piros zold = zold kek = kek lila = ϕ
Aranyarány, lánctörtek Kiindulva az alábbi összefüggésből: ϕ = 1 + 1, lánctörtek segítségével is ϕ feĺırhatjuk a ϕ értékét: ϕ = 1 + 1 + 1 + 1 1 1 1 + 1...
A Fibonacci számok, Lucas számok a Fibonacci számsorozat: 0, 1, 1, 2, 3, 5, 8, 13,..., a rekurziós képlet: F 0 = 0, F 1 = 1, F n = F n 1 + F n 2, a Lucas számsorozat: 2, 1, 3, 4, 7, 11, 18, 29, 47,..., a rekurziós képlet: L 0 = 2, L 1 = 1, L n = L n 1 + L n 2, kapcsolat, képletek: L n = F n 1 + F n+1 = F n + 2 F n 1 = F n+1 F n 2 F n = Ln 1 + Ln+1 5 = Ln 3 + Ln+3 10
Kapcsolat a Fibonacci sorozattal megállapítható: F n+1 F n + F n 1 lim = lim = 1 + lim n F n n F n n fennáll tehát: x = 1 + 1 F n+1, ahol a lim x n F n alkalmaztuk. megoldva a x = 1 + 1 x egyenletet kapjuk, hogy F n+1 lim = ϕ n F n = lim n L n+1 hasonlóan: lim = ϕ n L n Binet formula (bizonyítás matematikai indukcióval): F n = ϕn ˆϕ n 5 = (1 + 5) n (1 5) n 2 n 5 1 F n F n 1 F n F n 1 = x jelölést
Algoritmusok Pythonban 1. feladat: Fibonacci számok, az aranymetszési képlettel: F n = ( 1+ 5 ) n (1 1+ 5 2 5 2 ) n = (1 + 5) n (1 5) n 2 n 5 def fibn (n): return int(( pow(1+math.sqrt(5), n) - pow (1-math.sqrt(5), n))/ (math.sqrt(5) * pow (2, n))) def fibn1 (n): return int(( (1+math.sqrt(5)) ** n - (1-math.sqrt(5)) ** n )/ (math.sqrt(5) * 2 ** n))
Számrendszerek egész számok: bármely 1-nél nagyobb számrendszerben ábrázolhatóak, a számítástechnikában gyakran használt számrendszerek: 10, 2, 8, 16, 256, 2-es számrendszer: bináris számrendszer, 8-as számrendszer: oktális számrendszer, 16-os számrendszer: hexadecimális számrendszer, legyen n az a szám, amit átszeretnénk írni b számrendszerbe, ekkor, Z -vel jelölve a nem negatív egész számok halmazát: n = a k b k + a k 1 b k 1 + + a 1b 1 + a 0b 0, ahol k Z, a i Z, és a i < b, minden i {0,..., k} értékre és a k 0. 10-es számrendszerben 10 szimbólum van: 0, 1, 2,..., 9. 2-es számrendszerben 2 szimbólum van: 0, 1. 256-os számrendszerben 256 szimbólum van
Számrendszerek, példák Pl. Mi (215) 10, 2-es számrendszerbeli alakja? fennáll: 215 = 128 + 64 + 16 + 4 + 2 + 1 = 1 2 7 + 1 2 6 + 0 2 5 + 1 2 4 + 0 2 3 + 1 2 2 + 1 2 1 + 1 2 0. tehát: (215) 10 = (1101 0111) 2. Pl. (1 0111 0010) 2, melyik 10-es számrendszerbeli számnak felel meg? fennáll: (1 0111 0010) 2 = 1 2 8 + 0 2 7 + 1 2 6 + 1 2 5 + 1 2 4 + 0 2 3 + 0 2 2 + 1 2 1 + 0 2 0 = 256 + 64 + 32 + 16 + 2 = 370. tehát: (1 0111 0010) 2 = (370) 10.
Számrendszerek, példák 8-as számrendszerben 8 szimbólum van: 0, 1, 2, 3, 4, 5, 6, 7. Pl. Mi (215) 10, 8-as számrendszerbeli alakja? fennáll: 215 = 3 8 2 + 2 8 1 + 7 8 0 tehát: (215) 10 = (327) 8. Pl. (6702) 8, melyik 10-es számrendszerbeli számnak felel meg? fennáll: 6702 = 6 8 3 + 7 8 2 + 0 8 1 + 2 8 0 = 3072 + 448 + 2 = 3522. tehát: (6702) 8 = (3522) 10.
Számrendszerek, példák 16-as számrendszerben 16 szimbólum van: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Pl. Mi (7432) 10, 16-os számrendszerbeli alakja? fennáll: 7432 = 1 16 3 + 13 16 2 + 0 16 1 + 8 16 0 tehát: (7432) 10 = (1D08) 16. Pl. (E2D07) 16, melyik 10-es számrendszerbeli számnak felel meg? fennáll: E2D07 = 14 16 4 + 2 16 3 + 13 16 2 + 0 16 1 + 7 16 0 = 917504 + 8192 + 3328 + 7. tehát: (E2D07) 16 = (929031) 10.
Algoritmus: 10-es számrendszerből b számrendszerbe n-et elosztjuk maradékos osztással b-vel: n = b q 0 + a 0, ahol 0 a 0 < b. q 0-ot elosztjuk maradékos osztással b-vel: q 0 = b q 1 + a 1, ahol 0 a 1 < b. addig folytatjuk a maradékos osztást, amíg 0 osztási egészrészt kapunk. Pl. Alakítsuk át 7432-t 16-os számrendszerbe: 7432 = 464 16 + 8 464 = 29 16 + 0 29 = 1 16 + 13 1 = 0 16 + 1
Algoritmus: b számrendszerből 10-es számrendszerbe hatványösszeget számolunk a b számrendszerbeli számjegyekből Pl. Alakítsuk át 1D08-t 10-es számrendszerbe: 1D08 = [1, 13, 0, 8] [8, 0, 13, 1] 8 = 8 16 0 8 = 0 16 1 + 8 3336 = 13 16 2 + 8 7432 = 1 16 3 + 3336
Algoritmusok Pythonban 2. feladat: Alakítsunk át egy számot 10-es számrendszerből b számrendszerbe def alakit10_b(nr, b): L = [] while nr > 0: L = [nr % b] + L nr = nr / b return L meghívás: alakit10_b(14, 2) az eredmény: [1, 1, 1, 0] ha oda-vissza átalakítást kell végezni, akkor ajánlatos a fordított sorrendet előálĺıtani, ekkor az L = [nr % b] + L sor helyett az L = L + [nr % b] sor szükséges.
Algoritmusok Pythonban 3. feladat: Alakítsunk át egy b számrendszerbeli számot 10-es számrendszerbe def alakitb_10 (L, b): nr = 0 p = 1 for elem in reversed(l): nr += elem * p p *= b return nr meghívás: alakitb_10([1, 1, 1, 0], 2) az eredmény: 14 a reversed(l) megfordítja a bemeneti listát def alakitb_10_1 (L, b): nr = 0 p = 1 l = len(l)-1 for i in range (l, -1, -1): nr += L[i] * p p *= b return nr ha a fordított sorrend lesz a bemenet, akkor nem szükséges reversed függvény használata, illetve az alakitb_10_1 függvényben range(0, l+1) lesz.
Kapcsolat a 2, 8, 16 számrendszerek között bináris oktális: hármas csoportokat formálunk: Pl. [1, 1, 1, 1, 0, 1, 1] [1, 1, 1, 1, 0, 1, 1] [1, 7, 3] bináris hexadecimális: négyes csoportokat formálunk Pl. [1, 1, 1, 1, 0, 1, 1] [1, 1, 1, 1, 0, 1, 1] [7, B] bináris 2 k : k-as csoportokat formálunk Pl. 2 256 = 2 8, 8-as csoportokat formálunk: [1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1] [1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1] [57, 107]
Algoritmusok Pythonban 4. feladat: Alakítsunk át egy számot 2-es számrendszerből 2 k számrendszerbe def alakit2_2k(l, k): L1 = [] l = len(l) i = l - 1 while i >= 0: nr = 0 p = 1 for j in range (0, k): nr += L[i] * p i -= 1 p *= 2 if i == -1: break L1 = [nr] + L1 return L1
Algoritmusok Pythonban 4. feladat: Alakítsunk át egy számot 2-es számrendszerből 8-as számrendszerbe meghívás: alakit2_2k([1, 1, 0, 1, 0, 1], 3) az eredmény: [6, 5] Alakítsunk át egy számot 2-es számrendszerből 256-os számrendszerbe meghívás: alakit2_2k([1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1], 8) az eredmény: [57, 107]
Algoritmusok Pythonban 5. feladat: Alakítsunk át egy számot 2 k számrendszerből 2-es számrendszerbe def alakit2k_2(l, k): L1 = [] l = len(l) - 1 for i in range(l, -1, -1): nr = L[i] for j in range (0, k): L1 = [nr % 2] + L1 nr = nr / 2 return L1
Algoritmusok Pythonban 5. feladat: Alakítsunk át egy számot 8-as számrendszerből 2-es számrendszerbe meghívás: alakit2k_2([6, 5], 3) az eredmény: [1, 1, 0, 1, 0, 1] Alakítsunk át egy számot 256-os számrendszerből 2-es számrendszerbe meghívás: alakit2k_2([57, 107], 8) az eredmény: [1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1] A két függvényt együtt alkalmazva: meghívás: alakit2_2k(alakit2k_2([217, 107, 28, 142, 55], 8), 8) az eredmény: [217, 107, 28, 142, 55]
Két bináris szám összeadása Legyen a két szám és bináris alakjuk: jelöljük c-vel a továbbviteli értéket A = a l 1 a l 2... a 1a 0 B = b l 1 b l 2... b 1b 0, az összeadás szabályát alkalmazva a két leghátsó bitre: ahol c = 0 az első továbbviteli érték a 0 + b 0 + c, az összeadás szabályát alkalmazva általánosan: a i + b i + c i 1, ahol a továbbvitel értéke: c i = (a i + b i + c i 1 )/2, az aktuális bit értéke: r i = (a i + b i + c i 1 ) mod 2, ami ugyanaz mint: r i = (a i + b i + c i 1 2 c i ).
Algoritmusok Pythonban 6. feladat: Két bináris szám összeadása: def osszeg (A, B): l1, l2 = len (A), len (B) i, j = l1-1, l2-1 c, R = 0, [] while i >=0 and j >= 0: temp = A[i] + B[j] + c R = [temp % 2] + R c = temp / 2 i, j = i - 1, j - 1 while i >= 0 : temp = A[i] + c R = [(temp) % 2] + R c = temp / 2 i -= 1 while j >= 0: temp = B[j] + c R = [(temp) % 2] + R c = temp / 2 j -= 1 return [c] + R
Két bináris szám szorzata Legyen a két szám, és bináris alakjuk: A szorzás szabályát alkalmazva: A = a l 1 a l 2... a 1a 0 B = b l 1 b l 2... b 1b 0, A B = A (b 0 2 0 + b 1 2 1 + + b l 1 2 l 1 ) = (A b 0) 2 0 + (A b 1) 2 1 + + (A b l 1 ) 2 l 1 Ha b i = 1, akkor A b i = A Ha b i = 0, akkor A b i = 0 Minden iterációnál meg kell határozni 2 k -val való szorzás értékét: jobbról kiegészítjük k darab 0-val a bináris alakot. Python, k darab nullásokból álló lista létrehozása: L = k * [0]