miércoles, 21 de octubre de 2026

Números poligonales generalizados

Algunos conceptos matemáticos, que se basaron inicialmente en los números naturales, fueron después adaptados a otros tipos de números. Esto ocurrió con los números poligonales, que, al superar su carácter inicial geométrico, se generalizaron a los números enteros, pues ya no era necesario que su orden fuera positivo, al no representar una longitud. Esta decisión les abrió a nuevas posibilidades, por lo que han perdurado.

Todo número poligonal viene dado por esta fórmula muy popular:

Si permitimos que n sea cero o negativo, obtendremos los llamados números poligonales generalizados.

Si n es positivo, resultará un número poligonal clásico, que siempre será entero, ya que en el numerador se restan dos números de la misma paridad. Si generalizamos a un número negativo, sea n=-m, al sustituir en la fórmula obtendremos

Esta expresión da lugar a una nueva clase de poligonales a los que llamaremos segundos poligonales del mismo orden. Con el añadido del cero, los números poligonales generalizados serán la unión de los clásicos con estos otros de segunda naturaleza.

Si imaginamos m=n, ocurrirá que PSn=Pn+(k-4)n

Comparemos, por ejemplo, las dos clases de hexagonales:

Los clásicos: 0, 1, 6, 15, 28, 45, 66, 91, 120, 153, 190, 231, de fórmula n(2n-1)

https://oeis.org/A000384

Los segundos: 0, 3, 10, 21, 36, 55, 78, 105, 136, 171, 210, de fórmula n(2n+1)

https://oeis.org/A014105

la diferencia entre sus elementos del mismo orden (k-4)n=2n

Así, 3-1=2*1, 10-6=2*2, 21-15=2*3, …

Lo interesante es que ambos conjuntos se pueden unir intercalando sus elementos. Para ello, habrá que demostrar que PSn<Pn+1

Planteamos la diferencia:

Al ser el resultado positivo, podemos afirmar que Pn  < PSn< Pn+1, y que, por tanto, se pueden intercalar ambas sucesiones con el título de números poligonales generalizados.

En el caso del hexágono formarían, intercalados, los números hexagonales generalizados:

0, 1, 3, 6, 10,15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136,153,

Nos llevamos la sorpresa de que son los números triangulares clásicos. Ya volveremos sobre ellos.

Casos particulares

Los triangulares se convierten en otros triangulares al cambiar de índice positivo a negativo, y los cuadrados permanecen iguales. Los casos interesantes comienzan con los pentagonales. Veremos los de este tipo y algunos más:

Números pentagonales generalizados

Los pentagonales clásicos, 1, 5, 12, 22, 35, 51, … siguen la fórmula

Es el caso particular de la fórmula general para k=5

Están publicados en https://oeis.org/A000326 y estudiados en mi publicación “Números poligonales” https://www.hojamat.es/publicaciones/poligonales.pdf

Según lo tratado anteriormente, los segundos pentagonales tendrán como fórmula

Son estos:

0, 2, 7, 15, 26, 40, 57, 77, 100, 126, 155, 187, …

Su diferencia con los clásicos del mismo orden es n: 2-1=1, 7-5=2, 15-12=3, …

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

La unión de las dos sucesiones formará esta otra, la de pentagonales generalizados:

