Casualità e numeri casuali



Documenti analoghi
Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

Lezione 8. La macchina universale

4 3 4 = 4 x x x 10 0 aaa

Introduzione all analisi dei segnali digitali.

Appunti sulla Macchina di Turing. Macchina di Turing

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI

Probabilità discreta

Matematica generale CTF

Probabilità condizionata: p(a/b) che avvenga A, una volta accaduto B. Evento prodotto: Evento in cui si verifica sia A che B ; p(a&b) = p(a) x p(b/a)

Database. Si ringrazia Marco Bertini per le slides

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

I sistemi di numerazione

Fasi di creazione di un programma

Dimensione di uno Spazio vettoriale

Testi di Esercizi e Quesiti 1

Strutturazione logica dei dati: i file

SISTEMI DI NUMERAZIONE E CODICI

SEQUENZE DI NUMERI PSEUDO- CASUALI

Librerie digitali. Video. Gestione di video. Caratteristiche dei video. Video. Metadati associati ai video. Metadati associati ai video

la scienza della rappresentazione e della elaborazione dell informazione

Informatica. Rappresentazione dei numeri Numerazione binaria

SISTEMI DI NUMERAZIONE IL SISTEMA DECIMALE

INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI

1 Serie di Taylor di una funzione

Algoritmi e strutture dati. Codici di Huffman

Il concetto di valore medio in generale

Analisi di dati di frequenza

Corso di Laurea in Scienze e Tecnologie Biomolecolari. NOME COGNOME N. Matr.

Esercizi di Probabilità e Statistica

Uso di base delle funzioni in Microsoft Excel

Excel. A cura di Luigi Labonia. luigi.lab@libero.it

Calcolo delle probabilità

come nasce una ricerca

Automazione Industriale (scheduling+mms) scheduling+mms.

Funzioni in C. Violetta Lonati

u 1 u k che rappresenta formalmente la somma degli infiniti numeri (14.1), ordinati al crescere del loro indice. I numeri u k

Come masterizzare dischi con Nero 11

matematica probabilmente

Test statistici di verifica di ipotesi

Valutazione delle Prestazioni. Valutazione delle Prestazioni. Architetture dei Calcolatori (Lettere. Tempo di risposta e throughput

CONTROLLO IN TENSIONE DI LED

Scopo della lezione. Informatica. Informatica - def. 1. Informatica

Scheduling della CPU. Sistemi multiprocessori e real time Metodi di valutazione Esempi: Solaris 2 Windows 2000 Linux

Prestazioni CPU Corso di Calcolatori Elettronici A 2007/2008 Sito Web: Prof. G. Quarella prof@quarella.

Codifiche a lunghezza variabile

lo PERSONALIZZARE LA FINESTRA DI WORD 2000

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Slide Cerbara parte1 5. Le distribuzioni teoriche

La distribuzione Normale. La distribuzione Normale

Più processori uguale più velocità?

Introduzione al MATLAB c Parte 2

SPC e distribuzione normale con Access

LE SUCCESSIONI 1. COS E UNA SUCCESSIONE

Introduzione. Classificazione di Flynn... 2 Macchine a pipeline... 3 Macchine vettoriali e Array Processor... 4 Macchine MIMD... 6

EXCEL PER WINDOWS95. sfruttare le potenzialità di calcolo dei personal computer. Essi si basano su un area di lavoro, detta foglio di lavoro,

Parte I. Prima Parte

I SISTEMI DI NUMERAZIONE

Cosa è un foglio elettronico

II.f. Altre attività sull euro

Informatica 3. Informatica 3. LEZIONE 10: Introduzione agli algoritmi e alle strutture dati. Lezione 10 - Modulo 1. Importanza delle strutture dati

1) Si consideri un esperimento che consiste nel lancio di 5 dadi. Lo spazio campionario:

LA MOLTIPLICAZIONE IN CLASSE SECONDA

TECNICHE DI SIMULAZIONE

la scienza della rappresentazione e della elaborazione dell informazione

STATISTICA IX lezione

Esempi di algoritmi. Lezione III

Primi esercizi per gli studenti del corso di Statistica ed Elementi di Probabilita

L espressione torna invece sempre vera (quindi la soluzione originale) se cambiamo contemporaneamente il verso: 1 < 0.

Aprire WEKA Explorer Caricare il file circletrain.arff Selezionare random split al 66% come modalità di test Selezionare J48 come classificatore e

un protocollo è costituito da una serie di passi (step) e coinvolge due o più persone (parti, entità) allo scopo di svolgere un incarico

Corso di Informatica Generale (C. L. Economia e Commercio) Ing. Valerio Lacagnina Rappresentazione in virgola mobile

f(x) = 1 x. Il dominio di questa funzione è il sottoinsieme proprio di R dato da

da 2 a 5 giocatori, dai 10 anni in su, durata 30 minuti

Proof. Dimostrazione per assurdo. Consideriamo l insieme complementare di P nell insieme

ALGEBRA DELLE PROPOSIZIONI

Il sapere tende oggi a caratterizzarsi non più come un insieme di contenuti ma come un insieme di metodi e di strategie per risolvere problemi.

Analisi dei Dati 12/13 Esercizi proposti 3 soluzioni

Dispensa di Informatica I.1

PROCEDURA INVENTARIO DI MAGAZZINO di FINE ESERCIZIO (dalla versione 3.2.0)

Sistema di numerazione binario, operazioni relative e trasformazione da base due a base dieci e viceversa di Luciano Porta

Il sistema monetario

Esercizio 1: trading on-line

Random number generators

FONDAMENTI di INFORMATICA L. Mezzalira

ESEMPIO 1: eseguire il complemento a 10 di 765

Un modello matematico di investimento ottimale

Introduzione agli Algoritmi Genetici Prof. Beatrice Lazzerini

Gestione Turni. Introduzione

Corso di. Dott.ssa Donatella Cocca

La manutenzione come elemento di garanzia della sicurezza di macchine e impianti

La Firma Digitale La sperimentazione nel Comune di Cuneo. Pier Angelo Mariani Settore Elaborazione Dati Comune di Cuneo

COME È FATTO IL COMPUTER

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

Un metodo per il rilevamento degli errori: la tecnica del Bit di Parità

Informatica per la comunicazione" - lezione 7 -

