27
Diszkr´ et matematika 2.el˝oad´ as M ´ ARTONGy¨ongyv´ er [email protected] Sapientia Egyetem, Matematika-Informatika Tansz´ ek Marosv´ as´ arhely, Rom´ ania 2018,˝oszif´ el´ ev M ´ ARTON Gy¨ ongyv´ er 2018, Diszkr´ et matematika

Diszkr et matematika 2. el}oad as - ms.sapientia.romgyongyi/DiszkretMat/2_Szamtart.pdf · Diszkr et matematika 2. el}oad as MARTON Gy ongyv er [email protected] Sapientia Egyetem,

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: