Featured image of post Princípio da Inclusão-Exclusão: Uma técnica poderosa para contar corretamente elementos em conjuntos sobrepostos

Princípio da Inclusão-Exclusão: Uma técnica poderosa para contar corretamente elementos em conjuntos sobrepostos

Um guia aprofundado sobre o Princípio da Inclusão-Exclusão, uma ferramenta matemática essencial para contar com precisão elementos de vários conjuntos sobrepostos sem duplicação. Explicamos tudo, desde o caso básico de 2 conjuntos até o caso geral de n conjuntos, usando exemplos, provas e exemplos de aplicação.

1. Introdução

Na matemática e na ciência da computação, frequentemente encontramos situações em que precisamos contar o número de elementos que satisfazem várias condições. No entanto, quando existem várias condições, os conjuntos de elementos que satisfazem cada condição frequentemente se sobrepõem (têm interseções). Simplesmente somá-los resultará em contar os elementos várias vezes.

Um método poderoso para eliminar com precisão essas sobreposições e derivar o número correto de elementos é o Princípio da Inclusão-Exclusão.

Neste artigo, explicaremos de forma abrangente o Princípio da Inclusão-Exclusão em detalhes, desde seus conceitos básicos até fórmulas matemáticas generalizadas, provas matemáticas e exemplos concretos de aplicação (como a função totiente de Euler e desarranjos). Além disso, apresentaremos exemplos de implementação de programação para aprofundar sua compreensão sob perspectivas teóricas e práticas.

2. Noções básicas de Conjuntos e Cardinalidade

Antes de aprender o Princípio da Inclusão-Exclusão, vamos rever a notação básica de conjuntos.

  • \(A, B\) : Conjuntos
  • \(|A|\) : Número de elementos (cardinalidade) do conjunto \(A\)
  • \(A \cup B\) : União do conjunto \(A\) e do conjunto \(B\) (elementos que pertencem a pelo menos um)
  • \(A \cap B\) : Interseção do conjunto \(A\) e do conjunto \(B\) (elementos que pertencem a ambos)

O que queremos encontrar é a cardinalidade da união de vários conjuntos, ou seja, \(|A \cup B \cup \dots|\).

3. Princípio da Inclusão-Exclusão para 2 Conjuntos

Consideremos o caso mais simples com dois conjuntos, \(A\) e \(B\).

3.1 Fórmula

\[ |A \cup B| = |A| + |B| - |A \cap B| \]

3.2 Compreensão Intuitiva

Ao adicionar o número de elementos no conjunto \(A\) (\(|A|\)) e no conjunto \(B\) (\(|B|\)), os elementos que pertencem a ambos os conjuntos, ou seja, elementos na interseção \(A \cap B\), são adicionados duas vezes. Portanto, subtraindo a parte contada a mais \(|A \cap B|\) exatamente uma vez, obtém-se a cardinalidade correta da união \(|A \cup B|\).

  flowchart TD
    U["Conjunto Universal U"]
    A["Conjunto A"]
    B["Conjunto B"]
    AandB["A ∩ B (Interseção)"]
    U -->|"Contém"| A
    U -->|"Contém"| B
    A -->|"Sobreposição"| AandB
    B -->|"Sobreposição"| AandB

4. Princípio da Inclusão-Exclusão para 3 Conjuntos

Quando há três conjuntos, torna-se um pouco mais complexo. Considere os conjuntos \(A, B, C\).

4.1 Fórmula

\[ |A \cup B \cup C| = |A| + |B| + |C| - |A \cap B| - |B \cap C| - |C \cap A| + |A \cap B \cap C| \]

4.2 Compreensão Intuitiva e Prova

  1. Primeiro, adicione todas as cardinalidades individuais: \(|A| + |B| + |C|\)
  2. Ao fazer isso, as interseções de quaisquer dois conjuntos são adicionadas duas vezes, então subtraia-as: \(- |A \cap B| - |B \cap C| - |C \cap A|\)
  3. Finalmente, considere a interseção de todos os três conjuntos \(A \cap B \cap C\). Ela foi adicionada 3 vezes no passo 1, e subtraída 3 vezes no passo 2, deixando sua contagem atual em \(0\). Portanto, adicionamos de volta uma vez no final: \(+ |A \cap B \cap C|\)

