miércoles, 4 de diciembre de 2024

Regresos 12 - El problema del albañil

Este problema consiste en encontrar qué números N poseen un cuadrado N2 que sea suma de cubos consecutivos. Se consideran cubos mayores que 1, pues todos los números triangulares poseen cuadrados que son suma de los primeros cubos, según la conocida fórmula 13+23+33+43+…n3=(n(n+1)/2)2, y se desea eliminar un exceso de casos triviales.

Se exige también que el número de cubos sea al menos de tres. Según la página https://oeis.org/A238099, un ejemplo es el de

312^2 = 97344 = 14^3 + 15^3 + ... + 25^3.

El nombre y las condiciones del problema (por ejemplo, que se use el cuadrado del número) vienen de un ejercicio propuesto en un libro de Dudeney:

H. E. Dudeney, Amusements in Mathematics, Nelson, London, 1917, Problem 135.

Lo podemos consultar en https://archive.org/details/amusementsinmath00dude/page/24/mode/1up?view=theater

Su enunciado es un tanto artificioso, pero sirvió de base para estudiar con más profundidad las sumas de cubos consecutivos. El problema, como vemos, está resuelto, pero aquí estudiaremos los algoritmos que lo pueden resolver en una hoja de cálculo.

Hemos catalogado esta entrada como regreso, porque complementa otra nuestra de 2013, https://hojaynumeros.blogspot.com/2013/04/las-sumas-de-cubos-nos-llevan-los.html

En ella estudiábamos las sumas de cubos consecutivos, pero las derivábamos a otras cuestiones, como las ternas pitagóricas. Nos dedicaremos al problema del albañil, pero podremos referirnos a algún resultado contenido en esa entrada de hace años.

Desde hace un tiempo se prefieren en este blog las funciones que devuelven un texto. Son más explicativas y no dificultan búsquedas posteriores si se saben construir. En este caso del problema del albañil adaptaremos específicamente alguna otra función similar. La que presentamos da las soluciones de sumas de cuadrados sólo cuando se excluye el 1 y se exigen al menos tres sumandos. Su código para Excel y Libreoffice Calc es el siguiente:

Function albanil$(n)
Dim i, j, a, n1
Dim s$
Dim novale As Boolean

s = "" ‘Contenedor de la solución
n1 = n ^ 2 ‘Trabajamos con el cuadrado
i = Int(n1 ^ (1 / 3)) ’Máximo cubo contenido en n^2
novale = True ‘Suponemos que no hay solución
While i > 1 And novale ‘Desciende el mayor cubo hasta 2^3
a = i ^ 3 ‘Primera suma de cubos
j = i’Cubo inicial de la suma
While j > 1 And a <= n1 And novale
‘Se llega a la solución de tres cubos o más
If a = n1 And i - j > 2 Then s = s + "Desde" + Str$(j) + " hasta " + Str$(i): novale = False ‘novale ya no es cierto
j = j – 1’Desciende el primer cubo
a = a + j ^ 3’Se incrementa la suma
Wend
i = i – 1’Desciende el último cubo
Wend
If novale Then s = "NO"
albanil = s
End Function

Con esta función y un buscador podemos reproducir la lista publicada de soluciones:

Estos resultados coinciden con los publicados en https://oeis.org/A238099, luego nuestro primer objetivo está cumplido.

Usamos números triangulares

Recordamos la siguiente equivalencia:

Según ella, una suma de cubos que no comience con 1 será equivalente a una diferencia de los cuadrados de dos números triangulares.

Esto nos permite utilizar la diferencia entre los cuadrados de dos números triangulares para identificar las sumas de cubos. Así obtendríamos una variante alternativa a la vista en anteriores párrafos.

Para encontrar los dos números triangulares basta descomponer N en productos de suma por diferencia de dos números, ya que eso equivale a una diferencia de cuadrados. Una vez obtenidos se les exige que sean triangulares y que sus órdenes se diferencien en más de 3 unidades.

Descomponemos N en productos de la misma paridad, N=pq y después definimos a=(p+q)/2 y b=(p-q)/2, con lo que tendríamos los posibles triangulares. Es una técnica que hemos usado a menudo. Después analizamos si son triangulares con las funciones estriangular y ordentriang, muy usadas en este blog.

Function estriangular(n) As Boolean
Dim a
a = Int((Sqr(8 * n + 1) - 1) / 2)
If a * (a + 1) = 2 * n Then estriangular = True Else estriangular = False
End Function

Public Function ordentriang(n)
Dim k
If estriangular(n) Then k = Int((Sqr(8 * n + 1) - 1) / 2) Else k = 0
ordentriang = k
End Function

El código de esta función es:

Function albanil2$(n)
Dim i, j, p, q, a, b, n1
Dim s$
Dim novale As Boolean

s = "" ‘Contenedor de la solución
n1 = n ^ 2 ’Trabajamos con el cuadrado
i = 1 ‘Primer divisor
novale = True
While i <= n And novale
If n1 / i = n1 \ i Then ‘Es divisor
j = n1 / i ‘Divisor complementario
If (j - i) Mod 2 = 0 Then ‘Tienen la misma paridad los factores
p = (i + j) / 2: q = (j - i) / 2 ‘Vamos construyendo la diferencia de cuadrados
If estriangular(p) And estriangular(q) Then
a = ordentriang(p): b = ordentriang(q) ‘Son ambos triangulares
If a - b > 3 And b > 1 Then s = s + "Desde" + Str$(b + 1) + " hasta " + Str$(a): novale = False
End If
End If
End If
i = i + 1
Wend
If novale Then s = "NO"
albanil2 = s
End Function

En la entrada a la que regresamos hoy se termina considerando que los dos triangulares de la diferencia de cuadrados y el número N estudiado forman una terna pitagórica, pero este tema es preferible leerlo en la entrada original.

Con esto cumplimos nuestro objetivo, que era sólo algorítmico.