Las permutaciones circulares cuentan arreglos alrededor de un círculo cuando las rotaciones de una misma configuración se consideran equivalentes.
En una fila, cambiar todos los elementos una posición produce un ordenamiento diferente. En un círculo, en cambio, una rotación completa puede dejar las relaciones entre vecinos exactamente iguales.
Por eso, al contar personas alrededor de una mesa o elementos en una disposición circular, debemos decidir si las rotaciones representan configuraciones nuevas o la misma configuración.
Con cuatro elementos A, B, C y D, en una fila hay:
En un círculo, estas disposiciones representan el mismo arreglo por rotación:
Las cuatro secuencias tienen los mismos vecinos. Por eso cada arreglo circular fue contado 4 veces en el cálculo lineal.
Para n elementos diferentes alrededor de un círculo, si las rotaciones se consideran equivalentes, la cantidad de arreglos es:
La fórmula se obtiene fijando un elemento en una posición de referencia y ordenando libremente los otros n - 1 elementos.
Elegimos un elemento como referencia, por ejemplo A. Esto elimina las diferencias producidas únicamente por rotar todo el círculo.
Fijar A no elimina una relación real entre los elementos. Solo evita contar varias veces el mismo círculo desde distintos puntos de inicio.
Para A, B, C y D alrededor de un círculo:
Fijamos A y ordenamos B, C y D. Las seis disposiciones relativas son:
Escribe entre 3 y 5 elementos diferentes. La simulación fija el primer elemento y muestra los arreglos restantes, evitando duplicados por rotación.
Para generar arreglos circulares, fijamos el primer elemento y permutamos los restantes.
function permutar(elementos) {
if (elementos.length === 0) return [[]];
const resultados = [];
elementos.forEach((elemento, indice) => {
const restantes = elementos.filter((_, posicion) => posicion !== indice);
permutar(restantes).forEach(resto => {
resultados.push([elemento, ...resto]);
});
});
return resultados;
}
const elementos = ["A", "B", "C", "D"];
const circulares = permutar(elementos.slice(1))
.map(resto => [elementos[0], ...resto]);
console.log(circulares.map(arreglo => arreglo.join("-")));
El primer elemento permanece siempre en la primera posición de la representación lineal. Cada lista restante representa un círculo diferente.
Si un arreglo circular comienza en otro elemento, no necesariamente se trata de una configuración nueva. Por ejemplo:
Para comprobar si dos arreglos son iguales por rotación, podemos buscar si uno aparece dentro de la repetición circular del otro.
function sonRotacionesIguales(a, b) {
if (a.length !== b.length) return false;
const doble = [...a, ...a];
return doble.slice(0, -1).some((_, inicio) =>
doble.slice(inicio, inicio + b.length).every((valor, indice) => valor === b[indice])
);
}
console.log(sonRotacionesIguales(["A", "B", "C"], ["B", "C", "A"]));
En algunos problemas, leer el círculo en sentido horario o antihorario produce configuraciones diferentes. En otros, un arreglo y su reflejo se consideran iguales.
| Modelo | Rotaciones | Reflejos | Conteo habitual |
|---|---|---|---|
| Mesa circular con posiciones orientadas | Equivalentes | Diferentes | (n - 1)! |
| Collar que puede darse vuelta | Equivalentes | Equivalentes | Puede requerir dividir también por reflejos |
| Secuencia circular con dirección marcada | Puede ser diferente | Diferentes | Depende del modelo |
Siempre debemos leer con cuidado qué transformaciones consideran equivalente las condiciones del problema.
Si dos elementos deben quedar juntos, pueden tratarse temporalmente como un bloque. Si dos personas no pueden ser vecinas, es posible contar todos los arreglos y restar los que incumplen la condición.
Estas técnicas combinan permutaciones circulares con principios de conteo y se desarrollarán en temas posteriores.
Las permutaciones circulares adaptan el conteo de ordenamientos al hecho de que no existe una primera posición natural. Fijar un elemento elimina las rotaciones equivalentes y deja (n - 1)! arreglos para los elementos restantes.
En el próximo tema estudiaremos las variaciones sin repetición, donde se ordena solo una parte de los elementos disponibles.