jueves, 21 de mayo de 2020

Bases de cubos con suma cero



 Otra entrada más que se basa en mis cálculos en Twitter (@connumeros). El día 22/3/2020 publiqué:

22320 se puede representar mediante dos sumas de cubos cuyas bases suman 0:

22320=(-16)^3+(-15)^3+31^3, con 31+(-15)+(-16)=0

22320 =(-60)^3+(-2)^3+62^3 y 62+(-2)+(-60)=0

No son muchos relativamente los números que cumplen una propiedad similar. 

Comenzaremos con aquellos que presenten suma de cubos cuyas bases sumen cero al menos una vez. El primero es el 6, que se puede representar como 

6=2^3+(-1)^3+(-1)^3, con 2+(-1)+(-1)=0

Función adecuada

En este blog llevamos tiempo usando funciones para estudiar algunas cuestiones. Es un método bastante flexible y que facilita una traducción entre lenguajes. Después usaremos una rutina para comprobar.

En primer lugar, hay que destacar que esta condición se puede simplificar. En lugar de usar la igualdad N=p3-q3-r3, dado que p=q+r, podemos representar r como p-q. Según esto, la condición sería N=p3-q3-(p-q)3.

Si partimos de esa igualdad, desarrollando, N=p3-q3-(p3-3p2q+3pq2-q3)=3p2q-3pq2=3pq(p-q).

Esta expresión 3pq(p-q) nos servirá para construir una parada en la búsqueda, exigiendo que 3pq(p-q)<=N y también para sustituir a N=p3-q3-r3. Es más rápido así. También nos indica que N ha de ser múltiplo de 6, ya que pq(p-q) es siempre par.

Versión para Excel

La siguiente función actúa sobre un número natural y devuelve una cadena de texto, que puede estar vacía o contener la primera solución que se encuentre. Este es su listado:

Function cubossum(n)
Dim i, j, a
Dim es
Dim s$

If n Mod 6 <> 0 Then cubossum = "": Exit Function ‘Da salida si no es múltiplo de 6
es = False ‘Parará el proceso si se encuentra solución
i = 1  ‘Contador para la variable p
s = ""  ‘Cadena de texto para el resultado
a = 0 ‘Contendrá la suma de cubos
While a <= n And Not es ‘Se para si se llega a n o se encuentra una suma
j = 1 ‘Contador de la variable q
While j < i And Not es
a = 3 * i * j * (i - j) ‘Expresión buscada
If a = n Then es = True: s = s + Str$(j) + Str$(i) ‘Se encuentra solución
j = j + 1
Wend
i = i + 1
Wend
cubossum = s
End Function

Con esta función podemos organizar una búsqueda de aquellos números que presentan la descomposición buscada. Los primeros son:


Cada número encontrado viene acompañado del valor de q y el de p. Así, para 210, q=2 p=7, luego 210 = 73-23-(7-2)3 = 73-23-53 = 343-8-125 = 210

Un listado más completo es

6, 18, 36, 48, 60, 90, 126, 144, 162, 168, 210, 216, 252, 270, 288, 330, 360, 378, 384, 396, 468, 480, 486, 540, 546, 594, 630, 720, 750, 792, 816, 858, 918, 924, 972, 990, 1008, 1026, 1140, 1152, 1170, 1260, 1296, 1344, 1386, 1404, 1518, 1530, 1560, 1620, 1638, 1656, 1680, 1728, 1800…

Rutina de comprobación

Para comprobar este listado podemos usar técnicas de Excel, ya que permite la creación de listas usando sus flas o columnas. Lo podemos efectuar en tres fases:

1.      Se recorren todos los valores posibles de p3-q3-(p-q)3 hasta cierto tope.
2.      Se vuelcan todos en la columna A. Aparecerán desordenados y repetidos
3.      Se usan los comandos del apartado Datos para ordenar y eliminar duplicados.

En la primera fase usaremos una macro en lugar de una función, para que se puedan situar las soluciones en la columna A. Hemos usado esta:

Sub cuboss()
Dim i, j, k, v


k = 0 ‘Esta variable representa la fila en la que se va a escribir
For i = 1 To 40  ‘Con dos bucles completos se recorren las sumas tipo p3-q3-(p-q)3
For j = 1 To i - 1
k = k + 1 ‘Se incrementa la fila, para escribir en columna
v = i ^ 3 - j ^ 3 - (i - j) ^ 3 ‘Expresión buscada
ActiveWorkbook.Sheets(1).Cells(k, 1).Value = v ‘Se añade a la columna A
Next j
Next i
End Sub

