Table of Contents

Triplete pitagoreice primitive

Descriere generală și organizare

Tema constă în generarea tripletelor pitagoreice primitive și utilizarea acestora într-un criptosistem simplu.

Tema este împărțită în 4 etape:

Așa cum se poate observa, ziua deadline-ului variază în funcție de semigrupa în care sunteți repartizați. Restanțierii care refac tema și nu refac laboratorul beneficiază de ultimul deadline (deci vor avea deadline-uri în zilele de 21.03, 28.03, 04.04, 11.04).

Rezolvările tuturor etapelor pot fi trimise până în ziua laboratorului 6, dar orice exercițiu trimis după deadline se punctează cu jumătate din punctaj. Nota finală pe etapă se calculează conform formulei: n = (n1 + n2) / 2 (n1 = nota obținută înainte de deadline; n2 = nota obținută după deadline). Când toate submisiile sunt înainte de deadline, nota pe ultima submisie este și nota finală (întrucât n1 = n2).

În fiecare etapă, veți folosi ce ați învățat în săptămâna anterioară pentru a dezvolta aplicația.

Pentru fiecare etapă veți primi un schelet de cod (dar rezolvarea se bazează în mare măsură pe rezolvările anterioare). Intenția este să puteți rezolva tema utilizând doar indicațiile din schelet (fără a fi necesar să citiți enunțul). Enunțul încearcă să lămurească aspectele care poate nu sunt clare tuturor doar din schelet.

Etapa 1

În această etapă vă veți familiariza cu noțiunea de triplet pitagoreic primitiv (TPP), apoi veți:

Rezolvarea acestor sarcini presupune utilizarea de:

Funcțiile principale pe care va trebui să le implementați sunt:

(dot-product X Y)
(multiply M V)
(get-transformations n)

Aceasta este cea mai complexă funcție din etapa 1. Urmează un exemplu de determinare a căii (deși cu siguranță puteți descoperi algoritmul și pe cont propriu).

Să presupunem că ne interesează al 64-lea triplet din arbore.

Pentru a determina calea (succesiunea de transformări) de la rădăcina (3,4,5) la acest triplet, ne uităm la poziția indexului 64 pe rândul său în arbore (adică pe rândul care conține toate tripletele de la indexul 41 la indexul 121). Transformarea T1 (asupra rădăcinii (3,4,5)) conduce către indecșii din prima treime (41 - 67), T2 către indecșii din a doua treime (68 - 94), iar T3 către indecșii din ultima treime (95 - 121).

În continuare, ne uităm la poziția lui 64 în intervalul 41 – 67 în care ne-a plasat aplicarea transformării T1. Este în ultima treime (59 - 67), ceea ce înseamnă că am ajuns aici aplicând T3.

Constatăm apoi că ne aflăm în a doua treime a intervalului 59 – 67 (via T2), în ultima treime a intervalului 62 – 64 (via T3), și, în final, că intervalul s-a redus la numărul 64 deci calea este completă.

(apply-matrix-transformations Ts ppt)
(get-nth-ppt-from-matrix-transformations n)

Etapa 2

În această etapă veți implementa o metodă alternativă de generare a aceluiași arbore infinit de TPP, bazată pe cvartete în loc de triplete. Metoda este descrisă în amănunt în scheletul de cod.

Pe lângă implementarea noii metode, veți modifica și implementarea metodei anterioare, astfel încât să exploatați faptul că funcțiile sunt valori de ordinul întâi. Scopul este consolidarea cunoștințelor legate de:

De asemenea, vă încurajăm să valorificați oportunitățile de utilizare a funcțiilor anonime și a funcțiilor de bibliotecă curry și uncurry, deși enunțul nu vă cere în mod explicit.

Principalele funcții noi pe care va trebui să le implementați sunt:

(apply-functional-transformations Fs tuple)
get-nth-tuple

