diszkrét matematika 6. eloadásmgyongyi/diszkretmat/6_szamrendszerek.pdfdiszkrét matematika 6....
Post on 26-Feb-2020
17 Views
Preview:
TRANSCRIPT
Diszkrét matematika
6. el®adás
MÁRTON Gyöngyvérmgyongyi@ms.sapientia.ro
Sapientia Egyetem,Matematika-Informatika TanszékMarosvásárhely, Románia
2019, ®szi félév
MÁRTON Gyöngyvér 2019, Diszkrét matematika
Mir®l volt szó az elmúlt el®adáson?
számtartományok: komplex számok
másodfokú egyenlet komplex gyökei
m¶veletek komplex számokkal: szorzat, hatványozás, stb
fraktálok: Mandelbrot, Julia
számrendszerek
MÁRTON Gyöngyvér 2019, Diszkrét matematika
Mir®l lesz szó?
számrendszerek
számrendszerek közötti átalakítások
Más számrendszerek:
vegyes alapú számrendszereka faktoriális számrendszera Fibonacci számrendszer
Fibonacci számok
MÁRTON Gyöngyvér 2019, Diszkrét matematika
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 nr az a szám, amit átszeretnénk írni b számrendszerbe, ekkor,Z∗-al jelölve a nem negatív egész számok halmazát:
nr = akbk + ak−1b
k−1 + · · ·+ a1b1 + a0b
0,ahol k ∈ Z∗, ai ∈ Z∗, és ai < b, minden i ∈ {0, . . . , k} értékre és ak 6= 0,
a nr szám b számrendszerben felírt számjegyeit a következ® lista elemei
alkotják: [an, an−1, . . . , a2, a1]
2-es számrendszerben 2 szimbólum van: 0, 1,16-os számrendszerben 16 szimbólum van:0, 1, 2, . . . , 9,A,B,C ,D,E ,F ,256-os számrendszerben 256 szimbólum van.
MÁRTON Gyöngyvér 2019, Diszkrét matematika
Algoritmus: 10-es számrendszerb®l b számrendszerbe
nr -et elosztjuk b-vel, legyen az osztási egészrész q0, a maradék a0, ekkorfennáll: n = b · q0 + a0, ahol 0 ≤ a0 < b.
q0-ot elosztjuk b-vel, legyen az osztási egészrész q1, a maradék a1, ekkorfennáll : q0 = b · q1 + a1, ahol 0 ≤ a1 < b.
addig folytatjuk az osztást, amíg 0 osztási egészrészt kapunk,
b számrendszerbeli számjegyeket: ak , ak−1, . . . a1, a0-t az osztási folyamatsorán el®állt maradékok alkotják
Pl. Alakítsuk át 7432-t 16-os számrendszerbe:
7432 = 464 · 16+ 8464 = 29 · 16+ 029 = 1 · 16+ 131 = 0 · 16+ 1
MÁRTON Gyöngyvér 2019, Diszkrét matematika
Algoritmusok Pythonban
1. feladat
Írjunk programot, amely átalakít egy számot 10-es számrendszerb®l bszámrendszerbe.
Az eredmény egy lista típusú adat lesz, amely tartalmazza a b számrendszerbeliszámjegyeket.
def conv_10b(nr, b):
L = []
while nr > 0:
L = [nr % b] + L
nr = nr // b
return L
>>> conv_10b(14, 2)
[1, 1, 1, 0]
Ha az L = [nr % b] + L sor helyett az L = L + [nr % b] sort írjuk, akkorfordított sorrendet kapunk.
MÁRTON Gyöngyvér 2019, Diszkrét matematika
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 2D5A8-t 10-es számrendszerbe:
2D5A8 = [2, 13, 5, 10, 8]
16 · 0+ 2 = 2
16 · 2+ 13 = 16 · 2+ 13
16 · (16 · 2+ 13) + 5 = 162 · 2+ 16 · 13+ 5
16 · (162 · 2+ 16 · 13+ 5) + 10 = 163 · 2+ 162 · 13+ 16 · 5+ 10
16 · (163 · 2+ 162 · 13+ 16 · 5+ 10) + 8 = 164 · 2+ 163 · 13+ 162 · 5+ 16 · 10+ 8
MÁRTON Gyöngyvér 2019, Diszkrét matematika
Algoritmusok Pythonban
2. feladat
Írjunk programot, amely átalakít egy b számrendszerbeli számot 10-esszámrendszerbe.
A függvény bemenete egy lista típusú adat lesz, amely tartalmazni fogja a bszámrendszerbeli számjegyeket; a függvény kimenete, pedig egy egész számlesz.
def conv_b10(L, b):
nr = 0
for elem in L:
nr = nr * b + elem
#print (nr)
return nr
>>> conv_b10([1, 1, 1, 0], 2)
14
>>> conv_b10(conv_10b(65, 2), 2)
65
MÁRTON Gyöngyvér 2019, Diszkrét matematika
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 → 2k : k-as csoportokat formálunk
Pl. 2→ 256 = 28, 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]
MÁRTON Gyöngyvér 2019, Diszkrét matematika
Algoritmusok Pythonban
3. feladat
Írjunk programot, amely egy 2-es számrendszerben megadott számot átalakít 2k
számrendszerbe.
def conv_2_2k(L, k):
nr = 0
m = len(L) % k
for elem in L[:m]:
nr = nr * 2 + elem
if nr != 0: nL = [nr]
nr, i = 0, 0
for elem in L[m:]:
nr = nr * 2 + elem
i += 1
if i == k:
nL = nL + [nr]
nr, i = 0, 0
return nL
Házi feladat: módosítsuk a fenti kódrészletet, úgy hogy ne adjon futási hibát, ha a
bemeneti L lista hossza osztható k-val.
MÁRTON Gyöngyvér 2019, Diszkrét matematika
Algoritmusok Pythonban
Alakítsunk át egy számot 2-es számrendszerb®l 8 = 23-as számrendszerbe:
>>> conv_2_2k([1, 1, 0, 1, 0, 1], 3)
[6, 5]
Alakítsunk át egy számot 2-es számrendszerb®l 256 = 28-as számrendszerbe:
>>> conv_2_2k([1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1], 8)
[57, 107]
MÁRTON Gyöngyvér 2019, Diszkrét matematika
Algoritmusok Pythonban
4. feladat
Írjunk programot, amely egy 2k számrendszerben megadott számot átalakít2-es számrendszerbe.
def conv_2k_2(L, k):
nL = []
for elem in L:
sL = []
for i in range(k):
sL = [elem % 2] + sL
elem = elem // 2
nL += sL
return nL
MÁRTON Gyöngyvér 2019, Diszkrét matematika
Algoritmusok Pythonban
Alakítsunk át egy számot 8 = 23 -as számrendszerb®l 2-es számrendszerbe
>>> conv_2k_2([6, 5], 3)
[1, 1, 0, 1, 0, 1]
Alakítsunk át egy számot 256 = 28-os számrendszerb®l 2-es számrendszerbe
>>> conv_2k_2([57, 107], 8)
[0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1]
A két függvényt együtt alkalmazva:
>>> conv_2_2k(conv_2k_2([217, 107, 28, 142, 55], 8), 8)
[217, 107, 28, 142, 55]
MÁRTON Gyöngyvér 2019, Diszkrét matematika
Más számendszerek
Vegyes alapú számrendszerek
a számrendszer alapszáma változópéldául, id®mérés: 27. hét, 3. nap, 6 óra, 20 perc, 15 másodperc.27523762420601560az index szám az alapszámot, a mértékegységet jelzi; a piros szín¶számok, a számjegyek azt jelzik, hogy az adott mértékegységb®lhányat használunk fel
A faktoriális-számrendszer
Cantor ábrázolásnak is mondjákalapját az képezi, hogy bármely szám egyértelm¶en felírható afaktoriális függvény értékeinek segítségével
nr = an · n! + an−1 · (n − 1)! + · · ·+ a2 · 2! + a1 · 1!, aholai ∈ [0, 1, . . . , i ], bármely i ∈ [1, 2, . . . , n]
a nr szám faktoriális számrendszerben felírt számjegyeit a következ®lista elemei alkotják: [an, an−1, . . . ], a2, a1]
MÁRTON Gyöngyvér 2019, Diszkrét matematika
A faktoriális-számrendszer
Pl. Mennyi (8172)10, faktoriális-számrendszerbeli alakja?
8172 = 1 · 7! + 4 · 6! + 2 · 5! + 0 · 4! + 2 · 3! + 0 · 2! + 0 · 1!8172 = 1 · 5040+ 4 · 720+ 2 · 120+ 2 · 68172 = [1, 4, 2, 0, 2, 0, 0]faktBase
Pl. Mennyi (45389)10, faktoriális-számrendszerbeli alakja?
45389 = 1 · 8! + 1 · 7! + 0 · 6! + 0 · 5! + 1 · 4! + 0 · 3! + 2 · 2! + 1 · 1!45389 = 1 · 40320+ 1 · 5040+ 1 · 24+ 2 · 2+ 1 · 145389 = [1, 1, 0, 0, 1, 0, 2, 1]faktBase
Az algoritmus:
a nr szám ábrázolása esetén létezik egy n egész szám, amelyre:n! ≤ nr < (n + 1)!az osztási algoritmus szerint nr = an · n! + rn, ahol 0 ≤ an ≤ n és0 ≤ rn < n!hasonlóan, felírható: rn = an−1 · (n − 1)! + rn−1, ahol0 ≤ an−1 ≤ (n − 1) és 0 ≤ rn−1 < (n − 1)!tehát iterálva kapjuk az an, an−1, . . . a1 értékeket, amelyek aszámrendszerbeli számjegyeket fogják jelenteni.
MÁRTON Gyöngyvér 2019, Diszkrét matematika
A faktoriális-számrendszer
Hatékonyabb algoritmus a nr szám faktoriális számrendszerbeli alakjának ameghatározására:
meghatározzuk nr 2-vel való osztási egészrészét (q1), illetve osztásimaradékát (a1), felírható: nr = 2 · q1 + a1
meghatározzuk q1 3-mal való osztási egészrészét, illetve osztásimaradékát, felírható: q1 = 3 · q2 + a2
folytatjuk az osztási folyamatot a 4, 5, ... értékekkel, amíg az osztásiegészrész nem lesz 0.
az osztási folyamat során kiszámolt maradékok lesznek nr faktoriálisszámrendszerbeli számjegyei
fennáll:nr = 2 ·(3 ·(4 ·(5 ·(...)+a4)+a3)+a2)+a1 =... ·4! ·a4+3! ·a3+2! ·a2+a1
nr = [an, an−1, . . . a2, a1]faktBase
MÁRTON Gyöngyvér 2019, Diszkrét matematika
A faktoriális-számrendszer
5. feladat
Határozzuk meg egy szám faktoriális számrendszerbeli számjegyeit.
def digitToFaktB(nr):
L = []
n = 2
while nr != 0:
q = nr // n
a = nr - q * n #a = nr % n
#print (nr, q, i, a, end = "\n")
nr = q
L = [a] + L
n = n + 1
return L
>>> digitToFaktB(45389)
[1, 1, 0, 0, 1, 0, 2, 1]
MÁRTON Gyöngyvér 2019, Diszkrét matematika
A faktoriális-számrendszer
Határozzuk meg az el®z® oldalon megadott algoritmus szerint, 8172 faktoriálisszámrendszerbeli számjegyeit:
nr q n a
8172 4086 2 04086 1362 3 01362 340 4 2340 68 5 068 11 6 211 1 7 41 0 8 1
q = nr // n
a = nr - q * n #a = nr % n
nr = q
8172 = 2 · (3 · (4 · (5 · (6 · (7 · (8 · 0+ 1) + 4) + 2) + 0) + 2) + 0) + 0
8172 = 2 · 3 · 4 · 5 · 6 · 7 · 1+ 2 · 3 · 4 · 5 · 6 · 4+ 2 · 3 · 4 · 5 · 2+ 2 · 3 · 4 · 0+ 2 · 3 · 2+ 2 · 0+ 0
8172 = [1, 4, 2, 0, 2, 0, 0]faktBase
MÁRTON Gyöngyvér 2019, Diszkrét matematika
A Fibonacci számrendszer
a Fibonacci-számrendszert, Zeckendorf ábrázolásnak is hívjuk
alapját az képezi, hogy bármely szám egyértelm¶en felírható Fibonacciszámok összegeként:
nr = an · Fn + an−1 · Fn−1 + · · ·+ a2 · F2 + a1 · F1, aholai ∈ [0, 1], bármely i ∈ [1, 2, . . . , n], és Fn,Fn−1, . . . ,F2,F1 a 0,1
kezd®értékeket elhagyva kapott Fibonacci számsorozat.
a nr szám Fibonacci számrendszerben felírt számjegyeit a következ® listaelemei alkotják: [an, an−1, . . . , a2, a1]
MÁRTON Gyöngyvér 2019, Diszkrét matematika
A Fibonacci számrendszer
6. feladat
Határozzuk meg egy szám Fibonacci számrendszerbeli alakját. Az eredményt egystring típusú változóba generáljuk ki.
A fibL függvény, meghatározza, a 1, 2-vel kezd®d® Fibonacci számsorozat elemeit,
amelyek nem nagyobbak mint nr , egy lista típusú változóba. Ezt meg kell írni!
def digitToFib(nr):
fL = fibL(nr)
L = ''
for elem in fL[::-1]:
if nr >= elem:
L += '1'
nr = nr - elem
#print (elem, end = ' ')
else: L += '0'
#print('')
return L
>>> digitToFib(100)
1000010100
100 = 89 + 8 + 3
MÁRTON Gyöngyvér 2019, Diszkrét matematika
A Fibonacci számsorozat
A számsorozat: 0, 1, 1, 2, 3, 5, 8, 13, . . . ,
A rekurziós képlet: F0 = 0,F1 = 1,Fn = Fn−1 + Fn−2,
léteznek hatékonyabb rekurziós összefüggések,
alkalmazásuk:
kombinatorika,algoritmusok futási idejének elemzése,minden pozitív egész szám felírható Fibonacci számok összegeként,aranymetszés, zene, m¶vészetek, természet.
A Lucas számok, ugyanaz az összefüggés a számok között, más a két kezdetiérték:
A számsorozat: 2, 1, 3, 4, 7, 11, 18, 29, 47, . . . ,
A rekurziós képlet: L0 = 2, L1 = 1, Ln = Ln−1 + Ln−2,
MÁRTON Gyöngyvér 2019, Diszkrét matematika
A Fibonacci számsorozat
7. feladat
Határozzuk meg az n-ik Fibonacci számot.
A következ® algoritmus futási ideje exponenciális, az el®z® oldalon megadott rekurzív
képletet alkalmazza:
def fibR1 (n):
if n == 0: return 0
if n == 1: return 1
return fibR1 (n-1) + fibR1 (n-2)
A következ® algoritmus futási ideje lineáris, más rekurzív képletet használva:
def fAux(a, b, n):
if n == 1: return a
return fAux(b, a + b, n-1)
def fibR2(n):
return fAux(1, 1, n)
>>> fibR2(100)
354224848179261915075
MÁRTON Gyöngyvér 2019, Diszkrét matematika
Az n-ik Fibonacci szám
8. feladat
Alkalmazva a következ® képletet határozzuk meg az n-ik Fibonacci számot:
Fn =
(1+√5
2
)n−(1− 1+
√5
2
)n
√5
= round
(1+√5
2
)n
√5
def fibF1(n):
temp = sqrt(5)
phi = (1 + temp)/2
return round((phi ** n)/temp)
def fibF2(n):
temp = my_sqrt(5)
phi = (1 + temp)/2
return round((phi ** n)/temp)
def my_sqrt(n):
getcontext().prec = 50
temp = Decimal(0)
for x in range (0, 200):
temp = (n-1) / (2 + temp)
return 1 + temp
>>> fibF1(100)
354224848179263111168
>>> fibF2(100)
354224848179261915075
MÁRTON Gyöngyvér 2019, Diszkrét matematika
Az n-ik Fibonacci szám
Létezik logaritmikus futási idej¶ algoritmus: a feladat visszavezethet® agyorshatványozás algoritmusára:
Fn =
(1 11 0
)n−1
, F5 =
(1 11 0
)4
=
(5 33 2
)ahol meg kell tehát határozni két 2× 2 mátrix szorzatát:(
a bb d
)·
(e ff g
)=
(a · e + b · f a · f + b · ga · f + b · g b · f + d · g
)
fennáll: a · f + b · g == b · e + d · fa hatékonyság végett a mátrixot egy számhármassal lehet ábrázolni, merta mellékátlón az elemek megegyeznek
def szor(t1, t2):
a, b, d = t1
e, f, g = t2
return (a * e + b * f, a * f + b * g, b * f + d * g)
MÁRTON Gyöngyvér 2019, Diszkrét matematika
top related