Algorithme de Freivalds

De testwiki
(diff) ← Version précédente | Version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche

L'algorithme de Freivalds (du nom de Rūsiņš Mārtiņš Freivalds) est un test probabiliste pour vérifier le résultat d'un produit matriciel. Étant donné trois matrices A, B, et C, de tailles respectives m×k, k×n et m×n, à coefficients dans un anneau quelconque, le problème est de vérifier si A×B=C. Pour le résoudre, l'algorithme naïf calcule le produit A×B explicitement et compare le résultat terme à terme avec C. Cependant, le meilleur algorithme connu de produit matriciel (dans le cas où les matrices sont de taille identique à n) s'exécute en temps O(n2.3729)[1]. L'algorithme de Freivalds utilise la randomisation afin de réduire cette borne à O(n2)[2]  avec une forte probabilité. Il peut vérifier un produit matriciel en temps O(rn2) avec une probabilité d'échec inférieure à 2r.

Algorithme

Procédure

Le principe de l'algorithme consiste à vérifier, pour trois matrices de taille m×k, k×n, et m×n, notées A, B et C si l'égalité A×B=C est vérifiée ou non.

On effectue alors les trois étapes :

  1. Générer un vecteur aléatoire r de composantes 0 ou 1 de taille n.
  2. Calculer P=A×(Br)Cr.
  3. Renvoyer Oui si P=(0,0,,0)T ; Non sinon.

Erreur

Si A×B=C, alors l'algorithme retourne toujours Oui. Si A×BC, alors la probabilité que l'algorithme retourne Oui est inférieure ou égale à 1/2.

En répétant l'algorithme r fois et en renvoyant Oui si et seulement si toutes les itérations renvoient Oui, la complexité temporelle du test est O(rn2) et sa probabilité d'erreur est inférieure ou égale à 1/2r.

Exemple

Supposons qu'on souhaite vérifier si :

AB=[2334][1012]=?[6587]=C.

Un vecteur aléatoire 2 × 1 de composantes égales à 0 ou 1 est sélectionné — par exemple, r=[11] — et utilisé pour calculer :

A×(Br)Cr=[2334]([1012][11])[6587][11]=[2334][13][1115]=[1115][1115]=[00].

Le résultat est le vecteur nul ce qui suggère la possibilité que AB = C. Toutefois, si le vecteur r=[10] est sélectionné pour une deuxième itération, le résultat devient :

A×(Br)Cr=[2334]([1012][10])[6587][10]=[11].

Le résultat n'est plus nul ce qui prouve que AB ≠ C.

Il existe quatre vecteurs 0/1 à deux composantes. La moitié d'entre eux mène au vecteur nul (r=[00] et r=[11]) de sorte que la probabilité de choisir aléatoirement un de ces deux vecteurs deux fois de suite (et donc de conclure à tort que AB=C) est de 1/22 ou 1/4. Dans le cas général, la proportion de vecteurs r menant au vecteur nul peut être inférieure à 1/2. Un grand nombre d'essais est effectué de manière à rendre la probabilité d'erreur très faible.

Probabilité d'erreur

Soit p la probabilité d'erreur. Si A × B = C alors p = 0, et si A × BC alors p ≤ 1/2.

Cas A × B = C

P=A×(Br)Cr=(A×B)rCr=(A×BC)r=0

Ce résultat est indépendant de la valeur de r car il utilise seulement l'égalité A×BC=0. Par conséquent, la probabilité d'erreur est dans ce cas :

Pr[P0]=0

Cas A × BC

Soit

P=D×r=(p1,p2,,pn)T

D=A×BC=(dij).

Puisque A×BC, certaines composantes de D sont forcément non-nulles. Supposons l'élément dij0. Par la définition du produit matriciel, il vient :

pi=k=1ndikrk=di1r1++dijrj++dinrn=dijrj+y.

pour un certain y. Par la formule des probabilités totales, on a :

Pr[pi=0]=Pr[pi=0|y=0]Pr[y=0]+Pr[pi=0|y0]Pr[y0].

En utilisant les résultats

Pr[pi=0|y=0]=Pr[rj=0]=12
Pr[pi=0|y0]=Pr[rj=1dij=y]Pr[rj=1]=12

dans l'équation précédente, on obtient :

Pr[pi=0]12Pr[y=0]+12Pr[y0]=12Pr[y=0]+12(1Pr[y=0])=12

Par conséquent,

Pr[P=0]=Pr[p1=0pi=0pn=0]Pr[pi=0]12.

Ceci termine la preuve.

Complexité

Une analyse simple de cet algorithme montre une complexité en temps de O(n2) qui bat l'algorithme déterministe classique en O(n3). L'analyse de l'erreur montre qu'après r exécutions de l'algorithme, la probabilité d'erreur est inférieure à 12r. Dans la pratique, l'algorithme est rapide en raison d'implémentations efficaces du calcul d'un produit matrice-vecteur. Par conséquent, l'utilisation des algorithmes randomisés peut accélérer un algorithme déterministe lent. Le meilleur algorithme déterministe pour la vérification du produit matriciel est à l'heure actuelle une variante de l'algorithme de Coppersmith-Winograd avec un temps d'exécution asymptotique en O(n2.3729).

L'algorithme de Freivalds apparaît souvent dans les introductions aux algorithmes probabilistes grâce à sa simplicité. En pratique, il illustre également la supériorité des algorithmes probabilistes dans certains problèmes.

Anneaux /q

Il pourrait être tentant de générer le vecteur aléatoire avec des composantes prises uniformément dans {0, , q1} dans le cas où l'anneau de base est /q, q>2.

En effet, on pourrait penser que si le vecteur est pris dans un espace plus grand, l'égalité a encore moins de chance de se produire pour un vecteur générique.

Cependant, on a:

Pr[pi=0|y=0]=Pr[rj=0]=1q

Pr[pi=0|y0]=l=1qPr[rj=idij=ly]l=1qPr[rj=l]=q1q

En conclusion, le test devient plus efficace seulement dans le cas où l'erreur n'intervient que sur un coefficient, mais est moins efficace dans le cas général où le produit scalaire du vecteur d'erreur di=(di1, , din) et du vecteur aléatoire ri se compense à zéro.

On détermine la probabilité du test par la formule des probabilités totales :

Pr[pi=0]=1qPr[y=0]+q1qPr[y0]=1q2+(q1q)2>12

La probabilité d'erreur de ce second test étant supérieur à 12, il est préférable de ne générer le vecteur qu'avec des composantes entre 0 et 1.

Voir aussi

Notes

Modèle:Traduction/Référence

Références

Modèle:Reflist

  • Freivalds, R. (1977), “Probabilistic Machines Can Use Less Running Time”, IFIP Congress 1977, pages 839-842.

Modèle:Palette Modèle:Portail