0, 1, 2, 5, 7, 12, 15, 22, 26, 35, 40, 51, 57, 70, 77, 92, 100, 117, 126, 145, 155, 176, 187, 210, 222, 247, 260, … (https://oeis.org/A001318)

Segundos pentagonales

Estudiamos algunos detalles de los segundos pentagonales:

Interpretación combinatoria

En la página de OEIS correspondiente se afirma que representan las cartas necesarias para construir un castillo de naipes. La clave está en el hecho de que PS(n+1)=PS(n)+2n+3:

Para el primer castillo se necesitan 3 cartas, y dado un castillo ya formado, deberemos añadir tres cartas por nivel (dos inclinadas y una horizontal) más la culminación, que serán dos cartas. En la imagen se entiende bien:


Las cartas de perfil azul corresponden a PS(3)=15 y las rojas 3*3+2=11, y al sumar obtenemos PS(4)=26

Recurrencias

Además de la ya tratada de 3n+2, existen varias publicadas en OEIS, pero no la que califico de “muy útil” (https://hojaynumeros.blogspot.com/2026/05/unas-recurrencias-muy-utiles.html) también nos vale, y no recurre al valor de n:

xn= 3xn-1-3xn-2+xn-3

En la entrada enlazada se explica su fundamento. Aquí basta con una comprobación en forma de tabla:



Números pentagonales generalizados

Al ser la unión de dos sucesiones, podemos unificar sus fórmulas mediante una función. En ella la variable m es útil para alternar los signos más y menos en el numerador.

pg(n)=my(m=truncate((n+1)/2));(3*m^2+(-1)^n*m)/2

for(k=1,20,print1(pg(k),", "))

Resulta:

1, 2, 5, 7, 12, 15, 22, 26, 35, 40, 51, 57, 70, 77, 92, 100, 117, 126, 145, 155, …

Era lo que se pretendía.

En su página de OEIS se incluyen muchas alternativas como fórmulas para esta sucesión.

 

Nuestra recurrencia “útil”

 

Al ser ambas sucesiones componentes generadas por la misma fórmula de recurrencia, bastará definir como elementos iniciales 0, 0, 1, 2, 5, 7 y aplicar

xn= 3xn-2-3xn-4+xn-6

Así: 3*5-3*1+0=12, 3*7-3*2+0=15, 3*12-3*5+1=22, …

Propiedad de Conway

La tercera parte de un triangular es un pentagonal generalizado si no es del tipo 3n+1

En esta tabla figuran los primeros triangulares y su tercera parte si es válida la para la propiedad:

0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 ...

0    1 2        5  7       12 15      22 26       35  40          51 ...

T(3n)/3=3n*(3n+1)/6=(9n2+3n)/6=(3n2+n)/2

T(3n-1)/3=(3n-1)(3n)/6=(3n2-n)/2

En ambos casos resulta un pentagonal generalizado.

 Otra propiedad: 24*a(n)+1 es un cuadrado

24(3n2+2)/2+1=36n2+24n+1=(6n+1)2

E igual con los pentagonales clásicos

Números heptagonales generalizados

Siguiendo los mismos razonamientos que con los pentagonales, esta otra sucesión será la unión de los heptagonales clásicos, de fórmula HP(n)=n(5n-3)/2 y los “segundos”, provenientes de órdenes negativos HPS(n)=n(5n+3)/2.

La sucesión resultante es, en sus primeros términos:

0, 1, 4, 7, 13, 18, 27, 34, 46, 55, 70, 81, 99, 112, 133, 148, 172, 189, 216, 235, 265, 286, 319, 342, 378, 403, 442, 469, 511, 540, 585, …

Está publicada en https://oeis.org/A085787, y los segundos heptagonales en https://oeis.org/A147875

Propiedades

A continuación, se verán algunas propiedades de ambas sucesiones:

Los segundos heptagonales son suma de una progresión geométrica, la b(n)=5*n+4, con primer término b(0)=4. En efecto, la suma será S(n)=(4+5*(n-1)+4)*n/2=n(5n-3)/2

Como todos los números de estos tipos siguen la recurrencia

xn= 3xn-1-3xn-2+xn-3

27=3*13-3*4+0, 46=3*27-3*13+4, …

Esta recurrencia se extiende a toda la sucesión generalizada de igual forma que en el caso de pentagonales.

De forma similar a los pentagonales, se cumple que 40a(n)+9 es un cuadrado:

40*n*(5n±3)/2+9=100n2±60n+9=(10n±3)2

lunes, 12 de octubre de 2026

Regresos 16 (3): Particiones condicionadas con PARI

En la anterior entrada se desarrolló un ejemplo de particiones condicionadas con Cartesius y un Buscador. Consistía en descomponer el número 50 en sumandos cuadrados, sin importar el número de ellos que usemos, pero que no pasara de 3. Las soluciones resultaron ser 50=25+16+9=25+25=49+1

Ahora repetiremos el ejemplo con las herramientas del lenguaje PARI.

En PARI se cuenta con la función FORPART, que recorre una partición cualquiera, en la que se pueden integrar condicionantes. Para el ejemplo actual valdría este código:

a(n) = {nb = 0; forpart(p=n, if (#p && (#select(x->issquare(x), Vec(p)) == #p), nb+=1;print(p)), , 3);nb; }
print(a(50))

Cuesta entender todo lo escrito, pero consiste en iniciar un contador nb, recorrer todas las particiones con forpart y condicionarlas con x->issquare(x). El 3 que aparece es el tope para el número de elementos de la partición. Finaliza incrementando el contador e imprimiendo resultados. Así queda en la página oficial de PARI:

 


Coincide con las anteriores herramientas

Segundo ejemplo

Encontrar el número de particiones de un número en números primos sin otro condicionamiento. Por ejemplo, con el número 20:

Utilizamos el código PARI siguiente:

a(n) = {nb = 0; forpart(p=n, if (#p && (#select(x->isprime(x), Vec(p)) == #p), nb+=1), , ); nb; }
print(a(20))

Lo probamos y resulta que son 26:


Si deseamos ver las 26 particiones, le añadimos un print(p) detrás de nb+=1. Observa la imagen:


Con el Buscador se puede comprobar. Basta corregir las líneas de filtro, usando ESPRIMO en lugar de ESCUAD. Se omiten los detalles, ya explicados en la anterior entrada.


Se ha usado como tope el 10, que es máximo número posible de sumandos primos.

Nos puede interesar aplicar otra condición. En el ejemplo anterior se podría exigir que los primos fueran pitagóricos, del tipo 4k+1. Resultaría:


Se ha añadido la condición x%4==1 (el signo % significa MÓDULO)

 Condiciones más exigentes

Partición con sumandos coprimos

He encontrado este ejemplo en https://oeis.org/A000837, y lo uso para resaltar la economía de medios del lenguaje PARI. He adaptado el código a este documento:

s=0;forpart(X=20, s+=(gcd(X)==1);print(s))

Con esta simple línea encontramos que existen 582 particiones en las que el conjunto de sumandos posee MCD igual a 1 (no se afirma que sean primos dos a dos). Aquí, la condición fundamental es gcd(X)==1

Función Q(n)

Se denomina así al número de particiones de un número en elementos distintos. Recordamos aquí que estas particiones son sencillas de encontrar con Cartesius. Basta usar la condición NO REPITE.

Estas son las condiciones para las particiones del número 10 en sumandos distintos:

xrango=10

xt=1..10

no repite

suma=10

creciente

Su solución es


Son diez en total, pero el proceso resulta lento e inestable.

En OEIS (https://oeis.org/A000009) se incluye este código PARI:

{a(n) = my(c); forpart(p=n, if( n<1 || p[1]<2, c++; for(i=1, #p-1, if( p[i+1] > p[i]+1, c--; break)))); c}; /* Michael Somos, Aug 13 2017 */

Es algo oscuro a la hora de entenderlo, pero funciona:

En el elemento correspondiente al 10 observamos que Q(10)=10, tal como resultó en Cartesius.

Con el Buscador

Anulamos los filtros o restricciones, pero en el momento de llegar a la suma de la partición añadimos esta condición:

vale = True

If pp > 1 Then

For j = 2 To pp

For k = 1 To j - 1

If su(e(j)) = su(e(k)) Then vale = False

Next k

Next j

End If

 

If vale Then

De esa forma, sólo nos devolverá las particiones con elementos distintos:


Según un importante teorema ya visto en este blog, el número de estas particiones coincide con las conseguidas si se restringen los sumandos a ser impares.

En el ejemplo del 10 nos resultarían, como era de esperar, 10 particiones con este código:

a(n) = {nb = 0; forpart(p=n, if (#p && (#select(x->x%2==1, Vec(p)) == #p), nb+=1;print(p)), , 3);nb; }
print(a(10))


Con Cartesius bastarían las condiciones

xrango=10

xt=1..10

xt=filtro(impar)

suma=10

creciente

No es recomendable por su lentitud.

Sin más explicaciones, este sería el resultado si eliminamos los sumandos pares:

 



Particiones con un número par o impar de sumandos

En estos ejemplos usaré PARI:

Con un número par:

Es importante la parte #p%2==0,nb+=1, pues % es la operación MODULO y nos indica que la partición tiene un número par de elementos #p.

a(n) = {nb = 0; forpart(p=n, if(#p%2==0,nb+=1), , ); nb; }
print(a(20))

Nos resulta que existen 317 particiones con un número par de elementos. Si deseamos datos de los primeros números obtendremos:


Coinciden con los publicados en
https://oeis.org/A027187

Particiones con número impar de elementos:

Bastaría cambiar #p%2==0 por #p%2==1:


Publicados en
https://oeis.org/A027193

Podemos usar ambas situaciones en funciones separadas, y experimentar algo con ellas. Por ejemplo, que las de número par sean dos más que las de impar:

a(n) = {nb = 0; forpart(p=n, if(#p%2==0,nb+=1), , ); nb; }

b(n) = {nb = 0; forpart(p=n, if(#p%2==1,nb+=1), , ); nb; }

for(i=1,100, if(a(i)==b(i)+2,print1(i,”, “)))


No tiene mucho interés, porque en los primeros números solo se cumple en el 8 y el 10.

También se pueden contar por separado las particiones de cardinal par y las de impar en la misma función. La siguiente busca si el número de particiones de orden par es dos unidades mayor que las de impar en un mismo número n.

c(n) = {my(nb = 0,na=0);forpart(p=n, if(#p%2==0,nb+=1,na+=1,), , ); nb==na+2 }
for(i=1,30, if(c(i)==1,print1(i,”, “)))

Escasean también los resultados.

Lo dejamos aquí. Ya se ha abierto una puerta a más experimentaciones.

Unos detalles para finalizar

PARI posee la función numbpart, que cuenta el número de elementos de una partición. Este código elabora un listado de los números con un número par de particiones distintas:

a(n)={my(c);c=numbpart(n);if(c%2==0,return(c))}
for(i=1,50,if(a(i)>0,print1(i,", ")))


Particiones con producto acotado

En la primera parte de la instrucción forpart se puede incluir toda una línea de código. Esto permite calcular productos en las particiones y condicionarlos.

Por ejemplo, lo siguiente encuentra aquellas particiones de n=5 cuyo producto es mayor que 3. Es importante destacar la forma en la que hay que usar las distintas partes de una partición con Vec(p)[k]):

a(n) = { nn=0; forpart(p=n, pp=1;for(k=1,#p,pp=pp*Vec(p)[k]);if(pp>3,nn+=1;print(p);p));nn }
print(a(5))

Resultado:


Otro ejemplo: podemos reproducir el contenido de
https://oeis.org/A319005

Number of integer partitions of n whose product of parts is >= n.

 1, 1, 1, 1, 2, 2, 5, 7, 13, 18, 28, 40, 60, 80, 113, 152, 205, 266, 353, 454, 590, 751, 959, 1210, 1529, 1905, 2381, 2953, 3658, 4501, …

Usaremos

a(n) = {nn=0; forpart(p=n, pp=1;for(k=1,#p,pp=pp*Vec(p)[k]);if(pp>=n,nn+=1));nn }
for(i=1,30,print1(a(i),", "))

Resultado:



Con estos ejemplos se reconoce la enorme capacidad de PARI para manejar particiones. Paramos ejemplos por ahora.

viernes, 2 de octubre de 2026

Regresos 16 (2): Particiones condicionadas. Algoritmo básico

En esta entrada se desarrollan las ideas sobre punteros móviles para evitar el uso de múltiples bucles en Combinatoria. Seguiremos actuando sobre particiones de un número.

Un ejemplo previo

Supongamos que deseo descomponer el número 50 en sumandos cuadrados, sin importarme el número de ellos que usemos, pero que sea a lo más tres.

Con Cartesius

Esta herramienta no es excesivamente amigable, pero la suelo incluir por sus prestaciones. En ella podríamos plantear lo siguiente:

xrango=3

xt=1..50

xt=filtro(cuadrado)

creciente

suma=50

 

Estas condiciones, por orden, exigen que los sumandos sean uno, dos o tres. Después se fijan los datos en el conjunto 1…50. Se les aplica un filtro para quedarnos tan solo con los cuadrados, y, finalmente, se fija la suma en 50 con sumandos crecientes.


El resultado es




Cartesius solo llega a conjuntos de 12, luego necesitaremos, si deseamos trabajar con Excel, otra herramienta distinta. Es lo que voy a presentar ahora, para destacar la conveniencia del uso de punteros. En negrita y cursiva figura el código, y en tipo normal los comentarios.

Con el Buscador

Este código de algoritmo puede resultar pesado o difícil, por lo que quienes sólo deseen estudiar los ejemplos lo pueden ignorar. Es interesante porque permite, con ligeros retoques, su adaptación a muchas situaciones.

Sub particion()

'Devuelve el número total de particiones condicionadas y su desarrollo

Dim pp, i, j, contador, tope, fila, n, final, suma

Dim e(1000), su(1000)

Dim seguir As Boolean

Dim s$ ‘Contenedor de particiones

 

‘Lee el número y el tope de las particiones

 

n = ActiveWorkbook.Sheets(3).Cells(4, 7).Value

tope = ActiveWorkbook.Sheets(3).Cells(5, 7).Value

 

Call borrarango("e6:i2000")

fila = 8

final = n

For i = 1 To n 'Inicios

 e(i) = 0

 su(i) = 0

 su(i) = i

Next i

 

fila = 8 ‘Inicio de la presentación de resultados

For i = 1 To n 'Inicios

 e(i) = 0 ‘Este vector sigue a los sumandos en la tabla

su(i) = 0, Contenido de la celda que señala el puntero

Next i

 

'Restricciones o filtros En el ejemplo, que sean cuadrados

i = 1

While i <= final

If Not escuad(su(i)) Then

For j = i To n - 1: su(j) = su(j + 1): Next j

final = final – 1 ‘Elimina los que no valen

Else

i = i + 1

End If

Wend

If Not escuad(su(final)) Then final = final – 1

‘Final es el máximo número de sumandos

contador = 0

 

pp = 1  'inicio de puntero

'Aquí inicios varios según el problema a tratar

suma = 0

While pp > 0 'puntero activo((va marcha atrás en ese paso)

‘El puntero va y viene mientras sea positivo y no sobrepase los topes

 

e(pp) = e(pp) + 1 ' avanza en columna dentro del puntero

suma = suma + su(e(pp))

 

seguir = False 'determina si se sigue o no en la misma columna de datos

 

If e(pp) > final Or suma > n Or (pp > 1 And e(pp) > e(pp - 1)) Then seguir = True 'Se ha llegado al tope del rango de datos, y hay que seguir con otra columna

 

If seguir Then 'Seguir significa retroceder el puntero e iniciar su contenido

e(pp) = 0:  pp = pp - 1: suma = 0

 

Else

'Hay algo que comunicar sobre el conjunto, quizás una solución, un mensaje o un añadido

suma = 0

For j = 1 To pp: suma = suma + su(e(j)): Next j

If suma = n And pp <= tope Then

contador = contador + 1’Una solución

fila = fila + 1

s = ""

For j = 1 To pp: s = s + Str$(su(e(j))): Next j

ActiveWorkbook.Sheets(3).Cells(fila, 6).Value = s

End If

If pp < n Then pp = pp + 1

   

End If 'Nivel 1

If pp < n Then pp = pp + 1

End If

Wend

 

'Operaciones finales

ActiveWorkbook.Sheets(3).Cells(5, 5).Value = contador

End Sub

El ejemplo actual se resuelve cambiando las restricciones (en este caso escuad()), porque deseamos que los sumandos sean cuadrados. El resto, valor de n y del tope, se leen en el Buscador.

Al pulsar en el botón de búsqueda obtenemos la solución deseada:

 


Abajo aparecerán las soluciones y, a la izquierda del tope, el número de ellas, que aquí son 3.

La ventaja de este algoritmo es que puede devolver particiones superiores a 12, que es la limitación de Cartesius. También es más rápido.

En la imagen podemos observar las particiones de 100 en trece elementos que son cuadrados pares:


Han resultado trece particiones.

En la siguiente entrada acudiremos mayoritariamente a la instrucción de PARI forpart.