restart:Calcul de la TFD par une proc\303\251dure "na\303\257ve"Cette proc\303\251dure calcule les coefficients de Fourier par une m\303\251thode dite "naive".TFDSimple:=proc(x)
local n,X:
n:=nops(x):
X:=[seq(sum(x[j]*exp(-2*I*(j-1)*(k-1)*Pi/n),j=1..n),k=1..n)];
end proc:Calcul de la TFD par une proc\303\251dure r\303\251cursiveCette proc\303\251dure prend en entr\303\251e une liste repr\303\251sentant les coefficients d'un polyn\303\264me dont on cherche \303\240 calculer les coefficients de Fourier.TFDRecur:=proc(x)
local N,CoefFFT,xp,xi,u,v,omega:
N:=nops(x):
if N=1 then CoefFFT:=x:
else
xp:=[seq(x[2*i],i=1..N/2)]:
xi:=[seq(x[2*i-1],i=1..N/2)]:
u:=TFDRecur(xp):
v:=TFDRecur(xi):
omega:=exp(-2*I*Pi/N):
CoefFFT:=[seq(omega^(k-1)*u[k]+v[k],k=1..N/2),seq(-omega^(k-1)*u[k]+v[k],k=1..N/2)];
end if:
CoefFFT;
end proc:Calcul de la TFD par it\303\251rationOn va utiliser l'\303\251criture des divers coefficients en binaire.TFDIter:=proc(x)
local n,i,j,k,a,b,p,l,z,w,h,m,tmp:
n:=nops(x):
l:=x;
p:=n/2; #p: puissance max dans d\303\251composition.
while p>=1 do
#On fait les signaux jusqu'a 2^p
z:=1; #premi\303\250re valeur de omega.
w:=exp(-I*Pi/p); #c'est omega.
for h from 1 to p do #Variable servant \303\240 la d\303\251composition
for m from 1 to n/(2*p) do
#On va calculer le signal xm
#prendre l'exemple du Butterfly pour illustrer
a:=h+2*(m-1)*p:#indice du signal pour j_(r-1)
b:=a+p;
tmp:=(l[a]-l[b])*z:
l[a]:=l[a]+l[b]:
l[b]:=tmp:
end do:
#On passe au signal m+1 -> w<-w^(m+1)
z:=z*w:
end do:
p:=p/2:
end do:
#On a maintenant notre liste contenant les signaux x_r
#Il reste \303\240 remettre les signaux dans le bon ordre.
j:=1:
for i from 1 to n do
if j>i then tmp:=l[j]:
l[j]:=l[i]:
l[i]:=tmp:
end if:
p:=n/2:
while p>=2 and j>p do
j:=j-p:
p:=p/2:
end do:
j:=j+p:
end do:
return l;
end proc:Calcul de la Transform\303\251e Inverse.De m\303\252me, il est possible d'effectuer deux m\303\251thodes pour calculer la transform\303\251e inverse de Fourier :La m\303\251thode na\303\257veEn utilisant le m\303\252me algorithme, on obtient : TFDISimple:=proc(X)
local n,F:
n:=nops(X):
F:=[seq((1/n)*sum(X[i]*exp(2*I*(j-1)*(i-1)*Pi/(n)),i=1..n),j=1..n)];
end proc:La m\303\251thode r\303\251cursiveAttention : Pour que l'on puisse retrouver les valeurs initiales, il ne faut pas oublier de diviser par le nombre de valeurs.TFDIRecur:=proc(X)
local Coef,N,Xi,Xp,U,V,Omega,k;
N:=nops(X);
if N=1 then Coef:=X:
else
Xi:=[seq(X[2*k-1],k=1..N/2)];
Xp:=[seq(X[2*k],k=1..N/2)];
U:=TFDIRecur(Xi);
V:=TFDIRecur(Xp);
Omega:=exp(2*I*Pi/N);
Coef:=[seq(U[k]+Omega^(k-1)*V[k],k=1..N/2),seq(U[k]-Omega^(k-1)*V[k],k=1..N/2)]:
end if;
Coef;
end proc:La m\303\251thode it\303\251rativeTFDIIter:=proc(x)
local n,i,j,k,a,b,p,l,z,w,h,m,tmp:
n:=nops(x):
l:=x;
p:=n/2;
while p>=1 do
z:=1;
w:=exp(I*Pi/p); #C'est la diff\303\251rence
for h from 1 to p do
for m from 1 to n/(2*p) do
a:=h+2*(m-1)*p:
b:=a+p;
tmp:=(l[a]-l[b])*z:
l[a]:=l[a]+l[b]:
l[b]:=tmp:
end do:
z:=z*w:
end do:
p:=p/2:
end do:
j:=1:
for i from 1 to n do
if j>i then tmp:=l[j]:
l[j]:=l[i]:
l[i]:=tmp:
end if:
p:=n/2:
while p>=2 and j>p do
j:=j-p:
p:=p/2:
end do:
j:=j+p:
end do:
return l/n;
end proc:Mesure du temps de calculOn va ici s'inter\303\251sser \303\240 la mesure du temps pris pour calculer les coefficients de Fourier (Transform\303\251e Directe) par la m\303\251thode na\303\257ve et la m\303\251thode r\303\251cursive pour n grand, par exemple n=2^5, n=2^10, n=2^20.
Pour cela, on va d\303\251finir la liste de nos coefficients, entiers compris entre -50 et 50 par exemple, par une m\303\251thode "pseudo-al\303\251atoire" : with(RandomTools[MersenneTwister]);
A:=[seq(GenerateInteger32(),i=1..2^5)]:M\303\251thode na\303\257veOn effectue le calcul pour la m\303\251thode it\303\251rative : t:=time():
N:=TFDSimple(A):
Temps := time()-t;M\303\251thode r\303\251cursiveCalcul pour la m\303\251thode r\303\251cursive : t:=time():
R:=TFDRecur(A):
Temps := time()-t;M\303\251thode it\303\251rativet:=time():
I:=TFDIter(A):
Temps:= time()-t;Multiplication de polyn\303\264mesAlgorithmeOn va prendre en entr\303\251e deux listes contenant les coefficients des deux polyn\303\264mes dont on cherche \303\240 calculer le produit.Utilise la m\303\251thode simple, car sinon impose en plus une condition sur le degr\303\251 des polyn\303\264mes.Multiplication:=proc(P,Q)
local n,N,R,A,B,i,j,k:
n:=nops(P):
#On cr\303\251e la liste des coefficients \303\251tendus \303\240 2n \303\251l\303\251ments.
A:=[seq(P[k],k=1..n),seq(0,k=n+1..2*n)];
B:=[seq(Q[k],k=1..n),seq(0,k=n+1..2*n)];
#On calcule la TFD de chacune de ces listes.
A:=TFDIter(A):
B:=TFDIter(B):
#On effectue les produits
R:=[seq(A[k]*B[k],k=1..2*n)]:
#On r\303\251cup\303\250re les coefficients.
TFDIIter(R);
end proc:ExempleMapleOn va poser LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUkjbWlHRiQ2OVEiUEYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EoWzAsMCwwXUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGNy8lKWNvbXBvc2VkR0Y3LyUqY29udmVydGVkR0Y3LyUraW1zZWxlY3RlZEdGNy8lLHBsYWNlaG9sZGVyR0Y3LyUwZm9udF9zdHlsZV9uYW1lR1EoMkR+TWF0aEYnLyUqbWF0aGNvbG9yR0ZDLyUvbWF0aGJhY2tncm91bmRHRkYvJStmb250ZmFtaWx5R0YxLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy8lKW1hdGhzaXplR0Y0LUkjbW9HRiQ2M1EjOj1GJy8lJWZvcm1HUSZpbmZpeEYnLyUmZmVuY2VHRjcvJSpzZXBhcmF0b3JHRjcvJSdsc3BhY2VHUS90aGlja21hdGhzcGFjZUYnLyUncnNwYWNlR0Zqby8lKXN0cmV0Y2h5R0Y3LyUqc3ltbWV0cmljR0Y3LyUobWF4c2l6ZUdRKWluZmluaXR5RicvJShtaW5zaXplR1EiMUYnLyUobGFyZ2VvcEdGNy8lLm1vdmFibGVsaW1pdHNHRjcvJSdhY2NlbnRHRjcvJTBmb250X3N0eWxlX25hbWVHRlcvJSVzaXplR0Y0LyUrZm9yZWdyb3VuZEdGQy8lK2JhY2tncm91bmRHRkYtRiM2Jy1GLDY5USFGJ0YvRjJGNUY4RjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmhuRltvLUkrbXVuZGVyb3ZlckdGJDYnLUZebzYzUSYmU3VtO0YnL0Zib1EncHJlZml4RidGZG9GZm8vRmlvUSQwZW1GJy9GXHBRLnRoaW5tYXRoc3BhY2VGJy9GXnBGOkZfcEZhcEZkcC9GaHBGOi9GanBGOkZbcUZdcUZfcUZhcUZjcS1GIzYnRmdxLUYsNjlRImlGJ0YvL0YzUSMxMEYnRjVGOEY7Rj1GPy9GQlEsWzIwMCwwLDIwMF1GJ0ZERkdGSUZLRk1GT0ZRL0ZURjpGVS9GWUZhc0ZaRmZuRmhuL0Zcb0Zfcy1GXm82M1EiPUYnRmFvRmRvRmZvRmhvRltwRl1wRl9wRmFwRmRwRmdwRmlwRltxRl1xRl9xRmFxRmNxLUkjbW5HRiQ2OVEiMEYnRi9GMkY1L0Y5RjdGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm4vRmluUSdub3JtYWxGJ0Zbb0ZncS1GIzYjLUZpczY5USMxMEYnRi9GMkY1Rlx0RjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRl10RltvRltxLyUsYWNjZW50dW5kZXJHRjdGZ3EtSSVtc3VwR0YkNiUtRiw2OVEjaVhGJ0YvRjJGNUY4RjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmhuRltvLUYsNjlGXXNGL0YyRjVGOEY7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZobkZbby8lMXN1cGVyc2NyaXB0c2hpZnRHUSIwRidGZ3FGZ3E= et LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYmLUkjbWlHRiQ2OVEiUUYnLyUnZmFtaWx5R1EwVGltZXN+TmV3flJvbWFuRicvJSVzaXplR1EjMTJGJy8lJWJvbGRHUSZmYWxzZUYnLyUnaXRhbGljR1EldHJ1ZUYnLyUqdW5kZXJsaW5lR0Y3LyUqc3Vic2NyaXB0R0Y3LyUsc3VwZXJzY3JpcHRHRjcvJStmb3JlZ3JvdW5kR1EoWzAsMCwwXUYnLyUrYmFja2dyb3VuZEdRLlsyNTUsMjU1LDI1NV1GJy8lJ29wYXF1ZUdGNy8lK2V4ZWN1dGFibGVHRjcvJSlyZWFkb25seUdGNy8lKWNvbXBvc2VkR0Y3LyUqY29udmVydGVkR0Y3LyUraW1zZWxlY3RlZEdGNy8lLHBsYWNlaG9sZGVyR0Y3LyUwZm9udF9zdHlsZV9uYW1lR1EoMkR+TWF0aEYnLyUqbWF0aGNvbG9yR0ZDLyUvbWF0aGJhY2tncm91bmRHRkYvJStmb250ZmFtaWx5R0YxLyUsbWF0aHZhcmlhbnRHUSdpdGFsaWNGJy8lKW1hdGhzaXplR0Y0LUkjbW9HRiQ2M1EjOj1GJy8lJWZvcm1HUSZpbmZpeEYnLyUmZmVuY2VHRjcvJSpzZXBhcmF0b3JHRjcvJSdsc3BhY2VHUS90aGlja21hdGhzcGFjZUYnLyUncnNwYWNlR0Zqby8lKXN0cmV0Y2h5R0Y3LyUqc3ltbWV0cmljR0Y3LyUobWF4c2l6ZUdRKWluZmluaXR5RicvJShtaW5zaXplR1EiMUYnLyUobGFyZ2VvcEdGNy8lLm1vdmFibGVsaW1pdHNHRjcvJSdhY2NlbnRHRjcvJTBmb250X3N0eWxlX25hbWVHRlcvJSVzaXplR0Y0LyUrZm9yZWdyb3VuZEdGQy8lK2JhY2tncm91bmRHRkYtRiM2KS1GLDY5USFGJ0YvRjJGNUY4RjtGPUY/RkFGREZHRklGS0ZNRk9GUUZTRlVGWEZaRmZuRmhuRltvLUkrbXVuZGVyb3ZlckdGJDYnLUZebzYzUSYmU3VtO0YnL0Zib1EncHJlZml4RidGZG9GZm8vRmlvUSQwZW1GJy9GXHBRLnRoaW5tYXRoc3BhY2VGJy9GXnBGOkZfcEZhcEZkcC9GaHBGOi9GanBGOkZbcUZdcUZfcUZhcUZjcS1GIzYmRmdxLUYsNjlRImlGJ0YvL0YzUSMxMEYnRjVGOEY7Rj1GPy9GQlEsWzIwMCwwLDIwMF1GJ0ZERkdGSUZLRk1GT0ZRL0ZURjpGVS9GWUZhc0ZaRmZuRmhuL0Zcb0Zfcy1GXm82M1EiPUYnRmFvRmRvRmZvRmhvRltwRl1wRl9wRmFwRmRwRmdwRmlwRltxRl1xRl9xRmFxRmNxLUkjbW5HRiQ2OVEiMEYnRi9GMkY1L0Y5RjdGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm4vRmluUSdub3JtYWxGJ0Zbby1GaXM2OVEjMTBGJ0YvRjJGNUZcdEY7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZddEZbb0ZbcS8lLGFjY2VudHVuZGVyR0Y3RmdxLUklbXN1cEdGJDYlLUYsNjlGXXNGL0YyRjVGOEY7Rj1GP0ZBRkRGR0ZJRktGTUZPRlFGU0ZVRlhGWkZmbkZobkZbb0ZndC8lMXN1cGVyc2NyaXB0c2hpZnRHUSIwRidGZ3EtRmV0NiUtRiw2OVEiWEYnRi9GMkY1RjhGO0Y9Rj9GQUZERkdGSUZLRk1GT0ZRRlNGVUZYRlpGZm5GaG5GW29GZ3RGaXRGZ3FGZ3E=P:=sum(i*X^i,i=0..15);Q:=sum(i^i*X^i,i=0..15);R:=expand(P*Q);AlgoP:=[seq(i,i=0..15)];Q:=[seq(i^i,i=0..15)];R:=evalf(Multiplication(P,Q)):R:=[seq(round(R[j]),j=1..20)];