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.

martes, 11 de septiembre de 2018

Suma de números oblongos consecutivos

En los cálculos sobre fechas que publicamos en Twitter (@connumeros) se dio la casualidad de que dos fechas muy cercanas se podían expresar ambas como extensas sumas de números oblongos consecutivos. Así:

Día 14/5/18

14518 es suma de siete productos de números consecutivos que a su vez son consecutivos (es decir, siete oblongos consecutivos):
14518=42×43+43×44+44×45+45×46+46×47+47×48+48×49

Día 19/5/18

Se nos vuelve a presentar la suma de productos de números consecutivos que a su vez son consecutivos (es decir, oblongos consecutivos), pero esta vez son nueve, nada menos:
19518=42×43+43×44+44×45+45×46+46×47+47×48+48×49+49×50+50×51

Esta cercanía nos animó a estudiar la propiedad con cierta extensión, para ver, como es costumbre en este blog, hasta dónde nos llevarían las exploraciones sobre un tema. Es fácil ver que, al ser los números oblongos doble de los triangulares, este problema esté muy relacionado con el de sumas de números triangulares consecutivos.

Sabemos que la suma de los n primeros números triangulares es n(n+1)(n+2)/6.
(Ver https://es.wikipedia.org/wiki/N%C3%BAmero_triangular#Suma_de_los_primeros_n%C3%BAmeros_triangulares)

De aquí se deduce que en el caso de los oblongos será n(n+1)(n+2)/3. Si en la suma no se comienza desde el primer oblongo (1*2) podremos restar esta expresión aplicada al último sumando con la correspondiente al anterior al primer sumando.

Esto nos lleva a una generación de soluciones en forma de tabla de doble entrada y otra mediante una función:

Soluciones obtenidas mediante una tabla de hoja de cálculo

En la siguiente tabla hemos situado valores de n(n+1)(n+2)/3 tanto en fila como en columna. Si restamos después unos de otros nos resultarán los números que se pueden formar mediante sumas de oblongos consecutivos. Aparecerán desordenados y repetidos. Nos valen también los de la segunda fila:


Para obtener una lista ordenada es preferible una búsqueda algorítmica mediante una función. Lo vemos:

Búsqueda mediante una función

La suma entre n(n+1) y (n+k-1)(n+k), k sumandos, sería así:

 n(n+1)+(n+1)(n+2)+…..(n+k-1)(n+k)=(n+k-1)(n+k)(n+k+1)/3-(n-1)n(n+1)/3

Hemos restado la suma de los n+k-1 primeros con la correspondiente a n-1.

 Desarrollamos y queda:

Por ejemplo, 23*24+24*25+25*26+26*27+27*28=S(23,27)=3260 equivale a
5*23^2+5^2*23+(5-1)*5*(5+1)/3=3260

Este desarrollo nos da una primera condición para que un número P pueda desarrollarse como suma de oblongos consecutivos. Proseguimos:



Despejamos n en función de P:



El discriminante



ha de ser cuadrado perfecto. Esta es la primera condición para que P sea suma de oblongos. También el resultado para n ha de ser entero positivo.

Lo vemos para P=14518 y k=7, según lo publicado en Twitter:

D=12*7^2-3*7^4+36*7*14518=3651921=1911^2, luego se cumple que D es cuadrado perfecto. Sustituimos en la expresión de n y queda:

 n=(-3*7^2+1911)/(6*7)=42, que coincide con el desarrollo publicado para 14518.

Por una casualidad, 19518 también inicia su suma de oblongos en 42:

P=18518, k=9

D=12*9^2-3*9^4+36*9*19518=6305121=2511^2
  n=(-3*9^2+2511)/(6*9)=42

Este criterio nos puede servir para ver qué números se pueden descomponer en suma de oblongos consecutivos.

Tomamos el número P y probamos los criterios anteriores para los valores de k entre 1 y el máximo valor que cumpla k*(k^2-1)<3P, que es una cota fácil de deducir de las igualdades anteriores. Para cada k exigiremos que el discriminante sea cuadrado perfecto y calcularemos n para ver si es entero positivo.

Así encontraremos todos los números que sean suma de oblongos consecutivos:

2, 6, 8, 12, 18, 20, 30, 32, 38, 40, 42, 50, 56, 62, 68, 70, 72, 90, 92, 98, 104, 110, 112, 128, 132, 148, 156, 160, 162, 166, 168, 170, 182, 200, 210, 218, 220, 232, 238, 240, 242, 260, 272, 288, 290, 306, 310, 322, 328, 330,…

Para encontrarlos se puede usar esta función, que devuelve una cadena vacía si el número no se puede descomponer, o una cadena que contiene todos los valores de n y k para los que es suma de oblongos. Podría ser esta:

Function essumaob(n) As String
Dim e$
Dim k, p, q

e$ = "" ‘Comenzamos con una cadena vacía
k = 1
While k * (k ^ 2 - 1) <= 3 * n ‘Recorremos los valores posibles de k
p = 12 * k ^ 2 - 3 * k ^ 4 + 36 * k * n ‘Se calcula el discriminante
If escuad(p) Then ‘Si es cuadrado perfecto, se sigue el proceso
q = (Sqr(p) - 3 * k ^ 2) / 6 / k ‘Encontramos el valor de n inicial en la suma
‘Si n es entero positivo, se toma nota en la cadena
If q = Abs(Int(q)) and q>0 Then e$ = e$ + Str$(q) + ", " + Str$(k) + " "
End If
k = k + 1
Wend
essumaob = e
End Function

Esta función sólo se debe aplicar a números pares, que son los únicos que pueden coincidir con una suma de oblongos. Aquí tienes algunos:



Vemos que 12 presenta n=3, k=1, ya que 12=3*4. Existen dos soluciones para 20: n=4, k=1, pues 20=4*5, y también n=1, k=3, es decir, 20=1*2+2*3+3*4

Con esta función podemos analizar cualquier otro número. Aquí tenemos la solución para los ejemplo 14518, 19518:



Se confirman las soluciones encontradas más arriba.

Si todas las soluciones las dividimos entre 2, resultarán los números que equivalen a suma de triangulares consecutivos. Los tienes publicados en http://oeis.org/A034706 con el añadido de un cero:



Relación con los números combinatorios

Es fácil ver que n(n+1)(n+2)/3 es el doble del número combinatorio C(n;3). Por tanto, las fórmulas que hemos usado en párrafos anteriores se pueden resumir en


Tomamos la diagonal del 3 en el triángulo de pascal y formamos todas las diferencias mutuas multiplicadas por 2:



Deberemos tomar los valores 2, 8, 20, 40, 70, 112, 168,…dobles de la cuarta diagonal y restar “todos con todos”. Llegaríamos a los mismos valores 2, 6, 8, 12, 18, 20, 30, 32, 38, 40, 42, 50,…

Relación con los números piramidales

La suma de triangulares consecutivos daba lugar a los números piramidales triangulares, u ortoedros (Ver nuestra entrada http://hojaynumeros.blogspot.com/2017/04/numeros-piramidales-2-tetraedros.html)

Como en este caso no los sumamos todos, sino sólo a partir de un índice, en lugar de piramidales triangulares serían “troncopiramidales”. Como también nuestros sumandos son el doble de un triangular, lo que obtenemos son “troncopiramidales de base oblonga”. En la imagen tienes representado así el número 38=2*3+3*4+4*5


¿Qué números están repetidos en el listado?

Algunos números suma de oblongos aparecen repetidos en los listados. Por ejemplo, 128=7*8+8*9=56+72 y 128=5*6+6*7+7*8=30+42+56

Para descubrir el número de soluciones que puede presentar un número P como suma de oblongos consecutivos basta modificar ESSUMAOB para que nos devuelva el número de soluciones en lugar de los valores de n y k. Sólo hay que cambiar alguna línea. Puede quedar así:

Function numsumaob(n)
Dim k, p, q, v


v = 0 ‘En lugar de una cadena devuelve el número de soluciones
k = 1
While k * (k ^ 2 - 1) <= 3 * n ‘Esta parte coincide con ESSUMAOB
p = 12 * k ^ 2 - 3 * k ^ 4 + 36 * k * n
If escuad(p) Then
q = (Sqr(p) - 3 * k ^ 2) / 6 / k
If q = Abs(Int(q)) And q > 0 Then v = v + 1 ‘Incrementa el contador de soluciones
End If
k = k + 1
Wend
numsumaob = v ‘Devuelve el número de soluciones
End Function

Con esta función podemos identificar rápidamente los primeros números que coinciden al menos dos veces con una suma de oblongos consecutivos:



Por ejemplo, 328 presenta los valores n=7, k=4 y n=2, k=8, es decir:

328=7*8+8*9+9*10+10*11
328=2*3+3*4+4*5+5*6+6*7+7*8+8*9+9*10

El primer número que admite tres desarrollos es el 4360, con los valores n=31, k=4; n=27, k=5;  n=9,  k=15

Con más soluciones no existen ejemplos menores que 500000. Se podrían buscar con instrumentos más rápidos que las hojas de cálculo.