Hemos elegido un tope de 40 en la búsqueda. Para casos sencillos parece excesivo.

Se volcarán los resultados de esta forma:



Tal como esperábamos, aparecen desordenados y duplicados.

Acudimos a los comandos de Datos:



En primer lugar, seleccionamos la columna A y pedimos Quitar duplicados.

Nos indicará que se han quitado miles de duplicados, y quedará:


Ahora solo queda ordenar:



Así ya lo hemos conseguido, pudiendo comprobar que coincide con el listado anterior.



Si para un número mayor de términos viéramos que falta alguno, bastaría subir el tope de 40 en la macro.

Todo esto se puede traducir al lenguaje PARI:

ok(n) = {my(i=1,a=0,m=0,j);if(n%6==0,while(a<=n&&m==0,j=1;while(j<i&&m==0,a=3*i*j*(i-j);if(a==n,m=1);j+=1);i+=1)); m}
{for(p=1,2000,if(ok(p),print1(p,", ")))}

Si lo pruebas en https://pari.math.u-bordeaux.fr/gp.html obtendrás la lista de los primeros números que cumplen esta descomposición:

6, 18, 36, 48, 60, 90, 126, 144, 162, 168, 210, 216, 252, 270, 288, 330, 360, 378, 384, 396, 468, 480, 486, 540, 546, 594, 630, 720, 750, 792, 816, 858, 918, 924, 972, 990, 1008, 1026, 1140, 1152, 1170, 1260, 1296, 1344, 1386, 1404, 1518, 1530, 1560, 1620, 1638, 1656, 1680, 1728, 1800,…

Resultados múltiples

Algunos de estos números presentan varias descomposiciones. El primero es 90, que admite las dos sumas 90=5^3-3^3-2^3 y 90=6^3-5^3-1^3. Después le siguen estos:


Si adaptamos a PARI obtenemos un listado más extenso:

90, 630, 720, 1170, 1260, 1386, 2430, 2640, 3024, 3060, 3168, 3366, 3570, 4446, 5040, 5760, 5940, 6210, 6300, 6930, 8910, 9360, 10080, 11088, 11250, 12480, 12870, 12960, 14490, 14742, 16380, 17010, 18018, 18270, 18810, 19440, 19890, 21120, 22140, 22320, 23310, 24192, 24480, 24570, 25344, 25740, 26928, 27360, 27720, 28560, 29700...

Se ha usado el código

ok(n) = {my(i=1,a=0,m=0,j);if(n%6==0,while(a<=n,j=1;while(j<i,a=3*i*j*(i-j);if(a==n&&j>=i-j,m+=1);j+=1);i+=1)); m>1}
{for(p=1,30000,if(ok(p),print1(p,", ")))}

Destaca el 720 con tres descomposiciones:

720=10^3-6^3-4^3=12^3-10^3-2^3=16^3-15^3-1^3

El primero con 4 es 19440: 19440=30^3+(-18)^3+(-12)^3=36^3+(-30)^3+(-6)^3=48^3+(-45)^3+(-3)^3=81^3+(-80)^3+(-1)^3

Con cinco hemos obtenido el 55440, equivale a estas sumas:   
    
55440=42^3+(-22)^3+(-20)^3=44^3+(-30)^3+(-14)^3=55^3+(-48)^3+(-7)^3=70^3+(-66)^3+(-4)^3=80^3+(-77)^3+(-3)^3

Lo dejamos aquí, porque nuestros instrumentos de cálculo se ralentizan con números grandes.

lunes, 11 de mayo de 2020

Sumas de cuadrados con el mismo resultado


De nuevo tomamos un tweet de @connumeros para profundizar en una cuestión. 

El día 1/3/2020 publiqué en Twitter lo siguiente:

1320 es suma de cuadrados pares consecutivos, y también de impares:

Pares: 1320=12^2+14^2+16^2+18^2+20^2=(20×21×22-10×11×12)/6

Impares: 1320=5^2+7^2+9^2+11^2+13^2+15^2+17^2+19^2=(19×20×21-3×4×5)/6

Esto me dio la idea de buscar coincidencias de varias sumas de cuadrados con un mismo resultado. El problema que nos aparecerá será la lentitud de los cálculos, pues nos encontraremos con bucles dobles y triples en los algoritmos de búsqueda. Comenzamos por los más sencillos:

Coincidencias en las sumas de cuadrados

Dado un número natural cualquiera, nos podemos plantear a cuantas sumas de cuadrados equivale. Nos podemos basar en la conocida fórmula de la suma de los primeros cuadrados:


Con esta fórmula, si deseamos encontrar una suma S de cuadrados que comience en p y termine en q, su expresión sería S(p,q)=(q(q+1)(2q+1)-(p-1)p(2p-1))/6

Esta expresión se puede implementar en un algoritmo que busque los números que presentan más de dos descomposiciones en suma de cuadrados consecutivos. 

Lo presentaremos en PARI:

for(n=1, 25000, m=0; i=1; while(i^2<=n, j=0; while(j<i, if(i*(i + 1)*(2*i + 1) - j*(j + 1)*(2*j + 1) == 6*n, m+=1); j+=1); i+=1);if(m>1,print1(n,", ")))

En él, para cada n recorremos los valores de i mientras i^2>=n. Añadimos otra variable j, que será el inicio de la posible suma de cuadrados. Usamos la fórmula de más arriba, y si el resultado es n, incrementamos el contador m. Si este pasa de 1, imprimimos.

Prueba este código en https://pari.math.u-bordeaux.fr/gp.html y obtendrás la siguiente sucesión, que ya está publicada:

A130052    Numbers that are the sum of one or more consecutive squares in more than one way.       
                    
25, 365, 841, 1405, 1730, 2030, 3281, 3655, 3740, 4510, 4705, 4760, 4900, 5244, 5434, 5915, 5929, 7230, 7574, 8415, 8464, 9385, 11055, 11236, 11900, 12325, 12524, 14905, 16745, 17484, 18879, 19005, 19044, 19855, 20449, 20510, 21790, 22806, 23681

Aunque la idea de este algoritmo parece acertada, es más rápido este otro, que se limita a sumar cuadrados sin ningún uso de fórmulas. Así que dejamos los dos para comprobar.

ok(n) = {my(i=sqrtint(n), m=0, a);while(i>0&&m<2, a=i^2; j=i; while(j>0&&a<=n,if(a==n, m+=1); j-=1; a=a+j^2); i-=1); return(m>1)}
for(p=1, 24000, if(ok(p), print1(p,", ")))

Este programa lo hemos añadido a la sucesión publicada.

Coincidencias en sumas de cuadrados impares

La fórmula adecuada para sumar números impares consecutivos es muy parecida a la general:


Aunque es útil en otros estudios, parece, tal como se comentó más arriba, que la suma directa de cuadrados es más rápida en lenguaje PARI (y en el VBASIC de Excel) que la suma con esta fórmula. La razón no es que sea ineficiente, sino que requiere bucles de búsqueda más amplios. La usaremos para comprobar.

Para VBasic de Excel usaremos la misma función para cuadrados pares o impares. El listado siguiente sirve para cuadrados impares, y en una de las líneas añadimos como comentario cómo habría que sustituirla para que sirviera para cuadrados pares:

Function vsumacuad3$(n) 'Pares o impares
Dim i, j, m, a
Dim s$

s = ""
i = Int(Sqr(n)) ‘Comenzamos con la posibilidad de un solo cuadrado
If i Mod 2 = 0 Then i = i – 1 ‘Para adaptar al caso PAR, usar If i Mod 2 = 1 Then i = i – 1
m = 0 ‘Número de soluciones
While i > 0 And m < 2
a = i ^ 2
j = i ‘La variable j recorre los posibles sumandos cuadrados
While j > 0 And a <= n
If a = n Then m = m + 1: s = s + "###" + Str$(i) + ", " + Str$(j) ‘Se ha encontrado una suma
j = j – 2 ‘Tanto j como i bajan de 2 en 2 para mantener la paridad
a = a + j ^ 2
Wend
i = i - 2
Wend
If s = "" Then s = "NO" Else s = Str$(m) + s ‘Se añade el número de soluciones
vsumacuad3 = s
End Function

Buscar soluciones con esta función es una tarea bastante lenta. Como se ha querido llegar a un rango de 2 millones en la búsqueda, ha sido un proceso de muchos minutos. Los primeros números que presentan dos soluciones con sumas de cuadrados impares son estos:

2890, 7735, 22715, 60655, 70225, 87571, 92225, 93314, 136115, 152354, 155519, 256330, 326434, 475861, 511225, 562475, 636360, 671195, 695419, 733485, 808335, 847760, 876490, 1105819, 1107414, 1225965, 1252216, 1293425, 1373701, 1540081, 1541165, 1627899, 1633069, 1832824, 1848405, 1979649

