Ir para o conteúdo principal

Permutações Simples e Circulares

·2907 palavras·14 minutos·
Autor
Francisco Bustamante
Um químico trabalhando com Ciência de Dados e Programação em Python.
Tabela de conteúdos
A Arte de Contar - Este artigo faz parte de uma série de artigos.
Parte 3: Esse Artigo

Quantos anagramas tem a palavra VIRUS? Quantas formas 5 amigos podem se sentar ao redor de uma mesa redonda? Essas perguntas têm estrutura diferente das que vimos no artigo sobre Princípios Aditivo e Multiplicativo: aqui queremos ordenar todos os elementos de um conjunto, não apenas escolher alguns deles.

Por que permutações?
#

Ordenar elementos é uma operação fundamental em computação e matemática:

  • Análise de algoritmos: para ordenar \(n\) elementos, existem \(n!\) arranjos possíveis. O contraste entre um algoritmo O(n!) — que testaria todas as ordens — e um O(n log n) como o mergesort ilustra por que a escolha do algoritmo certo pode significar a diferença entre milissegundos e tempo astronômico.
  • Criptografia: cifras de transposição reordenam os caracteres de um texto como operação de codificação. A segurança depende de quantas permutações existem — exatamente \(n!\) para um texto de \(n\) caracteres distintos.
  • Escalonamento de tarefas: \(n\) processos independentes podem ser executados em \(n!\) ordens. Encontrar a sequência de menor custo é um problema de permutação — para \(n\) grande, a força bruta é impraticável.
  • Testes de integração: cobrir todas as ordens de execução de \(n\) operações concorrentes exige testar \(n!\) sequências. Ferramentas de verificação formal (model checking) usam esse raciocínio para detectar condições de corrida em sistemas distribuídos.
  • Roteamento: o número de rotas distintas que visitam \(n\) cidades exatamente uma vez é \((n-1)!\) — base do clássico Problema do Caixeiro-Viajante (TSP, do inglês Travelling Salesman Problem).

Este artigo formaliza a permutação simples (ordenação em fila) e a permutação circular (ordenação em círculo), com exemplos de anagramas, mesas redondas e restrições de adjacência.

Fatorial
#

Antes da permutação em si, precisamos do fatorial:

Fatorial

$$n! = n \cdot (n-1) \cdot (n-2) \cdots 2 \cdot 1, \qquad 0! = 1$$
\(n\) \(n!\)
0 1
1 1
2 2
3 6
4 24
5 120
6 720

Intuição: se temos 4 canetas de cores distintas para distribuir entre 4 amigos, o primeiro recebe qualquer das 4, o segundo qualquer das 3 restantes, e assim por diante: \(4 \times 3 \times 2 \times 1 = 4! = 24\) distribuições.

Permutação Simples
#

Definição

Uma permutação simples de \(n\) elementos distintos é uma ordenação de todos esses elementos em fila.

$$P_n = n!$$

Justificativa: \(n\) escolhas para o 1º elemento, \(n-1\) para o 2º, …, 1 para o último: \(n \cdot (n-1) \cdots 1 = n!\)

Exemplos
#

Exemplo 1 — Anagramas de VIRUS

Enunciado: De quantas formas distintas podem ser arranjadas as 5 letras da palavra VIRUS?

Solução: As 5 letras são todas distintas e queremos ordená-las todas em fila — trata-se de uma permutação simples. Contamos as escolhas posição a posição:

Posição Opções disponíveis Motivo
5 qualquer das 5 letras
4 uma letra já usada
3 duas letras já usadas
2 três letras já usadas
1 só resta uma letra
$$P_5 = 5! = 5 \times 4 \times 3 \times 2 \times 1 = 120$$

Exemplo 2 — Anagramas de VIRUS começando e terminando com consoante

Enunciado: Quantos anagramas de VIRUS começam e terminam com consoante?

Solução: Identificamos os tipos de letra em VIRUS: consoantes — V, R, S (3 letras); vogais — I, U (2 letras).

A estratégia é preencher primeiro as posições com restrição (1ª e 5ª), depois as demais:

Posição Opções Motivo
1ª (deve ser consoante) 3 qualquer uma das 3 consoantes
5ª (deve ser consoante) 2 das 2 consoantes restantes
2ª, 3ª, 4ª (livres) 3! = 6 as 3 letras que sobram (2 vogais + 1 consoante) em qualquer ordem
$$3 \times 2 \times 3! = 3 \times 2 \times 6 = 36$$

