Vous êtes sur la page 1sur 41

Algorithmique Arithmétique

Structures de données, Complexité algorithmique, et Algorithmes pour la


cryptographie

Année universitaire 2020-2021.

3ème année Licence : Algèbre et Cryptographie.


Département d’Algèbre et Théorie des Nombres,
Faculté de Mathématiques,
Université des Sciences et de la Technologie Houari Boumediène.

Contenu :
séance n◦ - (-).

1
Contact : Nedjmeddine Kantour, nadjmeddine.kantour@usthb.edu.com
Contenu de ce cours

• Rappels : Algorithme, Algorithmique, Programmes

• Algorithmes et complexité

• Algorithmes de Tri

• Arbres binaires

• Algorithmes récursifs et Programmation dynamique

• Machines de Turing

• Calculabilité et indécidabilité
2
Rappels : Algorithme,
Algorithmique, Programmes
Qu’est-ce qu’un algorithme ?

• Le terme algorithme provient du nom d’un mathématicien du IXe siècle, Al Kwarizmi


(Abou Jafar Muhammad Ibn Musa al-Khuwarizmi).

Al-Kharezsmi. Né à Bagdad, vers 780 après Jésus-Christ. Il est l’auteur du traité
Kitab al’jabr w’al-muqabala ce qui signifie règles de restaurations et réductions, un titre
qui permet d’identifier l’un des inventeurs de l’algèbre. Par ailleurs, il semble que le mot
algorithme soit une déformation de al Kharezsmi.
3
Qu’est-ce qu’un algorithme ?

• Le terme algorithme provient du nom d’un mathématicien du IXe siècle, Al Kwarizmi


(Abou Jafar Muhammad Ibn Musa al-Khuwarizmi).

• Son nom a d’abord donné algorisme, très courant au moyen-âge.


• On raconte que la mathématicienne Lady Ada Lovelace forgea la première le mot
algorithme à partir d’algorisme.
4
Qu’est-ce qu’un algorithme ?

En mathématiques et en informatique, un algorithme est une séquence finie


d’instructions élémentaires bien définies permettant d’accomplir une certaine tâche qui,
en considérant un état initial, se termine par un état final reconnaissable correspondant
à son initialisation.

T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein 2 , ont défini un algorithme


comme suit :
Algorithme : Procédure de calcul bien défnie qui prend en entrée une valeur, ou un
ensemble de valeurs, et qui donne en sortie une valeur, ou un ensemble de valeurs.
Un algorithme est donc une séquence d’étapes de calcul qui transforment l’entrée en
sortie.

5
Qu’est-ce qu’un algorithme ?

• Un algorithme est une procédure permettant de résoudre un problème.


• Une procédure = une suite d’opérations (actions, tâches élémentaires).
• Un algorithme reçoit en entrée des données (les entrées) et retourne un ou plusieurs
résultats (les sorties).

Exemples : Calculer les solutions d’un système d’équations. Trier un ensemble de réels.
Rechercher un élément dans un liste.

6
Distinction entre Algorithme et Programme

Dans ce cours, les algorithmes sont écrits en pseudo-code ou en langage Algorithmique. Bien
que les deux notions aient des points communs, il ne faut toutefois pas confondre algorithme
et programme.
1. Un programme n’est pas forcément un algorithme. Un programme ne termine pas
forcément de lui-même (c’est souvent la personne qui l’utilise qui y met fin). Un
programme n’a pas forcément vocation à retourner un résultat. Enfin un programme est
bien souvent un assemblage complexe qui peut employer de nombreux algorithmes
résolvants des problèmes très variés.
2. La nature des algorithmes est plus mathématique que celle des pro-grammes et la
vocation d’un algorithme n’est pas forcément d’être exécutée sur un ordinateur. Les
humains utilisaient des algorithmes bien avant l’ère de l’informatique et la réalisation de
calculateurs mécaniques et électroniques. En fait, les algorithmes ont été au cœur du
développement des mathématiques. Pour autant, ce cours porte sur les algorithmes
pour l’arithmétique (appliquée à la cryptographie).
7
Exemples d’algorithme avant l’ère informatique

L’algorithme d’Euclide : En mathématiques le plus connu des algorithmes est certaine-


ment l’algorithme d’Euclide (300 av. JC) pour calculer le pgcd de deux nombres entiers.

 Étant donnés deux entiers naturels a et b, on commence par tester si b est nul. Si oui,
alors le P.G.C.D. est égal à a. Sinon, on calcule r, le reste de la division de a par b. On
remplace a par b,et b par r, et on recommence le procédé. Le dernier reste non nul est le
P.G.C.D. 

Crible d’Ératosthène : Un autre algorithme très connu est le crible d’Ératosthène (IIIe
siècle av.JC) qui permet de trouver la liste des nombres premiers plus petits qu’un entier
donné quelconque.

Pivot de Gauss : Il y a aussi le pivot de Gauss (ou de Gauss-Jordan) qui est en fait une
méthode bien antérieure à Gauss (Analyse numérique).

8
Algorithmes étudiés

La plupart des algorithmes que nous étudierons datent d’après 1945. Date à laquelle John
Von Neumann introduisit ce qui est sans doute le premier programme de tri (un tri fusion).

9
Algorithmique

• L’algorithmique est l’étude mathématique des algorithmes.


• Il s’agit notamment d’étudier les problèmes que l’ont peut résoudre par des algorithmes
et de trouver les plus appropriés à la résolution de ces problèmes. Il s’agit donc aussi de
comparer les algorithmes, et de démontrer leurs propriétés.

10
Passage du problème à l’algorithme, puis au programme

• Un même problème peut être résolu par plusieurs algorithmes.


• Illustration : dans la suite du cours nous présenterons plusieurs algorithmes de tri.
• En général un algorithme est destiné à être traduit en programme.
• Vocabulaire : on dit dans ce cas qu’on implémente l’algorithme (il s’agit d’un
anglicisme).
• Lorsqu’on écrit un algorithme, on le fait de manière indépendante des (nombreux)
langages de programmation dans lesquels il peut être traduit.
• Nous avons donc besoin d’une syntaxe pour décrire nos algorithmes : on parle souvent
de pseudo-code. Cette syntaxe sera présentée dans la suite de ce chapitre.

11
Passage du problème à l’algorithme, puis au programme

• Efficacité : Un algorithme efficace est un algorithme rapide et peu gourmand en


ressources.
• Autrement dit, l’efficacité d’un algorithme se mesure à l’aide de deux critères :
• Le premier est relatif au nombre d’opérations qu’il comporte, c’est-à-dire au temps
d’exécution de ses implémentations. Nous l’appellerons la complexité temporelle.
• Le deuxième est relatif à la ’quantité de données’ qu’il utilise c’est-à-dire à la quantité de
mémoire exigée par ses implémentations. Nous l’appellerons la complexité spatiale.
Dans la suite de ce cours nous présenterons une introduction à l’étude de la complexité
(temporelle).

12
Comment analyser un algorithme ?

• L’algorithme s’arrête-t-il ?
• Est-il correct ?
Autrement dit, la sortie de l’algorithme satisfait-elle toujours la spécification
entrée-sortie que nous souhaitons ?
• Est-il efficace ?
L’efficacité peut être mesurée de plusieurs façons. Par exemple, quel est le temps
d’exécution de l’algorithme ? Quelle est sa consommation de mémoire ?

13
Exemple

Résoudre une équation de premier degré

Entrées: a, b ∈ R.
Sortie : x0 ∈ R, tel que ax0 + b = 0.

début
1. Calculer −b;
2. Diviser le résultat par a;
fin

14
Exemple

Résoudre une équation de premier degré

Entrées: a, b ∈ R.
Sortie : x0 ∈ R, tel que ax0 + b = 0.

début
1. Calculer −b;
2. Diviser le résultat par a;
fin

Entrées: a, b ∈ R.
Sortie : x0 ∈ R, tel que ax0 + b = 0.

début
1. x0 := −b/a
fin

14
Calcul de P GCD(a, b)

Rappel : Le terme PGCD désigne le Plus Grand Commun Diviseur de deux nombres entiers
positifs.

15
Calcul de P GCD(a, b)

Entrées: a, b ∈ N∗ , et a > b.
Sortie : P GCD(a, b).
début
tant que b > 0 faire
r ← (a mod b);
a ← b;
b ← r;
fin
Retourner a;
fin

16
Calcul de P GCD(a, b)

Entrées: a, b ∈ N∗ , et a > b.
Sortie : P GCD(a, b).
début
tant que a 6= b faire
si a > b alors
a ← a − b;
sinon
a ← b − a;
fin
fin
Retourner a;
fin

17
Calcul de Puissance

Soit (G, ∗) un groupe commutatif dont on note la loi multiplicativement. On veut calculer
an .
Puissance naı̈ve

Entrées: a ∈ G et n ∈ N∗ .
Sortie : an ∈ G.

début
p ← 1;
tant que n > 1 faire
p ← p ∗ a;
n ← n − 1;
fin
Retourner p;
fin

18
Calcul de Puissance : Puissance rapide

Entrées: a ∈ G et n ∈ N∗ .
Sortie : an ∈ G.