LE FUNZIONI A DUE VARIABILI

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Transcript:

Casualità e numeri casuali Esame di Matematica del discreto Andrea Nardelli 733637 Elena Scarpelli 736471

Indice 1 Introduzione 3 2 Utilizzi dei numeri casuali 5 3 Metodi per calcolare i numeri casuali 7 3.1 Fisici.................................... 7 3.2 Computazionali.............................. 8 3.2.1 Middle Square........................... 8 3.2.2 Lineare Congruenziale...................... 9 3.2.3 Congruenziale Quadratico.................... 10 3.2.4 Inverso Congruenziale Ricorsivo................. 11 3.2.5 Inverso Congruenziale Esplicito................. 12 3.2.6 Inverso Congruenziale Composto................ 13 3.2.7 Fibonacci Ritardato....................... 14 3.2.8 Registro a Scorrimento a Retroazione Lineare......... 14 3.3 Crittografici................................ 17 3.3.1 Blum Blum Shub......................... 17 3.3.2 Fortuna.............................. 18 4 Test 21 4.1 Frequency Test.............................. 22 4.2 Serial Test................................. 22 4.3 Poker Test................................. 23 4.4 Autocorrelation Test........................... 24 4.5 Runs Test................................. 25 5 Conclusioni 27 Bibliografia 29 1

2 INDICE

Capitolo 1 Introduzione Un numero di per sè stesso non può essere casuale, eccetto nel senso del modo in cui è stato generato. Informalmente, generare un numero casuale significa che prima di essere generato, tutti gli elementi di un certo insieme siano equalmente probabili come risultato. In particolare, questo significa che la conoscenza dei numeri generati da questo processo, o da un qualunque altro processo, non porta informazioni aggiuntive al riguardo del prossimo numero generato. Questo è equivalente alla indipendenza statistica. Sin dall antichità esistono metodi per creare queste sequenze, ma prima dell avvento dei generatori computazionali, generare grandi moli di numeri sufficientemente casuali (importanti a fini statistici) veniva fatto con metodi fisici e richiedeva molto lavoro. I risultati quindi venivano a volte collezionati e distribuiti sotto forma di tabelle, che mantengono le proprietà desiderate indipendentemente da come vengono lette (per riga, colonna, in diagonale, in maniera irregolare..). La prima tabella fu pubblicata da Karl Pearson nel 1927. Le prime tabelle furono create nei modi più svariati. Per esempio, quella di L.H.C. Tippett prendeva i numeri casualmente dai registri del censo, un altra (di R.A. Fisher e Francis Yates) usava numeri presi casualmente dalle tavole logaritmiche; infine nel 1939 un insieme di 100.000 numeri è stato pubblicato da M.G. Kendall e B. Babington Smith prodotto da una macchina speciale insieme ad un operatore umano. A metà degli anni 40, la RAND Corporation sviluppò una tabella di un millione di numeri, usando come generatore una roulette attaccata ad un calcolatore. 00100 03991 10461 93716 16894 66083 24653 84609 58232 88618 19161 00101 38555 95554 32886 59780 08355 60860 29735 47762 71299 23853 00102 17546 73704 92052 46215 55121 29281 59076 07936 27954 58909 00103 32643 52861 95819 06831 00911 98936 76355 93779 80863 00514 00104 69572 68777 39510 35905 14060 40619 29549 69616 33564 60780 00105 24122 66591 27699 06494 14845 46672 61958 77100 90899 75754 00106 61196 30231 92962 61773 41839 55382 17267 70943 78038 70267 00107 30532 21704 10274 12202 39685 23309 10061 68829 55986 66485 00108 03788 97599 75867 20717 74416 53166 35208 33374 87539 08823 3

4 CAPITOLO 1. INTRODUZIONE 00109 48228 63379 85783 47619 53152 67433 35663 52972 16818 60311 00110 60365 94653 35075 33949 42614 29297 01918 28316 98953 73231 Il nome della tabella citata è A Million Random Digits with 100,000 Normal Deviates ed disponibile all indirizzo www.rand.org/pubs/monograph reports/m R1418. Realizzare un autentica sequenza non ripetitiva è inattuabile con un normale computer: quest ultimo è un automa a stati finiti, il che rende impossibile calcolare valori infiniti con un elaboratore in grado di gestirne soltanto un numero limitato. Per questo nel corso degli anni si sono moltiplicati i meccanismi per tentare di elaborare algoritmi capaci di produrre sequenze pseudo-casuali. Una serie di dati pseudo-casuali deve soddisfare almeno due proprietà: distribuzione degli elementi della sequenza secondo una funzione di distribuzione predefinita f(x): di solito si richiede una distribuzione uniforme su un intervallo specificato (equidistribuzione); indipendenza tra elementi successivi della sequenza. Un generatore di numeri pseudo-casuali prende da qualche parte un numero iniziale, chiamato seme casuale (random seed) ed esegue iterativamente una determinata formula. Molti linguaggi di programmazione includono funzioni o librerie per la generazione di numeri casuali, ma spesso hanno scarsa rilevanza statistica e alcuni ripetono le sequenze anche solo dopo decine di migliaia di tentativi. Spesso sono inizializzati usando l orologio interno del calcolatore come seme. Queste funzioni forniscono abbastanza casualità per alcuni scopi (come per esempio nei videogiochi), ma non sono adatti per quelle applicazioni che richiedono un elevata qualità della casualità, come per esempio nel contesto crittografico, dove dobbiamo imporre requisiti più ferrei. D altra parte, un generatore computazionale permette di ottenere nuovamente la stessa sequenza di numeri casuali se inizializzato allo stesso modo. Consideriamo per esempio un programma che effettua una simulazione: vogliamo che la simulazione sia davvero casuale, ma vogliamo anche essere in grado di ripetere uno stesso calcolo, magari solo per scopi di debugging e test. Una buona soluzione consiste nel chiamare il generatore di numeri casuali all inizio del programma, per ottenere un seme; tale seme può essere trascritto come parte dell output del simulatore e da esso generatore potrebbe generare tutti i dati casuali necessari alla simulazione. La conoscenza del seme originale del generatore ci consente anche di verificare tutti i calcoli, rieseguendo il programma con gli stessi input e lo stesso seme.

