Upload
phamminh
View
226
Download
0
Embed Size (px)
Citation preview
Diszkret matematika2. eloadas
MARTON [email protected]
Sapientia Egyetem,Matematika-Informatika TanszekMarosvasarhely, Romania
2018, oszi felev
October 10, 2018
MARTON Gyongyver 2018, Diszkret matematika
Mirol volt szo az elmult eloadason?
kovetelmenyek, osztalyozas, konyveszet
attekinto
Python: tulajdonsagok, teleptes, hasznalat
Python, alapfogalmak: valtozok, tpusok, utastasok (for, if),fuggvenyek, algoritmusok
MARTON Gyongyver 2018, Diszkret matematika
Mirol lesz szo?
szamtartomanyok: termeszetes szamok, egesz szamok
Python alapfogalmak: utastasok (while), fuggvenyhvasok (rekurzio), alista, a tuple tpusu adatszerkezetek
a faktorialis fuggveny - iteratv, rekurzv valtozatok
a gyorshatvanyozas algoritmusa - iteratv, rekurzv valtozatok
allomanykezeles, bevezeto fogalmak
MARTON Gyongyver 2018, Diszkret matematika
Szamok
szamtartomanyok: termeszetes szamok, egesz szamok, racionalis szamok,irracionalis szamok, valos szamok, komplex szamok,
alapmuveletek szamokkal: osszegzes, kulonbseg, szorzas, osztas,hatvanyozas, logaritmalas,
termeszetes szamok, egesz szamok: a diszkret matematika gerincetalkotjak,
MARTON Gyongyver 2018, Diszkret matematika
Termeszetes szamok
halmazjeloles: N = {0, 1, 2, 3, . . . },
tulajdonsagok:
az osszeadas, szorzas kommutatv:a, b N, a + b = b + a, a b = b aaz osszeadas, szorzas asszociatv:a, b, c N, (a + b) + c = a + (b + c), (a b) c = a (b c)az osszeadas a szorzasra nezve disztributv: barmelya, b, c N, (a + b) c = a c + b ca termeszetes szamok halmaza zart az osszeadasra, szorzasra nezve:barmely ket termeszetes szam osszeadhato, szorozhato az eredmenyszinten termeszetes szam lesz, ez nem igaz a kulonbseg es osztasmuveletekre,a 0 az osszeadasra nezve semleges, az 1 a szorzasra nezve semlegeselem,jol rendezettseg: a termeszetes szamok minden nem uresreszhalmazanak van egy legkisebb eleme.
MARTON Gyongyver 2018, Diszkret matematika
Algoritmusok Pythonban
1. feladat
Hatarozzuk meg n! erteket, azaz az osszes n-nel kisebb pozitv szam szorzatat.
Beeptett konyvtarfuggveny hasznalataval:
>>> from math import factorial
>>> factorial(10)
3628800
Sajat fuggvenyt rva, a for ciklusutastassal:
def my_factorial(n):
res = 1
for i in range(1, n+1):
res *= i
return res
>>> my_factorial(100)
9332621544394415268169923885626670049071596826438162146859296389521759
9993229915608941463976156518286253697920827223758251185210916864000000
000000000000000000
MARTON Gyongyver 2018, Diszkret matematika
Algoritmusok Pythonban
2. feladat
Hatarozzuk meg n! erteket, azaz hatarozzuk meg az osszes n-nel kisebb pozitvszam szorzatat.
while ciklusutastassal:
def myFakt(n):
res = 1
while n >= 1:
res = res * n
n = n - 1
return res
rekurzvan:
def myFakt_(n):
if n == 0: return 1
return n * myFakt_(n-1)
>>> myFakt_(10)
3628800
MARTON Gyongyver 2018, Diszkret matematika
Python, szintaxis
a while ciklusutastas definialasa:
while :
A ciklustorzs addig kerul ismetelten vegrehajtasra, ameddig akifejezes logikai erteke igaz
megfelelo tordelessel (egy tabulatornyi hellyel bennebb) kell jelezni, hogymelyek azok az utastasok amelyek a ciklustorzshoz tartoznak.
barmely kifejezes logikai erteke igaznak minosul, ha az nullatolkulonbozik.
ha a kifejezes erteke indulasbol hamis, akkor egyszer sem hajtodikvegre a ciklustorzs.
MARTON Gyongyver 2018, Diszkret matematika
Algoritmusok Pythonban
3. feladat
Hatarozzuk meg hany nullas szamjegy van n! vegen, anelkul, hogy meghataroznank n!erteket. Pl. hany nullas van 1000! vegen.
Megszamoljuk hogy az hany 5-el, 52-el, 53-al, stb. oszthato szam van n-ig.
Ha n = 91, akkor osszesen 18 + 3 = 21 nullas szamjegy van 91! vegen, mert
5-el oszthato szamok szama: 91 // 5 = 1852-el oszthato szamok szama: 18 // 5 = 353-al oszthato szamok szama: 3 // 5 = 0
def fel(n):
res = 0
while n > 0:
temp = n // 5
res += temp
n = temp
return res
def fel_(n):
res = 0
while n > 0:
res += n // 5
n = n // 5
return res
>>> fel(1000)
249
MARTON Gyongyver 2018, Diszkret matematika
Algoritmusok Pythonban
4. feladat
Hatarozzuk meg xn erteket a gyorshatvanyozas algoritmusaval.
Letezik olyan algoritmus, amely 2100 meghatarozasakor 9 darab szorzast vegez.Hogyan?? a gyorshatvanyozas algoritmusaval, amely logaritmikus futasiideju.
def my_pow (x, n):
res = 1
while n != 0:
if n % 2 == 1:
res = res * x
n = n // 2
x = x * x
return res
>>> my_pow(2, 100)
1267650600228229401496703205376L
def my_pow_ (x, n):
res = 1
while True:
if n % 2 == 1:
res = res * x
n = n // 2
if n == 0: break
x = x * x
return res
MARTON Gyongyver 2018, Diszkret matematika
A gyorshatvanyozas algoritmus, pelda
3100 meghatarozasa:
def my_pow (x, n):
res = 1
while n != 0:
if n % 2 == 1: res = res * x
n = n // 2
x = x * x
return res
x n res1
3 100 1
32 = 9 50 1
34 = 81 25 81
38 = 6561 12 81
316 = 43046721 6 81
332 = 1853020188851841 3 150094635296999121
364 = 3433683820292512484657849089281 1 515377520732011331036461129765621272702107522001
3128 = 117 . . . 961 0
Az eredmeny: 3100 = 34 332 364 = 515377520732011331036461129765621272702107522001.
MARTON Gyongyver 2018, Diszkret matematika
Algoritmusok Pythonban
5. feladat
Hatarozzuk meg xn erteket, rekurzv I. valtozat
def my_pow1 (x, n):
if n == 0: return 1
if n % 2 == 1: return x * my_pow1 (x * x, n // 2)
return my_pow1 (x * x, n // 2)
>>> my_pow1(2, 100)
1267650600228229401496703205376
MARTON Gyongyver 2018, Diszkret matematika
Algoritmusok Pythonban
6. feladat
Hatarozzuk meg xn erteket, rekurzv II. valtozat.
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
MARTON Gyongyver 2018, Diszkret matematika
Python, szintaxis
A rendezett ennes (tuple) tpus
megvaltoztathatatlan elemek/adatok szekvenciaja
letrehozasakor szogletes zarojelet hasznalunk, helyenkent ez elhagyhato
ha azt szeretnenk, hogy egy fuggveny egynel tobb erteket tertsen vissza,akkor nagyon elonyos a hasznalatuk
Peldak:
>>> t = (1, "karakterlanc", 5.4)
>>> t[0]
1
>>> t[1]
karakterlanc
>>> t[2]
5.4
>>> t = t + ("masik karakterlanc",) #hozzafuzes - append
(1, karakterlanc, 5.4, masik karakterlanc)
>>> len(t)
4
MARTON Gyongyver 2018, Diszkret matematika
Algoritmusok Pythonban
7. feladat
Hatarozzuk meg hogy hany szorzast vegez a gyorshatvanyozas algoritmusanakII. rekurzv valtozata.
def my_pow2_ (x, n):
if n == 0: return 1, 0
temp, nr = my_pow2_ (x, n // 2)
if n % 2 == 1: return x * temp * temp, nr + 2
return temp * temp, nr + 1
def SzorSzama (x, n):
res, nr = my_pow2_(x, n)
print ("Szorzasok szama: ", nr)
#print(res)
A my pow2 fuggveny visszatertesi erteke egy tuple tpusu ertek (szampar),ahol a kerek zarojeleket elhagytuk.
MARTON Gyongyver 2018, Diszkret matematika
Algoritmusok Pythonban
>>> SzorSzama(2, 1023)
Szorzasok szama: 20
>>> SzorSzama(2, 1024)
Szorzasok szama: 12
>>> SzorSzama(2, 1025)
Szorzasok szama: 13
Miert van ekkora elteres a szorzasok szamatilletoen, a harom kulonbozo hatvanykitevoeseteben?
Meghatarozzuk a kitevok kettes szamrendszerbeli alakjat, hasznaljuk a beeptett binfuggvenyt:
>>> bin(1023)
0b1111111111
>>> bin(1024)
0b10000000000
>>> bin(1025)
0b10000000001
A szorzasok szamat az hatarozza meg, hogy a hatvanykitevo kettes szamrendszerbeli
alakja hany bites, illetve hany 1-es szerepel benne!!
MARTON Gyongyver 2018, Diszkret matematika
Python fuggvenyek
Tovabbi szamrendszerek kozotti atalaktasokat is vegezhetunk; 8-as, illetve 16-osszamrendszerbeli erteket hataroz meg a kovetkezo ket fuggveny, az eredmeny stringtpusu lesz:
>>> oct(1023)
01777
>>> hex(1023)
0x3ff
Az int fuggveny a stringkent megadott hexadecimalis, binaris, stb, alak alapjanmeghatarozza a tzes szamrendszerbeli alakot:
>>> int(3FF, 16)
1023
>>> int(1111111111, 2)
1023
MARTON Gyongyver 2018, Diszkret matematika
Python fuggvenyek
A format ketparameteres, alkalmas binaris, oktalis, hexadecimalis alakmeghatarozasara:
>>> format(1023, b) #binaris (2-es) alak
1111111111
>>> format(1023, o) #oktalis (8-as) alak
1777
>>> format(1023, x) #hexa (16-os) alak
3ff
>>> format(1023, X)
3FF
MARTON Gyongyver 2018, Diszkret matematika
Egesz szamok
halmazjeloles: Z = {. . . ,3,2,1, 0, 1, 2, 3, . . . },
tulajdonsagok:
N Z, es a ket halmaz szamossaga ugyanaz,ket halmaz szamossaga, akkor egyezik meg, ha a ket halmaz kozott
letezik egy bijekcio, pl: f (x) =
{2x ha x 0,2x 1 ha x < 0,
kommutatvitas, asszociativitas, disztributivitas,az egesz szamok halmaza zart az osszeadasra, kivonasra, szorzasranezve, de ez nem igaz az osztasra,az osszeadasra nezve minden elemnek van inverz eleme,rendezettseg: a b, ha b a N.
MARTON Gyongyver 2018, Diszkret matematika
Python, szintaxis
A lista (list) tpus
elemek/adatok szekvenciaja, amelyek erteket meg lehet valtoztatni
letrehozasakor zart zarojelet hasznalunk
hasonlo a tuple adatszerkezethez, a programozo donti el mikor melyiketelonyosebb hasznalni
azonos tpusu adatok eseteben lista tpust, kulonbozo tpusu adatokeseteben tuple tpust szoktak hasznalni
Peldak:
>>> L = list(range(10))
>>> print (L)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print (L[2])
2
>>> L[2] = -2
>>> print (L)
[0, 1, -2, 3, 4, 5, 6, 7, 8, 9]
MARTON Gyongyver 2018, Diszkret matematika
Python, szintaxis
>>> L = L + [10] #hozzafuzes - append
>>> print (L)
[0, 1, -2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> print (a lista forditott sorrendben: , L[::-1])
a lista forditott sorrendben: [10, 9, 8, 7, 6, 5, 4, 3, -2, 1, 0]
L = L + [kar lanc]
>>> print (L)
[0, 1, -2, 3, 4, 5, 6, 7, 8, 9, 10, kar lanc]
>>> L[:3]
[0, 1, -2]
>>> L[3:]
[3, 4, 5, 6, 7, 8, 9, 10, kar lanc]
>>> L1 = 5 * [helo]
>>> print(L1)
[helo, helo, helo, helo, helo]
MARTON Gyongyver 2018, Diszkret matematika
Python, szintaxis
Mit rnak ki a kepernyore a kovetkezo fuggvenyhvasok?
def valtozok():
x = 6
y = x
x += 1
print(x: , x)
print(y: , y)
print(id_x: , id(x))
print(id_y: , id(y))
print (x == y)
def objektumok2():
X = [6, 7]
Y = X
X = X + [8]
print(X: , X)
print(Y: , Y)
print(id_X: , id(X))
print(id_Y: , id(Y))
print (X == Y)
def objektumok1():
X = [6, 7]
Y = X
X += [8]
print(X: , X)
print(Y: , Y)
print(id_X: , id(X))
print(id_Y: , id(Y))
print (X == Y)
def objektumok3():
x = (6, 7)
y = x
x += (8,)
print(x: , x)
print(y: , y)
print(id_x: , id(x))
print(id_y: , id(y))
print (x == y)
MARTON Gyongyver 2018, Diszkret matematika
Logikai kifejezesek, muveletek, operatorok
Osszehasonlto operatorok:
a == b, ha a egyenlo b-vel, akkor True erteket ada != b, ha a nem egyenlo b-vel, akkor True erteket ada > b, ha a nagyobb, mint b, akkor True erteket ada >= b, ha a nagyobb vagy egyenlo, mint b, akkor True erteket ada < b, ha a kisebb, mint b, akkor True erteket ada >> x = 760
>>> if x % 2 == 0 and x % 5 == 0: print (a szam oszthato 10-el)
else: print (a szam nem oszthato 10-el)
>>> mStr = Helo vilag!
>>> if mStr[-1] == ! or mStr[-1] == ?:
print (nem kijelento mondat)
else: print (kijelento mondat)
MARTON Gyongyver 2018, Diszkret matematika
Egesz szamok
8. feladat
A honapokL a honapok neveit, a minHomersekletL a honapokhoz tartozohomersekleti ertekeket taroljak. Hatarozzuk meg, hogy mely honapokban volt negatva homerseklet.
hL = [januar,februar,marcius,aprilis,majus, junius,
julius,augusztus,szeptember,oktober,november,december]
homL = [-7,-5,-1,4,8,10,12,12,9,4,-1,-5]
def homerseklet1(honapL, homersekletL):
resL = []
for i in range(0,12):
if homersekletL[i] < 0:
resL += [ honapL[i] ]
return resL
A fuggveny meghvasa:>>> homerseklet1(hL, homL)
[januar, februar, marcius, november, december]
MARTON Gyongyver 2018, Diszkret matematika
Egesz szamok
Az elozo feladat masik implementacioja: ebben az esetben, a bemeneti lista egyertekparokbol allo lista lesz:
Lista = [(januar, -7),(februar, -5),(marcius, -1),(aprilis, 4),
(majus,8), (junius, 10), (julius,12),(augusztus,12),
(szeptember,9), (oktober, 4), (november,-1,), (december,-5)]
def homerseklet1_(L):
resL = []
for elem in L:
honap, homerseklet = elem
if homerseklet < 0:
resL += [ honap ]
return resL
>>> homerseklet1_(Lista)
[januar, februar, marcius, november, december]
MARTON Gyongyver 2018, Diszkret matematika
Egesz szamok
9. feladat
A homerseklet.txt a honapok neveit, illetve a honapokhoz tartozo homersekletiertekeket tarolja. Olvassuk ki ezeket az adatokat az allomanybol, es hatarozzuk meg,hogy mely honapokban volt negatv a homerseklet.
A homerseklet.txt tartalma legyen a kovetkezo, ahol minden honapnev kulon sorbanvan megadva es a honapok es a honaphoz tartozo homersekleti ertekek kozott egyspace van:
januar -7
februar -5
marcius -1
aprilis 4
majus 8
junius 10
julius 12
augusztus 12
szeptember 9
oktober 4
november -1
december -5
MARTON Gyongyver 2018, Diszkret matematika
Egesz szamok
A feladat megoldasahoz runk egy kiolvas fuggvenyt, majd az adatok feldolgozasahoz,ugy a homerseklet1, mint a homerseklet2, mar megrt fuggvenyeket hasznalhatjuk:
def feladat():
L = kiolvas()
resL = homerseklet1_(L)
return resL
def kiolvas():
inf = open(homerseklet.txt, rt)
L = []
while True:
temp = inf.readline()
if not temp: break
temp = temp.strip(\n)honap, homerseklet = temp.split( )
L += [(honap, int(homerseklet))]
inf.close()
return L
MARTON Gyongyver 2018, Diszkret matematika
mbtn@1: fd@audio2: mbtn@0: fd@audio1: