Calculs de relations entre constantes numériques par l'algorithme « LLL »

Sujet proposé par Frédéric Chyzak
(*)

frederic.chyzak[at]inria.fr


1  Objectif

Il s'agit pour ce sujet d'implanter un algorithme de réduction de réseau, connu sous le nom de « LLL », d'après le nom de ses inventeurs, A. K. Lenstra, H. W. Lenstra et L. Lovász. Parmi les applications possibles de cet algorithme, on notera : On s'intéressera particulièrement dans ce sujet aux deux dernières applications ; la première est très importante par ses conséquences mais demanderait un trop gros effort de programmation.

1.1  Dépendances linéaires entres constantes numériques

Étant donnés n nombres réels non nuls, r1, ..., rn, une relation de dépendance linéaire à coefficients entiers entre ces réels est une relation de la forme
c1r1+...+cnrn=0
pour des coefficients ci entiers non tous nuls. Lorsqu'on se donne une approximation rationnelle de chaque réel ri, ou mieux, la possibilité d'obtenir autant de chiffres décimaux que souhaité, une approche possible pour la détermination de relations de dépendance linéaire est de rechercher un vecteur « court », c'est-à-dire de norme petite en un sens à préciser, parmi les combinaisons linéaires à coefficients entiers des vecteurs lignes de la matrice
F=




1 0 ... 0 a1
0 1 ... 0 a2
     
0 ... 0 1 an−1
0 ... 0 0 an





,
où chaque ai est une troncature entière de Nri pour un grand entier N. (Par exemple, N est une grande puissance de 10.)

Un vecteur court est alors de la forme
v=(c1,...,cn−1,c1a1+...+cnan) ≃ (c1,...,cn−1,N(c1r1+...+cnrn)).
En particulier,
|c1r1+...+cnrn| ≃ | N−1(c1a1+...+cnan) | N−1|v|
se doit d'être petit, ce qui fait de
c1r1+...+cnrn=0
un bon candidat pour une relation de dépendance entre les ri. Bien qu'un tel argument ne constitue pas une preuve, la preuve formelle de relation entre constantes a dans un bon nombre de cas été grandement facilitée une fois que la bonne relation a pu être découverte expérimentalement par la méthode proposée ci-dessus. Dans un certain nombre de cas, même, des identités n'ont pu être prouvées que parce qu'elles avaient été découvertes heuristiquement en utilisant l'algorithme LLL.

Donnons un exemple. Des arguments théoriques donnent la certitude que le nombre
V=


0
x
 ln5x
(1−x)5
 dx
peut se représenter comme l'évaluation en π d'une fonction polynomiale à coefficients rationnels. Il s'agit donc de trouver une dépendance linéaire entre
V,1,π,...,πd
pour un degré de polynôme d à déterminer. À peu près tout système de calcul formel généraliste connait des approximations pour π et permet de calculer aisément une approximation numérique de V. On prend donc par exemple a1=N=1025, a2=31415926535897932384626434≃ Nπ, ..., a9=94885310160705740071285755038≃ Nπ8, a10=−166994737192290704961872433≃ NV pour construire la matrice F. Les normes des vecteurs lignes de cette matrice sont toutes supérieures à N=1025. Par l'algorithme LLL, on trouve une base du même réseau de vecteurs, dont le premier vecteur ligne,
v=(c1,...,cn−1,c1a1+...+cnan)=(0,0,120,0,140,0,−15,0,0,33),
est de norme inférieure à 200, tous les autres vecteurs de base étant de norme supérieure à 400. Les ai étant connus, on trouve
(c1,...,cn)=(0,0,120,0,140,0,−15,0,0,24),
d'où la relation linéaire
V=


0
x
 ln5x
(1−x)5
 dx =
2
24
(3π4−28π2−24)
qui résout le problème posé.

1.2  Polynôme minimal de nombres algébriques

Un nombre complexe α est dit algébrique (sur les nombres rationnels) s'il est solution d'un polynôme P à coefficients rationnels
P(α)=p0+...+pdαd=0.
Pour pouvoir utiliser l'approche de la section précédente, on se limite au cas de nombres réels.

Étant donnée une approximation numérique (réelle) d'un nombre α qu'on a de bonnes raisons de penser être algébrique, la détermination heuristique de P peut se voir comme la recherche d'une relation de dépendance linéaire sur des approximations numériques rationnelles de
1,α,...,αd.
Dès lors qu'on a une borne supérieure sur le degré d de P, on peut donc employer la méthode de la section précédente.

Par exemple, soit à déterminer si un nombre
r≃0.26625264629019611453024776557584454817650128610395...
est algébrique. Par la méthode esquissée, en testant jusqu'à d=6 et pour N=1028, on trouve (à partir de vecteurs lignes de norme supérieure à 1020), le vecteur court
v=(−1,0,0,54,0,0,−10),
de norme inférieure à 55, tous les autres vecteurs calculés étant de norme supérieure à 5000. En poursuivant avec la méthode, on trouve
(c1,...,c7)=(−1,0,0,54,0,0,−54),
soit
P=54X6−54X3+1.
En effet, le nombre r s'avère être une approximation du nombre algébrique
α=
1
2
5
3
18
.


