Können wir aus den Bits von in Zeit berechnen ?

11

Ich suche einen effizienten Algorithmus für das Problem:

Eingabe : Die positive ganze Zahl (als Bits gespeichert) für eine ganze Zahl . n 03nn0

Ausgabe : Die Nummer .n

Frage : Können wir aus den Bits von in Zeit berechnen ?3 n O ( n )n3nO(n)


Dies ist eine theoretische Frage, die durch meine Antwort auf eine math.SE- Frage motiviert ist. Wie finde ich eine Formel für diese Bijektion? . In dieser Frage wollte der Autor eine Bijektion aus und den natürlichen Zahlen . Ich schlug als Lösung vor. Eine andere Antwort dort behauptete "es gibt keine einfache Formel", was mich fragen lässt, wie (rechnerisch) einfach meine vorgeschlagene Lösung ist.N = { 1 , 2 , } 2 m 3 n2 m ( 2 n + 1 )

{2n3m:n0 and m0}
N={1,2,}
2m3n2m(2n+1)

Wenn wir mit meiner vorgeschlagenen Lösung und , können wir leicht berechnen (schreiben Sie die Binärziffern von gefolgt von gefolgt von Nullen). Dies dauert .m 2 m ( 2 n + 1 ) n 1 m O ( n + m )nm2m(2n+1)n1mO(n+m)

Das Finden von aus den Bits von läuft darauf hinaus, das niedrigstwertige Bit zu finden (das berechnet werden kann, indem die richtigen Bitverschiebungen gezählt werden und im Speicher verbleiben ). Dies dauert Zeit.2 m 3 n 3 n O ( m )m2m3n3nO(m)

Wir müssen jedoch auch finden , was schwieriger sein könnte. Es wäre möglich, durch wiederholtes Teilen durch , aber dies scheint verschwenderisch. Es erfordert Divisionsoperationen, von denen jede Zeit benötigt, also ist dies insgesamt Zeit. [Tatsächlich nimmt die Anzahl der Stellen nach jeder Iteration linear ab, dies führt jedoch immer noch zu einer -Zeit.]n 3 n O ( n ) O ( n 2 ) O ( n 2 )nn3nO(n)O(n2)O(n2)

Es scheint, als sollten wir in der Lage sein, das Wissen auszunutzen, dass die Eingabe eine Potenz von .3

Rebecca J. Stones
quelle
2
Was ist Ihr genaues Berechnungsmodell? Welche Operationen sind in Zeit erlaubt ? (Wenn wir mit Zahlen wie könnten , wäre das sehr nützlich ...)log 2 3O(1)log23
Yuval Filmus
3
Kann der Downvoter die Downvote erklären? Es scheint überhaupt keine triviale Frage zu sein. Was ist die beste Laufzeit unter einem vernünftigen Rechenmodell?
Yuval Filmus
1
Ich stelle mir Bänder mit Nullen, Einsen und leeren Zellen vor (mit einer unendlichen Anzahl von Bändern). Ich möchte, dass Einzelbit-Umschalt- und Links- / Rechtsverschiebungsoperationen in -Zeit ausgeführt werden. (Wenn wir einen Marker haben, das 0-te Bit auf einem unendlichen Band, wird das Verschieben nach links / rechts durch Verschieben des Markers erreicht). Im Gegensatz zu einer Turing-Maschine möchte ich nicht, dass es Zeit braucht, um einen Zeiger zu bewegen. Das "Umschalten des 0-ten Bits" dauert also genauso lange wie das "Umschalten des 124126-ten Bits". O(1)
Rebecca J. Stones
Es könnte irgendwie mit dieser Frage zusammenhängen
J.-E.
Ist die Untergrenze von offensichtlich? Ω(n)
Boris Bukh

Antworten:

9

Der offensichtliche Ansatz ist:

(1) Berechnen Sie eine Näherung an . Sie können es auf einen additiven Fehler von 1 approximieren, indem Sie die Anzahl der Bits in der angegebenen Binärdarstellung zählen, und auf einen additiven Fehler von indem Sie zusätzlich das obere Bits der Eingabe. Es sollte ausreichen, einen konstanten Wert von zu wählen , damit (nach Kombination mit dem Fehler in Schritt (2)) das Endergebnis innerhalb eines additiven Fehlers von der korrekten endet .ϵ O ( log 1log2(3n)ϵ& epsi;1/2O(log1ϵ)ϵ1/2

(2) Berechnen Sie eine Annäherung an . Ich bin mit den Algorithmen dafür nicht vertraut, aber ich gehe davon aus, dass sie in der Anzahl der benötigten Genauigkeitsbits ein Zeitpolynom benötigen und dass Sie nur Genauigkeitsbits benötigen .O ( log n )log2(3)O(logn)

(3) Teilen Sie die Antwort auf (1) durch die Antwort auf (2) und runden Sie auf die nächste ganze Zahl.

Der erste Schritt benötigt also lineare Zeit (in den meisten Berechnungsmodellen, obwohl dies bei einigen leistungsschwachen Modellen wie Einkopf-Turing-Maschinen möglicherweise nicht der Fall ist), und die verbleibenden Schritte sollten polylogarithmisch sein.

David Eppstein
quelle
3
Ich glaube, dass das Berechnen von mit Genauigkeitsbits Zeit , wobei ist die Zeit, um Bit-Zahlen zu multiplizieren . Siehe Brent - Zimmermann, loria.fr/~zimmerma/mca/pub226.htmllog2(3)tO(M(t)logt)M(t)O(tlogt2logt)t
Ryan O'Donnell
Vielen Dank für den Hinweis und entschuldigen Sie, dass Sie zu faul sind, um ihn selbst nachzuschlagen.
David Eppstein
9

Für jede ganze Zahl erfordert das Schreiben von in Binärform genau Bits. Einige elementare Algebra impliziert, dass Für jede Bitlänge gibt es höchstens eine ganze Zahl in diesem Bereich. Bei einer ganzzahligen Potenz von , die Bits lang ist, muss der Exponent die ganze Zahl n>03nL=log2(3n)+1L13Ln=L-1

L2log23nL1log23.
L13L
n=L1log23.
Jeffε
quelle
4

Hier ist ein anderer Ansatz. Bei den niedrigen Ziffern von können Sie und damit lernen . Es sieht so aus, als ob ein Generatormodulo (dh hat die Reihenfolge ).k3n3nmod10k3nmod5k35k3φ(5k)=5k1×4

Daher sollten Sie mit diskretem Log und Hensel-Lifting in der Lage sein, aus den niedrigen Ziffern von sehr effizient zu berechnen . Mit anderen Worten, Sie beginnen mit der Berechnung von aus der niedrigen Ziffer von , indem Sie das diskrete Protokoll von zur Basis , Modulo ; Dies zeigt und kann in -Zeit erfolgen. Dann finden Sie das diskrete Protokoll von zur Basis , modulo ; Dies zeigt und kann in durchgeführt werdennmodφ(5k)k3nnmod43n3nmod535nmod4O(1)3nmod25e25nmod20O(1) Zeit (unter Ausnutzung des Wissens von gibt es nur Möglichkeiten, die Sie ausprobieren müssen). Iterieren. Bei jedem Schritt verwenden Sie das Wissen von , um das diskrete Protokoll von effizient zu berechnen , wobei Sie die Tatsache nutzen, dass es nur gibt mögliche Werte für .nmod45nmodφ(5k1)3nmod5kn mod φ ( 5 k )5nmodφ(5k)

Lassen Sie einfach groß genug sein, und dies zeigt .nkn

Sie müssen herausfinden, ob die Laufzeit , aber es sieht für mich so aus. Ich vermute, es reicht aus, , und ich vermute, Sie können jede Iteration in -Zeit für insgesamt -Zeit durchführen.k = O ( n ) O ( 1 ) O ( n )O(n)k=O(n)O(1)O(n)

DW
quelle