Capitolo 2 Utilizzi dei numeri casuali Inizialmente i numeri casuali, grazie alla loro impredicibilità, furono studiati nel contesto del gioco d azzardo e molti oggetti furono usati a tale scopo, per esempio i dadi, le carte o la roulette. In ambito politico, nell antica società ateniense la rotazione e il sorteggio nella partecipazione alle cariche politiche avveniva secondo il caso perché tutti i cittadini venivano considerati uguali davanti alla legge e quindi ognuno aveva pari probabilità di parteciparvi. Ancora oggi la casualità viene usata in America e in Inghilterra per il sorteggio dei giurati nei processi. L intera arte divinatoria si basa sull osservazione di fenomeni fisici casuali (che possono essere usati per generare VERI numeri casuali). La casualità è strettamente legata anche alla fase di test per la preveggenza: estrazioni casuali da un mazzo di carte garantiscono che il soggetto del test non possa in alcun modo indovinare la carta seguente. In seguito, produrre numeri casuali divenne di vitale importanza per i giochi elettronici, come quelli presenti nei moderni casino. Essi contengono uno o piú generatori di numeri casuali che decidono l uscita di una giocata. Anche le slot machines, che con la loro leva meccanica sembrano far girare i rulli casualmente, in realtà lo fanno per intrattenimento e li fermano esattamente dove il loro software interno ha deciso nel momento stesso in cui viene tirata la leva. Discorso analogo per i videogiochi, dove per esempio si deve presentare al giocatore un ambiente con condizioni variabili. In ambito scientifico, i numeri casuali vengono impiegati a fini statistici, di analisi e simulazione. Essi servono ad esempio per definire campioni significativi, oppure per emulare fenomeni casuali. Un campo in cui sono fondamentali i numeri casuali è la crittografia. Essi servono per garantire la sicurezza nelle comunicazioni moderne. In particolare, se una persona vuole oscurare un messaggio per renderlo intelleggibile a terzi, deve usare una chiave per l algoritmo di crittazione totalmente impredicibile. Se la chiave non è creata con un metodo appropriato la sicurezza dell intero messaggio (e probabilmente anche dei precendeti e dei successivi) è compromessa. 5

6 CAPITOLO 2. UTILIZZI DEI NUMERI CASUALI

Capitolo 3 Metodi per calcolare i numeri casuali I numeri casuali possono essere generati in base a fenomeni fisici: le sequenze cosí ottenute sono veramente casuali, non ripetibili e la loro generazione è lunga e laboriosa. Con l avvento dei computer, la generazione è divenuta computazionale: le sequenze risultanti sono pseudo-casuali, la loro generazione è veloce ma sono ripetibili e in taluni casi predicibili. 3.1 Fisici I primi metodi per generare numeri casuali (dado, moneta, roulette) sono ancora usati al giorno d oggi principalmente nei giochi e nei giochi d azzardo, perché sono troppo lenti per l applicazione a fini statistici o crittografici. Alcuni fenomeni fisici, come il rumore termico nei diodi di Zener, sembrano essere veramente casuali e possono essere usati alla base di generatori di numeri casuali fisici. In rete ci sono molti metodi fantasiosi per generare numeri casuali. Un metodo molto usato è usare una funzione hash su un frame di un video preso da una sorgente casuale. Questo è il metodo usato per esempio da Lavarand. Esso prende l immagine delle macchie create dal materiale galleggiante nelle lavalamp, ne estrae dati casuali al fine di produrre un numero meramente casuale da usare come seme in un algoritmo pseudo-casuale. Anche se la seconda parte usa un algoritmo pseudocasuale, è un vero generatore di numeri casuali perché il seme utilizzato è totalmente casuale. Un altro esempio viene dalla Lithium Technologies, che usa una videocamera che inquadra il cielo in una giornata ventosa e nuvolosa. Un altra azienda ancora, la Random.org usa più banalmente il rumore atmosferico. Al di fuori dell ambiente computazionale, la generazione di numeri realmente casuali si basa sulla teoria dell entropia. Sorgenti di entropia includono il decadimento nucleare e le condizioni atmosferiche. Un altra fonte di entropia è il comportamento umano. Infatti, anche se gli uomini non 7

8 CAPITOLO 3. METODI PER CALCOLARE I NUMERI CASUALI sono considerati dei buoni generatori di casualità previa richiesta, essi lo diventano nel contesto dei giochi di strategia. L utilizzo dell entropia umana nel gioco per la generazione di casualità è stata studiata da Ran Halprin e Moni Naor. É possibile provare il loro generatore all indirizzo http://math166-pc.weizmann.ac.il/. I numeri casuali sono generati dall Atari 8-bit misurando del rumore casual su un circuito elettronico e convertendo questo valore tra zero e 65,535. Questo valore viene poi diviso per 65,536 per produrre un risultato tra zero e uno. I numeri casuali così generati sono eccellenti, ma non sono ripetibili; questo significa che facendo girare un programma il cui risultato dipende da numeri casuali, non si è in grado di riprodurre gli stessi risultati. 3.2 Computazionali I numeri casuali possono generati computazionalmente: dato un valore iniziale(seme) si procede seguendo un algoritmo: le sequenze cosí ottenute sono pseudo-casuali, ossia dato lo stesso seme e lo stesso numero di iterazioni si raggiunge lo stesso risultato. Inoltre questi generatori sono caratterizzati da una periodicità strettamente legata all algoritmo e ai parametri utilizzati. 3.2.1 Middle Square Questo metodo fu inventato da Jon von Neumann nel 1946 per la produzione di numeri casuali. Si prende un seme di m cifre, lo si eleva al quadrato e l elemento successivo della sequenza sarà quello ottenuto dalle m cifre centrali, come mostrato nell esempio: a 0 è il seme iniziale. a n = 654321 a 2 n = 428135971041 a n+1 = 135971 m è il numero di cifre che compongono il numero (deve essere pari) Questo non è un buon generatore di numeri casuali; inoltre se lo zero compare come una delle cifre della sequenza, esso continuerà a ripetersi. Non si tratta di un generatore periodico, esso terminerà quando si arriverà a zero. perché lo zero influenza molto il comportamento del generatore, nella simulazione viene richiesto che almeno il seme venga inizializzato con cifre 0.

