Dado un número $n$ su producto digital es el producto de su dígito. Así, el producto digital de $15$ es $1\times 5=5$ y el producto digital de $760$ es $0$ etc.
Hace poco vi un bonito vídeo en Numberphile en el que se hablaba de la persistencia, es decir, de cuántas iteraciones de producto digital se necesitan para llegar a un solo dígito (por ejemplo $75\to 35\to 15\to 5$ tiene una persistencia de $3$ ).
Jugando un poco con la idea, se me ocurrió que una forma eficiente de escribir un código para comprobar esto incluiría tener un diccionario. Esto es porque si sé que $35$ requiere dos pasos, no necesito iterar tres pasos de $75$ , sólo puedo notar que es uno más que $35$ .
Por supuesto, no se quiere almacenar esta información para cada número, porque entonces se estaría desperdiciando un montón de memoria al probar esto con números muy grandes.
Así que mi primera búsqueda fue preguntarme cuál sería el tamaño máximo de un diccionario que necesitamos. Bueno, si probamos hasta $10^n$ el mayor producto digital sería $10^n-1$ que es $9^n$ . Esto es genial, ya que $\frac{9^n}{10^n}\to 0$ así que estás siendo relativamente eficiente. Pero en el mundo real, esto sigue siendo un tamaño masivo de asignación de memoria en un ordenador personal.
El siguiente paso, por tanto, es preguntar, cuántos valores distintos podemos obtener de un producto digital ?
He probado esto hasta $10^8$ y la respuesta puede sorprenderle. Resulta que sólo hay $2026$ valores que se obtienen de los productos digitales a continuación $10^8$ . Alrededor de la mitad de ellos son en realidad $0$ ya que cuanto más largo sea el número, más difícil será evitarlo $0$ pero seguimos hablando de $43000000$ números cuyo producto es distinto de cero.
He aquí un estado básico de los resultados:
$$\begin{array}{c|l} \text{Below} & \text{Distinct digital products}\\\hline 10^0 & 1\\ 10^1 & 10\\ 10^2 & 37\\ 10^3 & 101\\ 10^4 & 226\\ 10^5 & 442\\ 10^6 & 785\\ 10^7 & 1297\\ 10^8 & 2026 \end{array}$$
Se trata de un ritmo de crecimiento bastante lento y, de nuevo, tiene sentido. Cuanto más largos sean sus números, más probable es que tengan $0$ dentro, y si no es un $0$ Entonces, al menos $1$ que puede omitirse y no cambiar el valor del producto.
Evidentemente, la primera pregunta es si sólo hay un número finito de productos digitales. Por supuesto que no. $10^n-1$ tiene un producto digital de $9^{n-1}$ , lo que nos proporcionaría infinitos valores distintos.
¿Existe una forma relativamente sencilla de calcular recursivamente cuántos productos digitales distintos hay a continuación? $10^n$ ? ¿O al menos un límite superior razonable?
(Obsérvese que hay cierta intuición de por qué esto puede hacerse recursivamente. Por ejemplo, si $k$ tiene dígitos pequeños ( $1$ a $4$ entonces $10k+2$ tiene el mismo producto digital que $2k$ Así que si $2$ aparece en una serie de longitudes $n$ y todos los dígitos son pequeños, no añade un nuevo valor. Hay un montón de casos para probar, y , por lo que espero que alguien más talentoso que yo en lo que respecta a la combinatoria finita pueda ver a través de ellos).
0 votos
Es una larga historia hasta llegar a la pregunta, por favor, fija el tema de la pregunta (¿hay... que... computar?) ¿Calculamos usando un ordenador? ¿Necesitamos computar para $n$ (de "abajo $10^n$ ") hasta $n=10$ o $n=20$ o $n=100$ ... ? (Este tipo de "juego ergódico finito" es un bonito juego, pero no podemos esperar una estructura o una visión matemática. Así que vamos a obtener el punto de vista pragmático en detalle ...)
0 votos
Sí, es una historia larga. Tampoco sé qué es lo que no está claro. Yo no Necesito para computar nada. Tengo curiosidad por saber si existe una forma directa de hacerlo que no implique un enfoque de fuerza bruta. Me encantaría que me hablasen de heurísticas dentro de "rangos factibles" (por ejemplo, por debajo de $10^{1000}$ ) y también me gustaría escuchar una prueba general.
0 votos
Los productos de segunda generación no necesitan dígitos pares ni $5$ s en el número original, lo que pone un límite superior de $O(n^3)$ en los productos de segunda generación
0 votos
@Empy2: Me he dado cuenta hoy que en realidad una vez se puede hacer esto recursivamente en $O(n^2)$ o probablemente $n\log n$ más o menos. Comenzar con $D_0=\{1\}$ , entonces dejemos que $D_{n+1}$ sea $\{d\cdot k\mid d\in\{0,\dots,9\}, k\in D_n\}$ .
0 votos
@AsafKaragila - ¿Cómo sería eso? $O(n^2)$ ? Las propias operaciones de conjunto pueden parecer primitivas $O(1)$ pero en realidad no lo son. En cualquier caso $|D_n| = O(n^4)$ por lo que no se puede calcular en $O(n^2)$ ¿verdad?
0 votos
@antkam: ¿Cómo te imaginas $n^4$ ? Su $D_{n+1}$ es sólo $10$ cosas añadidas para cada miembro de $D_n$ . Así que no estoy seguro de lo que quieres decir con "parecen primitivos pero en realidad no lo son".
0 votos
Oh, lo siento, tal vez te he malinterpretado totalmente. Pensaba que $D_n$ se supone que es el conjunto de todos los DP por debajo de $10^n$ . Como han demostrado las respuestas de Oldboy y Empy2, el número de elementos $|D_n|$ crece como $n^4$ .
0 votos
@antkam: Bueno, mi sugerencia era un algoritmo recursivo, así que para conseguir $D_n$ necesitarías ejecutarlo $n$ veces, que es donde el extra $n^2$ viene, supongo. Me refería a que la recursión paso está en $O(n^2)$ Lo cual puede o no ser un error de mi parte también.
0 votos
Tu algo es el mismo que el antiguo código java de Oldboy (creo... pero no soy un experto en java). De hecho, la función principal (su getUniqueProducts) se llama $n$ veces, pero el tiempo de ejecución de cada llamada es diferente (al menos, en la versión no paralela) -- hay $10 |D_n|$ multiplicaciones y set-inserciones, y cada set-inserción no es en sí misma una operación constante (primitiva/atómica).
0 votos
@antkam: Lo es si lo piensas en términos abstractos.