début
u ← 1;
v ← a;
tant que n > 1 faire
si n ≡ 0[2] alors
v ← v ∗ v;
n ← n/2;
sinon
u ← u ∗ v;
v ← v ∗ v;
n ← n/2;
fin
fin
Retourner u ∗ v;
fin

19
Crible d’Ératosthène

Entrées: n ∈ N∗ .
Sortie : list : Liste des nombres premier inférieurs à n.

début
list ← [2, 3, . . . , n];
i ← 1;
tant que i < |list| faire
p ← list[i];
m ← 2 ∗ p;
tant que m ≤ n faire
si m ∈ l alors
list ← list\{m};
m ← m + p;
fin
fin
fin
Retourner list;
fin

20
Test de Fermat

Theorem (Petit théorème de Fermat)


Si p est un nombre premier, alors pour tout a premier avec p, on a :

ap−1 ≡ 1[p].

Test de Fermat
On veut déterminer la liste des entiers inférieur à n, n ≥ 5, qui passent le test de
Fermat pour 2 et 3.

21
Test de Fermat

Test de Fermat

Entrées: n ∈ N∗ .
Sortie : list : La liste des entiers inférieur à n, n ≥ 5, qui passent le test de Fermat pour 2 et 3.

début
list ← [2, 3];
pour k ∈ {5, . . . , n} faire
si 2k−1 ≡ 1[k] et 3k−1 ≡ 1[k] alors
list ← list ∪ {k};
fin
fin
Retourner list;
fin

22
L’orthogonalisation de Gram-Schmidt

L’orthogonalisation de Gram-Schmidt est une procédure qui prend une famille de n vecteurs
linéairement indépendants, et crée un ensemble de n vecteurs orthogonaux. Cela fonctionne en
projetant chaque vecteur sur l’espace orthogonal à l’espace engendré par un sous-ensemble de ces
vecteurs.
Theorem
Soit V un sous-espace vectoriel de dimension n et B = (b1 , b2 , . . . , bn ) une base de V . On considère
la famille de vecteurs (b̃1 , b̃2 , . . . , b̃n ) définie par :
• b̃1 = b1 ,
• b̃i est le projeté de bi orthogonalement au sous-espace vectoriel engendré par les i − 1 premiers
vecteurs de B. En d’autre termes : 
b̃j ·bi
 ||b̃ || si i > j,


 j
X
b̃i = bi − µi,j b̃j , avec µi,j = 1 si j = i,
j≤i−1



 0 sinon.

Alors (b̃1 , b̃2 , . . . , b̃n ) est une base orthogonale de l’espace V , i.e., ∀ i, j ≤ n, i 6= j, b̃i · b̃j = 0.
23
Algorithme de Gram-Shmidt

Ainsi, l’algorithme de Gram-Schmidt transforme une base B = (b1 , b2 , . . . , bn ) d’un sous-espace de


Rn , en une autre base B̃ = (b̃1 , b̃2 , . . . , b̃n ) du même espace vectoriel vérifiant les conditions citées.

Algorithme de Gram-Shmidt

Entrées : une base B = [b1 , b2 , . . . , bn ].


Sortie : une base B ∗ = [b̃1 , b̃2 , . . . , b̃n ] et la matrice M = (µi,j )i,j≤n .

pour i = 1 à n faire
b̃[i] ← b[i];
pour j = 1 à i − 1 faire
b̃[j] · b[i]
µ[i, j] ← ;
norme(b̃[j])
b̃[i] ← b̃[i] − µ[i, j]b̃[j];
fin
fin
Retourner B̃, M ;

norme(u) est la norme (i.e., ||u||) du vecteur u. Proposez un algorithme pour le calcul de la norme
24
euclidienne d’un vecteur de dimension quelconque.
Test de primalité

Considérons le problème suivant :

”étant donné un entier positif N, décider s’il est premier ou non.”

Un nombre N (autre que 1) est premier s’il est divisible par 1 et N lui-même seulement.
Un algorithme de test de primalité se contentera alors à chercher un diviseur d de N ,
différent de 1 et N .
Si un tel diviseur (candidat) existe, N est non premier. Sinon, N est premier. Nous
proposons trois algorithmes pour résoudre le problème de test de primalité :

• Le premier algorithme va chercher un candidat depuis 2 jusqu’à N − 1.


N
• Le second algorithme cherchera un candidat depuis 2 à 2.

• Le troisième algorithme va chercher un candidat p entre 2 et N.

Que remarquez vous ? Quel est L’intérêt de ces variantes ?


25
Test de primalité : Algorithme 1

Test de primalité

Entrées: d ∈ N, d > 1.
Sortie : V ∈ {0, 1}, variable logique.

début
V ← 0;
pour d = 2 à N − 1 faire
si N divisible par d alors
V ← 1;
Retourner V ;
fin
fin
Retourner V ;
fin

26
Test de primalité : Algorithme 2

Test de primalité

Entrées: d ∈ N, d > 1.
Sortie : V ∈ {0, 1}, variable logique.

début
V ← 0;
pour d = 2 à N/2 faire
si N divisible par d alors
V ← 1;
Retourner V ;
fin
fin
Retourner V ;
fin

27
Test de primalité : Algorithme 3

Test de primalité

Entrées: d ∈ N, d > 1.
Sortie : V ∈ {0, 1}, variable logique.

début
V ← 0;

pour d = 2 à [ N ] faire
si N divisible par d alors
V ← 1;
Retourner V ;
fin
fin
Retourner V ;
fin

28
Bits réguliers

• Soit S une source d’information qui émet un message M = {m1 , m2 , . . . , mk }, avec


mi ∈ {0, 1}n , ∀i ∈ {1, . . . , k}, n > 1.
• Les ensembles M0 et M1 dites ensembles d’indices des variables régulières. Les
ensembles d’indices des informations régulières sont donnés par :
n o
M0 = j ∈ {1, . . . , n} | ∀i ∈ {1, . . . , k}, ∀mi ∈ M, mji = 0 ,
n o
M1 = j ∈ {1, . . . , n} | ∀i ∈ {1, . . . , k}, ∀mi ∈ M, mji = 1 .

• On veut écrire un algorithme qui génère les ensembles M0 et M1 pour un message M


quelconque (i.e., k et n quelconques).
Pk
Indication. L’idée est de vérifier si i=1 mji ∈ {0, 1}, ∀j ∈ {1, . . . , k}.
• Puis, écrire un algorithme qui génère les ensembles Mi , ∀i ∈ {1, . . . t}, avec t en entrée,
pour un message M quelconque (i.e., k et n quelconques).

29
Bits réguliers

Entrées: un message en binaire M = {m1 , m2 , . . . , mk }, avec mi ∈ {0, 1}n , ∀i ∈ {1, . . . , k}, n > 1.
Sortie : Les ensembles d’indices des bits réguliers M0 et M1 .

début
M0 ← ∅; M1 ← ∅;
V ← {0}n ;
pour i = 1 à k faire
pour j = 1 à k faire
V [i] ← V [i] + m[j][i]; % m[j][i] ≡ mji
fin
si V [i] = 0 alors
M0 ← M0 ∪ i;
sinon
si V [i] = k alors
M1 ← M1 ∪ i;
fin
fin
fin
Retourner M0 , M1 ;
fin

30
Générateurs de nombres pseudo-aléatoires

Un générateur de nombres pseudo-aléatoire, pseudorandom number generator (PRNG) en anglais,


est un algorithme qui génère une séquence de nombres présentant certaines propriétés du hasard.

Générateur à Congruences Linéaires (GCL)

Ces générateurs produisent la suite de nombres (Xn )n≥0 Définis par la relation de récurrence
suivante : pour tout n > 1

Xn+1 = (aXn + b) mod m


où m est un entier positif (le module), a, c et X0 sont des entiers compris entre 0 et m
respectivement appelés multiplicateur, incrément et graine.

On remarque que la suite (Xn ) ainsi définie est périodique à partir d’un certain rang.

Exemples. Générateur IBM Xn+1 = (75 Xn ) mod 231 − 1 de période 220 , générateur Maple
Xn+1 = (427419669081 Xn ) mod 999999999989 de période 229 .

31
Générateurs de nombres pseudo-aléatoires

Générateur à Congruences Linéaires (GCL)

Entrées: X0 , a, b, m ∈ N avec 0 < a, b, X0 < m et n le nombre d’entiers à générer.


Sortie : X vecteur de nombres pseudo-aléatoires de taille n.

début
X[0] ← X0 ;
pour i = 1 à n faire
X[i] ← aX[i − 1] + b;
X[i] ← X[i] mod m;
fin
Retourner X;
fin

32
Générateurs de nombres pseudo-aléatoires

Le GCL précédent permet de générer des entiers entre 0 et m − 1. Afin de se ramener à des
réels compris entre 0 et 1, on étudie la suite Un = Xmn

Générateur à Congruences Linéaires (GCL)

Entrées: X0 , a, b, m ∈ N avec 0 < a, b, X0 < m et n le nombre d’entiers à générer.


Sortie : X vecteur de nombres pseudo-aléatoires de taille n.

début
X[0] ← X0 ;
pour i = 1 à n faire
X[i] ← aX[i − 1] + b;
X[i] ← aX[i] mod m;
fin
Retourner X/m;
fin

33
Analyse des fréquences (chiffre de César)

• La méthode la plus élémentaire pour chiffrer un message est de remplacer chaque lettre par
une autre selon une règle fixe.
• Le chiffre de César consiste simplement à décaler les lettres de l’alphabet de quelques crans
vers la droite ou la gauche.
• On reconnaı̂t la une congruence modulo 31 : On commence par remplacer a par 1, b par 2, . . . ,
z par 26, ’espace’ par 27, ‘,’ par 28, ‘.’ par 29, ‘?’ par 30 et ‘:’ par 0.
Cette convention permet d’effectuer des calculs sur le texte.
Par exemple, décalons les lettres de 3 rangs vers la gauche, comme le faisait Jules César (d’où
le nom de ce chiffre). Le système César consiste simplement à effectuer une addition de 3
modulo 31. De manière générale :

y ≡ (x + d)[31].
avec d = 3, ou même,

Chiffrement : E(x) ≡ (x + d)[31],


Déchiffrement : D(x) ≡ (x − d)[31].
34
Analyse des fréquences

Par sa simplicité et par sa force, ce système a dominé la technique des écritures secrètes pendant
tout le premier millénaire. Il a résisté aux cryptanalystes jusqu’à ce que le savant arabe Abu Yusuf
Ya’qub ibn Is’haq ibn as-Sabbah Omran ibn Ismaı̈l al-Kindi mette au point, au IXème siècle, une
technique appelée Analyse des fréquences.

”Al-Kindi rédige sa méthode dans son plus important traité intitulé Manuscrit sur le déchiffrement
des messages cryptographiques. C’est le premier manuscrit connu faisant mention des fréquences
d’apparition des lettres. Il explique que  la façon d’élucider un message crypté, si nous savons dans
quelle langue il est écrit, est de nous procurer un autre texte en clair dans la même langue, de la
longueur d’un feuillet environ, et de compter alors les apparitions de chaque lettre. Ensuite, nous
nous reportons au texte chiffré que nous voulons éclaircir et relevons de même ses symboles. Nous
remplaçons le symbole le plus fréquent par la lettre la plus fréquente du texte clair, le suivant par la
deuxième, le suivant par la troisième, et ainsi de suite jusqu’à ce que nous soyons venus à bout de
tous les symboles du cryptogramme à résoudre”.

35
Analyse des fréquences

• Cette technique ne fonctionne bien que si le


cryptogramme est suffisamment long pour avoir des
moyennes significatives.
• Les tableaux qui vont suivrent ont été construits en
comptant les fréquences dans un texte français de
100000 lettres composé de textes de Gustave Flaubert
(20600 lettres), de Jules Verne (19438) et de trois
articles de l’Encyclopedia Universalis, le premier
consacré à Bruges (8182), le deuxième à l’artillerie
(25078) et le dernier à la population (26702).

36
Analyse des fréquences

37
Analyse des fréquences

• On peut remarquer que la lettre ’E’ est la


plus fréquente, suivi par les lettres ’A’ et
’S’.
• Ainsi, en appliquant l’analyse des
fréquences sur un texte chiffré par le
chiffre de César, on peut éventuellement
(très probablement, dans le cas ou le
texte est assez long) un couple de lettres
(0 E 0 , y) (resp. (5, y)) avec E(0 E 0 ) = y
(resp. E(5) = y). Donc, le décalage (clé
de chiffrement) sera facilement déduite.

38
DM 1 (2 semaines)
Devoir maison :
Répondez à une question de votre choix :
• Analyse des fréquences : Écrire un algorithme qui effectue une analyse des
fréquence sur un message chiffré par le chiffre de César (en sortie : la clé de
chiffrement, et le texte en déchiffré ou en clair).
• Informations régulières : Écrire un algorithme qui génère les ensembles de
variables réguliers Mi , ∀i ∈ {0, . . . t}, avec t en entrée, pour un message M
? quelconque (i.e., k et n quelconques), M = {m1 , m2 , . . . , mk }, avec
mi ∈ {0, . . . , t}n , ∀i ∈ {1, . . . , k}, n > 1.
• Générateurs de nombres pseudo-aléatoires : On veut affecter de manière
aléatoire s sujets à k binômes. Écrire un algorithme qui permet de réaliser une
telle affectation, en considérons le cas où le nombre de binôme est supérieur au
nombre de sujet, i.e., k > s.

39

Vous aimerez peut-être aussi