Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
Institut de la Francophonie pour l'Informatique
MÉMOIRE DE STAGE DE FIN D’ÉTUDES
Master de Recherche
Mention Informatique
Spécialité Intelligence Artificielle et Multimédia
Génération aléatoire de classes des
partitions d'entier et de certains
objets combinatoires
Stagiaire CAO Phuong Thao
Établissement d'accueil : L'Institut de Mathématiques (IM)
L'Académies des Sciences et des Technologies du Vietnam
Équipe d'acceuil :Département « Fondations mathématiques pour l'Informatique»
Directeur de recherche : Madame PHAN Thi Ha Duong,
Maître de conférences de l'Université Paris 7 et chercheur de l'IM
Hanoi, 15 Janvier, 2009
1
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
Table des matières
Remerciements2
Résumé3
Abstract5
Liste des figures7
Liste des tableaux8
1. Introduction9
1.1. Définitions9
1.2. Générer tous les objets 10
1.3. Génération aléatoire d'un objet assurant la distribution uniforme10
1.4. Méthode de fonctions génératrices10
2. Codage et Génération aléatoire13
2.1. Génération aléatoire d'un arbre par le codage de Prüfer13
2.2. Génération aléatoire d'une permutation par la table d'inversion17
2.3. Génération aléatoire d'une triangulation19
3. Partitions d'entier positif24
3.1. Définitions24
3.2. Représentation de partitions et l'ordre de la classification25
3.3. Calcul le nombre des partitions25
3.4. Génération des partitions par ZS1 et ZS228
3.5. Génération aléatoire d'une partition33
3.6. Génération aléatoire d'une partition impaire40
3.7. Génération aléatoire d'une partition paire44
3.8. Génération aléatoire d'une partition stricte49
4. Expérimentation et Analyse des résultats52
4.1. Programme de génération aléatoire d'un arbre par le codage de Prüfer52
4.2. Programme de génération aléatoire d'une permutation par la table d'inversion 55
4.3. Programme de génération aléatoire d'une triangulation56
4.4. Programme de génération des partitions d'entier par ZS1 et ZS258
4.5. Programme de génération aléatoire d'une partition d'entier59
4.6. Programme de génération aléatoire d'une impaire d'entier63
4.7. Programme de génération aléatoire d'une paire d'entier66
4.8. Programme de génération aléatoire d'une partition stricte d'entier66
5. Conclusion et perspective69
Références71
Annexe72
2
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
REMERCIEMENTS
Je tiens particulièrement à remercier Madame PHAN Thi Ha Duong, ma professeur à
l’Institut de Mathématiques du VietNam, qui m‘a aidé beaucoup avec ses conseils utiles
sur la direction de mon sujet et la méthode de recherche pendant toute la durée du stage.
Je tiens également à remercier tous les professeurs à l’Institut de la Francophonie pour
l’Informatique pour l’enseignement, l’aide, les conseils utiles et l’environnement de
travail très chaleureuse.
J’exprime mes reconnaissances à tous les professeurs à l’Institut de Mathématiques et à
mes amis dans l’équipe de recherche dont Mme Phan est responsable pour leur accueil
chaleureux et qui m’ont aidé avec des documents, des livres utiles pour ma recherche.
Enfin, j’adresse mes sincères remerciements à ma famille, mes parents et mes amis qui
sont toujours près de moi et m’ont apporté le courage dans les moments difficiles.
3
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
Résumé
Le sujet de ce stage se situe dans le cadre du projet de recherche «Combinatoire
énumérative et génération aléatoire» de l'Académies des Sciences et des Technologies du
VietNam dont Mme Phan est responsable. En informatique, la génération aléatoire est un
thème beaucoup étudié et elle donne lieu à des applications dans des différents domaines
tels que des algorithmes cryptographiques, des tests de programmes, des algorithmes
probabilistes, des modélisations nucléaires, etc. Dans le cadre de ce sujet, nous nous
intéressons à la génération aléatoire des classes des partitions d'entier positif et d'autres
objets combinatoires par exemple les arbres, les triangulations et les permutations.
L'objectif de ce travail est d'étudier des méthodes existantes qui peuvent faciliter la
génération aléatoire et réduire le temps de génération. En plus, le stagiaire proposera de
nouveaux algorithmes pour certaines classes. Dans le travail pratique, les algorithmes
représentés seront implémentés par des outils comme des bijections, des probabilités et
des graphes pour illustrer des méthodes différentes.
Ce rapport se compose de cinq chapitres :
L'objectif du premier chapitre est de donner une vue globale sur des objets et des
thèmes étudiés dans ce rapport. Ce chapitre est consacré à la présentation des définitions
d'objets combinatoires étudiés dans ce rapport comme les arbres, les triangulations, les
permutations et les partitions d'entier. Ce sont des objets combinatoires souvent utilisés
dans la structure de données informatiques ou dans la construction d'algorithmes. Le
concept de génération des objets d'un ensemble et le concept de génération aléatoire d'un
objet sont aussi abordés dans ce rapport. Puis, on présente la méthode de fonction
génératrice pour calculer le nombre d'objets d'un ensemble.
Le but du deuxième chapitre est d'étudier et valider des différentes méthodes qui
permettent de faciliter la génération aléatoire. Ce chapitre parle du mécanisme de
générer aléatoirement basé sur les données cryptographiques des objets combinatoires.
Dans plusieurs cas, la génération aléatoire d'objets est difficile si ces objets ont une
structure complexe. Si ces objets sont codés et on fait la génération sur les codages, la
génération devient beaucoup plus facile. On le voit plus claire via l’algorithme de
génération aléatoire d'un arbre par le Codage de Prüfer et via la génération aléatoire d'une
permutation par la table d’inversion. La fin du chapitre présente l’algorithme de
génération aléatoire d'une triangulation en assurant la distribution uniforme. C'est un
nouveau résultat de recherche en 2008 du l'équipe dont Mme Phan est responsable. À
côté de l'introduction d'algorithmes existants, il y a aussi nos contributions dans ce
chapitre. Ce sont nos analyses concernant la complexité et la distribution uniforme
d'algorithmes. Ces analyses aident à comprendre et à comparer l'efficacité de ces
algorithmes par rapport aux autres. Nous réalisons aussi des programmes de ces
algorithmes dans le quatrième chapitre pour illustrer leurs fonctionnements via des
paramètres différents.
Le chapitre 3 est le centre de ce rapport qui parle de la partition. La plupart des nos
4
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
contributions se situent dans ce chapitre. Premièrement, nous rappelons la définition des
types de partition, des bijections et des fonctions génératrices pour compter des
partitions. Puis, nous introduisons deux algorithmes ZS1 et ZS2 pour générer tous les
partitions. Ces deux algorithmes ayant les plus petits temps de fonctionnement sont le
résultat de recherche de A. Zoghbi et I. Stojmenovic [18] en 1998. Particulièrement, selon
des conseils sur la direction de recherche de Mme Phan, nous avons trouvé aussi 3
nouveaux algorithmes. Ils permettent de générer aléatoirement une partition impaire,
une partition paire ou une partition stricte. Tous ces algorithmes assurent la distribution
uniforme et sont basés sur la méthode de génération aléatoire d'une partition[5][6]. Des
programmes de ces algorithmes sont réalisés au chapitre 4.
Dans la partie de l'implémentation de chapitre 4, il y a 9 programmes. Premièrement,
c'est un programme pour générer aléatoirement un arbre par le codage de Prüfer. Il y a
aussi deux programmes de génération aléatoire d'une triangulation et d'une permutation.
En suite, ces sont des programmes concernant la partition : deux programmes qui
génèrent tous les partitions d’entier positif selon ZS1 et ZS2, quatre programmes pour
générer aléatoirement : une partition, une partition impaire, une partition paire ou
partition stricte. À côté de l'introduction des algorithmes, il y a des évaluations de la
complexité des programmes et des résultats obtenus. Des avantages et des inconvénients
des programmes seront aussi discutés.
Enfin, le chapitre 5 est consacré pour la conclusion.
Mots clés partitions d'entier, partitions strictes, partitions impaires, partitions
paires, génération aléatoire, fonction génératrice, bijection, distribution uniforme.
5
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
Abstract
This subject is part of the research project "Enumerative Combinatorics and random
generation" of the Academies of Science and Technology of Vietnam which Ms. Phan is
responsible. In computing, random generation is a subject much studied and it gives rise
to different applications in areas such as cryptographic algorithms, testing programs,
probabilistic algorithms, modeling nuclear etc .... Under this regard, we are interested in
the generation of random classes of positive partitions and other combinatorial objects
such as trees, triangulations and permutations. The objective of this work is to study
existing methods that can facilitate the random generation and reduce the generation
time. In addition, we will propose new algorithms for classes. In practical work,
algorithms represented will be implemented by tools such as bijections, probabilities and
graphs to illustrate different methods.
The report consists of five chapters :
The objective of the first chapter is to give us a global view on objects in this report.
This chapter is devoted to presenting definitions of combinatorial objects studied in this
report as trees, triangulations, the permutations and partitions over. This combinatorial
objects are often used in the structure of data or the construction of algorithms. The
concept of generating a set of objects and the concept of random generation of an object
are also covered in this report. Then, this method of generating function to calculate the
number of objects in a set.
The goal of the second chapter is to examine and validate various methods to facilitate
the random generation. Chapter 2 speaks of the mechanism to generate random data
based on cryptographiques combinatorial objects. The generation of random objects is
difficult if they have the complex structure. In many cases, if they are coded and so on
encodings generation, the generation becomes much easier. We see more clearly through
the algorithm of random generation tree by the coding Prüfer and via the generation of
random permutation of the inversion table. The chapter will present the algorithm of the
random generation triangulations ensuring uniform distribution. It is a result of new
research in 2008 from the team which Ms. Phan is responsible. Besides the introduction
of existing algorithms, it is also my contributions in this chapter. These are my analysis
on the complexity and uniform distribution of algorithms. These tests will help us to
understand and compare the effectiveness of these algorithms compared to others. I
realize also programs of these algorithms in the fourth chapter to illustrate how they
work via different parameters.
The chapter 3 is the center of this report which spoke of the partition. Most of my
contributions are in this chapter. First, I remind the definition of partition types of
bijections and generating functions for counting scores. Then, though I ZS1 two
algorithms and ZS2 to generate all the partitions. Both algorithms have the smallest
operation time are the result of research by A. Zoghbi and I. Stojmenovic [18] in 1998.
Specifically, according to advice on the research direction of Mrs. Phan, I also found 3
6
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
new algorithms. They can randomly generate a partition odd, a partition or a pair strict
partition. All these algorithms ensure uniform distribution and are based on the method
of random generation of partition [5] [6]. Programs of these algorithms will be carried
out in Chapter 4.
In the part of the implementation of Chapter 4, there will be 9 programs. First, I realize
a program to randomly generate a tree by encoding Prüfer. There are also two generations
of triangulation and random permutation, two programs that generate all partitions
according ZS1 and ZS2 and four programs to randomly generate a partition, an odd
partition, an even partition or a strict partition. Besides the introduction of algorithms,
there will be assessments of the complexity and results of programs. Advantages and
disadvantages of programs will also be discussed.
Finally, the chapter 5 is devoted to the conclusion.
Keywords partitions d'entier, partitions strictes, partitions impaires, partitions
paires, génération aléatoire, fonction génératrice, bijection, distribution uniforme.
7
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
Liste des figures
Figure 1 Une exemple de triangulations9
Figure 2 L'algorithme de triangulation20
Figure 3 L'arbre numéroté de 10 sommets54
Figure 4 L'arbre numéroté de 50 sommets55
Figure 5 Une permutation de 30056
Figure 6 Une permutation de 10056
Figure 7 Une triangulation du polygone convexe de 7 sommets57
Figure 8 Une triangulation du polygone convexe de 25 sommets57
Figure 9 Les partitions de 20 selon l'ordre inverse lexicographique58
Figure 10 Les partitions de 20 selon l'ordre lexicographique59
Figure 11 Une partition de 10062
Figure 12 Une partition de 25063
Figure 13 Une partition impaire de 35065
Figure 14 Une partition paire de 50066
Figure 15 Une partition stricte de 40068
8
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
Liste des tableaux
Table 1 Exemple de codage 14
Table 2 Exemple de décodage15
Table 3 Distribution uniforme de triangulation 22
Table 4 Temps de génération des partitions selon ZS1 et ZS232
Table 5 Temps de génération des partitions de 75 en représentation standard33
Table 6 Complexité de génération aléatoire d'une partition 38
Table 7 Complexité de génération aléatoire d'une partition impaire 44
9
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
Chapitre 1 Introduction
Ce chapitre commence par des définitions d'objets combinatoires étudiés dans ce
rapport comme les arbres, les triangulations des polygone convexes, les permutations et
les partitions d'entier. Ce sont des objets combinatoires souvent utilisés en informatique.
Par exemple les arbres jouent un rôle central dans la conception et analyse d’algorithmes
et ils aident à décrire les propriétés dynamiques d'algorithmes. Le concept de génération
tous les objets d'un ensemble et le concept de génération aléatoire d'un objet sont aussi
abordés dans ce rapport. Puis, on présente la méthode de fonction génératrice pour
calculer le nombre d'objets d'un ensemble. Cette technique réduit le temps de calcul et
nous aide à connaître la formule explicite du nombre d'objets d'un ensemble.
1.1 Définitions
Définition 1 : Un graphe G=(X , E) est la donnée d'un ensemble X de sommets et d'un
ensemble E ⊂ X x X d'arcs.
Un graphe peut être orienté ou non orienté. Dans le cas d'un graphe non orienté, les
couples (x, y) et (y, x) représentent le même arc. Dans le cas d'un graphe orienté, ils
décrivent les deux arcs différents.
Définition 2 : Un arbre est un graphe non orienté, connexe et sans cycle.
Définition 3 : Un arbre numéroté d'ordre n est un arbre dont ses n sommets sont
étiquetés par des entiers distincts de 1 à n. ́
Définition 4 : Une triangulation d'ordre n–2 est une façon de diviser un polygone
convexe de n sommets en n2 triangles par des diagonales nonintersections.
On a prouvé que le nombre des façons pour trianguler un polygone convexe de n
sommets est égale au (n2)ième nombre de Catalan (Cn2).[2]
Exemple 1 : On a les 5 triangulations d‘ordre 3 ( C3 =5 ).
Figure 1 – Exemple de triangulations
Définition 5 : Soit A un ensemble de n entiers de 1 à n. Une permutation d'un ensemble
A est une bijection σ de A sur luimême.
Exemple 2. 5 2 1 4 3 est une permutation de l'ensemble A = {1, 2, 3, 4, 5}. On a σ(1)=5,
σ(2)=2, σ(3)=1, σ(4)=4, σ(5)=3.
Définition 6 : Une partition d'un entier positif n est une séquence décroissante des
k
entiers positifs λ1, λ2, ...λk tels que ∑ λ i = n où λi est appelé un part de la partition.
i=1
10
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
Cette partition est représentée sous forme λ=(λ1, λ2, ...λk).
Exemple 3. (7, 4, 2, 2, 1) est une partition de 16.
Définition 7 : Une partition stricte d'un entier positif n est une séquence décroissante
k
des entiers positifs distincts λ1, λ2, ...λk tels que ∑ λi = n.
i= 1
Exemple 4. (8, 5, 2, 1) est une partition stricte de 16.
Définition 8 : Une partition impaire d'un entier positif n est une séquence décroissante
k
des entiers positifs impaires λ1, λ2, ...λk tels que ∑ λi = n.
i= 1
Exemple 5. (5, 5, 3, 3) est une partition impaire de 16.
Définition 9 : Une partition paire d'un entier positif n est une séquence décroissante des
k
λi = n.
entiers positifs paires λ1, λ2,...λk tels que ∑
i= 1
Exemple 6. (6, 4, 2, 2, 2) est une partition paire de 16.
1.2 Générer tous les objets
En informatique, on a souvent besoins de connaître tous les objets de l'ensemble. Le
but de ce travail est de vérifier des propriétés, des contraintes sur les objets. Cela permet
d'assurer la précision de l'algorithme dans les cas possibles. Dans le cadre de génération
des objets, nous étudions des méthodes pour trouver des algorithmes permettant réduire
la complexité concernant la mémoire et le temps de fonctionnement.
1.3 Génération aléatoire d'un objet assurant la distribution uniforme
Le problème de génération aléatoire est un problème actuel. Si l'objet a la structure
complexe, la génération aléatoire n'est pas toujours facile. Particulièrement, on
s’intéresse à la génération aléatoire assurant la distribution uniforme. C'est à dire que
chaque objet a une probabilité égale d'être généré. Pour des applications informatiques, si
on a une suite de données d’entrée générée aléatoirement ayant une distribution
uniforme, on pourrait très bien estimer l’exactitude de l’algorithme à travers plusieurs
tests différents. Et cela permet de déterminer la qualité de logiciels. Nous pouvons
comprendre en profondeur des propriétés de la génération aléatoire via les algorithmes
aux chapitres 2 et 3.
1.4 Fonction génératrice[13]
En combinatoire et en informatique, on a souvent besoins de connaître le nombre des
objets d'un ensemble. On pourrait utiliser la règle d’addition, de multiplication et
quelques d’autres méthodes pour trouver la réponse de ce problème. Une des méthodes
efficaces pour compter des objets est la fonction génératrice. L’idée est la suivante :
depuis la formule récursive ou la structure de l'objet, on peut déduire la fonction
génératrice appropriée; après ça, à l’aide de la méthode de développement de Taylor,
cette fonction génératrice sera étendue à une série formelle. Les coefficients de cette
11
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
série correspondent aux nombres d'objets de même ordre.
1.4.1 Série formelle
Définition 10 : Soit N = {0, 1, 2, 3, ...} et soit C l’ensemble des nombres complexes. On
définit CN comme l’ensemble de tous les injections de N à C
CN = {a: N > C}
j > aj
∞
Pour chaque a de C on exprime: a = a(x) = ∑ a j x j et a est appelé une série formelle.
N
j= 0
Une série formelle a(x) où an ≠ 0 et aj = 0 pour tous j >n, est appelée le polynôme de
degré n, et est décrite comme suite:
∞
L’élément 0 x = ∑ 0x j est le symbole 0 de CN et défini être à degré 1.
j=0
1.4.2 Fonction génératrice
Définition 11 : Soit { aj / j=0,1,2,..} une séquence infinie des nombres. La fonction
∞
génératrice a(x) de séquence {aj / j= 0,1,2,..} est la série formelle a(x) = ∑ a j x j .
j= 0
1.4.3 Certains équations souvent utilisés pour étudier les fonctions
génératrices
On a :
.
Pour prouver les équations cidessus, on peut utiliser la méthode inductive et des
transformations algébriques normales. La méthode de fonction génératrice est une
méthode vraiment utile. La plupart d'algorithmes dans le chapitre 3 utilisent cette
méthode.
12
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
1.5 Conclusion
Comme écrit dans l'introduction de ce chapitre, les objets présentés dans ce chapitre
jouent un rôle important en informatique. Tout au long de cet rapport, nous introduisons
des algorithmes existants et construisons nos nouveaux algorithmes concernant ces
objets.
Dans le chapitre 2, nous continuons à étudier des algorithmes de génération aléatoire
existants et l'efficacité de génération aléatoire en basant les codages d'objets.
13
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
Chapitre 2
Codage et Génération aléatoire
L'objectif du deuxième chapitre est d'aider à comprendre et à comparer l'efficacité de
génération aléatoire basant sur les codages d'objets au travers des algorithmes différents.
Dans certains cas, la génération aléatoire directe des objets est difficile si ces objets ont
la structure complexe. Si ces objets sont codés et on fait la génération sur leurs codes, la
génération devient beaucoup plus facile. En fait, on utilise la méthode de bijection. C’est
à dire que pour générer aléatoirement un objet de l'ensemble A, on génère un objet de
l'ensemble B qui possède la bijection avec l’ensemble A. Après avoir généré un objet de
l'ensemble B, on construit un objet de l'ensemble A en basant sur la bijection entre eux.
On le voit plus claire via l’algorithme de génération aléatoire d'un arbre par le Codage de
Prüfer et via la génération aléatoire d'une permutation par la table d’inversion. Ils sont
extraits à partir de documents [5] et [4]. Ces deux algorithmes assurent aussi la
distribution uniforme de la génération aléatoire. Enfin, la section dernière du chapitre
présentera l’algorithme de génération aléatoire une triangulation assurant la distribution
uniforme. C'est un nouveau recherche dans [12] en 2008.
2.1 Génération aléatoire d'un arbre numéroté par le codage de Prüfer[5]
Le codage de Prüfer est une manière très compacte de décrire un arbre. Il se compose
de deux phases : le codage et le décodage. L'idée principale est de générer aléatoirement
une séquence S = (s1, s2,..sn2) où si ∊ {1,..,n} pour tout 1 ≤ i ≤ n2. À partir de cette
séquence, on utilise le décodage de Prüfer pour construire un arbre numéroté T de n
sommets. En réalité, la génération aléatoire d'un arbre numéroté n'est pas vraiment facile.
Pourtant, si on utilise la séquence S, la complexité de génération est diminuée beaucoup
par rapport à la génération directe d'un arbre numéroté.
2.1.1 Codage
a. Algorithme
Entrée : Une arbre T de n sommets numérotés
Sortie : Le code de T : une séquence S = (s1, s2,..sn2) où si ∊ {1,..,n} pour tout 1 ≤ i ≤
n2.
Structure de données en informatique : l'arbre numéroté T est représenté par n listes : a1,
a2, ..., an. Chaque liste ai contient des sommets qui sont adjacent au sommet i dans l'arbre
T.
•
•
•
Étape 1 : Identifier la feuille i de l'arbre courant ayant le numéro minimum,
Étape 2 : Ajouter à la séquence S le sommet s adjacent à i dans l'arbre T courant,
Étape 3 : Enlever de l'arbre T courant le sommet i et l'arête incidente à i,
14
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
•
Étape 4 : S'il reste plus de deux sommets dans l'arbre courant T, on retourne à
l'étape 1. Si non, on arrête et on a une séquence S de (n2) nombres.
b. Complexité
Pour identifier la feuille i de l'arbre courant ayant le numéro minimum, on doit vérifier
les listes de sommets de a1 à an de l'arbre. Si la première liste ai a une élément, le sommet
i est la feuille de l'arbre courant ayant le numéro minimum. En plus, cette feuille est
éliminée dans l'arbre T. Donc, le nombre des listes diminue 1 après chaque fois de
répétition de l'algorithme. Donc, les opérations à fait dans l'étape 1 à la iième fois de
répétition sont égale à (n+1i).
Les opérations à fait dans l'étape 2 et 3 à la iième fois de répétition sont égale à 3 : une
opération pour ajouter à la séquence S le seul sommet s adjacent à i dans l'arbre T
courant et les deux opérations pour enlever de l'arbre T courant le sommet i et l'arête
incidente à i.
L'algorithme répète tant qu'il reste plus de deux sommets dans l'arbre courant T. Donc,
l'algorithme répétera (n2) fois.
La complexité de l'algorithme est :
n−2
∑ n+1−i 3 = ((n+4)1) + ((n+4)2) +...+ ((n+4)(n2)) = (n2).(n+9)/2.
i=1
2.1.2. Décodage
a. Algorithme
Entrée : une séquence S = (s1, s2,..sn2) où si ∊ {1,..,n} pour tout 1 ≤ i ≤ n2.
Sortie : Un arbre numéroté T de n sommets.
•
•
•
•
•
Étape 0 : Soit I = (1,..,n),
Étape 1 : Identifier le plus petit élément i de I n'apparaissant pas dans la séquence
S,
Étape 2 : Ajouter à l'arbre T une arête (i,s) où s est le sommet correspondant au
premier élément de la séquence S,
Étape 3 : Enlever i de I et s de S,
Étape 4 : S'il reste des éléments dans S et plus de deux éléments dans I, on
retourne à l'étape 1. Si non, on arrête et on a un arbre T de n sommets.
Les deux éléments qui restent dans I à la fin de l'algorithme constituent les extrémités de
la dernière arête à ajouter à T.
b. Complexité
Pour identifier le plus petit élément i de I n'apparaissant pas dans la séquence S, on
doit vérifier tous les éléments de I et tous les éléments de S. En plus, le nombre de
sommets de I et de S diminue 1 après chaque fois de répétition de l'algorithme. Alors, à
la iième fois de répétition de l'algorithme, le nombre des éléments de I est (n+1i) et le
15
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
nombre des éléments de S est ((n2 +1)i ). À la première répétition de l'algorithme, la
séquence I a les n éléments et la séquence S a les (n2) éléments. Donc, les opérations à
fait dans l'étape 1 à la iième fois de répétition sont égale à (n+1i)((n2 +1)i) = (n+1i)
(n1i)=(ni)2 1.
Les opérations à fait dans l'étape 2 et 3 à la iième fois de répétition sont égale à 3 : une
opération pour relier par une arête de T le sommet i avec le sommet s correspondant au
premier élément de la suite S et les deux opérations pour enlever i de I et s de S.
L'algorithme répète tant qu'il reste plus de deux éléments dans I. Donc, l'algorithme
répétera (n2) fois.
La complexité de l'algorithme est Σ((ni )2 + 2 )= O(n2).
i=1..(n2)
Pour plus claire sur le fonctionnement de ces deux algorithmes, veuillez voir un
exemple suivant.
2.1.3 Exemple 7 [5]
On a l’arbre suivant:
Appliquer les deux algorithmes sur cet arbre pour montrer leur fonctionnement du
codage de Prüfer.
16
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
a. Fonctionnement de l’algorithme de codage
Étape 0
Étape 1
Étape 2
Étape 3
Étape 4
Arbre à coder
S = {4}
S = {4, 10}
S = {4, 10, 3}
S = {4, 10, 3, 8}
Étape 5
Étape 6
Étape 7
Étape 8
S = {4,10,3,8,4}
S={4,10,3,8,4,4}
S={4,10,3,8,4,4,5
}
S={4,10,3,8,4,4,5,
10} est le codage
de Prüfer de
l'arbre initial.
S=
{4,10,3,8,4,4,5,10}
Table 1 Exemple de codage
b. Reconstruire l’arbre initial en utilisant l’algorithme de décodage
Étape 0
Étape 1
I={1,2,3,4,5,6,7,8 I={2,3,4,5,6,7,8,9,
10}
,9,10}
S={4,10,3,8,4,4,5 S={10,3,8,4,4,5,1
0}
,10}
Étape 2
Étape 3
I={3,4,5,6,7,8,9,10
}
S={3,8,4,4,5,10}
I={3,4,5,7,8,9,10}
S={8,4,4,5,10}
17
Étape 4
I={4,5,7,8,9,10}
S={4,4,5,10}
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
Étape 5
I={4,5,8,9,10}
S={4,5,10}
Étape 6
Étape 7
I={4,5,9,10}
S={5,10}
Étape 8
I={5,9,10}
S={10}
Étape 9
I={9,10}
S={}
I = {}
S = {}
Table 2 Exemple de décodage
2.1.4 Génération aléatoire d'un arbre numéroté par le codage de Prüfer
Tout d'abord, on génère aléatoirement une séquence S=(s 1, s2,..sn2) où si ∊ {1,..,n} pour
tout 1 ≤ i ≤ n2. La complexité pour générer une séquence S est égale à (n2). L'arbre T
de n sommets est construit à partir de cette séquence S par le décodage de Prufer. La
complexité du décodage est égale à O(n2). Donc, la complexité pour générer
aléatoirement un arbre T est égale à (n2) + O(n2).
Théorème 1 La génération aléatoire d'un arbre par le codage de Prüfer assure la
distribution uniforme. Cette distribution uniforme est égale à 1/nn2.
Preuve :
Une séquence S se compose de (n2) nombres. Chaque nombre a la valeur de 1 à n. On
peut générer les nn2 séquence S. Alors, la probabilité de génération d'une séquence S est
égale à 1/nn2. Il y a la bijection entre une séquence S de (n 2) nombres et un arbre
numéroté T de n sommets. Donc, la probabilité de génération d'un arbre T de n sommet
est égale à
1/nn2.
2.2 Génération aléatoire d'une permutation par la table d'inversion[3]
Il existe déjà des algorithmes différents pour générer aléatoirement une permutation.
Pourtant, la plupart de ces algorithmes n'assurent pas la distribution uniforme ou ont la
grande complexité. Dans cette section, nous introduisons une méthode qui assure la
distribution uniforme et la petite complexité.
2.2.1 Table d’inversion
Définition 12 : Soit a = a1 a2...an. une permutation d'entiers de 1 à n. Une table b =
b1b2...bn est appelée la table d'inversion de a si b i est le nombre d'entiers qui se situent à
gauche de i dans a et sont supérieurs à i, pour tout 1 ≤ i ≤ n.
Exemple 8. On a une permutation de cinq nombres de 1 à 5 : a = 5 3 1 2 4. La table
d'inversion b de cette permutation est b = 2 2 1 1 0.
18
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
C'est clair que chaque permutation fournit l'unique table d'inversion et vice versa.
Autrement dit, il y a la bijection entre une permutation et une table d'inversion
appropriée. Alors, pour avoir une permutation d'entiers de 1 à n, on génère aléatoirement
une table d’inversion. Puis, on calcule depuis cette table d’inversion pour obtenir une
permutation via la bijection entre les permutations et les tables d’inversion.
2.2.2 Algorithme
Entrée : L'entier n.
Sortie : Une permutation a d' entiers de 1 à n.
•
•
Étape 1 : Générer un table b = b1,b2,..,bn tel que 1≤ bi ≤ n – i pour tout 1≤i ≤ n.
Étape 2 : Pour chaque bi généré aléatoirement, on ajoute i à la (bi +1)ème position
vide dans la permutation a.
int[] permutation()
{ randomize ;
for (int i:=1; i≤ n ; i++) a[i]:=0;
for(int j:=1; j≤ n; j++)
{
// générer aléatoirement bi
x:= random(n-j+1);
i:= 1; d:=0;
while (i<=n) && (d<=x+1)
{ if a[i]=0 d:=d+1;
i:=i+1;
}
//ajouter i à la (bi +1)-èmeposition vide dans la permutation a.
a[d]:=j;
}
return a;
}
2.2.3 Distribution uniforme
Théorème 2 La génération aléatoire de permutation par la table d'inversion assure la
distribution uniforme et cette distribution est égale à 1/n!.
Preuve :
Observer l'exemple 8, on voit que: b1 ∈ {0, 1, 2, 3, 4 }, b2 ∈ {0, 1, 2, 3 }, b3 ∈ {0, 1,
2}, b4 ∈ {0, 1, }, b5 ∈ {0}.
De manière générale, on a : b1 ∈ {0, 1,..., n1 }, b2 {0, 1,…, n2},.., bn1∈ {0, 1}, bn ∈
{0}.
Il y a tous les n.(n1).(n2)...1 = n ! tables b. Alors, la probabilité de génération aléatoire
d'un table b est 1/n!. Autre part, il y a la bijection entre une permutation a et une table
d'inversion b. Pour chaque table b, on a une permutation a. Donc, la probabilité de
génération aléatoire d'une permutation est 1/n!.
◻
19
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
2.2.4 Complexité
−
−
Le nombre des opérations pour générer une table b est n.
Pour chaque bi , le programme peut parcourir tous les n positions dans la permutation
a pour ajouter i à la bi +1ème position vide. En plus, la table b a les n entiers. Alors, ça
fait les n.n opérations pour insérer tous les entiers de la permutation a.
Donc, la complexité du programme est n + n.n = n(n +1) = O(n2).
2.3 Génération aléatoire d'une triangulation
Dans cette section, nous introduisons un algorithme de génération aléatoire de
triangulation. Il est créé par N.H.Nguyen en 2008[8]. Il génère un polygone convexe
triangulé et assure la distribution uniforme. L’idée de cet algorithme est identique avec
l’expression de Rémy[8] pour générer aléatoirement un arbre binaire complet de n
sommets à partir d'un arbre binaire complet de (ni) sommets.
2.3.1 Algorithme pour construire une triangulation de (n+1) sommets G’ à
partir d’une triangulation de n sommets G
Entrée : Une triangulation du polygone convexe de n sommets G.
Sortie : Une triangulation du polygone convexe de (n+1) sommets G'.
•
•
•
•
•
Étape 1 : Choisir aléatoirement une arête (i,j) de G.
Étape 2 : Choisir aléatoirement un des deux sommets de cette arête : suppose que i
est choisi.
Étape 3: Ajouter un nouveau sommet v au G. Ce sommet se situe derrière i (selon
la direction inverse de la montre).
Étape 4 : Ajouter deux nouvelles arêtes (i,v) et (j,v) au G.
Étape 5: Dans G, avec les sommets k = i+1,.. ,j, on remplace les arêtes (k,i) par les
arêtes (k,v). Alors, on obtient une nouvelle triangulation du polygone convexe G'
de
(n +1) sommets.
Exemple 9. On construit une triangulation du polygone convexe de 5 sommets à partir
d’une triangulation du polygone convexe de 4 sommets. Tout d'abord, on choisit
aléatoirement une arête (2,4) et un sommet 4 de cette arête. On fait la triangulation
comme suite : on ajoute un nouveau sommet 4' qui se situe derrière le sommet 4 selon la
direction inverse de la montre. Puis, on ajoute deux nouvelles arêtes (2,4') et (4,4') au G.
L'arête (1,4) est replacée par l'arête (1,4). Enfin, on donne de nouvelles étiquettes aux
sommets et on a une triangulation du polygone de 5 sommets.
20
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
2.3.2 Complexité
Figure 2 – Algorithme de triangulation
À partir d’une triangulation d’ordre 1. L’algorithme doit répéter (n –1) fois pour obtenir
une triangulation d’ordre n. Chaque fois de répétition, le nombre maximal des arêtes
changées est (2n3). Donc, la complexité est (n1)(2n3) ≈ O(n2).
2.3.3 Distribution uniforme
Théorème 3 La distribution uniforme de cet algorithme est 1/(n+1).
Preuve :
Avec n = 1, 2 ou 3, on peut vérifier facilement cette affirmation. Suppose que cet
algorithme soit vrai avec les triangulations de polygones convexes de n sommets. On a
prouvé que le nombre des triangulations du polygone convexe de n sommets est égale au
2n !
(n2)ième nombre de Catalan [12] Cn2 où Cn =
.
n+1 !n!
Selon l’algorithme cidessus, pour avoir une triangulation du polygone de n+1
sommets, on fait comme suite :
1. Choisir aléatoirement une des Cn2 triangulations.
2. Choisir aléatoirement une des (2n3) arêtes de la triangulation choisie.
3. Choisir aléatoirement un des deux 2 sommets de cette arête.
Si on appliquer cet algorithme sur tous les triangulations du polygone de n sommets, on
peut générer les 2(2n3)Cn2 triangulations de polygone de n+1 sommets dans lesquels
chaque triangulation distincte du polygone de (n+1) sommets a répété n fois. On a
n
1
1
=
=
C n−1
n+1 .
2 2n−3 C n−2
Alors, la distribution uniforme de chaque triangulation est égale à 1/(n+1). □
Pour plus claire sur la propriété de la distribution uniforme, veuillez voir un exemple
dans le programme de cet algorithme que nous écrivons dans le chapitre 4.
Exemple 10. Il y a les deux triangulations de polygone de 4 sommets. Nous appliquons
cet algorithme sur ces triangulations et nous avons les 20 triangulations de polygone de 5
sommets. En fait, Il y a seulement les 5 triangulations distinctes car chaque triangulation
distincte a répété 4 fois. La probabilité pour générer aléatoirement une triangulation
distincte est 4/20 = 1/5.
21
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
Les deux triangulations du polygone convexe de 4 sommets
Les 20 triangulations du polygone convexe de 5 sommets ( Il y a 5 triangulations
distinctes) obtenues après avoir appliqué l'algorithme sur les 2 triangulations ci dessus.
arête choisie : (1,2)
sommet choisi : 1
(1,2) 2
(1,2) 1
(1,2) 2
(2,3) 2
(2,3) 3
(2,3) 2
(2,3) 3
(3,4) 3
(3,4) 4
(3,4) 3
(3,4) 4
22
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
(1,4) 4
(1,4) 1
(1,4) 4
(1,4) 1
(2,4) 2
(2,4) 4
(1,3) 1
(1,3) 3
Table 3 – Distribution uniforme de triangulation
23
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
2.4 Conclusion
Après avoir analysé les complexités et les distributions uniformes des algorithmes dans
ce chapitre, nous voyons que la génération aléatoire basant sur le code d'objets est facile à
réaliser. En plus, la complexité concernant la mémoire et le temps de fonctionnement est
petit. Les programmes de ces algorithmes sont réalisés dans le chapitre 4 pour vérifier
ces propriétés au travers des paramètres différents.
Nous venons d'étudier des objets comme les arbres, les permutation et les
triangulations. Dans le chapitre suivant, nous continuons à introduire des contenus le
plus importants du rapport – les partitions d'entier.
24
Génération aléatoire des classes des partitions d'entier positif et d'autres objets combinatoires
Chapitre 3
Partitions d'entier
La théorie de partitions a une histoire longue. Certains problèmes particulières de
partitions ont été étudiés depuis le MoyenÂge. Pourtant, des premières inventions en
profondeur ont été découvertes dans le dixhuitième siècle quand L. Euler a prouvé des
théorèmes très belles et signifiantes. Euler a vraiment créé la fondation de la théorème de
partitions. Il y a encore d'autres grands mathématiciens – Cayley, Gauss, Hardy, Jacobi,
Lagrange, Legendre, Littlewood, Rademacher, Schur, Sylvester, etc qui ont contribué
beaucoup au développement de la théorie de partitions.
Le chapitre 3 est le centre de ce rapport. La plupart de nos contributions se situent dans
ce chapitre. Premièrement, nous rappelons la définition des types de partitions, des
bijections et des fonctions génératrices pour compter des partitions. Puis, c'est
l'introduction de deux algorithmes ZS1 et ZS2 pour générer tous les partitions dans la
section 3.4. Ces deux algorithmes ayant le petits temps de fonctionnement sont le
résultat de recherche de A. Zoghbi et I. Stojmenovic [17] en 1998. Particulièrement, selon
des conseils sur la direction de recherche de Mme Phan, nous avons trouvé aussi 3
nouveaux algorithmes. Ils seront introduits dans les sections 3.6, 3.7 et 3.8. Ils
permettent de générer aléatoirement une partition impaire, une partition paire ou une
partition stricte. Tous ces algorithmes assurent la distribution uniforme et sont basés sur
la méthode d'Euler[5][6] pour générer aléatoirement une partition qui se situe dans la
section 3.5. La complexité et la distribution uniforme de tous les algorithmes dans ce
chapitre sont analysées. Des programmes de ces algorithmes sont réalisés aussi au
chapitre 4.
3.1. Définitions [7]
Nous rappelons ici des définitions de partitions.
Partition : Une partition d'un entier positif n est une séquence décroissante des entiers
k
positifs λ1, λ2, ...λk tels que ∑ λi = n où λi est appelé un part de la partition.
i= 1
Partition stricte : Une partition stricte d'un entier positif n est une séquence
k
décroissante des entiers positifs distincts λ1, λ2, ...λk tels que ∑ λi = n.
i =1
Partition impaire : Une partition impaire d'un entier positif n est une séquence
k
décroissante des entiers positifs impaires λ1, λ2, ...λk tels que ∑ λi = n.
i= 1
Partition paire : Une partition paire d'un entier positif n est une séquence décroissante
25