diszkrét matematika 3. eloadás - sapientiamgyongyi/diszkretmat/3_szamtart.pdfdiszkrét matematika...

20

Upload: others

Post on 12-Feb-2021

3 views

Category:

Documents


0 download

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