jueves, 21 de mayo de 2026

Funciones definidas para tipos de números (2)

En la anterior entrada de esta serie se estudiaron funciones del tipo TRIANGULAR(N) o OBLONGO(N), que se caracterizan por poseer una fórmula, y sólo hay que buscar la función inversa u ORDEN, En esta segunda entrada se incluirán funciones sin fórmula, que necesitan la ayuda de una búsqueda.

Funciones basadas en búsqueda

 

Es el caso de la función PRIMO(N). Se necesita otra función, llamemos ESPRIMO, que indique si un número es del tipo dado o no, y después habrá que contar los casos que indique su orden N para llegar a a su valor. Lo vemos según el tipo, tomando los números primos como ejemplo para los siguientes:

 

Función PRIMO(N)

 

Necesitaremos la función ESPRIMO, descargable desde este blog, por ejemplo, en https://hojaynumeros.blogspot.com/2009/03/primos-reversibles-primo-omirp.html

 

El siguiente código, adaptable a cualquier lenguaje de programación, encuentra el primo de orden n. Servirá de modelo para otros ejemplos, cambiando la línea que se señala.

 

Function primo(n)

Dim p, c, i

'encuentra el primo cuyo número de orden es n

c = 0: i = 1

While c < n

If esprimo(i) Then c = c + 1: p = i ‘Esta línea se cambiará en otros ejemplos

i = i + 1

Wend

primo = p

End Function

 

Por ejemplo, ¿cuál es el número primo de orden 1000? La respuesta sería 7919. Lo comprobamos con PARI, que ya tiene implementada la función PRIME:

? print(prime(1000))

7919

Volveremos a esta estructura de función.

 

Función inversa, ORDENPRIMO

 

También aquí nos servirá de modelo para otros casos.

 

Function ordenprimo(a) As Long

Dim p, c As Long

 

If not esprimo(a) Then ordenprimo = 0: Exit Function

c = 0

For p = 1 To a

If esprimo(p) Then c = c + 1 ‘línea que cambiará según ejemplos

Next p

ordenprimo = c

End Function

 

Se entiende bien. Se van recorriendo los números del mismo tipo hasta llegar al que nos interesa. Por experiencia se sabe que es útil que, si el número no es primo, la función devuelva un cero. De ahí la inclusión de la primera línea.

 

Así, ordenprimo(100)=0 y ordenprimo(101)=27, ya que primo(27)=103

 

En PARI no están implementados órdenes, pero esta sencilla línea lo resuelve:

 

ordenprimo(a)=my(c=0,p);for(p=1,a,if(isprime(p),c+=1));c*isprime(a)

 

Aquí, la solución para que dé un cero si no es primo se encuentra al final. Al multiplicar por isprime(a), anula el resultado si no es primo, porque vale cero. En este recorte se observa la aplicación de esta función al 100 y al 103:

 

 


Este modelo se usará más adelante si se ve conveniente.

 

Una función similar es PRIMOSOPHIE(N), que devuelve el enésimo primo de Sophie Germain. Basta añadir a esprimo(n) la función esprimo(2*n+1)

 

Así, cambiaríamos la línea a If esprimo(p) and esprimo(2*n+1) Then c = c + 1

 

Lo dejo como ejercicio. Debe dar, por ejemplo:

primosophie(7)= 41, y ordenprimosophie(233)=16

 

 

Función SEMIPRIMO(N)

 

Los semiprimos son aquellos números compuestos que equivalen al producto de dos primos. Como 4=2*2 y 62=2*31. La función SEMIPRIMO es sencilla si se posee la BIGOMEGA, que es el número de factores primos de un número. En PARI sí existe, con lo que los semiprimos son aquellos en los que bigomega vale 2.

 

Sería essemiprimo(n)=bigomega(n)==2

 

En la imagen observamos dos resultados.


En el caso de VBASIC es preferible dedicarle un código especial. Consiste en buscar dos primos tales que su producto sea el número dado. Puede ser este:

 

Public Function essemiprimo(n) As Boolean

Dim a, r

Dim es As Boolean

 

es = False 'Al principio suponemos que no es semiprimo

a = 2 'La variable a recorrerá los números primos

r = Sqr(n) ‘Tope de búsqueda

While a <= r And Not es

If n / a = n \ a And esprimo(a) And esprimo(n / a) Then es = True

‘La variable a debe ser divisor, primo, y su cociente con N también primo

