Módulo 2 · Matemática discreta e combinatória

Princípios de contagem

Aula 2.2 · cerca de 20 minutos

Contar direito é o que permite dizer “força bruta não roda” antes de escrever o código. Quatro ferramentas cobrem quase tudo:

Regra do produto:   escolhas independentes ⇒ multiplique
Permutações:        n! = n·(n−1)·…·1
Arranjos:           P(n,k) = n! / (n−k)!
Combinações:        C(n,k) = n! / (k!·(n−k)!)

Use permutação quando a ordem importa (senhas, rotas) e combinação quando não importa (subconjuntos, times).

from math import comb, perm, factorial
from itertools import combinations

comb(5, 2)        # 10
perm(5, 2)        # 20
list(combinations("ABCD", 2))  # [('A','B'), ('A','C'), ...]

# Espaço de busca do caixeiro viajante com 20 cidades
factorial(19) // 2   # ≈ 6·10¹⁶ rotas. Força bruta: fora de questão.

Inclusão-exclusão

|A ∪ B| = |A| + |B| − |A ∩ B|

Somar os dois conjuntos conta a interseção duas vezes; por isso a subtraímos. Com três conjuntos, soma-se de volta a interseção tripla.

Estrelas e barras

O número de formas de distribuir n itens idênticos em k caixas é C(n + k − 1, k − 1). Serve, por exemplo, para contar quantos multiconjuntos (combinações com repetição) existem.

Exercício 1

Quantas senhas de 8 caracteres existem com letras minúsculas e dígitos? Quanto tempo levaria testar todas a 10⁹ tentativas por segundo?

Exercício 2

Entre 1 e 1000, quantos números são divisíveis por 3 ou por 5?