4.3 Exemplo Concreto: O número de inteiros de 1 a 100 divisíveis por 2, 3 ou 5

  • Conjunto universal: \(U = \{1, 2, \dots, 100\}\)
  • Conjunto de múltiplos de 2: \(A\)
  • Conjunto de múltiplos de 3: \(B\)
  • Conjunto de múltiplos de 5: \(C\)

Vamos encontrar cada cardinalidade (onde \(\lfloor x \rfloor\) representa a função piso).

  • \(|A| = \lfloor 100 / 2 \rfloor = 50\)
  • \(|B| = \lfloor 100 / 3 \rfloor = 33\)
  • \(|C| = \lfloor 100 / 5 \rfloor = 20\)
  • \(|A \cap B|\) (Múltiplos de 6) \(= \lfloor 100 / 6 \rfloor = 16\)
  • \(|B \cap C|\) (Múltiplos de 15) \(= \lfloor 100 / 15 \rfloor = 6\)
  • \(|C \cap A|\) (Múltiplos de 10) \(= \lfloor 100 / 10 \rfloor = 10\)
  • \(|A \cap B \cap C|\) (Múltiplos de 30) \(= \lfloor 100 / 30 \rfloor = 3\)
\[ |A \cup B \cup C| = 50 + 33 + 20 - 16 - 6 - 10 + 3 = 74 \]

Portanto, existem 74 números divisíveis por 2, 3 ou 5.

5. Princípio Geral da Inclusão-Exclusão para \(n\) Conjuntos

Generalizando isso para \(n\) conjuntos \(A_1, A_2, \dots, A_n\) temos a seguinte bela fórmula.

5.1 Fórmula

\[ \left| \bigcup_{i=1}^n A_i \right| = \sum_{k=1}^n (-1)^{k-1} \left( \sum_{1 \le i_1 < i_2 < \dots < i_k \le n} \left| A_{i_1} \cap A_{i_2} \cap \dots \cap A_{i_k} \right| \right) \]

Em palavras, a operação repete “adicionar as cardinalidades das interseções de um número ímpar de conjuntos e subtrair as cardinalidades das interseções de um número par de conjuntos”.

5.2 Esboço da Prova Matemática

Mostraremos que qualquer elemento \(x \in \bigcup_{i=1}^n A_i\) é contado exatamente uma vez no cálculo do lado direito.

Suponha que um certo elemento \(x\) esteja contido em exatamente \(m\) conjuntos (\(1 \le m \le n\)). O número de vezes que \(x\) é contado no lado direito pode ser expresso usando coeficientes binomiais da seguinte forma:

\[ \text{Vezes Contadas} = \binom{m}{1} - \binom{m}{2} + \binom{m}{3} - \dots + (-1)^{m-1} \binom{m}{m} \]

Pelo teorema binomial, sabe-se que \((1 - 1)^m = \binom{m}{0} - \binom{m}{1} + \binom{m}{2} - \dots + (-1)^m \binom{m}{m} = 0\). Reorganizando isso:

\[ \binom{m}{0} - \left( \binom{m}{1} - \binom{m}{2} + \dots + (-1)^{m-1} \binom{m}{m} \right) = 0 \]

Uma vez que \(\binom{m}{0} = 1\), a expressão dentro dos parênteses (que é o número de vezes que \(x\) é contado) é avaliada exatamente como \(1\). Isso prova que cada elemento é contado exatamente uma vez, sem duplicação.

6. Exemplo de Aplicação 1: Função Totiente de Euler

A função totiente de Euler \(\varphi(N)\) representa o número de inteiros de \(1\) a \(N\) que são coprimos com \(N\). Isso também pode ser calculado usando o Princípio da Inclusão-Exclusão.

