Estoy buscando un algoritmo eficiente para el problema:
Entrada : El entero positivo (almacenado como bits) para algún entero n ≥ 0 .
Salida : el número .
Pregunta : ¿Podemos calcular partir de los bits de 3 n en el tiempo O ( 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 n ↦ 2 m ( 2 n + 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 ) .
ds.algorithms
time-complexity
Rebecca J. Stones
fuente
fuente
Respuestas:
El enfoque obvio es:
(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.
fuente
fuente
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) k 3n nmod4 3n 3nmod5 3 5 nmod4 O(1) 3nmod25 e 25 nmod20 O(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 .nmod4 5 nmodφ(5k−1) 3nmod5k n mod φ ( 5 k )5 nmodφ(5k)
Ahora solo deje que sea lo suficientemente grande, y esto revela .nk n
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)
fuente