Beruflich Dokumente
Kultur Dokumente
Introducción
A principios del siglo XIX, a partir de problemas fı́sicos como la vibración de una
cuerda o la propagación del calor, Joseph Fourier desarrolló una teorı́a matemática sobre la
representación de funciones por medio de series trigonométricas, que más tarde terminarı́a
en llamarse Análisis de Fourier.
A lo largo del siglo XIX, con la aportación importante de otros muchos matemáticos,
como Dirichlet o Riemann (y pese a la oposición de otros, todo hay que decirlo), se fue
formalizando toda la teorı́a. Con la llegada del siglo XX, la integral de Lebesgue permitió
plantear los problemas de un modo diferente, dando lugar a nuevos resultados y a nuevos
puntos de vista.
Sin embargo, si durante casi 200 años el Análisis de Fourier no ha pasado de ser un
importante campo de estudio dentro de la matemática, con aplicaciones a la fı́sica o a otras
ciencias, a partir del año 1965 la historia cambia por completo. Ese año, Cooley y Tukey
(ver [5]) publicaron un método para calcular transformadas de Fourier que significaba un
ahorro de tiempo importante respecto de todos los métodos conocidos hasta entonces, y que
posteriormente se denominarı́a transformada rápida de Fourier (o FFT, por sus iniciales
en inglés).
Este descubrimiento significó que muchos problemas, de muy diversos campos, que
antes no podı́an resolverse por la complicación de los cálculos de los coeficientes de Fourier,
ahora están al alcance de la mano. O que se hayan encontrado en los últimos años muchas
nuevas aplicaciones, insospechadas hasta entonces.
Entre estas aplicaciones, una de las más importantes es la del procesamiento de señales
digitales.
El primero en trabajar en este campo fue E. Oran Brigham (ver [3]), que escribió
el primer libro sobre transformada rápida de Fourier, gracias al cual muchos ingenieros
aprendieron los fundamentos de esta herramienta.
El estudio de señales aparece en una gran variedad de campos, y las ideas y técnicas
asociadas juegan un papel importante en áreas tan diversas de la ciencia como las co-
1
municaciones, la aeronáutica, la astronomı́a, el diseño de circuitos, acústica, sismologı́a,
ingenierı́a biomédica, procesamiento de voz . . .
Algunos ejemplos relacionados con el tratamiento de señales pueden ser:
– Diseño de transmisores y receptores de radio y televisión.
– Diagnóstico automático de electrocardiogramas.
– Restauración de señales que han sido degradadas, bien en la trasmisión de la voz
con interferencias (por ejemplo para aislar la voz del piloto del ruido de la cabina), o
bien en la recuperación y mejora de grabaciones antiguas (musicales, por ejemplo).
– Restauración de imágenes en general (por ejemplo, las imágenes enviadas por son-
das o satélites espaciales).
– Análisis de promedios de ı́ndice bursátil, con vistas a efectuar pronósticos económi-
cos . . .
Una idea de la importancia del algoritmo de Cooley y Tukey la da la cantidad de libros
que se han publicado en los últimos años (la mayorı́a, en inglés) sobre las transformadas
de Fourier (ver [4], [7], [10] o [21]), o incluso algunos únicamente sobre la transformada
rápida de Fourier (ver por ejemplo [3] o [15]). También es fácil encontrar recientemente el
citado algoritmo en muchos libros dedicados a algoritmos en general, buscándose además
continuas mejoras para su implementación de una manera más eficiente (ver [2], [6], [11],
[12] o [19]), en libros sobre análisis de señales digitales (ver [13], [14], [16] o [17]), o incluso
en libros sobre cálculo cientı́fico o simbólico (véase [8] o [20]).
En estas notas, vamos a dedicar una parte importante al estudio y aplicación de dicho
algoritmo. Pero antes de entrar en ello, veremos lo que son las series de Fourier y la
transformada discreta de Fourier, empezando con un repaso de los conceptos básicos de
operaciones con números complejos.
1. Números complejos
En el cuerpo IR de los números reales no tienen solución determinadas ecuaciones
polinómicas como x2 +1 = 0. Para resolver este problema se hace necesaria una ampliación
de los números reales introduciendo un nuevo elemento, i, que verifique dicha ecuación, y
construyendo un nuevo cuerpo que contenga a IR y a este elemento.
2
(es el producto de los binomios teniendo en cuenta que i2 = −1).
Y si z2 = 0, entonces
z1 (x1 + y1 i) (x2 − y2 i) x1 x2 + y1 y2 x2 y1 − x1 y2
= = 2 2 + i.
z2 (x2 + y2 i) (x2 − y2 i) x2 + y2 x22 + y22
1.3. Observaciones.
(1) El número complejo x + yi se puede representar en el plano IR2 como el punto de
coordenadas cartesianas (x, y).
(2) El conjunto CI de los números complejos, con las operaciones definidas tiene estructura
de cuerpo, que contiene al de los números reales ya que un número real es un complejo
de la forma x + iy con y = 0. Además este cuerpo es algebraicamente cerrado, es decir
I .
toda ecuación polinómica con coeficientes complejos tiene solución en C
I no admite un orden total compatible con la estructura de cuerpo.
(3) C
i1 = i i2 = −1 i3 = −i i4 = 1
i5 = i i6 = −1 i7 = −i etc.
Para calcular in con n ∈ ZZ basta elevar i al resto de la división de n entre 4.
Nota. La forma binómica no es muy adecuada para calcular potencias altas de un número
complejo x + iy con x, y = 0, ya que serı́a necesario calcular la potencia del binomio y
después simplificar las sucesivas potencias de i. Por ejemplo
Veremos una forma de expresar los números complejos que permite, entre otras cosas, un
cálculo más eficiente de potencias.
3
z+z z−z
3. Para todo z ∈ C
I se verifica Re z = e Im z = de donde se deduce que un
2 2i
número complejo z ∈ IR si y sólo si z = z.
Observemos que, dado que las funciones trigonométricas son periódicas, hay infinitos
argumentos de un número complejo. Llamaremos argumento principal de z = 0, y lo
denotaremos Arg z, al único argumento θ ∈ [0, 2π).
4
5. |z1 z2 | = |z1 ||z2 | ∀z1 , z2 ∈ C
I .
6. Si θ1 es un argumento de z1 y θ2 es un argumento de z2 entonces θ1 +θ2 es un argumento
z1
de z1 · z2 y θ1 − θ2 es un argumento de cuando z2 = 0.
z2
z = ρeiθ
1.12. Observaciones.
(1) A la expresión z = ρeiθ dada por el teorema anterior se le suele llamar forma expo-
nencial o polar del número complejo z. Para obtenerla con Maple podemos usar las
funciones abs (para determinar el módulo) y argument (que devuelve un argumento
en (−π, π]).
(2) Para operar con números complejos se utilizará la forma de éstos en la cual los cálculos
sean más sencillos, por ejemplo el producto y el cociente de números complejos en forma
polar admiten una expresión muy simple (téngase en cuenta la propiedad 1.10.6):
z1 z2 = ρ1 ρ2 ei(θ1 +θ2 )
iθ1 iθ2
si z1 = ρ1 e , z2 = ρ2 e entonces z1 ρ1
= ei(θ1 −θ2 ) si z2 = 0.
z2 ρ2
Esto permite una sencilla interpretación geométrica para el producto de dos números
complejos: el número complejo z1 z2 tiene por módulo el producto de los módulos de
z1 y z2 y por argumento la suma de los argumentos.
En particular, multiplicar un número complejo z por otro de módulo 1 y argumento θ
supone un giro de θ radianes.
√
1.13. Ejemplo: El número complejo z = −1 + 3i se escribe en forma polar:
√ 2π
z = −1 + 3i = 2ei 3 ,
√ √
2 2
mientras que z = 2 −i 2 en forma polar será z = e−iπ/4 (ver ejemplo 1.9).
5
2. ez = 0 ∀z ∈ C
I .
3. ez1 ez2 = ez1 +z2 ∀z1 , z2 ∈ C
I .
4. |ez | = eRe z ∀z ∈ C
I .
5. ez = 1 ⇐⇒ z = 2kπi con k ∈ ZZ.
6. ez1 = ez2 ⇐⇒ z1 − z2 = 2kπi con k ∈ ZZ. (La función exponencial compleja no es
inyectiva).
7. ez = ez I . En particular, eix = e−ix
∀z ∈ C ∀x ∈ IR.
1.15. Observación. Una fórmula que engloba las constantes más usuales en Matemáticas
es
eπi + 1 = 0
expresión sorprendentemente simple, denominada fórmula de Euler, que presentamos a
modo de curiosidad.
√ θ+2kπ
wk = n ρ ei n k = 0, 1, . . . n − 1.
1.18. Observación. Todas las raı́ces de un número complejo z = ρeiθ tienen el mismo
√
módulo n ρ y sus argumentos se obtienen empezando en nθ e incrementando sucesivamente
2π
n radianes. Teniendo en cuenta la observación 1.13 (2), las raı́ces wk se pueden expresar
de modo recurrente por:
√ θ 2π
w0 = n ρ ei n , wk = ei n wk−1 k = 1, . . . n − 1.
6
1.19. Raı́ces n-ésimas de la unidad.
Puesto que 1 = e0i , sus raı́ces n-ésimas son
2π 4π 6π 2π(n−1)
1, ei n , ei n , ei n , . . . , ei n .
S = 1 + w + w2 + w3 + . . . + wn−1 .
1 − wn
S= = 0.
1−w
1 + w + w2 + w3 + . . . + wn−1 = 0.
1.21. Ejemplo: Las raı́ces cuartas de 1 son, como es sabido, 1, −1, i y −i. Y pueden
expresarse de la forma:
π 2π 2·2π 3π 3·2π
1, i = ei 2 = ei 4 , −1 = eiπ = ei 4 , −i = ei 2 = ei 4 .
7
2. Series de Fourier
Supongamos que queremos estudiar una magnitud de un cierto fenómeno natural que
viene expresada como una función y(t) del tiempo. Vamos a tratar de expresarla de la
forma
y(t) = ai xi (t),
es decir como combinación lineal de unas funciones sencillas, xi (t), que se denominan carac-
terı́sticas elementales. Los coeficientes ai deben ser constantes y constituyen el espectro de
la función y(t). Es de suponer que la distribución y magnitud de los ai nos proporcione
información sobre y(t).
Por ejemplo, el espectro del ecocardiograma puede informar al médico sobre el es-
tado del corazón; el espectro del ruido de un motor puede informar sobre su estado de
funcionamiento . . .
El estudio de este tipo de problemas es el objetivo de una disciplina denominada análisis
armónico. El método propuesto lleva asociados tres problemas:
1. La elección adecuada de las caracterı́sticas elementales xi (t).
2. Cálculo del espectro, o sea de los coeficientes ai .
3. Interpretación de la información.
No vamos a entrar ahora en la interpretación de la información, entre otras cosas
porque depende en buena parte del fenómeno mismo que se estudia.
En los métodos de cálculo es donde más influencia ha tenido el desarrollo reciente de
los ordenadores. De los métodos analógicos, gráficos, mecánicos . . . para calcular los
coeficientes, se ha pasado al dominio casi absoluto de los medios digitales, simplificados en
gran medida gracias al algoritmo de Cooley y Tukey (ver [5]).
En cuanto al primer problema, el método de Fourier lo resuelve tomando funciones
exponenciales complejas (einx ) o trigonométricas (senos y cosenos). Pero hay que tener
en cuenta que para que las caracterı́sticas elementales se ajusten bien a determinados
fenómenos naturales, ası́ como para determinar más fácilmente el espectro, es bueno que las
funciones xi (t) sean ortogonales, de manera que estamos poniendo y(t) como combinación
lineal de vectores ortogonales.
El concepto de ortogonalidad se puede definir en un espacio vectorial cualquiera, y no
solamente en IR2 o IR3 , y va ligado al concepto de producto escalar. Si V es un espacio
vectorial sobre el cuerpo C I de los números complejos (lo mismo valdrı́a para espacios
vectoriales sobre IR), se llama producto escalar sobre V a una aplicación
·, · : V × V −→ C
I
(u, v) −→
u, v
8
Se dice que dos elementos u, v ∈ V son ortogonales si su producto escalar es 0, y suele
escribirse u ⊥ v ⇐⇒
u, v = 0. Y se dice que un subconjunto de V es ortogonal si son
ortogonales cada par de elementos diferentes de dicho conjunto.
Si consideramos por ejemplo el intervalo [0, 2π] y las funciones en (x) = einx para n ∈ ZZ
es fácil comprobar que el conjunto de funciones {en : n ∈ ZZ} es un conjunto ortogonal. En
efecto, si n = m:
2π 2π 2π 2π
inx −imx ei(n−m)x
en , em = einx eimx dx = e e dx = i(n−m)x
e dx =
0 0 0 n−m 0
i(n−m)2π
e − e0 1−1
= = = 0.
n−m n−m
Observemos además que todas estas funciones en son periódicas de perı́odo 2π ya que
en (x + 2π) = ein(x+2π) = einx · e2πni = einx · 1 = einx = en (x).
Supongamos que tenemos otra función periódica de perı́odo 2π con valores complejos,
f : [a, b] −→ C
I , siendo [a, b] el intervalo [0, 2π] o bien [−π, π]. Nos preguntamos si podremos
escribir
∞
f(x) = cn einx (2)
−∞
para todo x, o sea si f puede ser el lı́mite de unos determinados “polinomios trigonométri-
cos”. La respuesta positiva a dicha pregunta no se puede sin embargo garantizar en todos
los casos, como veremos un poco más adelante.
Denominaremos serie de Fourier a una serie que se obtiene tomando, en el problema
general del análisis armónico que acabamos de ver, las funciones {einx : n ∈ ZZ} como
caracterı́sticas elementales para representar a otras funciones (que deberán ser periódicas
como las en ).
9
Vamos a proceder ahora a calcular el espectro, o sea los coeficientes (cn ) tales que
∞
f(x) = cn einx
−∞
para todo todo x ∈ [−π, π]. Supongamos además que la convergencia de la serie anterior
permite intercambiar los signos de integral y de sumatorio. De esta forma, basándonos en
la ortogonalidad de las funciones elegidas, al hacer el producto escalar de la función f con
cada una de las caracterı́sticas elementales iremos obteniendo los coeficientes:
Para calcular el coeficiente ck basta hacer
f, ek :
π π
∞
∞
π
−ikx inx −ikx
f(x)e dx = cn e e dx = cn ei(n−k)x dx
−π −π n=−∞ n=−∞ −π
π π
= ck e0 dx + cn ei(n−k)x dx = ck · 2π
−π n=k −π
2.2. Definición.
Dada una función f integrable en [−π, π], se define la serie de Fourier de f como
∞
SF (f) = cn einx
n=−∞
siendo π
1
cn = f(x)e−inx dx
2π −π
2.3. Teorema. Sea f una función 2π-periódica y derivable a trozos. Entonces para cada
x ∈ IR las sumas parciales de la serie de Fourier de f convergen a
1
f(x+ ) + f(x− ) .
2
Si f es continua en el punto x, entonces convergen a f(x).
10
2.4. Series de Fourier en senos y cosenos.
Si f es una función periódica de perı́odo 2π y con valores reales, puede resultar más
apropiado escribir f como una suma (infinita) de combinaciones lineales senos y cosenos,
en lugar de acudir a las exponenciales complejas.
Esto puede conseguirse transformando la suma de serie de Fourier de f en dos sumas,
correspondientes una a los términos “positivos” y otra a los “negativos”, y teniendo en
cuenta que einx = cos(nx) + i sen(nx) para todo x. El desarrollo en serie de Fourier de f
quedarı́a entonces del siguiente modo:
∞
∞
inx
SF (f) = cn e inx
= c0 + cn e + c−n e−inx
n=−∞ n=1
∞
= c0 + cn cos(nx) + cn i sen(nx) + c−n cos(nx) − c−ni sen(nx)
n=1
∞
= c0 + (cn + c−n) cos(nx) + i(cn − c−n ) sen(nx) .
n=1
Nota. Observemos que tal como hemos definido los coeficientes an y bn , éstos pueden
obtenerse de la siguiente forma:
π π
1 −inx 1
an = cn + c−n = f(x)e dx + f(x)einx dx
2π −π 2π −π
π π
1 −inx 1
= f(x) e +e inx
dx = f(x) · 2 cos(nx) dx
2π −π 2π −π
1 π
= f(x) cos(nx) dx
π −π
mientras que
π π
1 −inx 1
bn = i(cn − c−n) = i f(x)e dx − i f(x)einx dx
2π −π 2π −π
π π
1 −inx 1
= f(x) · i e −e inx
dx = f(x) · i(−2i) sen(nx) dx
2π −π 2π −π
1 π
= f(x) sen(nx) dx.
π −π
11
donde π π
1 1
an = f(x) cos nx dx y bn = f(x) sen nx dx
π −π π −π
para todo n ≥ 0.
Obsérvese que, tal como hemos deducido al obtener la serie de Fourier en senos y
cosenos de una función f, se verifica que SF (f) = SF SC(f) cuando una de ellas converge.
Incluso se da la igualdad entre las sumas parciales de ambas series, es decir
N
a0
N
inx
cn e = + an cos nx + bn sen nx
2 n=1
n=−N
para todo N ∈ IN .
2.5. Ejemplo: Vamos a obtener la serie de Fourier para la función f(x) = x (definida en
el intervalo [−π, π] y extendida por periodicidad.
π π
1 1 2
an = x cos nx dx = 0 bn = x sen nx dx = (−1)n
π −π π −π n
Luego la serie es
∞
2
SF (f) = (−1)n+1 sin(nx)
n=1
n
donde
l l
2 2nπx 2 2nπx
an = f(x) cos dx y bn = f(x) sen dx
l 0 l l 0 l
para todo n ≥ 0. Nosotros sin embargo trabajaremos siempre con funciones periódicas de
perı́odo 2π.
12
Consideremos la función f de perı́odo 2π cuyos valores en el intervalo (−π, π] son
−1 si − π < x < 0
f(x) = 1 si 0 < x < π
0 si x = 0, π.
Su gráfica es una “onda cuadrada” (ver figura 2). Teniendo en cuenta el teorema 2.3, se
verifica que la serie de Fourier de f converge a la función en todo punto. Calculando la
serie de Fourier en senos y cosenos de f se tiene por tanto que
∞
4 sen(2n − 1)x
f(x) =
π n=1 2n − 1
13
Figura 3. Suma parcial con 10 sumandos.
Llamemos Sn (x) a la suma parcial n-ésima de la serie de Fourier de f, es decir
a0
n n
sin((2 ∗ k − 1)x)
Sn (x) = + ak cos(kx) + bk sen(kx) =
2 2∗k−1
k=1 k=1
(en las figuras 3 y 4 pueden verse las gráficas de S10 y S50 ). Se puede comprobar que en el
intervalo (0, π) la función Sn tiene puntos crı́ticos en xm = mπn , m = 1, 2 . . . , n − 1, que son
máximos locales si m es impar y mı́nimos locales si m es par. Además el máximo absoluto
se alcanza en πn y
π
2 π sen t
lim Sn = dt ≈ 1 179.
n→∞ n π 0 t
Es decir, a pesar de que f tiene un salto de longitud 2 en el origen y que Sn(x) converge a
f(x) para todo punto x, las gráficas de Sn tienden a aproximarse a un segmento vertical
de longitud aproximadamente igual a 2 · 1 179 = 2 358.
14
Para no complicar la notación, llamaremos de igual forma, f, a la función original y a su
discretización.
Vamos a considerar ahora la “serie de Fourier” de la función f discretizada. Puesto
que sólo tenemos una cantidad finita de puntos, parece lógico pensar que ahora la repre-
sentación de f se consiga con una combinación lineal finita (con igual número de sumandos
que la cantidad de puntos elegida) de funciones exponenciales complejas, o sea
n−1
f(x) ≈ Ak eikx .
k=0
Ahora bien, si tenemos en cuenta que sólo conocemos los valores de f en los puntos
xj , j = 0, 1, . . . , n − 1, deberá ser
n−1
2πj
f(xj ) = f = Ak e2πijk/n , j = 0, . . . n − 1,
n
k=0
n−1
f(xj ) = Ak wjk , j = 0, . . . n − 1,
k=0
Para determinar los coeficientes Ak , por similitud a como lo hacı́amos con las series
de Fourier, basta tener en cuenta la “ortogonalidad” de la funciones e2πijk/n : en concreto,
para calcular Am multiplicamos la anterior igualdad por e−2πijm/n = w−jm , obteniéndose
n−1
−jm
f(xj )w = Ak wj(k−m) , j = 0, . . . n − 1.
k=0
n−1 j
Ahora, si k = m, wk−m es una raı́z de la unidad distinta de 1, luego wk−m = 0,
j=0
mientras que para k = m la suma vale 1 + 1 + · · · + 1 = n. Entonces
n−1
f(xj )w−jm = nAm
j=0
y se concluye que
1 1
n−1 n−1
−jm
Am = f(xj )w = f(xj )e−2πijm/n , m = 0, . . . n − 1,
n n
j=0 j=0
15
de donde se deduce la siguiente definición:
3.1. Definición.
Sea f : {0, 1, . . . , n−1} −→ C
I una aplicación tal que f(j) = aj para todo j = 0, 1, . . . n−1.
Se llama transformada discreta de Fourier de f a la función fˆ : {0, 1, . . . , n − 1} −→ C I
ˆ
dada por f (j) = Aj , j = 0, 1, . . . n − 1, de modo que
n−1
aj = Ak e2πijk/n , j = 0, . . . n − 1, (3)
k=0
1
n−1
Ak = aj e−2πijk/n , k = 0, . . . n − 1. (4)
n j=0
Puesto que las funciones toman solamente una cantidad finita, n, de valores en unos
puntos prefijados, se pueden colocar dichos valores en una lista y definir entonces la trans-
formada discreta de Fourier de una lista de la forma siguiente:
3.2. Definición.
Sea [a0 , a1 , . . . , an−1 ] una lista de n números complejos. Se define la transformada discreta
de Fourier de dicha lista como otra lista [A1 , A2 , . . . , An−1 ] cuyos valores vienen dados por
la fórmula (4). Escribiremos entonces que
3.3. Observaciones.
(1) Si observamos con detenimiento la fórmula de la transformada discreta de Fourier:
1 1 2π
n−1 n−1
−2πijk/n 2π
Ak = aj e = f j e−2πijk/n
n 2π n n
j=0 j=0
se puede ver que no es más que una suma de Riemann, correspondiente a la partición
{2πj/n : j = 0, 1, . . . , n} del intervalo [0, 2π], de la integral
2π
1
f(x)e−ikx dx,
2π 0
16
que es exactamente el coeficiente ck de la serie de Fourier de la función f en forma
exponencial compleja.
(2) Las fórmulas de la transformada discreta de Fourier y su inversa son, como puede
comprobarse, bastante similares. De hecho, una misma fórmula puede servir para
ambas transformaciones, sin más que tener en cuenta que el conjugado de e2πijk/n es
e−2πijk/n . Concretamente se tiene que
[A0 , A1 , . . . , An−1 ] = T DF ([a0 , a1 , . . . , an−1 ])
1
⇐⇒ [A0 , A1 , . . . , An−1 ] = T DF I([a0 , a1 , . . . , an−1 ]).
n
3.4. Ejemplo: Si consideramos la lista l = [0, 6, −5, 1], es fácil comprobar, con ayuda de
Maple por ejemplo, que T DF I(l) = [2, 5 − 5i, −12, 5 + 5i] = l .
Si ahora aplicamos la función inversa, obtendremos evidentemente que T DF (l ) = l.
Por otra parte, si en la lista l tomamos conjugados y aplicamos T DF I obtendremos:
T DF I([2, 5 + 5i, −12, 5 − 5i]) = [0, 24, −20, 4]. Dividiendo por 4 en esta lista se llega de
nuevo a la lista l (no es necesario volver a tomar conjugados porque los elementos de l son
números reales). De esta forma se comprueba lo que hemos comentado en la observación
3.3 (2).
Habitualmente, los polinomios se dan por medio de los coeficientes, pero a nosotros
nos interesan sus valores en unos determinados puntos, por lo que necesitamos una forma
eficiente de pasar de una representación a otra.
n−1
n−1
P (wj ) = ak wjk = ak e2πijk/n
k=0 k=0
que como se puede observar consiste en aplicar la transformada de Fourier discreta inversa
a la lista [a0 , a1 , . . . , an−1 ].
Para evaluar un polinomio se puede hacer directamente, o bien mediante el esquema de
Horner, pero en ambos casos el coste es demasiado elevado (al menos O(n2 )). Vamos a ver
que se puede conseguir, mediante un algoritmo del tipo “divide y vencerás”, la evaluación
del polinomio en las raı́ces n-ésimas complejas de la unidad con un coste de n log n.
18
Hagámoslo primero en un caso particular para hacernos una idea de la técnica general:
tomemos n = 4, es decir un polinomio de grado 3,
P (x) = a0 + a1 x + a2 x2 + a3 x3 ,
a0 + a2 a1 + a3
2
a0 + a2 i a1 + a3 i2
y después multiplicar los sumandos impares por ij y sumarles los pares, es decir:
n−1
2 n−1
f(wj ) = ak wjk = a0 + a1 wj + a2 (wj ) + · · · + an−1 (wj )
k=0
19
para j = 0, 1, . . . , n − 1. Separemos la suma en dos sumandos, colocando por un lado los
términos de subı́ndice par y por otro los de subı́ndice impar:
n/2−1
n/2−1
f(wj ) = a2m wj2m + a2m+1 wj2m+1
m=0 m=0
n/2−1
n/2−1
= a2m (wj2 )m + wj a2m+1 (wj2 )m .
m=0 m=0
Observemos que:
• Los coeficientes de la primera suma son [a0 , a2 , . . . , an−2 ].
• Los coeficientes de la segunda suma son [a1 , a3 , . . . , an−1 ].
• Por ser n potencia de 2, wj2 , j = 0, 1, . . . n/2 − 1, son precisamente las raı́ces de orden
n/2 de la unidad.
• Las potencias de ambas sumas son las mismas, y se trata de la potencia j-ésima de las
raı́ces complejas de la unidad de orden n/2 = 2r−1 .
El problema se reduce pues a la evaluación de dos polinomios, de grado n/2 − 1, en las
raı́ces n/2-ésimas de la unidad.
donde Q1 y Q2 son las dos sumas en que ha quedado descompuesta la evaluación f(wj ),
que como hemos visto son sendos polinomios de grado n/2 − 1. Puesto que sólo hay
n/2 raı́ces n/2-ésimas de la unidad, con la evaluación de dichos polinomios obtendremos
solamente los valores f(wj ) para j = 0, 1, . . . , n/2 − 1. Para la obtención de f(wj ) con
n/2 ≤ j ≤ n − 1 hay que tener en cuenta lo siguiente:
n/2−1
n/2−1
m
Q1 (j) = a2m (wj2 )m = a2m (wj−n/2 )2
m=0 m=0
ya que (wj−n/2 )2m = e2πi(j−n/2)2m/n = e2πij2m/n e−2πim = (wj )2m · 1 = (wj )2m . Por lo
tanto Q1 (j − n/2) = Q1 (j).
Análogamente se prueba que Q2 (j − n/2) = Q2 (j) si n/2 ≤ j ≤ n − 1, con lo que se
obtiene que
f(wj ) = Q1 (j − n/2) + wj Q2 (j − n/2)
para j = n/2, . . . , n − 1. Si además tenemos en cuenta que wj = −wj+n/2 , se concluye que
20
para todo j = 0, 1, . . . , n/2 − 1, siendo Q1 (j) y Q2 (j) el resultado de evaluar sendos
polinomios de grado n/2 − 1 en las raı́ces n/2-ésimas de la unidad, wj2 , concretamente:
n/2−1
n/2−1
Q1 (j) = a2m (wj2 )m , Q2 (j) = a2m+1 (wj2 )m .
m=0 m=0
entrada:
n → número entero, potencia de 2.
a → lista de n números complejos, a := [a[0], . . . , a[n − 1]]
si n = 1, entonces A[0] := a[0]
en otro caso
listapares := [a[0], a[2], . . . , a[n − 2]]
listaimpares := [a[1], a[3], . . . , a[n − 1]]
u := IF F T (n/2, listapares)
v := IF F T (n/2, listaimpares)
para j desde 0 hasta n/2 − 1 hacer
A[j] := u[j] + exp(2πij/n) · v[j]
A[j + n/2] := u[j] − exp(2πij/n) · v[j]
salida:
IF F T (n, a) := [A[0], A[1], . . . , A[n − 1]].
4.7. Ejemplo: Vamos a aplicar el algoritmo IF F T para n = 4 y la lista [0, 6, −5, 1].
listapares := [0, −5], listaimpares := [6, 1].
Calculamos IF F T (2, [0, −5]):
listapares := [0], listaimpares := [−5]
IF F T (1, [0]) := [0], IF F T (1, [−5]) := [−5],
u := [0], v := [−5].
Para j = 0, A[0] := u[0] + e0 v[0] = −5 y A[1] := u[0] − v[0] = 5.
Luego IF F T (2, [0, −5]) := [−5, 5]. Y por lo tanto u := [−5, 5]
Calculamos ahora IF F T (2, [6, 1]):
listapares := [6], listaimpares := [1]
IF F T (1, [6]) := [6], IF F T (1, [1]) := [1],
u := [6], v := [1].
Para j = 0, A[0] := u[0] + v[0] = 7 y A[1] := u[0] − v[0] = 5.
Luego IF F T (2, [6, 1]) := [7, 5]. Y por lo tanto v := [7, 5]
21
Y calculamos finalmente los valores de la lista de salida:
Para j = 0, A[0] := u[0] + v[0] = −5 + 7 = 2 y A[2] := u[0] − v[0] = −5 − 7 = −12.
Para j = 1, A[1] := u[1] + e2πi/4 · v[1] = 5 + 5i y A[3] := u[1] − e2πi/4 · v[1] = 5 − 5i.
Salida: IF F T := [2, 5 + 5i, −12, 5 − 5i].
22
Es decir, hay que hacer la transformada discreta de Fourier de la lista [A0 , A1 , . . . , An−1 ].
Por lo tanto será
1
n−1
ak = Aj e−2πijk/n , k = 0, . . . n − 1.
n
j=0
para todo k = 0, 1, . . . n − 1.
Si tenemos en cuenta la obervación 3.3 (2), para calcular [a0 , a1 , . . . , an−1 ] basta aplicar
el algoritmo IF F T a la lista [A0 , A1 , . . . , An−1 ], y en los elementos de la lista obtenida
hacer conjugados y dividir por n.
23
4.12. Observaciones.
(1) La implementación del algoritmo de la multiplicación rápida de polinomios, o del
IF F T , en determinados lenguajes de programación suele comenzar con la reordenación
de la lista de los coeficientes de entrada. Para ello se suele usar el método llamado del
“bit inverso” (consultar [6] por ejemplo). Pero en Maple no es necesario hacer nada de
eso, pues el acceso a los elementos de una lista l se puede hacer con la instrucción l[i],
y no es más fácil acceder al primer elemento que a cualquier otro.
(2) Si los coeficientes de los polinomios f y g de entrada son reales (cosa bastante fre-
cuente), se puede aplicar el algoritmo IF F T simultáneamente a las listas de sus res-
pectivos coeficientes, de la siguiente forma: sean [x0 , x1 , . . . , xn−1 ], [y0 , y1 , . . . , yn−1 ]
con xj , yj ∈ IR, y sea zj = xj + iyj para j = 0, 1, . . . , n − 1. Supongamos que
1 1
Xk = Zk + Zn−k Yk = Zk − Zn−k
2 2i
24
Evidentemente, si n es un número primo, el método no sirve pues no se puede descom-
poner. En tal caso, no quedará más remedio que hacer la evaluación directamente (o con
ayuda del esquema de Horner).
Sea pues f un polinomio de grado n − 1, con n = r1 · r2 . Entonces todo entero s,
0 ≤ s ≤ n − 1, se puede escribir de manera única de la forma s = tr1 + k con 0 ≤ t ≤ r2 − 1
y 0 ≤ k ≤ r1 − 1. Sea wn = e2πi/n . Las raı́ces n-ésimas complejas de la unidad serán
entonces wnj , para j = 0, 1, . . . , n − 1. La evaluación en ellas de f será:
n−1 1 −1 r
r 2 −1
Ahora bien, wnjtr1 = e2πijtr1 /n = e2πijt/r2 , que es una raı́z r2 -ésima de la unidad, y que
podemos escribir wrjt2 . Tenemos ası́ que
r −1
1 −1
r 2 1 −1
r
f(wnj ) = atr1 +k wrjt2 wnjk = ck (j)wnjk
k=0 t=0 k=0
r
2 −1
donde ck (j) = atr1 +k wrjt2 para 0 ≤ k ≤ r1 − 1 y 0 ≤ j ≤ n − 1, que es la evaluación
t=0
de un polinomio de grado r2 − 1 en las raı́ces r2 -ésimas de la unidad, por lo que se puede
calcular aplicando el mismo procedimiento de manera recursiva. Además, para cada k fijo,
se tiene que ck (j + r2 ) = ck (j). Luego basta calcular ck (j) para j = 0, 1, . . . , r2 − 1 y se
tendrá para todo j = 0, 1, . . . , n − 1.
Veamos ya cómo es el algoritmo de Cooley-Tukey para una lista con una cantidad
arbitraria de elementos:
entrada:
n → número entero
a → lista de n números complejos, a := [a[0], . . . , a[n − 1]]
si n es primo entonces
para j desde 0 hasta n − 1 hacer
n−1
A[j] := a[k]wnjk
k=0
en otro caso
descomponer n = r1 · r2 (# luego veremos cómo hacerlo)
para k desde 0 hasta r1 − 1 hacer
ck := IF F T (r2 , [ak , ar1 +k , . . . , a(r2 −1)r1 +k ])
para j desde 0 hasta n − 1 hacer
25
r
1 −1
A[j] := ck [j mod r2 ]wnkj
k=0
salida:
IF F T (n, a) := [A[0], A[1], . . . , A[n − 1]].
4.15. Complejidad.
Vamos a estudiar la complejidad del algoritmo general de Cooley-Tukey, y al igual que
lo hemos hecho antes, lo haremos contando el número de multiplicaciones complejas que
requiere para n datos de entrada.
Llamemos g(n) a dicho número. Si descomponemos n = r1 · r2 , para cada k fijo
calculamos los r2 valores de ck (j), y como aplicamos el mismo algoritmo para calcular
cada ck , y k toma r1 valores distintos, serán necesarias r1 g(r2 ) multiplicaciones. Una vez
obtenidos los ck (j), el cálculo de cada f(wnj ) requiere r1 − 1 productos más. Como hay
que calcular n = r1 r2 valores, serán r1 r2 (r1 − 1) productos. Es decir
1 p1 · · · ps es la
En general se verifica (aunque no es fácil de probar) que si n = pα 1 α1 αs
26
4.17. Teorema. La mejor elección de la factorización n = r1 · r2 para que el algoritmo
IF F T tenga complejidad mı́nima es tomar r1 un divisor primo de n.
En tal caso, el número de multiplicaciones complejas es
g(n) = n α1 (p1 − 1) + α2 (p2 − 1) + · · · + αs (ps − 1) ,
n g(n) n2
2 2 4
4 8 16
6 18 36
8 24 64
10 50 100
16 64 256
20 120 400
25 200 625
32 160 1 024
50 450 2 500
100 1 000 10 000
256 2 048 65 536
500 7 000 250 000
512 4 608 262 144
1 000 15 000 1 000 000
1 024 10 240 1 048 576
2 000 32 000 4 000 000
5 000 95 000 25 000 000
10 000 200 000 100 000 000
1 000 000 30 000 000 1 000 000 000 000
5.1. Definición.
Un elemento w de un cuerpo F se dice que es una raı́z n-ésima primitiva de la unidad si
wn = 1 y wk = 1 para todo k = 1, 2, . . . , n − 1.
28
Por lo tanto, en el algoritmo de la transformada rápida de Fourier se puede sustituir
la raı́z n-ésima compleja de la unidad e2πi/n por w.
Si además trabajamos en un cuerpo ZZp con p primo, tenemos la ventaja de que al ser
un cuerpo finito, la cantidad de elementos a utilizar es limitada, y por muy complicadas
que sean las operaciones a realizar siempre el resultado ha de ser uno de los elementos
del cuerpo. Por otra parte, Maple tiene capacidades más que suficientes para trabajar
con aritmética modular, por lo que no habrá que complicar apenas los algoritmos o los
procedimientos que hemos usado para trabajar en C I .
Si tenemos el cuerpo ZZp en el que hemos de trabajar y la raı́z n-esima primitiva de la
unidad, w, el algoritmo, para el caso de que n sea potencia de 2, serı́a
entrada:
n → número entero, potencia de 2.
a → lista de n números complejos, a := [a[0], . . . , a[n − 1]].
p → número entero (primo).
w → número entero (raı́z n-ésima primitiva de la unidad en ZZp ).
si n = 1, entonces A[0] := a[0]
en otro caso
listapares := [a[0], a[2], . . . , a[n − 2]]
listaimpares := [a[1], a[3], . . . , a[n − 1]]
u := IF F T (n/2, listapares, p, w2 )
v := IF F T (n/2, listaimpares, p, w2 )
para j desde 0 hasta n/2 − 1 hacer
A[j] := u[j] + wj · v[j] mod p
A[j + n/2] := u[j] − wj · v[j] mod p
salida:
IF F T (n, a, p, w) := [A[0], A[1], . . . , A[n − 1]].
Lo que sı́ puede significar un problema es el encontrar el cuerpo donde trabajar, y una
raı́z primitiva w de ese cuerpo. Nos puede servir de utilidad para ello el siguiente resultado,
que se puede encontrar en [8].
5.3. Teorema. El cuerpo finito ZZp tiene una raı́z n-ésima primitiva de 1 si y sólo si p − 1
es múltiplo de n.
Por ejemplo, 41 es un número primo, por lo que ZZ41 es un cuerpo y en ZZ41 existen
raı́ces octavas primitivas de la unidad, ya que 40 es múltiplo de 8. Para obtener un raı́z
primitiva de orden 8, podemos ayudarnos de Maple, pidiéndole, por ejemplo, que calcule
las potencias s8 (módulo 41) para 0 ≤ s ≤ 20. Para aqellos s que verifiquen la ecuación
s8 = 1, se pide la secuencia sj para j = 1..7, y nos quedamos con el primer s tal que en
29
dicha secuencia no aparezca el 1. En este caso se puede comprobar que 14 es una raı́z
octava primitiva de 1 en ZZ41 .
Veamos con un ejemplo concreto cómo se pueden multiplicar dos polinomios con ayuda
de la aritmética modular.
Evaluamos los polinomios en las raı́ces de la unidad {1, 14, 142 , . . . , 147 } (en ZZ41 ),
obteniéndose respectivamente
A := [9, 39, 32, 40, 36, 27, 9, 21] B := [8, 25, 12, 37, 6, 31, 35, 9].
5.5. Observaciones.
(1) Si los coeficientes de los polinomios dados son enteros pero no todos positivos, también
se puede hacer su producto utilizando el algoritmo de la transformada rápida de Fourier
con aritmética modular. Basta tomar un primo p suficientemente grande que nos
permita asegurar que los elementos mayores que (p − 1)/2 corresponden a coeficientes
negativos, por lo que habrı́a que restarles p en la solución final.
(2) Para aplicar el algoritmo de la transformada rápida de Fourier con aritmética modular
no es estrictamente necesario que p sea primo, y por lo tanto ZZp un cuerpo. Se puede
trabajar con un anillo ZZm con unas ciertas condiciones (en [2] se pueden encontrar
esas codiciones, ası́ como una forma de encontrar un m que las cumpla y una raı́z de
la unidad adecuada en ZZm ).
30
La idea del método en cuestión consiste en representar un número entero dado (en
una cierta base b) por medio de un polinomio p de manera que p(b) sea precisamente el
número dado. De esta forma, para multiplicar dos números se multiplican los polinomios
correspondientes (con ayuda de la transformada rápida de Fourier) y después se obtiene
el valor del polinomio producto en b. Ése será exactamente el producto de los números
dados.
Para conocer más detalles sobre este método se puede consultar [2].
31
BIBLIOGRAFÍA
32