Una partición de un entero expresa una cantidad como suma de enteros positivos, sin considerar el orden de los sumandos.
En una partición de un conjunto agrupamos elementos. En una partición de un número entero descomponemos una cantidad en sumandos positivos, considerando iguales las expresiones que solo cambian el orden.
Por ejemplo, 5 = 3 + 2 y 5 = 2 + 3 representan la misma partición de 5.
Una partición de un entero positivo n es una secuencia de enteros positivos:
La condición de orden decreciente es una forma de escribir cada partición una sola vez.
Las particiones de 4 son:
Por lo tanto, p(4) = 5.
Indica un número entre 1 y 12 para generar todas sus particiones en orden decreciente.
| n | p(n) |
|---|---|
| 0 | 1 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 5 |
| 5 | 7 |
| 6 | 11 |
| 7 | 15 |
| 8 | 22 |
La función p(n) crece más lentamente que n!, pero su crecimiento sigue siendo importante para algoritmos que generan todas las particiones.
También podemos preguntar cuántas particiones de n utilizan exactamente k sumandos.
Esta clasificación conecta las particiones enteras con los problemas de distribución y con técnicas de recurrencia.
El siguiente algoritmo construye particiones eligiendo cada siguiente sumando sin superar el valor anterior.
function particionesEnteras(restante, maximo, actual = [], resultados = []) {
if (restante === 0) {
resultados.push([...actual]);
return resultados;
}
for (let valor = Math.min(restante, maximo); valor >= 1; valor -= 1) {
particionesEnteras(restante - valor, valor, [...actual, valor], resultados);
}
return resultados;
}
console.log(particionesEnteras(5, 5));
El parámetro maximo evita generar la misma partición con un orden diferente.
Una forma de calcular p(n) consiste en decidir si se utiliza un valor máximo permitido. La cantidad de particiones puede expresarse mediante una función de dos parámetros:
El problema se divide entre las particiones que utilizan m y las que no lo utilizan. Esta idea conduce a algoritmos de programación dinámica.
Otra estrategia utiliza una tabla donde cada valor acumula las formas de construir sumas con los valores disponibles.
function contarParticiones(n) {
const formas = Array(n + 1).fill(0);
formas[0] = 1;
for (let valor = 1; valor <= n; valor += 1) {
for (let suma = valor; suma <= n; suma += 1) {
formas[suma] += formas[suma - valor];
}
}
return formas[n];
}
console.log(contarParticiones(6));
El resultado es 11. El orden de los valores se controla recorriendo la tabla de izquierda a derecha.
Podemos estudiar particiones con condiciones adicionales:
Cada restricción cambia el conjunto de sumas válidas y puede requerir una recurrencia específica.
Las particiones de números enteros describen formas de expresar una cantidad como suma de partes positivas sin considerar el orden. Su generación y conteo muestran cómo la combinatoria se conecta con recurrencias y programación dinámica.
En el próximo tema estudiaremos combinaciones con restricciones, aplicando condiciones a las selecciones de elementos.