Encontrar el número pentagonal más cercano, 𝑝𝑛, dado un número entero positivo, S donde S ≥ 1
Necesito crear una función en R que tome como entrada un número entero, S ≥ 1 y devuelva como resultado el número pentagonal más cercano a S. El resultado de mi función debe ser el número pentagonal 𝑝𝑛 que cumpla con |𝑝𝑛−𝑠|≤|𝑝𝑚−𝑠| para todos los números enteros positivos m.
Sin embargo, si pudiera obtener dos números pentagonales diferentes, lo que sucede cuando el entero s está literalmente en medio de ellos, entonces no importa cuál tome (valor mayor o menor), como cuando S es 17 y el número pentagonal más cercano a 17 es 12 y 22, por lo que puede tomar cualquiera de ellos.
Aquí está el código que he creado para encontrar el número pentagonal 𝑝𝑛 para un número entero positivo, n:
P_n=function(n){
x=(3*n^2-n)/2
if(n == 0){
return (0)
}else{
return(x)
}
}
Después de escribir el código para encontrar pn, ahora estoy atascado en encontrar el número pentagonal más cercano para el entero s. Sé que la idea principal es distinguir Pm y Pn usando la función ceiling y floor pero realmente no sé cómo vincularlo con la ecuación |𝑝𝑛−𝑠|≤|𝑝𝑚−𝑠|.
davy.ai
Para encontrar el número pentagonal más cercano al número entero de entrada, podemos usar un bucle while para iterar a través de diferentes números pentagonales comenzando desde n=1 hasta que encontremos el más cercano.
Aquí está el código para implementar esto:
Para explicar el código, comenzamos definiendo una función
closest_pentagonal
que toma un número entero de entradaS
. Inicializamos las variablesn
=1,min_diff
=∞ (inicialmente establecido en un número muy grande) yclosest
=0. El bucle while continuará hasta que encontremos el número pentagonal más cercano.Dentro del bucle, calculamos los números pentagonales
pent_n
ypent_nplus1
utilizando la ecuación que proporcionaste. Luego calculamos la diferencia absoluta entrepent_n
yS
endiff_n
y entrepent_nplus1
yS
endiff_nplus1
.Luego verificamos si encontramos el número más cercano y salimos del bucle si lo hicimos. De lo contrario, actualizamos
min_diff
yclosest
en consecuencia en función de qué número pentagonal tiene una diferencia más pequeña conS
.Finalmente, incrementamos
n
y continuamos con el bucle while hasta que encontremos el número pentagonal más cercano.Tenga en cuenta que si
S
está exactamente a medio camino entre dos números pentagonales consecutivos, la función simplemente devolverá el primero que encuentre, que podría ser el valor mayor o menor, como se mencionó en su pregunta.