If a = 2 Then a = a + 1 Else a = a + 2 'Se busca el próximo primo

Wend

essemiprimo = es

End Function

 

Ahora basta sustituir, en la función PRIMO(N), la línea

If esprimo(i) Then c = c + 1: p = I por

If essemiprimo(i) Then c = c + 1: p = i

Tendremos así formada la función SEMIPRIMO(N)

 

Como comprobación se dan algunos valores: SEMIPRIMO(13)=35, SEMIPRIMO(100)=314 y SEMIPRIMO(1000)=3595

 

Igualmente podemos adaptar la función ORDENPRIMO a ORDENSEMIPRIMO. Se deja como ejercicio. Esta es la comprobación de los semiprimos del párrafo anterior:

 


 

Función CAPICUA(N)

 

Los números capicúas (o palindrómicos) son los que presentan simetría en sus cifras (nos limitaremos a base 10), y tienen un orden predecible, pero es más cómodo considerar que aparecen de forma aleatoria. Por eso se incluyen aquí. Como en anteriores tipos, necesitamos una función ESCAPICUA. En VBASIC de Excel y Calc ya está resuelta en este blog

(ver https://hojaynumeros.blogspot.com/2017/10/suma-de-cuadrado-y-capicua.html)

No tiene en cuenta los números de una cifra.

 

En PARI  es sencilla:

ispal(n)=n==eval(concat(Vecrev(Str(n))))

 

Ya se ha explicado en este blog que significa “convertir en texto, invertir sus cifras como vector, reunirlas y calcular su valor”. Es bastante ingenioso.

 

Como en los otros casos, se cambia la línea adecuada en el código y resulta la función.

 

Un ejemplo de búsqueda sería, por ejemplo: Encontrar dos capicúas consecutivos cuya suma sea un número primo. Introduciremos en un Buscador esta condición:

 

If ESPRIMO(CAPICUA(N)+CAPICUA(N+1))

 

Las primeras soluciones son:



 

Dos de las sumas son “palprimos”, primo y capicúa, pero la central es número primo, pero no palindrómico. Si les adjuntamos sus órdenes, observamos tres situaciones distintas:




En la primera, al sumar capicúas se suman también sus órdenes, porque no hay arrastre de cifras. En la segunda hay un cero porque no es capicúa, y en la tercera no se suman los órdenes.

 

Este tipo de funciones nos proporciona más posibilidades en las búsquedas.

 

Otras funciones

 

Podíamos seguir con el tema de funciones que necesitan una búsqueda previa. Algunas posibles serían:

 

INTERPRIMO(N): buscaría números que son promedio entre dos primos consecutivos.

 

ESFENICO(N): para números que son producto de tres primos distintos.

 

LIBREDECUADRADOS(N): cuando ningún factor primo posee un exponente mayor que uno.

 

CUADPRIMO(N): cuadrado de un primo.

 

Con los estudiados ya se puede tener una idea.

jueves, 14 de mayo de 2026

Funciones definidas para tipos de números (1)

 Introducción

En algunos cálculos se desea poder usar funciones definidas del tipo PRIMO(N), PELL(N), que se puedan integrar en expresiones, como 2*PRIMO(6) o (FIBONACCI(7))^2. En ellas llamaremos orden al contenido del paréntesis. Así, PRIMO(7) poseería orden 7, que correspondería con el número de primos menores o iguales al dado.

 

El objetivo de esta entrada es la construcción de estas funciones en los casos más populares, así como las complementarias para encontrar el orden, según ellas, de un número dado. Así, por ejemplo, PRIMO(6)=13 y ORDENPRIMO(13)=6. Algunas de ellas se han usado en este blog, por lo que sólo se enlazarán cuando llegue su turno.

 

Veremos tres clases de situaciones:

 1) El tipo de número posee fórmula (se comprende que debe ser sencilla). Es el caso de TRIANGULAR(N)=N(N+1)/2. Entonces existirá un procedimiento algebraico no muy difícil.

 2) No existe fórmula alguna. Los números primos y los libres de cuadrados, por ejemplo, se encuentran por búsqueda. En ese caso será imprescindible un bucle respecto a una variable para encontrarlos. Se necesita un lenguaje de programación.

 3) Son elementos de una sucesión recurrente. Aunque suelen existir fórmulas para todos ellos, su complicación no los aconseja, y es más sencilla la programación en un lenguaje. Como caso particular se verán las sucesiones del tipo Horadam.