Sejam os fatores primos de \(N\) representados por \(p_1, p_2, \dots, p_k\). Seja o conjunto universal \(U = \{1, 2, \dots, N\}\), e \(A_i\) seja “o conjunto de múltiplos de \(p_i\)”. O que queremos encontrar é o número de elementos que não pertencem a nenhum \(A_i\).

\[ \varphi(N) = N - \left| \bigcup_{i=1}^k A_i \right| \]

A aplicação do Princípio da Inclusão-Exclusão e sua simplificação leva a esta famosa fórmula:

\[ \varphi(N) = N \left(1 - \frac{1}{p_1}\right) \left(1 - \frac{1}{p_2}\right) \dots \left(1 - \frac{1}{p_k}\right) \]

7. Exemplo de Aplicação 2: Desarranjos

Um desarranjo é uma permutação dos números de \(1\) a \(n\) tal que nenhum \(i\)-ésimo número esteja na \(i\)-ésima posição. Por exemplo, é equivalente ao número total de maneiras de distribuir presentes em uma troca de presentes de modo que ninguém receba o próprio presente.

Seja \(A_i\) “o conjunto de permutações onde \(i\) está na \(i\)-ésima posição”. A cardinalidade do conjunto universal é \(n!\). Queremos encontrar \(n! - |A_1 \cup A_2 \cup \dots \cup A_n|\).

A cardinalidade da interseção de quaisquer \(k\) conjuntos é \((n-k)!\), e existem \(\binom{n}{k}\) maneiras de escolher tais \(k\) conjuntos. Aplicando o Princípio da Inclusão-Exclusão, o número de desarranjos \(D_n\) é obtido da seguinte forma:

\[ D_n = n! \sum_{k=0}^n \frac{(-1)^k}{k!} \]

8. Cálculo e Implementação via Programação

O Princípio da Inclusão-Exclusão é extremamente útil na programação. Especialmente quando combinado com pesquisa exaustiva bit a bit, o Princípio da Inclusão-Exclusão para \(n\) condições pode ser implementado de forma concisa.

Abaixo está o código Python para encontrar “o número de inteiros de 1 a \(M\) que são divisíveis por qualquer um dos números primos em uma determinada lista”.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def count_multiples(M: int, primes: list[int]) -> int:
    n = len(primes)
    total_count = 0
    
    # Explora todos os subconjuntos usando máscaras de bits de 1 a 2^n - 1
    for i in range(1, 1 << n):
        lcm = 1
        set_bits = 0
        
        # Calcula o produto (MMC) dos primos selecionados
        for j in range(n):
            if (i >> j) & 1:
                lcm *= primes[j]
                set_bits += 1
                
        # Adiciona se um número ímpar de primos for escolhido, subtrai se for par (Princípio da Inclusão-Exclusão)
        if set_bits % 2 == 1:
            total_count += M // lcm
        else:
            total_count -= M // lcm
            
    return total_count

# Exemplo de execução
M = 100
primes = [2, 3, 5]
# Saída esperada: 74
print(f"Resultado: {count_multiples(M, primes)}")

A complexidade de tempo desse algoritmo é \(O(n \cdot 2^n)\), que é executado com rapidez suficiente se \(n\) for até cerca de 20.

9. Conclusão

O Princípio da Inclusão-Exclusão é uma fórmula matemática mágica que divide as sobreposições de conjuntos aparentemente complexas em uma repetição simples e mecânica de adição e subtração.

Sua gama de aplicações é excepcionalmente ampla, abrangendo desde problemas básicos de probabilidade a programação competitiva avançada e o cálculo da função totiente de Euler relacionada à criptografia. Dominar essa técnica poderosa melhorará drasticamente suas habilidades de resolução de problemas em matemática e algoritmos. Não deixe de tentar aplicá-lo a vários problemas e experimentar o seu poder.

comments powered by Disqus