lunes, 24 de septiembre de 2018

Permutación de cifras al sumar su producto


Nuestras colaboraciones en Twitter (@connumeros) nos sugieren otros estudios similares con más profundidad. En el día 9/5/18 publicamos que el número 9158, al sumarle el producto de sus cifras, se convertía en 9518, que está formado por las mismas cifras en distinto orden.

Investigando un poco vimos que Derek Orr ya había publicado casos similares en OEIS en 2014 (Ver http://oeis.org/A247888 y http://oeis.org/A243102)

Los primeros casos son:

239+2*3*9=293
326+3*2*6=362
364+3*6*4=436

Al estar publicados, aquí sólo estudiaremos las técnicas de hoja de cálculo que nos pueden permitir reproducir resultados.

Función PRODUCIFRAS

Es evidente que la primera herramienta que necesitamos es la función PRODUCIFRAS, que devuelve el producto de las cifras de un número. Ese producto no debe ser cero, pues en ese caso el resultado sería el número original y no se produciría la permutación “no trivial” de las cifras. Esto supone que sólo nos resultarán números sin la cifra cero en las soluciones.

Sugerimos este listado para PRODUCIFRAS en VBA de Excel:

Public Function producifras(n)
Dim h, i, s, m

h = n  ‘la variable h recoge el valor de n
s = 1 ,‘El producto comienza con un 1 en la variable s
While h > 0  ‘Mientras queden cifras…
i = Int(h / 10) ‘Se queda con todas las cifras menos la última
m = h - i * 10 ‘La variable m recoge la última cifra
h = i ‘La variable h tiene una cifra menos
s = s * m ‘La última cifra se incorpora al producto
Wend
producifras = s
End Function

Necesitamos además una función que nos indique si dos números presentan el mismo conjunto de cifras y con la misma frecuencia, como 2344 y 4342. El Basic de Excel no incluye la función VECSORT, propia de otros lenguajes, que nos permite ordenar un vector de números. Con ella bastaría ordenar las cifras de uno y otro número y comparar. Así se soluciona el problema en PARI, como puedes ver en la página enlazada, http://oeis.org/A243102.

Lo solucionaremos para VBA de Excel creando las matrices ca(10) y cb(10), que acumulen las frecuencias de las cifras de cada número a o b. Para gestionar bien el 0, anotaremos la cifra k en el elemento k+1. Así, un 7 se contaría en el elemento ca(8) o cb(8), y el conjunto {0,1,2…8,9) en los elementos ca(1), ca(2),… o bien cb(1), cb(2),…Finalmente, comparamos la matriz ca con la cb y si son idénticas es que los números contienen las mismas cifras con la misma frecuencia.

El listado sería este:

Public Function cifras_identicas(m, n) As Boolean

Dim i, j, s
Dim ci As Boolean
Dim nn$, mm$, c$
Dim ca(10), cb(10)

For i = 1 To 10: ca(i) = 0: cb(i) = 0: Next i ‘Vaciamos las matrices ca y cb

h = m  ‘Extraemos las cifras de m y las volcamos en la matriz ca
While h > 0
i = Int(h / 10)
s = h - i * 10
h = i
ca(s + 1) = ca(s + 1) + 1
Wend

h = n  ’Igualmente, las de n las volcamos en cb
While h > 0
i = Int(h / 10)
s = h - i * 10
h = i
cb(s + 1) = cb(s + 1) + 1
Wend
 ‘Ahora comparamos las dos matrices, y si existe una sola discrepancia, los números no tienen iguales cifras e iguales frecuencias

ci = True ‘Comenzamos suponiendo que las cifras son idénticas
For i = 1 To 9
If ca(i) <> cb(i) Then ci = False ‘Basta una discrepancia para que sea falso
Next i
cifras_identicas = ci
End Function

Ahora sólo nos queda recorrer un rango de números, por ejemplo del 1 al 3000 y quedarnos con aquellos en los que al sumarles el producto de las cifras (si es distinto de cero) se convierten en otros de las mismas cifras. Podría ser así:

For i=1 to 3000
a=producifras(i)
if a<>0 and cifras_identicas(i,i+a) then msgbox(i)
Next i

Aquí tienes el listado de los primeros números con esa propiedad, que coinciden con los publicados por Derek Orr


Como comprobación de la potencia del lenguaje PARI, se incluye el código usado por dicho autor, en el que usa la función vecsort:

for(n=1, 10^5, d=digits(n); p=prod(i=1, #d, d[i]); v=digits(n+p); if(v!=d, v=vecsort(v); d=vecsort(d); if(v==d, print1(n, ", "))))

Nuestro objetivo ha sido el uso de una hoja de cálculo, que es más lenta, pero encaja en los objetivos de este blog.

No hay comentarios: