miércoles, 28 de junio de 2023

En el punto medio de dispares

 ¿Qué números son promedio entre su cuadrado más cercano y el triangular también más cercano? Es una pregunta a la que no es difícil responder con las herramientas que tenemos a nuestra disposición, pero que requiere un cierto cuidado a la hora de plantear un algoritmo. Veremos más adelante las dificultades que se pueden presentar. Toda la entrada se referirá a la posible estructura de ese algoritmo y sus problemas. No abordaremos apenas estudios teóricos.

En primer lugar estudiaremos técnicas que nos sirvan para todos los casos, sean cuadrado con triangular, cubo con cuadrado o primo con oblongo, para después descender a detalles en cada tipo de número. Para estas búsquedas llevamos tiempo usando las funciones ESCUAD, ESTRIANGULAR, ESOBLONGO, ESCUBO y otras similares. Puedes encontrarlas todas usando Buscar en el blog.

Estas son algunas de ellas:

Public Function escuad(n) As Boolean
If n < 0 Then
escuad = False
Else
If n = Int(Sqr(n)) ^ 2 Then escuad = True Else escuad = False
End If
End function


Public function estriangular(n) as boolean
dim a

a = Int(sqr(8*n+1))
if a*a=8*n+1 then estriangular = true else estriangular = false
end function

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

Con cualquiera de ellas se pueden construir las funciones PROXIMO y ANTERIOR, en las que un parámetro tipo decidirá si se busca un cubo o un oblongo, o preferentemente, cambiando una línea de código para sustituir la búsqueda de un tipo por la de otro. Lo explicamos con un ejemplo:

La siguiente versión de PROXIMO busca el cuadrado más cercano entre los mayores que un número

Function proximo(a) As Long
Dim p, prim As Long
Dim sale As Boolean

p = a + 1: sale = False: prim = 0
While Not sale
If escuad(p) Then prim = p: sale = True
p = p + 1
Wend
proximo = prim
End Function

Por ejemplo, te dará que PROXIMO(78)=81

Si sustituimos ESCUAD por otra función, nos servirá el mismo código para buscar triangulares, cubos o pentagonales. En general, se dará por supuesto que cambiaremos esa línea de código para pasar de un tipo a otro.

De igual forma se puede construir la función ANTERIOR:

Function anterior(a) As Long
Dim p, prim As Long
Dim sale As Boolean

p = a -1: sale = False: prim = 0
While Not sale and p>0
If escuad(p) Then prim = p: sale = True
p = p - 1
Wend
anterior = prim
End Function

Por ejemplo, en este caso para cuadrados te dará ANTERIOR(15)=9

Caso de cuadrados y triangulares

Candidatos a ser los más próximos

 La primera idea que se nos ocurre es la de buscar el cuadrado más próximo por la izquierda y también por la derecha, y quedarnos con el más próximo. No hay posibilidad de “empate”, porque serían dos cuadrados consecutivos, n2 y (n+1)2, y entre ellos siempre existe una diferencia impar, 2n+1, por lo que no existirá un número en el punto medio. El cuadrado más cercano siempre será único.

Por contra, entre dos triangulares consecutivos si existe esa posibilidad de empate. Por ejemplo, 32 está comprendido entre los triangulares 28 y 36, y a 4 unidades de cada uno de ellos, por lo que el título de “más cercano” sirve para cualquiera de ellos. Vemos cuándo ocurre esto:

Sean dos triangulares consecutivos n(n-1)/2 y n(n+1)/2. Su diferencia será n, luego si este valor es par, tendremos dos triangulares cercanos a un número a la misma distancia. Entre 1 y 3, el punto medio es 2, su promedio. Entre 6 y 10, el 8, entre 15 y 21, el 18, y así con todos los ejemplos similares. La consecuencia es que para triangular más cercano a un número dado tendremos dos candidatos. Por cierto, ese número central es fácil ver que será el doble de un cuadrado, 2, 8, 18, 32,...

Ese empate entre triangulares cercanos habrá que tenerlo en cuenta en el algoritmo. Su núcleo podrá ser el siguiente:

