Ir para o conteúdo principal

Permutações com Repetição: Quando os Elementos se Repetem

·1599 palavras·8 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 6: Esse Artigo

Quantos anagramas tem a palavra MAMBEMBE? Um simples \(8!\) superestima — trocar as duas letras B entre si produz o mesmo anagrama, não um novo. Quando há elementos repetidos, precisamos dividir para compensar.

No artigo sobre combinações simples, encerramos a tríade clássica dos agrupamentos com elementos distintos. Agora damos o passo seguinte: e quando os elementos se repetem?

Por que permutações com repetição?
#

Contar ordenações com elementos repetidos aparece com frequência em computação e ciência de dados:

  • Processamento de linguagem natural: a contagem de anagramas distintos de uma palavra com letras repetidas — como MISSISSIPPI — é o problema-tipo desta fórmula. A mesma lógica estima o número de sequências de tokens distintas geradas por modelos de linguagem com vocabulário restrito.
  • Bioinformática: sequências de DNA são compostas por quatro bases (A, T, C, G) que se repetem. O número de sequências distintas de comprimento \(n\) com composição fixada é uma permutação com repetição — base de métricas de diversidade genômica.
  • Caminhos em redes: o número de caminhos mínimos entre dois pontos de uma grade é uma permutação com repetição de movimentos horizontais e verticais — útil em roteamento de pacotes e planejamento de trajetórias em robótica.
  • Análise combinatória de protocolos: em redes de comutação, sequências de operações com tipos repetidos (leitura, escrita, espera) são contadas com esta fórmula para estimar espaços de estado em verificação formal.
  • Estatística: o coeficiente multinomial \(\dfrac{n!}{n_1!,n_2!,\cdots,n_r!}\) — que é exatamente esta fórmula — aparece na distribuição multinomial, que generaliza a distribuição binomial para mais de dois resultados possíveis.

Da combinação à permutação com repetição
#

O diagrama abaixo expande a árvore de decisão do artigo anterior, acrescentando o ramo que cobre elementos repetidos:

