Szukam wydajnego algorytmu dla problemu:
Wejście : dodatnia liczba całkowita (zapisana w bitach) dla jakiejś liczby całkowitej .
Wyjście : liczba .
Pytanie : Czy możemy obliczyć na podstawie bitów w czasie ?
To jest teoretyczne pytanie motywowane moją odpowiedzią na pytanie matematyczne. SE Jak znaleźć wzór na ten bijection? . W tym pytaniu autor chciał znaleźć bijection z
W moim proponowanym rozwiązaniu, jeśli znamy i , możemy łatwo obliczyć (napisz binarne cyfry a następnie a następnie zera). Zajmuje to czas .
Znalezienie z bitów 2 m 3 n jest równoznaczne ze znalezieniem najmniej znaczącego bitu (który można obliczyć, zliczając przesunięcia odpowiednich bitów, pozostawiając 3 n w pamięci). Zajmuje to czas O ( m ) .
Musimy jednak również znaleźć , co może być trudniejsze. Można byłoby znaleźć n poprzez wielokrotne dzielenie przez 3 , ale wydaje się to marnotrawstwem. Wymaga n operacji dzielenia, z których każda zajmie czas O ( n ) , więc w sumie jest to czas O ( n 2 ) . [Właściwie po każdej iteracji liczba cyfr będzie zmniejszać się liniowo, ale nadal powoduje to czas O ( n 2 ) .]
Wydaje się, że powinniśmy być w stanie wykorzystać wiedząc, że wkład to potęga .
źródło
Odpowiedzi:
Oczywistym podejściem jest:
(1) Oblicz przybliżenie do . Możesz go zbliżyć do błędu addytywnego 1, zliczając liczbę bitów w danej reprezentacji binarnej, i do błędu addytywnego ϵ , dodatkowo patrząc na górne O ( log 1log2)( 3n) ϵ bity wejścia. Powinny wystarczyć, aby wybrać stałą wartośćε, tak że (po połączeniu z błędem w etapie (2)) końcowe końców wynik w ciągu addytywnej błędu1/2prawidłowych.O ( log1ϵ) ϵ 1 / 2
(2) Oblicz przybliżenie do . Nie znam algorytmów do tego, ale spodziewam się, że wymagają one wielomianu czasu w liczbie potrzebnych bitów precyzji, a potrzebujesz tylko O ( log n ) bitów precyzji.log2)( 3 ) O ( logn )
(3) Podziel odpowiedź na (1) przez odpowiedź na (2) i zaokrąglij do najbliższej liczby całkowitej.
Tak więc pierwszy krok zajmuje czas liniowy (w większości modeli obliczeniowych, chociaż może nie dla niektórych słabych mocy, takich jak maszyny Turinga z pojedynczą głowicą ), a pozostałe kroki powinny być polilogarytmiczne.
źródło
Dla dowolnej liczby całkowitej zapisanie 3 nw systemie binarnym wymaga dokładnie L = ⌈ log 2 ( 3 n ) + 1 ⌉ bitów. Niektóre elementarne algebry sugerują, że L - 2n>0 3n L=⌈log2(3n)+1⌉
Dla dowolnej długości bituL≥1w tym zakresie znajduje się co najwyżej jedna liczba całkowita. Zatem, biorąc pod uwagę całkowitą potęgę3,która madługośćLbitów, wykładnik musi być liczbą całkowitą
n=⌊L-1
źródło
Oto inne podejście. Biorąc pod uwagę niskie cyfry 3 n , możesz nauczyć się 3 n mod 10 k, a zatem 3 n mod 5 k . Wygląda na to, że 3 to moduł generatora 5 k (tj. 3 ma porządek φ ( 5 k ) = 5 k - 1 × 4 ).k 3n 3nmod10k 3nmod5k 3 5k 3 φ(5k)=5k−1×4
Dlatego, używając dyskretnego dziennika i podnoszenia Hensela, myślę, że powinieneś być w stanie bardzo skutecznie obliczyć z niskich cyfr k 3 n . Innymi słowy, zaczynasz od obliczenia n mod 4 od niskiej cyfry 3 n , poprzez przeniesienie logu dyskretnego 3 n mod 5 do podstawy 3 , modulo 5 ; to ujawnia n mod 4 i można to zrobić w O ( 1 )nmodφ(5k) k 3n nmod4 3n 3nmod5 3 5 nmod4 O(1) czas. Następnie znajdziesz dyskretny log do podstawy e , modulo 25 ; ujawnia to n mod 20 i można to zrobić w czasie O ( 1 ) (korzystając z wiedzy n mod 4 , jest tylko 5 możliwości, które musisz wypróbować). Powtarzać. Na każdym kroku korzystasz z wiedzy n mod φ ( 5 k - 1 ), aby pomóc ci wydajnie obliczyć log dyskretny 3 n mod 53nmod25 e 25 nmod20 O(1) nmod4 5 nmodφ(5k−1) , wykorzystując fakt, że istnieje tylko 5 możliwych wartości dla n mod φ ( 5 k ) .3nmod5k 5 nmodφ(5k)
Teraz po prostu niech będzie wystarczająco duże, a to ujawni n .k n
Musisz dowiedzieć się, czy czas działania wynosi , ale wydaje mi się, że tak może być. Podejrzewam, że wystarczy pozwolić k = O ( n ) i podejrzewam, że możesz wykonać każdą iterację w czasie O ( 1 ) , łącznie przez czas O ( n ) .O(n) k=O(n) O(1) O(n)
źródło