Diszkrét matematika 12. előadás mgyongyi@ms.sapientia.ro Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, ománia 2018, őszi félév
Miről volt szó az elmúlt előadáson? a diszkrét logaritmus, algoritmusok a brute-force algoritmus Baby-step Giant-step, Shanks algoritmusa a számelmélet alaptétele összetett számok faktorizációja: a Fermat féle faktorizáció a Pollard ρ féle faktorizáció az SA rendszer, baby változat
Miről lesz szó? Kombinatorikai alapfogalmak lexicográfikus sorrend permutációk, variációk, kombinációk összes részhalmaz meghatározása az n királynő probléma
Lexicográfikus sorrend 1. feladat Határozzuk meg a 0, 1 elemekből képezhető n hosszúságú listákat. Az algoritmus a következő ötleten alapszik: az allexi0 függvény az L = [ 0, 1 ] listából előálĺıtja az L1 = [ 00, 01, 10, 11 ] listát, amelyet visszatérít a hívó függvénynek. def allexi0(l): L1 = [] for X in L: L1 += [X + 0 ] L1 += [X + 1 ] return L1 def lexi0(n): L = [ ] for i in range(n): L = allexi0(l) return L >>> lexi0(3) [ 000, 001, 010, 011, 100, 101, 110, 111 ]
Lexicográfikus sorrend 2. feladat Határozzuk meg az n hosszúságú, tetszőleges listaelemekből képezhető listákat. def allexi1(al, L): L1 = [] for X in L: for elem in al: L1 += [X + elem] return L1 def lexi1(al, n): L = [ ] for i in range(n): L = allexi1(al, L) return L >>> lexi1( 01, 3) [ 000, 001, 010, 011, 100, 101, 110, 111 ] >>> lexi1( abc, 2) [ aa, ab, ac, ba, bb, bc, ca, cb, cc ]
Kombinatorikai alapfogalmak n elem permutációjának a meghatározása: Hányféleképpen tudunk öt könyvet feltenni egy polcra? Melyek lesznek ezek az elrendezések? 5! = 120 n! n elem m-ed rendű variációjának meghatározása: Öt sportoló között hányféleképpen osztható ki az első, második, illetve harmadik hely? Melyek lesznek ezek az elrendezések? 5 4 3 = 60, n (n 1)... (n m + 1) n elem m-ed rendű kombinációjának a meghatározása: Négy diák közül hány fajta 3 diákból álló diákképviseleti testületet lehet létrehozni? Melyek lesznek ezek a testületek? 4! = 4, n! 3! (4 3)! m! (n m)!
Permutációk 3. feladat Határozzuk meg az {1, 2,..., n} elemek összes permutációját. Algoritmus: előálĺıtjuk az összes n hosszúságú listát, egy elemet azonban csak akkor adunk hozzá az aktuális listához, ha az még nem szerepelt benne. def alpermut(al, L): L1 = [] for X in L: for elem in al: if elem not in X: L1 += [X + elem] return L1 >>> permut( 01 ) [ 01, 10 ] def permut(al): L = [ ] for i in range(len(al)): L = alpermut(al, L) return L >>> permut( 123 ) [ 123, 132, 213, 231, 312, 321 ]
Variáció 4. feladat Határozzuk meg egy n elemű halmaz m-ed rendű variációit. def alvar(al, L): L1 = [] for X in L: for elem in al: if elem not in X: L1 += [X + elem] return L1 def variacio(al, m): L = [ ] for i in range(m): L = alvar(al, L) return L >>> variacio( abc, 2) [ ab, ac, ba, bc, ca, cb ]
Kombináció 5. feladat Határozzuk meg egy n elemű halmaz m-ed rendű kombinációit. Algoritmus: előálĺıtjuk az összes m hosszúságú listát, és egy elemet csak akkor adunk hozzá az aktuális listához, ha a fugv függvényben megadott feltételeknek megfelel. def fugvk(elem, X): for x in X: if elem <= x: return False return True def alkomb(al, L): L1 = [] for X in L: for elem in al: if fugvk (elem, X): L1 += [X + elem] return L1 >>> kombinacio( 678, 2) [ 67, 68, 78 ] def kombinacio(al, m): L = [ ] for i in range(m): L = alkomb(al, L) return L
Az összes részhalmaz meghatározása Egy n elemszámú halmaz részhalmazainak száma 2 n. legyen: A = 123 az előálĺıtható részhalmazok: H = [, 1, 2, 12, 3, 13, 23, 123 ] az előálĺıtás lépéssorozata: elem A1 H [ ] 1 [ 1 ] [, 1 ] 2 [ 2 ] [ 2, 12 ] [, 1, 2, 12 ] 3 [ 3 ] [ 3, 13 ] [ 3, 13, 23 ] [ 3, 13, 23, 123 ] [, 1, 2, 12, 3, 13, 23, 123 ]
Az összes részhalmaz meghatározása 6. feladat Generáljuk ki egy adott halmaz összes részhalmazát. def reszhalmazok(a): H = [ ] for elem in A: A1 = [] for x in H: A1 += [x + elem] H += A1 return H >>> reszhalmazok( 123 ) [, 1, 2, 12, 3, 13, 23, 123 ] def reszhalmazok1(a): H = [ ] for elem in A: H += [x + elem for x in H] return H
Az n királynő problémája 7. feladat Írjunk programot, amely megadja egy 8 8-as sakktáblán 8 királynőnek az elhelyezését, úgy hogy azok ne üssék egymást. Oldjuk meg a feladatot általános esetben, azaz n királynő esetében, illetve adjunk meg minden megoldást. Két királynő nem üti egymást ha nincsenek ugyanabban a sorban, oszlopban, illetve átlón. n = 4 esetében két megoldás van: A két megoldásnak megfelelő megoldáslista: 2413, 3142.
Az n királynő problémája Az algoritmus a lexicografikus sorrend generálásának algoritmusa alapján működik: def queen(n): L = [ ] al =.join(str(i) for i in range(1,n+1)) ind = 0 for i in range(n): L = alqueen(al, L, ind) ind += 1 return L >>> queen(4) [ 2413, 3142 ]
Az n királynő problémája def alqueen(al, L, ind): L1 = [] for X in L: for elem in al: if queenf (elem, X, ind): L1 += [X + elem] return L1 def queenf(elem, X, ind): for x in X: if elem == x: return False if abs(int(elem) - int(x)) == ind: return False ind -= 1 return True