miércoles, 10 de junio de 2026

Coeficientes trinomiales

Los coeficientes trinomiales son una extensión de los binomiales, definidos estos como

Y que son los coeficientes del binomio de Newton:

De forma análoga se pueden definir los coeficientes trinomiales, propios de un trinomio similar al anterior.

En realidad, los binomiales se podrían expresar de otra forma:

A partir de aquí podemos explicar mejor la definición de coeficientes trinomiales:

También, al igual que con los binomiales, los podemos identificar con los coeficientes de la potencia de un trinomio:

Las demostraciones son similares a las del caso binomial.

Esta fórmula produce siempre resultados enteros positivos, debido al teorema de que un producto de k números consecutivos decrecientes es siempre múltiplo de los k primeros números enteros positivos. Es fácil recordar que coincide con el número de permutaciones con repetición en las que se fija el número de cada una.

Para entender esto mejor podemos descomponer la definición en tres bloques. Lo vemos con un ejemplo:

A la vista de este esquema de tres cocientes, observamos que el tercer número de la definición no influye en el resultado, luego podemos usar sólo n1 y n2. Incluso estos son intercambiables, los que nos lleva a que el coeficiente trinomial se puede expresar como

En nuestro ejemplo, usando la función COMBINAT de Excel y Calc, nos quedaría:

COMBINAT(8;2)*COMBINAT(6;3)=560

COMBINAT(8;3)*COMBINAT(5;2)=560

 

Cálculo de un coeficiente trinomial en la práctica

Si no se desea depender de la función COMBINAT, se puede calcular directamente. El problema con el cálculo práctico de un coeficiente de este tipo es que los factoriales alcanzan números muy grandes. Si usamos calculadora o bien hoja de cálculo, los resultados pasan a coma flotante y se pierde el carácter entero de estos coeficientes. Por ello, es conveniente usar el desarrollo del párrafo anterior: dividir los números consecutivos a partir de m entre el primer factorial, los siguientes entre el segundo, y parar el cálculo, porque el tercer factorial produce un uno. En VBasic y otros lenguajes se puede construir una función similar a la siguiente:

Function trinomial(m, x, y, z)

Dim t, k, v

If x + y + z <> m Then trinomial = 0: Exit Function’ Datos no válidos

t = m: k = x: v = 1

While k > 0

v = v * t / k: t = t - 1: k = k – 1 ‘Divide factores consecutivos entre el primer coeficiente. Es el primer combinatorio de la fórmula.

Wend

k = y

While k > 0

v = v * t / k: t = t - 1: k = k – 1’ Igual, en el segundo coeficiente para calcular el segundo combinatorio.

Wend

trinomial = v

End Function

Presenta un pequeño riesgo de redondeo inadecuado, pero suele funcionar bastante bien. Devuelve un cero si los coeficientes de abajo no suman el de arriba. No analiza si los datos son enteros.

Es muy sencillo el traslado a cualquier otro lenguaje de programación, por ejemplo, en PARI, con un rango de datos y resultados mucho mayor:

trinomial(m, x, y, z)=my(t=m,k=x,v=1);while(k>0,v=v*t/k;t-=1;k-=1);k=y;while(k>0,v=v*t/k;t-=1;k-=1);v*(x+y+z==m)

Tal como se esperaba, los valores de estos coeficientes pueden ser grandes. Aquí tenemos un ejemplo:


Al ser la primitiva definición simétrica respecto a los índices de abajo, el número total de posibles coeficientes trinomiales para un índice superior
m dado, es el de particiones de m en tres conjuntos. Por ejemplo, para m=5 las particiones son (5,0,0), (4,1,0), (3,2,0), (3,1,1), (2,2,1), que se corresponden con los posibles valores de los coeficientes, que son 1, 5, 10, 20 y 30. Se comprende que, en el desarrollo de (a+b+c)5, se tendrán que repetir, como vemos en el siguiente desarrollo:


Con nuestra herramienta Cartesius se puede encontrar el número de estos coeficientes distintos.
(Ver https://www.hojamat.es/sindecimales/combinatoria/herramientas/herrcomb.htm#cartesius)

Por ejemplo, para m=7 plantearíamos:

xtotal=3

xt=0..7

creciente

suma=7

 

Se interpreta que deseamos encontrar todos los tipos de sumas con resultado 7 y sin tener en cuenta el orden (creciente)

Al resultado se le han añadido manualmente los valores de los coeficientes:

Estos resultados se corresponden con el desarrollo de una potencia séptima de un trinomio:

Como era de esperar, los coeficientes aparecen muy repetidos.

Tetraedro de Pascal

Con la expresión COMBINAT(m;n1)*COMBINAT(m-n1;n2) se puede construir un triángulo de coeficientes para un m dado. En una hoja de cálculo se puede visualizar bien. En la imagen figuran los correspondientes a m=7, vistos anteriormente:


Observamos que los lados del triángulo son filas del triángulo de Pascal. Si ahora apilamos triángulos según los valores de m, nos resultará un tetraedro, al que también se le llama de Pascal. En la siguiente página de Wikipedia se explica el proceso:

https://en.wikipedia.org/wiki/Pascal%27s_pyramid

La siguiente imagen pertenece a dicha página:



(Fuente: Wikipedia https://en.wikipedia.org/wiki/Pascal%27s_pyramid)

Para quienes deseéis profundizar en el tema. La lectura de esta página es recomendable.

Recurrencia

Es fácil la comprobación de esta recurrencia para calcular coeficientes trinomiales:





En realidad, este es el fundamento del tetraedro de Pascal.

 

jueves, 28 de mayo de 2026

Funciones definidas para tipos de números (3)

 Esta entrada cierra el estudio de funciones definidas para ciertos tipos de números, así como de sus funciones inversas. En esta tercera se estudiarán las definidas por recurrencia.

Funciones sobre recurrencias

 

Son aquellas que se definen mediante los términos iniciales, y además, expresan a(n+1) en función de los anteriores términos. Por ejemplo, la sucesión de Fibonacci se define como a(1)=1, a(2)=1, y para el resto, a(n+1)=a(n)+a(n-1). Si esta última relación sólo usa el término a(n) se llama de primer orden, y así, se pueden plantear de segundo, tercero o más órdenes.

 

Recurrencias de primer orden

 

Cada función de este tipo deberá estar definida por dos parámetros, a(1) y otro según la definición, que puede ser DIFERENCIA en las progresiones aritméticas, RAZÓN en las geométricas, o bien cualquier otra relación entre a(n+1) y a(n). No existen ejemplos populares concretos para definir funciones.

 

Recurrencias de segundo orden

 

Existen muchas recurrencias de segundo orden, como la ya citada de Fibonacci. Las más simples son las llamadas Horadam, y se caracterizan porque la relación de recurrencia es lineal. Vemos las más importantes.

 

Caso particular: sucesiones Horadam

 

Son aquellas que están definidas por cuatro parámetros, a1, a2, c1 y c2, de la forma a(1) = a1, a(2) =a2, a(n) = a(n-2)*c1+a(n*1)*c2. Así, tenemos muchos ejemplos concretos de este tipo de sucesiones recurrentes de segundo grado:

 

Horadam(1,1,1,1): Números de Fibonacci: 1, 1, 2, 3, 5

Horadam(2,1,1,1): Números de Lucas: 2, 1, 3, 4, 7, 11, 18, 29, 47, …

Horadam(1,2,1,2): Potencias de 2:1, 2, 4, 8, 16, 32, …

Horadam(0,1,2,1): Números de Pell: 0, 1, 2, 5, 12, 29, 70, …

Horadam(1,1,2,1): Números de Pell-Lucas: 1, 1, 3, 7, 17, 41, 99, …

Horadam(2,3,3,-2): Sucesión de Pisot (2n+1): 2, 3, 5, 9, 17, 33, …

Horadam(0,1,1,2): Sucesión de Jacobsthal: 2, 3, 5, 9, 17, 33, …

 

Son muy sencillas de programar, y su búsqueda suele ser rápida. Para encontrar un término general hay que usar los cuatro parámetros citados más el número de orden n.

  

En lenguaje PARI

 

horadam(n,a1, a2, c1, c2) = {my(i,f,t,v,u); if(n==1,f=a1); if(n==2,f=a2);if(n>2,v=a1;t=a2;for(i=3,n,u=c1*t+c2*v;v=t;t=u);f=u);f}

 

En Vbasic

 

Function horadam(n, a1, a2, c1, c2)

Dim i, f, v, u

If n = 1 Then horadam = a1: Exit Function

If n = 2 Then horadam = a2: Exit Function

v = a1: t = a2

For i = 3 To n

u = c1 * t + c2 * v: v = t: t = u

Next i

horadam = u

End Function

 

Si se dispone de estas dos funciones, podemos definir las funciones FIBONACCI(N), PELL(N), LUCAS(N) y demás, igualando su definición a la de Horadam. Por ejemplo, LUCAS(N) se definirá así:

 

Lucas(n)=horadam(n, 2,1,1,1)

 

Así tendremos que lucas(10)=horadam(10,2,1,1,1)=76, como puedes ver en cualquier descripción de estos números. Imagina que puedes definir así todas estas sucesiones.

El autor lleva años usando FIBONACCI(N) en sus cálculos.

 

La función ORDEN se puede construir de similar a la que usamos para Primos o capicúas. Puede ser esta:

 

Function eshoradam(n, a1, a2, c1, c2) As Long

Dim v, u, k, t As Long

Dim es As Long

 

If n = a1 Then eshoradam = 1: Exit Function

If n = a2 Then eshoradam = 2: Exit Function

v = a1: t = a2: k = 2

While t <= n

If t = n Then

es = k

ElseIf t > n Then

es = 0

End If

u = c1 * t + c2 * v: v = t: t = u: k = k + 1

Wend

eshoradam = es

End Function

 

Nos devuelve el orden k si es un término de la sucesión, o un cero si no lo es.

 

El autor usa en su hoja de cálculos diarios esta versión, que le permite averiguar si un número dado es de uno de los tipos populares de esta sección:

 

Function estipohoradam$(n)

Dim s$

Dim es As Long

s = ""

es = eshoradam(n, 1, 1, 1, 1): If es <> 0 Then s = s + " Fibonacci " + " & " + ajusta(es)

es = eshoradam(n, 2, 1, 1, 1): If es <> 0 Then s = s + " Lucas " + " & " + ajusta(es)

es = eshoradam(n, 0, 1, 2, 1): If es <> 0 Then s = s + " Pell " + " & " + ajusta(es)

es = eshoradam(n, 1, 1, 2, 1): If es <> 0 Then s = s + " Pell-Lucas " + " & " + ajusta(es)

es = eshoradam(n, 2, 3, 3, -2): If es <> 0 Then s = s + " Pisot " + " & " + ajusta(es)

es = eshoradam(n, 0, 1, 1, 2): If es <> 0 Then s = s + " Jacobsthal " + " & " + ajusta(es)

es = eshoradam(n, 2, 1, 1, 2): If es <> 0 Then s = s + " Jacobsthal-Lucas " + " & " + ajusta(es)

 

If s = "" Then s = "No es de ningún tipo"

estipohoradam = s

End Function

 

Así, por ejemplo, estipohoradam(76) nos devuelve Lucas  & 10, y estipohoradam(81), No es de ningún tipo.

 

Podemos seguir recorriendo tipos de sucesiones recurrentes, como las de Perrin y otras, pero no suelen demandar nuestros trabajos unas funciones directas como las que aquí se han presentado.

 

Otras recurrencias

 

El contenido de esta entrada nos ayuda si necesitamos definir una función para sucesiones que no sean de Horadam, pero el procedimiento para encontrar funciones de este tipo es el mismo, salvo la fórmula de recurrencia.

 

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.