lunes, 21 de septiembre de 2020

Producto de cifras con incremento



El día 14 de mayo de 2020, @AnecdotesMaths publicó en Twitter la siguiente igualdad:

315 = (3+4)(1+4)(5+4)

En este blog estamos atentos a desarrollos a partir de cualquier curiosidad que encontremos, por lo que dedicaremos esta entrada a las igualdades del tipo

abc… = (a+k)(b+k)(c+k)…, donde a,b, c… son cifras de un número y k una constante entera.

El subrayado del primer miembro indica que son cifras del número y no producto.

Generalizamos a continuación la igualdad leída en Twitter.

El valor de k está acotado por el 10, ya que si aumentamos esta cantidad tendríamos:

(a+10)(b+10)(c+10)…>10*10*10*…> abc… ,

Sería imposible la igualdad pedida.

Para iniciar las búsquedas, necesitamos una función que nos devuelva las cifras de un número por separado. Puedes consultar los códigos para VBasic de Excel y Calc en la siguiente entrada de este blog


Allí se explican las funciones NUMCIFRAS (número de cifras), CIFRA, (una cifra sola) y TROZOCIFRA (devuelve varias cifras)

En PARI puedes usar:

cutdigit(a, p, q)=(a%10^q)\10^(p-1)

Es equivalente a TROZOCIFRAS, ya que devuelve las cifras entre los órdenes p y q, con lo que si son iguales equivalen a una sola cifra.

Para el total de cifras, PARI permite usar esta expresión:

#Vec(Str(N))

Equivale a “cardinal del vector formado por la expresión en texto de N”

Con estas funciones, no es difícil encontrar ejemplos como los deseados.


Versión para Excel y Calc

Hemos elegido la siguiente función para encontrar los números que poseen la propiedad deseada:

Function ciframasconst(n)
Dim i, j, k, p


k = 0  ‘Esta constante, si es mayor que 0, indicará éxito
For i = 0 To 9 ‘La variable i es la constante que se suma a las cifras
p = 1 ‘Inicio del producto de cifras
For j = 1 To numcifras(n)
p = p * (cifra(n, j) + i) ‘Se construye el producto de cifras aumentadas
Next j
If p = n Then k = i ‘Si el producto coincide con el número, tomamos nota de la constante sumada
Next i
ciframasconst = k ‘Si k>0, se da la propiedad
End Function


La función devuelve la constante que se suma a las cifras, de forma que si vale 0, es señal de que no se cumple la propiedad, y, en caso contrario, devuelve el valor de la constante que se suma. En la siguiente tabla figuran los primeros números que cumplen lo pedido y, junto a ellos, la constante que se suma:

12          2
18          1
24          2
35          2
50          5
56          2
90          6
120        4
210        5
315        4
450        5
780        5
840        6
1500      5

Vemos que, efectivamente, 315 cumple la igualdad para k=4, es decir, que 315=(3+4)(1+4)(5+4)

Otro ejemplo sería el 840, que la cumple para k=6:

840=(8+6)(4+6)(0+6)=14*10*6=840

Con esta función podemos extender la búsqueda hasta donde deseemos, recordando que solo ensayamos valores de k entre 0 y 10:

Los primeros números obtenidos son:

12, 18, 24, 35, 50, 56, 90, 120, 210, 315, 450, 780, 840, 1500, 3920, 4320, 4752, 7744, 16500,
24960,…

Están ya publicados en http://oeis.org/A055482

A055482                            There exists some k>0 such that n is the product of (k + digits of n).            
12, 18, 24, 35, 50, 56, 90, 120, 210, 315, 450, 780, 840, 1500, 3920, 4320, 4752, 7744, 16500, 24960, 57915, 59400, 60480, 91728, 269500, 493920, 917280, 1293600, 2419200, 3386880, 34992000, 266378112, 317447424, 1277337600, 3714984000, 14948388000, 48697248600, 460522782720, 896168448000

Versión en PARI

El algoritmo usado se traslada fácilmente al lenguaje PARI:

cutdigit(a, p, q)=(a%10^q)\10^(p-1)
prod_cifr_inc(n,k)=my(m=#Vec(Str(n)),p=1,i);for(i=1,m,p=p*(cutdigit(n,i,i)+k));p
for(i=1,10^6,for(k=1,9,if(i==prod_cifr_inc(i,k),print1(i,", "))))

Da los mismos resultados:







Primera variante

En lugar de producto de cifras incrementadas podemos usar la suma de sus cuadrados, es decir, que se cumpla la igualdad

 abc…=(a+k)^2+(b+k)^2+(c+k)^2

La acotación para k puede ser más amplia, por ejemplo, la raíz cuadrada del número N dividido entre el número de cifras. Así, 6754 podría alcanzar la cota 41 en la base de cada sumando:

6754>4*41^2=6724

El uso de valores de k de dos cifras complicaría una cuestión que solo es lúdica, por lo que seguiremos dándole valores entre 1 y 9. Dejamos abierta una ampliación de valores.

Un pequeño cambio en la función ciframascons nos devolvería los primeros números que cumplen esta condición:

20          2
40          2
106        3
114        4
118        2
121        5
146        3
158        2
171        4
230        7
274        5
325        7
413        9
469        6
481        8

Así, 325 coincide con la suma de los cuadrados de las cifras incrementadas estas en 7 unidades:

325=(3+7)^2+(2+7)^2+(5+7)^2=100+81+144

Con cubos

Si en lugar de cuadrados usamos cubos, obtenemos este otro listado:

141        1
251        1
440        2
532        2
560        1
1036      3
1307      3
1471      3
2240      6
2313      6
2609      3
2917      3
3016      6
3878      3
4799      3

Tomamos como ejemplo 3878, que con la constante igual a 3 cumple:

3878=(3+3)^3+(8+3)^3+(7+3)^3+(8+3)^3=216+1331+1000+1331

Dejamos como ampliación de quien nos lea la búsqueda de casos distintos. Por ejemplo, se podrían usar trozos de cifras en lugar de cifras aisladas.




martes, 8 de septiembre de 2020

Representación de Zeckendorf


Cada entero positivo puede expresarse de manera única como una suma de números distintos de Fibonacci no consecutivos. Este resultado se denomina teorema de Zeckendorf y la secuencia de números de Fibonacci que se suman se denomina representación de Zeckendorf. Se llaman así en honor al médico belga y matemático aficionado E. Zeckendorf.

Para descomponer un número en sumandos de la sucesión de Fibonacci, se ha demostrado que el mejor procedimiento es el de ir restando al número el término de Fibonacci mayor posible, hasta llegar a una diferencia que sea también de Fibonacci, con lo que se termina en un cero. El teorema correspondiente afirma que siempre se llegará a este término en las diferencias.

Puedes consultar el tema en


Está desarrollado de forma amena y resulta interesante. Aquí nos limitaremos a la construcción del algoritmo, para lo que repasaremos algunas técnicas y propiedades relacionadas con la famosa sucesión.

Mayor término de Fibonacci menor que N

Hemos recordado que el procedimiento para la representación de Zeckendorf de un número N consiste en ir tomando el mayor término de Fibonacci posible entre los números menores o iguales que N. El problema ahora es cómo saber si un número pertenece a la sucesión de Fibonacci o no. Existe un criterio bastante simple, y es:

Un número N pertenece a la sucesión de Fibonacci si y sólo si 5N2+4 o 5N2-4 es un cuadrado perfecto.


Según eso, ésta puede ser la función que devuelva VERDADERO si un número es del tipo Fibonacci y FALSO en el caso opuesto:

Public Function esfibo(n) As Boolean 'devuelve verdadero si N es de Fibonacci
Dim f As Boolean
Dim a

f = False
a = 5 * n * n + 4
If escuad(a) Then f = True
a = 5 * n * n - 4
If escuad(a) Then f = True
esfibo = f
End Function

La función escuad ya está explicada muchas veces en este blog. Con el comando Buscar la puedes localizar. Dada esta función, para cualquier número N podemos definir esta otra función, antefibo, que devuelve el mayor número de Fibonacci que podemos restar de N. Su listado puede ser:


Function antefibo(n)
Dim i

i = n ‘Pudiera ser que N fuera de Fibonacci, y terminaría el proceso
While Not esfibo(i)
i = i – 1 ‘Vamos bajando números hasta encontrar el primer “Fibonacci”
Wend
antefibo = i
End Function


Con la ayuda de esta función ya es sencillo efectuar la descomposición de Zeckendorf. El listado siguiente recoge una función que devuelve todos los sumandos y su número de orden en la sucesión de Fibonacci:

Function zeckendorf$(n)
Dim p, q
Dim s$

s = "" ‘Contenedor para la solución
p = n
While p > 0
q = antefibo(p) ‘Primer sumando de Fibonacci
p = p - q
s = s + Str$(quefibo(q)) + "% " + Str$(q) + ", " ‘Se construye la solución
Wend
If s = "" Then s = "NO"
zeckendorf = s
End Function

Con esta función se puede construir un listado de representaciones de este tipo. Aquí puedes observar como ejemplo los números comprendidos entre 100 y 110.



En todos ellos, el primer sumando es 89, el número de Fibonacci número 11, y después 13, 8 o 21, hasta llegar a 1 o 2.

Hay que observar que los números de orden nunca son consecutivos. La razón estriba en que la suma de dos términos de Fibonacci consecutivos da lugar a otro mayor del mismo tipo, y ya habría sido elegido antes como sumando.

Para lo que sigue, puede ser útil incluir en el resultado el número de sumandos, para realizar clasificaciones. Por ejemplo, en el caso de 100 y 101 quedaría:



Nos informa, para futuras búsquedas, de que 100 presenta 3 sumandos, 89+8+3, y 101 presenta 4: 89+8+3+1.

En este procedimiento, el número 1, que puede definirse como F(2) o F(1), aparece siempre como F(2). Esto es importante en algunas propiedades de esta representación.

Si establecemos una búsqueda según el primer dígito, podremos clasificar los números según el número de sumandos. Vemos algunos ejemplos:

Un sumando

Si buscamos el valor de 1 como dígito inicial del resultado, obtendremos los mismos números de Fibonacci:



Para dos sumandos




Están publicados en http://oeis.org/A179242

Para tres:




Así podríamos continuar, pero carece de interés.

Multiplicación de Fibonacci

La representación de Zeckendorf da lugar a un producto muy curioso, que consiste, dados dos números representados como suma de elementos de Fibonacci, formar la siguiente expresión:



Lo hemos escrito de forma abreviada, pero la idea es formar un sumatorio doble en el que cada sumando sea un número de Fibonacci cuyo índice sea la suma de los índices de cada uno de los factores.

Por ejemplo, si deseamos multiplicar 22 por 17, según las tablas de más arriba, 22 es una suma de números de Fibonacci de índices 8 y 2, mientras 17 se basa en 7, 4 y 2. Podemos formar una tabla de doble entrada, sumar índices y buscar el número de Fibonacci correspondiente:



Hemos ido sumando cada par de índices, como pueden ser 7 y 8. Su suma 15 la convertimos en F(15)=610, y así vamos procediendo con cada par. Al final, sumamos, y nos da como resultado 854.

Esta multiplicación es claramente conmutativa, pero Donald Knuth demostró que también es asociativa.

Es un reto comprobar esto con una función más automatizada que la propuesta en párrafos anteriores. Los resultados del tipo propuesto no son muy útiles para multiplicar 

Los sustituiremos por un formato más sencillo, en el que solo figurarán los índices. Omitimos el listado de la nueva función multizeck(n). Para quien tenga curiosidad, se adjunta en el Anexo.

Con esta función es fácil comprobar con Excel la propiedad asociativa. Lo vemos en el esquema construido al efecto:



Hemos tomado como ejemplo los números 23, 25 y 28. En primer lugar, por separado, hemos multiplicado 23 por 25 y 25 por 28, con resultados 1293 y 1573 respectivamente. Después se ha hallado el producto de ellos por el tercero, con el mismo resultado, 80557.

ANEXO

Función auxiliar

Function mzeck$(n)
Dim s$
Dim p, q, m

p = n
m = 0
s = ""
While p > 0
m = m + 1
q = antefibo(p)
s = s + Str$(quefibo(q)) + ","
p = p - q
Wend
mzeck = Str$(m) + "," + s
End Function

Función Producto

Function multizeck(a, b)
Dim u(20), v(20)
Dim s$
Dim m, p, q, i, j, z

s = mzeck(a)
m = InStr(1, s, ",")
p = Val(Left$(s, m - 1))


For i = 1 To p
s = Right(s, Len(s) - m)
m = InStr(1, s, ",")
If Len(s) > 0 Then u(i) = Val(Left$(s, m - 1))
Next i

s = mzeck(b)
m = InStr(1, s, ",")
q = Val(Left(s, m - 1))


For i = 1 To q
s = Right(s, Len(s) - m)
m = InStr(1, s, ",")
If Len(s) > 0 Then v(i) = Val(Left$(s, m - 1))
Next i


z = 0
For i = 1 To p
For j = 1 To q
z = z + fibo(u(i) + v(j))
Next j
Next i
multizeck = z
End Function



jueves, 25 de junio de 2020

Triángulos heronianos


Esta es la última entrada del curso 2019-20. Como todos los veranos, nos tomamos un descanso de dos meses. En ellos se actualizarán las publicaciones ligadas al blog y se prepararán nuevos contenidos. Feliz descanso.


Un triángulo se califica de heroniano si las longitudes de sus lados y el valor de su área son números enteros. Es un concepto aritmético, por lo que se supone que esto ocurre con una unidad de medida adecuada. Consecuencia de esto es que también es entero el perímetro. A veces se consideran lados y área racionales, pero aquí nos limitaremos a los enteros positivos.

El nombre que les aplicamos es un recuerdo de Herón de Alejandría, autor de la popular fórmula para el área de un triángulo conocidos los lados a, b y c:


En esta fórmula, p es el semiperímetro. Si A y los lados son todos enteros, el triángulo será heroniano. Esto exige que p(p-a)(p-b)(p-c) sea un cuadrado perfecto.

Una primera clase de este tipo de triángulos lo constituyen los pitagóricos, ya que en una terna pitagórica (a, b, c), el área equivale a a*b/2, y en estas ternas siempre existe un cateto par


Por tanto, también será heroniano el formado adosando dos triángulos de este tipo para formar un triángulo isósceles. Así, (20, 26, 26) será de este tipo, porque la altura sobre el lado 20 sería 24, y el área 240.

Igualmente, se pueden adosar dos triángulos pitagóricos que tengan un cateto común, como (5, 12, 13) y (9, 12, 15), formando el triángulo (9+5, 13, 15), es decir, ordenando, (13, 14, 15), que sería heroniano.

Es evidente que, en una terna de lados en un triángulo heroniano, si los multiplicamos todos por un mismo factor, resultará otro heroniano, luego el número de estos será infinito. Llamaremos terna primitiva a aquella en la que los tres lados sean primos entre sí.

Hay ternas que no son pitagóricas, ni tampoco resultado de adosar rectángulos, como (5, 29, 30).  Estas reciben el nombre de indescomponibles.

Búsqueda de ternas heronianas

Para encontrar este tipo de ternas existen varios algoritmos, algunos muy eficientes. Nosotros aquí, ya que usamos hojas de cálculo, recurriremos a una rutina que escriba cada terna que encontremos en una columna de la hoja. Como existen infinitas ternas, buscaremos entre dos valores. En contra de la costumbre de este blog, usaremos una rutina (macro) en lugar de una función, para escribir los resultados directamente, sin esperar a que la función se evalúe. Lo efectuaremos así:

En las celdas A1 y A2 de la hoja de cálculo escribiremos dos extremos de un intervalo. Lo recorreremos asignando sus valores al lado mayor, y buscaremos una pareja de lados que con él forme un triángulo heroniano. Para ello buscaremos que p(p-a)(p-b)(p-c) sea cuadrado entero. También habrá que tener en cuenta la propiedad de los lados de que “uno de ellos es menor que la suma de los otros dos y mayor que su diferencia”. Este ha sido el algoritmo elegido:

Sub heroniano()  ‘Es rutina y no función. Deberemos ejecutarla como macro.
Dim t1, t2, a, b, c, p, m, fila, t3

t1 = ActiveWorkbook.Sheets(1).Cells(1, 1).Value ‘Se leen los dos extremos t1 y t2 en A1 y A2
t2 = ActiveWorkbook.Sheets(1).Cells(2, 1).Value
fila = 2 ‘Primera fila de resultados
For a = t1 To t2 ‘El lado a se mueve entre los dos extremos
For b = 1 To a ‘El lado b será menor o igual que a
If a = b Then t3 = 1 Else t3 = a - b + 1 ‘Se busca el inicio para el lado c
For c = t3 To b
p = (a + b + c) / 2 ‘Se calcula el semiperímetro
m = p * (p - a) * (p - b) * (p - c) ‘Cuadrado del área (fórmula de Herón)
If escuad(m) Then ‘Si es un cuadrado, es válida
fila = fila + 1 ‘Como hay solución, la fila avanza
ActiveWorkbook.Sheets(1).Cells(fila, 1).Value = a ‘Se escriben a, b, c y el área
ActiveWorkbook.Sheets(1).Cells(fila, 2).Value = b
ActiveWorkbook.Sheets(1).Cells(fila, 3).Value = c
ActiveWorkbook.Sheets(1).Cells(fila, 4).Value = Sqr(m)
End If
Next c
Next b
Next a
End Sub

En la imagen puedes consultar las ternas heronianas en las que el lado mayor está comprendido entre 20 y 25:



Junto a cada terna figura el área entera. Observamos la abundancia de ternas de este tipo, algo que al iniciar el estudio no se esperaba.

En la página correspondiente de Wikipedia puedes encontrar gran número de propiedades de estos triángulos. Nosotros seguiremos con búsquedas.

Búsqueda de lados conociendo el perímetro

Para esta cuestión volveremos a la estrategia frecuente en este blog de comenzar con una función. Dado un número N, devolverá el primer triángulo heroniano que encuentre cuyo perímetro coincida con N. Su desarrollo es similar a la rutina de más arriba.

Function pheroniano$(n)
Dim b, c, p, m, a
Dim s$
Dim es As Boolean


s$ = "": es = False
a = n – 2 ‘Comenzamos con el lado mayor a
While a > 1 And Not es
b = 1
While b <= a And Not es
c = n - b - a
If c < a + b And c > a - b Then ‘c es menor que la suma de los otros dos y mayor que su diferencia
p = n / 2
m = p * (p - a) * (p - b) * (p - c)
If escuad(m) Then es = True: s$ = s$ + Str$(a) + Str$(b) + Str$(c) + Str$(Sqr(m))
End If
b = b + 1
Wend
a = a - 1
Wend
If s = "" Then s = "NO"
pheroniano = s
End Function

Con esta función es fácil encontrar los primeros perímetros de triángulos heronianos, junto con sus lados y el área:


Por ejemplo, si el perímetro es 54, el semiperímetro será 27, y el producto 27*(27-26)(27-3)(27-25)=27*1*24*2=1296, cuadrado perfecto, y el área, 36, es entera.

Filtros

En la función anterior podemos introducir filtros para encontrar ternas que cumplan algunas propiedades. Omitimos su código porque no es difícil de reproducir.

Ternas primitivas

Si exigimos que los tres lados a, b y c sean primos entre sí, nos resultarán las ternas primitivas. Estas son las primeras:



Como en casos anteriores, la primera columna es el perímetro, y en la segunda figuran, por este orden, los tres lados y el área. Mentalmente se puede comprobar que los lados son primos entre sí.

Si comparamos con la tabla anterior, vemos, por ejemplo, que falta el 24, porque su terna 10, 6, 8 está formada por los dobles de 5, 4 y 3.

También es destacable que entre estos triángulos aparecen isósceles, como 6, 5, 5 o 24, 13, 13

Con ellos seguimos:

Triángulos isósceles

Por motivos obvios, un triángulo heroniano equilátero no puede existir, porque si el lado es entero, la altura es irracional, pero sí puede ser isósceles, como sería el resultado de adosar dos pitagóricos iguales.

En la búsqueda basta exigir como filtro que a=b o b=c o a=c. Vemos el resultado:


Aquí coinciden primitivas y no primitivas. En todas ellas uno de los lados iguales junto con la mitad del desigual formarán un triángulo pitagórico al adjuntarles la altura correspondiente al desigual. Por ejemplo. En 30, 17, 17, el lado 17 y la mitad del 30 forman la terna pitagórica (8, 15, 17)

Lados en progresión aritmética

Existen muchos ejemplos de ternas heronianas con lados en progresión aritmética, pues si son así los de una terna primitiva, lo serán los que son múltiplos de ellos. Por eso es preferible buscar solo entre las primitivas. Para eso, además de exigir que a, b y c sean primos entre sí, exigiremos que formen progresión, es decir, que la diferencia entre dos de ellos coincida con la formada por el tercero. Como no se tiene seguridad de si b>c o c>b, esta condición será doble.

Al implementarlo resultan estos primeros casos:



Vemos que comienzan con dos muy populares, como son 3, 4 y 5, con área 6, y 13, 14, 15, con área 84. No están ordenados. Según el algoritmo usado, el menor se ha escrito en el centro. Para ser primitivas, aparecen más de lo esperado.
Aquí finalizamos los filtros. No se ha intentado con números primos porque la única posibilidad es que uno de ellos fuera 2, y no existe ningún caso.

Números triángulo

Llamaremos números triangulo N a aquellos que se puedan representar como el producto de tres factores N=a*b*c tales que constituyan las medidas de los lados de un triángulo heroniano.

Por ejemplo, 13520=20*26*26, que puede representar un triángulo isósceles cuya altura mide 24, luego su área será entera, e igual a 24*20/2=240.

Si deseamos usar la fórmula de Herón hallaríamos el semiperímetro:
p=(20+26+26)/2=36

La fórmula de Herón se planteará en este caso como


Con vistas a encontrar números triángulo, debemos descomponer N en tres factores a, b y c, y exigir después que sea cuadrada la expresión p(p-a)(p-b)(p-c).

La siguiente función se basa en esa idea. Como todas las de este blog, está desarrollada para Excel y Calc, pero es fácil traducirla a otro lenguaje de programación. Lo hacemos así porque el blog va de hoja de cálculo.

Esta función, aplicada a N, devuelve un “NO” si no es número triángulo o una cadena con los tres lados si lo es.

Function esuntriangulo$(n)
Dim a, b, c, d, m, p
Dim es As Boolean
Dim s$

s = "" ‘Variable que devuelve la función
es = False ‘Control de final de búsqueda
a = 2 ‘Primer factor
While a <= n / 2 And Not es
m = n / a
If m = Int(m) Then ‘Se ve que a es un factor de n
b = 2 ‘Segundo factor
While b <= m / 2 And Not es
c = m / b ‘Tercer factor
If c = Int(c) Then ‘Si los tres son factores, se sigue
d = (a + b + c) / 2 ‘Cálculo del semiperímetro
p = d * (d - a) * (d - b) * (d - c) ‘Producto de Herón
If escuad(p) and p>0 Then ‘Si el producto es cuadrado, N cumple lo planteado
es = True ‘Se interrumpe la búsqueda
s = s + Str$(a) + Str$(b) + Str$(c) ‘Solución
End If
End If
b = b + 1
Wend
End If
a = a + 1
Wend
If s = "" Then s = "NO"
esuntriangulo = s
End Function

Aplicando esta función a los primeros números naturales obtendrás esta sucesión, que está publicada en http://oeis.org/A218243

60, 150, 200, 480, 780, 1200, 1530, 1600, 1620, 1690, 1950, 2040, 2100, 2730, 2860, 3570, 3840, 4050, 4056, 4200, 4350, 4624, 5100, 5400, 5460, 6240, 7500, 8120, 8250, 8670, 8750, 9600, 10812, 11050, 11900, 12180, 12240, 12800, 12960, 13260, 13520, 13650,…

El penúltimo de la lista es 13520, el que nos ha servido de ejemplo.

Por ejemplo, 60=3*4*5, terna pitagórica que representa a un triángulo de área 6.

Es evidente que si un número está en la lista, N=a*b*c, también estará N*k^3=ak*bk*ck. Por tanto, esta sucesión es infinita.


lunes, 15 de junio de 2020

Sumas consecutivas de elementos consecutivos


De nuevo una entrada de este blog se basa en una propiedad publicada por mí en Twitter (día 7/4/2020)

Iniciamos los cálculos del día 7 con dos sumas de oblongos consecutivos en las que ellas también son consecutivas:

7420=29×30+30×31+31×32+32×33+33×34+34×35+35×36
7420=36×37+37×38+38×39+39×40+40×41

Es muy curiosa esta propiedad, que una suma comience cuando termina otra y que ambas presenten el mismo resultado.

Emprenderemos una búsqueda de sumas que compartan esta propiedad, pero a efectos del algoritmo correspondiente, es preferible dar protagonismo al elemento que separa una suma de otra, en el caso del ejemplo, 35×36. Se puede también basar el cálculo en 36×37, pero había que elegir.

Estructura general el algoritmo

Se puede proponer la siguiente estructura de algoritmo, que servirá, no solo para oblongos, sino para otros tipos de números, como cuadrados o triangulares. Los pasos podrán ser:

  1. Se construye una función para un valor de n que tenga la misma naturaleza que los sumandos. Si no lo es, salimos de la función. En el ejemplo n=35×36. Como es oblongo, seguimos. Si no lo fuera, la función devolvería un valor de error.
  2. Iniciamos una suma “por la izquierda”. Fijamos s1 = n. Definimos una variable p con el valor de n y un contador i=1
  3. Esa variable p descenderá hasta 1, añadiendo sumandos a  s1
  4. Para cada valor de p y s1 construimos otra suma s2 “por la derecha”, a partir de p+1 sin sobrepasar el valor de i.
  5. Si coinciden s1 y s2, ya hemos terminado
  6. Si nunca coinciden, devuelve un “NO”

Lo entenderás mejor con el listado de la función para enteros.

Propiedad para enteros

Buscaremos, en primer lugar, aquellas sumas de este tipo formadas por enteros. Por ejemplo, el número 8 es centro de dos sumas consecutivas:

4+5+6+7+8=30=9+10+11

En este ejemplo, i=4, porque hay que tomar 4 sumandos a la izquierda del 8, y j=2, porque se toman 2 a partir de 8+1=9. Se puede cambiar este conteo si se desea. Aquí, s1=s2=30.

La función que resuelve esto puede ser:

Function igualsuma(n) 'con enteros
Dim i, j, p, p1, q, s1, s2
Dim a$

a = ""
s1 = n: p = n: p1 = p: i = 1
While p > 1 ‘i llega hasta 1 como máximo
p = p - 1
s1 = s1 + p ‘Construimos s1
q = p1: s2 = 0: j = 0
While j < i ‘j no sobrepasa a i, porque ha de ser menor
q = q + 1
s2 = s2 + q ‘Construimos s2
If s1 = s2 Then a = a + "&&" + Str$(n) + "//" + Str$(i) + ", " + Str$(j) + "  S1 " + Str$(s1) + "  S2 " + Str$(s2)
j = j + 1
Wend
i = i + 1
Wend
If a = "" Then a = "NO"
igualsuma = a
End Function

Si emprendemos una búsqueda obtendremos los primeros números que son centro de dos sumas iguales. Algunos, como el 12, presentan dos coincidencias distintas en las sumas:

2            && 2// 1,  0  S1  3  S2  3                              
6            && 6// 2,  1  S1  15  S2  15                                         
7            && 7// 5,  2  S1  27  S2  27                                         
8            && 8// 4,  2  S1  30  S2  30                                         
12          && 12// 3,  2  S1  42  S2  42&& 12// 9,  4  S1  75  S2  75                                 
14          && 14// 13,  5  S1  105  S2  105                                
17          && 17// 13,  6  S1  147  S2  147                                
18          && 18// 6,  4  S1  105  S2  105                                  
19          && 19// 8,  5  S1  135  S2  135                                  
20          && 20// 4,  3  S1  90  S2  90                                      
22          && 22// 17,  8  S1  243  S2  243                                
25          && 25// 14,  8  S1  270  S2  270                                
26          && 26// 17,  9  S1  315  S2  315                                
27          && 27// 21,  10  S1  363  S2  363                             
30          && 30// 5,  4  S1  165  S2  165                                  
                                           

Estos resultados se pueden interpretar de la siguiente forma, que vemos con el ejemplo del 18:

18          && 18// 6,  4  S1  105  S2  105

En primer lugar leemos el centro o pivote de las sumas, en este caso, && 18//. Los siguientes números 6 y 4 son respectivamente los sumandos tomados a la izquierda del 18 y los tomados a la derecha a partir del 19, incluyendo este (serían 7 y 5 en total). Estas serían las dos sumas consecutivas:

12+13+14+15+16+17+18=105, que es el valor s1 que devuelve la función
19+20+21+22+23=105, que es el valor devuelto como s2, coincidente con s1.

Observamos que existen muchos números que cumplen esta propiedad, y que incluso se forman grupos de consecutivos. Es normal, por ser números enteros que presentan diferencias pequeñas en sus sumas. Aparecerán menos con otros tipos de números.

Números oblongos

Este fue el caso que publiqué en Twitter. Podemos usar el mismo esquema para enteros, con las siguientes diferencias.

(1) Si el número no es oblongo, salimos de la función con un “NO”
Para saber si un número O es oblongo, hay que recordar que será el doble de un triangular T, y que estos se caracterizan porque 8T+1 es un cuadrado. Así que en los oblongos O será cuadrado 4O+1. Aquí tienes una implementación para Excel y Calc:

Public Function esoblongo(n) As Boolean
If escuad(4 * n + 1) Then esoblongo = True Else esoblongo = False
End Function

(2) Las sumas del listado de arriba, s1=s1+p y s2=s2+q se cambiarán a s1=s1+p*(p+1) y s2=s2+q*(q+1), para que cada sumando sea oblongo.

Con estos cambios, y quizás algún otro menor, obtendremos el listado de los primeros números equivalentes a dos sumas de oblongos consecutivos, que a su vez son consecutivas:

12          && 12// 2,  0  S1  20  S2  20         
72          && 72// 3,  1  S1  200  S2  200    
240        && 240// 4,  2  S1  920  S2  920  
600        && 600// 5,  3  S1  2920  S2  2920            
1260      && 1260// 6,  4  S1  7420  S2  7420          
2352      && 2352// 7,  5  S1  16240  S2  16240      
4032      && 4032// 8,  6  S1  31920  S2  31920      
4692      && 4692// 33,  15  S1  95200  S2  95200 
5852      && 5852// 69,  19  S1  152040  S2  152040           
6480      && 6480// 9,  7  S1  57840  S2  57840      
9900      && 9900// 10,  8  S1  98340  S2  98340   
10100    && 10100// 77,  25  S1  339352  S2  339352         
14520    && 14520// 11,  9  S1  158840  S2  158840           
17030    && 17030// 86,  32  S1  720940  S2  720940         
20592    && 20592// 12,  10  S1  245960  S2  245960         
28392    && 28392// 13,  11  S1  367640  S2  367640         

Podemos observar en la quinta fila el caso que publiqué:

1260      && 1260// 6,  4  S1  7420  S2  7420

A partir de 1260=35*36, oblongo por tanto, se toman 6 sumandos más a la izquierda y 4 más a la derecha de 36*37, reproduciéndose así lo que se publicó en su día.

Con primos

Ya está publicado en http://oeis.org/A089930

A089930 Primes p such that there exists a set of consecutive primes ending with p which has the same sum as a set starting right after p.                           

3, 13, 47, 73, 83, 269, 349, 359, 487, 569, 569, 787, 859, 929, 941, 1171, 1237, 1297, 1307, 1429, 1549, 1553, 1607, 1877, 2011, 2083, 2111, 2113, 2389, 2399, 2557, 2579, 2633, 2659, 2677, 2749, 2777, 2837, 2969, 3001, 3019, 3019, 3067, 3119, 3169, 3203,…

Nos hemos limitado a adaptar el algoritmo inicial al caso de primos. Los resultados concuerdan con los publicados:

3             && 3// 1,  0  S1  5  S2  5&& 3// 2,  0  S1  5  S2  5
13          && 13// 3,  1  S1  36  S2  36
47          && 47// 10,  4  S1  311  S2  311
73          && 73// 9,  5  S1  552  S2  552
83          && 83// 17,  7  S1  846  S2  846
269        && 269// 36,  18  S1  6231  S2  6231
349        && 349// 56,  24  S1  10649  S2  10649
359        && 359// 61,  25  S1  11470  S2  11470
487        && 487// 63,  31  S1  19066  S2  19066
569        && 569// 13,  11  S1  7256  S2  7256&& 569// 71,  35  S1  24518  S2  24518

En cada suma se añaden o los primos anteriores o los posteriores a cada sumando. Observamos, por ejemplo, que 569 equivale a dos casos distintos. Desarrollamos el primero:

&& 569// 13,  11  S1  7256  S2  7256

Deberemos tomar 13 primos anteriores a 569 y consecutivos con él, incluyéndolo en la suma. Después, 11 primos siguientes a 569, también incluyendo ese siguiente. Lo comprobamos:

Decreciente: 

569+563+557+547+541+523+521+509+503+499+491+487+479+467=7256
Creciente: 571+577+587+593+599+601+607+613+617+619+631+641=7256

El segundo caso supone sumas de muchos sumandos, y lo dejamos sin comprobar.

Con triangulares y cuadrados

Como el tema ya está bastante estudiado con los ejemplos anteriores, solo añadiremos los primeros números que cumplen la propiedad para números triangulares y para los cuadrados.

6             && 6// 2,  0  S1  10  S2  10                                         
36          && 36// 3,  1  S1  100  S2  100                                  
120        && 120// 4,  2  S1  460  S2  460                                
300        && 300// 5,  3  S1  1460  S2  1460                                          
630        && 630// 6,  4  S1  3710  S2  3710                                          
1176      && 1176// 7,  5  S1  8120  S2  8120                                        
2016      && 2016// 8,  6  S1  15960  S2  15960                                   
2346      && 2346// 33,  15  S1  47600  S2  47600                               
2926      && 2926// 69,  19  S1  76020  S2  76020                               
3240      && 3240// 9,  7  S1  28920  S2  28920                                   
4950      && 4950// 10,  8  S1  49170  S2  49170                                 
5050      && 5050// 77,  25  S1  169676  S2  169676                                         
7260      && 7260// 11,  9  S1  79420  S2  79420                                 
8515      && 8515// 86,  32  S1  360470  S2  360470                                         

Por ejemplo, 1460 equivale a estas dos sumas de triangulares:

1460=190+210+231+253+276+300
1460=325+351+378+406

Todos los triangulares de estas dos sumas son consecutivos, desde 190=19*20/2, hasta 406 =28*29/2

Cuadrados

Los primeros casos son:

16          && 16// 1,  0  S1  25  S2  25         
144        && 144// 2,  1  S1  365  S2  365  
576        && 576// 3,  2  S1  2030  S2  2030            
1156      && 1156// 16,  7  S1  11900  S2  11900   
1444      && 1444// 34,  9  S1  19005  S2  19005   
1600      && 1600// 4,  3  S1  7230  S2  7230          
2500      && 2500// 38,  12  S1  42419  S2  42419 
3600      && 3600// 5,  4  S1  19855  S2  19855      
7056      && 7056// 6,  5  S1  45955  S2  45955      
12100    && 12100// 50,  24  S1  379525  S2  379525         
12544    && 12544// 7,  6  S1  94220  S2  94220   
20164    && 20164// 126,  36  S1  963295  S2  963295       
20736    && 20736// 8,  7  S1  176460  S2  176460              
25281    && 25281// 92,  38  S1  1254539  S2  1254539     
32400    && 32400// 9,  8  S1  308085  S2  308085              
48400    && 48400// 10,  9  S1  508585  S2  508585           
69696    && 69696// 11,  10  S1  802010  S2  802010         
97344    && 97344// 12,  11  S1  1217450  S2  1217450     

Un ejemplo sencillo es el de 1600 como separador de las dos sumas:
1600=40^2, y se tiene:

36^2+37^2+38^2+39^2+40^2=7230
41^2+42^2+43^2+44^2=7230

Ambas sumas coinciden, luego se cumple la propiedad pedida.

Con estos ejemplos vemos que la propiedad es exigente, y pocos números la cumplen, pero yo esperaba que aparecieran menos.