3.2. COMPUTAZIONALI 9 Figura 3.1: 50 estrazioni con il generatore Middle Square 3.2.2 Lineare Congruenziale Nel 1948 venne proposto un generatore di numeri casuali distribuiti uniformemente detto generatore lineare congruenziale o più brevemente LCG che a tutt oggi è ancora utilizzato. Tale generatore venne presentato per la prima volta dal matematico D.H. Lemer esperto di teoria dei numeri. Il metodo LCG ha bisogno di un seme per inizializzare la sequenza di numeri secondo la seguente regola: x n+1 = (ax n + c) mod m, n 0 x n è la sequenza dei valori pseudo-casuali a è il moltiplicatore compreso tra 0 e m c è l incremento anch esso compreso tra 0 e m. Il periodo di un LCG generico è al massimo m, e in alcuni casi molto inferiore ad esso. Questa caratteristica evidenzia uno svantaggio nell utilizzo di questo metodo ovvero la periodicità molto piccola, come mostrato in figura 1. LCG avrà un intero periodo se e solo se: c e m sono primi tra loro a 1 è divisibile per tutti i numeri primi in m a 1 è multiplo di 4 se m è multiplo di 4 LCG aumenta la sua efficenza quando m equivale ad una potenza di 2, solitamente 2 32 o 2 64, questo permette che il modulo sia calcolato soltanto troncando i 32 o 64 bit più a destra.

10 CAPITOLO 3. METODI PER CALCOLARE I NUMERI CASUALI Figura 3.2: 40 estrazioni con il generatore Lineare Congruenziale, con M=16, a=5, c=3 I generatori lineari congruenziali sono semplici da implementare e la loro esecuzione è veloce. Adatti per sistemi con un quantitativo di memoria limitato, vengono utilizzati spesso nello sviluppo di videogiochi. Di contro presenta alcuni svantaggi nel caso in cui ad una applicazione servisse una casualità di alta qualità. Ad esempio non è utilizzabile nell ambito della crittografia o nei metodi per trarre stime attraverso simulazione, come nel caso del metodo Monte Carlo. 3.2.3 Congruenziale Quadratico La sequenza di numeri è generata secondo la seguente regola: a è un moltiplicatore. b è un secondo moltiplicatore. c è un incremento. X n = (a X 2 n 1 + b X n 1 + c) mod m m 1 è il massimo numero generabile. Per quanto concerne la periodicità di questo generatore, è al massimo m.

3.2. COMPUTAZIONALI 11 Figura 3.3: 50 estrazioni con il generatore Congruenziale Quadratico con valori: seme=13 a=2 b=3 c=1 m=16 3.2.4 Inverso Congruenziale Ricorsivo Una variante al generatore LCG è il generatore inverso congruenziale (ICG) creato da Eichenauer e Lehn nel 1986. Questo generatore è di tipo non-lineare congruenziale e si può incontrare in tre versioni: 1. ricorsivo, trattato qui di seguito 2. esplicito 3. composto, che permette di comporre i metodi precedenti La sequenza di numeri viene generata secondo la seguente regola: X n+1 = (ax 1 n + c) mod m, n 0 X n è la sequenza dei valori pseudo-casuali. X 1 n è l inverso moltiplicativo modulo m di X n+1. a è il moltiplicatore compreso tra 0 e m. c è l incremento anch esso compreso tra 0 e m. m 1 è il numero massimo che è possibile generare e m è primo. Per quanto concerne la periodicità di questo generatore, è al massimo m, e in alcuni casi molto inferiore ad esso. L andamento periodico di questo generatore è mostrato nella figura sottostante. Per ottenere la massima periodicità bisogna scegliere accuratamente i valori di a e c, di modo che il polinomio x 2 cx a sia primitivo nel campo Zm.

12 CAPITOLO 3. METODI PER CALCOLARE I NUMERI CASUALI Figura 3.4: 50 estrazioni con il generatore Congruenziale Inverso, con M=17, a=10, c=1, seme iniziale=10 3.2.5 Inverso Congruenziale Esplicito In linea generale, l EICG si può considerare il fratello del ICG, insieme al quale forma la versione composta. Creato da Eichenauer e Herrmann nel 1993, l EICG è piú facile da trattare in pratica perché non prevede la ricorsione. La sequenza di numeri viene generata secondo la seguente regola: X n = (a (n + n 0 ) + c) 1 mod m, n 0 X n è la sequenza dei valori pseudo-casuali. n 0 è il valore iniziale, il seme. a è il moltiplicatore compreso tra 0 e m. c è l incremento anch esso compreso tra 0 e m. m 1 è il numero massimo che è possibile generare e m è primo. La periodicità di questo generatore è come mostrato nella figura sottostante. Figura 3.5: 50 estrazioni con il generatore Congruenziale Inverso Esplicito, con M=17, a=10, c=1, seme iniziale=10

