En mis cálculos diarios en Twitter (@connumeros) me encontré por casualidad con cuatro primos con diferencias de cuadrados iguales, tanto de consecutivos como si los tomamos de forma alterna. Eran estos:
23, 43, 163 y 167
Sus diferencias de cuadrados
iguales son dos:
167^2-163^2=43^2-23^2
167^2-43^2=163^2-23^2
Esto es porque
23^2+167^2=28418=43^2+163^2
Es evidente que la tercera
forma de crear diferencias (cuarto con primero y tercero con segundo) no nos
devolvería una igualdad.
Es esta una situación que se
presta a crear métodos o algoritmos para la búsqueda de nuevos conjuntos de cuatro
primos. No tiene más trascendencia el tema, y si no te atraen estas técnicas,
no te servirá de mucho esta entrada.
Uso de la hoja “Cartesius”
Lo primero que me planteé
ante este ejemplo es la cuestión de si existirían muchos conjuntos similares
del mismo tipo. No tenía ninguna opinión previa, por lo que acudí a mi hoja
“Cartesius” para ver si había algo útil entre los primeros primos. Es una
herramienta lenta, por lo que solo exploré hasta el número 61. Mi gran sorpresa
fue que resultaron muchos ejemplos posibles para los primeros primos.
Este fue el resultado:
Código
Lo que sigue es un poco
específico, propio del lenguaje de “Cartesius”, pero creo que merece la pena
explicarlo. Estas son las condiciones impuestas a “Cartesius”:
xtotal=4
xt=1..65
xt=filtro(primo)
es
(x2^2-x1^2)=(x4^2-x3^2)
es
(x1<x2)*((x2<x3)+(x2=x3))*(x3<x4)>0
Las tres primeras se
entienden bien: combinaremos cuatro números (xtotal=4) desde 1 hasta
65 (xt=1..65)
y exigiremos que sean primos (xt=filtro(primo)). Con estas
condiciones se preparan automáticamente los primos que se van a combinar, según
vemos en esta imagen:
La tercera condición exige la igualdad entre diferencias de cuadrados:
es (x2^2-x1^2)=(x4^2-x3^2)
Exige que sean iguales las diferencias entre consecutivos, lo que garantiza que también sean iguales las diferencias alternadas. La palabra “es” significa que se exige que sea verdadera la expresión que le siga.
es (x1<x2)*((x2<x3)+(x2=x3))*(x3<x4)>0
Esta última condición elimina casos repetidos. Exige que X3 sea menor que X4, X1 menor que X2 y X2 menor o igual que X3.En “Cartesius”, como en otros lenguajes, el producto funciona como la conectiva lógica Y y la suma como la O.
Con este proceso ya tenía la idea de que estos casos abundarían en cualquier rango de números, y, por su naturaleza, que serían infinitos (conjetura). Se observan varios números en la cuarta columna que son cabecera de varios conjuntos, como el 61, que pertenece a varias soluciones.
Otra observación en la tabla es la de que están un poco mezclados los primos de tipo 4K+1 y con los de 4K+3.
Algoritmo en forma de función
Ya que este blog va de números y hoja de cálculo, parece conveniente acudir a esta herramienta general para completar y comprobar lo conseguido con Cartesius. La estructura de la función que presentaremos requiere el uso de cuatro bucles distintos, uno por cada primo al cuadrado, y en este caso serán del tipo WHILE_WEND, pero es fácil comprobar que no ralentizan mucho el proceso.
La función, tipo String o texto, actuará sobre un primo cualquiera (si no es primo, sale del código con la palabra “NO”) y devolverá todos los conjuntos de cuatro primos cuyo primer elementoo es ese número primo. Así se consigue una búsqueda sistemática si se desea.
Usaremos nuestra función PRIMANT, que devuelve el primo anterior a un número, porque la búsqueda de primos será descendente.
Este es el código de la función:
Function dos_dif_cubos(n)
Dim i, j, k, d, d1
Dim s$
If Not esprimo(n) Then dos_dif_cubos = "NO": Exit Function
s = ""
k = n
While k > 2 ‘Segundo primo, porque n es el primero
d = n ^ 2 - k ^ 2 ‘Primera diferencia de cuadrados
j = k
While j > 2 ‘Tercer primo
i = j
While i > 2 ‘Cuarto primo
d1 = j ^ 2 - i ^ 2 ‘Segunda diferencia
If d1 = d And d
<> 0 And d1 <> 0 Then s = s + Str$(n) + ", " + Str$(k) +
", " + Str$(j) + ", " + Str$(i) + " # " ‘Se da la igualdad
buscada
i = primant(i) ‘Desciende i
Wend
j = primant(j) ‘Desciende j
Wend
k = primant(k) ‘Desciende k
Wend
if s=""
then s="NO"
dos_dif_cubos = s
End Function
Devuelve una cadena con todos los conjuntos de cuatro primos que presentan diferencias iguales dos a dos, y cuyo sumando mayor es n2.
Por ejemplo, para el primo 23 obtendríamos:
23, 19, 17, 11 # 23, 17, 17, 7 #
Con ellos podríamos construir estas igualdades entre diferencias de cuadrados:
23^2-19^2=17^2-11^2
23^2-17^2=19^2-11^2
23^2-17^2=17^2-7^2
Con esta función podemos recorrer sistemáticamente cualquier rango de números primos (si alguno no es primo devolverá un “NO”).
Por ejemplo, esta sería la tabla de resultados para los primeros primos. Así que con esta función podemos crear un catálogo sistemático de los posibles conjuntos de cuatro primos con la propiedad buscada.
Estas cadenas de conjuntos
de cuatro primos para uno dado se pueden conseguir también con Cartesius.
Basta adaptar el código de más arriba a un valor concreto, por ejemplo el 61:
xtotal=3
xt=1..61
xt=filtro(primo)
es
(x2^2-x1^2)=(61^2-x3^2)
es (x1<x2)*((x2<x3)+(x2=x3))*(x3<61)>0
Obtendremos una lista de cinco conjuntos de primos que se completan con el 61:
Esta solución coincide con la de la función dos_dif_cubos:
DOS_DIF_CUBOS(61)= 61, 59, 23, 17 # 61, 59, 19, 11 # 61, 59, 17, 7 # 61, 53, 31, 7 # 61, 47, 41, 13 #
Con esto damos por resuelta la búsqueda. Nos queda un detalle, con el que comenzamos este estudio, y es la procedencia de estas diferencias de dos sumas de cubos con el mismo resultado.
Sumas de cubos equivalentes
Recordamos las frases de inicio de estas búsquedas:
23, 43, 163 y 167
Sus diferencias de cuadrados iguales son dos:
167^2-163^2=43^2-23^2
167^2-43^2=163^2-23^2
Esto es porque 23^2+167^2=28418=43^2+163^2
Si ahora buscáramos
todos los números que equivalen al menos a dos sumas de cuadrados de primos,
encontraríamos dos igualdades de diferencias del tipo buscado. Usaremos esta
descomposición de un número en dos cuadrados de primos que sigue. Es una cadena
de texto, y el primer carácter es el número de descomposiciones de ese tipo que
presenta. Si no es posible la descomposición devolverá un “NO”.
Public Function sumadoscuad_prim$(n)
Dim i, r, t, w, m
Dim s$
s = "" ‘Variable de respuesta
m = 0 ‘Contador de
soluciones
r = Sqr(n) ‘Tope de búsqueda
i = 2
While i < r
t = n - i ^ 2
w = Sqr(t)
If escuad(t) And
esprimo(w) And i <= w Then m = m + 1: s = s + " # " + Str$(i) +
", " + Str$(w)
‘Si es cuadrado de un
primo se incrementa m y se incorpora
a la solución
i = primprox(i)
Wend
If s = ""
Then s = "NO" Else s = ajusta(m) + " # " + s
sumadoscuad_prim = s
End Function
Con esta función se pueden unificar las dos cuestiones, enlazando diferencias y sumas, según vemos en la siguiente tabla, que elige el primo mayor y lo incorpora a una diferencia. Comprende todos los números enteros que equivalen a dos sumas de cuadrados de primos:
Tomamos el primo
mayor y creamos con él diferencias de cuadrados, que coinciden con los
elementos de la izquierda.