jueves, 9 de noviembre de 2017

Sumandos en progresión aritmética (1)


En el transcurso de mis publicaciones en Twitter apenas he encontrado sumandos del mismo tipo en progresión aritmética que engendren números determinados (en mi caso, números de fechas en @Connumeros). Esto me ha animado a investigar el tema en el caso de tres sumandos.

Si un número coincide con una suma en progresión aritmética, el total de los tres sumandos ha de ser el triple del central, lo que puede facilitar la búsqueda, estudiando sólo aquellos números que sean triple de uno del tipo dado. Así, el 63, que es suma de tres triangulares en progresión aritmética, es el triple del triangular 21, y cumple 63=6+21+36, los tres triangulares con diferencia mutua 15.

Con números primos

Navegando por OEIS (http://oeis.org/) encontré el caso de números primos. Comenzaremos, pues, por este. Estos son los primeros con la propiedad dada:
15, 21, 33, 39, 51, 57, 69, 87, 93, 111, 123, 129, 141, 159, 177, 183, 201, 213, 219, 237, 249, 267, 291, 303,…

Están calificados como semiprimos, lo que es normal, por el razonamiento de los párrafos anteriores, ya que todos se descompondrán en el primo 3 multiplicado por otro primo. Así, 87=3*29, y es suma de 17+29+41, con 41-29=29-17=12
Si se dispone de la función “esprimo”, que determina si un número es primo o no, no es difícil encontrar estos números. La puedes copiar, por ejemplo, desde http://hojaynumeros.blogspot.com.es/2009/03/primos-reversibles-primo-omirp.html

Hemos creado una función que determina si un número es suma o no de tres primos en progresión aritmética. Es esta:

Public Function essumaprog(n)
Dim es As Boolean
Dim a, k

es = False
If n / 3 = n \ 3 Then  ‘Sólo sigue si es múltiplo de 3
a = n / 3
If esprimo(a) Then ‘Exige que el cociente n/3 sea primo
k=1
While k<a and not es ‘Va restando y sumando unidades hasta descubrir dos sumandos primos
If esprimo(a - k) And esprimo(a + k) Then es = True ‘Encontrados dos primos, luego vale
k=k+1
wend
End If
End If
essumaprog = es
End Function

Con ella es fácil buscar los números suma de primos en progresión aritmética:



Se ha conjeturado que todos los números triple de primos, a partir del 15, pertenecen a esta lista. Esta conjetura está relacionada con la de Goldbach. Con nuestra función podemos comprobar que todo semiprimo del tipo 3*p  con p>3 es suma de tres primos en progresión aritmética. Elegimos, por ejemplo 3*211=633. Le aplicamos la función y nos resulta VERDADERO, ya que 633=199+211+223, los tres primos y con 211-199=223-211=12

Para una mayor velocidad de cálculo se puede programar la búsqueda en el lenguaje PARI. Si lo conoces, puedes experimentar con este código:

for(n=1,200,if(n/3==n\3,a=n/3;if(isprime(a),e=0;k=1;while(k<a&&e==0,if(isprime(a-k)&&isprime(a+k),e=1;print1(n,", "));k+=1))))

En la imagen tienes el listado


Con triangulares

El caso de una suma de triangulares (tipo n(n+1)/2) en progresión aritmética se presta a alguna variante que nos será útil en otros cálculos próximos.
Para saber si un número es triangular, basta multiplicarlo por 8 y añadir una unidad. Si el resultado es cuadrado, el número es triangular.

La búsqueda de triangulares en progresión aritmética se puede abordar con dos funciones:

Public Function escuad(n) As Boolean
'Determina si n es un cuadrado
If n < 0 Then
escuad = False
Else
If n = Int(Sqr(n)) ^ 2 Then escuad = True Else escuad = False
End If
End Function

Function estriangular(n) As Boolean
Dim a
If escuad(8 * n + 1) Then estriangular = True Else estriangular = False
End Function

Con estas dos funciones, para saber si un número es suma de triangulares en progresión, lo dividimos entre 3, y si el resultado es triangular, seguimos el algoritmo. En ese caso vamos sumando y restando el mismo número, y si suma y resta son ambos triangulares, hemos descubierto la progresión aritmética. Este proceso se puede concretar en la siguiente función:


Public Function essumaprog(n) 'Con triangulares
Dim es As Boolean
Dim a, k

es = False
If n / 3 = n \ 3 Then ‘Se verifica que es múltiplo de 3
a = n / 3
If estriangular(a) Then ‘Si el cociente es triangular, se sigue
For k = 1 To a – 1 ‘Se suma y resta para buscar un par de triangulares
If estriangular(a - k) And estriangular(a + k) Then es = True ‘Si se encuentra, devuelve TRUE
Next k
End If
End If
essumaprog = es ‘Devuelve verdadero o falso
End Function

Con esta función se puede construir un bucle de búsqueda, que nos dará los primeros números con esa propiedad:


Podemos acudir a un planteamiento más rápido. Sabemos que los triangulares se forman sumando 1+2+3+4+…+n. Si a un número triangular de orden n le restamos n, la diferencia será también con seguridad triangular, con lo que sólo tenemos que comprobar que el número dado sumado con n también es triangular. Si no lo es, restamos ahora n-1 y volvemos a intentarlo, y así hasta llegar al 1. Por otra parte, en este proceso podemos ir generando los triangulares mediante 1+2+3+4+…, lo que acelera el cálculo. Quedaría así:

Sub listasumprog()
Dim i, k, t, v, m
Dim e As Boolean

t = 3 ‘Primer triangular
k = 2 ‘Primera diferencia
While t < 600
i = k ‘Recorrerá las diferencias de k hasta 1
e = False ‘Variable que recoge si hay solución o no
v = t + i ‘Sumamos la primera diferencia
While i > 1 And Not e
If estriangular(v) Then m = 3 * t: e = True: MsgBox (m) ‘Si es triangular, hemos terminado
i = i – 1 ‘Siguiente diferencia
v = v + i
Wend
k = k + 1 ‘Estas dos líneas generan nuevos triangulares
t = t + k
Wend
End Sub

Los primeros encontrados con este algoritmo son:

9, 63, 84, 108, 234, 315, 459, 513, 570, 630, 759, 975, 1053, 1134, 1395, 1584, 1998, 2109, 2709, 2838, 2970, 3105, 3384, 3528, 3825, 4134, 4455, 4620, 4788, 4959, 5133, 5310, 5673, 5859, 6834, 7038, 7668, 7884, 8325, 8778, 9009, 9243, 9480, 10209, 10710, 11223, 11484, 12285, 12558, 12834, 13113, 13968, 14259, 14553, 15453, 15759, 17334, 17985, 18315, 18984, 19665,

Esta sucesión estaba inédita, y la hemos publicado en https://oeis.org/A292309.

En PARI quedaría este código, algo más complicado de entender, aunque es un reto poder interpretarlo:

t=3;k=2;while(t<=600,i=k;e=0;v=t+i;while(i>0&&e==0,if(issquare(8*v+1),m=3*t;e=1;print1(m,", "));i+=-1;v+=i);k+=1;t+=k)

Estos números, dada su definición, pertenecerán a la sucesión  de números triples de triangulares,  http://oeis.org/A045943

Propiedad de Claudio Meller

Nuestro amigo Claudio Meller caracterizó estos números triple de triangulares mediante esta propiedad: Estos números son los menores que se pueden escribir como suma de n-1 números consecutivos y también como suma de n números consecutivos.

Es tan interesante que merece la pena demostrarla. Sea k el inicio de la suma de n consecutivos y h el inicio de la otra suma de n-1. Ambas sumas son iguales, y podemos plantear:

k+k+1+k+2+…k+n-1=h+h+1+h+2+…h+n-2
kn+n(n-1)/2=h(n-1)+(n-1)(n-2)/2
h(n-1)-kn=(n-1)/2(n-n+2)=n-1
h-kn/(n-1)=1

k ha de ser, pues, múltiplo de n-1, y si es el mínimo, valdrá n-1 y h es n+1. Así queda:

n(n-1)+n(n-1)/2=(n+1)(n-1)+(n-1)(n-2)/2
(n-1)(n+n/2)=3n(n-1)/2
(n-1)(n+1+(n-2)/2)=(n-1)(2n+2+n-2)/2=3n(n-1)/2

Con esto queda demostrada.

Por ejemplo, en el 63, n=7, k=6, h=8, y resulta:
6+7+8+9+10+11+12=63
8+9+10+11+12+13=63

Propiedad de Ivan Hurt

También esta es interesante: El triple del triangular de orden n es suma de los números comprendidos entre n y 2n.

Es fácil de comprobar: n+n+1+n+2+…+n+n=n*(n+1)+n(n-1)/2=n(n+1+(n-1)/2)=n(3n-2-1)/2=3n(n-1)/2

Terceras partes

3, 21, 28, 36, 78, 105, 153, 171, 190, 210, 253, 325, 351, 378, 465, 528, 666, 703, 903, 946, 990, 1035, 1128, 1176, 1275, 1378, 1485, 1540, 1596, 1653, 1711, 1770, 1891, 1953, 2278, 2346, 2556,…

Las terceras partes de los números que estamos estudiando no han sido publicadas, por lo que las hemos incorporado a https://oeis.org/A292310.

Los podemos definir como números triangulares que son equidistantes de otros dos triangulares. Así 666 es el triangular número 36, y es promedio entre 6, triangular tercero, y 1326, que es número 51.