Mnożenie w


10

Szukałem tutaj i zauważyłem, że najlepszym środowiskiem uruchomieniowym dla mnożenia dwóch liczb bitowych jest O ( n ⋅ log n ⋅ 2 O ( log ∗ n ) , ale łatwo mogę zauważyć algorytm działający w O ( n ⋅ log nnO(n⋅log⁡n⋅2O(log∗⁡n) .O(n⋅log⁡n)

W końcu wiemy, jak pomnożyć dwa wielomiany ze stopnia w środowisku wykonawczym O ( n log n ) . Ale pomnożenie wielomianów jest takie samo jak pomnożenie dwóch liczb n- bitowych. Mamy więc algorytm do pomnożenia dwóch liczb n- bitowych w O ( n log n ) . Teraz jedynym problemem, który może wystąpić, jest przeniesienie, ale w każdej fazie możemy to naprawić w czasie O ( n ) , po prostu przesuwając prawy bit i jego lewy sąsiad, aż do końca. Oznacza to, że nasze środowisko wykonawcze pozostanie O ( n ⋅ )nO(nlog⁡n)nnO(nlog⁡n)O(n)O(n⋅log⁡n) .

Czy zatem dokonałem nowego (i dość oczywistego) odkrycia? A może strona wikipedia jest nieaktualna? A może mam jakiś błąd?


W jaki sposób „wiemy” „pomnożyć dwa wielomiany ze stopnia w środowisku uruchomieniowym O ( n log n ) ”?nO(nlog⁡n)

Odpowiedzi:


8

Jak już wskazuje @DavidRicherby, zamieszanie powstaje, ponieważ różne pomiary złożoności ulegają pomieszaniu. Ale pozwól mi trochę rozwinąć.

Zwykle przy badaniu algorytmów mnożenia wielomianowego przez dowolne pierścienie interesuje nas liczba operacji arytmetycznych w pierścieniu, z których korzysta algorytm. W szczególności, biorąc pod uwagę pewien (przemienny, unitarny) pierścień i dwa wielomiany f , g ∈ R [ X ] stopnia mniejszego niż n , algorytm Schönhage-Strassen wymaga O ( n log n log log n ) mnożenia i dodawania w R w celu obliczenia f g ∈ R [ X ]Rf,g∈R[X]nO(nlog⁡nlog⁡log⁡n)Rfg∈R[X] , z grubsza, sąsiednie - prymitywne korzenie jedności zn trochę większy pierścień D ⊃ R , a potem za pomocą szybkiej transformaty Fouriera na D , obliczania artykuł D .RD⊃RDD

Jeśli pierścień zawiera -tego pierwiastka jedności, to można przyspieszyć do O ( n log n ) operacji w R przy użyciu szybkiej transformacji Fouriera bezpośrednio na badania . Mówiąc dokładniej, powyżej Z ⊂ C można to zrobić za pomocą operacji pierścienia O ( n log n ) (ignorując fakt, że wymagałoby to dokładnej arytmetyki liczb zespolonych).nO(nlog⁡n)RRZ⊂CO(nlog⁡n)

Inną miarą, którą można wziąć pod uwagę, jest złożoność operacji. I to nas interesuje, mnożąc dwie liczby całkowite o długości bitu . Tutaj podstawowe operacje mnożą się i dodają dwie cyfry (z przeniesieniem). Tak więc, mnożąc dwa wielomiany przez Z , należy wziąć pod uwagę fakt, że liczb powstających podczas obliczeń nie można pomnożyć za pomocą stałej liczby operacji pierwotnych. To i fakt, że Z nie ma n-tego prymitywnego pierwiastka jedności dla n > 2, uniemożliwia zastosowanie O ( n log n )nZZnn>2O(nlog⁡n) algorytmu . Przezwyciężyć przez rozważanie współczynnikach z pierścienia Z / ⟨ 2 N + 1f,g , Ponieważ współczynniki wielomianu produktu nie przekroczą tej granicy. Tam (gdy n jest potęgą dwóch), masz (klasę zgodności) 2 jako nZ/⟨2n+1⟩n2n ty pierwiastek jedności, a rekurencyjnie wywołując algorytm mnożenia współczynników, możesz osiągnąć sumę pierwotne (czyli bit) operacje. To następnie przenosi się do mnożenia liczb całkowitych.O(nlog⁡nlog⁡log⁡n)

Na przykład, który ładnie podkreśla znaczenie różnicy między operacjami pierścieniowymi a operacjami pierwotnymi, rozważ dwie metody oceny wielomianów: metodę Hornera i metodę Estrina. Metoda Hornera ocenia wielomian przy pewnym x ∈ Z poprzez wykorzystanie tożsamości f ( x ) = ( … ( f n x + f n - 1 ) x + … + … ) +f=∑i=0nfiXix∈Z podczas gdy metoda Estrina dzieli f na dwie części H = n / 2 ∑

f(x)=(…(fnx+fn−1)x+…+…)+f0
foraz L= n / 2 ∑ i = 0 f i Xi tj.Hzawiera warunki stopnia>n/2iLwarunki stopnia≤n/2(zakładamy, żen
H=∑i=1n/2fn/2+iXi
L=∑i=0n/2fiXi
H>n/2L≤n/2n to potęga dwóch, dla uproszczenia).

Następnie możemy obliczyć za pomocą f ( x ) = H ( xf(x) i stosując algorytm rekurencyjnie.

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

Pierwszy z nich, wykorzystujący dodatków i mnożeń, okazał się optymalny pod względem liczby dodatków i mnożeń (czyli operacji pierścieniowych), drugi potrzebuje więcej (co najmniej n + log n ).nn+log⁡n

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


9

nO(nlog⁡n)nO(2log∗⁡nnlog⁡n)nO(nlog⁡n)


5
Nie sądzę, że to jest problem. Jeśli zastanowić numerami jak wielomianów których „X” jest podstawa, na przykład 2, wówczas Typowo można pomnożyć stopień zeruje wielomiany (cyfry mniejsze niż podstawa) w stałym czasie. Domyślam się, że problem polega na tym, że algorytm O (n * log n) używa FFT i asymptotycznie większe liczby mogą pojawiać się w algorytmie FFT.
— jkff,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.