Obliczanie liczby bitów dużej potęgi liczby całkowitej


10

Biorąc pod uwagę dwie liczby całkowite i n w reprezentacji binarnej, jaka jest złożoność obliczania wielkości bitowej x n ?xnxn

Jednym ze sposobów jest obliczenie poprzez obliczenie aproksymacji log 2 ( x ) z wystarczającą dokładnością. Wygląda na to, że obliczenie log 2 ( x ) z k bitów dokładności można wykonać w O ( M ( k ) log k ), gdzie M (1+⌊log2⁡(xn)⌋=1+⌊nlog2⁡(x)⌋log2⁡(x)log2⁡(x)kO(M(k)log⁡k) oznacza czas potrzebny do obliczenia iloczynu dwóch liczb całkowitych o długości k . Daje to (nie specjalnie prosty) algorytm złożoności w przybliżeniu O ( s log 2 s ), jeśli s jest ograniczeniem wielkości bitowej zarówno x, jaki n (jeśli nie popełniłem błędu).M(k)kO(slog2⁡s)sxn

Czy możemy pokonać gdzie s jest rozmiarem x i n (w przypadku, gdy mają one porównywalne rozmiary)? Czy istnieje prosty algorytm pozwalający uzyskać tę złożoność lub lepszą?O(slog2⁡(s))sxn

Uwaga: Interesuje mnie złożoność modelu teoretycznego, takiego jak maszyny Turinga.


Proponuję migracji / "promowanie" to Theoretical Computer Science
— vzn

@vzn: Nie sądzę, żeby to było przydatne ...
— Bruno,

Dlaczego nie? to pytanie przypomina mi algorytmiczne ataki na hipotezę Dysona, np. takie jak objęte przez RJLipton w 1 , 2
— od

Po prostu dlatego, że znalazłem odpowiedź na moje pytanie, więc nie muszę zadawać jej w innym miejscu.
— Bruno

Odpowiedzi:


1

[edytuj] Zgodnie z sugestią, edytuję swoją odpowiedź, aby podać więcej szczegółów.

Odpowiedź na drugie pytanie jest moim nr :

Propozycja. Obliczenie z dokładnością k jest co najmniej tak trudne, jak obliczenie rozmiaru bitu x 2 k .log⁡(x)kx2k

Dowód. Niech oznacza rozmiar bitu liczby całkowitej y . Najpierw zauważ, że dla nieujemnej liczby całkowitej y rozmiar bitu y wynosi 1 + ⌊ log y ⌋ .|y|yyy1+⌊log⁡y⌋

Zatem . Teraz 2 k log ( x ) to log ( x ) przesunięte o k pozycje w lewo. Zatem można obliczyć log ( x ) z dokładnością k , po prostu odejmując 1 do rozmiaru bitu x 2 k i przesuwając wynikowe pozycje k w prawo.|x2k|=1+⌊2klog⁡x⌋2klog⁡(x)log⁡(x)klog⁡(x)k1x2kk


1
Dlaczego liczba bitów w umożliwia obliczenie logarytmu x do k bitów precyzji? Czy Twoja redukcja faktycznie działa? Co jeśli specjalny przypadek, w którym n = 2 k był znacznie łatwiejszy / trudniejszy niż wszystkie inne możliwe wartości n (nie-potęgi-dwóch)? Czy potrafisz wykluczyć tę możliwość? x2klog⁡xkn=2kn
— DW

@DW: Wracam do tego pytania, po komentarzu vzn. Mój dowód jest następujący: Liczba bitów liczby całkowitej wynosi 1 + ⌊ log y ⌋ . Zatem liczba bitów w x 2 k wynosi 1 + ⌊ 2 k log x ⌋ . Ponadto 2 k log x jest taki sam jak log x, ale przesunięto pozycje k w lewo. Zatem ⌊ 2 k log x ⌋ daje (przynajmniej) k pierwszych bitówy1+⌊log⁡y⌋x2k1+⌊2klog⁡x⌋2klog⁡xlog⁡xk⌊2klog⁡x⌋k . Zatem jeśli możesz obliczyć liczbę bitów x 2 k , odejmując 1 od wyniku, otrzymujesz pierwsze k bitów log x . Czy to ma sens? log⁡xx2k1klog⁡x
— Bruno,

Tak, to ma dla mnie większy sens! Zwłaszcza, że ​​próbujesz tylko wykazać twardość. Czy mogę zachęcić cię do zaktualizowania odpowiedzi za pomocą tego bardziej szczegółowego wyjaśnienia? Dziękujemy za powrót do tej kwestii i udokumentowanie odpowiedzi na własne pytanie.
— DW
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.