Teoria dei numeri e Crittografia: lezione del 3 ottobre 2011 Alcuni dei principali argomenti trattati nel corso saranno i seguenti: studio della Teoria dei Numeri (soprattutto l’aritmetica dei numeri interi e in particolare dei numeri naturali, cioè degli interi >0), costruzione di algoritmi che coinvolgono i numeri interi, applicazioni della teoria dei numeri alla Crittografia. Testo consigliato: Baldoni, Ciliberto, Piacentini Cattaneo: “Aritmetica, Crittografia e Codici” Altri testi utili: Rosen: “Elementary Number theory” Koblitz: “A Course in Number Theory and Cryptography” (tutti disponibili per la consultazione presso la Biblioteca del Dipartimento). Teoria della “Big-O” Lo scopo di questa teoria (fondata da Bachman e Landau) è quello di confrontare la “velocità di crescita” di una funzione con quella di una funzione di riferimento: la teoria sarà poi applicata allo studio della complessità degli algoritmi. Tutte le funzioni che considereremo sono definite sull’insieme N dei numeri naturali e assumono valori reali positivi, e questo porterà ad alcune semplificazioni rispetto alla teoria classica. Una definizione classica è la seguente: date due funzioni f, g, diremo che f è dominata da g (o che g domina f) se esistono 2 costanti reali c, k tali che per ogni x c si abbia f(x) kg(x). Esempio. La funzione f(x)=3x2+9 è dominata dalla funzione g(x)=x2: infatti per x3 si ha x29 da cui f(x)=3x2+93x2+x2=4x2=4g(x) e si ottiene la condizione della definizione, con le costanti c=3, k=4 . La condizione che la funzione f sia dominata dalla funzione g è equivalente alla seguente: esistono 2 costanti reali c, k tali che per ogni x N, xc si abbia f(x)/g(x)k , (dunque il rapporto f(x)/g(x) è limitato, per x “abbastanza grande”). Ma possiamo osservare che la nostra ipotesi che le funzioni siano definite sull’insieme N dei numeri naturali implica che in tale caso il rapporto f(x)/g(x) è limitato in assoluto: se infatti x0 è un qualunque numero naturale c, posto k0=max{f(1)/g(1)),f(2)/g(2),......, f(x0-1)/g(x0-1),k} si ha f(x)/g(x) k0 per ogni numero naturale x (infatti se x<x0 allora ovviamente f(x)/g(x) k0 e se xx0c egualmente f(x)/g(x) k k0). Dunque la definizione della condizione f è dominata da g si può dare in modo equivalente nel modo seguente (almeno per la categoria di funzioni di cui ci occupiamo): esiste una costante reale k tale che per ogni x si abbia f(x) kg(x). Tuttavia dal punto di vista operativo, per verificare che f è dominata da g talvolta é più facile trovare un valore della costante k che limita il rapporto f(x)/g(x) per xc (con c costante opportuna) piuttosto che trovare un valore k che limita il rapporto f(x)/g(x) per ogni valore di x. Esempio. Verifichiamo che la funzione esponenziale f(x)=ax (per ogni base reale a>1) è dominata dalla funzione g(x)=x! . Fissiamo un qualunque numero naturale ca e notiamo che per ogni xca si ha : f(x)/g(x)=ax/x!=(ac/c!){ax-c/[(c+1)(c+2)…x]}(ac/c!) (l’ultimo è giustificato dall’osservazione che nella frazione ax-c/[(c+1)(c+2)…x] il numeratore ed il denominatore sono entrambi prodotto di x-c fattori, e si possono accoppiare i fattori del numeratore e denominatore in modo che ogni fattore del numeratore sia < del corrispondente fattore del denominatore). Dunque f(x)/g(x)k (dove k=(ac/c!)) per ogni xc e si conclude che f è dominata da g : sarebbe stato più difficile calcolare una costante k tale che f(x)/g(x) k per ogni valore di x. Dal punto di vista “pratico” affermare che la funzione f è dominata dalla funzione g equivale ad affermare che in un certo senso la funzione f(x) cresce non più velocemente di g(x) (perchè il rapporto f(x)/g(x) è limitato). In questo senso la teoria permette di confrontare le velocità di crescita di 2 funzioni. Ovviamente la relazione di dominazione è riflessiva perché ogni funzione f domina sé stessa (basta scegliere nella definizione il valore 1 per la costante k): più in generale se f(x) g(x) per ogni xc (con c costante) allora g domina f . Inoltre la relazione di dominazione è transitiva: se h domina g e se g domina f, allora h domina f: infatti se esistono costanti reali k, m tali che si abbia g(x) kh(x), f(x) mg(x), allora si avrà f(x) (mk)h(x), con mk costante reale. Per ogni funzione g indicheremo con O(g) l’insieme delle funzioni dominate da g: O(g) = { funzioni f / f è dominata da g }. Quindi g domina f fO(g). Dalla transitività della relazione di dominazione segue facilmente che: g domina f O(f)O(g). Infatti: se g domina f , per transitività g domina ogni funzione h che sia dominata da f, da cui O(f)O(g); viceversa se O(f)O(g) per la proprietà riflessiva si ha fO(f)O(g) quindi g domina f. Chiameremo ordine della funzione f l’insieme O(f) : se f è dominata dalla funzione g (quindi equivalentemente se O(f)O(g)) diremo che f ha ordine O(g). Nota: in molti testi il fatto che la funzione f sia dominata dalla funzione g si rappresenta con il simbolo f = O(g) (simbolo della big-O introdotto da Bachman nel 1894 e in seguito diffuso dai lavori di Landau). Tale simbologia è però poco precisa dal punto di vista formale, perché la relazione di dominazione è più una relazione di “minore o uguale” che una relazione di “eguaglianza” (come dimostrano le proprietà riflessiva e transitiva). Se f domina g e se g domina f, diremo che l’ordine di f è uguale all’ordine di g: questa terminologia è ovviamente giustificata dal fatto che, per quanto dimostrato sopra, la proprietà che le funzioni f, g si dominano a vicenda equivale all’eguaglianza insiemistica O(f)=O(g). Dal punto di vista pratico si ha O(f)=O(g) se f, g hanno in un certo senso la stessa “velocità di crescita”. Se O(f)O(g) ma O(f)O(g) (quindi se g domina f ma non viceversa, o equivalentemente se O(f)O(g) con inclusione propria) diremo che l’ordine di f é strettamente minore dell’ordine di g: ciò in pratica significa che in un certo senso la “velocità di crescita” di f è strettamente minore di quella di g. Per avere una stima della velocità di crescita della funzione f , spesso cercheremo una funzione di riferimento “ben conosciuta” g tale che f sia dominata da g (quindi tale che fO(g) o equivalentemente O(f)O(g)) : non sempre troveremo una g “ottimale” (sarebbe tale se fosse O(f)=O(g) quindi con f , g dello stesso ordine) ma per gli scopi pratici potrà spesso bastare. Vedremo che un criterio per confrontare gli ordini delle funzioni f, g è quello di studiare il limite del rapporto f(x)/g(x) per x : 1) Se tale limite esiste finito è noto (da risultati di Analisi) che il rapporto f(x)/g(x) è limitato, dunque g domina f , O(f)O(g), ed f è di ordine O(g). 2) Se tale limite esiste ed è = , allora g non domina f , perché è noto (sempre da risultati di Analisi) che in questo caso il rapporto f(x)/g(x) è illimitato. 3) Da 1) e 2) segue anche che se tale limite esiste finito ed è non nullo allora O(f)=O(g)(quindi f , g hanno lo stesso ordine): infatti detto l il limite, si ha che il limite del rapporto g(x)/f(x) per x è l-1<, e basta applicare la proprietà 1) per ottenere che f, g si dominano reciprocamente. Se invece tale limite esiste finito ed è = 0 allora O(f)<O(g) (quindi f ha ordine strettamente inferiore a g): infatti per la 1) g domina f , ma per la 2) f non domina g essendo il limite del rapporto g(x)/f(x) per x. 4) Se tale limite non esiste, niente si può dire, se non con ulteriori considerazioni, sugli ordini di f, g (che potrebbero anche non essere confrontabili). Esempi. 1) Date le funzioni f , g definite rispettivamente da: f(x)=1 per x dispari, f(x)=x per x pari g(x)=x per x dispari, g(x)=1 per x pari non esiste il limite del rapporto f(x)/g(x) per x, in quanto f(x)/g(x)=1/x per x dispari, f(x)/g(x)=x per x pari. Poiché il rapporto f(x)/g(x) è illimitato si deduce che g non domina f, ma poiché anche il rapporto g(x)/f(x) è illimitato (perché g(x)/f(x)=x per x dispari e g(x)/f(x)=1/x per x pari) si deduce che neanche f domina g : dunque gli ordini di f e g non sono “confrontabili”. 2) Date le funzioni f , g definite rispettivamente da: f(x)=1/x per x dispari, f(x)=x per x pari g(x)=2/x per x dispari, g(x)=x2 per x pari non esiste il limite del rapporto f(x)/g(x) per x, in quanto f(x)/g(x)=1/2 per x dispari, f(x)/g(x)=1/x per x pari. Poiché però il rapporto f(x)/g(x) è limitato si deduce che g domina f, ma poiché invece il rapporto g(x)/f(x) è illimitato (perché g(x)/f(x)=2 per x dispari e g(x)/f(x)=x per x pari) si deduce che f non domina g : dunque O(f)<O(g) ed f ha ordine strettamente inferiore a g. Per valutare l’ordine di una funzione f si considerano varie categorie di funzioni g (di riferimento) con cui confrontare l’ordine di f, ottenendo vari “tipi” di ordine. La funzione f ha ordine polinomiale di grado n (dove n è un intero non negativo) se f ha ordine O(g) dove g è una funzione polinomiale di grado n della forma: g(x) = a0+a1x+……+anxn con i coefficienti ai reali, e con an≠0. Si noti che in tale caso si ha O(a0+a1x+……+anxn )= O(xn) perché il limite del rapporto f(x)/g(x) per x è an≠0. Dunque equivalentemente: la funzione f ha ordine polinomiale di grado n (dove n è un intero non negativo) se f è di ordine O(xn).