for i=2 to 1000
c=0 ‘Esta variable controlará el posible empate entre triangulares
a=anteriorcuad(i) 'Cuadrado menor
b=proximotriang(i) 'Triangular mayor
m=anteriortriang(i) 'Triangular menor
n=proximocuad(i) 'Cuadrado mayor
if i-a>n-i then a=n 'Se queda "a" como cuadrado más cercano tomando el valor de n
if b-i>i-m then b=m 'El triangular "b" es el más cercano, quizás con el valor de m
if b-i=i-m then ‘Hay empate
If escuad(2 * i - m) Then a = 2 * i - m: b = m: c = 1
If escuad(2 * i - b) Then a = 2 * i - b: c = 1 ' El valor c=1 indica que se ha resuelto el empate
end ifif i=(a+b)/2 or c=1 then ‘Se han encontrado los más próximos o empate resuelto
escribe(i, a, b)
next i


Alguna parte de este planteamiento se ha escrito en pseudocódigo para mayor claridad (anteriorcuad, proximocuad,...). Hemos incorporado estas líneas a un buscador con el siguiente resultado:

2, 5, 23, 32, 47, 52, 65, 86, 140, 161, 170, 193, 203, 228, 266, 312, 356, 389, 403, 438, 453, 490, 545, 610, 671, 716, 735, 782, 802, 851,...

Estos son los primeros números naturales que se encuentran en el punto medio entre el cuadrado y el triangular más cercano. En forma de tabla, podemos añadir en una segunda columna el cuadrado y el triangular más cercanos, de los que es promedio el número. No tienen que aparecer en este orden:

Están publicados en https://oeis.org/A233074

Alternativa para este caso

En este caso de cuadrados y triangulares no son necesarias las funciones POSTERIOR y ANTERIOR. Para los cuadrados bastará con elegir, para un número N los siguientes, expresados con lenguaje de Excel o Calc:

A=(ENTERO(RAIZ(N)))^2   como anterior y  B=(1+ENTERO(RAIZ(N)))^2 como posterior

Para los triangulares es un poco más complicado. Las siguientes expresiones son el resultado de resolver la ecuación x(x+1)/2=N.

X=ENTERO((-1+RAIZ(8*N+1))/2), que es el “falso orden” triangular de N

A=X(X+1)/2 como anterior y B=(X+1)(X+2) como posterior.

 Con estas fórmulas se puede construir un esquema de hoja de cálculo que nos indique, con un solo golpe de vista, qué cuadrados o triangulares son los más cercanos, así como si existe empate o no. En la imagen siguiente se ha analizado el número 456 con las fórmulas explicadas, resultando 441 y 465 como los candidatos. Como sus diferencias, 15 y 9, no son iguales, 456 no cumpliría lo exigido.

 


 

 Caso de cuadrados y cubos

 En este caso podemos usar el procedimiento general, basado en PROXIMO y ANTERIOR, pero usando ESCUBO en lugar de ESTRIANGULAR.

Vimos que en los cuadrados no existía posibilidad de empate en las distancias por la izquierda o derecha del número. Igual ocurrirá con los cubos, porque uno será par y otro impar.

Aplicamos, pues, el procedimiento general sin tener en cuenta los empates:

 


También estos están ya publicados:

 A233075              Numbers that are midway between the nearest square and the nearest cube.           

6, 26, 123, 206, 352, 498, 1012, 1350, 1746, 2203, 2724, 3428, 4977, 5804, 6874, 8050, 9335, 10732, 12244, 13874, 17500, 19782, 21928, 24519, 26948, 29860, 32946, 35829, 39254, 42862, 50639, 54814, 59184, 63752, 69045, 74036, 79234, 85224, 90863, 97340,

Alternativa para este caso

 Vimos que PROXIMO y ANTERIOR se podían sustituir, en el caso de los cuadrados, por A=(ENTERO(RAIZ(N)))^2   como anterior y  B=(1+ENTERO(RAIZ(N)))^2 como posterior.

Los cubos admiten un planteamiento similar

A=(ENTERO(N^(1/3)))^3


B=(1+ENTERO(N^(1/3)))^3

En la imagen observamos con el número 280 que no hay posibilidad de empate.


Promedios entre primos y cuadrados

 Aquí sí existe la posibilidad de empate entre primos, por lo que habrá que aplicar el algoritmo general presentado más arriba. Los cuadrados han de ser impares, para que las diferencias cuadrado-primo sean pares y admitan un punto medio.

Como vemos en la tabla resultante, la abundancia de soluciones les resta interés:

 

observan diferencias de valor 2, 4, 6, 8,…siendo bastante frecuentes las primeras, en las que el número primo es del tipo n2+2 o n2-2. Se podría hacer un estudio para estos primeros valores, pero queda para otra ocasión.


Esta entrada da fin al curso 2022-23. En septiembre, si el ánimo acompaña, iniciaremos uno nuevo.

 

 

No hay comentarios: