Alea Info
Alea Info
Alea Info
Pierre-André Zitt
17 janvier 2017
Objectifs
— Comprendre les objectifs de la génération de nombres aléatoires
— Comment tester un générateur ?
— Comprendre l’exemple du générateur linéaire.
Question pratique
Le tirage est-il raisonnable ? Ressemble-t-il à ce qu’on obtiendrait en lançant une pièce
équilibrée 15 fois de suite ?
FPPPFPFPPFPPFPF
1
Question mathématique
Comment comparer la distribution observée et la distribution théorique ?
Théorème
p √
Un intervalle de fluctuation Soit e = zα p(1 − p)/ N. Alors
P [SN /N ∈ [p − e, p + e]] ≈ 1 − α.
α 0.05 0.01
Intervalle sur les proportions [0.45, 0.80] [0.40, 0.86]
Intervalle sur les effectifs [13, 24] [12, 26]
Autrement dit, dans 95% des cas, au moins 6 tirages sur les 30 donnent une série de longueur
supérieure ou égale à 4. Dans 99% des cas, au moins 4 tirages sur les 30 sont dans ce cas.
En pratique les êtres humains ont tendance à produire des suites « trop réparties » : en
équilibrant trop les piles et les faces, en les alternant trop souvent, ...
— Nous sommes de très mauvais générateurs de nombres aléatoires ;
— ce manque de qualité peut se mettre en évidence par des tests statistiques.
2 Pourquoi l’aléatoire ?
L’ordinateur est habituellement vu comme une machine entièrement déterministe (un
programme répété dans les mêmes conditions donnera le même résultat). Dans quels cadres
peut-on avoir besoin que l’ordinateur produise des résultats aléatoires ?
La simulation De nombreux phénomènes réels, même quand ils sont déterministes, sont trop
compliqués pour être représentés fidèlement dans un modèle informatique. Il est alors
naturel de prendre un modèle aléatoire. Si l’on veut étudier le modèle il faut savoir le
simuler.
Exemples : dynamique moléculaire ; modèles économiques multi-agents ; modèles de
croissance (de villes, d’arbres, ... ) pour des univers virtuels, pour de la génération de
textures...
L’optimisation combinatoire Pour répondre à des questions déterministes il peut être utile
de faire des choix aléatoires. : pour savoir si un grand entier est premier ou non, pour
savoir si une position est bonne ou non dans un jeu (go, jeu de cartes, ...), pour résoudre
approximativement des problèmes d’optimisation combinatoire (voyageur de commerce,
...)
2
Le calcul déterministe pour des problèmes complexes Dans le même ordre d’idées, une des
applications les plus courantes des générateurs aléatoires est l’utilisation de méthodes
de Monte-Carlo pour calculer des intégrales / des espérances de quantités aléatoires
(en finance, en physique, ...)
La cryptographie C’est un domaine omniprésent : chaque communication entre appareils
électroniques utilise de nombreux protocoles cryptographiques. Les algorithmes de
chiffrement et déchiffrement sont déterministes mais la quasi totalité de ces algorithmes
nécessite d’engendrer des nombres aléatoires.
En pratique, on procède toujours en deux étapes :
1. on construit un générateur de nombres (pseudo-)aléatoires uniformes : une fonction
rand qui renvoie un nombre « aléatoire » dans un ensemble continu (souvent l’intervalle
[0, 1]) ou discret (souvent l’ensemble {0, 1}).
2. À partir d’une source de hasard uniforme, on la transforme pour simuler la variable
aléatoire d’intérêt.
Ici on ne s’intéressera qu’à la première étape.
Question pratique
Comment programmer un ordinateur pour qu’il renvoie une suite (pseudo)-aléatoire
uniforme ?
Théorème
Écriture dyadique Soit u ∈ [0, 1). Il existe une unique suite (xn )n≥1 qui vérifie les
conditions suivantes :
1. xn ∈ {0, 1},
2. xn n’est pas constante égale à 1 à partir d’un certain rang, autrement dit xn prend
la valeur 0 une infinité de fois,
P
3. u = n xn 2−n .
La suite xn est appelée décomposition dyadique de u, c’est l’écriture du réel u en base 2.
On note u = (0.x1 x2 · · · xn · · · )2 .
Fixons un début de développement binaire, par exemple (0.00101)2 . Les réels dont le
développement dyadique commence ainsi sont ceux compris entre (0.00101)2 = 1/8 + 1/32 et
(0.00110)2 = 1/8 + 1/16. La probabilité pour une loi uniforme de tomber dans cet intervalle
est 1/32 = 1/25 . Ce raisonnement est valable pour toute suite de 5 symboles dans {0, 1} :
3
autrement dit, en regardant les 5 premiers chiffres du développement dyadique d’un réel pris
uniformément dans [0, 1], chacune des 25 suites possibles est choisie avec la même probabilité.
Ceci donne plus généralement une correspondance remarquable entre l’aléatoire discret et
l’aléatoire continu :
Théorème
Soit U une variable aléatoire de loi uniforme sur [0, 1]. Soit (Xn )n∈N la réprésentation
dyadique de U. Alors (Xn )n∈N est une suite de variables de Bernoulli indépendantes de
paramètre 1/2.
Réciproquement si (Xn )n∈N est une suite iid de Bernoulli de paramètre 1/2, alors la
P
série n X2nn converge presque sûrement vers une variable U = (0.X1 X2 · · · )2 , dont la loi
est uniforme sur [0, 1].
Cette correspondance théorique parfaite entre les deux modèles d’aléatoire élémentaires
discrets et continus ne se traduit malheureusement pas par une correspondance pratique : les
générateurs de bits aléatoires usuels ne donnent pas nécessairement de bons réels aléatoires,
et réciproquement.
1X
n
1ui ∈[a,b] ≈ (b − a).
n
k=1
QD
Équirépartition d’ordre supérieur Pour toute pavé P = i=1 [ai , bi ],
1X Y
1(unD+1 ,...,unD+D )∈P ≈ (bi − ai ).
n
i
Et plus généralement... Pour tout k et toute fonction « test » f : [0, 1]k → R, on peut
comparer f(U1 , ..., Uk ) pour le générateur aléatoire et pour une vraie suite de variables
uniformes pour obtenir un test du générateur.
Notons que ces propriétés idéales ne seront jamais vraiment atteintes. La formulation de
l’équirépartition écrite ci-dessus n’est par exemple jamais vérifiée si on interprète ≈ comme
une limite quand n tend vers l’infini, puisqu’un générateur informatique ne peut renvoyer
qu’un nombre fini de valeurs possibles, donc certains intervalles [a, b] ne seraont jamais
visités. On demandera alors plutôt que chacune des valeurs possibles apparaisse avec la même
fréquence.
Pour certaines utilisations en cryptographie on demande également :
Imprévisibilité Même en ayant accès à tous les nombres (u1 , ..., un ), il n’est pas possible de
prévoir un+1 .
Naturellement vérifier ces critères peut demander des algorithmes plus complexes et plus
gourmands en temps de calcul et en mémoire ; suivant les applications envisagées il faut faire
des choix...
4
3.3 « Vrai » hasard
Une façon d’obtenir un nombre aléatoire est de le « capter » dans l’environnement, en
enregistrant les fluctuations thermiques, les mouvements de la machine, les motifs d’interférence
radio...
Cette méthode est souvent (relativement...) lente ; elle est utilisée principalement pour les
besoins en cryptographie, et est intégrée dans des composants électroniques dédiés.
Les nombres fournis ainsi sont également souvent utilisés pour initialiser ou réinitialiser les
générateurs pseudo-aléatoires décrits plus bas.
La valeur initiale x0 est appelée « graine » (seed). Comme xn ne peut prendre qu’au
maximum m valeurs, elle est nécessairement périodique à partir d’un certain rang ; on cherche
usuellement à avoir une période élevée (si possible proche de m lui même).
Si a = 1 on a une suite arithmétique (modulo m), de période maximale si et seulement si c
est premier avec m. On se doute, et on peut montrer, que ce n’est pas un très bon choix. On
suppose donc a > 1.
Il est relativement facile de déterminer si un choix de paramètres conduit à une période
maximale. Montrons-le dans le cas particulier 1 où m est une puissance de 2.
Théorème
CNS de période maximale. Soit e un entier et m = 2e . La période du générateur est
maximale égale à m si et seulement si c est impair et a ≡ 1[4].
1. Le lecteur curieux pourra trouver l’énoncé général (pour m quelconque) et sa preuve dans The art of
Computer programming II de D. Knuth, section 3.2.1.2, théorème A.
5
Lemme
Si e ≥ 2,
x ≡ 1[2e ], x2 ≡ 1[2e+1 ],
=⇒
x 6≡ 1[2e+1 ] x2 6≡ 1[2e+2 ]
Remarquons qu’avoir la période maximale n’est pas une garantie de qualité. Une suite de
période maximale est équirépartie, mais elle ne l’est pas forcément à l’ordre supérieur. Pour
s’en convaincre, on peut représenter graphiquement les points (un , un+1 ) : pour un tirage
parfait on devrait obtenir des points de loi uniforme dans le carré, en pratique on observe
des motifs plus ou moins nets suivant les valeurs des paramètres (voir la figure page suivante
pour une illustration).
Ces défauts se retrouvent dans tous les générateurs linéaires. Pour les contourner on peut
par exemple...
— Remplacer la sortie un = xn /m par une fonction plus compliquée/imprévisible ;
— Remplacer la récurrence linéaire par une récurrence non-linéaire (par exemple xn+1 = x2n
mod m : c’est l’algorithme de Blum Blum Shub).
Les générateurs correspondants sont (parfois) meilleurs, mais souvent plus lents et plus
difficiles à analyser mathématiquement.
6
��� ��� ���
� � �
��� ���
� ��� � ���
��� ���
��� ��� ��� ��� ��� ���
� �
Tracé des points (uk , uk+1 ) sur une période du générateur. Sur la première ligne on fixe m = 128, et
on étudie différentes valeurs pour (a, c) : (101, 115), (21, 1), (17, 115). La qualité de l’équidistribution
dans le carré est très sensible à ces choix.
Dans la deuxième ligne on fait le même constat pour m = 2048, c = 1 et deux valeurs de a : 1365 à
gauche et 65 à droite.
Notons que dans tous les cas les uk sont équirépartis dans [0, 1].
Figure 1 – Répartition des points dans le carré pour différents générateurs à récurrence
linéaire
7
Prenons un exemple : partons du mot à d = 4 lettres (1011), et supposons que quand la
sortie vaut 1 on inverse les deux bits les plus à droite. Cette inversion peut être modélisée
par le fait qu’à chaque étape, le 3è bit est obtenu en faisant la somme modulo 2 des anciens
premiers et quatrième bit ; de même le quatrième bit est obtenu en faisant la somme modulo
2 du premier bit et de 0. On peut représenter la méthode par le schéma suivant :
sortie 1 0 1 1 entrée : 0
où le symbole représente une « porte "ou exclusif" », qui fait la somme modulo 2 de
ses deux entrées. Après une itération, on obtient par exemple l’état suivant :
sortie : 1 0 1 0 1 entrée : 0
C’est une combinaison de plusieurs de ces générateurs à registres qui est utilisée dans les
systèmes de chiffrement A5/1 (utilisé pour la téléphonie GSM), E0 (pour Bluetooth) ou encore
CSS (pour les DVD).
8
Le standard « Mersenne Twister », référence de facto pour les générateurs aléatoires (hors
cryptographie), fonctionne comme une généralisation d’un LFSR. C’est celui qui est utilisé
par défaut dans Python.
3.6 Bilan
Être imprévisible est finalement assez difficile, et l’étude et la création de générateurs
aléatoires pour l’informatique est un sujet de recherche toujours actif actuellement. Ce besoin
est particulièrement important en cryptographie : pour les besoins courants en simulation, de
bonnes solutions existent en standard sur les logiciels classiques, même si la généralisation du
travail sur les grandes masses de données peut demander de faire appel à de très nombreux
nombres aléatoires.
L’étude de ces générateurs est un sujet d’autant plus riche qu’il est à la frontière entre
l’informatique théorique, la cryptographie, l’algèbre, les probabilités et les statistiques.