diszkrét matematika 3. eloadás - sapientiamgyongyi/diszkretmat/3_szamtart.pdfdiszkrét matematika...
TRANSCRIPT
-
Diszkrét matematika
3. el®adás
MÁRTON Gyöngyvérhttps://ms.sapientia.ro/∼mgyongyi/[email protected]
Sapientia EMTE,Matematika-Informatika TanszékMarosvásárhely, Románia
2020, ®szi félév
MÁRTON Gyöngyvér 2020, Diszkrét matematika
https://ms.sapientia.ro/~mgyongyi/
-
Mir®l volt szó az elmúlt el®adáson?
Python, alapfogalmak: változók, típusok, függvények, algoritmusok, aprogramírás lépései, operátorok, utasítások (while), rekurzió, típusokközötti átalakítások
számtartományok: természetes számok
aritmetikai m¶veletek, a min függvény
a faktoriális függvény - iteratív, rekurzív változatok
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Mir®l lesz szó?
a gyorshatványozás algoritmusa - iteratív, rekurzív változatok, szorzásokszáma
Python alapfogalmak: a lista, tuple típus
számtartományok: egész számok
polinom helyettesítési értéke
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Algoritmusok Pythonban
1. feladat
Határozzuk meg xn értékét a gyorshatványozás algoritmusával.
Létezik olyan algoritmus, amely 2100 meghatározásakor 9 darab szorzást végez.Hogyan?? ⇒ a gyorshatványozás algoritmusával, amely logaritmikus futásiidej¶.
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
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
A gyorshatványozás algoritmus, példa
3100 meghatározása:
def my_pow (x, n):res = 1while n != 0:
if n % 2 == 1: res = res * xn = n // 2x = x * x
return res
x n res1
3 100 132 = 9 50 1
34 = 81 25 8138 = 6561 12 81
316 = 43046721 6 81332 = 1853020188851841 3 150094635296999121
364 = 3433683820292512484657849089281 1 5153775207320113310364611297656212727021075220013128 = 117 . . . 961 0
Az eredmény: 3100 = 34 · 332 · 364 = 515377520732011331036461129765621272702107522001.
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Algoritmusok Pythonban
2. feladat
Határozzuk meg xn értékét, rekurzív I. változat
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
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Algoritmusok Pythonban
3. feladat
Határozzuk meg xn értékét, rekurzív II. változat.
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
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Python, szintaxis
A rendezett ennes (tuple) típus
elemek/adatok szekvenciája, amelyek értékét nem lehetmegváltoztatni/immutable
létrehozásakor kerek zárójelet használunk, helyenként ez elhagyható
ha azt szeretnénk, hogy egy függvény egynél több értéket térítsen vissza, akkornagyon el®nyös a használatuk
Példák:
>>> t = (1, "karakterlanc", 5.4)
>>> t[1]
'karakterlanc'
>>> t[1] = "masik karakterlanc"
...
TypeError: 'tuple' object does not support item assignment
>>> t = t + ("masik karakterlanc",) #hozzafuzes - append
(1, 'karakterlanc', 5.4, 'masik karakterlanc')
>>> len(t) #a tuple elemeinek száma
4MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Algoritmusok Pythonban
4. feladat
Határozzuk meg, hogy hány szorzást végez a gyorshatványozás algoritmusának
II. rekurzív változata.
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_ függvény visszatérítési értéke egy tuple típusú érték (számpár),ahol a kerek zárójeleket elhagytuk.
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Algoritmusok Pythonban
>>> SzorSzama(2, 1023)
Szorzasok szama: 20
>>> SzorSzama(2, 1024)
Szorzasok szama: 12
>>> SzorSzama(2, 1025)
Szorzasok szama: 13
Miért van ekkora eltérés a szorzások számátillet®en, a három különböz® hatványkitev®esetében?
Meghatározzuk a kitev®k kettes számrendszerbeli alakját, használjuk a beépített binfüggvényt:
>>> bin(1023)
'0b1111111111'
>>> bin(1024)
'0b10000000000'
>>> bin(1025)
'0b10000000001'
A szorzások számát az határozza meg, hogy a hatványkitev® kettes számrendszerbeli
alakja hány bites, illetve hány 1-es szerepel benne!!
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Python függvények
További számrendszerek közötti átalakításokat is végezhetünk; 8-as, illetve 16-osszámrendszerbeli értéket határoz meg a következ® két függvény, az eredmény stringtípusú lesz:
>>> oct(1023)
'0o1777'
>>> hex(1023)
'0x3ff'
Az int függvény a stringként megadott hexadecimális, bináris, stb, alak alapjánmeghatározza a tízes számrendszerbeli alakot:
>>> int('3FF', 16)
1023
>>> int('1111111111', 2)
1023
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Python függvények
A format kétparaméteres, alkalmas bináris, oktális, hexadecimális alakmeghatározására:
>>> format(1023, 'b') #bináris (2-es) alak
'1111111111'
>>> format(1023, 'o') #oktális (8-as) alak
'1777'
>>> format(1023, 'x') #hexa (16-os) alak
'3ff'
>>> format(1023, 'X')
'3FF'
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Egész számok
halmazjelölés: Z = {. . . ,−3,−2,−1, 0, 1, 2, 3, . . . },
tulajdonságok:
N ⊂ Z, és a két halmaz számossága ugyanaz,két halmaz számossága, akkor egyezik meg, ha a két halmaz között
létezik egy bijekció, pl: f (x) =
{2x ha x ≥ 0,−2x − 1 ha x < 0,
kommutatívitás, asszociativitás, disztributivitás,az egész számok halmaza zárt az összeadásra, kivonásra, szorzásranézve, de ez nem igaz az osztásra,az összeadásra nézve minden elemnek van inverz eleme,rendezettség: a ≤ b, ha b − a ∈ N.
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Python, szintaxis
A lista (list) típus
elemek/adatok szekvenciája, amelyek értékét meg lehetváltoztatni/mutable
létrehozásakor szögletes zárójelet használunk
hasonló a tuple adatszerkezethez, a programozó dönti el, mikor, melyiketel®nyösebb használni
azonos típusú adatok esetében lista típust, különböz® típusú adatokesetében tuple típust szoktak használni
Példák:
>>> L = list(range(10))
>>> print (L)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print (L[2])
2
>>> L[2] = -2 #a lista egy vagy több elemének értéke megváltoztatható
>>> print (L)
[0, 1, -2, 3, 4, 5, 6, 7, 8, 9]
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Python, szintaxis
>>> L = L + [10] #hozzafuzes - append
>>> print (L)
[0, 1, -2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> print ('a lista fordított sorrendben: ', L[::-1])
a lista fordított sorrendben: [10, 9, 8, 7, 6, 5, 4, 3, -2, 1, 0]
L = L + ['kar lanc'] #más típusú adattal is b®víthet® a lista
>>> print (L)
[0, 1, -2, 3, 4, 5, 6, 7, 8, 9, 10, 'kar lanc']
>>> L[:3] # a lista elemei, a harmadik elemig
[0, 1, -2]
>>> L[3:] # a lista elemei a harmadik elemt®l kezd®d®en
[3, 4, 5, 6, 7, 8, 9, 10, 'kar lanc']
>>> L1 = 5 * ['helo']
>>> print(L1)
['helo', 'helo', 'helo', 'helo', 'helo']
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Python, szintaxis
Mit írnak ki a képerny®re a következ® függvényhívások?
def valtozok1():
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 valtozok2():
x = [6, 7]
y = x
x = x + [8]
print('x: ', x)
print('y: ', y)
print('id_x: ', id(x))
print('id_: ', id(y))
print (x == y)
def valtozok3():
x = [6, 7]
y = x
x += [8]
print('x: ', x)
print('y: ', y)
print('id_x: ', id(x))
print('id_: ', id(y))
print (x == y)
def valtozok4():
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)
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Logikai kifejezések, m¶veletek, operátorok
Összehasonlító operátorok:
a == b, ha a egyenl® b-vel, akkor True értéket ada != b, ha a nem egyenl® b-vel, akkor True értéket ada > b, ha a nagyobb, mint b, akkor True értéket ada >= b, ha a nagyobb vagy egyenl®, mint b, akkor True értéket ada < b, ha a kisebb, mint b, akkor True értéket ada >> x = 760
>>> if x % 2 == 0 and x % 5 == 0: print ('a szam osztható 10-el')
else: print ('a szam nem osztható 10-el')
>>> mStr = 'Helo világ!'
>>> if mStr[-1] == '!' or mStr[-1] == '?':
print ('nem kijelento mondat')
else: print ('kijelento mondat')
MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Algoritmusok Pythonban
5. feladat
Határozzuk meg egy adott polinom helyettesítési értékét, megadott értékre.
A függvény bemenete tartalmazza a helyettesítési értéket és a polinomegyütthatóit, mint listaelemeket, ahol a lista els® eleme a polinom legnagyobbfokszámú eleme lesz: A(c) = an · cn + · · ·+ a1 · c + a0kétféleképpen is megadjuk az algoritmust, ahol a Horner módszer lesz ahatékonyabb, kevesebb szorzást végez a végs® eredmény meghatározásához.
def poly(c, A):
p = 1
res = 0
for a in reversed(A):
res = res + a * p
p *= c
return res
>>> poly(5, [4,7,0,8,2,1,20])
def horner(c, A):
res = 0
for a in A:
res = res * c + a
return res
>>> horner(5, [4,7,0,8,2,1,20])
85450 = 4 · 56 + 7 · 55 + 0 · 54 + 8 · 53 + 2 · 52 + 1 · 51 + 20MÁRTON Gyöngyvér 2020, Diszkrét matematika
-
Algoritmusok Pythonban
6. feladat
A numpy, illetve matplotlib csomagok segítségével ábrázoljunk egy megadott
együtthatójú polinomot.
A numpy és matplotlib csomagokat telepítéséhez, el®bb érdemes telepíteni a piptelepít®t, amivel a kés®bbiekben bármilyen Python csomagot könnyedén tudunktelepíteni (a Python újabb verziói tartalmazzák alapból).
Windows: be kell állítani a PATH környezetváltozót (environment variable), úgyhogy megadjuk a python.exe állomány elérési útvonalát (System/Advancedsystem settings), ezután bárhonnan kiadható lesz a python parancs
töltsük le egy mappába a get-pip.py állományt
nyíssunk meg egy Command prompt ablakot, válasszuk ki azt a mappát amibe aget-pip állományt tettük
adjuk ki a következ® parancsokat:
python get-pip.py
python -m install �-upgrade pip
python -m pip install numpy
python -m pip install matplotlib
python -m pip install matplotlib.pyplot
MÁRTON Gyöngyvér 2020, Diszkrét matematika
https://bootstrap.pypa.io/3.2/get-pip.py
-
Algoritmusok Pythonban
import numpy as np
import matplotlib.pyplot as plt
def main():
X = np.linspace(-200, 200, 300, endpoint=True)
F1 = horner(X, [1, -4, 3])
F2 = horner(X, [2, 7, 7])
#F1 = horner(X, [4, 11, 3, 5])
#F2 = horner(X, [10, 3, 11, 19])
plt.plot(X, F1, label = "F1")
plt.plot(X, F2, label = "F2")
plt.show()
main()
MÁRTON Gyöngyvér 2020, Diszkrét matematika