Preencher as posições restritas primeiro evita o erro de calcular o total e depois tentar “remover” casos inválidos — aqui o Princípio Multiplicativo já garante que cada arranjo contado é válido.

Python: itertools.permutations e math.factorial

A biblioteca padrão do Python oferece dois caminhos complementares: enumerar as permutações ou apenas contar quantas existem.

import itertools
import math

letras = "VIRUS"

# Contar: P_5 = 5! = 120
print(math.factorial(len(letras)))           # 120

# Enumerar e filtrar: começando e terminando com consoante
consoantes = set("VRS")
anagramas = itertools.permutations(letras)
filtrados = [a for a in anagramas
             if a[0] in consoantes and a[-1] in consoantes]
print(len(filtrados))                         # 36

itertools.permutations(iterable, r) gera todas as permutações de comprimento \(r\) como tuplas (omitir \(r\) usa todos os elementos). Para problemas grandes, nunca converta o iterador para lista: \(20! > 2 \times 10^{18}\).

Exemplo 3 — Números de 5 algarismos com \(\{0, 5, 7, 8, 9\}\)

Enunciado: Usando cada algarismo do conjunto \(\{0, 5, 7, 8, 9\}\) exatamente uma vez, quantos números de 5 algarismos é possível formar?

Solução: O conjunto tem 5 algarismos distintos — sem restrição haveria \(P_5 = 120\) arranjos. A restrição é que o algarismo 0 não pode ocupar a 1ª posição: um número com 0 à frente teria, na prática, apenas 4 algarismos.

Raciocínio direto — preenche a posição restrita primeiro:

Posição Opções Motivo
4 \(\{5, 7, 8, 9\}\) — 0 excluído
4 os 4 algarismos restantes, incluindo 0
3
2
1
$$4 \times 4! = 4 \times 24 = 96$$

Verificação por complemento — subtrai os casos inválidos do total:

$$5! - 4! = 120 - 24 = 96 \checkmark$$

Os \(4!\) casos removidos correspondem a todos os arranjos em que o 0 ocupa a 1ª posição e os 4 algarismos restantes preenchem as demais posições livremente.

Exemplo 4 — Show: 4 mulheres e 5 homens em lugares consecutivos, grupos separados

Enunciado: Nove amigos assistem a um show com lugares marcados consecutivos. As 4 mulheres devem sentar todas juntas e os 5 homens também. De quantas formas podem se sentar?

Solução: Como os lugares são marcados e consecutivos (fila linear), há duas possibilidades para a ordem dos blocos: [M M M M | H H H H H] ou [H H H H H | M M M M]. Dentro de cada bloco, os membros se ordenam livremente.

Passo Cálculo Motivo
Posição relativa dos blocos 2 bloco feminino à esquerda ou à direita do masculino
Permutações internas das mulheres \(4! = 24\) as 4 mulheres se ordenam dentro do bloco
Permutações internas dos homens \(5! = 120\) os 5 homens se ordenam dentro do bloco
$$2 \times 4! \times 5! = 2 \times 24 \times 120 = \mathbf{5760}$$

Permutação Circular
#

Ao organizar pessoas ao redor de uma mesa redonda, o que importa é a posição relativa — não existe uma “primeira cadeira”. Rotações da mesma disposição contam como a mesma permutação.

Permutação Circular

O número de permutações circulares de \(n\) elementos distintos é:

$$PC_n = \frac{P_n}{n} = (n-1)!$$

Intuição: cada permutação circular equivale a \(n\) permutações lineares (cada rotação gera uma nova ordenação em fila, mas a mesma disposição em círculo). Portanto, dividimos por \(n\).

Exemplos
#

Exemplo 1 — 5 amigos ao redor de uma mesa redonda

Enunciado: De quantas formas 5 amigos podem se sentar ao redor de uma mesa redonda?

Solução: Em uma fila, a posição de cada pessoa é absoluta. Em uma mesa redonda, o que importa é a posição relativa entre os presentes — deslocar todos uma cadeira para a direita não cria uma nova disposição, apenas uma rotação da mesma.

