Transformada rápida de Fourier (FFT) para multiplicación polinómica

Cuando todavía tenga FFT, escriba un blog y guárdelo para más tarde. . . . . .

FFT se utiliza para resolver la multiplicación polinómica, luego primero debemos saber qué es el polinomio.

\ [A (x) = a_0 + a_1x ^ 1 + a_2x ^ 2 + ··· + a_ {n-1} x ^ {n-1} \]

Este es un polinomio de n-1 grado (el término más alto es \ (x ^ {n-1} \) ), \ (a_0, a_1, ··· a_ {n-1} \) es el coeficiente de cada elemento, el polinomio Se puede escribir como:

\ [A (x) = \ sum_ {j = 0} ^ {n-1} a_jx ^ j \]

Un polinomio se puede determinar mediante un conjunto de coeficientes, y el vector formado por este conjunto de coeficientes también se denomina vector de coeficiente (como \ (A (x) \) . El vector de coeficiente es: [ \ (a_0 \ \ \ a_1 \ ··· \ a_ {n-1} \) ]), la forma de expresar un polinomio a través del vector de coeficientes se denomina notación de coeficientes

La multiplicación polinómica es que conocemos dos polinomios: \ (A (x), B (x) \) , que son polinomios de grado n-1 y m-1, respectivamente.

\ [A (x) = \ sum_ {j = 0} ^ {n - 1} a_jx ^ j \\ B (x) = \ sum_ {j = 0} ^ {m-1} b_jx ^ j \]

Ahora hable acerca de multiplicar estos dos polinomios para obtener un polinomio de grado n + m-1 más alto:

\ [C (x) = \ sum_ {j = 0} ^ {n + m-1} c_jx ^ j \]

Entonces resolver \ (C (x) \) es encontrar su vector de coeficiente : [ \ (c_0 \ \ c1 \ \ ··· \ \ c_j \ \ ··· \ \ c_n + m-1 \) ]

Si atravesamos cada elemento de \ (A (x), B (x) \) directamente es \ (O (n * m) \) , necesitamos un algoritmo más rápido, que es lo que estamos discutiendo: Fourier rápido Transformar (FFT)

Queso delantero:

Notación de valor de punto

Para un polinomio conocido \ (A (x) \) , sustituya \ (x_0 \) para obtener un \ (y_0 \) definido , y puede pensar en \ ((x_0, y_0) \) como coordenadas Un punto en el empate. Además, cualquier número de variables independientes desiguales se puede sustituir por \ ((x_1, x_2, ···) \) para obtener más puntos: \ ((x_1, y_1), (x_2, y_2), ·· · \)

Sabemos que a través de dos (diferentes) puntos, el polinomio de primer grado se puede analizar \ ((ax + b) \) , y a través de tres puntos diferentes se puede analizar el polinomio de segundo orden \ ((ax ^ 2 + bx + c) \) , Por lo tanto, se puede deducir que los polinomios n + 1 se pueden resolver a través de n + 1 puntos diferentes

A través de n + 1 puntos diferentes \ (\ left \ {(x_1, y_1), (x_2, y_2), ··· \ right \} \) , determina de forma única un polinomio de grado n, este método también se llama punto polinómico Notación de valor

¡Nos sorprendió descubrir que la multiplicación de dos polinomios representados por valores de puntos tiene una complejidad de \ (O (n) \) ! Método específico: \ (C (x_i) = A (x_i) × B (x_i) \) , por lo que O \ ((n) \) enumeration \ (x_i \) es suficiente.

Si convertimos dos polinomios en representaciones de valor de punto, luego multiplicamos y luego convertimos las nuevas representaciones de valor de punto en polinomios, ¿no sería posible \ (O (n) \) resolver la multiplicación polinómica!

... Desafortunadamente, obviamente, el algoritmo ingenuo que convierte los polinomios en representaciones de valores puntuales es \ (O (n ^ 2) \) . Además, incluso si no lo hace, el simple "algoritmo de interpolación" que convierte las representaciones de valores de puntos en polinomios también es \ (O (n ^ 2) \) .

Pero se pueden encontrar los cuellos de botella de gran complejidad multiplicación de enteros puede ser "convertida en un valor de punto polinomio representa" Este paso (y la operación inversa), siempre y cuando esto se hace se puede \ (O (n) \) en busca de respuestas. Si solo este paso se puede optimizar.

Entonces presenté otros dos quesos delanteros

Transformada de Fourier discreta (DFT) y Transformada de Fourier discreta inversa (IDFT), la fórmula es la siguiente:

\ [X_k = \ sum_ {j = 0} ^ {n-1} x_je ^ {\ frac {2 \ pi i} {n} kj} (DFT) \\ X_j = \ frac {1} {n} \ sum_ {k = 0} ^ {n-1} X_ke ^ {\ frac {-2 \ pi i} {n} jk} (IDFT) \]

En las dos fórmulas anteriores, \ (i \) es la raíz imaginaria ( \ (i ^ 2 = -1 \) ), y la prueba de estas dos fórmulas se dará al final del artículo.

Establecemos algunas variables y sustituimos estas dos fórmulas en nuestro problema anterior.

Supongamos: \ (w = e ^ {\ frac {2 \ pi i} {N}} \) , donde \ (N = n + m \) , la naturaleza de la variable \ (w \) no se discutirá primero, y se discutirá más adelante Si otra vez

\ [c_j = f (j), C_k = C (w ^ k) \]

Sustituyendo estas variables en la fórmula DFT se obtiene:

\ [C_k = C (w ^ k) = \ sum_ {j = 0} ^ {N-1} c_j (w ^ k) ^ j = \ sum_ {j = 0} ^ {N-1} c_je _ {\ frac {2 \ pi i} {N} kj} \]

De acuerdo con la fórmula anterior, DFT está relacionado con nuestro polinomio objetivo \ (C (x) \) , y naturalmente el coeficiente del polinomio puede calcularse por IDFT \ (c_j \) :

\ [c_j = \ frac {1} {N} \ sum_ {k = 0} ^ {N-1} C_k (w ^ {- j}) ^ k = \ frac {1} {N} \ sum_ {k = 0} ^ {N-1} C_ke ^ {- \ frac {2 \ pi i} {N} jk} \]

Sin embargo, dado que no sé el valor específico de \ (c_j \) (si lo sé, terminaré la floración), no puedo usar DFT para calcular \ (C (w ^ k) \)

Sin embargo, sabemos: \ (C (x) = A (x) * B (x) \) , y los coeficientes del polinomio \ (A (x) B (x) \) son conocidos, por lo que podemos "curvar para salvar al país ":

\ [C (w ^ k) = A (w ^ k) * B (w ^ k) \]

Use esta fórmula para calcular \ (C (w ^ k) \) , y luego use IDFT para calcular \ (c_j \) .

Lo anterior es un resumen de FFT, la siguiente discusión

Un queso: N veces unidad de raíz

Discusión Con el fin de mejor \ (^ W = E {\ frac {2 \ I PI {N}}} \) , que a partir de la fórmula de Euler Hablando

\ [e ^ {i \ theta} = \ cos \ theta + i \ sin \ theta \]

La prueba de la fórmula también se da al final del artículo.

\ (e ^ {i \ theta} \) es un número complejo, el valor de su parte real es \ (\ cos \ theta \) y el valor de la parte imaginaria es \ (\ sin \ theta \) , entonces, \ (e ^ {i \ theta} \) correspondiente al plano complejo de una distancia entre el punto de origen es una constante, como se muestra en

Como \ (\ sin \ theta, \ cos \ theta \) es una función periódica (el período es \ (2 \ pi \) ), se puede concluir que:

\ [e ^ {i (\ theta + 2 \ pi) = e ^ {i \ theta}} \]

Y no importa qué valor tome \ (\ theta \) , \ (e ^ {i \ theta} \) se distribuye en el círculo unitario del plano complejo. Dado que es un elemento unitario, \ (\ theta \) es igual a Es la longitud del arco en el círculo desde 1 (punto de partida) hasta \ (e ^ {i \ theta} \) .

La fórmula de Euler se presenta brevemente anteriormente, y lo siguiente vuelve a la variable que definimos: \ (w = e ^ {\ frac {2 \ pi i} {n}} \) , por conveniencia en la descripción general anterior, \ (w \) No se agregan subíndices, aquí se agregará una representación más clara a \ (w \) : \ (w_n = e ^ {\ frac {2 \ pi i} {n}} \)

Puede guiarse a partir de la discusión de la fórmula de Euler de superficie, \ (e ^ {2 \ pi i} = 1 \) , que es equivalente a dar la vuelta al círculo unitario y volver al punto de partida, y \ (\ frac {2 \ pi } {n} \) es equivalente a este círculo unitario dividido en \ (n \) divisiones iguales, y \ (w_n ^ k \) corresponde al punto de división igual a \ (k \) en el círculo unitario ( \ (k = 0 , 1,2, ···, n-1 \) )

Este es un ejemplo de \ (n = 18 \) , y dos valores están marcados con \ (\ left \ {w_n ^ k | k = 2,10 \ right \} \) . A través de la discusión anterior y este castaño, debería ser Tengo una comprensión más intuitiva de \ (w_n ^ k \). Dicho esto, debería ser capaz de adivinar la raíz de la enésima unidad para referirme a ella. Acerca de la raíz de la enésima unidad, presento varias propiedades:

\ [1. \ \ w_n ^ {k + \ frac {n} {2}} = e ^ {\ frac {2 \ pi i} {n} (k + \ frac {n} {w})} = e ^ {\ frac {2 \ pi i} {n} k} e ^ {i \ pi} = w_n ^ k (\ cos \ pi + i \ sin \ pi) = - w_n ^ k \\ 2. \ \ w_ {2n} ^ {2k} = w_n ^ k \\ 3. \ \ w_n ^ {- k} = 1 · e ^ {\ frac {i2 \ pi} {n} (- k)} = e ^ {2 \ pi i} e ^ {\ frac {2 \ pi i} { n} (- k)} = e ^ {\ frac {2 \ pi i} {n} (nk)} = w_n ^ {nk} \]

La propiedad 1 es el lema de eliminación , la propiedad 2 es el lema de la mitad , la propiedad 3 Olvidé llamarlo. . .

Cálculo \ (C (w_N ^ k) \)

Primero, defina \ (N = m + n \) (n, m son el número de coeficientes del polinomio \ (A (x), B (x) \) respectivamente). Como se mencionó anteriormente, DFT no puede usarse directamente para calcular \ (C ( w_n ^ k) \) , necesita calcular \ (A (w_N ^ k), B (w_N ^ k) \)

Si el número singular pone directamente \ (\ left \ {w_N ^ k | k = 0,1,2, ···, N-1 \ right \} \) en la generación simple y aproximada, la complejidad temporal sigue siendo \ (O ( N ^ 2) \) , sin tener en cuenta el cálculo de nuevo, no puede reducir la complejidad del algoritmo, debido a que algunos métodos requieren el uso de, para reducir \ (a k) (w_N ^ , B (w_N ^ k) \) tiempo

Por ejemplo, tenemos un polinomio:

\ [H (x) = h_0 + h_1x ^ 1 + h_2x ^ 2 + h_3x ^ 3 \]

Podemos separar sus términos pares e impares:

\ [H (x) = (h_0 + h_2x ^ 2) + (h_1x ^ 1 + h_3x ^ 3) = (h_0 + h_2x ^ 2) + x (h_1 + h_3x ^ 2) \\ = H1 (x ^ 2) + xH2 (x ^ 2) \]

Y \ (H1 (x), H2 (x) \) también se puede calcular de forma recursiva, el método utilizado en \ (A (x), B (x) \) es:

\ [A (x) = A1 (x ^ 2) + xA2 (x ^ 2) B (x) = B1 (x ^ 2) + xB2 (x ^ 2) \]

La complejidad del tiempo se convierte en:

\ [T (n) = 2T (\ frac {n} {2}) + O (n) = O (nlogn) \]

Además, también puede usar las propiedades de la raíz unitaria discutidas anteriormente para reducir la cantidad de cálculo, por ejemplo, \ (0 \ leq k <\ frac {n} {2} \) :