Por ejemplo, 2890 = 37^2 + 39^2 y también 2890 = 7^2 + 9^2 + 11^2 + 13^2 + 15^2 + 17^2 + 19^2 + 21^2 + 23^2 + 25^2

En el lenguaje PARI puedes probar con la fórmula insertada en párrafos anteriores, pero descubrirás pronto su lentitud de proceso. Este sería el código adecuado.

for(n=1, 100000, m=0; i=1; while(i^2<=n, j=1; while(j<i, if(i*(i + 1)*(i+2) - j*(j + 1)*(j+2) == 6*n, m+=1); j+=2); i+=2);if(m>1,print1(n,", ")))

Después de transcurrir algunos minutos, te devolverá las ocho primeras soluciones: 2890, 7735, 22715, 60655, 70225, 87571, 92225, 93314. Hay que imaginar lo que tardaría en llegar a 2 millones en la búsqueda.

Es más rápido este otro programa:

ok(n) = {my(i=sqrtint(n), m=0, a); i=i-(i%2==0); m=0; while(i>0&&m<2, a=i^2; j=i; while(j>0 && a<=n, if(a==n, m+=1); j-=2; a=a+j^2); i-=2); return(m>1)}
concat([0], select(ok, [1..22000]))

Suma de cuadrados pares

Las técnicas usadas para los números impares sirven también para los pares, ya que sus fórmulas son similares. En el listado para impares en Vbasic ya lo adveríamos:

If i Mod 2 = 0 Then i = i – 1 ‘Para adaptar al caso PAR, usar If i Mod 2 = 1 Then i = i – 1

Así obtendríamos:

100, 1460, 3364, 5620, 6920, 8120, 13124, 14620, 14960, 18040, 18820, 19040, 19600, 20976, 21736, 23660, 23716, 28920, 30296, 33660, 33856, 37540, 44220, 44944, 47600, 49300, 50096, 59620, 66980, 69936, 75516, 76020, 76176, 79420, 81796, 82040, 87160, 91224, 94724, 99856

Por ejemplo, 1460=26^2+28^2 y también 1460=20^2+22^2+24^2

Versión en PARI

Prueba este código y obtendrás el mismo listado. Lo hemos organizado sólo hasta 22000 para que no sea tan lento.

ok(n) = {my(i=sqrtint(n), m=0,a,j); i=i-(i%2==1); m=0; while(i>0&&m<2, a=i^2; j=i; while(j>0 && a<=n, if(a==n, m+=1); j-=2; a=a+j^2); i-=2); return(m>1)}
concat([0], select(ok, [1..22000]))

Caso de pares e impares

Llegamos a nuestro objetivo principal, que es buscar aquellos números, como 1320, que admiten sumas de cuadrados pares y también de impares.

Para ello, refundiremos los algoritmos en uno: buscaremos pares e impares por separado y uniremos los resultados mediante una conjunción lógica. En Excel supone un listado bastante largo. Por ello, damos una idea en PARI:

Se idea una función (issum) que admita un segundo parámetro además de n (sea t), tal que si vale 0 sirva para los pares y si es 1, para los impares, o al contrario, porque es indiferente. Después, en la función Ok refundimos los dos resultados haciendo una conjunción con la conectiva Y (&& en PARI)

Quedaría así:

issum(n,t)={my(i,j,a,m=0);i=sqrtint(n);if(t==0,if(i%2==0,i-=1),if(i%2==1,i-=1));while(i>0&&m<1,a=i^2;j=i;while(j>0&&a<=n,if(a==n,m+=1);j-=2;a=a+j^2);i-=2);return(m)}
isok(m)=issum(m,0)&&issum(m,1)
for(p=1,20000,if(isok(p),print(p)))

Con estas dos funciones refundidas obtenemos el listado que pretendíamos. Entre los números encontrados, algunos presentarán soluciones dobles para pares o para impares, pero eso no nos importa por ahora. Lo dejamos por si alguien quiere investigar. Chocará con la lentitud de los algoritmos.

Los primeros números con esta propiedad mixta son:

164, 596, 1320, 1736, 3156, 4040, 5204, 9416, 10660, 22096, 27080, 29260, 29584, 40020, 69940, 73140, 79540, 85284, 87636, 112916, 113480, 121996, 137960, 161480, 171940, 176420, 182104, 209924, 214396, 221780, 231760, 260120, 290280,…

Por ejemplo, 1736 equivale a estas dos sumas de cuadrados:

Pares: 1736=22^2+24^2+26^2

Impares: 1736=7^2+9^2+11^2+13^2+15^2+17^2+19^2+21^2