3.2. COMPUTAZIONALI 13 3.2.6 Inverso Congruenziale Composto Eichenauer-Herrmann hanno introdotto un semplice modo per combinare i generatori inversi, denominato metodo composto. Il metodo composto permette di unire ICG e EICG, se hanno periodo completo. Dati p 1, p 2,..., p r numeri primi e distinti, ciascuno p j 5. Per ogni indice j, 1 j r, (y n (j) ) con n 0 sia una sequenza di elementi di Z pj puramente periodica di periodo p j. Dato (x (j) n )n 0 il numero pseudo-casuale in [0, 1[ ottenuto tramite: x (j) n y n (j) /p j dove n 0 e 1 j r La sequenza x n con n 0 del numero pseudo-casuale composto s in [0, 1[ è definito dalla congruenza Per valori non normalizzati in [0,1]: x n x 1 n +... + x r n(mod1), n 0 y n y 1 n +... + y r n, n 0 In parole povere, possiamo fare ICG composti oppure EICG composti. Nel primo caso, prendiamo r generatori ICG, ognuno caratterizzato dal proprio valore p, moltiplicatore a, accomulatore c e seme iniziale. Ad ogni iterazione, calcoliamo il valore y i per ogni generatore. Se volessimo normalizzare il risultato nell intervallo [0,1] lo dividiamo per il relativo p, di modo da ottenere un valore tra 0 e 1 che chiameremo x i. Infine sommiamo il valore di x i (o di y i se non consideriamo valori normalizzati) per ogni generatore. Per i valori normalizzati trasformeremo il valore ottenuto considerando solo le cifre dopo la virgola. Discorso analogo vale per la composizione di EICG. Il periodo della sequenza (x n ) con n 0 è uguale a M := p 1... p r, come mostrato in figura. Figura 3.6: Estrazioni con il generatore Congruenziale Inverso Composto, con ICG1(M=17, a=10, c=1, seme iniziale=15) e ICG2(M=101, a=15, c=1, seme iniziale=50); periodo 17*101=1717

14 CAPITOLO 3. METODI PER CALCOLARE I NUMERI CASUALI 3.2.7 Fibonacci Ritardato Un generatore di Fibonacci ritardato (LFG, dall inglese Lagged Fibonacci Generator) è un algoritmo per la generazione di numeri pseudo-casuali basato su una generalizzazione della Successione di Fibonacci. Dalla definizione della successione di Fibonacci: F n = F n 1 + F n 2 Similmente, il generatore è definito come: F n = F n j F n k mod m, 0 j k F n è la sequenza dei valori pseudo-casuali. m solitamente è una potenza di 2 (m = 2 M ). è una qualsiasi operazione binaria (addizione, sottrazione, moltiplicazione, ma anche un or-esclusivo). j e k sono due indici che servono a individuare 2 termini precedenti. La teoria di questo tipo di generatore è piuttosto complessa e non può essere sufficiente scegliere i valori casuali per j ed il k, a tale scopo esistono coppie di valori noti. Questi generatori inoltre tendono ad essere molto sensibili alla fase di inizializazione, in particolare i primi k numeri è buona norma siano dispari. Per quanto concerne la periodicità di questo generatore: - (2 k 1) 2 M 1 nel caso di addizione o sottrazione - (2 k 1) nel caso di or-esclusivo - (2 k 1) 2 M 3 nel caso di moltiplicazione Un esempio che illustra la periodicità è mostrato nella figura seguente: 3.2.8 Registro a Scorrimento a Retroazione Lineare Il registro a scorrimento a retroazione lineare (linear feedback shift register, LFSR) è una tipologia di registri di traslazione i cui dati in ingresso sono prodotti da una funzione lineare dello stato interno, in particolare questa funzione è l or esclusivo (xor) di alcuni bit memorizzati all interno dei registri. Anche questo generatore necessita di un seme, e perché l operazione del registro è deterministica, la sequenza di valori prodotta dal registro è completamente determinata dal suo stato corrente o precedente. Allo stesso modo, perché il registro ha un numero finito di stati possibili, prima o poi i valori in uscita si ripetono; ciò nonostante, un LFSR con una funzione di retroazione ben scelta può produrre una sequenza di bit che appare casuale ed ha

3.2. COMPUTAZIONALI 15 Figura 3.7: 50 estrazioni con il generatore di Fibonacci Ritardato, con M=16, j=2, k=3 e operatore * un periodo molto lungo. La lista di posizioni dei bit che influenza lo stato successivo è detta sequenza di tap. Un LFSR massimale produce una sequenza-n (cioè passa attraverso tutti i possibili stati del registro di traslazione tranne quello che produce tutti zeri).non è possibile usare come stato iniziale o intermedio lo zero perché produrrebbe da quel punto in poi solo zeri. La sequenza di tap di un LFSR può essere rappresentata come un polinomio modulo 2. Questo significa che i coefficienti del polinomio devono essere 1 o 0. Questo è noto come polinomio di retroazione o polinomio caratteristico. Ad esempio, se i tap sono al 4 o e 3 o bit, il polinomio LFSR relativo è : x 4 + x 3 + 1 Il termine noto del polinomio non corrisponde a un tap. Proprietà : Se e solo se il polinomio è primitivo, allora LFSR è massimale L LFSR sarà massimale solo se il numero di tap è pari I valori dei tap in un LFSR massimale sono primi tra loro Ci può essere piú di una sequenza di tap che rende massimale un LFSR di lunghezza fissata Una volta trovata una sequenza di tap massimale, se ne può trovare un altra con un procedimento automatico: se la sequenza di tap, in un LFSR a n bit, è [n, A, B, 0] (dove 0 rappresenta il termine noto x 0 = 1), la sua sequenza speculare è [n, n C, n B, n A, 0]. Entrambe producono un LFSR massimale. Il funzionamento del generatore è mostrato nella figura sottostante, che considera come seme iniziale il numero 12, un registro di 4 bit e 4 o e 3 o bit come tap:

16 CAPITOLO 3. METODI PER CALCOLARE I NUMERI CASUALI Figura 3.8: funzionamento registro a scorrimento a retroazione lineare Per quanto concerne la periodicità, nn LFSR a N bit genera (2 N 1) numeri interi diversi prima di ripetere la sequenza, come mostrato in figura. Figura 3.9: 50 estrazioni con il generatore Registro di Traslazione a Retroazione Lineare, con N=4, tap=4 o e 3 o bit, seme=9

3.3. CRITTOGRAFICI 17 3.3 Crittografici Un generatore di numeri pseudocasuali crittograficamente sicuro (detto in genere CSPRNG da Cryptographically Secure Pseudo-random Number Generator è un generatore di numeri pseudocasuali le cui proprietà lo rendono adatto all uso in crittografia. Molti aspetti della crittografia richiedono numeri casuali, ad esempio: Generazione di chiavi Generazione di chiavi di sessione (detti nonce) salti casuali richiesti da alcuni schemi di firma, come ECDSA, RSASSA-PSS One-time pad La qualità della casualità per queste applicazioni è varia. Per la generazione di un nonce può essere richiesta solo l unicità del numero generato. Per la creazione di una chiave è richiesta una qualità maggiore. Nel caso di one-time pad, la garanzia che il testo crittografato non sia violabile dipende unicamente dal fatto che la sorgente casuale utilizzata sia totalmente impredicibile. Idealmente la generazione di numeri casuali utilizza l entropia ottenuta da un altra sorgente, come un generatore di numeri casuali hardware o qualche processo impredicibile, anche se sono state trovate correlazioni inaspettate in processi di questo tipo. Da un punto di vista teorico la quantità di casualità l entropia che può essere generata da un sistema è uguale all entropia che è entrata nel sistema. Nella pratica però spesso sono necessari più numeri casuali di quelli che possono essere recuperati da una fonte di entropia. In questi casi vengono utilizzati i CSPRNG, che distribuiscono l entropia su più bit. Le specifiche richieste da un normale generatore di numeri pseudocasuali (PRNG) sono soddisfatte anche da un CSPRNG, ma non è vero l inverso. Le specifiche soddisfatte da un CSPRNG si dividono in due gruppi: il primo è che abbiano buone proprietà statistiche (cioè che passino i test i casualità), il secondo è che resistano bene agli attacchi, anche nel caso in cui vengano scoperte parte delle variabili che dovrebbero rimanere segrete. La maggior parte dei generatori di numeri pseudocasuali non sono utilizzabili come CSPRNG perché, pur soddisfacendo i test statistici, non sono progettati per resistere ad attacchi matematici appositamente studiati. 3.3.1 Blum Blum Shub L algoritmo Blum Blum Shub (B.B.S.) è un generatore di numeri pseudocasuali proposto nel 1986 da Lenore Blum, Manuel Blum e Michael Shub. Il generatore è definito come: x n+1 = (x n ) 2 mod M

18 CAPITOLO 3. METODI PER CALCOLARE I NUMERI CASUALI dove M = pq è il prodotto di 2 numeri primi molto grandi p e q, congruenti a 3 (mod 4) e l output è il bit meno significativo di x n+1 o la parità di x n+1 Di seguito vengono descritti i passi dell algoritmo: 1. Vengono scelti 2 numeri primi casuali p e q molto grandi, entrambi congruenti a 3 modulo 4 e si calcola M = pq 2. Viene scelto un numero casuale s, detto seme, primo con M e appartenente all intervallo [1, M 1]. Si calcola x 0 = s 2 mod M 3. Per i che va da 1 a l (con l pari al numero di numeri casuali che si vogliono generare) si eseguono i seguenti passi: (a) x i = (x i 1 ) 2 mod M (b) z i = il bit meno significativo di x i 4. Il risultato dell algoritmo è la sequenza di bit z 1, z 2,...z i Esempio: M = p q = 7 19 = 133 s=100 x 0 = 100 2 mod 133 = 25 x 1 = 25 2 mod 133 = 93 x 2 = 93 2 mod 133 = 4 x 3 = 4 2 mod 133 = 16 x 4 = 16 2 mod 133 = 123 l output sarà 1, 0, 0, 1 Questo algoritmo non può essere usato per delle simulazioni a causa della sua lentezza, ma si presta molto bene all utilizzo nel campo della crittografia in particolar modo nel campo della crittografia a chiave pubblica. 3.3.2 Fortuna Le parti fondamentali di fortuna sono 3: 1. il generatore prende il seme di lunghezza fissa e genera quantità arbitrarie di dati pseudocasuali;(nel dettaglio viene spiegato in seguito) 2. accumulatore raccoglie e capitalizza l entropia da varie fonti (tastiera, mouse, risposte dei dischi rigidi e stampati...) e a volte cambia il seme al generatore; 3. controllo sul file del seme che assicura che il PRNG possa generare dati casuali anche al primo avvio del computer.

3.3. CRITTOGRAFICI 19 Descriviamo di seguito il generatore vero e proprio. Il suo stato interno è composto da una chiave di 256 bit per il codice a blocchi (AES, Serpent o Twofish) e da un contatore di 128 bit. Se un utente o un applicazione richiede dati casuali, il generatore esegue il suo algoritmo e genera dati pseudocasuali. Per evitare che subito dopo un attacker comprometta lo stato del generatore per inferire i dati appena trasmessi, il generatore dopo ogni richiesta genera 256 bit supplementari di dati pseudocasuali e li utilizza come nuova chiave del codice a blocchi. è possibile quindi mettere da parte la vecchia chiave, scongiurando ogni possibile fuga di informazioni sulle richieste precedenti. Consideriamo per esempio un programma che effettua una simulazione: vogliamo che la simulazione sia davvero casuale, ma vogliamo anche essere in grado di ripetere uno stesso calcolo, magari solo per scopi di debugging e test. Una buona soluzione consiste nel chiamare il generatore di numeri casuali del sistema operativo una volta, all inizio del programma, per ottenere un seme; tale seme può essere trascritto come parte dell output del simulatore e da esso generatore potrebbe generare tutti i dati casuali necessari alla simulazione. La conoscenza del seme originale del generatore ci consente anche di verificare tutti i calcoli, rieseguendo il programma con gli stessi input e lo stesso seme. Il funzionamento vero e proprio è il seguente: 1. inizializzazione: questa fase è piuttosto semplice: impostiamo la chiave (K) e il contatore(c) a zero, per indicare che il generatore non ha ancora ricevuto un seme. (K, C) (0, 0); impacchettare lo stato (S) S (K, C); 2. Rinnovo del seme: aggiorna lo stato con una stringa di input arbitraria.per mescolare in modo esauriente dell input con la chiave esistente, utilizziamo una funzione di hashing (per esempio SHA). Incrementiamo inoltre il contatore per indicare al generatore l avvenuto rinnovo del seme. s è un nuovo seme o seme aggiuntivo K SHA(K s); C C + 1; 3. generazione dei blocchi: questa funzione genera un certo numero di blocchi di output casuali. Essa è una funzione interna utilizzata soltanto dal generatore: qualsiasi altra entità esterna al PRNG non dovrebbe essere in grado di chiamarla. k è il numero di blocchi da generare r è una stringa pseudocasuale di 16*k byte r ε per cominciare con la stringa vuota

20 CAPITOLO 3. METODI PER CALCOLARE I NUMERI CASUALI La funzione E è quella di codifica del codice a blocchi, con chiave K e contatore C. f ori(1...n)r r E(K, C) appendere i blocchi necessari C C + 1 return r 4. generazione di dati casuali.questa funzione genera dati casuali su richiesta dell utente del generatore. n numero di byte da generare r stringa pseudocasuale di n byte r primi n byte(generablocchi(s, ceil[n/16])) Passare una nuova chiave per evitare in seguito che questo output possa essere compromesso: K GeneraBlocchi(S, 2) genero 2 blocchi per ottenere una nuova chiave return r

Capitolo 4 Test Come possiamo sapere se un generatore di numeri pseudo-casuali è un buon generatore? La risposta è: applicando test statistici. Se la sequenza di numeri generata supera determinati test come se fosse una sequenza veramente casuale allora abbiamo un buon generatore. Un test statistico di solito si esegue come segue: 1. Ipotesi nulla: è essenziale che quel che supponiamo sia vero (per esempio, la sequenza di bit osservata appare casuale) 2. Raccogliere qualche dato (per esempio, un campione della sequenza) 3. Eseguire il test (a) Rifiutiamo l ipotesi nulla se i dati non la confermano (per esempio, il risultato non è all interno di un determinato intervallo di valori 4. Se l ipotesi nulla è vera, allora il test statistico eseguito deve seguire una data distribuzione statistica Distribuzione Normale Chi-Quadro In questo modo sappiamo se i risultati sono nell intervallo esatto Quando testiamo un hardware o software a fini crittografici, molti si soffermano sul generatore di dati pseudo-casuali, perché è l oggetto in cui piú probabilmente si possono avere problemi. Lo standard federale US (FIPS 140-1) specifica i valori ammissibili per un buon generatore, in una batteria di 4 test (frequency, poker, runs, long run test). I test vengono eseguiti su campioni di 20.000 bit e se non vengono superati tutti il generat ore non è considerato valido. 21

22 CAPITOLO 4. TEST 4.1 Frequency Test Questo test valuta se il numero di 0 e di 1 prodotti dal generatore sono approssimativamente lo stesso valore, secondo la formula: X 1 = (n 0 n 1 ) 2 n n 0 = il numero di occorrenze di 0 nella sequenza n 1 = il numero di occorrenze di 1 nella sequenza n = il numero totale di bit Ci aspettiamo che il valore di X 1 si avvicini allo 0 se la sequenza è veramente casuale. A volte questo test è anche chiamato Monobit Test. Formalmente X 1 deve seguire la distribuzione del Chi-Quadro con 1 grado di libertà. Esempio: Consideriamo la sequenza s (non casuale) di lunghezza n=160 ottenuta ripetendo 4 volte la stessa sequenza: s= 11100 01100 01000 10100 11101 11100 10010 01001 11100 01100 01000 10100 11101 11100 10010 01001 11100 01100 01000 10100 11101 11100 10010 01001 11100 01100 01000 10100 11101 11100 10010 01001 n 0 = 84 n 1 = 76 X 1 =0.4 Dal risultato non abbiamo ragione di pensare che la sequenza non sia casuale secondo il Frequency Test, quindi accettiamo l ipotesi. FIPS richiede che il numero di 1 sia nell intervallo (9.654-10.346) su 20.000 bit totali nel campione. 4.2 Serial Test Questo test determina se il numero di occorrenze di 00,01,10,11 come sottosequenze anche sovrapposte di S sia all incirca lo stesso. X 2 = 4 n 1 (n2 00 + n 2 01 + n 2 10 + n 2 11) 2 n (n2 0 + n 2 1) + 1 n 0 = il numero di occorrenze di 0 nella sequenza n 1 = il numero di occorrenze di 1 nella sequenza n è il numero totale di bit

4.3. POKER TEST 23 n 00 = il numero di occorrenze di 00 nella sequenza n 01 = il numero di occorrenze di 01 nella sequenza n 10 = il numero di occorrenze di 10 nella sequenza n 11 = il numero di occorrenze di 11 nella sequenza Formalmente, X2 deve seguire la distribuzione del Chi-Quadro con 2 gradi di libertà Esempio: Consideriamo la sequenza s (non casuale) di lunghezza n=160 ottenuta ripetendo 4 volte la tessa sequenza: s= 11100 01100 01000 10100 11101 11100 10010 01001 11100 01100 01000 10100 11101 11100 10010 01001 11100 01100 01000 10100 11101 11100 10010 01001 11100 01100 01000 10100 11101 11100 10010 01001 n 0 = 84 n 1 = 76 n 00 = 44 n 01 = 40 n 10 = 40 n 11 = 35 X 2 = 0,6252 Dal risultato non abbiamo ragione di pensare che la sequenza non sia casuale secondo il Serial Test, quindi accettiamo l ipotesi. 4.3 Poker Test Questo test divide la sequenza S in k sottostringhe di lunghezza m, si contano poi le occorrenze per ciascuno dei m 2 possibili valori di m bit. X 3 = 2m k ( 2 m i=1 n 2 i ) + k n i = il numero di occorrenze di i-esimo tipo, dove 1 i 2 m nella sequenza ogni sottosequenza k corrisponde ad una differente mano di poker Formalmente, X 3 deve seguire la distribuzione del Chi-Quadro, con 2 m 1 gradi di libertà. Se m = 1 il Poker Test si riduce ad essere un Frequency Test. Esempio: Consideriamo la sequenza s (non casuale) di lunghezza n=160 ottenuta ripetendo 4 volte la stessa sequenza: s= 11100 01100 01000 10100 11101 11100 10010 01001 11100 01100 01000 10100 11101 11100 10010 01001

24 CAPITOLO 4. TEST 11100 01100 01000 10100 11101 11100 10010 01001 11100 01100 01000 10100 11101 11100 10010 01001 m = 3 e k = 53 n 1 =occorrenze di 000 5 n 2 =occorrenze di 001 10 n 3 =occorrenze di 010 6 n 4 =occorrenze di 011 4 n 5 =occorrenze di 100 12 n 6 =occorrenze di 101 3 n 7 =occorrenze di 110 6 n 8 =occorrenze di 111 7 X 3 = 9,6415 La soglia per 7 gradi di libertà è 14,06, per cui non abbiamo ragione per rifiutare l ipotesi secondo il Poker Test. Lo standard FIPS prevede m = 4 e 1, 03 X 3 57, 4 4.4 Autocorrelation Test Questo test considera la sequenza s di n bit e le versioni shiftate(spostate di d posizioni) di essa (in maniera non ciclica). Il numero di bit in s non uguali nelle loro versioni spostate è: A(d) = n d 1 i=0 s i s i+d L Autocorrelation Test si calcola secondo la formula: X 4 = (A(d) n d 2 )/ n d Valore di shift: 1 d [n/2] Formalmente, X deve seguire la distribuzione normale N(0, 1). Il valore soglia è ± 1,96. Esempio: Consideriamo la sequenza s (non casuale) di lunghezza n=160 ottenuta ripetendo 4 volte la stessa sequenza: s= 11100 01100 01000 10100 11101 11100 10010 01001 11100 01100 01000 10100 11101 11100 10010 01001 11100 01100 01000 10100 11101 11100 10010 01001 11100 01100 01000 10100 11101 11100 10010 01001 Supponiamo: d = 8 A(8) = 100 Il valore di X è 3,8933

4.5. RUNS TEST 25 perché questo risultato non è valido per l Autocorrelation Test rifiutiamo l ipotesi e affermiamo che la sequenza probabilmente non è casuale. 4.5 Runs Test Questo test si prefigge di valutare se le sottosequenze di 0 e di 1 contigui seguono la frequenza attesa. Il valore atteso di blocchi (sequenze di 1) o gaps (sequenze di 0) di lunghezza i in una sequenza casuale binaria è: e i = (n i + 3)/2 i+2 Il Runs Test si calcola secondo la formula: X 5 = k i=1 (B i e i ) 2 e i + k i=1 (G i e i ) 2 e i k = l intero più grande per cui e i 5 B i = il numero di blocchi di lunghezza i in s G i = il numero di gap di lunghezza i in s Formalmente, X 5 deve seguire la distribuzione del Chi-Quadro con 2k 1 gradi di libertà. Esempio: Consideriamo la sequenza s (non casuale) di lunghezza n=160 ottenuta ripetendo 4 volte la tessa sequenza: s= 11100 01100 01000 10100 11101 11100 10010 01001 11100 01100 01000 10100 11101 11100 10010 01001 11100 01100 01000 10100 11101 11100 10010 01001 11100 01100 01000 10100 11101 11100 10010 01001 k = 3 e 1 = 20,25 e 2 = 10,0625 e 3 = 5 Ci sono 25, 4, 5 blocchi rispettivamente di lunghezza 1, 2, 3 Ci sono 8, 20, 12 gaps rispettivamente di lunghezza 1, 2, 3 X 5 = 31,7913 La soglia per 4 gradi di libertà è 9,49, per cui possiamo affermare che il Runs Test non è valido e rifiutiamo l ipotesi e affermiamo che la sequenza probabilmente non è casuale. Lo standard FIPS prevede che per 1 i 6 B i e G i devono soddisfare i seguenti intervalli:

26 CAPITOLO 4. TEST G 1,B 1 [2267, 2733] G 2,B 2 [1079, 1421] G 3,B 3 [502, 748] G 4,B 4 [223, 402] G 5,B 5 [90, 223] G 6,B 6 [90, 223]

Capitolo 5 Conclusioni Per generare sequenze di numeri casuali tramite TRNG (true random number generator) ci vuole un generatore hardware di numeri casuali che generalmente sono basati su fenomeni microscopici come il rumore termico, l effetto fotoelettrico o il decadimento dell uranio o del cesio radioattivo. Un computer può essere in grado di generare solo PRNG (pseudo random number generator) che devono essere inizializzati assegnando un opportuno valore a un parametro numerico (il cosiddetto seme). Solitamente viene usato il timestamp del momento in cui viene richiesta la sequenza di numeri casuali. Se da un lato generare una sequenza PRNG è semplice e manterrà le caratteristiche di equidistribuzione ed indipendenza fra due elementi consecutivi, potrà comunque risultare in qualche modo prevedibile; dall altro lato procurarsi un generatore hardware di numeri casuali è molto complesso e il suo utilizzo è lento. Una giusta via di mezzo, che dovrebbe combinare i vantaggi dei due metodi, potrebbe essere quello di sfruttare i PRNG con algoritmi difficilmente predicibili e inizializzandoli con semi generati da un TRNG. In alcuni casi l algoritmo prevede di usare, oltre alla computazione vera e propria, la raccolta di dati sull entropia del sistema (movimenti del mouse, richieste ai dischi, pressione dei tasti della tastiera) per rendere impredicibile la sequenza dei numeri generati. Le caratteristiche che deve avere un buon generatore di sequenze pseudocasuali: Ripetibilità, affinchè sia possibile ripetere gli stessi esperimenti piú volte Soddisfacimento dei test: servono per verificare che il generatore sia quanto piú simile ad un generatore di numeri casuali ideale. Semplicità e rapidità: un simulatore che usa il generatore risulta quindi efficiente. Periodicità lunga, in modo da poter effettuare simulazioni lunghe senza riutilizzare piú volte la stessa sequenza. 27

28 CAPITOLO 5. CONCLUSIONI Portabilità, cioè rendere l implementazione del generatore indipendente dalla piattaforma.

Bibliografia [1] Wikipedia, Random Number Generation, http://en.wikipedia.org/wiki/random number generation [2] Zvi Gutterman, Benny Pinkas, Tzachy Reinman, Analysis of the Linux Random Number Generator,http://www.pinkas.net/PAPERS/gpr06.pdf [3] Wikipedia, Lagged Fibonacci generator, http://en.wikipedia.org/wiki/lagged Fibonacci generator [4] Wikipedia, Linear congruential generator, http://en.wikipedia.org/wiki/linear congruential generator [5] Blum Blum Shub Generator, http://www.cs.dartmouth.edu/ akapadia/project2/node11.html [6] Niels Ferguson, Bruce Schneier Crittografia Pratica, p.130-135 [7] Peter Hellekalek, Inversive Generators, http://random.mat.sbg.ac.at/generators/wsc95/inversive/node2.html [8] Wikipedia, Linear Feedback Shift Register, http://en.wikipedia.org/wiki/linear feedback shift register [9] B. Warinschi, N.P. Smart, COMSM2004 : Random Streams of Bits, http://www.cs.bris.ac.uk/teaching/resources/comsm2004/lectures/stream- 3x3.pdf [10] Wikipedia, Statistical Randomness, http://en.wikipedia.org/wiki/statistical randomness [11] Michael Mascagni, Shaharam Rahimi, Parallel inversive congruential generators: Software and field-programmable gate array implementations, http://www.cs.fsu.edu/ mascagni/papers/ricp2000 2.pdf 29