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.