Para eliminar rotações equivalentes, fixamos uma pessoa em qualquer cadeira e permutamos as outras 4:

$$PC_5 = (5-1)! = 4! = 24$$
Aplicação: o Problema do Caixeiro-Viajante (TSP)

O problema: um vendedor precisa visitar \(n\) cidades exatamente uma vez e retornar à cidade de origem. Entre cada par de cidades há uma distância conhecida. Qual é a rota de menor distância total?

Formalmente: dado um grafo completo com \(n\) vértices (cidades) e arestas com pesos (distâncias), encontre o ciclo hamiltoniano — aquele que passa por todos os vértices exatamente uma vez — de menor custo.

Por que entra aqui: a rota forma um ciclo e a cidade de partida não altera a estrutura do percurso — exatamente a definição de permutação circular. O número de rotas distintas a avaliar é \((n-1)!\).

A escala do problema: para \(n = 20\) cidades, há \(19! \approx 1{,}2 \times 10^{17}\) rotas possíveis. Se um computador avaliasse \(10^9\) rotas por segundo, levaria cerca de 3,8 mil anos para testar todas. Para \(n = 30\), o tempo superaria a idade do universo.

O que é NP-difícil: um problema é dito NP-difícil quando não se conhece nenhum algoritmo capaz de resolvê-lo de forma exata em tempo polinomial no tamanho da entrada — ou seja, não existe solução do tipo \(O(n^k)\) para nenhum \(k\) fixo. O melhor algoritmo exato conhecido para o TSP tem complexidade exponencial. Na prática, isso significa que para instâncias grandes o problema é intratável por força bruta, e recorre-se a algoritmos de aproximação (que garantem uma solução dentro de um fator do ótimo) ou heurísticas como algoritmos genéticos e simulated annealing (que encontram boas soluções sem garantia de ótimo). O TSP é um dos problemas mais estudados em otimização combinatória.

Exemplos 2 e 3 — Dois elementos não adjacentes: complemento vs. inserção sequencial

Os próximos dois exemplos resolvem o mesmo tipo de problema — dois elementos específicos não podem ser adjacentes em uma disposição circular — com estratégias diferentes. O objetivo é mostrar quando cada abordagem é mais natural.

O diagrama abaixo resume a escolha: a pergunta-chave é se os casos proibidos são fáceis de contar diretamente.

