Multiplication en


10

Je cherchais ici , et j'ai remarqué que le meilleur temps d'exécution pour la multiplication de deux nombres à bits est , mais je peux facilement remarquer un algorithme qui s'exécute dans .nO(nlogn2O(logn)O(nlogn)

Après tout, nous savons comment multiplier deux polynômes à partir du degré dans l' exécution . Mais multiplier des polynômes revient à multiplier deux nombres à bits. Nous avons donc un algorithme pour multiplier deux nombres à bits dans . Maintenant, le seul problème qui pourrait se produire est le report, mais dans chaque phase, nous pouvons résoudre ce problème en temps , en déplaçant simplement le bit le plus à droite et son voisin gauche, jusqu'à la fin. Autrement dit, notre runtime doit rester .nO(nlogn)nnO(nlogn)O(n)O(nlogn)

Alors ai-je fait une nouvelle découverte (et assez évidente)? Ou la page wikipedia est-elle obsolète? Ou peut-être que j'ai une erreur?


Quelle est la façon dont "nous savons" "de multiplier deux polynômes à partir du degré dans l' exécution "? O ( n log n )nO(nlogn)

Réponses:


8

Comme le souligne déjà @DavidRicherby, la confusion vient du fait que différentes mesures de complexité se mélangent. Mais laissez-moi développer un peu.

Habituellement, lorsque l'on étudie les algorithmes de multiplication polynomiale sur des anneaux arbitraires, on s'intéresse au nombre d'opérations arithmétiques dans l'anneau qu'un algorithme utilise. En particulier, étant donné un anneau (commutatif, unitaire) et deux polynômes de degré inférieur à , l'algorithme de Schönhage-Strassen a besoin de multiplications et additions dans afin de calculer en, grosso modo, en attachant -èmes racines primitives d'unité à pour obtenir un anneau plus grand et ensuite, en utilisant le Fast Transformation de Fourier surf , g R [ X ] n O ( n log n log log n ) R f g R [ X ] n R D R D DRf,gR[X]nO(nlognloglogn)RfgR[X]nRDRD, Le calcul du produit .D

Si votre bague contient une racine -ième de l' unité, cela peut être accéléré jusqu'à opérations dans en utilisant la transformée de Fourier rapide directement sur . Plus spécifiquement, sur , vous pouvez le faire en utilisant les opérations d'anneau (en ignorant le fait que cela nécessiterait une arithmétique exacte sur les nombres complexes).O ( n log n ) R R ZC O ( n log n )nO(nlogn)RRZCO(nlogn)

L'autre mesure qui peut être prise en compte est la complexité en bits d'une opération. Et c'est ce qui nous intéresse en multipliant deux entiers de longueur de bit . Ici, les opérations primitives se multiplient et ajoutent deux chiffres (avec report). Ainsi, lorsque vous multipliez deux polynômes sur , vous devez réellement prendre en compte le fait que les nombres qui surviennent pendant le calcul ne peuvent pas être multipliés à l'aide d'un nombre constant d'opérations primitives. Ceci et le fait que ne possède pas de -ième racine primitive d'unité pour vous empêche d'appliquer l'algorithme . Vous surmontez cela en considérantZ Z n n > 2 O ( n log n ) f , g Z /2 n + 1 n 2 n O ( n log n log log n )nZZnn>2O(nlogn)f,gavec des coefficients de l'anneau , car les coefficients du polynôme produit ne dépasseront pas cette limite. Là (quand est une puissance de deux), vous avez (la classe de congruence de) comme -ième racine d'unité, et en appelant récursivement l'algorithme pour les multiplications de coefficient, vous pouvez obtenir un total de primitives (c'est-à-dire bit). Cela se transforme ensuite en multiplication entière.Z/2n+1n2nO(nlognloglogn)

Pour un exemple qui met bien en évidence l'importance de la différence entre les opérations en anneau et les opérations primitives, considérons deux méthodes pour évaluer les polynômes: la méthode de Horner et la méthode d'Estrin. La méthode de Horner évalue un polynôme à un certain en exploitant l'identité tandis que la méthode d'Estrin divise en deux parties et c'est-à-dire que contient les termes de degré et les termes de degréf=i=0nfiXixZ

f(x)=((fnx+fn1)x++)+f0
f
H=i=1n/2fn/2+iXi
L=i=0n/2fiXi
H>n/2Ln/2(supposons que est une puissance de deux, pour plus de simplicité).n

Ensuite, nous pouvons calculer utilisant et en appliquant l'algorithme de manière récursive.f(x)

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

Le premier, utilisant additions et multiplications, s'est avéré être optimal par rapport au nombre d'additions et de multiplications (c'est-à-dire les opérations en anneau), le second a besoin de plus (au moins ).nn+logn

Mais, au niveau des opérations sur les bits, on peut (assez facilement) montrer que dans le pire des cas, la méthode de Horner effectue multiplications de nombres de taille au moins , conduisant à plusieurs bits opérations (cela vaut même si nous supposons que deux nombres à bits peuvent être multipliés dans le temps ), alors que le schéma d'Estrin utilise pour certains , ce qui est de loin asymptotiquement plus rapide.n / 2 Ω ( n 2 ) n O ( n ) O ( n log c n ) = ˜ O ( n ) c > 0n/2n/2Ω(n2)nO(n)O(nlogcn)=O~(n)c>0


9

Dire que vous pouvez multiplier deux polynômes de degré dans le temps implique que, en particulier, vous pouvez multiplier des polynômes de degré zéro, c'est-à-dire des constantes, en temps constant. Il est donc clair que les affirmations "multiplier les nombres à bits prend du temps " et "multiplier les polynômes degré- prend du temps " sont relatives à différents modèles de calcul ne sont donc pas directement comparables.O ( n log n ) n O ( 2 log n n log n ) n O ( n log n )nO(nlogn)nO(2lognnlogn)nO(nlogn)


5
Je ne pense pas que ce soit le problème. Si nous considérons les nombres comme des polynômes dont le "x" est la base, par exemple 2, alors nous pouvons généralement multiplier les polynômes de degré zéro (nombres plus petits que la base) en temps constant. Je suppose que le problème est que l'algorithme O (n * log n) utilise la FFT et des nombres asymptotiquement plus grands peuvent émerger à l'intérieur de l'algorithme FFT.
jkff
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.