Funcția get-nth-tuple este un exemplu de abstractizare. Abstractizare înseamnă că, dacă ar exista o a treia metodă de generare a arborelui, bazată pe, de exemplu, cvintete și niște funcții capabile să calculeze dintr-un cvintet trei cvintete următoare, atunci get-nth-tuple ar funcționa fără modificări și pentru această metodă (apelat pe argumente adecvate). Cu alte cuvinte, în funcție nu trebuie să verificăm cu ce fel de tupluri lucrăm, ci funcția trebuie să aplice “orbește” funcțiile primite ca parametru pe tuplul primit ca parametru, știind că acestea vor produce rezultatul așteptat (triplet, cvartet, cvintet sau orice altceva).

Pe baza lui get-nth-tuple veți implementa ultimele funcții din temă - care ne permit obținerea celui de-al n-lea TPP din arbore prin cele două metode distincte, fără a scrie două bucăți foarte similare de cod.

Etapa 3

În această etapă veți implementa un criptosistem cu chei simetrice, în care generarea cheii este bazată pe teoria tripletelor pitagoreice. Vă veți exersa cunoștințele legate de:

Pe scurt, criptosistemul funcționează astfel:

Veți lucra doar în fișierul cryptosystem.rkt, însă este necesar să aveți în același folder și fișierul ppt.rkt din etapa 2 (iar arhiva încărcată pe vmchecker va conține ambele fișiere).

Funcțiile pe care va trebui să le implementați sunt:

(key n)
(message->codes message)
(codes->message codes)
(extend-key key size)
(encrypt-codes message key)
(decrypt-codes message key)
(encrypt-message message key)
(decrypt-message message key)

Etapa 4

În etapele 1 și 2 ați studiat două metode de generare a unui arbore infinit de TPP-uri, punând accent pe algoritmul de a determina al n-lea TPP din arbore. În etapa finală vă veți concentra pe modul în care obținem o întreagă secvență ordonată de TPP, unde ordinea depinde de metoda de generare folosită. Mai întâi veți implementa fluxul de triplete corespunzător indexării cu care am lucrat în etapele anterioare, apoi un alt flux care conține aceleași triplete într-o altă ordine, corespunzătoare unei noi metode de generare.

Pentru a completa cu succes etapa, veți lucra cu:

Funcțiile (sau fluxurile) principale pe care trebuie să le implementați sunt:

ppt-stream-in-tree-order

Exemplu:

                                          (3,4,5)
                  ___________________________|___________________________
                 |                           |                           |
             (15,8,17)                   (21,20,29)                  (5,12,13)
       __________|__________       __________|__________       __________|__________
      |          |          |     |          |          |     |          |          |
 (35,12,37) (65,72,97) (33,56,65) .................................................
(pairs G H)

Exemplu:

                        h      
         3     5     7     9     11   .  .  .
    1  (1,3) (1,5) (1,7) (1,9) (1,11) .  .  .
    3        (3,5) (3,7) (3,9) (3,11) .  .  .
    5              (5,7) (5,9) (5,11) .  .  .
 g  7                    (7,9) (7,11) .  .  .
    9                          (9,11) .  .  .
    .                                 .  .  .
    .                                    .  .
    .                                       .
gh-pairs-stream
ppt-stream-in-pair-order

Acesta este punctul terminus al temei 1. În fiecare etapă am încercat să valorificăm atât conceptele studiate în etapele anterioare, cât și concepte nou descoperite. Deși nu există o etapă 5, există o temă 2, în Haskell, către care fluxurile sunt o punte foarte potrivită. Haskell va avea și recursivitate, și funcționale, și legări locale, și liste infinite, și va aduce în plus alte facilități care sperăm să vă placă și să vă deschidă apetitul pentru arta de a programa. Felicitări pentru că ați ajuns în acest punct al temei 1 și mult succes în continuare!

Precizări

Resurse

Changelog

Referinţe