flowchart TD
    A["n elementos"] --> B{"Todos distintos?"}
    B -->|"Sim"| C{"Usar todos?"}
    C -->|"Sim"| D["Permutação Simples
P_n = n!"] C -->|"Não — escolher r"| E{"Ordem importa?"} E -->|"Sim"| F["Arranjo Simples
A(n,r) = n!/(n-r)!"] E -->|"Não"| G["Combinação Simples
C(n,r) = n!/(r!(n-r)!)"] B -->|"Não — há repetidos"| H["Permutação com Repetição
n! / (n₁! · n₂! · … · nᵣ!)"]

A Ideia Central: Remover a Supercontagem
#

Imagine 5 lapiseiras: 2 brancas (B¹ e B²), 1 azul, 1 preta, 1 verde. Se tratarmos as duas brancas como distintas, obtemos \(5!\) distribuições. Mas B¹=branca e B²=branca são a mesma coisa para quem recebe — cada distribuição real foi contada \(2!\) vezes.

Número correto: \(\dfrac{5!}{2!} = 60\).

Permutação com Repetição
#

Definição

Dado um conjunto de \(n\) elementos, dos quais \(n_1\) são iguais ao tipo 1, \(n_2\) ao tipo 2, …, \(n_r\) ao tipo \(r\), com \(n_1 + n_2 + \cdots + n_r = n\), o número de arranjos (permutações) distintos é:

$$P_n^{(n_1, n_2, \ldots, n_r)} = \frac{n!}{n_1!\, n_2!\, \cdots\, n_r!}$$

Intuição: começamos com \(n!\) ordenações de todos os elementos como se fossem distintos. Dividimos por \(n_i!\) para cada grupo de elementos iguais, que permutam entre si sem criar novidade.

Exemplos Resolvidos
#

Números formados com 1,1,1,3,3,9
#

Enunciado: Quantos números de 6 algarismos distintos podem ser formados com os dígitos 1, 1, 1, 3, 3, 9?

Solução:

Via fórmula:

$$\frac{6!}{3!\,2!\,1!} = \frac{720}{12} = 60$$

Via escolha de posições: escolher 3 posições (de 6) para os 1s: \(C(6,3) = 20\). Depois 2 posições (de 3 restantes) para os 3s: \(C(3,2) = 3\). O 9 ocupa o último: \(C(1,1) = 1\). Total: \(20 \times 3 \times 1 = 60\) ✓

Anagramas de MAMBEMBE
#

Letras: M(3×), B(2×), E(2×), A(1×) — total 8 letras.

$$P_8^{(3,2,2,1)} = \frac{8!}{3!\,2!\,2!\,1!} = \frac{40{.}320}{24} = \mathbf{1{.}680}$$
Python: math.factorial e collections.Counter

Python permite calcular a fórmula diretamente com math.factorial, ou usar sympy.factorial para trabalhar simbolicamente. O padrão mais idiomático combina collections.Counter para contar as frequências com math.prod para calcular o denominador:

from math import factorial
from collections import Counter
from math import prod

def permutacoes_repeticao(palavra: str) -> int:
    n = len(palavra)
    frequencias = Counter(palavra).values()
    return factorial(n) // prod(factorial(k) for k in frequencias)

print(permutacoes_repeticao("MAMBEMBE"))  # 1680
print(permutacoes_repeticao("MISSISSIPPI"))  # 34650

Counter retorna um dicionário {letra: quantidade} — exatamente os \(n_i\) da fórmula. prod(factorial(k) for k in ...) calcula o denominador sem precisar nomear cada frequência individualmente.

Campeonato com 15 partidas: 7 vitórias, 5 derrotas, 3 empates
#

Quantas sequências de resultados possíveis?

$$\frac{15!}{7!\,5!\,3!} = \mathbf{360{.}360}$$

Sequências binárias com três 1s e cinco 0s
#

Quantas sequências de 8 bits têm exatamente três 1s e cinco 0s?

$$P_8^{(3,5)} = \frac{8!}{3!\,5!} = \binom{8}{3} = \mathbf{56}$$

Esse resultado revela uma equivalência importante:

Sequências binárias e o coeficiente binomial

Qualquer sequência com \(k\) símbolos de um tipo e \(m\) símbolos de outro tipo — independentemente de quais sejam esses símbolos — tem exatamente

$$P_{k+m}^{(k,\,m)} = \frac{(k+m)!}{k!\,m!} = \binom{k+m}{k}$$

arranjos distintos. No exemplo acima, \(k = 3\) (uns) e \(m = 5\) (zeros), dando \(\binom{8}{3} = 56\). Essa fórmula reaparece sempre que um problema se reduz a alocar dois tipos de símbolos em sequência — como o método das estrelas e barras, que será visto no artigo sobre combinações com repetição.

Python: itertools.combinations para sequências binárias

Gerar todas as sequências binárias de comprimento 8 com exatamente três 1s é equivalente a escolher quais 3 posições (entre as 8) recebem o valor 1 — uma combinação. itertools.combinations faz exatamente isso:

from itertools import combinations
from math import comb

n, k = 8, 3

# Conta diretamente pela equivalência com C(n, k)
print(comb(n, k))  # 56

# Gera todas as sequências: cada tupla indica as posições dos 1s
posicoes = list(combinations(range(n), k))
print(len(posicoes))  # 56

# Converte para strings binárias
def to_binaria(pos, n):
    seq = ['0'] * n
    for i in pos: seq[i] = '1'
    return ''.join(seq)

sequencias = [to_binaria(p, n) for p in posicoes]
print(sequencias[:4])  # ['11100000', '11010000', '11001000', '11000100']

Caminhos mínimos em malha: de (0,0) a (4,3)
#

Mover-se apenas para cima (C) ou para a direita (D), em 7 passos (4D e 3C). A figura abaixo mostra dois dos 35 caminhos possíveis: o caminho azul sobe primeiro e depois vai à direita; o amarelo faz o inverso.

Dois caminhos mínimos numa grade 4×3, de A=(0,0) a B=(4,3): caminho azul (sobe depois vai à direita) e caminho amarelo (vai à direita depois sobe).
Dois caminhos distintos entre os 35 possíveis

$$P_7^{(4,3)} = \frac{7!}{4!\,3!} = \binom{7}{4} = \mathbf{35} \text{ caminhos}$$

Anagramas de MAMBEMBE começando com vogal
#

Enunciado: Quantos anagramas de MAMBEMBE têm uma vogal na primeira posição?

Solução: As vogais disponíveis são A, E, E. Os casos são disjuntos conforme a vogal inicial.

Caso 1 — começa com A: as restantes são M,M,M,B,B,E,E (7 letras):

$$N_1 = \frac{7!}{3!\,2!\,2!} = \mathbf{210}$$

Caso 2 — começa com E: as restantes são M,M,M,A,B,B,E (7 letras):

$$N_2 = \frac{7!}{3!\,1!\,2!\,1!} = \mathbf{420}$$

Total (Princípio Aditivo — casos disjuntos): \(210 + 420 = \mathbf{630}\)

Anagramas de MAMBEMBE com todos os M separados
#

Enunciado: Quantos anagramas de MAMBEMBE têm os três M’s em posições não adjacentes entre si?

Solução:

Etapa 1: ordenar as 5 letras não-M: A, B, B, E, E.

$$\frac{5!}{2!\,2!\,1!} = 30 \text{ ordens}$$

Etapa 2: em cada ordem surgem 6 lacunas (antes, entre e após as letras). Inserir 3 M’s em 3 lacunas distintas (para que não fiquem adjacentes):

$$C(6, 3) = 20$$

Total: \(30 \times 20 = \mathbf{600}\)

Tabela-Resumo
#

Tipo Elementos iguais? Fórmula
Permutação simples Não \(P_n = n!\)
Permutação com repetição Sim \(\dfrac{n!}{n_1!, n_2!, \cdots, n_r!}\)
Caso especial: dois tipos Sim (dois grupos) \(\dfrac{n!}{k!,(n-k)!} = \dbinom{n}{k}\)

Exercícios
#

Os exercícios a seguir cobrem as principais técnicas do artigo: aplicação direta da fórmula, casos com restrição de posição e caminhos em grade. Estão ordenados do mais simples ao mais complexo.

Exercício 1 — Números com dígitos repetidos

Quantos números de 7 dígitos podem ser formados com \(1, 3, 6, 6, 6, 8, 8\)? (a) Sem restrições. (b) Maiores que 6.000.000.

(a) \(\dfrac{7!}{3!,2!,1!,1!} = \dfrac{5040}{12} = \mathbf{420}\)

(b) 1º dígito ∈ {6, 8}.

  • Começa com 6: restam \(6,6,8,8,1,3\) → \(\dfrac{6!}{2!,2!,1!,1!} = 180\)
  • Começa com 8: restam \(6,6,6,8,1,3\) → \(\dfrac{6!}{3!,1!,1!,1!} = 120\)

Total: \(180 + 120 = \mathbf{300}\)

Exercício 2 — Subconjuntos de 5 dígitos de \(\{1,1,1,1,2,3\}\)

Quantos números de 5 algarismos podem ser formados escolhendo 5 dos 6 dígitos \(1,1,1,1,2,3\)?

Grupos disjuntos (quais 5 dos 6 usamos):

  • \(\{1,1,1,1,2\}\): \(\dfrac{5!}{4!} = 5\)
  • \(\{1,1,1,1,3\}\): \(\dfrac{5!}{4!} = 5\)
  • \(\{1,1,1,2,3\}\): \(\dfrac{5!}{3!} = 20\)

Total: \(5 + 5 + 20 = \mathbf{30}\)

Os dois exercícios a seguir usam o mesmo mapa. A figura abaixo mostra a malha com os pontos A, B e C marcados — e, antecipando o Exercício 4, destaca um caminho possível de A até C (em azul) e um de C até B (em amarelo):

Grade com 7 avenidas verticais (N-S) e 6 avenidas horizontais (L-O), pontos A, B e C marcados; um caminho A→C em azul e um C→B em amarelo, com contagens de 70 e 3 caminhos respectivamente.
Malha dos exercícios 3 e 4: ponto C divide o percurso A→B em dois segmentos independentes

Exercício 3 — Caminhos mínimos em malha

Num mapa com 7 avenidas N-S (Norte-Sul, ou seja, verticais) e 6 avenidas L-O (Leste-Oeste, ou seja, horizontais), quantos trajetos mínimos existem do canto inferior-esquerdo (A) ao canto superior-direito (B)?

Com 7 avenidas N-S há 6 blocos horizontais a cruzar (6 movimentos à direita); com 6 avenidas L-O há 5 blocos verticais a cruzar (5 movimentos para cima). Qualquer caminho que só avance — nunca retroceda — usa exatamente esses 11 passos, portanto 11 é o comprimento mínimo:

$$\frac{11!}{6!\,5!} = C(11,6) = \mathbf{462}$$
Exercício 4 — Caminhos mínimos passando por C

No mesmo mapa, quantos trajetos A→B passam pelo ponto C localizado 4 blocos à direita e 4 acima de A?

  • A→C: 4D + 4C = \(\dfrac{8!}{4!,4!} = 70\)
  • C→B: 2D + 1C = \(\dfrac{3!}{2!,1!} = 3\)

Total: \(70 \times 3 = \mathbf{210}\)

Próximos passos
#

A permutação com repetição resolve o caso em que usamos todos os \(n\) elementos — inclusive os repetidos. A limitação que permanece é essa exigência de usar todos: e se quisermos escolher apenas \(r < n\) elementos de um conjunto com repetições permitidas, e a ordem ainda importar?

Esse cenário — selecionar \(r\) elementos com reposição entre \(n\) tipos disponíveis — leva aos arranjos com repetição, tema do próximo artigo da série.

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

Relacionados