Existe otra posibilidad, y es que posean una función generatriz. Este procedimiento se ha usado mucho en este blog, pero no entra en el objetivo de esta entrada.

Dedicaremos tres entradas a esta cuestión

 

Funciones con fórmula

 

Muchas de ellas se han utilizado aquí ya. Las más importantes son las de números figurados, como TRIANGULAR(N), HEXAGONAL(N) O PIRAMIDAL(N,K). Elijo algunos ejemplos con cierto interés:

  

TRIANGULAR(N)

 

La fórmula directa, TRIANGULAR(N)=N*(N+1)/2, no necesita explicación, pero para hallar la de su orden hay que recordar que, dado un triangular cualquiera, T(N), la expresión 8T(N)+1 es un cuadrado. De ahí podemos sacar su orden. Una versión podría ser el siguiente:

 

Function ordentriang(n)

Dim a

a = Int((Sqr(8 * n + 1) - 1) / 2)

If a * (a + 1) = 2 * n Then ordentriang = a else ordentriang = 0

End Function

 

Una situación similar es la de la función OBLONGO(N)=N(N+1), sólo que aquí la propiedad básica es que cuatro veces un oblongo más la unidad es un cuadrado, así que sustituyendo en la función anterior un 8 por un 4 obtenemos la expresión de ORDENOBLONGO(N).

 

En la práctica, es mucho más útil

ORDENOBLONGO(N)=ENTERO(RAIZ(n))

No es difícil razonarlo.

 

Por ejemplo, resolvemos la cuestión de si existen oblongos que sean consecutivos a un triangular. Para ello se inserta en un buscador la condición

 

If escuad(8 * i + 1) And escuad(4 * (i + 1) + 1) Then

 

El escaso resultado era previsible, ya que se exige una condición difícil de cumplir, pero se encuentran tres soluciones entre los primeros cincuenta mil números, 1 con 2, 55 y 56, y el par 1891, 1892:

 


 

El resto de soluciones está publicado en https://oeis.org/A217758

 

Un atajo:

 

Si usamos el álgebra, obtenemos:

 

Es n(n+1)/2+1=k(k+1), n2+n+2=2k2+2k, 4n2+4n+8=8k2+8k,

(2n+1)2+7=2(2k+1)2-2 y hago X=2n+1 Y=2k+1

X2-2y2=-9, luego (X2+9)/2 es cuadrado

 

Le inserto esta condición al buscador y obtengo los triangulares publicados:



 

Siempre hay que acudir al Álgebra cuando se pueda.

 

POLIGONAL(N;K)

 

Fórmula directa

 

Los números poligonales poseen una fórmula general, que he desarrollado en mi publicación Números poligonales:


Su traducción es inmediata:

 

En VBASIC:

 

Function poligonal(n, k)

poligonal = n * (n * (k - 2) - (k - 4)) / 2

End Function

  

Fórmula del orden

El problema inverso es algo complicado. Lo puedes consultar en el apartado de Caracterización de los poligonales, en la publicación enlazada más arriba.

 

Su desarrollo en VBASIC es

 

Function ordenpoligonal(n, k)

Dim d, e, m

  

m = 0

d = (k - 4) ^ 2 + 8 * n * (k - 2)

If escuad(d) Then

m = (k - 4 + Sqr(d)) / 2 / (k - 2)

If esentero(m) Then e = m Else e = 0

End If

espoligonal = e

End Function

 

Esta función devuelve un cero si el número no es poligonal, y su orden si lo es. Las funciones ESCUAD Y ESENTERO se pueden buscar en este blog, o sustituirlas por cálculos más directos.

 

Estas dos funciones poseen una traducción sencilla a PARI, por lo que no se incluye.

 

Con ellas podemos buscar relaciones entre poligonales. Por ejemplo ¿Para qué órdenes la suma de un cuadrado con un triangular del mismo orden da una suma hexagonal?

 

Se buscaría que poligonal(i,3)+poligonal(i,4)=poligonal(k,6)

 

Con un buscador he encontrado estas dos primeras soluciones, con comprobación de la relación de suma entre ellas:



 

 

Otros poligonales

 

En mi calculadora de números figurados CALCUPOL, en su código VBASIC, puedes consultar todas las funciones disponibles para poligonales centrados, piramidales 3D y piramidales 4D. Es un tema tan extenso, que es preferible dejarlo como complemento para las personas interesadas.

(https://www.hojamat.es/sindecimales/aritmetica/herramientas/herrarit.htm#figurados)