Sto cercando un algoritmo efficiente per il problema:
Input : numero intero positivo (memorizzato come bit) per un numero intero .
Uscita : il numero .
Domanda : possiamo calcolare dai bit di in tempo?
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.
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 )
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 )
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 )
Sembra che dovremmo essere in grado di sfruttare sapendo che l'input ha una potenza di .