¿Podemos calcular

11

Estoy buscando un algoritmo eficiente para el problema:

Entrada : El entero positivo (almacenado como bits) para algún entero n 0 .3nn0

Salida : el número .n

Pregunta : ¿Podemos calcular partir de los bits de 3 n en el tiempo O ( n ) ?n3nO(n)


Esta es una pregunta teórica motivada por mi respuesta a una pregunta matemática. ¿ Cómo encontrar una fórmula para esta biyección? . En esta pregunta, el autor quería encontrar una biyección de y los números naturales N = { 1 , 2 , ... } . Propuse 2 m 3 n2 m ( 2 n + 1 )

{2n3m:n0 and m0}
N={1,2,}
2m3n2m(2n+1)
como solución Otra respuesta afirmaba "no hay una fórmula simple", lo que me hace preguntarme qué tan simple (computacionalmente) es mi solución propuesta.

Con mi solución propuesta, si conocemos y m , podemos calcular fácilmente 2 m ( 2 n + 1 ) (escribir los dígitos binarios de n seguido de 1 seguido de m ceros). Esto lleva tiempo O ( n + m ) .nm2m(2n+1)n1mO(n+m)

m2m3n3nO(m)

nn3nO(n)O(n2)O(n2)

3

Rebecca J. Stones
fuente
2
O(1)log23
3
¿El votante puede explicar el voto negativo? No parece una pregunta trivial en absoluto. ¿Cuál es el mejor tiempo de ejecución bajo un modelo de cálculo razonable?
Yuval Filmus
1
O(1)
Podría estar relacionado de alguna manera con esta pregunta
J.-E.
Ω(n)

Respuestas:

9

El enfoque obvio es:

log2(3n)ϵO(log1ϵ)ϵ1/2

log2(3)O(logn)

(3) Divida la respuesta a (1) por la respuesta a (2) y redondee al número entero más cercano.

Por lo tanto, el primer paso lleva tiempo lineal (en la mayoría de los modelos de cómputo, aunque tal vez no para algunos de baja potencia, como las máquinas de Turing de una sola cabeza ) y los pasos restantes deben ser polilogarítmicos.

David Eppstein
fuente
3
log2(3)tO(M(t)logt)M(t)O(tlogt2logt)t
Gracias por la referencia y disculpas por ser demasiado vago para buscarlo yo mismo.
David Eppstein
9

n>03nL=log2(3n)+1

L2log23nL1log23.
L13L
n=L1log23.
Jeffε
fuente
4

k3n3nmod10k3nmod5k35k3φ(5k)=5k1×4

Por lo tanto, al usar el registro discreto y el levantamiento de Hensel, creo que debería poder calcular partir de los dígitos bajos de muy eficiente. En otras palabras, comienza calculando partir del dígito bajo de , tomando el registro discreto de a la base , módulo ; esto revela , y se puede hacer en tiempo. Luego, encuentra el registro discreto de en la base , módulo ; esto revela , y se puede hacer ennmodφ(5k)k3nnmod43n3nmod535nmod4O(1)3nmod25e25nmod20O(1) tiempo (aprovechando el conocimiento de , solo hay posibilidades que tienes que probar). Iterar. En cada paso, utiliza el conocimiento de para ayudarlo a calcular eficientemente el registro discreto de , haciendo uso del hecho de que solo hay valores posibles para .nmod45nmodφ(5k1)3nmod5kn mod φ ( 5 k )5nmodφ(5k)

Ahora solo deje que sea ​​lo suficientemente grande, y esto revela .nkn

Tendrá que determinar si el tiempo de ejecución es , pero me parece que podría ser. Sospecho que es suficiente para dejar que , y sospecho que puede hacer cada iteración en el tiempo , por un total de tiempo .k = O ( n ) O ( 1 ) O ( n )O(n)k=O(n)O(1)O(n)

DW
fuente