Si está buscando el k-ésimo dígito de a (n) solo necesita averiguar los primeros k dígitos del mismo, no el número entero.
Además, no es necesario “calcular” números: es solo una cadena.
Insertar caracteres en una cadena larga puede ser ineficiente: una estructura de datos eficiente en el tiempo para dicha cadena podría ser una lista encadenada, pero consumirá memoria.
Espero que esto ayude, sin estropear su esfuerzo de investigación.
- Cómo demostrar que dos redes [matemáticas] S = [/ matemáticas] [matemáticas] \ {i (3,8) + j (4, -1) + k (5,4): i, j, k \ in \ mathbb {Z} \} [/ math] y [math] T = \ {m (1,5) + n (0,7): m, n \ in \ mathbb {Z} \} [/ math] son iguales
- ¿Se puede resolver el problema de encontrar la resistencia equivalente entre dos puntos en una red infinita de resistencias?
- Peter tomó diez enteros positivos consecutivos y dividió cada uno de ellos por algún número entero positivo n. Cuando agregó los diez restos, obtuvo una suma de 1000. ¿Cuál es el valor más pequeño posible de n?
- ¿Hay alguna ecuación matemática, relación o teoría que me permita hacer un laberinto similar al de la película ‘The Maze Runner’ que cambia todos los días?
- ¿Cuál es la diferencia entre la secuencia y la convergencia de series?
[Editar]
El problema me pareció divertido y lo pensé un poco más …
Si bien el número de dígitos de a (n) crece rápidamente, la buena noticia es que su problema está limitado .
En el lado n, considere que cuando [matemáticas] n> 10 ^ k [/ matemáticas] encontrar el k-ésimo dígito es trivial y es simplemente el k-1-dígito de n.
Además, el primer dígito de a (n) es siempre 1 y el segundo dígito aa (n) es siempre el primer dígito de n. Hasta ahora para k = 1 yk = 2. En términos más generales, se pueden encontrar soluciones de trival para [math] k <D_n + 1 [/ math], [math] D_n [/ math] es el número de dígitos de n (es decir [math] D_n = floor (log_10 (n )) + 1 [/ matemáticas].
En el lado k, es posible calcular explícitamente el número de dígitos [math] d_n [/ math] de a (n) (requiere dos fórmulas de recurrencia simples, que producen series geométricas que dependen de ny el número de dígitos de n, [matemática] D_n [/ matemática], y arrojando un resultado casi explícito). Cuando [math] k> d_n [/ math], no hay resultado. Por ejemplo, para n = 9, k debe ser menor que 257.
Hasta ahora, no he encontrado una idea más inteligente para reducir radicalmente la complejidad del algoritmo para n mayor que 10. Recuerde que es o (nk), solo si puede asegurarse de que insertar un dígito dentro de una cadena sea una constante tiempo de operación.
Una idea interesante podría ser paralelizar el algoritmo, ya que dada una estructura de datos adecuada para representar la cadena de dígitos, los k nuevos dígitos pueden insertarse en paralelo en cada iteración hasta n. Y más adelante, las iteraciones también se pueden canalizar : uno puede comenzar a insertar dígitos para una nueva iteración mientras que la actual ni siquiera está terminada (solo debe tener cuidado de que esta nueva iteración no se haga cargo de la anterior …). Esto llevaría a una carga bastante pesada en la CPU …
En el lado de la memoria, una cadena de dígitos truncada al k-ésimo dígito puede empaquetarse en [math] k + 1 [/ math] bytes. Una implementación básica de una cadena usaría [math] 9 k [/ math] bytes suponiendo compensaciones de 64 bits, y considerando la alineación de palabras habitual de las estructuras, en la práctica [math] 16 k [/ math] bytes.
F.