\ [A (w_n ^ k) = A1 (w_n ^ {2k}) + w_n ^ kA2 (w_n ^ {2k}) = A1 (w _ {\ frac {n} {2}} ^ k) + w_n ^ kA2 ( w _ {\ frac {n} {2}} ^ k) \\ A (w_n ^ {k + \ frac {n} {2}}) = A1 (w_n ^ {2k + n}) + w_n ^ {k + \ frac {n} {2}} A2 (w_n ^ {2k + n}) = A1 (w_n ^ {2k}) - w_n ^ kA2 (w_n ^ {2k}) \\ = A1 (w _ {\ frac {n} { 2}} ^ k) -w_n ^ kA2 (w _ {\ frac {n} {2}} ^ k)) \]

De esta manera, el rango de valores generales de \ (k \) se puede calcular para obtener el resultado de todo el rango de valores, por lo que después de calcular \ (A (w_N ^ k), B (w_N ^ k) \) , puede pasar Multiplicación simple para calcular \ (C (w_N ^ k) \) :

\ [C (w_N ^ k) = A (w_N ^ k) B (w_N ^ k), k = 0,1,2, ··· , N-1 \]

Resolver el coeficiente \ (C (x) \)

Este paso de cálculo está casi a la mitad, solo use la fórmula IDFT para resolver los coeficientes de \ (C (x) \) :

\ [c_j = \ frac {1} {N} \ sum_ {k = 0} ^ {N-1} C_ke ^ {- \ frac {2 \ pi i} {N} jk} = \ frac {1} {N } \ sum_ {k = 0} ^ {N-1} C_k (e ^ {- \ frac {2 \ pi i} {N} j}) ^ k = \ frac {1} {N} \ sum_ {k = 0} ^ {N-1} C_k (w_N ^ {- j}) ^ k \]

En la fórmula anterior \ (C_k = C (w_N ^ k) \) , además, para fines de expresión, generalmente se construye un polinomio de N-1 grado \ (D (x) \) , y sus coeficientes son cada uno \ (C_k \ ) Valor:

\ [D (x) = C_0 + C_1x ^ 1 + C_2x ^ 2 + ··· + C_ {N-1} x ^ {N-1} = \ sum_ {k = 0} ^ {N-1} C_kx ^ k \]

Por lo tanto, la fórmula de cálculo final \ (c_j \) se puede escribir como:

\ [c_j = \ frac {1} {N} \ sum_ {k = 0} ^ {N-1} C_k (w_N ^ {- j}) ^ k = \ frac {1} {N} \ sum_ {k = 0} ^ {N-1} C_k (w_N ^ {Nj}) ^ k = \ frac {1} {N} D (w_N ^ {Nj}) \]

La segunda parte de la fórmula anterior usa la propiedad de unidad raíz 3:

\ [c_0 = \ frac {1} {N} D (w_N ^ {N-0}) = \ frac {1} {N} D (w_N ^ N) = \ frac {1} {N} D (w_N ^ 0) \]

Resumen

1. Tome N raíces unitarias: [ \ (w_N ^ 0 \ \ w_N ^ 1 \ \ w_N ^ 2 \ \ ··· \ \ w_N ^ {N-1} \) ]

2. Ellos se sustituyen en el polinomio \ (A (x), B (x) \) en

3. Calcular \ (C (w_N ^ k) = A (w_N ^ k) B (w_N ^ k) \)

4. Construya un nuevo polinomio \ (D (x) = C_0 + C_1x ^ 1 + C_2x ^ 2 + ·· + C_ {N-1} x ^ {N-1} \)

5. Cálculo \ (D (w_N ^ k) \)

6. Calcular el polinomio \ (C (x) \) coeficientes \ (C_J = \ frac {1 } {N} D (w_N ^ {Nj}), j = 0,1,2, ···, N-1 \)

por fin (continuará)

  • Prueba de la fórmula de Euler
  • Certificación DFT e IDTF

Supongo que te gusta

Origin www.cnblogs.com/excellent-zzy/p/12702388.html
Recomendado
Clasificación