Possiamo calcolare dai bit di in tempo?


11

Sto cercando un algoritmo efficiente per il problema:

Input : numero intero positivo (memorizzato come bit) per un numero intero .3nn0

Uscita : il numero .n

Domanda : possiamo calcolare dai bit di in tempo?n3nO(n)


Questa è una domanda teorica motivata dalla mia risposta a una domanda di matematica.SE Come trovare una formula per questa biiezione? . In questa domanda, l'autore voleva trovare una biiezione tra e i numeri naturali . Ho proposto come soluzione. Un'altra risposta affermava che "non esiste una formula semplice", il che mi fa domandare quanto (computazionalmente) sia semplice la mia soluzione proposta.

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

Con la mia soluzione proposta, se conosciamo e , possiamo facilmente calcolare (scrivere le cifre binarie di seguite da seguite da zero). Questo richiede tempo .m 2 m ( 2 n + 1 ) n 1 m O ( n + m )nm2m(2n+1)n1mO(n+m)

Trovare dai bit di equivale a trovare il bit meno significativo (che può essere calcolato contando gli spostamenti di bit a destra, lasciando in memoria). Questo richiede tempo .2 m 3 n 3 n O ( m )m2m3n3nO(m)

Tuttavia, dobbiamo anche trovare , che potrebbe essere più difficile. Sarebbe possibile trovare dividendo ripetutamente per , ma questo sembra dispendioso. Richiede operazioni di divisione, ognuna delle quali richiederà tempo, quindi questo è in totale. [In realtà, dopo ogni iterazione, il numero di cifre diminuirà in modo lineare, ma ciò comporterà comunque il tempo .]n 3 n O ( n ) O ( n 2 ) O ( n 2 )nn3nO(n)O(n2)O(n2)

Sembra che dovremmo essere in grado di sfruttare sapendo che l'input ha una potenza di .3


2
Qual è il tuo modello esatto di calcoli? Quali operazioni sono consentite in tempo? (Se potessimo fare l'aritmetica con numeri come sarebbe abbastanza utile ...)log 2 3O(1)log23
Yuval Filmus,

3
Il downvoter può spiegare il downvote? Non sembra affatto una domanda banale. Qual è il miglior tempo di esecuzione con un modello di calcolo ragionevole?
Yuval Filmus,

1
Sto immaginando nastri con 0, 1 e celle vuote (con un numero infinito di nastri). Voglio che le operazioni di commutazione a singolo bit e di spostamento a sinistra / a destra vengano eseguite nel tempo . (Se abbiamo un marker il 0 ° bit su un nastro infinito, lo spostamento a sinistra / a destra si ottiene spostando il marker). A differenza di una macchina Turing, non voglio che ci voglia tempo per spostare un puntatore. Quindi "attiva / disattiva il bit 0" richiede lo stesso tempo di "attiva il bit 124126". O(1)
Rebecca J. Stones,

Potrebbe essere in qualche modo correlato a questa domanda
J.-E.

Il limite inferiore di evidente? Ω(n)
Boris Bukh,

Risposte:


9

L'approccio ovvio è:

(1) Calcola un'approssimazione a . Puoi approssimarlo all'interno di un errore additivo di 1 contando il numero di bit nella data rappresentazione binaria e all'interno di un errore additivo di osservando inoltre la superiore bit dell'input. Dovrebbe essere sufficiente scegliere un valore costante di , in modo che (dopo la combinazione con l'errore nel passaggio (2)) il risultato finale finisca con un errore additivo di di corretto.ϵ O ( log 1log2(3n)ϵε1/2O(log1ϵ)ϵ1/2

(2) Calcola un'approssimazione a . Non ho familiarità con gli algoritmi per questo, ma mi aspetto che impieghino del tempo polinomiale nel numero di bit di precisione di cui hai bisogno e hai solo bisogno di bit di precisione.O ( log n )log2(3)O(logn)

(3) Dividi la risposta a (1) per la risposta a (2) e arrotonda al numero intero più vicino.

Quindi il primo passo richiede un tempo lineare (nella maggior parte dei modelli di calcolo, anche se forse non per alcuni sottodimensionati come le macchine di Turing a testa singola ) e i rimanenti passaggi dovrebbero essere pollogaritmici.


3
Credo che calcolare a bit di precisione richieda tempo , dove è il momento di moltiplicare numeri -bit. Vedi Brent - Zimmermann, loria.fr/~zimmerma/mca/pub226.htmlt O ( M ( t ) log t ) M ( t ) O ( t log t 2 log t ) tlog2(3)tO(M(t)logt)M(t)O(tlogt2logt)t
Ryan O'Donnell,

Grazie per il riferimento e mi scuso per essere troppo pigro per cercarlo da solo.
David Eppstein,

9

Per qualsiasi numero intero , la scrittura di in binario richiede esattamente bit di . Qualche algebra elementare implica che Per qualsiasi lunghezza di bit , esiste al massimo un numero intero in questo intervallo. Pertanto, data una potenza integrale di che è lunga bit, l'esponente deve essere l'intero 3 n L = log 2 ( 3 n ) + 1 L - 2n>03nL=log2(3n)+1L13Ln=L-1

L2log23nL1log23.
L13L
n=L1log23.

4

Ecco un altro approccio. Date le cifre basse di , puoi imparare e quindi . Sembra che sia un generatore modulo (ovvero, ha ordine ).k3n3nmod10k3nmod5k35k3φ(5k)=5k1×4

Pertanto, usando il log discreto e il sollevamento di Hensel, penso che dovresti essere in grado di calcolare dalle cifre a basso di molto efficiente. In altre parole, si inizia calcolando dalla cifra bassa di , portando il log discreto di alla base , modulo ; questo rivela e può essere fatto in volta. Quindi, trovi il log discreto di nella base , modulo ; questo rivela , e può essere fatto innmodφ(5k)k3nnmod43n3nmod535nmod4O(1)3nmod25e25nmod20O(1) tempo (sfruttando la conoscenza di , ci sono solo possibilità che devi provare). Iterate. Ad ogni passaggio, usi la conoscenza di per aiutarti a calcolare in modo efficiente il log discreto di , facendo uso del fatto che ci sono solo possibili valori per .nmod45nmodφ(5k1)3nmod5kn mod φ ( 5 k )5nmodφ(5k)

Ora lascia che sia abbastanza grande, e questo rivela .nkn

Dovrai capire se il tempo di esecuzione è , ma mi sembra che potrebbe essere. Ho il sospetto che sia sufficiente lasciare , e sospetto che tu possa fare ogni iterazione in tempo, per un totale di tempo.k = O ( n ) O ( 1 ) O ( n )O(n)k=O(n)O(1)O(n)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.