Scheda del corso Computer Algebra Anno accademico: 2015/2016 Docente: Fabio Stumbo ([email protected]) Orario: Lunedì, ore 14-16, aula 3, Dipartimento di Matematica Mercoledì, ore 16-18, aula 3, Dipartimento di Matematica Inizio: Lunedì 28 settembre 2015 Termine: Mercoledì 16 dicembre 2015 (salvo eventuali recuperi) Ricevimento studenti: tutti i giorni su appuntamento Durata del corso: 48 ore di lezione frontale Numero di crediti: 6 Modalità esame: Scritto (con orale opzionale) Prerequisiti: Corso di algebra del primo anno Obiettivo del corso: approfondire alcuni argomenti di algebra del corso del primo anno e fornire esempi signicativi ed importanti di applicazioni (crittograa, teoria dei codici) Testi di riferimento: • Prima e seconda parte: F. Stumbo, Computer Algebra, Ed. Aracne • Terza parte: F. Stumbo, Teoria dei Codici Altri testi di riferimento: • J. von zur Gathen, J. Gerhard, Modern, Computer Algebra, Cambridge University Press • L. N. Childs, A concrete introduction to higher algebra, UTM Springer • D. R. Stinson, Criptography, Theory and Practice, Chapman & Hall • N. K. Koblits, Algebraic Aspects of Criptography, ACM Springer • R. E. Blahut, Algebraic codes for data transmission, Cambridge • W. C. Human, V. Pless, Fundamentals of error-correcting codes, Cambridge • F. J. MacWilliams, N. J. A. Sloane, The theory of error-correcting codes, NorthHolland Programma: • Prima Parte ◦ Preliminari algebrici: · · · · · · · · • Teorema di Eulero-Fermat. Sistemi di congruenze. Elementi primitivi. Campi niti. Radici dell'unità e classi ciclotomiche nei campi niti. Complessità computazionale. Notazione posizionale Seconda parte ◦ Criptograa: · · · · · · · · ◦ ◦ Successioni di Lehmer (numeri pseudocasuali). Permutazioni e sostituzioni. Codici di cifratura a sostituzione (mono- e polialfabetica) e a trasposizione. Codice di Hill. Codici a chiave privata: DES e AES. Codici a chiave pubblica: RSA e ElGamal. Funzioni di hash: SHA-1. Firma digitale: DSA. Fattorizzazione dei numeri interi: · · · Il crivello di Eratostene. Algoritmi (p − 1) e ρ di Pollard per la fattorizzazione dei numeri interi. Test di primalità: algoritmi di Miller-Rabin e AKS. Fattorizzazione di polinomi: · · · • Algoritmo euclideo (sui numeri interi e sui polinomi). Algoritmo di Berlekamp per la fattorizzazione in Zp [x]. Lemma di Hensel. Fattorizzazione in Q [x]. Terza Parte ◦ Teoria dei codici: · · · · · · · · Distanza di Hamming. Disuguaglianze di Hamming, Singleton e Gilbert-Varshamov. Codici lineari, codici di Hamming. Codici ciclici, codici BCH e codici di Reed-Solomon. Codica e decodica. Decodica a sindromi, decodica di Slepian. Decodica di Meggitt nei codici ciclici. Decodica nei codici BCH: algoritmi PGZ, Forney, Sugyiama e BerlekampMassey. Descrizione dettagliata del corso La computer algebra (algebra computazionale in italiano) è la disciplina che studia problemi matematici risolubili per via algoritmica, con particolare riguardo all'ecienza degli algoritmi stessi e alla loro implementazione software. Tale disciplina si è sviluppata con la comparsa delle macchine calcolatrici elettroniche: in particolare, tali algoritmi vengono utilizzati per la costruzione di programmi di calcolo simbolico (CAS, acronimo di Computer Algebra System ), nello sviluppo di software per la sicurezza (crittograa), di software per le comunicazioni e la trasmissione di dati (codici autocorrettivi) e in svariati altri ambiti. Nel corso vediamo alcuni di questi algoritmi e alcune delle applicazioni pratiche, approfondendo gli argomenti algebrici necessari al loro sviluppo. Descriviamo ora in modo più dettagliato gli argomenti che arontati, con collegamenti ad alcune risorse in rete per poterli approfondire. Nella prima parte del corso richiamiamo, approfondendoli, alcuni preliminari necessari che riguardano le varie proprietà degli interi e dei polinomi: si tratta soprattutto di proprietà che derivano dal fatto che tanto l'anello degli interi quanto l'anello dei polinomi sono due casi di anello euclideo. In particolare, siamo interessati alla divisione euclidea sia nei numeri che nei polinomi: grazie al fatto che è possibile eettuare tale divisione, si può eettuare l'algoritmo euclideo per il calcolo del massimo comun divisore. Di solito si usa la versione estesa di tale algoritmo, dato che permette di calcolare anche l'identità di Bézout, di fondamentale importanza nelle applicazioni: per esempio, nell'aritmetica modulare permette di dimostrare e trovare la soluzione del Teorema cinese del resto. Anche lo studio del gruppo moltiplicativo degli interi modulo n e dei suoi principali risultati, come il piccolo Teorema di Fermat ed il Teorema di Eulero si rivelano fondamentali per molte applicazioni. Un altro utile algoritmo è l'algoritmo square and multiply, che permette di calcolare velocemente le potenze grandi di un numero modulo un altro. Altre proprietà dei numeri che richiamiamo sono quelle relative alla notazione posizionale. Inne, un altro ingrediente fondamentale nella computer algebra è dato dai campi niti. Una prima applicazione la possiamo vedere nella generazione di numeri pseudocasuali, dove, tra gli altri, vediamo due algoritmi: uno è il generatore di Lehmer, molto veloce ed usato in programmi generici, un altro è il generatore Blum Blum Shub, più lento del precedente ma adatto all'utilizzo anche da parte dei programmi di crittograa. L'ecienza degli algoritmi è studiata nella vasta area della complessità computazionale: ci limitiamo ad arontare le prime nozioni sul tempo di esecuzione di un algoritmo. Per ciò torna utile la notazione O-grande, che permette una prima classicazione del tempo di esecuzione di un algoritmo in tempo polinomiale e tempo esponenziale. Nella seconda parte del corso parliamo di crittograa e delle problematiche che questa disciplina solleva in ambito matematico. Una breve introduzione storica ci permette di denire cosa è un cifrario classsico ed operare una prima suddivisione in cifrari a sostituzione, cifrari a sostituzione polialfabetica, e cifrari a trasposizione, che costituiscono le componenti essenziali di qualsiasi cifrario. I primi esempi si hanno con il cifrario di Cesare (a sostituzione monoalfabetica, per di più senza chiave) ed il cifrario di Vigenère (a sostituzione polialfabetica); anche il famigerato Enigma usato dai tedeschi durante la seconda guerra mondiale rientra nella classe dei cifrari a sostituzione polialfabetica, così come il cifrario perfetto (one-time pad). Con il cifrario di cifrario di Hill per la prima volta viene usata una funzione matematica per generare la sostituzione delle lettere. I moderni cifrari, oltre ad usare chi più chi meno la matematica per generare le sostituzioni, spesso sono basati su uno schema di Feistel o su uno schema simile a questo. Un esempio è il DES, largamente usato no agli inizi del XXI secolo, che però ha lasciato il posto al suo successore, l'AES, che usa le operazioni nel campo nito con 256 elementi per generare le sostituzioni e le trasposizioni necessarie. Questi sono tutti esempi di cifrari simmetrici; con l'avvento delle comunicazioni elettroniche sono nate nuove esigenze e problematiche che hanno portato allo sviluppo di nuovi tipi di cifrari, come i cifrari asimmetrici. L'esempio forse più famoso di cifrario asimmetrico è il cifrario RSA; un altro esempio importante è il cifrario ElGamal: utilizzando questo e le funzioni hash (in paricolare una delle funzioni della famiglia SHA), si può scrivere un protocollo di rma digitale come il DSA. Negli algoritmi di crittograa, in particolare in quella a chiave pubblica, intervengono in modo massiccio numeri primi e le varie proprietà fattorizzazione dei numeri interi; tra i vari problemi che è necessario arontare, ne consideriamo due: stabilire se un numero è primo e fattorizzare un numero. Chiaramente una soluzione al problema della fattorizzazione permette anche di sapere se un numero è primo o no ma il viceversa, in generale, non è vero. Per il primo problema, la soluzione va ricercata in un test di primalità: si va dall'antico, ed ineciente, crivello di Eratostene no ai più moderni test di Miller-Rabin e test AKS. Di questi due il primo è più veloce ma è probabilistico mentre il secondo è deterministico però è un po' più lento, anche se il tempo resta comunque polinomiale. Per quel che riguarda la fattorizzazione, due algoritmi interessanti sono l'algoritmo Pollard e l'algoritmo p−1 ρ di di Pollard. Un altro argomento centrale nella computer algebra è quello della fattorizzazione di polinomi in una o più variabili. Noi arontiamo solo il problema in una variabile: il problema in più variabili è molto vasto ed è l'oggetto di studio delle basi di Groebner. Nel caso dei polinomi in una variabile arontiamo prima i polinomi a coecienti in un campo nito Fp , dove esistono vari algoritmi di fattorizzazione: tra tali algoritmi studiamo in dettaglio l'algoritmo di Berlekamp; dopo aver dimostrato il lemma di Hensel vediamo come ottenere, tramite questi due risultati, la fattorizzazione di un polinomio di Q [x]. Nella terza parte del corso, studiamo la teoria dei codici ed i codici autocorrettivi. Iniziamo introducendo il concetto di distanza di Hamming e peso di Hamming e determinando alcune importanti disuguaglianze, come per esempio la disuguaglianza di Singleton, quella di Hamming e quella di Gilbert-Varshamov. Introduciamo anche il concetto di enumeratore di peso, con le relative identità di MacWilliams. Partendo dall'esempio di particolare importanza sia storica che teorica dato dal codice di Hamming, ci concentriamo sullo studio dei codici lineari e sulla loro decodica: in particolare, la decodica a sindrome. Aumentando la struttura algebrica soggiacente un codice siamo condotti ai codici ciclici. All'interno di questa famiglia vi sono sottofamiglie (codici BCH, codici Reed-Solomon) di particolare importanza nelle applicazioni. Per la famiglia di codici BCH, analizziamo alcuni importanti algoritmi di decodica: l'algoritmo PGZ, l'algoritmo di Forney, l'algoritmo di Sugyiama ed inne l'algoritmo di Berlekamp-Massey.