Aritmetica modulare e generazione di numeri pseudo-casuali

Mentre leggete questa pagina, il vostro computer sta eseguendo una complessa serie di calcoli per visualizzarla sullo schermo e permettere al testo di scorrere. Nel frattempo, in background, sta conteggiando il tempo trascorso e memorizzando dati nella memoria cache. Tutti questi calcoli, per quanto complessi, sono sempre riconducibili ad operazioni di somma e sottrazione. Tuttavia, il vostro computer probabilmente vi permette anche di giocare... prendiamo un gioco semplice, il solitario. Come è possibile che un computer deterministico, cioè capace di fare somme e sottrazioni (moltiplicazioni, divisioni, estrazioni di radice e calcoli trascendenti, che sono sempre riconducibili ad operazioni di somma e sottrazione) possa effettuare calcoli probabilistici? E' certo che al suo interno non sono contenuti dei dadi...
La generazione di numeri casuali (random) è ottenuta grazie all'aritmetica modulare: una matematica fondata su insiemi numerici limitati e finiti.

nemesi: dadi

E' noto, nell'aritmetica tradizionale, che il quoziente, q, è il risultato della divisione fra il dividendo x e il divisore m, mentre R è l'eventuale resto.

Nell'aritmetica modulare, in luogo della usuale notazione impiegata per la divisione, si utilizza questa notazione: x(mod m)= R, e si dice: "x modulo m è uguale a R".

In pratica, la divisione in aritmetica modulare, è ottenuta secondo questo procedimento:

1) si calcola la divisione con la tecnica tradizionale (x : m = q);
2) si moltiplica la parte intera del quoziente per il divisore e la si sottrae dal dividendo (x - m * Q);
3) il risultato della sottrazione, è R

esempi:

10 (mod 4) = 2 infatti 10:4 = 2,5 e 10-4*2 = 2 = R
74 (mod 7) = 4 infatti 74:7 = 10, 57 e 74-7*10 = 4 = R
57 (mod 57) = 0 infatti 57:57 = 1 e 57-57*1 = 0 = R
37 (mod 36) = 1 infatti 37:36 = 1,02 e 37-36*1 = 1 = R


I calcoli proposti come esempi, possono essere effettuti anche con la calcolatrice fornita con Windows®. In modalità scientifica, la calcolatrice si presenta come nella figura sotto.

calcolatrice di Windows

Ad esempio, per effettuare il calcolo 74 mod 7, digitate il numero "7", poi clic su "mod", poi digitate il numero 7, infine clic su "=".
Per un numero esponenziale, come 1637 mod 77 = 58, digitate "37", poi clic su x^y, quindi clic su "MOD", poi digitate "37", infine clic su "="

Per la notazione: x(mod m) = R, valgono le seguenti proprietà:

random reboot per Windows

Con gli elementi di aritmetica modulare esaminati, è possibile generare numeri pseudo-casuali. I metodi di generazione di numeri pseudo-casuali prevalentemente usati sono i cosiddetti metodi congruenziali (si dice che a è congruente con b se a mod m = b mod m), basati sulla divisione mod m

R = x (mod m)

Per generare numeri casuali, si possono utilizzare tre tipi di metodi congruenziali:

  1. Metodo additivo:
    ri+1=ri+ri-1(mod m)
  2. Metodo moltiplicativo:
    ri+1=ari(mod m)
  3. Metodo misto:
    ri+1=(ari+b)(mod m)

dove: ri, a, b, m sono interi non negativi e ri è compreso tra 0 ed m.
Vengono chiamati: a moltiplicatore, b incremento e m modulo, mentre ro (valore iniziale della sequenza), è detto seme.
Tutti questi metodi danno origine a sequenze periodiche, con periodo minore o al più uguale ad m. Per ottenere il periodo massimo, devono essere rispetate queste condizioni:

La tabella riporta un semplice esempio per la generazione di numeri casuali compresi fra 0 e 7 (mod 7) e fra 0 e 8 (mod 8). Pero', nel primo caso si sono scelti parametri ottimizzati; nel secondo, no (m è multiplo di 4, e per a si è scelto il valore 16 invece di a-1=17). Il lettore puo' verificare che la relazione (17x+5) mod 8 produce effettivamente una sequenza pseudocasuale di periodo 8.

x (15x+5)mod 7 x (15x+5)mod7 x (16x+5) mod 8 x (16x+5)mod 8
1 20:7=6 8 125:7=6 1 21:8=5 8 133:8=5
2 35:7=0 9 140:7=0 2 37:8=5 9 149:8=5
3 50:7=1 10 155:7=1 3 53:8=5 10 165:8=5
4 65:7=2 11 continua 4 69:8=5 11 continua
5 80:7=3 12 5 85:8=5 12
6 95:7=4 13 6 101:8=5 13
7 110:7=5 14 7 117:8=5 14

In realtà, per la generazione di numeri pseudocasuali, si sceglie per m il valore piu' elevato possibile, al fine di ottenere un periodo elevato. Infatti, comunemenet i linguaggi di programmazione (Basic, C, Java, JavaScript, ecc.) dispongono di funzioni già predisposte per restituire un valore casuale. Ma, per evitare di ottenere ogni volta gli stessi numeri, la generazione viene automaticamente effettuata con m molto elevati.

E' importante scegliere m in modo tale da assicurarsi una sequenza di periodo abbastanza lungo; in ogni caso, la lunghezza del periodo deve essere superiore alla quantità di numeri casuali richiesti dal problema che interessa.
Quando la lunghezza del periodo è uguale ad m, si dice che il generatore ha periodo pieno.

nemesi

copyright Marcello Guidotti, 2001
Questo articolo, può essere liberamente pubblicato su qualsiasi supporto o rivista, purché con limitati adattamenti e con citazione della fonte e l'indirizzo di questo sito.