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(nlogn2O(logn) .O(nlogn)

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(nlogn)nnO(nlogn)O(n)O(nlogn) .

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

TheEmeritus
źródło
W jaki sposób „wiemy” „pomnożyć dwa wielomiany ze stopnia w środowisku uruchomieniowym O ( n log n ) ”?nO(nlogn)

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,gR[X]nO(nlognloglogn)RfgR[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 .RDRDD

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 ZC 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(nlogn)RRZCO(nlogn)

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(nlogn) 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+1n2n 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(nlognloglogn)

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=0nfiXixZ podczas gdy metoda Estrina dzieli f na dwie części H = n / 2

f(x)=((fnx+fn1)x++)+f0
foraz L= n / 2 i = 0 f i Xi tj.Hzawiera warunki stopnia>n/2iLwarunki stopnian/2(zakładamy, żen
H=i=1n/2fn/2+iXi
L=i=0n/2fiXi
H>n/2Ln/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+logn

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

Marka Cornelius
źródło
9

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

David Richerby
źródło
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,