MULTIPLICATION RAPIDE : KARATSUBA ET FFT 3
o`u le produit . sur Cnest effectu´e composante par composante. En fait,
DF Tωd´efinit un isomorphisme d’alg`ebres de (Cn,+,∗n) dans (Cn,+, .).
La matrice de cet isomorphisme est la matrice de Vandermonde Vωde
(1,ω,...,ωn−1)
Vω=
1 1 1 ... 1
1ω ω2. . . ωn−1
1ω2ω4. . . ω2(n−1)
.
.
..
.
..
.
..
.
..
.
.
1ωn−1ω2(n−1) . . . ω(n−1)2
.
Comme 1, ω, ..., ωn−1sont deux `a deux distincts, la matrice Vωest in-
versible. Son inverse donne la matrice permettant de calculer le polynˆome
d’interpolation en les points 1, ω, ..., ωn−1, c’est-`a-dire, les valeurs ai´etant
fix´ees pour i∈ {0,...n −1}, de calculer l’unique polynˆome fde degr´e
inf´erieur ou ´egal `a n−1 tel que f(ωi) = aipour tout i. Le th´eor`eme suivant
donne l’inverse de Vω.
Th´eor`eme 3.2. Si ω∈Cest une racine primitive n`eme de l’unit´e, alors
ω−1est aussi une racine primitive n`eme de l’unit´e et VωVω−1=nI, o`u I
est la matrice identit´e de taille n.
Revenons `a notre probl`eme, qui est de multiplier deux polynˆomes Fet
G. On suppose que deg(F G)≤n−1. La transform´ee de Fourier discr`ete
revient `a ´evaluer Fet Gsur npoints, ce qui suffit pour les d´efinir. Dans
cette repr´esentation, la multiplication est rapide `a calculer, puisque pour
tout idans {0. . . n −1},F G(ωi) = F(ωi)G(ωi). Cela nous ram`ene `a n
multiplications dans C. Ensuite, comme on connaˆıt le produit F G sur n
points, et comme deg(F G)≤n−1, on peut reconstituer F G. Ici, on peut
utiliser l’application inverse de DF Tω, c’est-`a-dire 1
nDF Tω−1.
Voyons maintenant comment calculer rapidement la transform´ee de Fourier
discr`ete de fa¸con rapide. On peut utiliser pour cela l’algorithme transform´ee
de Fourier rapide, ou FFT.
On suppose que n= 2k, o`u n∈N. Pour ´evaluer Fen 1, ... , ωn−1, on
divise d’abord Fpar xn/2−1 et xn/2+ 1 :
F=q0(xn/2−1) + r0=q1(xn/2+ 1) + r1,
pour q0,r0,q1,r1dans C[x] de degr´e inf´erieur strictement `a n/2. Nous
n’avons besoin que de calculer r0et r1. Pour cela, on remarque que si
F=F1xn/2+F0, alors xn/2−1 divise F−F0−F1, et donc r0=F0+F1.
De mˆeme, r1=F0−F1. On n’a donc besoin que de nop´erations dans C
pour le calcul de r0et de r1. De plus,
F(ω2l) = r0(ω2l) et F(ω2l+1) = r1(ω2l+1)
pour tout l∈ {0,...,n/2}. Il reste `a ´evaluer r0en les puissances paires de
ωet r1en les puissances impaires de ω. Or, ω2est une racine primitive