¿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
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.
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:
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
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
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.