2  Algorithme LLL pour la réduction de base

Étant donnés n vecteurs lignes à entrées rationnelles,
ai=(ai,1,...,ai,n)
pour 1≤ in, l'algorithme LLL recherche des combinaisons linéaires
v=c1a1+...+cnan
à coefficients cl entiers tels que les vecteurs lignes v soient courts, au sens de la norme euclidienne donnée par
|v|2=v12+...+vn2.
L'ensemble des combinaisons linéaires des vecteurs ai est appelé réseau engendré par les ai. Sous l'hypothèse que les ai soient linéairement indépendants sur l'anneau  des entiers, les ai constituent une base du réseau, et l'algorithme LLL calcule en réalité une base du même réseau constituée exclusivement de vecteurs courts.

La stratégie adoptée par l'algorithme est de construire la base courte F en en maintenant en permanence une variante orthogonale F obtenue par le procédé d'orthogonalisation de Gram–Schmidt.

2.1  Orthogonalisation par la méthode de Gram–Schmidt

On dote l'espace n du produit scalaire scalaire euclidien donné par
(uv)=u1v1+...+unvn
et de la norme euclidienne donnée par
|u|=
(uu)
=
u12+...+un2
.


Étant donnée une base quelconque F=(f1,...,fn) de n, le procédé de Gram–Schmidt calcule une base orthogonale en calculant successivement, pour i de 1 à n
fi=fi
 
Σ
1≤ j<i
μi,jfj     où     μi,j=
|fj|
(fifj)
.
En vue de ce qui suit, il conviendra de pouvoir conserver les trois matrices F, M=(μi,j) et F=(f1,...,fn), et de remarquer la relation F=MF.

2.2  Réduction de base

Le coeur de l'algorithme LLL est le suivant : étant donnée une base F=(f1,...,fn) d'un réseau de n,
  1. calculer l'orthogonalisation de Gram–Schmidt de F ;

  2. en partant de i=2 et tant que in, faire :
    1. pour j décroissant de i−1 à 1 remplacer fi par fi−⌊μi,j+1/2⌋ fj et mettre à jour l'orthogonalisation de Gram–Schmidt de F ;

    2. si i≠1 et |fi−1|2>2|fi|2, échanger fi et fi−1 et mettre à jour l'orthogonalisation de Gram–Schmidt de F, puis faire i=i−1 ; sinon faire i=i+1 ;


  3. renvoyer (f1,...,fn).
(⌊ x⌋ représente le plus grand entier inférieur ou égal à x, si bien que ⌊ x+1/2⌋ représente l'entier le plus proche de x.)

3  Considérations théoriques

On montre que si A=max|fi|, l'algorithme LLL effectue O(n4ln A) opérations arithmétiques sur des entiers de taille O(nlnA).

On pourra s'apercevoir que, même sur des exemples simples tels ceux donnés dans la section d'exemples, des entiers de plus de 64 bits (les long de Java) seront nécessaires. C'est pourquoi des entiers en précision arbitraire devront être utilisés. Leur l'implantation n'est pas demandée : elle justifierait bien plus qu'un projet à elle seule. Mais fort heureusement la classe java.math.BigInteger de Java fournit l'accès à de grands entiers.

4  Travail demandé

Le travail minimum demandé est le suivant :
  1. Programmer les opérations nécessaires sur les nombres rationnels en définissant une représentation de nombres rationnels à partir d'entiers en précision arbitraire. En Java, il conviendra d'utiliser la classe java.math.BigInteger qui fournit de tels entiers. (La documentation est disponible sur les pages WEB de l'X.)

  2. Implanter le procédé d'orthogonalisation de Gram–Schmidt.

  3. Implanter l'algorithme LLL et le tester sur les exemples de la section qui suit. On cherchera à comprendre quelle est la précision des entrées nécessaire pour obtenir un résultat crédible.

5  Autres exemples

Voici quelques autres exemples pour vous permettre de mettre au point votre programme. (Tous ces exemples sont tirés du livre Modern Computer Algebra, cité en référence.)

Un tout petit exemple est donné par les vecteurs (12,2) et (13,4), dont le réseau engendré contient (1,2) et (11,0).

Dans des exemples de l'application à la factorisation de polynômes, on doit montrer que le réseau engendré par (1,−5136,0), (0,1,−5136) et (0,0,15625) contient le vecteur (3,1,1), ou que le réseau engendré par (1,−34967,0), (0,1,−34967) et (0,0,117649) contient le vecteur (1,1,1).

Une autre application, liée au cassage du cryptosystème mentionné dans l'introduction, demande de déterminer si l'entier 1215 peut s'exprimer comme somme (éventuellement avec répétition, mais un petit nombre de répétitions) des entiers 366, 385, 392, 401, 422 et 437. Par l'algorithme naïf, on doit tester un nombre exponentiel de sommes ; par un algorithme de réduction de réseau, on se ramène à une complexité polynomiale.

Bien d'autres exemples sont donnés sur le site donné en référence.

6  Références

(Me contacter si ces références sont difficiles à trouver.)
This document was translated from LATEX by HEVEA.