Skip to main content

Michal Valko : Projects

Algebraické štruktúry

Problém: Začlenenie hierarchie algebraických štruktúr (grupa, okruh, pole, ...) do Smalltalku. Možnosť využitia takýchto štruktúr. Ukázanie výhod pri implementácii v OOP.

Use cases:

Didaktická pomôcka pri štúdiu vyššej algebry hotové
Propedeutika pomocou názorných objektov - vysvetlenie deliteľnosti (modulárna aritmetika) hotové
Testovanie prvočíselnosti veľkých čísel hotové
Metódy šifrovania dát pomocou grúp (šifrovanie RSA apod.) hotové

Analýza problému:

Algebraické štruktúry sa skladajú z dvoch podstatných častí - základnej množiny a aspoň jednej operácie definovanej na tejto množine.

Operácie sú v zásade troch druhov - nulárne, unárne a binárne (viac-árne operácie sa v implementovaných štruktúrach nevyskytujú). Nulárne aj binárne operácie vo všetkých implementovaných štruktúrach úzko súvisia s binárnou operáciou (/ami) danej štruktúry. Preto je 'binárna operácia' (BinaryOperation) odčlenená ako samostatná abstraktná trieda, ktorej podtriedy budú reprezentovať konkrétne operácie.

Požadované vlastnosti binárnej operácie:

  • binárna operácia je asociatívna (ab)c=a(bc)
  • dokáže 'zoperovať' dva prvky
  • vie určiť niektoré svoje vlastnosti, napr. komutatívnosť, uzavretosť na podmnožine, atď.

Binárna operácia ako taká reprezentuje 'predpis', ktorým sa z dvoch prvkov vytvorí tretí, a algoritmy, ktoré na základe tohto 'predpisu' určia popisované charakteristiky operácie. Teda nie je závislá na konkrétnej množine a je postačujúce, ak bude pracovať na nejakej abstraktnej reprezentácii všetkých prípustných množín (zvačša pôjde o určitý druh číselnej množiny), na ktorej sa daná operácia jednoducho realizuje. Konkrétne algebraické štruktúry však pracujú na konkrétnych množinách, a teda je potrebný určitý 'wrapper' pre každú množinu, ktorý ju dokáže pretransformovať do podobny vhodnej pre operáciu a naopak (MappingOfSet). Vzhľadom na svoj charakter je binárna operácia, podobne ako aj 'wrapper' abstraktnou triedou.

Implementované algebraické štruktúry:

SemiGroup [pologrupa]

Základná algebraická štruktúra, skladajúca sa len z množiny a jedinej binárnej operácie, na ktorú nie sú kladené žiadne ďalšie požiadavky. Pologrupa je teda základný objekt v hierarchii. Všetky pologrupy sú chápané ako aditívne, a to aj v prípade, že pologrupová operácia nie je komutatívna.

Group [grupa]

Pologrupa, v ktorej existuje neutrálny prvok a ku každému elementu existuje inverzný. Očividne, grupa je špecializáciou pologrupy a teda v triedovom diagrame je priamym potomkom pologrupy. V prípade, že základná množina je konečná, grupa si sama vie overiť, či je skutočne grupou (t.j., či jej operácia spĺňa podmienky). Ak nie je konečná, grupe nezostáva iné, len sa spoľahnúť na vhodnú definíciu operácie.

Kompletný Class Diagram:

Class Diagram

Aktuálny stav projektu:

Analýza
kompletná
Implementácia
kompletná
Príklady
kompletné
e-modulárna aritmetika
pripravené
e-ukážka šifrovania
pripravené

Príklady:

Modulárna aritmetika

Modulárna aritmetika na číslach

GZ := (0 to: 5) asAdditiveGroupZnVytvorí (aditívnu) grupu Zn s prvkami 0..5
GZ operateOn: 4 and: 1.Zrealizuje grupovú operáciu na prvkoch 4 a 1
GZ operateOn: 5 and: 4.dtto
GZ invert: 3.Nájde inverzný prvok k trojke

Celý tento mechanizmus však funguje všeobecnejšie (na ľubovoľných konečných množinách).

GZ := #('Žiadne jabĺčko' 'Jedno jabĺčko' 'Dve jabĺčka' 'Tri jabĺčka') asAdditiveGroupZn.
GZ operateOn: 'Dve jabĺčka' and: 'Jedno jabĺčko'.
GZ operateOn: 'Tri jabĺčka' and: 'Jedno jabĺčko'.

Jednoducho ukážeme, ako sa správajú zvyšky po delení 3 pri sčítavaní

Zvysky3 := #('zvysok0' 'zvysok1' 'zvysok2') asAdditiveGroupZnzvyšky modulo 3
Zvysky3 operateOn: 'zvysok1' and: 'zvysok1'sčítaním dvoch čísel so zvyškom 1
Zvysky3 operateOn: 'zvysok0' and: 'zvysok2'zvyšok 0 nemení zvyšok súčtu
Zvysky3 neutrala teda neutrálnym prvkom je ...

Ďalší príklad:

Znamienka := #('plus' 'minus') asAdditiveGroupZn+ a -
Znamienka invert: 'minus'aké je prevrátené číslo k zápornému
Znamienka operateOn: 'minus' and: 'minus'mínus a mínus dá plus
Znamienka basicset domainvšetko má svoje... :)

Príklady iných typov grúp

Multiplikatívna grupa Zn*

GZ := GroupZnStar new: 42Vytvorí grupu s číslami < 42, nesúdeliteľnými so 42
GZ raiseElement: 23 toPower: 81nájde 81 mocninu prvku 23
GZ neutralneutrálny prvok

Testovanie prvočíselnosti veľkých čísel

17 isFermatPRPInBase: 10je 17 Fermatovo PRP pri základe 10?
341 isFermatPRPInBase: 2je 341 Fermatovo PRP pri základe 2?
341 isFermatPRPInBase: 3je 341 Fermatovo PRP pri základe 3?
561 isFermatPRPInBase: 7je 561 Fermatovo PRP pri základe 7?

RSA - demonštrácia

RS := GroupRSA p: 11 q: 17vytvorí RSA kódovaciu grupu
RS verifyKey: 3overí, či 3 je vhodný šifrovací exponent
RS makeDecryptionKey: 3nájde dešifrovací (privátny) kľúč
RS encrypt: 54 with: 3zašifruje správu 54 verejným kľúčom
RS decrypt: 10 with: 107rozšifruje správu privátnym kľúčom

Download:

Finálny changeset:

⬇ as.cs