Multiplicación en

10

Estaba buscando aquí y noté que el mejor tiempo de ejecución para la multiplicación de dos números de bits es O ( n log n 2 O ( log n ) , pero puedo notar fácilmente un algoritmo que se ejecuta en O ( n log n ) .nO(nlogn2O(logn)O(nlogn)

Después de todo, sabemos cómo multiplicar dos polinomios de grado en tiempo de ejecución O ( n log n ) . Pero multiplicar polinomios es lo mismo que multiplicar dos números de n bits. Entonces tenemos un algoritmo para multiplicar dos números de n bits en O ( n log n ) . Ahora, el único problema que puede ocurrir es el carry, pero en cada fase podemos solucionarlo en el tiempo O ( n ) , simplemente moviéndonos en el bit más correcto y su vecino izquierdo, hasta el final. Es decir, nuestro tiempo de ejecución seguirá siendo O ( n log nnO(nlogn)nnO(nlogn)O(n) .O(nlogn)

Entonces, ¿hice un descubrimiento nuevo (y bastante obvio)? ¿O la página de Wikipedia está desactualizada? ¿O tal vez tengo algún error?

TheEmeritus
fuente
¿Cuál es la forma en que "sabemos" "multiplicar dos polinomios de grado en tiempo de ejecución O ( n log n ) "?nO(nlogn)

Respuestas:

8

Como @DavidRicherby ya señala, la confusión surge porque se mezclan diferentes medidas de complejidad. Pero déjame explicar un poco.

Por lo general, cuando se estudian algoritmos para la multiplicación polinómica sobre anillos arbitrarios, uno está interesado en la cantidad de operaciones aritméticas en el anillo que usa un algoritmo. En particular, dado un anillo (conmutativo, unitario) y dos polinomios f , g R [ X ] de grado menor que n , el algoritmo de Schönhage-Strassen necesita multiplicaciones y adiciones O ( n log n log log n ) en R para calcular f g R [ X ]Rf,gR[X]nO(nlognloglogn)RfgR[X]por, más o menos, contiguo raíces primitivas -ésimos de unidad a R para conseguir algo de anillo más grande D R y luego, utilizando la transformada rápida de Fourier sobre D , calculando el producto en D .nRDRDD

Si su anillo contiene un raíz-ésima de la unidad, entonces esto puede ser acelerado a O ( n log n ) las operaciones en R mediante el uso de la transformada rápida de Fourier directamente sobre R . Más específicamente, sobre ZC , puede hacer esto usando operaciones de anillo O ( n log n ) (ignorando el hecho de que esto requeriría una aritmética exacta sobre los números complejos).nO(nlogn)RRZCO(nlogn)

La otra medida que se puede tener en cuenta es la complejidad de bits de una operación. Y esto es lo que nos interesa al multiplicar dos enteros de longitud de bits . Aquí, las operaciones primitivas se multiplican y agregan dos dígitos (con carry). Entonces, al multiplicar dos polinomios sobre Z , en realidad debe tener en cuenta el hecho de que los números que surgen durante el cálculo no se pueden multiplicar utilizando un número constante de operaciones primitivas. Esto y el hecho de que Z no tiene un n -ésima raíz primitiva de la unidad para n > 2 le impide appling la O ( n log n )nZZnn>2O(nlogn)algoritmo. A superar este considerando con coeficientes del anillo Z /2 n + 1 , ya que los coeficientes del polinomio producto no superará este unido. Hay (cuando n es una potencia de dos), que tiene (la clase de congruencia) 2 como n raíz ésima de la unidad, y mediante la llamada recursiva del algoritmo para la multiplicación de los coeficientes, se puede lograr un total de O ( n log n log log n ) (es decir, bit) operaciones primitivas. Esto luego se traslada a la multiplicación entera.f,gZ/2n+1n2nO(nlognloglogn)

f=i=0nfiXixZ

f(x)=((fnx+fn1)x++)+f0
f
H=i=1n/2fn/2+iXi
L=i=0n/2fiXi
H>n/2Ln/2n es un poder de dos, por simplicidad).

f(x)

f(x)=H(x)xn/2+L(x)

nn+logn

n/2n/2Ω(n2)nO(n)O(nlogcn)=O~(n)c>0

Marca Cornelius
fuente
9

nO(nlogn)nO(2lognnlogn)nO(nlogn)

David Richerby
fuente
55
No creo que este sea ​​el problema. Si pensamos en números como polinomios cuyos "x" es la base, por ejemplo 2, a continuación, típicamente que puede multiplicar grados-cero polinomios (números más pequeños que la base) en el tiempo constante. Supongo que el problema es que el algoritmo O (n * log n) usa FFT y pueden surgir números asintóticamente más grandes dentro del algoritmo FFT.
jkff