Caso general
En los cálculos que publico diariamente uso dos funciones para averiguar si un número es suma de cubos o bien diferencia. No se me había ocurrido simultanear ambas propiedades y lo hago ahora.
¿Qué
números enteros positivos son suma de dos cubos y simultáneamente diferencia de
otros dos, siendo en ambos casos cubos enteros positivos?
Un ejemplo es el 152, que por una parte equivale a 3^3+5^3=27+125, y por otra a 6^3-4^3=216-64.
Con las publicaciones precedentes tenemos acceso a dos funciones que encuentran estas descomposiciones: SUMCUBOS y DIFCUBOS. Las copio a continuación:
Function
sumcubos(n)
Dim k,
a, m, b
Dim s$
s =
"" ‘Contenedor de resultados
m = 0 ‘Contador
de soluciones
a = n
^ (1 / 3) ‘Máximo cubo posible
For k = 1 To a
b = n - k ^ 3 ‘Segundo posible cubo
If escubo(b) And k <= b ^ (1 / 3) Then m = m + 1: s
= s + " a=" + Str$(k) + " b=" + Str$(Int(b ^ (1 / 3) +
0.0001)) ‘Hay nueva
solución
Next k
‘Si
no hay solución devuelve “NO”
End
Function
Usa nuestra función ESCUBO:
Function escubo(n)
Dim a
a = Int(n ^ (1 /
3) + 10 ^ (-6))
If a * a * a = n
Then escubo = True Else escubo = False
End Function
La segunda función es algo más complicada, porque la
diferencia presenta otro condicionante, y es que la diferencia de cubos ha de
ser divisor de N.
Dim k, a, t, m, p
Dim s$
s =
"" ‘Contenedor de soluciones
m = 0 ‘Contador
de soluciones
For k
= 1 To n / 2 ‘La diferencia de bases es divisor de N
If n /
k = n \ k Then ‘Criterio de divisibilidad
t =
Sqr(n / k / 3) ‘Máximo cubo con esa diferencia
For a = 1 To t
If (a + k) ^ 3 - a ^ 3 = n Then m = m + 1: s = s +
" # a=" + Str$(a) + " b=" + Str$(a + k) ‘Existe solución
Next a
End If
Next k
If s = "" Then difcubos = "NO"
Else difcubos = ajusta(m) + " " + s
End
Function
El que esta segunda función use también el “NO” para cuando no existe solución nos permite simultanear las dos condiciones:
Están publicados en https://oeis.org/A225908, y es subsecuencia de https://oeis.org/A051347 En esas páginas se llama la atención sobre que estas propiedades permiten descomponer algunos cubos en suma de otros tres. Ya he comentado esta propiedad anteriormente en otras entradas. Por ejemplo, 18^3=16^3+12^3+2^3. Esta igualdad se extrae de los resultados del número 4104.
Si se usa la función TRESCUBOS (no se explica aquí porque usa otras funciones que alargarían esta entrada) con uno de los cubos mayores, se reproducirán algunos resultados. Por ejemplo, con 18^3, si lo descomponemos en suma de tres cubos, daría lugar a
18^3=15^3+6^3+9^3=16^3+6^3+2^3
Si pasamos restando algún sumando, obtendríamos algunos casos de los estudiados. Por ejemplo:
18^3-15^3=9^3+6^3
A
continuación estudiaremos algunos casos y propiedades particulares.
Casos particulares de los cubos sumandos
Cubos consecutivos
Los dos cubos que se suman pueden ser consecutivos. Añadiendo algún parámetro a nuestra función se pueden encontrar esos casos particulares. No abundan. Estos son los inferiores a 10^5:
En
ellos se ha de cumplir que N=(a+1)3+a3=2a3+3a2+3a+1,
luego a será un divisor de N-1.
Por ejemplo. 68705-1 se descompone como 25*19*113, y, efectivamente, 32=25 es un divisor suyo, y es la base del cubo menor de la suma.
Cubos de N y N+2
Con el
mismo procedimiento obtenemos los primeros casos en los que las bases de los
cubos que se suman se diferencian en dos unidades.
Es sencillo demostrar que aquí la base del cubo menor ha de ser divisor de N-8, como ocurre con 16120, en el que (16120-8)/19=848
Cubos de base prima
Para finalizar, se adjuntan los tres primeros resultados para el caso en el que las bases de los cubos que se suman sean números primos. Se acumulan las exigencias y es normal que resulten pocos resultados.
Para quienes deseen practicar con este lenguaje, se inserta a continuación un código que devuelve las soluciones entre1 y 5000. Es interesante estudiar el uso de vectores para devolver las soluciones:
sumadoscubos(n)=my(i=1,m,v=[0,0]);while(i<=n^(1/3),m=n-i^3;if(ispower(m,3)&&m<=i^3,v=[i,m^(1/3)]);i+=1);v
difcubos(n)=my(k,t,a,v=[0,0]);for(k=1,n,if(n%k==0,t=sqrt(n/k/3);for(a=1,t,if((a+k)^3-a^3==n,v=[a+k,a]))));v
for(m=1,5000,u=difcubos(m);t=sumadoscubos(m);if(u<>[0,0]&&t<>[0,0],print(m," Suma ",t," Diferencia ",u)))
Resultado: