Diszkrét matematika 4. 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ámtartományok: valós számok, komplex számok, Algoritmusok Python-ban. híresebb irracionális számok számjegyeinek a kigenerálása, n-ik gyök meghatározása: Newton módszerrel. logaritmus maghatározása másodfokú egyenlet komplex gyökei fraktálok: Mandelbrot, Julia
Miről lesz szó? 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
Számsorozatok, haladványok Számtani sorozat: a, a + d, a + 2d,..., a + nd,..., ahol az a kezdő tag és a d különbség (differencia) valós számok. A számtani sorozat az f (x) = d x + a lineáris függvény diszkrét analógja. Mértani sorozat: a, ar, ar 2,..., ar n,..., ahol az a kezdő tag és az r hányados valós számok. A mértani sorozat az f (x) = a r x exponenciális függvény diszkrét analógja. Harmonikus sorozat: olyan 1 a n sorozat, ahol a tagok inverzei számtani sorozatot alkotnak. Pl. a n = 1 n, ahol a sorozat első 4 tagja a következő: 1, 1 2, 1 3, 1 4,...
1.feladat: Az a kezdő tagú, d különbségű számtani sorozat első n tagjának kíırása: def aseq (a, d, n): i = 0 s = a while i < n: print s, s += d i += 1 Kérdések: Milyen bemenetre kell meghívni a fenti függvényt, hogy a következő sorozatokat kapjuk? 1, 3, 7, 11, 15,... 7, 4, 1, 2, 5,... 1, 2, 3, 4, 5,... 0, 2, 4, 6, 8,... 5, 3, 1, 1, 3,...
Számtani sorozat, rekurziós képlet: def aseq_r2 (s, d, i): if i == 0: return s print s return aseq_r2 (s+d, d, i-1) meghívás: aseq_r2(7, -3, 10) x 0 = a, x n = d + x n 1
2.feladat: Az a kezdő tagú, r hányadosú mértani sorozat első n tagjának kíırása: def gseq (a, r, n): i = 0 p = a while i < n: print p, p *= r i += 1 Kérdések: Milyen bemenetre kell meghívni a fenti függvényt, hogy a következő sorozatokat kapjuk? 1, 1, 1, 1, 1,... 1, 2, 4, 8, 16,... 1, 3, 9, 27, 81,... 1, 0.5, 0.25, 0.125, 0.0625,... 2, 10, 50, 250, 1250,...
Mértani sorozat, rekurziós képlet: def gseq_r2 (p, r, i): if i == 0 : return p print p return gseq_r2 (r*p, r, i-1) meghívás: gseq_r2(1, 1/2.0, 10) x 0 = a, x n = r x n 1
Számtani sorozatok Rekurziós képlet: A sorozat n-ik tagjának kiszámítása: A sorozat első n tagjának összege: s n = x 1 = a, x n = d + x n 1 x n = x 1 + d (n 1) 2 x1 + d (n 1) 2 n
Mértani sorozatok Rekurziós képlet: A sorozat n-ik tagjának kiszámítása: A sorozat első n tagjának összege: x 1 = a, x n = r x n 1 x n = x 1 r n 1 s n = x 1 r n 1 r 1, r 1
3.feladat: Egy személy S euro összeget tett be egy bankba, k%-os évi kamatra. N év után mennyi pénzt tud felvenni a bankból: ( ciklussal és képlettel: S 1 + k ) N 100 def bank (S, k, N): msum = S for i in range(0, N): msum += msum * (k/100.0) return msum, S * ((1 + k/100.0) ** N)
4.feladat: Egy személy N éven keresztül minden év elején S euro összeget tett be egy bankba, k%-os évi kamatra. N év után mennyi pénzt tud felvenni a bankból: ( ( ciklussal és képlettel: s n = S 1 + k ) 100 1 + k ) n 1 100 ( 1 + k ) 1 100 def bank1 (S, k, N): msumv = 0 for j in range (1, N + 1): msum = S for i in range(0, j): msum += msum * (k/100.0) msumv += msum k1 = 1 + k/100.0 return msumv, S * k1 * (k1 ** N - 1) / (k1-1)
5.feladat: Határozzuk meg az n-ik Harmonikus számot a képlet: H n = n k=1 1 k az első harmonikus számok: 1, 3 2, 11 6, 25 12, 137 60,... def osszeg (x, y, a, b): sz = x * b + y * a n = y * b g = lnko (sz, n) return sz/g, n/g def harmonikus (n): s1, s2 = 1, 1 for i in range (2, n+1): a, b = 1, i s1, s2 = osszeg(s1, s2, a, b) return s1, s2
Sajátos számsorozatok A faktoriális függvény: n! = 1 2 (n 1) n A számsorozat: 1, 1, 2, 6, 24, 120, 720,..., F 0 = 1, F 1 = 1, F 2 = 2,... A rekurziós képlet: F n = n F n 1, A Catalan számok: A számsorozat: 1, 1, 2, 5, 14, 42, 132,..., C 0 = 1, C 1 = 1, C 2 = 2,... A számítási képlet: C n = 1 n + 1 ( 2n n 2(2n + 1) A rekurziós képlet: C n+1 = C n, n + 2 alkalmazási terület: kombinatorika ) = (2n)! (n + 1)! n!,
6.feladat: A faktoriális függvény, iteratív változat: def fakti (n): p = 1 for i in range (1, n+1): p *= i return p 7.feladat: A faktoriális függvény, az összes érték kiiratása: def fakti1 (n): p = 1 print p, for i in range (1, n+1): p *= i print p,
8.feladat: A faktoriális függvény, listába: def fakti2 (n): p = 1 L = [] for i in range (1, n+1): p *= i L += [p] return L
9.feladat: A faktoriális függvény, rekurzív változat I: def faktr (n): if n == 0: return 1 return n * faktr (n-1) 10.feladat: A faktoriális függvény, rekurzív változat II: def faktr1 (n, res): if n == 0: return res return faktr1 (n-1, n * res) Meghívás: faktr1 (10, 1)
Sajátos számsorozatok A Stirling számok Elsőfajú Stirling számok: az [ x (x 1) (x 2)... (x n + 1) együtthatója n k] = s(n, k) = s(n 1, k 1) (n 1) s(n 1, k), n k, Másodfajú Stirling számok: meghatározza, hogy egy n elemű halmaz hány k elemű nem üres részhalmazra { bontható n } k = s(n, k) = s(n 1, k 1) + k s(n 1, k), n k, ha k == 0, akkor s(n, 0) = 0 ha n == k, akkor s(n, k) = 1 [ ] kapcsolat a Harmonikus számokkal: H n = 1 n! n + 1 2
Stirling számok 11.feladat: kapcsolat a harmonikus számok és Stirling számok között: def stirling1 (n, k): if k == 0: return 0 if n == k: return 1 return stirling1(n-1, k-1) - (n-1) * stirling1(n-1, k) def harmonikus(n): return stirling1(n+1, 2), fakti(n)
Sajátos számsorozatok A Fibonacci számok: A 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, léteznek hatékonyabb rekurziós összefüggések, alkalmazásuk: A Lucas számok: kombinatorika, algoritmusok futási idejének elemzése, minden pozitív egész szám feĺırható Fibonacci számok összegeként, aranymetszés, zene, művészetek, természet. A 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,
12.feladat: Fibonacci számok, klasszikus rekurzív megoldás, nem hatékony: def fibr (n): if n == 0: return 0 if n == 1: return 1 return fibr (n-1) + fibr (n-2) 13.feladat: Fibonacci számok listába, iteratív megoldás, lineáris futási idő: def fibl (n): a, b = 0, 1 L = [a, b] for i in range (1, n): L += [a + b] temp = a + b a = b b = temp return L
14.feladat: Fibonacci számok, rekurzív megoldás hatékony, logaritmikus futási idő: a feladat visszavezethető a gyorshatványozás algoritmusára: F n = [ 1 1 1 0 ] n 1, F 5 = [ 1 1 1 0 ] 4 = [ 5 3 3 2 és 2 2 mátrixszorzásokra, ahol a mátrix speciális alakú: [ ] [ ] [ ] a b a b a 2 + b 2 b (a + c) = b c b c b (a + c) b 2 + c 2 a mátrixot egy számhármassal tudjuk reprezentálni: (a, b, c) ]
A gyors-hatványozás másképp: def my_pow (x, n): if n == 0: return 1 temp = my_pow (x, n/2) if n % 2 == 1: return x * temp * temp else: return temp * temp Fibonacci számok, gyors-hatványozásra visszavezetve: def fibr1 (n): (a, b, c) = sfib (n) return b def sfib (n): if n == 0: return (1, 0, 1) (a, b, c) = sfib (n / 2) (a, b, c) = (a*a + b*b, b*(a+c), b*b + c*c) if n % 2 == 1: return (a+b, a, b) else: return (a, b, c)