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 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 ⋅ ) .
Czy zatem dokonałem nowego (i dość oczywistego) odkrycia? A może strona wikipedia jest nieaktualna? A może mam jakiś błąd?
źródło
Odpowiedzi:
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 ]R f,g∈R[X] n O(nlognloglogn) R fg∈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 .R D⊃R D D
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).n O(nlogn) R R Z⊂C O(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 )n Z Z n n>2 O(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+1⟩ n 2 n 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=∑ni=0fiXi x∈Z
podczas gdy metoda Estrina dzieli f na dwie części
H = n / 2 ∑
Następnie możemy obliczyć za pomocą f ( x ) = H ( xf(x)
i stosując algorytm rekurencyjnie.
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 ).n n+logn
źródło
źródło