flowchart TD
    A["Dois elementos não podem ser adjacentes
em uma disposição circular"] --> B{"Os casos proibidos
são fáceis de contar
como um bloco?"} B -->|Sim| C["**Complemento**
Total − Proibidos"] B -->|Não| D["**Inserção sequencial**
Construir evitando
a restrição desde o início"] C --> E["Ex. 2 — 5 crianças
24 − 12 = **12**"] D --> F["Ex. 3 — 6 crianças
6 × 4 × 3 = **72**"]

Exemplo 2 — Ciranda de 5 crianças: estratégia do complemento

Enunciado: Cinco crianças (\(c_1, c_2, c_3, c_4, c_5\)) formam uma roda de ciranda. De quantas formas podem se arranjar de modo que \(c_1\) e \(c_2\) não fiquem lado a lado?

Estratégia — complemento: em vez de contar diretamente os casos válidos (difícil), contamos o total e subtraímos os casos proibidos (mais fácil).

$$\text{válidos} = \text{total} - \text{casos com } c_1 \text{ e } c_2 \text{ juntas}$$

Total sem restrição:

$$PC_5 = (5-1)! = 4! = 24$$

Casos proibidos — \(c_1\) e \(c_2\) juntas: tratamos \(\{c_1, c_2\}\) como um bloco único. O problema vira arranjar 4 entidades em círculo e ordenar o bloco internamente:

Passo Cálculo Motivo
4 entidades em círculo \((4-1)! = 3! = 6\) bloco + \(c_3, c_4, c_5\)
Ordenar \(c_1\) e \(c_2\) dentro do bloco \(2! = 2\) \(c_1 c_2\) ou \(c_2 c_1\)

Casos proibidos: \(6 \times 2 = 12\)

$$PC_5 - \text{proibidos} = 24 - 12 = \mathbf{12}$$

Quando usar complemento: quando os casos proibidos formam um conjunto compacto e fácil de descrever — aqui, basta tratar o par como um bloco.

Exemplo 3 — Roda de 6 crianças: estratégia da inserção sequencial

Enunciado: Seis crianças (\(c_1\) a \(c_6\)) formam uma roda de ciranda. De quantas formas podem se arranjar de modo que \(c_1\) e \(c_2\) não fiquem lado a lado?

Estratégia — inserção sequencial: posicionamos primeiro os elementos sem restrição, criando uma estrutura de lacunas, e inserimos os elementos problemáticos por último — escolhendo apenas posições válidas desde o início.

Passo Cálculo Motivo
Arranjar \(c_3, c_4, c_5, c_6\) em círculo \((4-1)! = 3! = 6\) 4 crianças sem restrição formam a estrutura base
Inserir \(c_1\) em um dos 4 espaços entre elas \(6 \times 4 = 24\) 4 lacunas disponíveis — qualquer posição é válida para \(c_1\)
Inserir \(c_2\) em posição não adjacente a \(c_1\) \(24 \times 3 = 72\) das 5 lacunas restantes, 2 são adjacentes a \(c_1\); sobram 3 válidas
$$\mathbf{72} \text{ disposições}$$

O diagrama a seguir ilustra as três etapas da construção — cada seta representa uma multiplicação pelo número de escolhas disponíveis naquele passo:

flowchart LR
    A["**1ª etapa**
c₃ c₄ c₅ c₆
em círculo
(PC)₄ = **6**"] -->|"× 4 posições
para c₁"| B["**2ª etapa**
Inserir c₁
**24** arranjos"] -->|"× 3 posições
não adjacentes
para c₂"| C["**3ª etapa**
Inserir c₂
**72** disposições"]

Quando usar inserção sequencial: quando o complemento seria difícil de calcular — por exemplo, se houvesse múltiplos pares proibidos, a contagem por complemento exigiria inclusão-exclusão. A inserção sequencial incorpora a restrição diretamente na construção, sem precisar subtrair nada.

Exemplo 4 — Show revisitado: e se o palco fosse circular?

Enunciado: Os mesmos 9 amigos do Exemplo 4 da seção anterior — 4 mulheres e 5 homens — agora se posicionam ao redor de um palco circular, mantendo a restrição de que todas as mulheres fiquem juntas e todos os homens juntos. De quantas formas podem se arranjar?

Solução: A estrutura de blocos é a mesma, mas o contexto mudou de linear para circular. O que muda?

No caso linear, os 2 blocos podiam ocupar duas ordens distintas na fila: [M|H] ou [H|M]. No círculo, girar todos uma posição transforma [M|H] em [H|M] — as duas ordens são rotações uma da outra e contam como a mesma disposição. Com apenas 2 blocos em círculo, há \((2-1)! = 1\) arranjo circular.

Passo Linear (Ex. 4 anterior) Circular (este exemplo)
Disposição dos blocos 2 (ordem importa na fila) \((2-1)! = 1\) (rotações equivalentes)
Permutações internas das mulheres \(4! = 24\) \(4! = 24\)
Permutações internas dos homens \(5! = 120\) \(5! = 120\)
Total \(2 \times 24 \times 120 = \mathbf{5760}\) \(1 \times 24 \times 120 = \mathbf{2880}\)

O fator 2 que existia no caso linear desaparece no circular: em uma roda, “mulheres à esquerda dos homens” e “homens à esquerda das mulheres” descrevem a mesma disposição relativa, apenas rotacionada.

Python: simulando permutações circulares

Para gerar permutações circulares — evitando contar rotações como distintas — basta fixar um elemento e permutar os demais:

import itertools
import math

pessoas = ["Ana", "Luís", "Fernando", "Clara", "Bruno"]

# Fixar "Ana" e permutar os outros 4: (5-1)! = 4! = 24
fixo    = pessoas[0]
demais  = pessoas[1:]

circulares = list(itertools.permutations(demais))
print(len(circulares))                    # 24
print(math.factorial(len(pessoas) - 1))   # 24

Fixar um elemento é exatamente o que a fórmula \((n-1)!\) formaliza: remove os \(n\) arranjos rotativamente equivalentes, deixando apenas os estruturalmente distintos.

Comparando Permutações Lineares e Circulares
#

Para 3 pessoas (Ana, Luís, Fernando):

Disposição Conta como Total
Fila (posições numeradas) Permutação simples \(3! = 6\)
Triângulo com lugares numerados Permutação simples \(3! = 6\)
Mesa redonda (só posição relativa importa) Permutação circular \((3-1)! = 2\)

Tabela-Resumo
#

Tipo Fórmula Quando usar
Permutação simples \(P_n = n!\) Fila — posição absoluta importa
Permutação circular \(PC_n = (n-1)!\) Círculo — posição relativa importa
Com bloco obrigatório \(k! \times P_{\text{restante}}\) Elementos que devem ficar juntos
Com restrição (ex.: 0 no início) Complemento Remover casos inválidos

Exercícios
#

Exercício 1 — Simplificação de fatoriais

Simplifique: (a) \(\dfrac{(n+1)!}{n!}\)   (b) \(\dfrac{n!}{(n+2)!}\)   (c) \(\dfrac{(n+1)!}{(n-1)!}\)

Respostas:

(a) \(n+1\)

(b) \(\dfrac{1}{(n+2)(n+1)}\)

(c) \((n+1) \cdot n\)

Exercício 2 — Anagramas de ÂNGULO

Quantos são os anagramas da palavra ÂNGULO que: (a) começam com vogal? (b) começam e terminam por vogal? (c) não têm as letras A e N juntas?

ÂNGULO tem 6 letras distintas: vogais Â, U, O; consoantes N, G, L. Total: \(6! = 720\).

(a) 3 escolhas para a 1ª posição × \(5! = 120\): \(3 \times 120 = \mathbf{360}\)

(b) 3 × 2 para 1ª e última posições × \(4! = 24\): \(3 \times 2 \times 24 = \mathbf{144}\)

(c) Por complemento: tratar \(\{A, N\}\) como bloco → 5 unidades, \(5!\) arranjos × 2 ordens internas = \(240\). Não juntos: \(720 - 240 = \mathbf{480}\)

Exercício 3 — Faces numeradas de um cubo

Um cubo tem as faces pintadas de cores diferentes. De quantos modos podem ser gravados os números 1 a 6, um em cada face?

Resposta: Como cada face está pintada com uma cor distinta, as 6 faces são posições distinguíveis entre si — não há ambiguidade sobre qual é qual. Gravar os números 1 a 6, um em cada face, é uma permutação de 6 elementos em 6 posições distintas:

$$P_6 = 6! = \mathbf{720} \text{ modos}$$
Exercício 4 — Roda de ciranda com sexos alternados

De quantos modos 5 meninas e 5 meninos podem formar uma roda de ciranda de modo que pessoas do mesmo sexo não fiquem juntas?

Resposta: Sexos devem alternar (M-F-M-F…).

  • Arranjar 5 meninos em círculo: \((5-1)! = 4! = 24\)
  • Arranjar 5 meninas nos 5 lugares alternados: \(5! = 120\) $$4! \times 5! = 24 \times 120 = \mathbf{2{,}880}$$
Exercício 5 — Casais em roda com alternância de sexo

De quantos modos 4 casais podem formar uma roda de ciranda com homens e mulheres alternados, com cada casal adjacente?

Resposta:

  • Arranjar 4 casais como unidades em círculo: \((4-1)! = 3! = 6\) arranjos.
  • Para manter a alternância de sexos, todos os casais precisam ter a mesma orientação interna: se o casal 1 está disposto como H–M (sentido horário), todos os outros também devem seguir a mesma ordem — qualquer casal com orientação invertida colocaria dois elementos do mesmo sexo em posições adjacentes. As orientações dos casais não são independentes: há apenas 2 escolhas globais (todos H–M ou todos M–H). $$3! \times 2 = 6 \times 2 = \mathbf{12} \text{ modos}$$

Próximos passos
#

A permutação ordena todos os \(n\) elementos. Quando queremos selecionar e ordenar apenas \(r \leq n\) deles — sem necessariamente usar todos —, entramos no domínio dos arranjos simples (ou permutações parciais), tema do próximo artigo da série.

Mais adiante, veremos como contar agrupamentos em que a ordem não importa — as combinações — completando a tríade fundamental da combinatória: permutações, arranjos e combinações.

A Arte de Contar - Este artigo faz parte de uma série de artigos.
Parte 3: Esse Artigo

Relacionados