MÃ Dulo I - Apostila NES

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 257

Módulo I

Programação Estruturada
Combinatória e Probabilidade
Funções Elementares e Matrizes

Professores:
Programação Estruturada: Juliano Genari
Combinatória e Probabilidade: Cícero Calcheiros
Funções Elementares e Matrizes: Vinicius Guardiano

Coordenadores:
Krerley Oliveira
Ana Carla de Carvalho Correia
Wagner Ranter
Conteúdo
I Programação Estruturada 1

1 Primeiro programa 2
1.1 Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Linguagens de programação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Python + Colab/Jupyter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Primeiro programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2 Fundamentos de programação 7
2.1 Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.1 Tipos de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.3 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2 Operadores aritméticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.2 Operadores aplicados em strings . . . . . . . . . . . . . . . . . . . . . . . 11
2.3 Operadores de atribuição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4 Conversão de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.5 Entrada de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.6 Formatação de strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

3 Estruturas condicionais 15
3.1 Operadores relacionais e lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2 Tabela verdade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2.3 Estrutura IF/ELSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

4 Estruturas de repetição 20
4.1 Laço while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.2 Laço for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.2.2 Função range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.2.4 Função enumerate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.3 Comando break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.4 Comando continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

6 Sequências 26
6.1 Tipos de sequências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6.1.1 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6.1.3 Tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6.1.5 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.2 Operadores aplicados em sequências . . . . . . . . . . . . . . . . . . . . . . . . . 27
6.3 Indexação de sequências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.3.1 Operador de fatiamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.3.2 Usos básicos do operador fatiamento . . . . . . . . . . . . . . . . . . . . . 30
6.3.3 Usos avançados do operador fatiamento . . . . . . . . . . . . . . . . . . . 31
6.4 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.4.1 Adicionando itens a listas . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.4.2 Removendo itens de listas . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
6.4.5 Percorrendo listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

i
Conteúdo Conteúdo

7 Strings 35
7.1 Comparação de strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
7.1.2 Comparação de substrings . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
7.2 Métodos lower() e upper() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
7.3 Pesquisa em strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
7.3.1 Método find() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
7.3.4 Método count() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
7.4 Quebra e junção de strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
7.4.1 Método split() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
7.4.3 Método join() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
7.5 Método replace() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
7.5.2 Método strip() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
7.6 Métodos de validação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

9 Dicionários 44
9.1 Iterando em dicionários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
9.2 Combinando dicionários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
9.3 Deletando itens de dicionários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
9.4 Copiando dicionários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

10 Funções 48
10.1 Funções com parâmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
10.1.1 Parâmetros posicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
10.1.3 Parâmetros de palavra chave . . . . . . . . . . . . . . . . . . . . . . . . . 49
10.2 Funções com retorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
10.3 Escopo de variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
10.3.1 Variáveis locais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
10.3.2 Variáveis globais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
10.3.3 Modificando variáveis globais dentro de uma função . . . . . . . . . . . . 51
10.4 Recursão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

11 Bibliotecas 54
11.1 Importando bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
11.2 Bibliotecas nativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
11.3 Mais bibliotecas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

12 NumPy, parte 1 61
12.1 Arrays NumPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
12.2 Operações com Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
12.3 Arrays multidimencionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
12.4 Indexação e fatiamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
12.4.2 Indexação booleana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
12.5 Transposição e Reformatação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

13 NumPy, parte 2 69
13.1 Funções Universais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
13.2 Funções de Álgebra Linear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
13.3 Funções de Operações de Conjunto . . . . . . . . . . . . . . . . . . . . . . . . . . 71
13.4 Geração de números pseudoaleatórios . . . . . . . . . . . . . . . . . . . . . . . . . 72

14 Captura de erros, manipulação de arquivos e simulações 74


14.1 Captura de erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
14.1.4 Identificando exceções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

ii
Conteúdo Conteúdo

14.2 Leitura e escrita de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77


14.2.2 Estrutura with . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
14.3 Simulações de probabilidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
14.3.1 Simulando lançamento de moeda . . . . . . . . . . . . . . . . . . . . . . . 78
14.3.3 Simulando lançamento de dados . . . . . . . . . . . . . . . . . . . . . . . . 78
14.3.5 Problema de Monty Hall . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

15 Pandas, parte 1 81
15.1 Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
15.1.2 Indexando Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
15.2 DataFrame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
15.2.2 Acessando DataFrames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
15.3 Filtrando DataFrames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
15.4 Métodos de Series (ou colunas) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
15.5 Iterando em DataFrames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
15.6 Aplicação de funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

16 Pandas, parte 2 90
16.1 Leitura e escrita de DataFrames . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
16.2 Plotagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
16.3 Outros métodos de manipulação . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

II Combinatória e Probabilidade 95

17 Permutações com e sem repetições; permutações circulares 96


17.1 Permutações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
17.2 Permutações circulares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
17.3 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

18 Combinações a argumentos combinatórios; combinações com repetição; contagem


Dupla 101
18.1 Combinações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
18.2 Combinações com repetições . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
18.3 Exercícios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

19 Princípio de Inclusão-Exclusão 105


19.1 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

20 Lemas de Kaplansky 109


20.1 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

21 Números Binomiais 112


21.1 Exercícios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

22 Princípio das Gavetas 116


22.1 Exercícios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

23 Espaços de Probabilidade 119


23.1 Exercícios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

24 Probabilidade Condicional 123


24.1 Exercícios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

iii
Conteúdo Conteúdo

25 Variáveis Aleatórias 127

26 Esperança 129
26.1 Exercícios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

27 Enunciado das Leis dos grandes números 132


27.1 Exercícios propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

28 Enunciado do Teorema Central do Limite 135


28.1 Exercícios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

III Funções Elementares e Matrizes 137

29 Noções de Lógica e Indução Finita 138


29.1 Proposição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
29.2 Negação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
29.3 Conectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
29.4 Condicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
29.5 Tautologias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
29.6 Proposições logicamente falsas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
29.7 Relação de implicação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
29.8 Relação de equivalência . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
29.9 Sentenças abertas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
29.10Quantificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
29.11Como negar proposições . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
29.12Princípio de Indução Finita . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
29.13Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

30 Conjuntos e Noções Básicas de Funções 150


30.1 Operações com conjuntos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
30.2 Descrição de um conjunto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
30.2.2 Conjuntos dos números . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
30.3 Descrição de intervalos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
30.4 Produto cartesiano (par ordenado) . . . . . . . . . . . . . . . . . . . . . . . . . . 155
30.5 Noções básicas de funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
30.6 Gráfico de uma função . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
30.7 Função injetora, sobrejetora e bijetora . . . . . . . . . . . . . . . . . . . . . . . . 159
30.8 Função composta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
30.9 Função inversa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
30.10Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

31 Funções Reais e Funções Elementares 166


31.1 Sinais de uma função . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
31.2 Zeros de uma função . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
31.3 Função crescente e função decrescente . . . . . . . . . . . . . . . . . . . . . . . . 169
31.4 Função constante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
31.5 Função afim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
31.6 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

32 Funções Quadráticas e Problemas de Otimização 175


32.1 Definições e Preliminares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175

iv
Conteúdo Conteúdo

32.2 A imagem da função quadrática . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177


32.2.4 Sinais de uma função quadrática . . . . . . . . . . . . . . . . . . . . . . . 178
32.3 Gráfico da função quadrática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
32.4 Problemas de Otimização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
32.5 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

33 Função Modular 186


33.1 Definições Básicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
33.2 A função modular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
33.3 Uma interpretação geométrica do módulo . . . . . . . . . . . . . . . . . . . . . . 189
33.4 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

34 Polinômios e Equações Polinomiais 194


34.1 Definições Básicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
34.1.4 Relação entre coeficientes e raízes de polinômios . . . . . . . . . . . . . . . 195
34.2 Divisão de polinômios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
34.2.1 Método da Chave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
34.2.5 Método de Briot-Ruffini . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
34.2.8 Multiplicidade de uma raiz . . . . . . . . . . . . . . . . . . . . . . . . . . 202
34.2.10 Raízes Racionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
34.3 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204

35 Função Exponenciais e Equações Exponenciais 205


35.1 Definições de Potenciação e Radiciação . . . . . . . . . . . . . . . . . . . . . . . . 205
35.2 Funções Exponenciais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
35.2.4 Equações Exponenciais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
35.3 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

36 Logaritmos 214
36.1 Definição de Logaritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
36.2 Propriedades dos Logaritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
36.3 Equações Logarítmicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
36.4 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218

37 Matrizes 219
37.1 Operações com matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
37.2 A relação de matrizes com sistemas lineares . . . . . . . . . . . . . . . . . . . . . 222
37.3 Método para encontrar A−1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
37.4 Classificação de sistemas lineares . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
37.5 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

38 Determinantes 231
38.1 Propriedades dos determinantes 2 × 2 . . . . . . . . . . . . . . . . . . . . . . . . 231
38.2 Determinante visto como área . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
38.3 Determinantes de ordens maiores . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
38.4 Propriedades dos determinantes n × n . . . . . . . . . . . . . . . . . . . . . . . . 239
38.4.5 Determinante de Vandermonde . . . . . . . . . . . . . . . . . . . . . . . . 244
38.5 Sistemas Lineares e Determinantes . . . . . . . . . . . . . . . . . . . . . . . . . . 245
38.6 Exercícios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250

v
I
Programação Estruturada

1
1 Primeiro programa
§1.1 Algoritmos
Um algoritmo é uma sequência de instruções bem definidas e ordenadas que levam à resolução
de um determinado problema. Pode-se dizer que um algoritmo é um conjunto de passos a se
seguir para resolver um problema específico.
Vamos dar alguns exemplos de algoritmos simples para ilustrar melhor:

Exemplo 1.1.1. Algoritmo para encontrar o maior número em uma lista:

1. Ler a lista de números.

2. Armazenar o primeiro número da lista.

3. Percorrer a lista, comparando cada número com o número armazenado.

4. Se o número atual for maior que armazenado, substituir o número armazenado pelo
número atual.

5. Ao chegar no final da lista o número armazenado será o maior da lista.

Exemplo 1.1.2. Algoritmo para fazer um bolo de cenoura com cobertura de chocolate:

1. Pré-aqueça o forno a 180°C.

2. Descasque e rale duas cenouras médias e reserve.

3. Em uma tigela grande, misture a farinha, o açúcar, o fermento em pó, o bicarbonato


de sódio, a canela e o sal.

4. Adicione os ovos, o óleo e a baunilha à mistura de farinha e misture bem até ficar
homogêneo.

5. Adicione as cenouras raladas à massa e misture novamente.

6. Despeje a massa em uma forma untada e enfarinhada.

7. Asse no forno pré-aquecido por 30 a 35 minutos, ou até que um palito inserido no


centro do bolo saia limpo.

8. Retire o bolo do forno e deixe esfriar por cerca de 10 minutos na forma.

9. Enquanto o bolo esfria, prepare a cobertura de chocolate: derreta o chocolate em


banho-maria ou no microondas, acrescente o creme de leite e misture até obter uma
mistura homogênea.

10. Desenforme o bolo e cubra com a cobertura de chocolate.

11. Sirva o bolo de cenoura com cobertura de chocolate decorado com nozes picadas ou
raspas de chocolate, se desejar.

Estes são apenas alguns exemplos de algoritmos simples. Algoritmos mais complexos podem

2
Primeiro programa 1.2. Linguagens de programação

ser construídos a partir de combinações de instruções simples. A chave para um bom algoritmo é
que ele deve ser preciso, eficiente e fácil de entender e implementar.

§1.2 Linguagens de programação


As linguagens de programação são utilizadas para escrever códigos que os computadores
conseguem entender e executar. São utilizadas para criar programas, aplicativos e sistemas.
Existem diversas linguagens de programação, cada uma com suas características e finalidades
específicas. Alguns exemplos de linguagens de programação são:

• Python: linguagem de programação interpretada, fácil de aprender e utilizada em diversas


áreas, desde ciência de dados até desenvolvimento web;

1 mensagem = "Olá, mundo!"


2 print(mensagem)

• Java: linguagem de programação orientada a objetos, utilizada no desenvolvimento de


aplicativos móveis, sistemas bancários, jogos, entre outros;

1 public class OlaMundo {


2 public static void main(String[] args) {
3 String mensagem = "Ola, mundo!";
4 System.out.println(mensagem);
5 }
6 }

• C: linguagem de programação de baixo nível, utilizada no desenvolvimento de sistemas


operacionais, compiladores, dispositivos embarcados, entre outros;

1 #include <stdio.h>
2
3 int main() {
4 printf("Ola, mundo!\n");
5 return 0;
6 }

• JavaScript: linguagem de programação interpretada, utilizada no desenvolvimento de


páginas web interativas e aplicativos móveis;

1 let mensagem = "Ola, mundo!";


2 console.log(mensagem);

• Ruby: linguagem de programação de alto nível, utilizada em desenvolvimento web, auto-


mação e testes;

1 mensagem = "Ola, mundo!"


2 puts mensagem

• PHP: linguagem de programação interpretada, utilizada no desenvolvimento de sites


dinâmicos e sistemas de gerenciamento de conteúdo.

3
Primeiro programa 1.3. Python + Colab/Jupyter

1 <?php
2 $mensagem = "Ola, mundo!";
3 echo $mensagem;
4 ?>

Cada linguagem de programação possui sua própria sintaxe, conjunto de regras e palavras-chave
que são utilizadas para escrever códigos. A escolha da linguagem de programação a ser utilizada
depende da finalidade do projeto e das habilidades e preferências do programador.

Classificação de linguagens de programação

Linguagens de programação podem ser clas- programação tipadas exigem que todas
sificadas de diversas maneiras: as variáveis tenham um tipo de dados
definido, enquanto as linguagens de pro-
• Nível de Abstração: as linguagens de
gramação não tipadas permitem que os
programação podem ser classificadas em
tipos de dados das variáveis sejam infe-
linguagens de baixo nível, que são mais
ridos pelo compilador ou interpretador.
próximas da linguagem de máquina, e
linguagens de alto nível, que são mais
próximas da linguagem humana. • Execução: as linguagens de programa-
ção podem ser classificadas como com-
• Paradigma de Programação: as lin-
piladas ou interpretadas. As linguagens
guagens de programação podem ser clas-
compiladas, como C, C++, Java e Swift,
sificadas com base no paradigma de pro-
são traduzidas para linguagem de má-
gramação que elas usam. Por exemplo,
quina antes da execução, enquanto as
as linguagens de programação orienta-
linguagens interpretadas, como Python,
das a objetos (OO) enfatizam a criação
Ruby e JavaScript, são traduzidas em
de objetos que encapsulam dados e com-
tempo de execução. Embora essa distin-
portamentos, enquanto as linguagens de
ção seja importante, muitas linguagens
programação funcional se concentram
modernas usam técnicas que combinam
em funções puras e imutabilidade.
as duas abordagens, como o Java, que
• Tipagem: as linguagens de programa- é uma linguagem compilada, mas usa a
ção podem ser classificadas como tipa- máquina virtual Java para interpretar
das ou não tipadas. As linguagens de o bytecode gerado pelo compilador.

Essas são apenas algumas das principais classificações de linguagens de programação. Cada
classificação tem seus próprios subgrupos, e muitas linguagens de programação se enquadram
em várias categorias.

§1.3 Python + Colab/Jupyter


Python é uma das linguagens de programação mais populares do mundo, e isso se deve em
grande parte à sua simplicidade, eficiência e versatilidade. Essas características tornam o Python
uma excelente escolha para iniciantes em programação, mas também o tornam uma opção
poderosa para profissionais experientes. Além disso, o Python tem uma grande comunidade ativa
de desenvolvedores, o que significa que existem muitos recursos disponíveis, como bibliotecas,
frameworks e módulos, que tornam a programação mais fácil e eficiente. Neste curso, utilizaremos
o Python como linguagem principal para ensinar os conceitos fundamentais de programação,
como tipos de dados, variáveis, expressões, condicionais e repetições. Além disso, o Python é
amplamente utilizado em áreas como ciência de dados, inteligência artificial e aprendizado de

4
Primeiro programa 1.4. Primeiro programa

máquina, o que significa que o conhecimento adquirido neste curso pode ser facilmente aplicado
em outros contextos.
Nesse curso, aprenderemos Python utilizando o Google Colab como ambiente de desenvol-
vimento. O Colab é um serviço do Google para criar e executar notebooks Jupyter, é uma
ferramenta permite criar e compartilhar documentos que contêm código, visualizações e texto
explicativo. Ele é fácil de usar e tem suporte para várias linguagens de programação, incluindo
Python. Uma das principais vantagens do Jupyter é a sua flexibilidade, pois permite que o aluno
execute o código em blocos, o que facilita o aprendizado e o entendimento de cada etapa do
processo de programação. Além disso, o Jupyter é gratuito e pode ser acessado online ou instalado
localmente. No entanto, caso prefira, o aluno pode instalar suas próprias ferramentas necessárias,
como um compilador e um editor de texto, para desenvolver seus códigos.

Figura 1.1: Código Python com descrição textual e visualização de dados rodando em um notebook
Jupyter.

Além de permitir a execução de códigos, os notebooks Jupyter também permitem a visualização


de dados na forma de imagens, planilhas (datasets) e plotagens. Isso é especialmente útil para o
aprendizado de análise de dados e criação de visualizações, pois o aluno pode explorar e entender
melhor os dados utilizados em cada etapa do processo. Com isso, o Jupyter se torna uma
ferramenta essencial para o desenvolvimento de projetos e trabalhos relacionados à programação
e análise de dados.

§1.4 Primeiro programa


Para escrever seu primeiro programa em Python, você pode utilizar o Jupyter Notebook, que já
está disponível para você:

1. Abra o Jupyter Notebook.


2. Crie um novo notebook.

5
Primeiro programa 1.4. Primeiro programa

3. Na primeira célula, escreva o seguinte código:

print("Olá, mundo!")

4. Rode a célula utilizando o atalho Shift + Enter.

5. Pronto! O seu primeiro programa em Python foi executado com sucesso.

Esse programa é muito simples, mas já é um bom começo para quem está iniciando na
programação. Ele utiliza a função print para exibir a mensagem "Ola, mundo!"na tela. Essa
é uma tradição entre os programadores e serve para testar se o ambiente de programação está
configurado corretamente.

6
2 Fundamentos de programação
Os fundamentos da programação são essenciais para aqueles que estão iniciando seus estudos
em desenvolvimento de software. Para criar programas em qualquer linguagem de programação, é
necessário compreender conceitos básicos, como variáveis, constantes, tipos de dados, operadores
aritméticos e de atribuição, entrada de dados e conversão de tipos. Esses conceitos são cruciais para
a compreensão da lógica da programação. Com o conhecimento desses fundamentos, é possível
avançar em estudos mais avançados em programação e desenvolver soluções mais complexas e
sofisticadas.

§2.1 Variáveis
Variáveis são utilizadas para armazenar valores na memória do computador. As variáveis possuem
um nome que serve para identificá-las, e um valor que pode ser alterado ao longo da execução do
programa. O valor armazenado na variável pode ser de diferentes tipos, como números, texto,
listas, entre outros. As variáveis são essenciais para a construção de algoritmos e programas,
pois permitem que os valores sejam armazenados e manipulados de maneira dinâmica durante a
execução do programa. Para declarar uma variável em Python, basta escolher um nome para ela
e atribuir um valor, utilizando o sinal de igual =. Por exemplo:

1 idade = 30
2 nome = "João"

Dessa forma, a variável idade armazena o valor 30, e a variável nome armazena a string
(sequência de caracteres) Joao.

Nomes válidos para variáveis

Em Python, os nomes de variáveis devem Nomes válidos:


seguir algumas regras para serem válidos. Eles
podem consistir em letras (maiúsculas e mi- • idade
núsculas), dígitos e sublinhados e devem co-
• _nome_completo
meçar com uma letra ou sublinhado. É im-
portante lembrar que nomes de variáveis são • total_de_vendas
sensíveis a maiúsculas e minúsculas, ou seja,
variavel e Variavel são considerados no- • primeiraNota
mes de variáveis diferentes. Além disso, exis-
tem algumas palavras reservadas em Python Nomes inválidos:
que não podem ser usadas como nomes de
variáveis, como if, while, for, and, entre • 2a
outros. É uma boa prática usar nomes de va- • saldo da conta
riáveis descritivos e significativos para tornar
o código mais legível e fácil de entender. • @usuario

• nome-completo

§2.1.1 Tipos de dados


Em Python, os tipos de dados são dinâmicos, o que significa que o interpretador infere o tipo da
variável a partir do valor atribuído a ela. Dessa forma, não é necessário declarar explicitamente o

7
Fundamentos de programação 2.1. Variáveis

tipo das variáveis, como em outras linguagens de programação.


Os tipos de dados disponíveis em Python incluem:
• int: Números inteiros, como 42.
• float: Números de ponto flutuante, como 3.14.
• bool: Valores booleanos, True ou False.
• str: Sequências de caracteres, como "Hello, world!".
• list: Listas, como [1, 2, 3].
• tuple: Tuplas, como (1, 2, 3).
• set: Conjuntos, como {1, 2, 3}.
• dict: Dicionários, como {"fruta": "maçã", "cor": "vermelha"}.

Exemplo 2.1.2. Variáveis de diferentes tipos:

1 # Exemplos de variáveis em Python


2
3 x = 42 # x é um inteiro
4 y = 3.14 # y é um número de ponto flutuante
5 z = True # z é um booleano
6 s = "Olá, mundo!" # s é uma string
7 lista = [1, 2, 3, 4] # lista é uma lista de inteiros
8 tupla = ("a", "b", "c") # tupla é uma tupla de strings
9 conjunto = {1, 2, 3, 4, 5} # conjunto é um conjunto de inteiros
10 dicionario = {"nome": "João", "idade": 30, "cidade": "São Paulo"}
# dicionário é um dicionário de strings e inteiro

Como mencionado, o tipo de cada variável é inferido pelo interpretador do Python automatica-
mente. Isso significa que o programador não precisa declarar explicitamente o tipo da variável,
tornando o processo de programação mais simples e eficiente. Além disso, essa característica
permite que as variáveis sejam reatribuídas a um valor de um tipo diferente sem precisar alterar
a declaração da variável.

Estruturas homogêneas e heterogêneas


As estruturas de dados list, tuple, set e dict em Python podem armazenar objetos de
qualquer tipo, incluindo outros objetos compostos como listas, tuplas e dicionários. Essas
estruturas de dados podem ser heterogêneas, ou seja, podem armazenar diferentes tipos de
objetos, ou homogêneas, ou seja, podem armazenar objetos de apenas um tipo.
Por exemplo, uma lista em Python pode conter uma combinação de tipos de objetos,
como inteiros, strings e outros tipos compostos:

minha_lista = [1, "dois", 3.0, [4, 5, 6]]

Já uma tupla em Python pode conter uma combinação de tipos de objetos ou objetos de
um único tipo:

minha_tupla = (1, "dois", 3.0, [4, 5, 6])

8
Fundamentos de programação 2.2. Operadores aritméticos

Um conjunto (set) em Python só pode conter objetos imutáveis de tipos únicos, como
inteiros ou strings:

meu_set = {1, 2, 3, 4, 5}

Um dicionário em Python armazena pares de chave-valor, onde as chaves podem ser de


qualquer tipo imutável, como inteiros, strings ou tuplas, e os valores podem ser qualquer
tipo de objeto:

meu_dict = {'chave1': 100, 'chave2': "valor2", 3: [1, 2, 3]}

A capacidade de armazenar objetos de diferentes tipos em uma única estrutura de dados


é uma das características poderosas de Python, permitindo que os programadores criem
estruturas de dados flexíveis e expressivas.

§2.1.3 Constantes
Em Python, não existe uma declaração explícita de constantes como em outras linguagens de
programação, mas é possível definir valores constantes através do uso de variáveis nomeadas
em maiúsculas. Por convenção, esses nomes são escritos em letras maiúsculas, e não devem ser
modificados durante a execução do programa. O uso de constantes ajuda a tornar o código mais
legível, e ajuda a evitar erros causados por mudanças inesperadas nos valores dessas variáveis.
Por exemplo, podemos definir uma constante para o valor de pi da seguinte forma:

PI = 3.14159

Dessa forma, se algum trecho do código precisar utilizar o valor de pi, podemos utilizar a
variável PI em vez de escrever o valor literal diretamente no código, o que torna o código mais
legível e fácil de manter.

§2.2 Operadores aritméticos


Os operadores aritméticos permitem realizar operações matemáticas simples. Em Python são
eles:
• Adição +: soma dois valores;
• Subtração -: subtrai o segundo valor do primeiro;
• Multiplicação *: multiplica dois valores;
• Divisão /: divide o primeiro valor pelo segundo;
• Divisão inteira //: divide o primeiro valor pelo segundo e retorna apenas a parte inteira do
resultado, desprezando os caracteres após a virgula;
• Resto da divisão %: retorna o resto da divisão do primeiro valor pelo segundo;
• Exponenciação **: eleva o primeiro valor à potência do segundo.

Exemplo 2.2.1. Utilizando operadores aritméticos em Python:

1 # Declaração de variáveis
2 a = 10
3 b = 3

9
Fundamentos de programação 2.2. Operadores aritméticos

4
5 # Operações aritméticas
6 soma = a + b
7 subtracao = a - b
8 multiplicacao = a * b
9 divisao = a / b
10 divisao_inteira = a // b
11 resto_divisao = a % b
12 exponenciacao = a ** b
13
14 # Impressão dos resultados
15 print("Soma:", soma) # Soma: 13
16 print("Subtração:", subtracao) # Subtração: 7
17 print("Multiplicação:", multiplicacao) # Multiplicação: 30
18 print("Divisão:", divisao) # Divisão: 3.3333333333333335
19 print("Divisão inteira:", divisao_inteira) # Divisão inteira: 3
20 print("Resto da divisão:", resto_divisao) # Resto da divisão: 1
21 print("Exponenciação:", exponenciacao) # Exponenciação: 1000

Este código declara as variáveis a e b com os valores 10 e 3, respectivamente. Em seguida,


realiza as operações aritméticas entre elas e armazena os resultados em variáveis distintas.
Por fim, imprime os resultados das operações na tela.

Operações matemáticas avançadas


Além das operações aritméticas básicas é possível realizar cálculos matemáticos mais
complexos utilizando bibliotecas como a math e o numpy. A biblioteca math contém
funções matemáticas padrão, como exponenciação, logaritmo, seno e cosseno, entre outras. O
numpy é uma poderosa ferramenta para trabalhar com matrizes e vetores, e também possui
funções para as principais operações matemáticas, sendo muito utilizada em áreas como
a análise de dados e a inteligência artificial. Com o numpy, é possível realizar operações
aritméticas com matrizes, calcular estatísticas, realizar operações de álgebra linear, entre
outras funcionalidades. Veja um exemplo simples de utilização do numpy:

1 import numpy as np
2
3 a = np.array([1, 2, 3])
4 b = np.array([4, 5, 6])
5
6 c = a + b
7
8 print(c)

Na primeira linha do código, a biblioteca NumPy é importada a renomeia como np. Em


seguida, as variáveis a e b são criadas como arrays do numpy com os valores [1, 2, 3]
e [4, 5, 6], respectivamente. A variável c é criada como a soma de a e b. Por fim, o
resultado é impresso no console usando a função print(), que exibe o valor de c. A saída
do programa seria um novo array contendo os elementos [5, 7, 9], que são o resultado
da soma dos elementos correspondentes de a e b. O exemplo ilustra o uso básico do numpy
para realizar operações matemáticas com arrays. Mais funções e recursos da biblioteca serão
explorados posteriormente.

10
Fundamentos de programação 2.3. Operadores de atribuição

§2.2.2 Operadores aplicados em strings


Em Python, é possível utilizar operadores aritméticos em strings para realizar operações como
concatenação e repetição. O operador de concatenação é o símbolo de adição +, que permite
juntar duas ou mais strings em uma só. Já o operador de repetição é o asterisco *, que possibilita
repetir uma string múltiplas vezes:

Exemplo 2.2.3. Operadores concatenação + e repetição *:

1 # Define duas strings


2 s1 = "Olá"
3 s2 = "Mundo"
4
5 # Concatena as duas strings utilizando o operador de soma
6 s3 = s1 + s2
7 print(s3) # Saída esperada: "OláMundo"
8
9 # Repete a string 's1' três vezes utilizando o operador de
multiplicação
10 s4 = s1 * 3
11 print(s4) # Saída esperada: "OláOláOlá"

Estes operadores também podem ser utilizados em algumas situações com outros tipos de
variáveis como listas, tais usos serão abordados posteriormente.

§2.3 Operadores de atribuição


Os operadores de atribuição em Python são utilizados para armazenar um valor em uma variável.
O operador de atribuição mais simples, que já foi visto, é o sinal de igual =, que é utilizado
para atribuir um valor a uma variável. Além do operador de atribuição padrão, Python também
oferece operadores compostos de atribuição que permitem que a variável receba um valor e faça
uma operação aritmética ao mesmo tempo. Por exemplo, o operador += atribui à variável o valor
da soma dela com outro valor. Outros operadores compostos incluem -=, *=, /=, //= e %=.

Exemplo 2.3.1. Uso de operadores de atribuição:

1 x = 5 # atribui o valor 5 à variável x


2 y = 2
3 x += y # equivale a x = x + y; o valor de x passa a ser 7
4 y *= 3 # equivale a y = y * 3; o valor de y passa a ser 6
5 z = 10
6 z %= 3 # equivale a z = z % 3; o valor de z passa a ser 1

Observe que os operadores compostos de atribuição utilizados foram +=, *= e %=, que sim-
plificam a escrita de expressões como x = x + y ou y = y * 3. O uso desses operadores
simplifica o uso e pode tornar o código mais legível e conciso.

11
Fundamentos de programação 2.4. Conversão de tipos

§2.4 Conversão de tipos


A conversão de tipos é o processo de transformar um valor de um tipo de dado em outro tipo de
dado. Em Python, é possível converter os tipos de dados básicos, como int, float e str, usando
funções de conversão incorporadas, como int(), float() e str(). A conversão de tipos é
útil quando precisamos trabalhar com diferentes tipos de dados em uma operação ou quando
precisamos apresentar os dados em um formato específico. Por exemplo, se tivermos uma variável
que armazena um valor numérico como uma string, podemos convertê-la em um valor inteiro
usando a função int() para realizar cálculos matemáticos com ela.

Exemplo 2.4.1. Conversão de tipos:

1 # Define duas variáveis iniciais de tipos diferentes


2 a = 2
3 b = "3"
4
5 # Imprime os tipos das variáveis iniciais
6 print("a é do tipo", type(a))
7 print("b é do tipo", type(b))
8
9 # Converte a variável 'b' de string para inteiro e soma com a
variável 'a'
10 c = a + int(b)
11
12 # Imprime o resultado da soma
13 print("O resultado da soma é", c)
14
15 # Converte a variável 'a' de inteiro para float e divide por 'c'
16 d = float(a) / c
17
18 # Imprime o resultado da divisão
19 print("O resultado da divisão é", d)

Neste código, primeiro definimos duas variáveis, a e b, com tipos diferentes: a é um inteiro,
e b é uma string contendo o número 3. Em seguida, convertemos a variável b de string para
inteiro usando a função int(), e a adicionamos à variável a, que continua sendo um inteiro.
Depois disso, convertemos a variável a de inteiro para float usando a função float(), e a
dividimos pelo resultado anterior, armazenado em c. Por fim, imprimimos os resultados das
operações e os tipos das variáveis usadas em cada etapa.

§2.5 Entrada de dados


A entrada de dados é uma tarefa comum na programação, pois é preciso receber informações do
usuário para executar operações. Em Python, podemos utilizar a função input() para obter
entrada de dados do usuário por meio do teclado. O resultado da função input() é sempre uma
string.
Por exemplo, suponha que queremos pedir ao usuário para inserir seu nome e, em seguida,
exibir uma mensagem de boas-vindas. Podemos fazer isso da seguinte maneira:

12
Fundamentos de programação 2.6. Formatação de strings

Exemplo 2.5.1. Entrada simples:

1 # Pede que o usuário digite um valor para a variável "nome"


2 nome = input("Digite seu nome: ")
3
4 # Imprime uma mensagem na tela utilizando a variável "nome"
5 print("Bem-vindo,", nome)

Nesse exemplo, a função input() é utilizada para solicitar que o usuário digite um valor
para a variável nome. Em seguida, a mensagem "Bem vindo, "e a variável nome são passadas
para a função print().

É importante lembrar que o valor retornado pela função input() é sempre uma string. Se
quisermos realizar operações aritméticas ou comparar valores numéricos, devemos converter a
entrada do usuário em um tipo numérico apropriado usando as funções int() ou float(), por
exemplo.

Exemplo 2.5.2. Operações com resultados de entradas:

1 # Pede que o usuario digite um valor para a variavel "idade"


2 idade = int(input("Digite sua idade: "))
3
4 # Calcula o ano em que o usuario fara 100 anos
5 ano = 2023 + (100 - idade)
6
7 # Imprime uma mensagem na tela utilizando a variavel "ano"
8 print("Voce fara 100 anos em " + str(ano))

Nesse exemplo, a função input() é utilizada para solicitar que o usuário digite um
valor para a variável idade. Como esse valor será utilizado em operações matemáticas, é
necessário converter o tipo de dado para inteiro utilizando a função int(). Em seguida, o
ano em que o usuário fará 100 anos é calculado com base na idade fornecida e armazenado
na variável ano. Por fim, a mensagem "Você fará 100 anos em "concatenada com o valor de
ano convertido para string com a função str() é impressa na tela com a função print().

§2.6 Formatação de strings


Em Python, a formatação de strings é uma técnica que permite inserir valores de variáveis em
uma string de forma dinâmica. Existem duas maneiras comuns de formatar strings em Python:
usando o método format() e usando as f-strings (ou formatted string literals).
Usando o método format(), podemos inserir valores de variáveis em uma string, indicando
onde queremos que eles apareçam usando chaves {}. Por exemplo:

Exemplo 2.6.1. Formatação de strings com o método format()

1 # Pergunta ao usuario seu nome e idade


2 nome = input("Digite seu nome: ")
3 idade = int(input("Digite sua idade: "))
4

13
Fundamentos de programação 2.6. Formatação de strings

5 # Imprime uma string formtatada utilizando o metodo format() com


o nome e idade informados
6 print("Ola, meu nome e {} e eu tenho {} anos.".format(nome,
idade))

Este código retorna a string com o valor da variável nome inserido na posição do primeiro
{} e o valor da variável idade inserido na posição do segundo {}.

Outra maneira mais recente e mais simples de formatar strings em Python é usando f-strings. F-
strings permitem que as variáveis sejam inseridas diretamente na string, precedidas pelo caractere
f:

Exemplo 2.6.2. Formatação de strings com uma f-string:

1 # Pergunta ao usuário seu nome e idade


2 nome = input("Digite seu nome: ")
3 idade = int(input("Digite sua idade: "))
4
5 # Imprime uma string formatada utilizando uma f-string com o nome
e idade informados
6 print(f"Olá, meu nome é {nome} e eu tenho {idade} anos.")

O resultado seria o mesmo que no exemplo anterior.

Usando tanto o método format() quanto as f-strings, podemos formatar strings de diversas
maneiras, incluindo especificar o tipo de dado, a precisão de números decimais e outras opções de
formatação. Para especificar o tipo de dado, pode-se utilizar dentro do {} os códigos de tipo d
para inteiro, f para ponto flutuante e s para string. Já para especificar a precisão de um número
de ponto flutuante, pode-se utilizar a sintaxe :.Nf, onde N é o número de casas decimais desejado.

Exemplo 2.6.3. Formatando um ponto flutuante com 3 casas decimais:

1 num = 3.141592
2 # Formatando com o format():
3 print("O valor de pi é aproximadamente {:.3f}".format(num))
4 # Ou com f-string:
5 print(f"O valor de pi é aproximadamente {num:.3f}")

A saída desse código seria:


O valor de pi é aproximadamente 3.142
Note que a sintaxe :.3f foi utilizada para especificar a precisão do número de ponto flutuante.

14
3 Estruturas condicionais
Estruturas condicionais são utilizadas na programação para criar lógicas que permitem a
execução de diferentes blocos de código dependendo de certas condições. Elas são fundamentais
para a tomada de decisões em um programa, permitindo que o software possa escolher entre
diferentes caminhos a serem seguidos, de acordo com as entradas e variáveis que ele recebe.
As estruturas condicionais são amplamente utilizadas em todas as linguagens de programação,
e o conhecimento de como utilizá-las é fundamental para a escrita de programas funcionais e
eficientes. Em geral, as estruturas condicionais são compostas por uma ou mais condições, que
são testadas por meio de operadores relacionais e lógicos, e por um ou mais blocos de código a
serem executados em caso de sucesso ou falha da condição testada.

§3.1 Operadores relacionais e lógicos


Os operadores relacionais em Python são utilizados para comparar dois valores e retornar um
valor booleano, que pode ser True ou False. Os operadores relacionais são:

• == (igual a)

• != (diferente de)

• < (menor que)

• <= (menor ou igual a)

• > (maior que)

• >= (maior ou igual a)

Já os operadores lógicos são utilizados para combinar valores booleanos e retornar um novo
valor booleano. Os operadores lógicos em Python são:

• and (e lógico)

• or (ou lógico)

• not (negação lógica)

O operador and retorna True se ambos os valores comparados forem True, e False caso
contrário. Já o operador or retorna True se pelo menos um dos valores comparados for True, e
False caso contrário. O operador not inverte o valor booleano de um operando.

Exemplo 3.1.1. Se queremos verificar se uma pessoa é maior de idade e tem carteira de
motorista, podemos escrever:

idade >= 18 and possui_cnh == True

Isso retornará True se a pessoa atender a ambas as condições, e False caso contrário.
Também podemos usar parênteses para controlar a ordem das operações. Por exemplo:

15
Estruturas condicionais 3.2. Tabela verdade

(idade >= 18 and possui_cnh == True) or (idade >= 21 and


possui_carro == True)

Isso retornará True se a pessoa tiver mais de 18 anos e CNH, ou mais de 21 anos e carro,
e False caso contrário.

Os operadores relacionais e lógicos são utilizados para criar expressões booleanas e condições
em estruturas de decisão e repetição.

Operadores binários
Além dos operadores relacionais e lógicos, existem também os operadores binários em
Python. Esses operadores são utilizados para realizar operações entre bits. Os principais
operadores binários em Python são:

• & (AND): Retorna o resultado da operação "E"bit a bit (bitwise) entre dois operandos.

• | (OR): Retorna o resultado da operação "OU"bit a bit (bitwise) entre dois operandos.

• ^ (XOR): Retorna o resultado da operação "OU Exclusivo"bit a bit (bitwise) entre


dois operandos.

• ~ (NOT): Retorna o resultado da operação de negação bit a bit (bitwise) do operando.

• >> (Right Shift): Desloca os bits do operando para a direita em uma quantidade
especificada.

• << (Left Shift): Desloca os bits do operando para a esquerda em uma quantidade
especificada.

Os operadores &, |, ^ e ~ também podem ser aplicados em arrays booleanas do NumPy,


permitindo a realização de operações element-wise entre esses arrays. Por exemplo, podemos
utilizar o operador & para comparar dois arrays booleanos e retornar um terceiro array com
o resultado da operação AND elemento a elemento.

§3.2 Tabela verdade


A tabela verdade é usada para determinar a lógica de um circuito ou expressão lógica.

Exemplo 3.2.1. A tabela verdade para o operador lógico and é a seguinte:

A B A and B
True True True
False True False
True False False
False False False

Tabela 3.1: Tabela verdade do operador "E"(AND)

Nessa tabela, A e B são os valores de entrada do operador lógico and, e A and B é o


resultado da operação. Os valores True e False representam, respectivamente, verdadeiro
e falso.

A tabela no exemplo mostra que, quando ambos A e B são verdadeiros, o resultado da operação

16
Estruturas condicionais 3.2. Tabela verdade

and é verdadeiro. Em todas as outras combinações, o resultado é falso. Essa informação pode
ser usada para construir expressões lógicas mais complexas.

Exemplo 3.2.2. Vamos ver a tabela verdade da expressão na sessão anterior:

(idade >= 18 and possui_cnh) or (idade >= 21 and possui_carro)

idade possui_cnh possui_carro Resultado


<18 False False False
<18 False True False
<18 True False False
<18 True True False
>=18 and <21 False False False
>=18 and <21 False True False
>=18 and <21 True False True
>=18 and <21 True True True
>=21 False False False
>=21 False True True
>=21 True False True
>=21 True True True

Tabela 3.2: Tabela da Verdade da expressão.

§3.2.3 Estrutura IF/ELSE


A estrutura if/else é uma das mais importantes na programação, pois permite ao programador
controlar o fluxo de execução do código, realizando ações diferentes de acordo com uma condição
específica. Isso permite que o programa possa tomar decisões, como realizar uma ação ou não,
imprimir uma mensagem de erro ou de sucesso, entre outras possibilidades. A estrutura if/else é
essencial para que o programa possa se adaptar a diferentes situações, tornando-o mais dinâmico
e flexível. Sem essa estrutura, o programa seria limitado a realizar sempre as mesmas ações, sem
poder responder a condições específicas.
Em Python a sintaxe básica é:

1 if condição:
2 # faça algo se a condição for verdadeira
3 else:
4 # faça algo se a condição for falsa

Exemplo 3.2.4. Programa que verifica se um número é par ou ímpar e imprime na tela
uma mensagem correspondente:

1 numero = 10
2
3 if numero % 2 == 0:
4 print("O numero e par")
5 else:
6 print("O numero e impar")

17
Estruturas condicionais 3.2. Tabela verdade

Indentação de código
Indentação é um conceito fundamental em programação, que consiste na organização do
código por meio de espaços em branco. A indentação é importante porque torna o código
mais legível e facilita a compreensão da estrutura do programa.
No Python, a indentação é obrigatória para indicar a estrutura do código, em vez de
utilizar chaves ou outras formas de delimitadores de blocos. Isso significa que a indentação é
usada para definir a estrutura de condicionais, loops, funções e classes.
A indentação pode ser realizada por meio de espaços ou de tabulações (tecla tab do teclado)
para indicar níveis de hierarquia no código. No entanto, a escolha de um padrão específico
pode variar de acordo com a preferência pessoal ou com as diretrizes de codificação de uma
equipe ou organização.
No Python a PEP 8 é a guia de estilo de código mais utilizada e ela recomenda o uso de 4
espaços para cada nível de indentação, em vez de tabulações. Isso se deve ao fato de que
a tabulação pode variar de tamanho dependendo das configurações de cada editor, o que
pode levar a inconsistências no código e dificultar a leitura e a manutenção do mesmo. O
uso de espaços ao invés de tabulações garante que a indentação seja exibida corretamente
em diferentes plataformas e editores de texto.

Quando existe mais de uma condição a ser verificada podemos utilizar o comando elif (else
if ) formando a estrutura if/elif/else. A sintaxe básica é a seguinte:

1 if condição1:
2 # faça algo se a condição 1 for verdadeira
3 elif condição2:
4 # faça algo se a condição 1 for falsa e a condição 2 for
verdadeira
5 else:
6 # faça algo se todas as condições anteriores forem falsas

Exemplo 3.2.5. Programa que verifica se um número é positivo, negativo ou zero e imprime
na tela uma mensagem correspondente:

1 numero = -5
2
3 if numero > 0:
4 print("O número é positivo")
5 elif numero < 0:
6 print("O número é negativo")
7 else:
8 print("O número é zero")

No exemplo acima, a primeira condição verifica se o número é maior que zero. Se a condição
for verdadeira, o programa imprime na tela a mensagem "O número é positivo". Caso contrário,
o programa passa para a próxima condição, que verifica se o número é menor que zero. Se essa
condição for verdadeira, o programa imprime na tela a mensagem "O número é negativo". Caso
contrário, ou seja, se todas as condições anteriores forem falsas, o programa imprime na tela a
mensagem "O número é zero".

18
Estruturas condicionais 3.2. Tabela verdade

Exemplo 3.2.6. O comando elif pode ser reutilizado quantas vezes necessário para cobrir
todas as condições que se deseja avaliar:

1 nota = float(input("Digite a nota do aluno: "))


2
3 if nota >= 9:
4 print("A")
5 elif nota >= 8:
6 print("B")
7 elif nota >= 7:
8 print("C")
9 elif nota >= 6:
10 print("D")
11 else:
12 print("F")

Nesse exemplo, a estrutura elif é usada várias vezes para verificar a nota do aluno e
atribuir uma letra correspondente. O uso do elif permite que a verificação seja feita em
etapas, sem precisar repetir várias vezes a mesma condição. Além disso, é possível adicionar
quantos elif forem necessários para cobrir todas as faixas de notas desejadas.
Isso permite que o código seja mais conciso e organizado, evitando a necessidade de aninhar
vários blocos if dentro de outros, por exemplo. Além disso, o uso do elif torna o código
mais fácil de ser lido e entendido por outros programadores, uma vez que a lógica do código
fica mais clara e objetiva.

Estrutura match/case
Em situações onde uma grande quantidade de condições precisam ser avaliadas várias
linguagens de programação possuem a estrutura switch/case que permite avaliar múltiplas
condições em um único bloco de código. Até a versão 3.9 do Python, não havia uma estrutura
switch/case nativa na linguagem. Em vez disso, a recomendação era usar uma sequência de
if/elif/else para avaliar várias condições. No entanto, essa abordagem pode tornar o código
menos legível e mais complexo à medida que o número de condições aumenta.
Com a versão 3.10 do Python, foi introduzida uma nova estrutura chamada match/case.
Ela funciona de maneira semelhante ao switch/case em outras linguagens de programação,
permitindo avaliar várias condições em um único bloco de código. A sintaxe básica é a
seguinte:

1 match variavel:
2 case valor_1:
3 # código a ser executado se a variável for igual a valor_1
4 case valor_2:
5 # código a ser executado se a variável for igual a valor_2
6 ...
7 case valor_n:
8 # código a ser executado se a variável for igual a valor_n
9 case _:
10 # código a ser executado se a variável não corresponder a
nenhum dos valores anteriores

19
4 Estruturas de repetição
As estruturas de repetição, também conhecidas como laços ou loops, são fundamentais na
programação, permitindo que um conjunto de instruções seja executado repetidamente até que
uma condição seja atendida.
Em outras palavras, elas permitem automatizar tarefas que seriam muito trabalhosas, demoradas
ou em muitas situações até impossíveis de serem feitas manualmente. Com as estruturas
de repetição, podemos executar o mesmo bloco de código várias vezes sem precisar repeti-lo
manualmente.
Existem duas formas de estruturas de repetição: o laço while e o laço for. Cada uma dessas
estruturas tem suas próprias peculiaridades e é adequada para diferentes tipos de tarefas. É
importante saber como e quando usar cada um deles para escrever um código eficiente e elegante.

§4.1 Laço while


O laço while é uma estrutura de repetição em Python que permite executar um bloco de código
enquanto uma determinada condição é verdadeira. O bloco de código dentro do laço é repetido
continuamente até que a condição se torne falsa.
A sintaxe básica do laço while é:

1 while condicao:
2 # bloco de codigo a ser executado enquanto a condição for
verdadeira

O laço while é muito útil quando não se sabe quantas vezes o bloco de código precisará ser
executado, pois ele executa até que a condição definida seja atingida. Ele também pode ser
utilizado para criar um loop infinito, caso a condição nunca seja falsa.

Exemplo 4.1.1. Imprimir os números de 1 a 5.

1 # Define a variável x como 1


2 x = 1
3
4 # Enquanto x for menor ou igual a 5, repita o bloco de código
abaixo
5 while x <= 5:
6 # Imprime o valor atual de x
7 print(x)
8 # Incrementa o valor de x em 1
9 x += 1

Nesse exemplo, o laço while é utilizado para imprimir os números de 1 a 5. A condição


definida é que o valor de x seja menor ou igual a 5. O bloco de código é repetido enquanto a
condição for verdadeira, incrementando o valor de x em cada iteração.

20
Estruturas de repetição 4.2. Laço for

Exemplo 4.1.2. Autenticação de usuário

1 # Solicita ao usuário a digitação da senha


2 senha = input("Digite a senha: ")
3
4 # Enquanto a senha digitada não for igual a "12345", o loop será
executado
5 while senha != "12345":
6 senha = input("Senha incorreta. Digite novamente: ")
7
8 # Se a senha digitada for igual a "12345", a mensagem "Senha
correta. Acesso liberado!" será exibida
9 print("Senha correta. Acesso liberado!")

Nesse exemplo, o laço while é utilizado para solicitar uma senha ao usuário. Enquanto
a senha digitada for diferente de "12345", o bloco de código dentro do laço será executado
novamente, solicitando que o usuário digite a senha novamente. Quando a senha correta for
digitada, o laço é encerrado e a mensagem de "acesso liberado"é exibida.

§4.2 Laço for


O laço for é uma estrutura de repetição que permite iterar sobre um objeto iterável, como uma
lista, tupla, dicionário, conjunto ou string, executando o bloco de código para cada elemento.
Sua sintaxe básica é:

1 for elemento in iteravel:


2 # código a ser executado

Onde elemento é uma variável que assume um valor a cada iteração e iterável é o objeto
que está sendo iterado.
O laço for é muito útil em situações em que precisamos executar um bloco de código para cada
elemento de uma sequência, como por exemplo:

• Percorrer uma lista e realizar uma operação em cada elemento;

• Iterar sobre as chaves ou valores de um dicionário;

• Gerar uma sequência numérica com a função range().

21
Estruturas de repetição 4.2. Laço for

Exemplo 4.2.1. Percorre uma lista de números armazenando os números pares:

1 # Define uma lista com os números de 1 a 10


2 numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
3 # Define uma lista vazia para armazenar os números pares
4 numeros_pares = []
5
6 # Itera em todos os valores da lista
7 for n in numeros:
8 # Se o número for par, adiciona a numeros_pares
9 if (n % 2) == 0:
10 numeros_pares.append(n)
11
12 # Imprime o resultado
13 print("Os números pares na lista são: ", numeros_pares)

§4.2.2 Função range


Em outras linguagens de programação, como C e Java, o laço for é geralmente utilizado com base
em um contador. Ou seja, é necessário especificar um valor inicial, uma condição de parada e um
incremento do contador em cada iteração. Já em Python, o laço for é utilizado principalmente
para percorrer elementos de um objeto iterável, como listas, tuplas e dicionários. Nesse caso, não
é necessário especificar um contador ou a condição de parada, já que o próprio Python realiza
o controle das iterações. Além disso, o laço for do Python é capaz de percorrer elementos de
forma mais simples e elegante, tornando o código mais legível e fácil de entender.
Para comportamentos semelhantes ao for em outras linguagens de programação, o Python
usa a função range(), que cria uma sequência de números que pode ser iterada no laço for. É
importante notar que o range não inclui o último número especificado em sua sequência.
A sintaxe básica da função range é a seguinte:

range(inicio, fim, incremento)

• O parâmetro inicio é o valor inicial da sequência.


• O parâmetro fim é o valor final da sequência (não incluso).
• O parâmetro incremento é o valor que será somado a cada iteração.

Os parâmetros inicio e incremento são opcionais, o inicio por padrão tem o valor 0 e
o incremento por padrão é definido como 1.
Por exemplo, a chamada range(5) retorna a sequência [0, 1, 2, 3, 4], e a chamada
range(1, 10, 2) retorna a sequência [1, 3, 5, 7, 9].
No contexto de um loop for, a função range é comumente utilizada para definir a quantidade
de iterações do loop. Por exemplo:

Exemplo 4.2.3. Imprime os números de 1 a 5:

1 # Imprime os números de 1 a 5
2 for i in range(1, 6):
3 print(i)

22
Estruturas de repetição 4.2. Laço for

Nesse exemplo, o loop executa 5 iterações, e em cada iteração a variável i recebe o valor
da sequência gerada pela função range.
Note que para a sequência ir até o número 5 precisamos passar 6 como fim já que o valor
dele não é incluído na sequência.

§4.2.4 Função enumerate


A função enumerate é utilizada para iterar sobre uma sequência (por exemplo, uma lista ou
uma tupla) juntamente com um contador, que é incrementado a cada iteração. A função retorna
um objeto do tipo enumerate, que pode ser convertido para uma lista de tuplas contendo o
índice e o valor de cada item da sequência.
A sintaxe da função é a seguinte:

enumerate(iterable, start=0)

• O parâmetro iterable é a sequência que se deseja iterar.

• O parâmetro start é opcional e indica o valor inicial do contador. O seu valor padrão é 0.

Exemplo 4.2.5. Usando a função enumerate:

1 # Cria uma lista com quatro nomes


2 nomes = ['Ana', 'Carlos', 'João', 'Maria']
3 # Loop for que percorre a lista de nomes utilizando a função
enumerate para obter o índice e o valor de cada elemento
4 for i, nome in enumerate(nomes):
5 # Imprime uma mensagem com o índice e o nome correspondente
6 print(f'O índice {i} corresponde ao nome {nome}')

Saída:

O indice 0 corresponde ao nome Ana


O indice 1 corresponde ao nome Carlos
O indice 2 corresponde ao nome Joao
O indice 3 corresponde ao nome Maria

No exemplo acima, a função enumerate é usada para iterar sobre a lista de nomes juntamente
com um contador que começa em 0. A cada iteração do loop, o valor da variável i é
incrementado e recebe o valor do índice atual da lista, enquanto o valor da variável nome
recebe o valor atual da lista.

Altribuição simultânea de mais de uma variável


No Python, é possível fazer atribuições simultâneas de mais de uma variável utilizando
a vírgula para separar os valores. Isso significa que podemos atribuir valores a diversas
variáveis em uma única linha de código.

x, y, z = 1, 2, 3

Nesse exemplo, estamos atribuindo o valor 1 para a variável x, o valor 2 para a variável y
e o valor 3 para a variável z.

23
Estruturas de repetição 4.3. Comando break

Outro exemplo:

a, b = b, a

Nesse exemplo, estamos trocando os valores das variáveis a e b utilizando a atribuição


simultânea. Isso é possível porque, antes da atribuição, o valor de b é atribuído à variável a
e o valor de a é atribuído à variável b.

A função enumerate retorna a cada iteração uma tupla contendo dois valores: o índice e o
valor correspondente na iteração. No exemplo 4.2.5, enumerate(nomes) retorna uma sequência
de tuplas (índice, valor) para cada elemento na lista nomes. Em seguida, essas tuplas são
descompactadas na variável i e nome usando a atribuição simultânea, permitindo que ambos
sejam usados no loop for.

§4.3 Comando break


O comando break é um controle de fluxo que permite interromper a execução de um loop (for
ou while) antes que ele termine naturalmente. Quando o comando break é executado dentro
do loop, o fluxo do programa é desviado imediatamente para a próxima instrução depois do loop,
ignorando todas as outras iterações que ainda restariam.
Isso pode ser útil quando se quer parar um loop antes de percorrer toda a sequência de elementos.
Por exemplo, imagine que se está percorrendo uma lista de números e deseja parar o loop assim
que encontrar o primeiro número negativo. Nesse caso, pode-se utilizar o comando break para
interromper o loop assim que a condição for satisfeita.

Exemplo 4.3.1. Encontrando o número negativo:

1 # Cria uma lista de números


2 numeros = [1, 2, 3, -4, 5, 6]
3
4 # Itera em todos os números da lista
5 for num in numeros:
6 # Caso o número atual seja negativo, imprime uma mensagem e
sai do loop
7 if num < 0:
8 print(f"Encontrou número negativo: {num}")
9 break
10 print(f"Processando número: {num}")

Neste exemplo, o loop percorre a lista de números e, ao encontrar o primeiro número


negativo (-4), o comando break é executado, interrompendo o loop e exibindo a mensagem
"Encontrou número negativo: -4". Note que, como o loop foi interrompido, ele não processou
os números 5 e 6 da lista.

24
Estruturas de repetição 4.4. Comando continue

Exemplo 4.3.2. Utilizando o break para sair de um loop infinito:

1 # Repete o bloco enquanto o usuário não digitar sair


2 while True:
3 # Lê uma entrada do usuário
4 entrada = input("Digite um valor (ou 'sair' para encerrar): ")
5 # Se o usuário digitar sair, interrompe o loop
6 if entrada == 'sair':
7 break
8 # Imprime a entrada do usuário
9 print(f'Você digitou: {entrada}')
10
11 print('Fim do programa.')

Neste exemplo, o programa continuará lendo valores de entrada do usuário até que ele
digite "sair". Quando isso acontecer, o break é executado, o que interrompe o loop e o
programa imprime "Fim do programa.".

§4.4 Comando continue


O comando continue é utilizado em laços de repetição para pular a iteração atual e seguir para
a próxima. Ou seja, quando o comando continue é encontrado dentro de um laço de repetição,
as instruções que estão abaixo dele são ignoradas para a iteração atual e o programa segue para a
próxima iteração do laço.
O continue é muito útil quando se quer pular um determinado elemento da iteração, mas
sem sair completamente do laço.

Exemplo 4.4.1. Imprimindo somente os números impares de uma lista:

1 # Cria uma lista de números


2 numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
3
4 # Itera em todos os números
5 for numero in numeros:
6 # Se o número for par, pula a execução do resto do bloco
7 if numero % 2 == 0:
8 continue
9 # Imprime o número
10 print(numero)

Nesse exemplo, estamos percorrendo a lista de números e imprimindo somente os números


ímpares. Quando encontramos um número par, utilizamos o comando continue para pular
essa iteraçãon antes do print e seguir para a próxima.

25
6 Sequências
Sequências em Python são um dos principais tipos de dados usados. Uma sequência é uma
coleção ordenada de elementos que podem ser de diferentes tipos, como números, strings ou outras
sequências. Em Python, existem três tipos principais de sequências: listas, tuplas e strings.
As listas são mutáveis e podem ser alteradas ou atualizadas, enquanto as strings e tuplas são
imutáveis e não podem ser alteradas depois de criadas. As sequências em Python permitem
armazenar e manipular dados de maneira eficiente, como acessar elementos individuais, fatias de
elementos, ordenar, filtrar, etc. Conhecer bem as sequênciasn e como manipula-las é fundamental
para quem deseja aprender programação em Python.

§6.1 Tipos de sequências


§6.1.1 Listas
As listas em Python são estruturas de dados que permitem armazenar uma coleção de valores
em sequência, separados por vírgulas e delimitados por colchetes. Uma das principais vantagens
das listas é a sua flexibilidade, já que elas podem ser editadas, fatiadas e expandidas de maneira
muito simples.
Além disso, elas aceitam qualquer tipo de elemento, desde números, strings, até outras listas e
objetos mais complexos. É possível inclusive ter elementos de tipos diferentes na mesma lista.
Essa característica é muito útil em muitas aplicações, como por exemplo quando se quer armazenar
informações de diferentes tipos sobre um mesmo objeto.
Outra vantagem das listas é a sua capacidade de expansão dinâmica, ou seja, elas podem ser
adicionadas ou removidas elementos a qualquer momento, de forma a atender às necessidades do
programa em execução.

Exemplo 6.1.2. Exemplos de listas

1 # Lista de inteiros
2 lista_inteiros = [1, 2, 3, 4, 5]
3
4 # Lista de strings
5 lista_strings = ['banana', 'maçã', 'abacaxi']
6
7 # Lista com elementos de tipos diferentes
8 lista_diferentes_tipos = ['python', 3.14, True]

§6.1.3 Tuplas
As tuplas em Python são estruturas semelhantes às listas, porém com uma diferença fundamental:
são imutáveis, ou seja, uma vez que uma tupla é criada, não é possível alterar o seu conteúdo. As
tuplas são definidas com valores separados por vírgula entre parênteses, mas os parênteses podem
ser omitidos em algumas situações.
Assim como as listas, as tuplas aceitam qualquer tipo de elemento, inclusive mais de um tipo na
mesma tupla. Embora não possam ser modificadas, as tuplas podem ser acessadas e manipuladas
de diversas formas, permitindo operações como concatenação, fatiamento e indexação.

26
Sequências 6.2. Operadores aplicados em sequências

As tuplas são úteis em situações onde é necessário garantir que o conteúdo não seja modificado
acidentalmente ou intencionalmente, como em funções que retornam múltiplos valores, por
exemplo.

Exemplo 6.1.4. Exemplos de tuplas

1 # tupla de inteiros
2 tupla_inteiros = (1, 2, 3, 4, 5)
3
4 # tupla de strings
5 tupla_strings = ('banana', 'maçã', 'abacaxi')
6
7 # tupla com elementos de tipos diferentes
8 tupla_diferentes_tipos = ('python', 3.14, True)

§6.1.5 Strings
Strings são sequências de caracteres que representam texto e são definidas entre aspas simples
(’...’) ou duplas ("..."). As strings são imutáveis, ou seja, uma vez criadas, seus valores não podem
ser alterados. No entanto, é possível criar uma nova string a partir de uma já existente por meio
de operações como concatenação e formatação.
Além disso, as strings suportam uma série de métodos que permitem manipular e analisar seu
conteúdo, como busca, substituição, transformação de caixa e separação em substrings.
As strings são amplamente utilizadas em Python para representar palavras, frases, nomes de
arquivos, entre outros tipos de texto. A manipulação de strings será discutida em mais detalhes
na próxima aula.

Exemplo 6.1.6. Exemplos de strings

1 # string de letras
2 string_letras = 'abcde'
3
4 # string de números
5 string_numeros = '12345'
6
7 # string com caracteres especiais
8 string_especiais = '$#@!'

§6.2 Operadores aplicados em sequências


Os operadores aplicados em sequências em Python são:

• Operador de Concatenação (+): utilizado para unir duas sequências do mesmo tipo
em uma única sequência.

• Operador de Repetição (*): utilizado para repetir uma sequência um determinado


número de vezes.

27
Sequências 6.3. Indexação de sequências

• Operador de Pertencimento (in): utilizado para verificar se um elemento pertence a


uma sequência.

Esses operadores podem ser aplicados em sequências como strings, listas e tuplas em Python.
Por exemplo, podemos utilizar o operador de concatenação para unir strings ou listas, o operador
de repetição para gerar sequências repetidas, o operador de pertinência para verificar se um
elemento está contido em uma lista, e o operador de comparação para comparar o tamanho de
duas sequências.

Exemplo 6.2.1. Exemplos de uso dos operadores em sequências

1 # Operador concatenação
2 lista1 = [1, 2, 3]
3 lista2 = [4, 5, 6]
4 lista_concatenada = lista1 + lista2
5 print(lista_concatenada)
6 # Saída: [1, 2, 3, 4, 5, 6]
7
8 # Operador repetição
9 tupla = (1, 2, 3)
10 tupla_repetida = tupla * 3
11 print(tupla_repetida)
12 # Saída: (1, 2, 3, 1, 2, 3, 1, 2, 3)
13
14 # Operador pertencimento
15 palavra = "python"
16 if "p" in palavra:
17 print("A palavra contém a letra 'p'")
18 # Saída: A palavra contém a letra 'p'

§6.3 Indexação de sequências


A indexação é uma operação muito comum em sequências em Python. Ela é utilizada para acessar
um elemento específico dentro de uma sequência, como uma lista, uma tupla ou uma string.
A indexação em Python começa com o número 0 para o primeiro elemento da sequência, e
vai incrementando de 1 para cada elemento subsequente. Por exemplo, na lista [1, 2, 3, 4], o
elemento 1 tem índice 0, o elemento 2 tem índice 1, e assim por diante.
Para acessar um elemento de uma sequência, é preciso indicar o seu índice dentro dos colchetes
que delimitam a sequência. Por exemplo, se quisermos acessar o segundo elemento da lista [1, 2,
3, 4], utilizamos a indexação com o número 1:

1 lista = [1, 2, 3, 4]
2 segundo_elemento = lista[1]
3 print(segundo_elemento) # Saída: 2

A indexação também pode ser utilizada para acessar uma fatia (slice) da sequência. Para
isso, é preciso indicar o índice inicial e final separados por dois pontos dentro dos colchetes. Por
exemplo, se quisermos acessar os elementos da lista [1, 2, 3, 4] a partir do segundo elemento até o
final, podemos utilizar a seguinte indexação:

28
Sequências 6.3. Indexação de sequências

1 lista = [1, 2, 3, 4]
2 fatiado = lista[1:]
3 print(fatiado) # Saída: [2, 3, 4]

Nesse exemplo, utilizamos o índice 1 como início da fatia e deixamos em branco o índice final,
indicando que queremos acessar todos os elementos até o final da sequência.
Além de poder acessar os elementos de uma sequência através de índices positivos, também é
possível utilizar índices negativos. Nesse caso, a contagem começa a partir do final da sequência,
ou seja, o último elemento é representado pelo índice -1, o penúltimo pelo índice -2 e assim por
diante:

1 lista = [1, 2, 3, 4]
2 penultimo_elemento = lista[-2]
3 print(penultimo_elemento) # Saída: 3

§6.3.1 Operador de fatiamento


O operador de fatiamento é representado pelo símbolo de dois pontos (:), e é utilizado para
selecionar uma porção de uma sequência, como uma lista, tupla ou string. Ele permite que você
especifique um índice inicial e final, e também a quantidade de itens que devem ser pulados
entre esses dois índices. O resultado é uma nova sequência que contém apenas os elementos
selecionados.
A sintaxe básica do operador de fatiamento pode ser representada por:

sequencia[inicio:fim]

Onde inicio indica o índice inicial da sequência a ser fatiada e fim indica o índice final
(não inclusivo). Caso inicio não seja informado, a fatia será iniciada a partir do primeiro
elemento da sequência. Caso fim não seja informado, a fatia será finalizada no último elemento
da sequência. Existe também a sintaxe com passo:

sequencia[inicio:fim:passo]

Onde passo indica o intervalo entre os índices a serem incluídos na fatia. O passo padrão
quando passo não é especificado é 1. O valor do passo pode ser passdo negativo, nesse caso
a lista é acessada de forma invertida. É importante ressaltar que o operador de fatiamento
retorna uma nova sequência contendo os elementos que estão dentro do intervalo especificado,
sem modificar a sequência original.

Cópia de sequencias
Uma maneira intuitiva de se copiar sequências seria simplesmente atribuir a sequência
original a uma nova variável. Porém ao executarmos o código:

1 # Cria as listas
2 lista_a = [1, 2, 3, 4]
3 lista_b = lista_a
4
5 # Edita um elemento da lista b
6 lista_b[0] = 10
7
8 # Imprime o mesmo elemento da lista a
9 print(lista_a[0])

29
Sequências 6.3. Indexação de sequências

Observamos que a saída será 10 no lugar do esperado 1, de alguma maneira a edição da


lista_b afetou os valores da lista_a.
Isso ocorre porque ao atribuir uma sequência a uma nova variável, na verdade estamos
criando uma referência para a sequência original, e não uma nova cópia. Assim, qualquer
alteração feita em uma das variáveis irá afetar a outra.

Para fazer uma cópia real da sequência, podemos utilizar o operador de fatiamento, por
exemplo:

1 # Cria as listas
2 lista_a = [1, 2, 3, 4]
3 lista_b = lista_a[:]
4
5 # Edita um elemento da lista b
6 lista_b[0] = 10
7
8 # Imprime o mesmo elemento da lista a
9 print(lista_a[0])

Isso irá criar uma nova lista com os mesmos elementos da lista original, sem que as variáveis
estejam relacionadas entre si:

O uso do operador fatiamento é uma das maneiras possíveis de se copiar sequências,


existem outras.

§6.3.2 Usos básicos do operador fatiamento


• Cópia

lista_b = lista_a[:]

• Acesso até um índice (aberto)

30
Sequências 6.4. Listas

lista[:2] # Acessa os índices 0 e 1

• Acesso a partir de um índice (fechado)

lista[2:] # Acessa os índices 2, 3, ... ate o ultimo item

• Acesso entre dois índices

lista[1:4] # Acessa os índices 1 e 2

§6.3.3 Usos avançados do operador fatiamento


• Acesso até um índice com passo

lista[:4:2] # Acessa os índices 0 e 2

• Acesso a partir de um índice com passo

lista[2::2] # Acessa os índices 2, 4, 6 ...

• Acesso entre dois índices com passo

lista[1:6:2] # Acessa os índices 1, 3 e 5

• Acesso somente com passo

lista[::3] # Acessa os índices 0, 3, 6 ...

• Acesso somente com passo negativo (inverte a lista)

lista[::-1] # Acessa os índices n-1, n-2, ..., 2, 1, 0

§6.4 Listas
Além das operações de sequencias já discutidas, existem alguns métodos específicos a listas que
permitem a sua manipulação.

§6.4.1 Adicionando itens a listas


Em Python, é possível adicionar itens a uma lista de duas maneiras principais: usando o método
append() ou com a concatenação de listas.
O método append() adiciona um novo elemento ao final da lista:

1 lista = [1, 2, 3]
2 lista.append(4)
3 print(lista) # Saída: [1, 2, 3, 4]

Podemos também adicionar novos elementos a lista utilizando o operador de concatenação/a-


tribuição (+=):

31
Sequências 6.4. Listas

1 lista = [1, 2, 3]
2 lista += [4]
3 print(list3) # Saída: [1, 2, 3, 4]

É importante lembrar que a concatenação de listas cria uma nova lista, enquanto o método
append() adiciona um elemento à lista original.

§6.4.2 Removendo itens de listas


O Python oferece duas maneiras de se remover um item de uma lista: utilizando o método pop()
ou o comando del.
O método pop() remove o último elemento da lista por padrão e retorna o valor removido. É
possível passar um índice como argumento para remover um elemento específico da lista. Veja
um exemplo:

1 lista = ['a', 'b', 'c', 'd']


2 ultimo_elemento = lista.pop()
3 print(ultimo_elemento) # Saída: 'd'
4 print(lista) # Saída: ['a', 'b', 'c']
5
6 elemento_c = lista.pop(2)
7 print(elemento_c) # Saída: 'c'
8 print(lista) # Saída: ['a', 'b']

Já a palavra-chave del é usada para remover um item pelo índice. Diferente do pop(), o del
não retorna o valor removido, apenas remove o item da lista. Veja um exemplo:

1 lista = ['a', 'b', 'c', 'd']


2 del lista[2]
3 print(lista) # Saída: ['a', 'b', 'd']

Tanto o pop() quanto o del podem ser utilizados para remover o último elemento da lista.
No caso do pop, basta não passar nenhum argumento. Já no caso do del, basta passar o índice
do último elemento (ou -1, caso a lista tenha um tamanho desconhecido). Veja um exemplo:

1 lista = ['a', 'b', 'c', 'd']


2 lista.pop()
3 print(lista) # Saída: ['a', 'b', 'c']
4
5 del lista[-1]
6 print(lista) # Saída: ['a', 'b']

Exemplo 6.4.3. Usando listas como filas


Uma fila é uma estrutura de dados em que o primeiro elemento a ser adicionado é o
primeiro a ser removido, seguindo uma ordem de entrada conhecida como "primeiro a entrar,
primeiro a sair"(FIFO, do inglês First-In-First-Out).
Listas também podem ser utilizadas como filas, onde o primeiro elemento adicionado será
o primeiro a ser removido. Isso é feito utilizando o método append() para adicionar um
elemento no final da lista e o método pop(0) para remover o primeiro elemento:

1 # Cria lista para armazenar a fila

32
Sequências 6.4. Listas

2 fila = []
3
4 # Adiciona elementos
5 fila.append('a')
6 fila.append('b')
7 fila.append('c')
8
9 # Imprime a fila
10 print(fila) # Saída: ['a', 'b', 'c']
11
12 # Remove um elemento
13 primeiro = fila.pop(0)
14 print(primeiro) # Saída: 'a'
15 print(fila) # Saída: ['b', 'c']

Nesse exemplo, a lista fila é utilizada como fila. Os elementos ’a’, ’b’ e ’c’ são adicionados
na ordem utilizando o método append(). Em seguida, o primeiro elemento é removido
utilizando o método pop(0) e o valor é armazenado na variável primeiro. A lista fila agora
contém apenas os elementos ’b’ e ’c’.

Exemplo 6.4.4. Usando listas como pilhas


Uma pilha é uma estrutura de dados em que o último elemento a ser adicionado é o
primeiro a ser removido, seguindo uma ordem conhecida como "último a entrar, primeiro a
sair"(LIFO, do inglês Last-In-First-Out).
Listas também podem ser utilizadas como pilhas, onde o último elemento adicionado será
o primeiro a ser removido. Isso é feito utilizando o método append() para adicionar um
elemento no final da lista e o método pop() para remover o último elemento:

1 # Cria lista para armazenar a pilha


2 pilha = []
3
4 # Adiciona elementos
5 pilha.append('a')
6 pilha.append('b')
7 pilha.append('c')
8
9 # Imprime a pilha
10 print(pilha) # Saída: ['a', 'b', 'c']
11
12 # Remove um elemento
13 ultimo = pilha.pop()
14 print(ultimo) # Saída: 'c'
15 print(pilha) # Saída: ['a', 'b']

Nesse exemplo, a lista pilha é utilizada como pilha. Os elementos ’a’, ’b’ e ’c’ são
adicionados na ordem utilizando o método append(). Em seguida, o último elemento é
removido utilizando o método pop() e o valor é armazenado na variável último. A lista
pilha agora contém apenas os elementos ’a’ e ’b’.

33
Sequências 6.4. Listas

§6.4.5 Percorrendo listas


Existem diferentes maneiras de percorrer uma lista em Python, dependendo do objetivo específico
do código. Algumas das formas mais comuns são:

1. Percorrendo por índices: é possível utilizar o laço de repetição for juntamente com a
função range() e a função len() para percorrer os índices respectivos ao comprimento
de uma lista e utilizando seus índices como referência. Por exemplo:

1 lista = [10, 20, 30, 40, 50]


2 for i in range(len(lista)):
3 print(i, lista[i])

2. Percorrendo por valores: outra forma de percorrer uma lista é utilizando o laço de
repetição for diretamente com seus valores. Por exemplo:

1 lista = [10, 20, 30, 40, 50]


2 for valor in lista:
3 print(valor)

3. Percorrendo por índices e valores: por fim, também é possível utilizar a função
enumerate() em conjunto com o laço de repetição for para percorrer uma lista utilizando
tanto seus índices quanto seus valores. Por exemplo:

1 lista = [10, 20, 30, 40, 50]


2 for i, valor in enumerate(lista):
3 print(i, valor)

34
7 Strings
Uma string é uma sequência de caracteres em Python, que pode ser composta por letras,
números, símbolos e espaços em branco. Em Python, as strings são representadas por uma cadeia
de caracteres entre aspas simples (’ ’) ou duplas (" ").
Neste capítulo, vamos aprender a manipular strings em Python. Veremos como acessar
caracteres individuais em uma string, como percorrer uma string usando loops, como concatenar
strings e como formatar strings para exibição de informações. Também abordaremos alguns
métodos úteis para trabalhar com strings, como transformar uma string em maiúsculas ou
minúsculas e como dividir uma string em substrings.

§7.1 Comparação de strings


Ao trabalhar com strings em Python, é comum a necessidade de comparar duas strings para
verificar se elas são iguais ou diferentes. Para isso, pode-se utilizar os operadores de comparação:

• O operador == verifica se duas strings são iguais.


• O operador != verifica se duas strings são diferentes.

Exemplo 7.1.1. Comparando strings

1 # Define 3 strings
2 string1 = "hello"
3 string2 = "world"
4 string3 = "hello"
5
6 # Verifica se string1 é igual a string2
7 if string1 == string2:
8 print("As strings são iguais.")
9 else:
10 print("As strings são diferentes.")
11
12 # Verifica se string1 é igual a string3
13 if string1 == string3:
14 print("As strings são iguais.")
15 else:
16 print("As strings são diferentes.")

Nesse exemplo, a primeira comparação entre as strings string1 e string2 resulta em


"As strings são diferentes."pois elas não são iguais. Já a segunda comparação entre as strings
string1 e string3 resulta em "As strings são iguais."pois elas são iguais.

§7.1.2 Comparação de substrings


Substrings são partes de uma string que podem ser extraídas utilizando índices. Para obter uma
substring em Python, pode-se utilizar a sintaxe de fatiamento: string[inicio:fim]. Onde "inicio"é
o índice do primeiro caractere da substring e "fim"é o índice do último caractere + 1.
Por exemplo, para obter a substring "mundo"a partir da string "olá mundo", pode-se utilizar:

35
Strings 7.2. Métodos lower() e upper()

1 s = "olá mundo"
2 substring = s[4:]
3 print(substring) # Saída: "mundo"

Para utilizar substrings em comparações, pode-se simplesmente comparar a substring extraída


com outra string:

1 s = "olá mundo"
2 substring = s[-6:]
3 if substring == "mundo!":
4 print("A substring e igual a 'mundo!'!")

Outra opção é utilizar os métodos startswith() e endswith(), que verificam se uma string começa
ou termina com uma determinada substring:

1 s = "olá mundo"
2 if s.startswith("olá"):
3 print("A string comeca com 'olá'!")
4 if s.endswith("mundo"):
5 print("A string termina com 'mundo'!")

Esses métodos são especialmente úteis quando a comparação envolve apenas o início ou o fim
da string.
Mais uma opção para comprar substrings é o operador in, que verifica se uma string é uma
substring de outra string:

1 texto = "olá mundo"


2 if "olá" in texto:
3 print("Substring encontrada!")
4 else:
5 print("Substring nao encontrada!")

Nesse caso, a saída seria "Substring encontrada!", pois a string "Hello"está presente na string
original.
A principal diferença entre os métodos startswith() e endswith() e o operador in é
que os métodos verificam se uma string começa ou termina com determinado valor, enquanto o
operador verifica se uma string contém determinado valor em qualquer posição.

§7.2 Métodos lower() e upper()


Os métodos lower() e upper() são utilizados para converter as letras de uma string em letras
minúsculas ou maiúsculas, respectivamente.
O método lower() retorna uma cópia da string original com todas as letras em minúsculas.
Já o método upper() retorna uma cópia da string original com todas as letras em maiúsculas.
Esses métodos são úteis em várias situações, como na comparação de strings, pois nem sempre
as letras de duas strings são iguais, mas a diferença está apenas na caixa (maiúscula ou minúscula)
em que elas estão escritas. Com a conversão para letras maiúsculas ou minúsculas, é possível
fazer a comparação sem se preocupar com essa diferença.

36
Strings 7.2. Métodos lower() e upper()

Exemplo 7.2.1. Comparando strings com lower()

1 # Define duas strings


2 string1 = "Hello"
3 string2 = "hello"
4
5 # Compara as duas utilizando o método lower
6 if string1.lower() == string2.lower():
7 print("As strings são iguais, ignorando as diferencas entre
maiúsculas e minúsculas.")
8 else:
9 print("As strings são diferentes.")

Nesse exemplo, a comparação entre as strings string1 e string2 resulta em "As strings
são iguais, ignorando as diferenças entre maiúsculas e minúsculas."pois elas são iguais quando
convertidas para letras minúsculas.

Exemplo 7.2.2. Tratando entradas de usuário para ignorar maiúsculas

1 # Inicializa uma lista vazia para armazenar os números


2 numeros = []
3
4 # Loop infinito para receber entradas do usuário
5 while True:
6 # Solicita que o usuário digite um número ou "sair" para
finalizar
7 entrada = input("Digite um número ou 'sair' para sair: ")
8
9 # Se a entrada do usuário for "sair" (ignorando maiúsculas),
o loop é encerrado
10 if entrada.lower() == 'sair':
11 break
12
13 # Converte a entrada do usuário para float e adiciona à lista
de números
14 numeros.append(float(entrada))
15
16 # Calcula a média dos números utilizando as funções sum() e len()
17 media = sum(numeros) / len(numeros)
18 # Exibe a média dos números
19 print(f"A média dos números é: {media}")

Neste exemplo, a string "sair"é utilizada como critério para encerrar o loop que solicita ao
usuário a digitação dos números. No entanto, para garantir que o programa também encerre
o loop caso o usuário digite "Sair"ou "SAIR", por exemplo, é aplicado o método lower() à
string digitada pelo usuário.

37
Strings 7.3. Pesquisa em strings

§7.3 Pesquisa em strings


§7.3.1 Método find()
O método find() é utilizado para buscar a primeira ocorrência de uma substring em uma string.
Ele retorna a posição da primeira letra da substring na string original, ou -1 caso a substring não
seja encontrada.
A sintaxe do método é a seguinte:

string.find(substring, inicio, fim)

Onde:
• string: a string original onde será feita a busca
• substring: a substring que será buscada na string original
• inicio (opcional): a posição inicial onde a busca será iniciada (padrão é 0)
• fim (opcional): a posição final onde a busca será encerrada (padrão é o final da string)

Exemplo 7.3.2. Uso do método find()

1 frase = "A vida é bela"


2 posicao = frase.find("bel")
3 print(posicao) # Saída: 9

Neste exemplo, a posição da primeira letra da substring "bel"na string original "A vida é
bela"é 9.

É importante lembrar que o método find() retorna apenas a posição da primeira ocorrência
da substring. Se houverem mais ocorrências da mesma substring na string original, elas não
serão consideradas. Para buscar todas as ocorrências de uma substring na string original, pode-se
utilizar o método find() dentro de um loop, atualizando o parâmetro inicio a cada iteração.

Exemplo 7.3.3. Busca de todas as ocorrências de uma substring

1 # String para realizada a busca


2 texto = "Hoje é um belo dia para programar, não é mesmo? Vamos
programar juntos hoje!"
3 # String para ser buscada
4 substring = "programar"
5
6 # Inicializa a variável que vai armazenar a posição inicial da
busca
7 posicao = 0
8 # Inicializa a variável que vai armazenar as posições das
ocorrências
9 ocorrencias = []
10
11 # Faz a busca na string enquanto houver ocorrências
12 while True:
13 # procura a substring a partir da posição atual

38
Strings 7.4. Quebra e junção de strings

14 posicao = texto.find(substring, posicao)


15
16 # se não encontrou mais nenhuma ocorrência, encerra o loop
17 if posicao == -1:
18 break
19
20 # adiciona a posição da ocorrência na lista
21 ocorrencias.append(posicao)
22
23 # atualiza a posição inicial para começar a busca da próxima
ocorrência
24 posicao += 1
25
26 # Exibe as posições das ocorrências
27 print(ocorrencias)

Para encontrar todas as ocorrências da substring "programar"na string acima e armazená-


las em uma lista, podemos usar o método find() em um loop while. O método find()
retorna a posição da primeira ocorrência da substring na string ou -1 caso não encontre.
Podemos utilizar o parâmetro de início para avançar a busca a partir da posição da última
ocorrência encontrada.

§7.3.4 Método count()


O método count() é utilizado para contar o número de ocorrências de uma substring em uma
string. Ele recebe como parâmetro a substring a ser contada e retorna a quantidade de vezes que
ela aparece na string.

Exemplo 7.3.5. Uso do método count()

1 texto = "O rato roeu a roupa do rei de Roma"


2 qtd_ocorrencias = texto.count('ro')
3 print(qtd_ocorrencias) # Saída: 2

Nesse exemplo, o método count() foi utilizado para contar quantas vezes a substring
"ro"aparece na string "O rato roeu a roupa do rei de Roma". O resultado é 2, já que essa
substring aparece duas vezes na string.

§7.4 Quebra e junção de strings


Quebra e junção de strings em listas e em substrings é uma operação muito comum em programação.
Em Python, essas operações podem ser realizadas utilizando os métodos split() e join().

§7.4.1 Método split()


O método split() divide uma string em uma lista de substrings com base em um separador
especificado. O separador padrão é um único espaço ’ ’.

39
Strings 7.4. Quebra e junção de strings

Exemplo 7.4.2. Uso do método split()

1 frase = "O rato roeu a roupa do rei de Roma."


2 palavras = frase.split()
3 print(palavras)
4 # Saída: ['O', 'rato', 'roeu', 'a', 'roupa', 'do', 'rei', 'de',
'Roma.']

O código acima irá imprimir a lista de palavras da frase, onde cada elemento da lista
é uma palavra separada por espaço. O método split() também pode ser utilizado com
separadores diferentes do espaço:

1 frase = "banana,maçã,laranja,abacaxi,melancia"
2 lista_frutas = frase.split(",")
3 print(lista_frutas)
4 # Saida: ['banana', 'maçã', 'laranja', 'abacaxi', 'melancia']

Neste exemplo, a string frase é quebrada em uma lista de substrings utilizando a vírgula
como separador, através do método split() com parâmetro ",". O resultado é a lista
lista_frutas contendo cada fruta como um elemento da lista.
Note que o separador utilizado no método split() foi a vírgula (",") em vez do espaço
(" "), que é o separador padrão.

Conversão de strings em lista


É possível também converter uma string diretamente em uma lista utilizando a função
list(). Cada caractere da string será considerado um elemento da lista. Por exemplo:

1 minha_string = "Python"
2 minha_lista = list(minha_string)
3 print(minha_lista)
4 # Saída: ['P', 'y', 't', 'h', 'o', 'n']

É importante lembrar que, ao converter uma string em lista, cada elemento da lista será
do tipo string. Se for necessário realizar operações matemáticas ou comparações numéricas
com os caracteres da string, é necessário convertê-los para o tipo numérico correspondente
utilizando funções como int() ou float().

§7.4.3 Método join()


O método join() é utilizado para juntar uma sequência de strings em uma única string. Esse
método recebe como parâmetro uma lista de strings (ou outra sequência de strings) e retorna
uma única string contendo todas as strings da sequência original concatenadas, separadas por um
separador especificado.
Sintaxe:

string_final = separador.join(lista_de_strings)

Onde:

• separador: a string que será usada para separar cada item da lista na string final.

• lista_de_strings: a sequência de strings que será concatenada.

40
Strings 7.5. Método replace()

Exemplo 7.4.4. Uso do método join

1 nomes = ['João', 'Maria', 'Pedro']


2 nomes_string = ', '.join(nomes)
3 print(nomes_string)
4 # Saida: João, Maria, Pedro

Nesse exemplo, o método join() recebe a lista de nomes e a string ’, ’ como separador,
criando uma única string contendo os nomes concatenados, separados por vírgula e espaço.

Exemplo 7.4.5. Substituindo um caracter por outro em uma string

1 # Definindo a string original


2 string = "banana"
3
4 # Convertendo a string em uma lista de caracteres
5 lista_string = list(string)
6
7 # Substituindo todos os "a" por "o"
8 for i in range(len(lista_string)):
9 if lista_string[i] == "a":
10 lista_string[i] = "o"
11
12 # Convertendo a lista de caracteres de volta para uma string
13 string_modificada = "".join(lista_string)
14
15 # Imprimindo a string modificada
16 print(string_modificada)

Neste exemplo, a string original é "banana"e o objetivo é substituir todos os caracteres


"a"por "o". Primeiro, a string é convertida em uma lista de caracteres utilizando a função
list(). Depois, é feita uma iteração sobre a lista para substituir os caracteres "a"por "o".
Finalmente, a lista de caracteres é convertida de volta para uma string utilizando o método
join(), e a string modificada é impressa na tela. O resultado seria a string "bonono".

§7.5 Método replace()


O método replace() é utilizado para substituir uma substring por outra em uma string. Sua
sintaxe é a seguinte:

string.replace(substring_antiga, substring_nova, quantidade)

Onde:
• string: a string original;
• substring_antiga: a substring que será substituída;
• substring_nova: a substring que será colocada no lugar da antiga;
• quantidade (opcional): a quantidade de ocorrências que serão substituídas (padrão é
todas).

41
Strings 7.6. Métodos de validação

Exemplo 7.5.1. Uso do método replace()

1 frase = "O rato roeu a roupa do rei de Roma"


2 nova_frase = frase.replace("r", "p")
3 print(nova_frase)
4 # Saída: O pato poeu a poupa do pei de Roma"

Nesse exemplo, a string "O rato roeu a roupa do rei de Roma"é atribuída à variável frase.
Em seguida, é criada uma nova string (nova_frase) que é o resultado da substituição de
todas as ocorrências da letra "r"por "p"na string original. O resultado impresso é a nova
string: "O pato poueu a poupa do pei de Roma".
Note que o ultimo R não foi substituído pois ele é um carácter minúsculo e somente
substituímos os r minúsculos.

§7.5.2 Método strip()


O método strip() é usado para remover caracteres específicos do início e/ou do final de uma
string. O método retorna uma cópia da string original com os caracteres especificados removidos.
A sintaxe do método strip() é a seguinte:

string.strip(caracteres)

Onde:

• string é a string original a ser manipulada.

• caracteres é uma string opcional contendo os caracteres que devem ser removidos do
início e/ou do final da string. Se essa string não for especificada, serão removidos espaços
em branco (incluindo tabulações e quebras de linha).

Exemplo 7.5.3. Uso do método strip()

1 texto = " Olá, mundo! "


2 texto = texto.strip()
3 print(texto)
4 # Saída: "Olá, mundo!"

Nesse exemplo, a string original contém espaços em branco no início e no final. O método
strip() é usado para remover esses espaços em branco, deixando apenas o texto desejado.
O resultado é a string "Ola, mundo!"sem espaços em branco adicionais.

§7.6 Métodos de validação


Além dos métodos já discutidos as strings também possuem métodos de validação que retornam
True ou False de acordo com o conteúdo da string, alguns desses são:

• .isalnum(): Checa se a string é alfanumérica (letras e números somente)

• .isalpha(): Checa se a string possui somente letras (inclui vogais acentuadas)

• .isdigit(): Checa se a string possui somente dígitos (números)

42
Strings 7.6. Métodos de validação

• .isspace(): Checa se a string possui apenas espaços em branco (espaços, tab, quebra de
linha)

• .isupper(): Checa se a string possui somente caracteres maiúsculos.

• .islower(): Checa se a string possui somente caracteres minúsculos.

Mais métodos podem ser encontrados na documentação do Python: https://docs.python.org/pt-


br/3.11/library/stdtypes.html#string-methods

43
9 Dicionários
Dicionários são estruturas de dados em Python que permitem armazenar informações não
ordenadas em pares de chave-valor. Ao contrário das listas, onde os elementos são indexados
numericamente, os dicionários usam chaves únicas para identificar cada valor associado a ela.
Dessa forma, eles são úteis quando precisamos acessar os valores de acordo com suas chaves, sem
precisar passar por todos os elementos da estrutura. Os dicionários são mutáveis e podem ser
modificados a qualquer momento, adicionando, removendo ou atualizando pares de chave-valor.
Eles são amplamente utilizados em Python, especialmente para armazenar e manipular dados em
formato de tabela.
Os dicionários em Python são definidos por meio de chaves e contêm uma coleção de pares
chave-valor. Cada elemento do dicionário consiste em uma chave e seu respectivo valor, separados
por dois pontos (:), e separados por vírgulas. A chave deve ser única e imutável, enquanto o valor
pode ser de qualquer tipo de dados, incluindo outros dicionários.
A sintaxe básica de um dicionário em Python é:

nome_do_dicionario = {chave1: valor1, chave2: valor2, chave3: valor3}

Para acessar os valores do dicionário por meio das chaves, utilizamos colchetes com a chave
logo após o dicionário:

nome_do_dicionario[chave]

Exemplo 9.0.1. Criando, alterando e acessando dicionários

1 # Definição do dicionário com quantidade de frutas


2 qtde_frutas = {'banana': 2, 'maçã': 3, 'abacaxi': 1}
3
4 # Imprime a quantidade de bananas
5 print(qtde_frutas['banana']) # Saída: 2
6
7 # Adiciona 3 bananas
8 qtde_frutas['banana'] += 3
9
10 # Imprime a quantidade de bananas
11 print(qtde_frutas['banana']) # Saída: 5

Nesse exemplo, é criado um dicionário chamado qtde_frutas com três pares de chave-valor:
’banana’: 2, ’maca’: 3 e ’abacaxi’: 1. Em seguida, é impresso na tela o valor
associado a chave ’banana’ e logo após é somado 3 ao valor associado à chave ’banana’
através do uso do operador de indexação [] e do operador de soma-atribuição += e da
atribuição de um novo valor. Por fim, o novo valor associado à chave ’banana’ é acessado
através do mesmo operador de indexação [] e é impresso na tela.

§9.1 Iterando em dicionários


Existem algumas maneiras de iterar em um dicionário em Python. As principais são:

• Iterar nas chaves: utilizando o método keys() do dicionário, é possível iterar sobre todas

44
Dicionários 9.2. Combinando dicionários

as chaves do dicionário. Exemplo:

for chave in dicionario.keys():

Como esse é o modo padrão de iteração de um dicionário, o loop também pode ser escrito
assim:

for chave in dicionario:

• Iterar nos valores: utilizando o método values() do dicionário, é possível iterar sobre
todos os valores do dicionário. Exemplo:

for valor in dicionario.values():

• Iterar simultaneamente nas chaves e valores: utilizando o método items() do dicionário,


é possível iterar sobre todos os pares chave-valor do dicionário. Exemplo:

for chave, valor in dicionario.items():

Lembrando que a ordem de iteração nos itens pode pode ocorrer em ordem diferente da que
foram adicionados ao dicionário, já que os dicionários são estruturas de dados desordenadas em
Python.

Exemplo 9.1.1. Diferentes formas de iterar em um dicionário:

1 meu_dict = {"chave1": "valor1", "chave2": "valor2", "chave3":


"valor3"}
2
3 # Iterando sobre as chaves do dicionário
4 for chave in meu_dict:
5 print(chave)
6
7 # Iterando sobre os valores do dicionário
8 for valor in meu_dict.values():
9 print(valor)
10
11 # Iterando sobre os itens do dicionário (chave e valor)
12 for chave, valor in meu_dict.items():
13 print(f'Chave: {chave}, Valor: {valor}')

§9.2 Combinando dicionários


Para combinar dois dicionários em Python, podemos utilizar o método update(). Este método
atualiza um dicionário com os elementos de outro dicionário, adicionando novos pares chave-valor
ou atualizando os valores das chaves existentes.
A sintaxe básica para o uso do método update() é a seguinte:

dicionario1.update(dicionario2)

Onde dicionario1 é o dicionário que será atualizado com os elementos de dicionario2.

45
Dicionários 9.2. Combinando dicionários

Exemplo 9.2.1. Combinando dois dicionários

1 dicionario1 = {"maçã": 5, "banana": 3, "laranja": 2}


2 dicionario2 = {"uva": 4, "maçã": 2, "banana": 1}
3
4 # Combinando os dicionários
5 dicionario1.update(dicionario2)
6
7 # Imprimindo o dicionário combinado
8 print(dicionario1)

Neste exemplo, definimos dois dicionários dicionario1 e dicionario2. Em se-


guida, utilizamos o método update() para combinar os dois dicionários, atualizando
o dicionario1 com os elementos do dicionario2. Por fim, imprimimos o dicionário
combinado para verificar o resultado.
O resultado da execução do código será o seguinte:

{"maçã": 2, "banana": 1, "laranja": 2, "uva": 4}

Combinando dois dicionários com chaves em comum


Quando usamos o método update() para combinar dois dicionários, caso eles possuam
uma chave em comum, o valor da chave do segundo dicionário será usado para sobrescrever
o valor da chave no primeiro dicionário. Isso ocorre porque o método update() atualiza
o primeiro dicionário com as chaves e valores do segundo dicionário, e se houverem chaves
em comum, o valor do segundo dicionário prevalecerá sobre o primeiro. É importante estar
ciente disso ao utilizar o método update(), para evitar a perda de informações importantes
em nossos dicionários.

Exemplo 9.2.2. Combinando dois dicionários somando os valores


Para combinar dicionários contendo valores numéricos somando os valores, podemos iterar
nos valores e chaves de segundo dicionário com o método itens() e checar se cada chave
existe no primeiro dicionário somando ou atribuindo o valor conforme necessário:

1 # Definindo os dicionários com quantidades de frutas


2 deposito1 = {"maçã": 5, "banana": 3, "laranja": 2}
3 deposito2 = {"uva": 4, "maçã": 2, "banana": 1}
4
5 # Itera nas quantidades de frutas no deposito2
6 for fruta, quantidade in deposito2.items():
7 # Checa se a chave existe no deposito1
8 if fruta in deposito1:
9 # Caso exista, soma os dois valores e atualiza o deposito1
10 deposito1[fruta] += quantidade
11 else:
12 # Caso não exista, adiciona ao deposito1
13 deposito1[fruta] = quantidade
14
15 # Imprime o dicionário combinado

46
Dicionários 9.3. Deletando itens de dicionários

16 print(deposito1)

Neste exemplo, o valor numérico corresponde à quantidade de cada fruta disponível. O


resultado do programa será um dicionário que combina os valores de quantidade de ambas
as variáveis deposito1 e deposito2, resultando em um novo dicionário contendo a
quantidade total de cada fruta:

{'maçã': 7, 'banana': 4, 'laranja': 2, 'uva': 4}

§9.3 Deletando itens de dicionários


Para deletar um item de um dicionário em Python, podemos usar o comando del, passando a
chave do item que queremos deletar como argumento. A sintaxe é a seguinte:

del meu_dicionario[chave]

Essa linha de código irá remover o item do dicionário que tem a chave especificada. É importante
notar que se a chave não existir no dicionário, um erro será lançado.

§9.4 Copiando dicionários


De maneira similar a listas somente atribuir uma variável contendo um dicionário a uma nova
variável não cria uma cópia desse dicionário:

1 dict1 = {'a': 1, 'b': 2, 'c': 3}


2 dict2 = dict1 # atribuição direta
3 dict2['a'] = 10
4 print(dict1['a']) # Saída: 10

Nesse caso, a variável dict2 não é uma cópia de dict1, mas sim uma referência ao mesmo
objeto. Isso significa que qualquer modificação feita em dict1 será refletida em dict2 e
vice-versa.

1 dict1 = {'a': 1, 'b': 2, 'c': 3}


2 dict2 = dict(dict1) # cria uma copia usando a função dict()
3 dict2['a'] = 10
4 print(dict1['a']) # Saída: 1

Dessa forma, é criado um novo objeto dicionário a partir do objeto dict1, que é independente
dele. Qualquer modificação feita em um dos dicionários não afetará o outro.
Vale ressaltar que, se o dicionário a ser copiado contiver objetos mutáveis (como listas), esses
objetos não serão copiados automaticamente. Nesse caso, é necessário criar cópias desses objetos
separadamente.

47
10 Funções
Funções são blocos de código que executam uma tarefa específica e podem ser chamados em
outras partes do programa para reutilização do código. Elas são úteis quando precisamos executar
uma mesma sequência de comandos em diferentes partes do código, ou quando queremos separar
o código em partes menores e mais fáceis de gerenciar (modularização).
A sintaxe básica de uma função em Python é a seguinte:

1 def nome_da_funcao(parametros):
2 # corpo da função
3 return valor_de_retorno

Explicando cada elemento:

• def: palavra-chave que define uma nova função

• nome_da_funcao: nome dado à função, que deve seguir as mesmas regras de nomeação
de variáveis

• parametros: argumentos opcionais da função que podem ser passados para dentro dela,
múltiplos argumentos podem ser passados para uma função separados por vírgula.

• :: sinaliza o início do corpo da função

• return: palavra-chave que indica o valor de retorno da função (opcional)

• valor_de_retorno: valor retornado pela função (opcional)

Exemplo 10.0.1. Função simples que imprime uma mensagem na tela

1 def say_hello():
2 print("Olá, mundo!")

Essa função é definida usando a palavra-chave def seguida pelo nome da função e, entre
parênteses, os parâmetros da função (nesse caso, não há nenhum). A linha termina com dois
pontos. O corpo da função é indentado e contém a lógica da função (neste caso, imprimir
uma mensagem na tela).
Para chamar a função, basta escrever seu nome seguido por parênteses:

say_hello()

Isso imprimirá Olá, mundo! na tela.

§10.1 Funções com parâmetros


As funções em Python também podem receber parâmetros, que são valores que podem ser
passados para a função para que ela os utilize em sua execução. Existem dois tipos de parâmetros:
posicionais e de palavra chave.

48
Funções 10.2. Funções com retorno

§10.1.1 Parâmetros posicionais


Os parâmetros posicionais são aqueles que são passados na mesma ordem em que são definidos
na declaração da função e não possuem valor padrão sendo portanto mandatórios na chamada da
função.

Exemplo 10.1.2. Função de soma com parâmetros.

1 def soma(a, b):


2 print(f"{a} + {b} = {a + b}")

Nessa função, os parâmetros a e b são posicionais. Ao ser chamada a função imprime na


tela os números passados e o resultado.

§10.1.3 Parâmetros de palavra chave


Os parâmetros de palavra chave são aqueles que são especificados pelo nome na chamada da
função. Eles podem ser passados em qualquer ordem e possuem valor padrão e podem portanto
ser omitidos na chamada. Parâmetros de palavra chave devem sempre ser declarados depois dos
posicionais.

Exemplo 10.1.4. Função com parâmetro por palavra chave:

1 def mostrar_informacoes(nome, idade, cidade="Maceió"):


2 print("Nome:", nome)
3 print("Idade:", idade)
4 print("Cidade:", cidade)

Nessa função, nome e idade são parâmetros posicionais e cidade é um parâmetro de


palavra chave com valor padrão "São Paulo". Para chamá-la, podemos passar todos os
parâmetros:

mostrar_informacoes("Joao", 30, cidade="Rio de Janeiro")

Ou podemos omitir o valor do parâmetro com valor padrão:

mostrar_informacoes("Maria", 25)

Nesse caso, o valor de cidade será "Maceió".

§10.2 Funções com retorno


Funções com retorno são aquelas que, além de receberem parâmetros, também retornam um valor
para quem as chamou. Isso permite que o valor calculado dentro da função seja utilizado em
outras partes do código.
O valor de retorno pode ser qualquer tipo de dado em Python, como um número, uma string,
uma lista, uma tupla ou até mesmo outro objeto.
Aqui está um exemplo de função que recebe dois números como parâmetros e retorna a soma
entre eles:

49
Funções 10.3. Escopo de variáveis

Exemplo 10.2.1. Função de soma com retorno:

1 def soma(a, b):


2 resultado = a + b
3 return resultado
4
5 # Chamando a função e armazenando o resultado em uma variável
6 resultado_da_soma = soma(2, 3)
7
8 # Imprimindo o resultado da soma
9 print(resultado_da_soma) # Saída: 5

Podemos também utilizar a função diretamente em uma expressão:

print(soma(4, 5)) # Saida: 9

Função com retorno de multiplos valores


Uma função pode também retornar múltiplos valores utilizando uma tupla:

1 def calcular_media(nota1, nota2, nota3):


2 media = (nota1 + nota2 + nota3) / 3
3 if media >= 7:
4 situacao = 'Aprovado'
5 else:
6 situacao = 'Reprovado'
7 return media, situacao
8
9 # Chamando a função e armazenando os resultados em variáveis
distintas
10 media_aluno, situacao_aluno = calcular_media(8, 7, 9)
11
12 # Imprimindo os resultados
13 print('Média:', media_aluno) # Saída: Média: 8.0
14 print('Situação:', situacao_aluno) # Saída: Situação: Aprovado

§10.3 Escopo de variáveis


Quando uma variável é definida em uma função, ela só é visível dentro da função. Isso é conhecido
como escopo local. Quando a variável é definida fora da função, ela pode ser acessada de qualquer
lugar do programa. Isso é conhecido como escopo global.

§10.3.1 Variáveis locais


As variáveis locais são definidas dentro de uma função e só podem ser acessadas dentro da função.
Elas são criadas quando a função é chamada e são destruídas quando a função é concluída. Vamos
dar uma olhada no exemplo a seguir:

1 # Define uma função com uma variável local


2 def minha_funcao():

50
Funções 10.3. Escopo de variáveis

3 x = 10
4 print("O valor de x dentro da função e: ", x)
5
6 # Chama a função
7 minha_funcao()
8
9 # Tenta imprimir a variável que definimos dentro da função
10 print("O valor de x fora da funcao e:", x)

A saída será:

1 O valor de x dentro da função e: 10


2 NameError: name 'x' is not defined

Como podemos ver, a variável x só existe dentro da função minha_funcao(). Quando tentamos
acessá-la fora da função, recebemos um erro.

§10.3.2 Variáveis globais


As variáveis globais são definidas fora de uma função e podem ser acessadas de qualquer lugar do
programa. Elas podem ser usadas dentro de funções, mas se elas forem modificadas dentro de
uma função, a modificação só será refletida dentro da função. Vamos dar uma olhada no exemplo
a seguir:

1 # Define uma variável fora da função


2 x = 10
3
4 # Define uma função que acessa a variável
5 def minha_funcao():
6 print("O valor de x dentro da funcao e:", x)
7
8 # Chama a função
9 minha_funcao()
10
11 # Imprime a variável
12 print("O valor de x fora da funcao e:", x)

A saída será:

1 O valor de x dentro da função e: 10


2 O valor de x fora da função e: 10

Como podemos ver, a variável x é definida fora da função e pode ser acessada dentro da função
e fora dela.

§10.3.3 Modificando variáveis globais dentro de uma função


Para modificar ou criar uma variável global dentro de uma função, precisamos usar a palavra-chave
global. Vamos dar uma olhada no exemplo a seguir:

1 # Define uma variável fora da função


2 x = 10
3

51
Funções 10.4. Recursão

4 # Define uma função que edita o valor da variável global


5 def minha_funcao():
6 global x
7 x = 20
8 print("O valor de x dentro da funcao e:", x)
9
10 # Chama a função
11 minha_funcao()
12
13 # Imprime a variável
14 print("O valor de x fora da funcao e:", x)

A saída será:

1 O valor de x dentro da função e: 20


2 O valor de x fora da função e: 20

Como podemos ver, a palavra-chave global é usada para indicar que estamos nos referindo à
variável global x e não a uma variável local com o mesmo nome.
Este uso não é recomendado, sempre que possível deve se usar parâmetros e retornos para
trafegar dados de dentro para fora de funções e vice-versa.

§10.4 Recursão
Recursão é uma técnica em programação onde uma função chama a si mesma para resolver um
problema. Ela é útil quando um problema pode ser quebrado em problemas menores e similares.
Para entendermos melhor o que são funções recursivas vamos observar a função fatorial, ela
pode ser definida como:

f atorial(x) = x ∗ (x − 1) ∗ ... ∗ 2 ∗ 1 (10.1)


Logo o fatorial de x − 1 será:

f atorial(x − 1) = (x − 1) ∗ ... ∗ 2 ∗ 1 (10.2)


Substituindo 10.2 em 10.1 obtemos:

f atorial(x) = x ∗ f atorial(x − 1) (10.3)


Porém para a nossa definição ficar completa precisamos saber quando parar de calcular
f atorial(x − 1) precisamos de uma condição de parada:
(
x ∗ f atorial(x − 1) se x > 1
f atorial(x) = (10.4)
1 se x = 1
O que define a nossa função fatorial em termos dela mesma para todo x ∈ N.

52
Funções 10.4. Recursão

Exemplo 10.4.1. Fatorial com função recursiva

1 def fatorial(n):
2 if n == 1:
3 return 1
4 else:
5 return n * fatorial(n-1)

Nesta função, se n for igual a 1, ela retorna 1. Caso contrário, ela retorna n multiplicado
pelo resultado da chamada recursiva da função fatorial para n-1.

Exemplo 10.4.2. Termo n-ésimo da sequência de Fibonacci

1 def fibonacci(n):
2 if n == 0:
3 return 0
4 elif n == 1:
5 return 1
6 else:
7 return fibonacci(n-1) + fibonacci(n-2)

Nesta função, se n for igual a 0, ela retorna 0. Se n for igual a 1, ela retorna 1. Caso
contrário, ela retorna a soma dos dois termos anteriores da sequência de Fibonacci, calculados
recursivamente.

É importante lembrar que a recursão pode facilmente levar loops infinitos. Ao definir uma
função recursiva é importante sempre ter uma condição de parada e fazer com que os parâmetros
se encaminhem para a condição de parada a cada chamada da função.
No exemplo 10.4.1 a condição de parada é retornar o valor 1 quando n chega no valor 1, e o
valor de n é subtraído um a cada chamada da função, garantindo que eventualmente ele chegue
ao valor 1 para qualquer n positivo.
Já no exemplo 10.4.2 as condições de parada é retornar 0 ou 1 quando n chega nos valores de
0 e 1 respectivamente, para este exemplo precisamos de duas condições de parada pois para cada
chamada da função precisamos chamar ela novamente para n-1 e n-2, se não tivéssemos as duas
condições de parada em sequência a execução não seria interrompida.

53
11 Bibliotecas
A programação em Python é poderosa e flexível, e uma das principais razões para isso é a
ampla variedade de bibliotecas disponíveis. Bibliotecas são coleções de código pré-escrito que
fornecem funções e recursos adicionais para facilitar o desenvolvimento de software.
Nesta aula, exploraremos o uso de bibliotecas em Python. Veremos como importar bibliotecas
em nossos programas, como usar as bibliotecas nativas do Python e também como utilizar outras
bibliotecas de terceiros.
Ao importar uma biblioteca, ganhamos acesso a um conjunto de funcionalidades adicionais
que podem ser usadas em nosso código. As bibliotecas nativas do Python já vêm instaladas
com o Python e fornecem uma ampla gama de recursos úteis. Já as bibliotecas de terceiros são
desenvolvidas por outras pessoas ou organizações e oferecem funcionalidades especializadas para
atender a diferentes necessidades.

§11.1 Importando bibliotecas


Para utilizar uma biblioteca em um programa Python, é necessário importá-la.
Existem algumas maneiras de importar uma biblioteca em Python. A forma mais comum é
utilizando o comando import. Veja o exemplo abaixo:

import math

Nesse exemplo, estamos importando a biblioteca math. Agora, podemos utilizar as funções e
constantes disponíveis nessa biblioteca em nosso código.
Outra forma de importar uma biblioteca é utilizando a declaração from. Com essa declaração,
é possível importar apenas funções específicas ou elementos específicos de uma biblioteca. Veja o
exemplo abaixo:

from math import sqrt, sin

Nesse exemplo, estamos importando apenas as funções sqrt e sin da biblioteca math. Dessa
forma, não precisamos utilizar o nome da biblioteca antes de chamar essas funções em nosso
código.
Além disso, é possível renomear uma biblioteca ou função ao importá-la, utilizando a palavra-
chave as. Isso pode ser útil para deixar o código mais legível ou evitar conflitos de nomes. Veja
o exemplo abaixo:

import math as m

Nesse exemplo, estamos importando a biblioteca math, mas renomeando-a para m. Agora,
podemos utilizar as funções da biblioteca utilizando o nome m em vez de math.
Ao utilizar bibliotecas em seus programas Python, é importante ler a documentação da biblioteca
para entender quais funções e recursos estão disponíveis e como utilizá-los corretamente.

54
Bibliotecas 11.2. Bibliotecas nativas

Exemplo 11.1.1. Importando bibliotecas

1 # Importando a biblioteca inteira


2 import math
3
4 # Utilizando uma função da biblioteca inteira
5 raiz_quadrada = math.sqrt(25)
6 print(f"A raiz quadrada de 25 é {raiz_quadrada}")
7
8 # Importando apenas uma função específica
9 from random import randint
10
11 # Utilizando a função diretamente
12 numero_aleatorio = randint(1, 100)
13 print(f"Um número aleatório: {numero_aleatorio}")
14
15 # Importando uma biblioteca com um nome diferente
16 import numpy as np
17
18 # Utilizando uma função da biblioteca com o nome alterado
19 vetor = np.arange(1, 6)
20 print(f"Um vetor: {vetor}")

Nesse exemplo, primeiro importamos a biblioteca math inteira, em seguida, usamos a


função sqrt para calcular a raiz quadrada de um número, observe que para chamar um
função de uma biblioteca utilizamos o ponto (.) da mesma maneira que acessamos métodos
de objetos:

math.sqrt(25)

Depois, importamos apenas a função randint da biblioteca random e a usamos para


gerar um número aleatório, neste caso como importamos a função específica não é preciso
chamar no nome da blioteca ante do nome da função.

randint(1, 100)

Por fim, importamos a biblioteca numpy e a renomeamos para np. Utilizamos a função
arange da biblioteca numpy para criar um vetor e o exibimos na tela, neste caso acessamos
a função com o nome renomeado da biblioteca seguido do ponto e do nome da função.

np.arrange(1,6)

§11.2 Bibliotecas nativas


As bibliotecas nativas são um conjunto de bibliotecas padrão que já vêm instaladas com o Python e
oferecem uma ampla gama de funcionalidades. Algumas das bibliotecas nativas mais importantes
incluem:

• datetime: Fornece classes e funções para manipulação de datas e horas.

• math: Fornece funções matemáticas avançadas, como trigonometria, logaritmos e funções

55
Bibliotecas 11.2. Bibliotecas nativas

exponenciais. A numpy normalmente é utilizada no lugar da biblioteca math, pois apresenta


mais funcionalidades e melhor performance.

• random: Fornece funções para geração de números aleatórios. A numpy.random é


bastante utilizada no lugar da biblioteca random, pois apresenta mais funcionalidades e
melhor performance.

• time: Fornece funções relacionadas ao tempo, como medição de tempo de execução.

• os: Fornece funções para interação com o sistema operacional, como manipulação de
arquivos e diretórios.

• sys: Fornece funções e variáveis relacionadas ao interpretador Python, como argumentos


de linha de comando e redirecionamento de entrada/saída.

• json: Fornece funções para trabalhar com o formato de dados JSON.

• re: Fornece suporte a expressões regulares para busca e manipulação de padrões em strings.

• csv: Fornece funcionalidades para leitura e escrita de arquivos CSV (Comma Separated
Values).

• urllib: Fornece funções para trabalhar com URLs, como fazer requisições HTTP e baixar
conteúdo da web.

Uma listagem completa das bibliotecas nativas pode ser encontrada em:
https://docs.python.org/pt-br/3/library/

Exemplo 11.2.1. Manipulando datas

1 from datetime import datetime


2
3 # Obtendo a data e hora atual
4 data_hora_atual = datetime.now()
5 print(data_hora_atual)
6
7 # Formatando uma data
8 data_formatada = data_hora_atual.strftime("%d/%m/%Y")
9 print(data_formatada)
10
11 # Calculando diferença de tempo
12 data_aniversario = datetime(1990, 5, 15)
13 diferenca_tempo = data_hora_atual - data_aniversario
14 print(diferenca_tempo.days)

Neste exemplo, importamos a classe datetime da biblioteca datetime usando a forma


from datetime import datetime. Essa biblioteca fornece classes e funções para
manipulação de datas e horas. No exemplo, utilizamos a classe datetime para obter
a data e hora atual usando datetime.now(). Em seguida, formatamos a data no formato
desejado usando o método strftime.

56
Bibliotecas 11.3. Mais bibliotecas

Exemplo 11.2.2. Medindo tempo

1 import time
2
3 # Atraso de 1 segundo
4 time.sleep(1)
5
6 # Medição de tempo de execução
7 inicio = time.time()
8 # Código a ser medido
9 # ..........
10 #
11 fim = time.time()
12 tempo_execução = fim - inicio
13 print("Tempo de execução:", tempo_execução)

Neste exemplo, importamos a biblioteca time usando a forma import time. Essa
biblioteca fornece funções relacionadas ao tempo. No exemplo, utilizamos a função sleep(1)
para fazer um atraso de 1 segundo. Também utilizamos as funções time.time() para
medir o tempo de execução de um trecho de código.

§11.3 Mais bibliotecas


Existem diversas bibliotecas disponíveis em Python que são amplamente utilizadas na área de
ciência de dados. Essas bibliotecas fornecem uma ampla gama de funcionalidades para análise,
manipulação e visualização de dados. Algumas das bibliotecas mais populares para ciência de
dados em Python são:

• NumPy: Biblioteca fundamental para computação científica em Python. Ela fornece estru-
turas de dados eficientes para lidar com arrays multidimensionais e funções matemáticas de
alto desempenho.

• Pandas: Biblioteca que oferece estruturas de dados e ferramentas de análise de dados


fáceis de usar. O Pandas permite manipular e analisar dados de forma eficiente, incluindo
recursos para limpeza, filtragem, agregação e visualização.

• Matplotlib: Biblioteca de visualização de dados em 2D que permite criar gráficos


estáticos, gráficos interativos e animações. É amplamente utilizada para criar gráficos de
linhas, barras, dispersão, histogramas, entre outros.

• Seaborn: Biblioteca de visualização estatística que funciona em conjunto com o Matplotlib.


Ela fornece uma interface de alto nível para criar gráficos estatísticos atraentes e informativos.

• Scikit-learn: Biblioteca de aprendizado de máquina em Python que oferece uma va-


riedade de algoritmos e ferramentas para tarefas de aprendizado supervisionado e não
supervisionado. É amplamente utilizada para tarefas como classificação, regressão, agrupa-
mento e seleção de recursos.

• TensorFlow: Biblioteca de aprendizado de máquina de código aberto desenvolvida pelo


Google. Ela permite criar e treinar modelos de aprendizado de máquina, especialmente
modelos de redes neurais profundas, de forma eficiente e escalável.

57
Bibliotecas 11.3. Mais bibliotecas

• Keras: Biblioteca de aprendizado de máquina de alto nível que funciona em conjunto


com o TensorFlow. Ela fornece uma interface simples e intuitiva para a construção e
treinamento de redes neurais.

• SciPy: Biblioteca que fornece um conjunto de algoritmos e funções matemáticas de


alto nível para ciência e engenharia. Ela abrange áreas como otimização, álgebra linear,
processamento de sinais, estatística, entre outros.

• Statsmodels: Biblioteca que fornece modelos estatísticos e ferramentas para análise de


dados. Ela inclui uma variedade de modelos de regressão, testes estatísticos e técnicas de
análise exploratória de dados.

• NLTK: Biblioteca de processamento de linguagem natural que fornece ferramentas e recursos


para tarefas como tokenização, stemming, lematização, marcação de partes do discurso,
entre outros.

Essas são apenas algumas das bibliotecas disponíveis para ciência de dados em Python. Cada
uma delas possui sua própria funcionalidade e pode ser combinada para realizar análises complexas
e sofisticadas.
Instalando bibliotecas de terceiros
Bibliotecas de terceiros precisam ser instaladas, a grande maioria delas é distribuída pelo
o sistema de gerenciamento de pacotes padrão para Python, o pip. Ele permite que você
instale, atualize e remova bibliotecas de terceiros de forma fácil e eficiente. O pip é uma
ferramenta de linha de comando que vem pré-instalada com a maioria das distribuições do
Python.
Para utiliza-la em linha de comando a sintaxe é:

pip install nome_da_biblioteca

Ou:

python -m pip install nome_da_biblioteca

As bibliotecas disponíveis para instalação via pip estão listadas no PyPI (Python Package
Index). O PyPI é o repositório de pacotes Python mais popular, mas outros repositórios
tambem podem ser utilizados pelo pip. Nele, você pode encontrar informações sobre
diferentes bibliotecas, incluindo documentação, exemplos de uso, versões disponíveis e links
para download.
O Google Colaboratory já possui instalado a grande maioria das bibliotecas de terceiros
utilizadas para ciência de dados, porém caso seja necessário instalar mais alguma também é
possível, como no exemplo:

!pip install ktrain

Exemplo 11.3.1. Usando a biblioteca pandas

1 import pandas as pd
2
3 # Criando um DataFrame a partir de um dicionário
4 data = {'Nome': ['João', 'Maria', 'Pedro', 'Ana'],
5 'Idade': [25, 30, 35, 28],

58
Bibliotecas 11.3. Mais bibliotecas

6 'Cidade': ['São Paulo', 'Rio de Janeiro', 'Belo


Horizonte', 'Curitiba']}
7
8 df = pd.DataFrame(data)
9
10 # Imprimindo o DataFrame
11 print(df)
12
13 # Acessando colunas específicas do DataFrame
14 print(df['Nome'])
15
16 # Filtrando linhas do DataFrame com base em uma condição
17 filtro = df['Idade'] > 28
18 print(df[filtro])
19
20 # Adicionando uma nova coluna ao DataFrame
21 df['Sexo'] = ['Masculino', 'Feminino', 'Masculino', 'Feminino']
22 print(df)
23
24 # Realizando operações estatísticas no DataFrame
25 print(df.describe())
26
27 # Salvando o DataFrame em um arquivo CSV
28 df.to_csv('dados.csv', index=False)

Neste exemplo, importamos a biblioteca pandas e a renomeamos como pd. Em seguida,


criamos um DataFrame a partir de um dicionário de dados. Demonstramos como acessar
colunas específicas do DataFrame, filtrar linhas com base em uma condição, adicionar uma
nova coluna ao DataFrame e realizar operações estatísticas. Por fim, salvamos o DataFrame
em um arquivo CSV (tipo de arquivo muito utilizado para armazenar tabelas de dados)
utilizando a função to_csv(). O pandas oferece uma ampla gama de funcionalidades para
manipulação e análise de dados, facilitando o trabalho com conjuntos de dados estruturados.

Exemplo 11.3.2. Usando a biblioteca numpy

1 import numpy as np
2
3 # Criando um array unidimensional
4 arr1 = np.array([1, 2, 3, 4, 5])
5
6 # Imprimindo o array
7 print(arr1)
8 # Saída: [1 2 3 4 5]
9
10 # Criando um array bidimensional
11 arr2 = np.array([[1, 2, 3], [4, 5, 6]])
12
13 # Imprimindo o array
14 print(arr2)

59
Bibliotecas 11.3. Mais bibliotecas

15 # Saída:
16 # [[1 2 3]
17 # [4 5 6]]
18
19 # Acessando elementos específicos do array
20 print(arr2[0, 1])
21 # Saída: 2
22
23 # Realizando operações matemáticas com o array
24 arr3 = np.array([1, 2, 3])
25 arr4 = np.array([4, 5, 6])
26
27 # Soma dos arrays
28 soma = arr3 + arr4
29 print(soma)
30 # Saída: [5 7 9]
31
32 # Produto dos arrays
33 produto = arr3 * arr4
34 print(produto)
35 # Saída: [4 10 18]
36
37 # Calculando a média dos elementos do array
38 media = np.mean(arr4)
39 print(media)
40 # Saída: 5.0
41
42 # Fazendo uma operação em todos os elementos do array
43 dobro = arr1 * 2
44 print(dobro)
45 # Saída: [ 2 4 6 8 10]

Neste exemplo, importamos a biblioteca NumPy e a renomeamos como np. Em seguida,


criamos diferentes arrays usando a função np.array(). Demonstramos operações matemáticas
básicas, como soma e multiplicação de arrays, cálculo da média e do desvio padrão, além
de acesso e manipulação de elementos específicos do array. Também utilizamos a função
np.random.rand() para gerar um array com valores aleatórios e a função np.mean() para
calcular a média dos elementos de um array. Esses são apenas alguns exemplos de uso da
biblioteca NumPy, que oferece uma ampla gama de funcionalidades para trabalhar com
arrays e realizar cálculos numéricos eficientes.

60
12 NumPy, parte 1
O NumPy é uma biblioteca fundamental para computação científica em Python. Ela fornece
suporte para arrays multidimensionais e uma ampla gama de funções matemáticas que podem ser
aplicadas a esses arrays.
Com o NumPy, é possível realizar operações matemáticas de maneira eficiente, manipular dados
de forma eficaz e realizar cálculos complexos de maneira rápida. Ele também oferece recursos
avançados, como transposição e reformatação de arrays, indexação e fatiamento, manipulação de
dados booleanos, ordenamento e funções de conjunto.
O NumPy é amplamente utilizado em áreas como ciência de dados, processamento de imagens,
simulações e modelagem matemática. É uma biblioteca essencial para qualquer pessoa que
trabalhe com análise numérica e computação científica em Python.

§12.1 Arrays NumPy


A biblioteca NumPy oferece suporte a arrays multidimensionais, que são estruturas de dados
eficientes e poderosas para armazenar e manipular dados numéricos. Os arrays NumPy são
homogêneos, ou seja, todos os elementos devem ser do mesmo tipo de dados. Eles fornecem uma
maneira eficiente de realizar operações matemáticas em grande escala.
Para criar um array NumPy, podemos usar a função numpy.array() e fornecer uma lista de
elementos.

array = np.array([1, 2, 3, 4, 5])

Além disso, o NumPy fornece uma série de funções e métodos para realizar operações com
arrays, como cálculos estatísticos, ordenamento, reformatação, entre outros. Essas funcionalidades
tornam o NumPy uma biblioteca essencial para computação científica e análise de dados em
Python.
Arrays unidimencionais, como o exemplo acima, podem ser acessadas de maneira similar a
listas:

print(array[2]) # Saída: 3

§12.2 Operações com Arrays


É possível aplicar os operadores aritméticos do Python a arrays NumPy, a principal característica
dessa aplicação é que os operadores são aplicados elemento a elemento nos arrays, ou seja, cada
elemento do array é combinado com o elemento correspondente do outro array, resultando em um
novo array com os resultados das operações.
Isso significa que, ao realizar uma operação aritmética entre dois arrays, como adição, subtração,
multiplicação ou divisão, cada elemento do primeiro array será combinado com o elemento
correspondente do segundo array para obter o resultado. Dessa forma, o tamanho dos arrays deve
ser compatível para que a operação possa ser realizada adequadamente.

61
NumPy, parte 1 12.2. Operações com Arrays

Exemplo 12.2.1. Operações aritméticas com arrays

1 import numpy as np
2
3 # Criando dois arrays
4 array1 = np.array([1, 2, 3])
5 array2 = np.array([4, 5, 6])
6
7 # Adição de arrays
8 resultado_soma = array1 + array2
9 print(resultado_soma)
10 # Saída: [5 7 9]
11
12 # Subtração de arrays
13 resultado_subtracao = array1 - array2
14 print(resultado_subtracao)
15 # Saída: [-3 -3 -3]
16
17 # Multiplicação de arrays
18 resultado_multiplicacao = array1 * array2
19 print(resultado_multiplicacao)
20 # Saída: [4 10 18]
21
22 # Divisão de arrays
23 resultado_divisao = array1 / array2
24 print(resultado_divisao)
25 # Saída: [0.25 0.4 0.5]

Nesse exemplo, cada operação é realizada elemento a elemento nos arrays array1 e
array2, resultando nos novos arrays:

• resultado_soma

• resultado_subtracao

• resultado_multiplicacao

• resultado_divisao

Essa capacidade de aplicar operadores aritméticos a arrays no NumPy facilita a realização


de cálculos e operações matemáticas em conjuntos de dados de forma rápida e eficiente.

Também é possível aplicar os operadores aritméticos entre arrays e valores escalares. Neste
caso o resultado é uma nova array, do mesmo tamanho da array original, onde cada elemento é o
respectivo elemento da array original operado com o valor escalar.

62
NumPy, parte 1 12.3. Arrays multidimencionais

Exemplo 12.2.2. Aplicando operadores entre arrays e escalares

1 import numpy as np
2
3 # Criando um array NumPy
4 array = np.array([1, 2, 3, 4, 5])
5
6 # Multiplicando o array por um valor escalar
7 result1 = array * 2
8
9 # Dividindo o array por um valor escalar
10 result2 = array / 3
11
12 # Somando o array com um valor escalar
13 result3 = array + 10
14
15 # Subtraindo um valor escalar do array
16 result4 = array - 2
17
18 # Imprimindo os resultados
19 print(result1) # Saída: [2, 4, 6, 8, 10]
20 print(result2) # Saída: [0.33333333, 0.66666667, 1.0,
1.33333333, 1.66666667]
21 print(result3) # Saída: [11, 12, 13, 14, 15]
22 print(result4) # Saída: [-1, 0, 1, 2, 3]

Neste exemplo, criamos um array NumPy com os valores de 1 a 5. Em seguida, aplicamos


operadores aritméticos para realizar operações entre o array e valores escalares.
No caso do result1, multiplicamos cada elemento do array por 2, resultando em
[2, 4, 6, 8, 10]. No result2, dividimos cada elemento do array por 3. No result3,
somamos 10 a cada elemento do array. E no result4, subtraímos 2 de cada elemento do
array.

§12.3 Arrays multidimencionais


Além de arrays unidimensionais, o NumPy também suporta arrays multidimensionais, que podem
ter duas ou mais dimensões. Esses arrays são essenciais para representar dados em forma de
matrizes ou tensores, comumente utilizados em problemas de ciência de dados e computação
científica.
Para criar um array multidimensional, podemos passar uma lista de listas como argumento
para a função numpy.array(). Cada lista interna representa uma linha da matriz e deve ter o
mesmo número de elementos.

array2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

Podemos acessar elementos específicos de um array multidimensional usando índices. Os


índices seguem a notação [linha, coluna], em que a primeira dimensão refere-se às linhas e
a segunda dimensão refere-se às colunas.

print(array2d[0, 1]) # Acessando a primeira linha e segunda coluna (2)

63
NumPy, parte 1 12.3. Arrays multidimencionais

Para acessar mais dimensões é só colocar os índices necessários separados por virgula.
O formato de uma array pode ser acessado pelo atributo shape:

array2d.shape # (3, 3)

Este atributo armazena uma tupla onde cada posição é o comprimento da array no respectivo
eixo.

Exemplo 12.3.1. Operações com arrays multidimensionais

1 # Define dois arrays


2 array1 = np.array([[1, 2], [3, 4]])
3 array2 = np.array([[5, 6], [7, 8]])
4
5 # Soma dos arrays
6 resultado_soma = array1 + array2
7 print(resultado_soma)
8
9 # Multiplicação dos arrays
10 resultado_multiplicacao = array1 * array2
11 print(resultado_multiplicacao)

Primeiramente, são criados dois arrays multidimensionais array1 e array2 utilizando


a função numpy.array(). Em seguida, são realizadas operações de soma e multiplicação
com esses arrays.

Os exemplos 12.2.1 e 12.3.1 ilustram como as operações aritméticas são aplicadas elemento a
elemento em arrays no NumPy. Essa capacidade de realizar operações com eficiência em grandes
conjuntos de dados é uma das principais vantagens do uso do NumPy para computação científica
e análise de dados.
Mais formas para criação de arrays NumPy
Além da função np.array(), existem várias maneiras de criar arrays NumPy, algumas
delas são:

• numpy.zeros(): cria um array NumPy preenchido com zeros. É possível especificar


o número de elementos (para arrays multidimensionais passar uma tupla com o tamanho
da array em cada dimensão) e o tipo de dados:

zeros_array = np.zeros((3, 4), dtype=int)

Nesse exemplo, é criado um array bidimensional de 3 linhas e 4 colunas, preenchido


com zeros inteiros.

• numpy.ones(): cria um array NumPy preenchido com uns. É possível especificar o


número de elementos e o tipo de dados:

ones_array = np.ones(10, dtype=float)

Nesse exemplo, é criado um array unidimensional de 10 elementos, preenchido com uns


do tipo float.

• numpy.arange(): cria um array NumPy com valores sequenciais em um intervalo

64
NumPy, parte 1 12.4. Indexação e fatiamento

especificado. É possível definir o valor inicial, o valor final e o incremento, de maneira


similar a função range():

arange_array = np.arange(0, 10, 2)

Nesse exemplo, é criado um array unidimensional com valores de 0 a 8 (exclusivo), com


incremento de 2: [0, 2, 4, 6, 8].

• numpy.linspace(): cria um array NumPy com valores igualmente espaçados em


um intervalo especificado. É possível definir o valor inicial, o valor final e o número de
elementos desejados:

linspace_array = np.linspace(0, 1, 5)

Nesse exemplo, é criado um array unidimensional com 5 elementos, espaçados igualmente


entre 0 e 1: [0. , 0.25, 0.5 , 0.75, 1.].

Esses são apenas alguns dos métodos disponíveis para criar arrays NumPy. Cada método
possui seus próprios parâmetros e opções, permitindo a criação flexível de arrays para atender
às necessidades específicas de cada aplicação.

§12.4 Indexação e fatiamento


A indexação em arrays NumPy funciona de forma semelhante à indexação em listas Python.
Os índices são baseados em zero, o que significa que o primeiro elemento do array tem o índice
0. Para acessar um elemento específico, basta utilizar o índice ou fatiamento desejado entre
colchetes. Em arrays multidimensionais a indexação segue o mesmo princípio, utilizando colchetes
e separando os índices/fatiamentos por vírgulas.

Exemplo 12.4.1. Indexando e fatiando arrays.

1 import numpy as np
2
3 # Criação dos arrays
4 array1d = np.array([1, 2, 3])
5 array2d = np.array([[3, 5, 2], [4, 2, 1], [0, 1, 3]])
6
7 # Acessando elementos específicos
8 print(array1d[1]) # Deve imprimir: 2
9 print(array2d[1, 0]) # Deve imprimir: 4
10 print(array2d[2, 0]) # Deve imprimir: 0
11
12 # Fatiamento dos arrays
13 print(array1d[0:2]) # Deve imprimir: [1, 2]
14 print(array2d[0:2, 1:3]) # Deve imprimir: [[5, 2], [2, 1]]
15
16 # Acessando uma coluna inteira de um array bidimensional
17 print(array2d[:, 1]) # Deve imprimir: [5, 2, 1]
18
19 # Acessando uma linha inteira de um array bidimensional

65
NumPy, parte 1 12.4. Indexação e fatiamento

20 print(array2d[0, :]) # Deve imprimir: [3, 5, 2]

Neste exemplo, são criados dois arrays numpy: array1d, que é unidimensional, e array2d,
que é bidimensional. Em seguida, são demonstradas diferentes formas de acessar elementos
ou subconjuntos desses arrays.
Primeiramente, são utilizados os índices para acessar elementos específicos dos arrays,
sendo impressos os valores 2, 1 e 0.
Em seguida, são realizados fatiamentos nos arrays, imprimindo diferentes subconjuntos de
elementos.
Por fim, é demonstrado como acessar uma coluna inteira de um array bidimensional,
resultando em [5, 2, 3], e como acessar uma linha inteira de um array bidimensional,
resultando em [3, 5, 2]. Esses exemplos ilustram a flexibilidade do numpy para acessar
e manipular elementos em arrays multidimensionais.

§12.4.2 Indexação booleana


Os operadores relacionais também podem ser utilizados comparar valores em arrays NumPy. Neste
caso o operador é aplicado elemento a elemento, como nos operadores aritiméticos e retornam um
array booleano, onde cada elemento indica se a condição é verdadeira ou falsa para o respectivo
elemento dos arrays originais.

Exemplo 12.4.3. Operadores relacionais aplicados em arrays

1 import numpy as np
2
3 # Criando arrays para serem comparadas
4 array1 = np.array([1, 2, 3, 7, 8])
5 array2 = np.array([2, 3, 4, 5, 6])
6
7 # Comparando os elementos dos arrays
8 resultado = array1 > array2
9 print(resultado) # Saída: [False False False True True]

Nesse exemplo, o operador > é aplicado elemento a elemento nos arrays array1 e array2.
Como nenhum elemento de array1 é maior do que o elemento correspondente de array2,
o resultado é um array booleano com os valores: [False False False True True].

Os arrays booleanos gerados pela aplicação de operadores relacionais com arrays podem ser
utilizados para indexar os mesmos arrays. Esta é uma técnica para acessar e manipular elementos
com base em uma condição booleana. Nesse tipo de indexação, criamos uma máscara booleana,
que é a array booleana resultante de um operador relacional, e que especifica quais elementos do
array original queremos acessar ou modificar.

Exemplo 12.4.4. Usando indexação booleana

1 import numpy as np
2
3 # Criando um array NumPy
4 array = np.array([1, 2, 3, 4, 5])
5
6 # Criando uma máscara booleana para selecionar os elementos

66
NumPy, parte 1 12.5. Transposição e Reformatação

maiores que 3
7 mask = array > 3
8
9 # Aplicando a máscara para obter apenas os elementos que atendem à
condição
10 filtered_array = array[mask]
11
12 # Imprimindo o resultado
13 print(filtered_array) # Saída: [4, 5]
14
15 # Modificando os valores dos elementos maiores que 3 para 0
16 array[array > 3] = 0
17
18 # Imprimindo o array modificado
19 print(array) # Saída: [1, 2, 3, 0, 0]

Neste exemplo, criamos um array NumPy com os valores de 1 a 5. Em seguida, criamos


uma máscara booleana utilizando a expressão array > 3, que retorna um array de valores
booleanos indicando quais elementos são maiores que 3.
A máscara resultante é [False, False, False, True, True], indicando que ape-
nas os dois últimos elementos do array atendem à condição. Em seguida, aplicamos essa
máscara para selecionar apenas os elementos que são maiores que 3, utilizando array[mask].
O resultado é o array [4, 5].
Em seguida, utilizamos a indexação booleana para modificar os valores dos elementos
maiores que 3 para 0, utilizando array[array > 3] = 0 (observe que nesse caso a
máscara boolena foi criada no momento do uso). Após essa operação, o array resultante é
[1, 2, 3, 0, 0].

§12.5 Transposição e Reformatação


A biblioteca NumPy oferece funcionalidades para transposição e reformatação de arrays, permi-
tindo manipular a forma e a organização dos dados.
A transposição de um array é obtida utilizando o método transpose() ou o atributo T. Esse
processo troca as linhas pelas colunas, de modo que os elementos que antes estavam nas linhas
agora estão nas colunas e vice-versa.

Exemplo 12.5.1. Transposição de um array

1 import numpy as np
2
3 # Criando um array bidimensional
4 array2d = np.array([[1, 2, 3], [4, 5, 6]])
5
6 # Aplicando a transposição ao array
7 array_transposed = array2d.transpose()
8 # Ou ewuivalente:
9 # array_transposed = array2d.T
10
11 # Imprimindo o array original
12 print("Array original:")

67
NumPy, parte 1 12.5. Transposição e Reformatação

13 print(array2d)
14
15 # Imprimindo o array transposto
16 print("rray transposto:")
17 print(array_transposed)

Nesse exemplo, a transposição do array bidimensional array2d é realizada, resultando


em um novo array onde as linhas e colunas foram invertidas.

A reformatação de um array é obtida utilizando o método reshape(). Esse método permite


alterar a forma do array, redimensionando-o de acordo com a quantidade de elementos desejada.
É importante que o número de elementos do array seja compatível com a nova forma especificada.

Exemplo 12.5.2. Reformatação de um array

1 import numpy as np
2
3 # Criando um array unidimensional
4 array1d = np.array([1, 2, 3, 4, 5, 6])
5
6 # Reformatando o array para uma matriz de 2 linhas e 3 colunas
7 array_reshaped = array1d.reshape(2, 3)
8
9 # Imprimindo o array original
10 print("Array original:")
11 print(array1d)
12 # [1 2 3 4 5 6]
13
14 # Imprimindo o array reformatado
15 print("\nArray reformatado:")
16 print(array_reshaped)
17 # [[1 2 3]
18 # [4 5 6]]

Nesse exemplo, a reformatação do array array1d é realizada, resultando em um novo


array unidimensional com 2 linhas e 3 colunas. Os elementos do array original são distribuídos
na nova estrutura de acordo com a ordem de indexação.

A transposição e a reformatação de arrays são operações úteis para ajustar a organização dos
dados de acordo com as necessidades de análise e manipulação.

68
13 NumPy, parte 2
§13.1 Funções Universais
As funções universais (ufuncs) no NumPy são funções que operam em ndarrays de uma maneira
element-wise, o que significa que elas são aplicadas de forma independente a cada elemento de
um array. Essas funções são fundamentais para o NumPy, pois proporcionam uma abstração de
alto nível para operações eficientes em arrays de dados.
As funções universais são tipicamente muito mais eficientes do que as operações equivalentes
em Python puro, pois elas são implementadas em C, que é muito mais rápido do que Python
para operações de baixo nível.
Algumas das funções universais mais úteis no NumPy incluem:

• Funções matemáticas: add, subtract, multiply, divide, log, exp, sqrt, sin,
cos, tan, etc. Essas funções realizam operações matemáticas básicas e funções elementares.
• Funções de agregação: sum, prod, cumsum, cumprod, mean, std, var, etc. Essas
funções fornecem estatísticas básicas sobre o conteúdo de um array.
• Funções de comparação|: greater, less, equal, not_equal, greater_equal,
less_equal. Essas funções permitem comparar elementos de dois arrays e retornar um
array de booleans.
• Funções lógicas: logical_and, logical_or, logical_not, etc. Essas funções
realizam operações lógicas em arrays booleanos.
• Funções de binárias: bitwise_and, bitwise_or, bitwise_xor, invert, etc. Es-
sas funções permitem manipular a representação binária de inteiros.
• Funções de arredondamento: around, floor, ceil, etc. Essas funções permitem
arredondar os valores em um array para o número inteiro mais próximo, para o inteiro mais
próximo abaixo ou para o inteiro mais próximo acima, respectivamente.

Essas são apenas algumas das muitas funções universais disponíveis no NumPy. Para obter a
lista completa, você pode consultar a documentação oficial do NumPy.
https://numpy.org/doc/stable/reference/ufuncs.html.

Exemplo 13.1.1. Utilizando funções universais

1 import numpy as np
2
3 # Criando um array 1D
4 arr = np.array([1, 2, 3, 4, 5])
5
6 # Usando a função matemática sqrt (raiz quadrada)
7 sqrt_arr = np.sqrt(arr)
8 print(f"Raiz quadrada do array: {sqrt_arr}")
9 # Raiz quadrada do array: [1. 1.41421356 1.73205081 2.
2.23606798]
10
11 # Usando a função de agregação sum (soma)

69
NumPy, parte 2 13.2. Funções de Álgebra Linear

12 sum_arr = np.sum(arr)
13 print(f"Soma dos elementos do array: {sum_arr}")
14 # Soma dos elementos do array: 15
15
16 # Usando a função de comparação less (menor que)
17 less_arr = np.less(arr, 4)
18 print(f"Elementos do array menores que 4: {less_arr}")
19 # Elementos do array menores que 4: [ True True True False
False]
20
21 # Usando a função lógica logical_not (negação lógica)
22 not_arr = np.logical_not(less_arr)
23 print(f"Negação lógica do array anterior: {not_arr}")
24 # Negação lógica do array anterior: [False False False True
True]

Esse exemplo começa criando um array 1D com 5 elementos. Em seguida, ele utiliza a
função np.sqrt para calcular a raiz quadrada de cada elemento do array. A função np.sum
é usada para calcular a soma de todos os elementos do array. A função np.less é usada
para criar um novo array booleano, onde cada elemento é True se o elemento correspondente
no array original é menor que 4 e False caso contrário. Por fim, a função np.logical_not
é usada para inverter os valores booleanos do array criado pela função np.less.

§13.2 Funções de Álgebra Linear


As funções de álgebra linear fornecem a capacidade de realizar uma variedade de operações de
álgebra linear eficientemente. Essas funções estão localizadas no submódulo numpy.linalg e
incluem várias funções que são essenciais para a realização de cálculos matemáticos complexos.
Aqui estão algumas das funções de álgebra linear mais comumente usadas no NumPy:

• dot(a, b): Calcula o produto de dois arrays. Se os arrays a e b forem ambos matrizes
1-D, a função ‘dot‘ irá realizar uma multiplicação de matrizes.

• vdot(a, b): Esta função retorna o produto escalar de dois vetores. É a soma dos produtos
dos elementos correspondentes dos dois vetores.

• inner(a, b): Esta função retorna o produto interno de dois arrays.

• matmul(a, b): Esta função retorna o produto matricial de dois arrays.

• trace(a): Retorna a soma dos elementos da diagonal principal de um array 2-D (uma
matriz).

• det(a): Calcula o determinante de uma matriz.

• eig(a): Calcula os autovalores e autovetores de uma matriz.

• inv(a): Calcula a inversa de uma matriz.

• solve(a, b): Resolve o sistema linear de equações ‘ax = b‘ para x, onde a é uma matriz
e b é um vetor.

• lstsq(a, b): Retorna a solução de mínimos quadrados para um sistema linear.

70
NumPy, parte 2 13.3. Funções de Operações de Conjunto

Estas funções podem ser extremamente úteis para realizar cálculos complexos de forma eficiente.
Por exemplo, a função solve pode ser usada para resolver sistemas de equações lineares, enquanto
a função eig pode ser usada para calcular os autovalores e autovetores de uma matriz, o que é
útil em uma variedade de aplicações, incluindo a solução de problemas de valor próprio.

§13.3 Funções de Operações de Conjunto


As funções de operações de conjunto são úteis para manipular e analisar conjuntos de dados. O
NumPy fornece um conjunto de funções para realizar operações de conjunto em arrays. Essas
funções são particularmente úteis para trabalhar com arrays de dados únicos e ordenados.
Aqui estão algumas das funções de operações de conjunto mais comumente usadas no NumPy:

• np.unique(a): Esta função retorna os elementos únicos de um array, ordenados.


• np.in1d(a, b): Esta função retorna um array booleano que indica se cada elemento do
array ‘a‘ está contido no array ‘b‘.
• np.intersect1d(a, b): Esta função retorna a interseção ordenada de dois arrays, ou
seja, os elementos comuns a ambos os arrays.
• np.setdiff1d(a, b): Esta função retorna a diferença de conjunto de dois arrays, ou
seja, os elementos em ‘a‘ que não estão em ‘b‘.
• np.union1d(a, b): Esta função retorna a união de dois arrays, ou seja, todos os
elementos únicos em ambos os arrays.
• np.setxor1d(a, b): Esta função retorna a diferença simétrica de dois arrays, ou seja,
os elementos que estão em um dos arrays, mas não em ambos.

Estas funções podem ser extremamente úteis para analisar conjuntos de dados e encontrar
interseções, diferenças e similaridades entre diferentes conjuntos de dados.

Exemplo 13.3.1. Utilizando funções de operações de conjunto

1 import numpy as np
2
3 # Definindo dois arrays
4 array1 = np.array([1, 2, 3, 4, 5])
5 array2 = np.array([4, 5, 6, 7, 8])
6
7 # Encontrando os valores únicos do primeiro array
8 unique_values = np.unique(array1)
9 print("Valores únicos do primeiro array:", unique_values)
10
11 # Verificando quais elementos do primeiro array estão presentes
no segundo array
12 _
in second = np.in1d(array1, array2)
13 print("Elementos do primeiro array presentes no segundo:",
in_second)
14
15 # Encontrando elementos comuns aos dois arrays
16 common_elements = np.intersect1d(array1, array2)
17 print("Elementos comuns aos dois arrays:", common_elements)

71
NumPy, parte 2 13.4. Geração de números pseudoaleatórios

18
19 # Encontrando elementos no primeiro array que não estão no
segundo array
20 diff_elements = np.setdiff1d(array1, array2)
21 print("Elementos do primeiro array que não estão no segundo:",
diff_elements)
22
23 # Combinando os elementos de ambos os arrays
24 union_elements = np.union1d(array1, array2)
25 print("Combinação de ambos os arrays:", union_elements)
26
27 # Encontrando elementos que estão em um dos arrays, mas não em
ambos
28 _
xor elements = np.setxor1d(array1, array2)
29 print("Elementos que estão em um dos arrays, mas não em ambos:",
xor_elements)

Neste exemplo, dois arrays são definidos inicialmente. A função np.unique é usada para
encontrar os valores únicos no primeiro array. A função np.in1d é usada para verificar
quais elementos do primeiro array estão presentes no segundo. A função np.intersect1d
é usada para encontrar os elementos comuns aos dois arrays. A função np.setdiff1d é
usada para encontrar os elementos presentes no primeiro array e que não estão no segundo.
A função np.union1d é usada para combinar os elementos de ambos os arrays, mantendo
apenas uma ocorrência de cada elemento único. Por fim, a função np.setxor1d é usada
para encontrar os elementos que estão presentes em um dos arrays, mas não em ambos.

§13.4 Geração de números pseudoaleatórios


Números aleatórios são um recurso fundamental em muitas áreas da ciência da computação, desde
a simulação e modelagem, passando por machine learning, até a criptografia. No entanto, verda-
deiramente números aleatórios são difíceis de gerar em um computador, que é fundamentalmente
uma máquina determinística. Por isso, usamos números pseudoaleatórios, que são gerados por
algoritmos determinísticos, mas parecem estatisticamente aleatórios.
O módulo NumPy fornece várias funções para gerar números pseudoaleatórios, através do
submódulo numpy.random. Alguns dos métodos mais comuns incluem:

• np.random.rand(): Gera números aleatórios uniformemente distribuídos no intervalo


[0, 1).

• np.random.randn(): Gera números aleatórios a partir de uma distribuição normal


padrão (média 0, desvio padrão 1).

• np.random.randint(low, high=None, size=None): Gera números inteiros alea-


tórios a partir de um intervalo especificado.

• np.random.choice(a, size=None, replace=True, p=None): Gera uma amos-


tra aleatória de um array 1-D especificado. Você pode especificar se a amostragem é com
ou sem reposição e as probabilidades associadas a cada entrada.

• np.random.seed(): Inicializa o gerador de números aleatórios. Se você definir a semente,


pode obter uma sequência reprodutível de números pseudoaleatórios.

72
NumPy, parte 2 13.4. Geração de números pseudoaleatórios

Exemplo 13.4.1. Gerando números pseudoaleatórios

1 import numpy as np
2
3 # Configurando a semente do gerador de números aleatórios
4 np.random.seed(0)
5
6 # Criando um array de 5 números aleatórios uniformemente
distribuídos entre 0 e 1
7 random_array1 = np.random.rand(5)
8 print("Array de 5 números aleatórios uniformemente distribuídos
entre 0 e 1:", random_array1)
9
10 # Criando um array 2x2 de números aleatórios a partir de uma
distribuição normal padrão
11 random_array2 = np.random.randn(2, 2)
12 print("Array 2x2 de números aleatórios a partir de uma
distribuição normal padrão:", random_array2)
13
14 # Gerando um único número inteiro aleatório entre 0 e 10
15 random_int = np.random.randint(0, 10)
16 print("Número inteiro aleatório entre 0 e 10:", random_int)
17
18 # Selecionando três elementos aleatoriamente de um dado array
19 array = np.array([10, 20, 30, 40, 50])
20 random_choice = np.random.choice(array, 3)
21 print("Três elementos selecionados aleatoriamente do array:",
random_choice)

Este exemplo começa configurando a semente do gerador de números aleatórios para 0


com np.random.seed(0). Isso garante que a sequência de números pseudoaleatórios
gerados será a mesma sempre que o código for executado. Em seguida, cria um array de
5 números aleatórios uniformemente distribuídos entre 0 e 1 com np.random.rand(5).
Depois, cria um array 2x2 de números aleatórios a partir de uma distribuição normal padrão
com np.random.randn(2, 2). O código então gera um único número inteiro aleatório
entre 0 e 10 com
np.random.randint(0, 10) e seleciona três elementos aleatoriamente de um dado array
com np.random.choice.

Lembre-se de que a geração de números aleatórios pode ter um impacto significativo nos resultados
de seu código, especialmente em algoritmos de machine learning, que podem depender fortemente
de inicializações aleatórias. Portanto, é importante entender como usar corretamente o módulo
de números aleatórios do NumPy.

73
14 Captura de erros, manipulação de
arquivos e simulações
§14.1 Captura de erros
Capturar erros é uma prática essencial em programação para lidar com exceções ou erros que
possam ocorrer durante a execução do código. Isso é especialmente útil quando lidamos com
entradas do usuário ou quando executamos operações que podem falhar sob certas condições.
Python fornece a estrutura try/except para capturar e lidar com erros. A ideia básica é
que o código que pode causar um erro é colocado dentro de um bloco try, e se ocorrer um erro,
o fluxo do programa é imediatamente transferido para o bloco except. A sintaxe básica dessa
estrutura é:

1 try:
2 # Cógigo que pode causar algum erro
3 except Execption: # Ou 'except:' para não especificar uma exceção
4 # Código para ser executado caso ocorra um erro

Exemplo 14.1.1. Capturando divisão por zero

1 def divide_numbers(a, b):


2 try:
3 result = a / b
4 return result
5 except ZeroDivisionError:
6 print("Erro: Divisão por zero não é permitida.")
7 return None
8
9 # Exemplo de uso da função
10 print(divide_numbers(10, 2)) # Saída: 5.0
11 print(divide_numbers(10, 0)) # Saída: Erro: Divisão por zero não
é permitida. None

Neste exemplo, uma função é definida para dividir dois números. A operação de divisão
é colocada dentro de um bloco try, pois ela pode lançar um ZeroDivisionError se o
divisor for zero. Se esse erro ocorrer, uma mensagem de erro personalizada é impressa e a
função retorna None.

Além de capturar exceções específicas, é possível capturar múltiplas exceções em um único


bloco except, fornecendo as exceções como uma tupla:

except (ZeroDivisionError, TypeError):

Ou criando múltiplos blocos except cada um com um bloco de código para ser executado no
caso de cada exceção.

74
Captura de erros, manipulação de arquivos e simulações 14.1. Captura de erros

Exemplo 14.1.2. Capturando múltiplas exceções

1 def calculate_inverse(number):
2 try:
3 inverse = 1 / number
4 return inverse
5 except ZeroDivisionError:
6 print("Erro: Divisão por zero não é permitida.")
7 return None
8 except TypeError:
9 print("Erro: O número fornecido não pode ser invertido.")
10 return None
11
12 # Exemplo de uso da função
13 print(calculate_inverse(2)) # Saída: 0.5
14 print(calculate_inverse(0)) # Saída: Erro: Divisão por zero
não é permitida. None
15 print(calculate_inverse("abc")) # Saída: Erro: O número fornecido
não pode ser invertido. None

Neste exemplo, uma função é definida para calcular o inverso de um número. A operação
para calcular o inverso é colocada dentro de um bloco try, pois ela pode lançar um
ZeroDivisionError se o número for zero ou um TypeError se o número não for um
tipo que possa ser invertido. Se qualquer uma dessas exceções ocorrer, uma mensagem de
erro personalizada é impressa e a função retorna None.

A estrutura try/except pode ser estendida com os blocos else e/ou finally. O bloco
else é executado se nenhuma exceção ocorrer no bloco try. O bloco finally é sempre
executado, independentemente de uma exceção ser lançada ou não.

1 try:
2 # Cógigo que pode causar algum erro
3 except: # Ou except Execption:
4 # Código para ser executado em caso de excessões
5 else:
6 # Código para ser executado caso não ocorra excessões
7 finally:
8 # Código que sempre será executado

Exemplo 14.1.3. Utilizando else e finally

1 def divide_numbers(a, b):


2 try:
3 result = a / b
4 except ZeroDivisionError:
5 print("Erro: Divisão por zero não é permitida.")
6 else:
7 print(f"Divisão: {a} / {b} = {result}")
8 finally:

75
Captura de erros, manipulação de arquivos e simulações 14.1. Captura de erros

9 print("Operação finalizada.")
10
11 # Exemplo de uso da função
12 divide_numbers(10, 2) # Saída: Divisão: 10 / 2 = 5.0, Operação
finalizada.
13 divide_numbers(10, 0) # Saída: Erro: Divisão por zero não é
permitida., Operação finalizada.

Neste exemplo, uma função é definida para dividir dois números. Se nenhuma exceção
for lançada durante a operação de divisão, a divisão será impressa graças ao bloco else.
Independente de uma exceção ter sido lançada ou não, o bloco finally é executado e
imprime uma mensagem.

§14.1.4 Identificando exceções


Identificar exceções é uma parte crucial da captura de erros. No Python, as exceções são erros
detectados durante a execução que não são fatais necessariamente. Python tem várias exceções
embutidas que são lançadas quando ocorrem erros comuns.
Algumas das exceções embutidas mais comuns no Python incluem:

• ImportError: É lançada quando um módulo ou um nome não pode ser importado.

• NameError: É lançada quando um nome de variável ou função não é encontrado no escopo


atual.

• IndexError: É lançada quando um índice de sequência está fora do intervalo.

• KeyError: É lançada quando uma chave de dicionário não existe.

• TypeError: É lançada quando uma operação ou função é aplicada a um objeto de tipo


inadequado.

• ValueError: É lançada quando uma operação ou função recebe um argumento com o tipo
correto, mas valor inapropriado.

• ZeroDivisionError: É lançada quando o segundo operador na operação de divisão ou


módulo é zero.

Para identificar as exceções corretas a serem capturadas, geralmente é útil entender o tipo de
erro que pode ocorrer. Se você não tem certeza de quais exceções um certo bloco de código pode
lançar, você pode capturar todas as exceções. Isso é feito usando a classe base Exception.

Exemplo 14.1.5. Capturando todas as exceções.

1 try:
2 # Código que pode gerar exceções
3 x = 10 / 0
4 print(x)
5 except Exception as e:
6 # Captura todas as exceções e imprime a mensagem
7 print("Ocorreu uma exceção:", str(e))

Neste exemplo, qualquer exceção que ocorra dentro do bloco try será capturada e sua

76
14.2. Leitura e escrita de arquivos
Captura de erros, manipulação de arquivos e simulações

mensagem será impressa contendo a exceção que foi levantada.

No entanto, tenha em mente que capturar todas as exceções não é uma prática recomendada.
É sempre melhor especificar as exceções exatas que você espera e sabe como lidar. Capturar
todas as exceções pode mascarar erros que você não previu e que podem precisar de atenção.

§14.2 Leitura e escrita de arquivos


A capacidade de ler e escrever arquivos é fundamental para muitos programas. No Python, você
pode usar a função nativa open para abrir um arquivo. Essa função retorna um objeto de arquivo
que fornece métodos e atributos que podem ser usados para ler, escrever e manipular o arquivo.
Para abrir um arquivo, você precisa especificar o caminho do arquivo e o modo de abertura. Os
modos mais comuns incluem r para leitura, w para escrita (apaga qualquer conteúdo existente),
a para anexar (adiciona ao final do arquivo) e x para criar um novo arquivo (lança um erro se o
arquivo já existir).

Exemplo 14.2.1. Abertura de um arquivo para leitura

1 file = open('file.txt', 'r')


2 content = file.read()
3 print(content)
4 file.close()

Neste exemplo, o arquivo file.txt é aberto para leitura e seu conteúdo é impresso. A
função read é usada para ler todo o conteúdo do arquivo.

Depois de abrir um arquivo, sempre lembre de fechá-lo quando terminar. Isso libera os recursos
do sistema que foram usados durante a manipulação do arquivo. Você pode usar o método close
para fechar um arquivo.

§14.2.2 Estrutura with


Uma maneira mais segura de trabalhar com arquivos é usando a estrutura with. Esta estrutura
garante que o arquivo será fechado corretamente mesmo se ocorrer uma exceção durante a
manipulação do arquivo.

Exemplo 14.2.3. Usando a estrutura with para trabalhar com arquivos

1 with open('file.txt', 'r') as file:


2 content = file.read()
3 print(content)

Neste exemplo, o arquivo file.txt é aberto para leitura dentro de um bloco with. O
conteúdo do arquivo é impresso e o arquivo é automaticamente fechado no final do bloco
with.

Além da leitura, você também pode escrever em um arquivo. Se você abrir um arquivo no modo
de escrita w, qualquer conteúdo existente será apagado. Se você quiser adicionar ao conteúdo
existente, use o modo de anexação a.

77
14.3. Simulações de probabilidades
Captura de erros, manipulação de arquivos e simulações

Exemplo 14.2.4. Escrevendo em um arquivo

1 with open('file.txt', 'a') as file:


2 file.write('\nNova linha')

Neste exemplo, uma nova linha é adicionada ao final do arquivo file.txt. A função
write é usada para escrever no arquivo.

§14.3 Simulações de probabilidades


Simulações de probabilidades são uma ferramenta que permitem modelar e analisar o comporta-
mento de sistemas aleatórios. Com a capacidade do Python de realizar cálculos complexos e a
biblioteca NumPy para eficiência numérica, podemos realizar simulações de probabilidades de
maneira eficaz.

§14.3.1 Simulando lançamento de moeda


Podemos simular o lançamento de uma moeda usando a função np.random.choice. Esta
função permite que você escolha aleatoriamente a partir de uma lista de opções.

Exemplo 14.3.2. Simulando lançamento de moeda

1 import numpy as np
2
3 # Definir as possibilidades
4 choices = ['Heads', 'Tails']
5
6 # Inicializar o dicionário que vai armazenar a contagem dos
resultados
7 results = {'Heads': 0, 'Tails': 0}
8
9 # Realizar o lançamento da moeda 1000 vezes
10 for _ in range(1000):
11 flip = np.random.choice(choices)
12 results[flip] += 1
13
14 print(results)

Neste exemplo, a função np.random.choice é usada para escolher aleatoriamente entre


’Heads’ e ’Tails’. Isso é feito 10 vezes, simbolizando 1000 lançamentos de uma moeda.
A contagem de quantas vezes cada resultado foi obtido é armazenado no dicionário results.

§14.3.3 Simulando lançamento de dados


Da mesma forma, podemos simular o lançamento de um dado usando a função np.random.randint.
Esta função retorna um número inteiro aleatório dentro do intervalo especificado.

Exemplo 14.3.4. Simulando lançamento de dados

78
14.3. Simulações de probabilidades
Captura de erros, manipulação de arquivos e simulações

1 import numpy as np
2
3 # Definir as possibilidades do dado
4 possibilities = [1, 2, 3, 4, 5, 6]
5
6 # Inicializar o dicionário que vai armazenar a contagem dos
resultados
7 results = {num: 0 for num in possibilities}
8
9 # Realizar o lançamento do dado 10 vezes
10 for _ in range(1000):
11 roll = np.random.randint(1, 7)
12 results[roll] += 1
13
14 print(results)

Neste exemplo, a função np.random.randint é usada para gerar um número aleatório


entre 1 e 6, simbolizando o lançamento de um dado.

§14.3.5 Problema de Monty Hall


O Problema de Monty Hall é um célebre problema probabilístico que foi ao ar no programa de
game show americano Let’s Make a Deal, nomeado após seu apresentador original, Monty Hall.
O problema pode ser descrito da seguinte forma:

1. Você está em um game show e há três portas. Atrás de uma das portas há um carro (o
prêmio principal), enquanto as outras duas portas têm cabras atrás delas (representando
prêmios indesejáveis).

2. Você escolhe uma porta, digamos a Porta 1. A sua escolha é inicialmente mantida fechada.

3. Em seguida, Monty, que sabe o que há atrás de cada porta, abre uma das outras duas
portas, digamos a Porta 3, revelando uma cabra. Ele não abre a porta que você escolheu
(Porta 1), nem a porta com o carro (a menos que você já tenha escolhido a porta do carro
inicialmente).

4. Agora, você tem uma escolha a fazer: ficar com a porta que escolheu inicialmente (Porta 1)
ou mudar para a outra porta que ainda está fechada (Porta 2).

O problema de Monty Hall incita à discussão pois, intuitivamente, pode parecer que a escolha
de ficar ou mudar não faria diferença, já que agora há duas portas e um carro, dando a impressão
de que as chances são de 50/50. No entanto, a probabilidade favorece a troca de porta, pois ao
mudar a escolha a probabilidade de ganhar o carro é de 2/3, enquanto a probabilidade de ganhar
ao ficar com a escolha inicial é de apenas 1/3.

Exemplo 14.3.6. Simulando o problema de Monty Hall

1 import numpy as np
2
3 np.random.seed(0)
4
5 def monty_hall():

79
14.3. Simulações de probabilidades
Captura de erros, manipulação de arquivos e simulações

6 # Inicializar as portas
7 # 0 representa uma porta sem prêmio, 1 representa a porta com
prêmio
8 doors = np.array([0, 0, 1])
9 np.random.shuffle(doors)
10
11 # Escolher uma porta aleatoriamente
12 choice = np.random.choice([0, 1, 2])
13
14 # Apresentador revela uma das portas restantes sem prêmio
15 revealed_door = np.random.choice([i for i in range(3) if i !=
choice and doors[i] == 0])
16
17 # Mudar a escolha para a porta não revelada
18 new_choice = next(i for i in range(3) if i != choice and i !=
revealed_door)
19
20 # Verificar se a nova escolha é uma porta vencedora
21 if doors[new_choice] == 1:
22 return 1
23 else:
24 return 0
25
26 N = 1000
27 # Inicializar o contador de vitórias
28 wins = 0
29 # Roda a simulação N vezes
30 for _ in range(N):
31 wins += monty_hall()
32 # Calcula a porcentagem de vitórias
33 win_percentage = (wins / N) * 100
34
35 print(f"Após {N} simulações, a porcentagem de vitórias ao mudar
de porta é de {win_percentage}%.")

Neste exemplo, a simulação do problema de Monty Hall é realizada 1000 vezes. Primeiro,
as portas são inicializadas e uma é escolhida como a porta vencedora. Em seguida, uma
porta é escolhida aleatoriamente. O apresentador então revela uma das portas restantes que
não contém o prêmio. O concorrente então decide se deve ficar com a sua escolha original ou
mudar para a outra porta não revelada. A simulação mostra que mudar a porta aumenta as
chances de ganhar.

80
15 Pandas, parte 1
O pandas é uma biblioteca Python de código aberto que fornece estruturas de dados de alto
desempenho e ferramentas de análise de dados fáceis de usar. Ele introduz duas estruturas de
dados principais: Series e DataFrame.

§15.1 Series
Um objeto de Series é como um array unidimensional, uma lista homogênea de valores. Cada
valor recebe um rótulo, que é conhecido como índice. A maneira mais simples de criar uma Series
é a partir de uma lista.

Exemplo 15.1.1. Criação de uma Series

1 import pandas as pd
2
3 # Exemplo 1: Criando uma Series com índice automático
4 data1 = [1, 2, 3, 4, 5]
5 series1 = pd.Series(data1)
6 print(series1)
7 # Saída:
8 # 0 1
9 # 1 2
10 # 2 3
11 # 3 4
12 # 4 5
13 # dtype: int64
14
15 # Exemplo 2: Criando uma Series com índices nomeados
16 data2 = [10, 20, 30, 40, 50]
17 index2 = ['A', 'B', 'C', 'D', 'E']
18 series2 = pd.Series(data2, index=index2)
19 print(series2)
20 # Saída:
21 # A 10
22 # B 20
23 # C 30
24 # D 40
25 # E 50
26 # dtype: int64

Nesse exemplo, uma Series é criada a partir de uma lista de valores. A série resultante
tem um índice atribuído automaticamente que começa em 0 e incrementa de um em um.
Podemos também atribuir um índice específico a uma Series no momento da criação, como
demonstrado no segundo exemplo. Lá, criamos uma Series com índices nomeados usando
caracteres.

81
Pandas, parte 1 15.2. DataFrame

§15.1.2 Indexando Series


A indexação em uma Series é semelhante a uma matriz NumPy, com a diferença importante
de que uma Series pode ter um índice explícito definido. Para acessarmos valores na série pela
posição no lugar do índice podemos utilizar o atributo iloc.

Exemplo 15.1.3. Indexando uma Series

1 import pandas as pd
2
3 # Criando uma Series com índices nomeados
4 data = [10, 20, 30, 40, 50]
5 index = ['a', 'b', 'c', 'd', 'e']
6 series = pd.Series(data, index=index)
7 print(series)
8 # Saída:
9 # a 10
10 # b 20
11 # c 30
12 # d 40
13 # e 50
14 # dtype: int64
15
16 # Acessando elementos da Series por índice numérico
17 print(series.iloc[0]) # Saída: 10
18
19 # Acessando elementos da Series por índice nomeado
20 print(series['b']) # Saída: 20

Neste exemplo, criamos uma Series com um índice nomeado. A indexação pode ser realizada
tanto por meio do índice numérico (com iloc), como por meio do índice nomeado. O valor
na posição 0 é acessado e também o valor no índice nomeado ’b’.

As Series também suportam vários tipos de operações de indexação, como fatiamento, indexação
booleana, entre outras.

§15.2 DataFrame
Um DataFrame é uma estrutura bidimensional de dados, como uma planilha ou uma tabela
SQL. É semelhante a uma matriz NumPy, mas com índices de linhas e colunas nomeados. Cada
coluna em um DataFrame pode conter diferentes tipos de dados (numéricos, booleanos, strings,
etc.), tornando-o uma estrutura de dados muito flexível para o manejo de conjuntos de dados.

Exemplo 15.2.1. Criação de um DataFrame

1 import pandas as pd
2
3 # Criando um DataFrame a partir de um dicionário de listas
4 data = {'Nome': ['João', 'Maria', 'Pedro', 'Ana'],
5 'Idade': [25, 30, 35, 28],

82
Pandas, parte 1 15.2. DataFrame

6 'Cidade': ['São Paulo', 'Rio de Janeiro', 'Curitiba',


'Belo Horizonte']}
7 df = pd.DataFrame(data)
8 print(df)
9 # Saída:
10 # Nome Idade Cidade
11 # 0 João 25 São Paulo
12 # 1 Maria 30 Rio de Janeiro
13 # 2 Pedro 35 Curitiba
14 # 3 Ana 28 Belo Horizonte
15
16 # Definindo índices explícitos ao criar o DataFrame
17 index = ['a', 'b', 'c', 'd']
18 df = pd.DataFrame(data, index=index)
19 print(df)
20 # Saída:
21 # Nome Idade Cidade
22 # a João 25 São Paulo
23 # b Maria 30 Rio de Janeiro
24 # c Pedro 35 Curitiba
25 # d Ana 28 Belo Horizonte

Nesse exemplo, um DataFrame é criado a partir de um dicionário de listas. As chaves


do dicionário se tornam os rótulos das colunas e as listas se tornam as linhas de dados. O
DataFrame resultante tem rótulos de linha atribuídos automaticamente, começando de 0
e incrementando de um em um. Também é possível definir índices explícitos ao criar um
DataFrame, similarmente à criação de uma Series.

Um DataFrame pode ser criado a partir de:

• A partir de um dicionário de listas: cada lista representa uma coluna do DataFrame, e


as chaves do dicionário se tornam os rótulos das colunas.

• A partir de uma lista de dicionários: cada dicionário representa uma linha do DataFrame,
e as chaves dos dicionários se tornam os rótulos das colunas.

• A partir de uma lista de listas: cada lista interna representa uma linha do DataFrame.

• A partir de um NumPy array: os elementos do array são usados para preencher o


DataFrame.

• A partir de outro DataFrame: pode-se criar um novo DataFrame a partir de uma seleção
de colunas de outro DataFrame.

• A partir de um arquivo: é possível ler dados de um arquivo (por exemplo, CSV, Excel) e
criar um DataFrame a partir desses dados.

§15.2.2 Acessando DataFrames


Existem várias maneiras de acessar os dados em um DataFrame, incluindo o acesso por rótulo de
coluna e acesso por localização numérica ou acesso por rótulo de linha isso se dá pelos atributos
iloc e loc respectivamente.

83
Pandas, parte 1 15.3. Filtrando DataFrames

Exemplo 15.2.3. Acessando um DataFrame

1 import pandas as pd
2
3 # Criando um DataFrame de exemplo
4 data = {'Nome': ['João', 'Maria', 'Carlos', 'Ana'],
5 'Idade': [25, 30, 42, 28],
6 'Cidade': ['São Paulo', 'Rio de Janeiro', 'Belo
Horizonte', 'Salvador']}
7
8 df = pd.DataFrame(data)
9
10 # Acessando uma coluna específica pelo nome da coluna
11 nome_coluna = df['Nome']
12 print(nome_coluna)
13
14 # Acessando uma fatia de linhas usando a sintaxe de fatiamento
15 fatia_linhas = df.loc[1:3]
16 print(fatia_linhas)
17
18 # Acessando uma fatia de linhas e de colunas usando a sintaxe de
fatiamento
19 fatia = df.loc[2:4, "Idade":"Cidade"]
20 print(fatia)
21
22 # Acessando uma célula específica usando rótulo de coluna e
rótulo de linha
23 celula_especifica = df.loc[2, 'Cidade']
24 print(celula_especifica)
25
26 # Acessando uma célula específica pela posição da linha e da
coluna
27 celula_especifica = df.iloc[2, 2]
28 print(celula_especifica)

Nesse exemplo, os dados de uma coluna específica são acessados pelo nome da coluna. Em
seguida, uma fatia de linhas é acessada usando a sintaxe de fatiamento padrão do Python.
Finalmente, uma célula específica é acessada usando uma combinação de rótulo de coluna e
rótulo de linha.

§15.3 Filtrando DataFrames


A filtragem de dados é uma parte essencial do trabalho com DataFrame. O pandas fornece uma
maneira eficiente e intuitiva de filtrar dados usando expressões booleanas. Essas expressões são
aplicadas a uma ou mais colunas do DataFrame e o resultado é um novo DataFrame contendo
apenas as linhas que satisfazem a condição especificada.

84
Pandas, parte 1 15.3. Filtrando DataFrames

Exemplo 15.3.1. Filtrando um DataFrame

1 import pandas as pd
2
3 # Criando um DataFrame de exemplo
4 data = {'A': [1, -2, 3, -4, 5],
5 'B': [10, 20, 30, 40, 50]}
6
7 df = pd.DataFrame(data)
8
9 # Criando um filtro booleano
10 filtro = df['A'] > 0
11
12 # Aplicando o filtro ao DataFrame original
13 df_filtrado = df[filtro]
14
15 print(df_filtrado)

Neste exemplo, é criado um filtro booleano, que é uma Series cujos valores são True onde
a condição especificada é atendida e False onde não é. Nesse caso, a condição é "todos os
valores na coluna ’A’ que são maiores que 0". Em seguida, o filtro é aplicado ao DataFrame
original usando a sintaxe de colchetes, resultando em um novo DataFrame que contém
apenas as linhas onde o valor na coluna ’A’ é maior que 0.

Além de operações simples de comparação, é possível utilizar operadores lógicos como & (e), |
(ou), e ~ (não) para criar condições de filtragem mais complexas.

Exemplo 15.3.2. Filtrando com múltiplas condições

1 import pandas as pd
2
3 # Criando um DataFrame de exemplo
4 data = {'A': [1, -2, 3, -4, 5],
5 'B': [10, -20, 30, -40, 50]}
6
7 df = pd.DataFrame(data)
8
9 # Aplicando os filtros combinados ao DataFrame original
10 df_filtrado = df[(df['A'] > 0) & (df['B'] < 0)]
11
12 print(df_filtrado)

Neste segundo exemplo, duas condições são especificadas: os valores na coluna ’A’ devem
ser maiores que 0, e os valores na coluna ’B’ devem ser menores que 0. Ambas as condições
devem ser verdadeiras para que uma linha seja incluída no DataFrame resultante. As
condições são combinadas usando o operador lógico &.

Note que cada condição deve ser encapsulada entre parênteses. Isso ocorre porque o Python
avalia os operadores lógicos antes dos operadores de comparação, então sem os parênteses, as
expressões não seriam avaliadas na ordem correta.

85
Pandas, parte 1 15.4. Métodos de Series (ou colunas)

§15.4 Métodos de Series (ou colunas)


Os objetos Series em pandas têm uma variedade de métodos úteis para manipulação e análise de
dados. Uma vez que cada coluna de um DataFrame é essencialmente um objeto Series, esses
métodos também podem ser usados diretamente em colunas de DataFrame.
Aqui estão alguns dos métodos mais úteis:
• head() e tail(): Esses métodos retornam as primeiras ou últimas n linhas de uma
Series ou DataFrame, respectivamente.
• describe(): Este método gera estatísticas descritivas que resumem a tendência central,
a dispersão e a forma da distribuição de um conjunto de dados.
• unique(): Este método retorna uma array com os valores únicos da Series.
• value_counts(): Este método retorna uma Series contendo contagens de valores
únicos em ordem decrescente, de modo que o elemento mais frequente apareça primeiro.
• apply(): Este método aplica uma função ao longo de um eixo do DataFrame ou em
valores de Series.
• sort_values(): Este método ordena uma Series em ordem ascendente ou descendente.
As colunas para serem utilizadas na ordenação podem ser especificadas com o parâmetro
by.
• idxmax()/idxmin(): Esses métodos retornam o rótulo do índice do máximo e do mínimo,
respectivamente.

Exemplo 15.4.1. Usando métodos de Series

1 import pandas as pd
2 import numpy as np
3
4 # Criando um DataFrame de exemplo
5 data = {'A': [1, 2, 2, 3, 3, 3]}
6
7 df = pd.DataFrame(data)
8
9 # Exibindo estatísticas resumidas da coluna 'A'
10 descricao = df['A'].describe()
11 print("Estatísticas resumidas da coluna 'A':")
12 print(descricao)
13 print()
14
15 # Exibindo os valores únicos da coluna 'A'
16 valores_unicos = df['A'].unique()
17 print("Valores únicos da coluna 'A':")
18 print(valores_unicos)
19 print()
20
21 # Contando a frequência de cada valor único na coluna 'A'
22 frequencia = df['A'].value_counts()
23 print("Frequência dos valores na coluna 'A':")

86
Pandas, parte 1 15.5. Iterando em DataFrames

24 print(frequencia)
25 print()
26
27 # Aplicando uma função a cada valor na coluna 'A'
28 quadrados = df['A'].apply(np.square)
29 print("Quadrados dos valores na coluna 'A':")
30 print(quadrados)

Este exemplo cria um DataFrame de exemplo e realiza várias operações em uma coluna
(Series) desse DataFrame. Primeiro, o método describe() é usado para exibir estatísticas
resumidas da coluna ’A’. Em seguida, o método unique() é usado para exibir os valores
únicos presentes na coluna ’A’. Depois, o método value_counts() é usado para contar
a frequência de cada valor único na coluna ’A’. Por fim, o método apply() é usado para
aplicar uma função (neste caso, a função np.square, que calcula o quadrado de um número)
a cada valor na coluna ’A’.

§15.5 Iterando em DataFrames


Embora geralmente seja mais eficiente usar métodos integrados do pandas para realizar operações
de dados sempre que possível, às vezes pode ser necessário iterar sobre as linhas de um DataFrame.
Pandas oferece vários métodos para iterar sobre um DataFrame, cada um com suas próprias
vantagens e desvantagens.

• df.iterrows(): Este método retorna um gerador que produz índice e linha, onde a linha
é uma Series. Este método é lento e não é recomendado para DataFrames grandes.
• df.itertuples(): Este método retorna um objeto iterador que produz namedtuples,
que são tuplas, mas com nomes de campo acessíveis como propriedades. Este método é mais
rápido que iterrows(), e as tuplas resultantes são mais eficientes em termos de memória do
que as Series.
• df.apply(): Embora não seja estritamente um método de iteração, o método apply()
pode ser usado para aplicar uma função a cada linha ou coluna de um DataFrame ou a
cada item de uma Series, o que pode ser útil em muitos casos onde você pode considerar
a iteração.

Exemplo 15.5.1. Iterando sobre um DataFrame

1 import pandas as pd
2 import numpy as np
3
4 # Criando um DataFrame de exemplo
5 data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
6
7 df = pd.DataFrame(data)
8
9 # Iterando sobre as linhas do DataFrame usando iterrows()
10 print("Iterando sobre as linhas usando iterrows():")
11 for index, row in df.iterrows():
12 print(f"Indice: {index}, Linha: {row}")
13 print()

87
Pandas, parte 1 15.6. Aplicação de funções

14
15 # Iterando sobre as linhas do DataFrame usando itertuples()
16 print("Iterando sobre as linhas usando itertuples():")
17 for row in df.itertuples():
18 print(f"Indice: {row.Index}, Linha: {row}")
19 print()
20
21 # Aplicando uma função a cada linha do DataFrame usando apply()
22 soma_linhas = df.apply(np.sum, axis=1)
23 print("Soma das linhas:")
24 print(soma_linhas)

Este exemplo mostra diferentes maneiras de iterar sobre um DataFrame. Primeiro, usa-se o
método iterrows() para iterar sobre as linhas do DataFrame e imprimir o índice e a linha.
Em seguida, o método itertuples() é usado para fazer a mesma coisa, mas retornando
namedtuples em vez de Series. Finalmente, o método apply() é usado para aplicar uma
função (neste caso, a função np.sum que soma os valores) a cada linha do DataFrame.

§15.6 Aplicação de funções


A aplicação de funções é um componente central da análise de dados. Pandas fornece uma
variedade de maneiras de aplicar funções tanto a elementos individuais quanto a grupos inteiros
de dados de um DataFrame.
• map(): Este método é usado para substituir cada valor em uma Series por outro valor.
Esses outros valores podem ser derivados de uma função, um dicionário ou uma Series.
• apply(): Este método é usado para aplicar uma função a cada elemento de uma Series ou
a cada linha ou coluna de um DataFrame.
• applymap(): Este método é usado para aplicar uma função a cada elemento de um
DataFrame. Isso é semelhante ao método df.apply(), mas df.apply() opera em
linhas ou colunas inteiras, enquanto df.applymap() opera em cada elemento individual-
mente.

Exemplo 15.6.1. Aplicação de funções a um DataFrame

1 import pandas as pd
2 import numpy as np
3
4 # Criando um DataFrame de exemplo
5 data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
6
7 df = pd.DataFrame(data)
8
9 # Aplicando o método map() para substituir valores em uma Series
10 df['A'] = df['A'].map({1: 'One', 2: 'Two', 3: 'Three'})
11 print("Substituição de valores usando map():")
12 print(df)
13 print()
14

88
Pandas, parte 1 15.6. Aplicação de funções

15 # Aplicando a função np.sum a cada coluna do DataFrame usando


apply()
16 soma_colunas = df.apply(np.sum)
17 print("Soma das colunas usando apply():")
18 print(soma_colunas)
19 print()
20
21 # Aplicando a função np.square a cada elemento do DataFrame
usando applymap()
22 quadrado_df = df.applymap(np.square)
23 print("Quadrado dos elementos do DataFrame usando applymap():")
24 print(quadrado_df)

Este exemplo mostra como aplicar funções a um DataFrame. Primeiro, o método map() é
usado para substituir valores em uma Series. Em seguida, o método apply() é usado para
aplicar a função np.sum a cada coluna do DataFrame. Finalmente, o método applymap()
é usado para aplicar a função np.square a cada elemento do DataFrame.

89
16 Pandas, parte 2
§16.1 Leitura e escrita de DataFrames
Trabalhar com dados significa que você frequentemente precisará ler dados de fontes externas
e também escrever seus resultados de volta para um formato que outros podem usar. Pandas
oferece uma variedade de métodos para ler e escrever dados em muitos formatos diferentes.

• pd.read_csv() / df.to_csv(): Estes são os métodos mais comumente usados para


ler e escrever dados em formato CSV (Comma Separated Values). Eles possuem uma série
de opções para lidar com diferentes peculiaridades que podem existir nos seus dados CSV.

• pd.read_excel() / df.to_excel(): Estes métodos são usados para ler e escrever


dados em formato Excel. Eles suportam tanto o formato antigo (.xls) quanto o novo (.xlsx).

• pd.read_sql() / df.to_sql(): Estes métodos são usados para ler e escrever dados de
e para um banco de dados SQL. Eles requerem uma conexão de banco de dados estabelecida
como um de seus argumentos.

• pd.read_json() / df.to_json(): Estes métodos são usados para ler e escrever dados
em formato JSON.

• pd.read_pickle() / df.to_pickle(): Estes métodos são usados para ler e escrever


dados em formato pickle, que é um formato binário para serializar e desserializar objetos
Python.

• df.to_html() e df.to_latex(): São métodos que geram tabelas em formato html ou


latex a partir do DataFrame.

Exemplo 16.1.1. Leitura e escrita de DataFrames

1 import pandas as pd
2
3 # Lendo um DataFrame a partir de um arquivo CSV
4 df = pd.read_csv('input.csv')
5
6 # Realizando algumas operações no DataFrame
7 # ... (o código das operações depende do que você está tentando
realizar)
8
9 # Escrevendo o DataFrame manipulado em um novo arquivo CSV
10 df.to_csv('output.csv', index=False)

Neste exemplo, dados são lidos de um arquivo CSV, manipulados e, em seguida, salvos em
um novo arquivo CSV. Os métodos read_csv() e to_csv() são usados para realizar essas
operações. Note que o método to_csv() é chamado em um DataFrame, o que significa que
o DataFrame será escrito em um arquivo CSV.

90
Pandas, parte 2 16.2. Plotagem

Exportando índices
No pandas, cada DataFrame tem um índice, que é uma etiqueta para cada linha. Por
padrão, quando você salva um DataFrame para um arquivo CSV usando o método to_csv(),
o pandas incluirá esse índice como a primeira coluna do arquivo CSV.
No entanto, em muitos casos, o índice do DataFrame não contém informações úteis e pode
ser apenas uma sequência numérica automática. Em tais situações, salvar o índice para o
arquivo CSV pode ser desnecessário e até confuso, pois adicionará uma coluna extra sem
informações significativas.
Ao passar o argumento index=False para o método to_csv(), você está instruindo
o pandas a não salvar o índice do DataFrame no arquivo CSV. Isso pode tornar o arquivo
CSV mais limpo e mais fácil de entender, especialmente se o índice não for relevante para
seus dados. E evita o surgimento de colunas Unnamed: 0 quando o CSV for carregado
novemente no Pandas.

§16.2 Plotagem
Uma parte importante da análise de dados é a capacidade de visualizar dados e resultados,
e a biblioteca Pandas fornece funcionalidades integradas para a plotagem de gráficos que se
baseiam na biblioteca Matplotlib (ou outras bibliotecas de plotagem substituindo o backend).
Para plots mais complexos ou personalizados, é recomendável usar diretamente a Matplotlib
ou outras bibliotecas de plotagem, como Seaborn ou plotly, mas para plots simples e rápidos,
a funcionalidade integrada do Pandas pode ser suficiente e mais conveniente. A sintaxe básica
dessa funcionalidade é:

df.plot(x="coluna_x", y="coluna_y", kind="line")

O método plot do pandas aceita um argumento kind que pode assumir vários valores para
especificar o tipo de gráfico a ser produzido. Aqui estão alguns desses valores possíveis e suas
descrições:

• ’line’: Produz um gráfico de linhas. Este é o tipo padrão de gráfico.

• ’bar’: Produz um gráfico de barras verticais.

• ’barh’: Produz um gráfico de barras horizontais.

• ’hist’: Produz um histograma, que pode ser usado para visualizar a distribuição de
frequência de uma única variável.

• ’box’: Produz um gráfico de caixa (box plot), que é útil para visualizar a mediana, quartis,
e possíveis outliers de uma variável.

• ’kde’ ou ’density’: Produz uma estimativa de densidade de kernel, que é uma maneira
suave de visualizar a distribuição de uma variável.

• ’area’: Produz um gráfico de área, que é essencialmente um gráfico de linhas preenchido.

• ’scatter’: Produz um gráfico de dispersão, útil para visualizar a relação entre duas
variáveis numéricas.

• ’hexbin’: Produz um gráfico de hexágonos bin, que é útil para visualizar a relação entre
duas variáveis numéricas em grandes conjuntos de dados.

• ’pie’: Produz um gráfico de pizza.

91
Pandas, parte 2 16.2. Plotagem

Exemplo 16.2.1. Plotagem com Pandas

1 import pandas as pd
2 import numpy as np
3 import matplotlib.pyplot as plt
4
5 # Gera um DataFrame com números aleatórios
6 np.random.seed(0)
7 df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c',
'd'])
8
9 # Cria um gráfico de linha
10 df.plot(kind='line')
11 plt.title('Line plot')
12 plt.show()
13
14 # Cria um gráfico de barras
15 df.plot(kind='bar')
16 plt.title('Stacked Bar plot')
17 plt.show()
18
19 # Cria um gráfico de barras empilhadas
20 df.plot(kind='bar', stacked=True)
21 plt.title('Stacked Bar plot')
22 plt.show()
23
24 # Cria um gráfico de área
25 df.plot(kind='area', stacked=False)
26 plt.title('Area plot')
27 plt.show()
28
29 # Cria um gráfico de dispersão
30 df.plot(kind='scatter', x='a', y='b')
31 plt.title('Scatter plot')
32 plt.show()
33
34 # Cria um histograma
35 df['a'].plot(kind='hist')
36 plt.title('Histogram plot')
37 plt.show()
38
39 # Cria um gráfico de caixa
40 df.plot(kind='box')
41 plt.title('Box plot')
42 plt.show()
43
44 # Cria um gráfico de densidade (KDE)
45 df.plot(kind='density')
46 plt.title('Density plot')

92
Pandas, parte 2 16.3. Outros métodos de manipulação

47 plt.show()

Neste exemplo, um DataFrame é criado com dados aleatórios e depois são gerados diversos
tipos de gráficos. Observe pode utilizar a biblioteca Matplotlib pode ser utilizada para
personalizar os gráficos.

§16.3 Outros métodos de manipulação


Além dos métodos já discutidos, o Pandas oferece um conjunto de métodos poderosos para
manipulação de dados. Estes permitem alterar a forma dos seus dados, agregá-los de diferentes
maneiras e transformá-los para análises mais complexas. Alguns deles são:

• df.groupby(): O método groupby permite dividir seus dados em grupos com base em
algum critério, aplicar uma função a cada grupo, e então combinar os resultados em uma
estrutura de dados.
• df.pivot_table(): O método pivot_table permite reorganizar e resumir dados
selecionados. Similar às tabelas dinâmicas no Excel, ela recebe argumentos simples para
agrupar os dados em um DataFrame de duas dimensões e aplicar resumos estatísticos.
• df.melt(): A função melt é útil para remodelar um DataFrame, onde é possível trans-
formar colunas em linhas, tornando os dados longos em vez de largos.
• df.stack(): O método stack “comprime” um nível nas colunas do DataFrame para
produzir uma Series, um DataFrame ou um MultiIndex.

Exemplo 16.3.1. Manipulação e plotagem de dados com Pandas

1 import pandas as pd
2
3 # Lê os primeiros 10 registros do arquivo csv
4 df_csv = pd.read_csv('countries-table.csv', nrows=10)
5
6 # Usa a função 'melt' para transformar cada coluna de população
em uma linha única
7 df pop = df_csv.melt(
_
8 # Mantém a coluna 'country' como identificador
9 id_vars=['country'],
10 # Seleciona as colunas que contêm 'pop' no título
11 value_vars=df_csv.columns[df_csv.columns.str.contains('pop')],
12 # Nomeia a coluna de valores como 'population'
13 value_name="population",
14 # Nomeia a coluna de variáveis como 'year'
15 var_name="year",
16 )
17
18 # Remove 'pop' do valor da coluna 'year' e converte para int
19 df_pop['year'] = df_pop['year'].str.replace("pop", "").astype(int)
20
21 # Agrupa o DataFrame por 'country' e plota um gráfico para cada
país

93
Pandas, parte 2 16.3. Outros métodos de manipulação

22 for country, sub_df in df_pop.groupby(by=['country']):


23 sub_df.plot(kind='scatter', x='year', y='population',
title=country)

Nesse exemplo, um DataFrame é lido a partir de um arquivo CSV, e o método melt é


usado para remodelar o DataFrame de modo que cada linha corresponda a uma observação
de população para um país em um determinado ano, que anteriormente estavam separadas
em várias colunas para cada ano. Em seguida, o método groupby é usado para dividir os
dados por país, e um gráfico de dispersão da população ao longo do tempo é plotado para
cada país.
O arquivo CSV utilizado neste exemplo pode ser baxiado em:
https://links.nngn.net/countries-table

94
II
Combinatória e Probabilidade

95
17 Permutações com e sem repetições;
permutações circulares
Vamos começar com dois princípios muito simples, mas que serão úteis em todo o curso. São
eles o princípio aditivo e o princípio multiplicativo.

Princípio Aditivo: Sejam A e B conjuntos disjuntos com n e m elementos respectivamente.


Então A ∪ B tem n + m elementos.

Exemplo 17.0.1. Ache o número de pares ordenados (x, y) de inteiros tais que x2 + y 2 ≤ 25.
Solução: separamos em 6 casos disjuntos : x2 + y 2 = i, onde i = 1, 2, 3, 4, 5. Defina o
conjunto Si = {(x, y)|x, y ∈ Z, x2 + y 2 = i}. Note que S0 = {(0, 0)};
S1 = {(1, 0), (−1, 0), (0, 1), (0, −1)};
S2 = {(1, 1), (1, −1), (−1, 1), (−1, −1)};
S3 = ∅;
S4 = {(0, 2), (0, −2), (2, 0), (−2, 0)};
S5 = {(1, 2), (1, −2), (2, 1), (2, −1), (−1, 2), (−1, −2), (−2, 1), (−2, −1)}.
Pelo princípio aditivo temos que o números de pares é 1 + 4 + 4 + 0 + 4 + 8 = 21.

Seja A um conjunto com m elementos e B um conjunto com n elementos. O produto cartesiano


A × B é o conjunto de todos os pares ordenados (a, b), onde a ∈ A e b ∈ B.

Princípio Multiplicativo: O número de elementos em A × B é m × n, e isso pode ser


interpretado como o número total de maneiras de escolher um elemento de A e um elemento
de B.

Exemplo 17.0.2. Quantos números de três algarismos distintos existem ?


Solução: o algarismo das centenas pode escolhido de nove maneiras (só não pode escolher
o zero), o algarismo das dezenas pode ser escolhido de nove maneiras (agora o zero pode ser
escolhido, mas não o algarimo usado nas centenas). Por fim o algarismo das unidades pode
ser escolhido de oito maneiras. Assim pelo princípio multiplicativo há 9 · 9 · 8 = 648 números
distintos.

Exemplo 17.0.3. O Teorema Fundamental da Aritmética nos afirma que cada número
natural n pode ser escrito como

n = pα1 1 · pα2 2 · · · pαk k

onde os pi são primos distintos e αi são inteiros não-negativos . Chame de d(n) a quantidade
de divisores positivos de n.

(a) Ache d(24).

(b) Prove que d(n) = (α1 + 1) · (α2 + 1) · · · (αk + 1).

Solução: (a) Note que a fatoração de 24 é 24 = 23 · 3. Portanto um divisor de 24 é um

96
Permutações com e sem repetições; permutações circulares 17.1. Permutações

número da forma 2a · 3b . Note que a ∈ {0, 1, 2, 3} e b ∈ {0, 1}, assim há 4 · 2 = 8 divisores


possíveis para o 24.
(b) Um divisor de n é um número d da forma d = pβ1 1 · pβ2 2 · · · pβk k onde 0 ≤ βi ≤ αi .
Há αi + 1 maneiras de escolher cada expoente. Portanto o princípio multiplicativo nos dá
d(n) = (α1 + 1) · (α2 + 1) · · · (αk + 1).

§17.1 Permutações
Dada uma lista de objetos distintos a1 , · · · , an . De quantas maneiras é possível ordená-los?
Comecemos com um exemplo.

Exemplo 17.1.1. De quantas formas é possível ordenar {a, b, c} ?.


Solução: Podemos simplesmente listar todas as possibilidades: abc, acb, bac, bca, cab, cba.
Há então seis formas .
Poderíamos usar o princípio multiplicativo. Para a primeira posição podemos colocar cada
uma das três letras. Para a segunda posição há duas possibilidades. Para a última posição
há uma única possibilidade. Portanto há 3 · 2 · 1 = 6 maneiras.

Definição 17.1. Defina n! (Lê-se n fatorial) como sendo n! = n · (n − 1) · · · · · 1.

Por exemplo, 3! = 3 · 2 · 1 = 6.

Observação 17.1.I. Vamos convencionar que 0! = 1.

Proposição 17.1.2 – O número de maneiras de ordenar n objetos distintos é n!.

Demonstração. A prova deste fato é repetir o que fizemos no exemplo anterior.


Há n possibilidades para a primeira posição,
Há n − 1 possibilidades para a segunda posição,
..
.
Há 1 possibilidade para a n-ésima posição.
Pelo princípio multiplicativo há n · (n − 1) · · · · · 1 = n!

Poderíamos generalizar um pouco a discussão anterior e nos perguntar de quantos modos


podemos escolher k objetos distintos dentre n objetos distintos dados. Vamos denotar esse
número por (n)k . Por exemplo,

Exemplo 17.1.3. De quantos modos podemos escolher uma lista com 3 letras dentre
{a, b, c, d}?
Solução: Há quatro formas de escolher a primeira letra, três formas de escolher a segunda
letra e duas formas de escolher a última letra, portanto pelo princípio multiplicativo temos
(4)3 = 4 · 3 · 2 = 24 formas.

97
Permutações com e sem repetições; permutações circulares 17.1. Permutações

Proposição 17.1.4 – O número de maneiras de escolher k objetos dentre n dados é

(n)k = n · (n − 1) · · · (n − k + 1)

Demonstração. A prova deste fato é usando o princípio multiplicativo igual fizemos antes e
deixaremos como exercício.

Se usarmos a notação de fatorial, então podemos escrever de forma mais sucinta:


n!
(n)k = .
(n − k)!
O que aconteceria com o número de listas ordenadas se tivéssemos objetos repetidos ? Comecemos
com um exemplo.

Exemplo 17.1.5. Quantos são os anagramas da palavra MANGA ? ( um anagrama é


simplesmente uma reordenação das letras.)
Solução. Perceba que há duas letras A repetidas. Considere por um momento que elas são
diferentes: M A1 N G A2 então há 5! = 120 anagramas. Perceba que essa não é a resposta
que gostaríamos pois se trocarmos as letras A de posição temos a mesma ordenação. Então
basta perceber de quantas formas eu posso permutar os A de posição. Isso é 2!. Logo o
5!
número de anagramas da palavra MANGA é = 60.
2!

Podemos generalizar esse exemplo da seguinte maneira :

Proposição 17.1.6 – Considere n objetos, dos quais k1 são do tipo 1, k2 são do tipo 2, · · · ,
kj são do tipo j com k1 + · · · + kj = n então o número de permutações destes n objetos é

n!
.
k1 ! · · · · kj !

Exemplo 17.1.7. Uma formiga vai de A até B andando sempre sobre as arestas do
quadriculado 5 × 5 abaixo sempre um passo de cada vez para cima ou para a direita. De
quantas formas ela pode fazer esse percurso ?
Solução:

98
17.2. Permutações circulares
Permutações com e sem repetições; permutações circulares

Um caminho pode ser representado por uma lista DDDDDCCCCC em alguma ordem
onde D significa para direita e C significa para cima. A resposta é então o número de
maneiras de permutar esses objetos. Isso é
10!
.
5! · 5!

§17.2 Permutações circulares


De quantos modos podemos colocar três pessoas em uma mesa circular ?

B A C

A C B

C B A
Perceba que se nós não numerarmos os lugares então cada uma das posições acima são iguais.
Ou seja, rotações não mudam uma posição. Como no caso acima há três rotações possíveis do
3!
círculo então o número de maneiras de colocar três pessoas nessa mesa circular é = 2.
3
De modo geral, se tivermos n pessoas pra colocar em uma mesa circular então isso pode ser
n!
feito de = (n − 1)! pois cada rotação gera n distribuições iguais.
n

Exemplo 17.2.1. De quantas formas podemos colocar 5 rapazes e 3 moças em uma mesa
circular em cada um dos seguintes casos:

i. Não há restrição alguma.

ii. Maria não senta ao lado de João.

iii. Não há 2 meninas que estão juntas.

Solução: (i). A resposta é (8 − 1)! = 7! = 5040. (ii) ( 1º solução ) Deixemos João de


fora por um momento, então há sete pessoas que podem ser colocadas na mesa circular de
(7 − 1)! = 6! maneiras. Agora João só não pode sentar nos lados adjacentes a Maria, há cinco
formas dele sentar, portanto a resposta é 6! · 5 = 3600. (ii)
(2º solução) Considere João, Maria juntos ( formando um único bloco ). Então há sete
"pessoas"no total de modo que há (7 − 1)! = 6! maneiras de dispor elas na mesa. Mas João,
Maria podem trocar de lugares. Portanto há então 6! · 2 = 1440 com joão e maria juntos.
Como o total sem restrições é 5040 então o que queremos é 5040 − 1440 = 3600.
(iii). Coloquemos primeiramente os rapazes. Isso pode ser feito de (5 − 1)! = 4! maneiras.
Coloque as moças entre os rapazes. Há cinco espaços para três meninas. Isso é (5)3 = 5 · 4 · 3.
Portanto a resposta é 4! · 5 · 4 · 3 = 1440.

Exemplo 17.2.2. Ache o número de maneiras de dispor n casais em uma mesa circular nos
seguintes casos :

99
Permutações com e sem repetições; permutações circulares 17.3. Exercícios

i. Homens e mulheres se alternam

ii. Cada mulher está ao lado do seu marido.

Solução: (i). Coloque primeiros os homens. Há (n − 1)! maneiras de fazer isso. Há n espaços
entre os homens pra colocar as mulheres. Isso pode ser feito de n! maneiras. Portanto há
(n − 1)! · n! maneiras.
(ii). Pense em cada casal como um único bloco. Há então n blocos que podem ser colocados
de (n − 1)! maneiras. Mas cada casal pode trocar as posições. Há então 2 formas para cada
casal. Portanto a resposta é (n − 1)! · 2n .

(2n)!
Exemplo 17.2.3. Prove usando combinatória que é um número inteiro.
2n
Solução: Considere n objetos. Agora pegue duas cópias de cada um desses objetos,
(2n)! (2n)!
ficamos então com 2n objetos. O número de permutações destes objetos é = n .
2!2! · · · 2! 2
Como o número de permutações é inteiro , segue que esse número é inteiro.

§17.3 Exercícios
1. O código Morse usa ”palavras” contendo de 1 a 4 ”letras”, sendo que cada ”letra” é um ponto
ou um traço. Quantas palavras existem no código Morse?
2. Ache o número interos ímpares entre 3000 e 8000 que não tem algarismos repetidos.
3. Um campeonato é disputado por 12 clubes em rodadas de 6 jogos cada. De quantos modos
é possível selecionar os jogos da primeira rodada?
4. Quantas diagonais possui um polígono de n lados ?
5. Quantos são os anagramas da palavra CARAGUATATUBA? Quantas começam por vogal?
6. Há 12 estudantes em uma festa incluindo João e Maria. 5 são meninas. De quantas maneiras
podemos colocar os estudantes em fila em cada caso a seguir
a) Não há restrição alguma
b) As 5 meninas ficam juntas ( formando um bloco)
c) Entre João e Maria não há meninos mas há exatamente 3 meninas.
7. 6 rapazes e 5 moças sentarão em uma mesa circular. Ache o número de maneiras de fazer
isso em cada caso a seguir
a) Não há restrição alguma.
b) Não há 2 moças adjacentes.
c) Todas as garotas estão juntas (formando um único bloco)
d) Maria (uma das moças) está entre João e Felipe.
8. Prove que um produto de n inteiros consecutivos é divisível por n!.
9. Prove usando um argumento combinatório que são os inteiros os números abaixo:
(3n)!
a) n n
2 ·3
(n!)!
b)
(n!)(n−1)!

100
18 Combinações a argumentos
combinatórios; combinações com
repetição; contagem Dupla
§18.1 Combinações
Na aula anterior nós vimos como escolher k objetos distintos de um conjunto com n elementos,
ali a ordem era importante. Na aula de hoje nós iremos aprender como escolher objetos sem que
seja importante a ordem de escolha. Comecemos com um exemplo.

Exemplo 18.1.1. De quantas maneiras podemos escolher uma comissão de 3 pessoas num
conjunto de 5 pessoas?
Solução: Podemos inicialmente supor que a ordem é importante. Neste caso, já vimos que
5!
há = 60 comissões. Porém cada comissão abc foi contada 3! = 6 vezes. Portanto o
(5 − 3)!
5!
número de comissões é = 10 comissões.
(5 − 3)!3!

Repetindo o argumento da solução do exemplo anterior nós temos :

Proposição 18.1.2 – O número de maneiras de escolher k objetos dentre n objetos dados é


 
n n!
= .
k (n − k)! · k!

Demonstração. basta repetir a solução do problema anterior trocando o 5 por n e o 3 por


k.
n
k lê-se "n escolhe k".


Exemplo 18.1.3. De quantos modos podemos escolher 6 pessoas incluindo pelo menos 2
mulheres , em um grupo de 7 homens e 4 mulheres ?
Solução: As possibilidades são

4 homens e 2 mulheres,
3 homens e 3 mulheres,
2 homens e 4 mulheres .

A Resposta é portanto
           
7 4 7 4 7 4
· + · + · = 35 · 6 + 35 · 4 + 21 · 1 = 371
4 2 3 3 2 4

Vamos agora a um relação importante envolvendo os números binomiais.

101
Combinações a argumentos combinatórios; combinações com repetição; contagem
Dupla 18.2. Combinações com repetições

Proposição 18.1.4 – (Relação de Stifel)


Sejam n ≥ k ≥ 1 números naturais. Então
     
n+1 n n
= + (18.1)
k k k−1

Demonstração. (Primeira prova)


   
n n n! n!
+ = +
k k−1 (n − k)! · k! (n − k + 1)! · (k − 1)!
n! · (n − k + 1) n! · k
= +
(n − k + 1)! · k! (n − k + 1)! · k!
n!(n + 1)
=
(n − k + 1)!k!
 
n+1
= . (18.2)
k

(Segunda prova) Vamos contar de quantas maneiras podemos formar uma comissão de
k pessoass dentre n + 1 pessoas disponíveis. Uma resposta é n+1 . Vamos contar isso de

k
outra maneira. Fixe uma pessoa, digamos Maria. Pelo princípio aditivo, o número total de
comissões é igual ao número de comissões nas quais Maria está mais o número de
 comissões
nas quais Maria não está. Contemos cada uma delas. As que Maria está é k−1 n
pois basta
n
escolher k − 1 pessoas dentre n. As que Maria não está é k . Logo,


     
n+1 n n
= + .
k k k−1

Observação 18.1.I. Na Segunda prova acima utilizamos duas técnicas importante em com-
binatória. A primeira delas foi de usar um argumento combinatório para provar identidades.
A segunda foi o que chamamos de contagem dupla que é basicamente contar uma mesma
coisa de duas maneiras distintas.

§18.2 Combinações com repetições


Exemplo 18.2.1. De quantos modos é possível comprar 4 sorvetes em uma loja que os
oferece em 7 sabores ?
Solução: Poderíamos pensar que a resposta é 74 = 35, mas não é, 74 é o número de
 

maneiras de escolher 4 sabores distintos dentre 7. Para resolver o problema então , façamos
o seguinte : xi será a quantidade do sabor 1, x2 a do sabor 2, assim por diante até x7 do
sabor 7. Note que xi é inteiro não-negativo e

x1 + x2 + · · · + x7 = 4.

Portanto comprar 4 sorvetes nessa loja equivale a achar uma solução da equação acima.
Vamos então achar o numéro de soluções inteiras e não-negativas da equação

x1 + x2 + · · · + x7 = 4.

102
Combinações a argumentos combinatórios; combinações com repetição; contagem
Dupla 18.3. Exercícios Propostos

Vamos usar pra isso um esquema de traço-bola. Os traços vão representar os sinais de + que
servem para separar as quantidades de cada incógnita.

Há então 6 traços e 7 espaços. As bolas serão a quantidade que queremos preencher. Neste
caso há 4 bolas pra serem colocadas entre os traços. Portanto achar a quantidade de soluções
da equação acima equivale a achar a quantidade de maneiras de dispor 4 bolas e 6 traços em
alguma ordem. Já sabemos que isso é
 
10! 10
= .
6! · 4! 4

De modo geral, usando um argumento igual ao do exemplo anterior vale a seguinte proposi-
çao:

Proposição 18.2.2 – O número de soluções inteiras não negativas de


 
(n + k − 1)! n+k−1
x1 + x2 + · · · + xn = k é = .
(n − 1)! · k! k

Exemplo 18.2.3. Quantas são as soluções inteiras e não-negativas da inequação x+y +z ≤ 5


?
Primeira Solução: as soluções da inequação equivalem as seguintes equações x + y + z =
0, 1, 2, 3, 4, 5. Pela proposição anterior, a resposta é
           
7 6 5 4 3 2
+ + + + + = 56.
5 4 3 2 1 0

Segunda solução: chame w = 5 − x − y − z, perceba que neste caso w ≥ 0, portanto as


soluções da inequação equivalem a solução da equação x + y + z + w = 5 que é 85 = 56.


§18.3 Exercícios Propostos


1. Quantas são as maneiras de escolher 2 bolas vermelhas e 3 bolas azuis de uma urna que
contém 4 bolas vermelhas e 5 bolas azuis?

2. Tem-se 5 pontos sobre uma reta R e 8 pontos sobre uma reta R’ paralela a R. Quantos
quadriláteros convexos com vértices em 4 desses 13 pontos existem?

3. Quantos são os subconjuntos com p elementos do conjunto {1, 2, · · · , n} para os quais :


(a) 1 está presente;
(b) 1 não está presente;
(c) 1 e 2 estão presente;
(d) Pelo menos um dos números 1 e 2 está presente;
(e) Exatamente um dos números 1, 2 está presente.

4. De quantos modos é possível dividir 20 pessoas :


(a) em dois grupos de 10?

103
Combinações a argumentos combinatórios; combinações com repetição; contagem
Dupla 18.3. Exercícios Propostos

(b) em quatro grupos de 5?


(c) em um grupo de 12 e um de 8?
(d) em três grupos de 6 e um de 2 ?
n
5. Calcule o valor de n−2 em função de n.


6. (IME-adaptado) Mostre que


             
2016 2017 2018 2019 2020 2016 2021
+ + + + + = .
5 5 5 5 5 6 6

7. Marcela é diretora de um banco e coordena uma equipe de 11 pessoas. Ela recebeu uma
solicitação da matriz do banco para formar duas comissões com os membros da sua equipe,
sendo uma com 6 integrantes e a outra com 5 integrantes. Como João e Maria são irmãos,
Marcela optou por não deixá-los na mesma equipe. Quantas comissões Marcela consegue
formar ?

8. Prove que    
n n
=
k n−k
de duas maneiras distintas: usando a fórmula de combinação e via um argumento combina-
tório.

9. Quantas são as soluções inteiras da equação x + y + z = 20 com x ≥ 2, y ≥ 2, z ≥ 2?

10. De quantas maneiras diferentes podemos distribuir 10 bolas em 4 urnas, sabendo que
nenhuma urna pode ficar vazia?

104
19 Princípio de Inclusão-Exclusão
Na aula 1 vimos que se A e B são conjuntos disjuntos então |A ∪ B| = |A| + |B|, onde |Z|
denota o número de elementos do conjunto |Z|. O que acontece se os conjuntos A e B não forem
necessariamente disjuntos?

Proposição 19.0.1 – Sejam A e B conjuntos finitos, não necessariamente disjuntos então


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

A ideia é separarmos A ∪ B em conjuntos disjuntos. Primeiramente A ∪ B = A ∪ (B \ A) e


portanto |A ∪ B| = |A| + |(B \ A)|. Mais uma vez B = (A ∩ B) ∪ (B \ A). Sendo
assim,|B| = |(A ∩ B)| + |(B \ A)|. Assim |A ∪ B| = |A| + |B| − |A ∩ B|.

Exemplo 19.0.2. Quantos inteiros entre 1 e 1000 são divisíveis por 3 ou por 7 ?
Solução: Denote por :
A=Conjunto dos inteiros entre 1 e 1000 que são divisíveis por 3.
B=Conjunto dos inteiros entre 1 e 1000 que são divisíveis por 7.
O número de inteiros entre 1 e 1000 que são divisíveis por 3 é igual a 1000 = 333. Ou
 
3
seja |A| = 333.
O número de inteiros entre 1 e 1000 que são divisíveis por 7 é igual a 1000 = 142. Ou
 
7
seja |B| = 142.
No entanto, alguns inteiros são divisíveis por ambos 3 e 7, ou seja, por 21.
O número de inteiros entre 1 e 1000 que são divisíveis por 21 é igual a 1000 = 47. Ou
 
21
seja |A ∩ B| = 47.
Portanto pelo Princípio de Inclusão-Exclusão temos que o número de inteiro entre 1 e 1000
que são divisíveis por 3 ou por 7 é 333 + 142 − 47 = 428.

O que acontece se tivermos 3 conjuntos A, B, C não necessariamente disjuntos. Então usando o


caso anterior e um pouco de propriedades de conjuntos chegamos a seguinte proposição :

Proposição 19.0.3 – Se A, B, C são 3 conjuntos finitos não necessariamente disjuntos então


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

Demonstração. A prova será deixada como exercício.

Essas duas proposições são casos particulares da forma mais geral do Princípio de Inclusão-
Exclusão.

105
Princípio de Inclusão-Exclusão

Proposição 19.0.4 – (Princípio de Inclusão-Exclusão) Sejam A1 , A2 , . . . , An conjuntos finitos,


Então
n
[ n
X X X
Ai = |Ai |− |Ai ∩Aj |+ |Ai ∩Aj ∩Ak |−· · ·+(−1)n−1 |A1 ∩A2 ∩· · ·∩An |.
i=1 i=1 1≤i<j≤n 1≤i<j<k≤n

Vamos dá algumas aplicações desse princípio.

Definição 19.1. Uma permutação dos números (1, 2, · · · , n) é dita ser caótica se estão fora de
suas posições originais. Por exemplo, para n = 4 a permutação (2,4,1,3) é caótica mas (2,4,3,1)
não é caótica pois o 3 está na terceira posição.

106
Princípio de Inclusão-Exclusão 19.1. Exercícios propostos

Proposição 19.0.5 – O número de permutações caóticas dos números (1, 2, · · · , n) é dado


por
1 1 1 1 1
Dn = n!( − + − + · · · + (−1)n ). (19.1)
0! 1! 2! 3! n!
Demonstração. Defina Ai como o conjunto de todas as permutações em que o elemento i
aparece em sua posição natural (ou seja, a posição i). Então, o número de permutações em
que o elemento i aparece em sua posição natural é (n − 1)! (pois agora temos apenas n − 1
elementos para permutar). Portanto, |Ai | = (n − 1)!.
Perceba que Ai ∩ Aj é o conjunto de todas as permutações em que os elementos i e j
aparecem em suas posições naturais. O número de permutações em que os elementos i e j
aparecem em suas posições naturais é (n − 2)!, pois agora temos apenas n − 2 elementos
para permutar. Portanto, |Ai ∩ Aj | = (n − 2)! e assim por diante. Daí os somatórios que
aparecem na fórmula do Principio de inclusão-exclusão são dados por
n
X
= |Ai | = n · (n − 1)! = n!.
i=1

n  
X n n!
= |Ai ∩ Aj | = · (n − 2)! = ,
2 2!
1≤i<j≤n

e assim por diante até o último termo que é


n!
|A1 ∩ A2 ∩ · · · ∩ An | = 1 = .
n!
Pelo princípio da inclusão-exclusão, o número de permutações caóticas é dado por:

[ n
X X X
| Ai | = |Ai | − |Ai ∩ Aj | + |Ai ∩ Aj ∩ Ak | −
i=1 1≤i<j≤n 1≤i<j<k≤n

··· + (−1)n−1 |A1∩ A2 ∩ · · · ∩ An |


n! n! n! n!
= n! − + − + · · · + (−1)n−1 · .
2! 3! 4! n!
Como o número total de permutações é n!, então o número de permutações caóticas é dado
por

n! n! n! n!
Dn = n! − (n! − + − + · · · + (−1)n−1 · )
2! 3! 4! n!
1 1 1 1 1
= n!( − + − + · · · + (−1)n ).
0! 1! 2! 3! n!

§19.1 Exercícios propostos


1. Numa classe de 30 alunos, 14 falam inglês, 5 falam alemão e 3 falam inglês e alemão.
Quantos alunos falam pelo menos uma língua, dentre inglês e alemão?

2. Prove a proposição (19.0.3).

3. Quantos são os números entre 1 e 1000 que são múltiplos de 2,5 ou 7 ?

107
Princípio de Inclusão-Exclusão 19.1. Exercícios propostos

4. Qual o número de permutações de (1,2,3,4,5,6) nas quais nem o 4 ocupa o 4º lugar nem o 6
ocupa o 6º lugar

5. Quantas são as permutações de (1,2,3,4,5,6,7,8,9,10) que têm exatamente 4 elementos no


seu lugar primitivo?

6. Quantas são as permutações das letras da palavra BRASIL em que o B ocupa o primeiro
lugar, ou o R em segundo lugar, ou o L em sexto lugar?

7. Prove que Dn = nDn−1 + (−1)n para n ≥ 2.

8. Prove que se n ≥ 3 então Dn = (n − 1)(Dn−1 + Dn−2 ).

9. Quantos inteiros entre 1 e 1000000 que não são nem quadrados perfeitos nem cubos perfeitos
?

10. Quantas são as funções f : {1, 2, · · · , n} → {1, 2, · · · , n} tais que a equação f (k) = k tem
solução?

108
20 Lemas de Kaplansky
Nesta aula, nosso objetivo é responder a seguinte pergunta: de quantos modos é possível formar
um subconjunto com p elementos (p-subconjuntos) de In = {1, 2, · · · , n} de modo que não haja
dois números consecutivos ?
Comecemos analisando alguns casos. Se n = 4, temos I4 = {1, 2, 3, 4}. Neste caso temos

• 1-subconjunto {1}, {2}, {3}, {4};

• 2-subconjuntos {1, 3}, {1, 4}, {2, 4}.

Se n = 5, temos I5 = {1, 2, 3, 4, 5}. Neste caso temos

• 1-subconjunto {1}, {2}, {3}, {4}, {5};

• 2-subconjuntos {1, 3}, {1, 4}, {1, 5}, {2, 4}, {2, 5}, {3, 5};

• 3-subconjuntos {1, 3, 5}.

Vamos codificar os possiveis subconjuntos por sequências de zeros e uns. Colocamos um 1 se o


elemento pertencer ao conjunto e 0 se o elemento não pertencer ao conjunto. Por exemplo, para
n=6

{1, 3, 4} 7→ 101100, .
{1, 3, 5} 7→ 101010.

Formar um 3-subconjunto de um conjunto com 5 elementos sem elementos consecutivos se resume


a saber quantas sequências de zeros e uns existem de modo que não haja uns consecutivos.
Coloquemos primeiro os três zeros.

0 0 0

Há 4 espaços para serem colocados 3 uns. Isso pode ser feito de 4


= 4 maneiras. Isso é um caso

3
particular do resultado abaixo.

Proposição 20.0.1 – (Primeiro Lema de Kaplansky) O número de p-subconjuntos de


{1, 2, · · · , n} sem elementos consecutivos é igual a f (n, p) := n−p+1
p .

Demonstração. É essencialmente repetir o argumento que demos acima. Coloque os n − p


zeros primeiro. Isso dá origem há n − p + 1 espaços para se colocar os p uns. Isso pode ser
feito de n−p+1
p maneiras.

109
Lemas de Kaplansky

Proposição 20.0.2 – (Segundo Lema de Kaplansky) Considere o número 1 como consecutivo


do número n. O número de p-subconjuntos de {1, 2, · · · , n} sem elementos consecutivos é
n n−p
igual a g(n, p) := .
n−p p
Demonstração. Vamos separar os p-subconjuntos em dois tipos. Os p-subconjuntos que têm
o elemento 1 e os p-subconjuntos que não tem o elemento o 1. 1º caso: como o número 1 está
presente no p-subconjunto, nem o número 2, nem o número n podem estar presentes, pois são
vizinhos deste. Logo, precisamos escolher outros p − 1 elementos do conjunto {3, · · · , n − 1}.
Pelo Primeiro Lema de Kaplansky, o número de maneiras de se fazer isso é
   
(n − 3) − (p − 1) + 1 n−p−1
f (n − 3, p − 1) = = .
p−1 p−1

2º caso: como o número 1 não está presente, precisamos escolher p elementos do conjunto
{2, · · · , n}. Mais uma vez, usando o Primeiro Lema de Kaplansky, o número de maneiras de
fazer isso é    
(n − 1) − p + 1 n−p
f (n − 1, p) = = .
p p
Daí, somando os resultados
   
n−p−1 n−p (n − p − 1)! (n − p)!
+ = +
p−1 p (p − 1)! · (n − 2p)! p! · (n − 2p)!
(n − p − 1)! · p + (n − p)!
=
p! · (n − 2p)!
(n − p − 1)! · [p + (n − p)]
=
p! · (n − 2p)!
(n − p − 1)! · n
=
p! · (n − 2p)!
 
n n−p
= · . (20.1)
n−p p

Exemplo 20.0.3. Uma fila tem 15 cadeiras nas quais devem sentar-se 5 homens, de modo
que não fiquem dois homens sentados em cadeiras vizinhas. De quantos modos podemos
fazer isso ?
Solução: devemos inicialmente escolher 5 cadeiras sem que haja duas cadeiras consecutivas.
Isso pode ser feito de f (15, 5) = 11 escolhidas as cadeiras, vamos dispor os homens

5 = 462;
nas cadeiras. Isso pode ser feito de 5! = 120 maneiras. Portanto a resposta é 462·120 = 55440.

Exemplo 20.0.4. Lucas quer se preparar para um curso que irá fazer e então deverá fazer
aula de natação três vezes por semana, durante um semestre. Para não se cansar, ele não
deseja ter aulas em dias consecutivos. De quantos modos Lucas poderá fazer isso ?
Solução: como há 7 dias na semana e queremos escolher 3 desses dias. Pelo Segundo Lema
7
de Kaplansky isso pode ser feito de g(7, 3) = · 7−3 = 7 maneiras.

7−3 3

110
Lemas de Kaplansky 20.1. Exercícios propostos

Exemplo 20.0.5. (Generalização do 1º Lema de Kaplansky) De quantos modos é possível


formar um p-subconjunto de {1, 2, · · · , n} de modo que entre cada dois números escolhidos
para o subconjunto haja, no conjunto, pelo menos r elementos não escolhidos para o
subconjunto?
Solução: coloquemos primeiramente os n − p zeros em sequência. Isso dá origem a p + 1
espaços. Chame de x1 a quantidade de uns que vamos colocar no primeiro espaço, x2 a
quantidade que vamos colocar no segundo espaço e assim por diante até xp+1 a quantidade
que vamos colocar no espaço p + 1. O que queremos é achar o número de soluções da equação

x1 + x2 + · · · + xp + xp+1 = n − p (20.2)

com x1 ≥ 0, x2 ≥ r, x3 ≥ r, · · · , xp ≥ r, xp+1 ≥ 0. Chame de y1 = x1 , y2 = x2 − r, · · · , yp =


xp − r, yp+1 = xp+1 . Daí a equação(20.2) é equivalente a

y1 + y2 + · · · + yp+1 = n − p − pr − r. (20.3)

cuja quantidade de soluções inteiras não-negativas é n−(p−1)r



p .

§20.1 Exercícios propostos


1. De quantos modos podemos colocar 40 meninas e 10 meninos em uma mesa circular se
meninos não podem sentar juntos ?

2. Quantos são os triângulos cujos vértices são vértices não adjacentes de um decágono regular
?

3. Quantos são os anagramas da palavra depreender que não possuem duas letras e consecutivas?

4. (IME) Doze cavaleiros estão sentados em torno de uma mesa redonda. Cada um dos
doze cavaleiros considera seus dois vizinhos como rivais. Deseja-se formar um grupo de
cinco cavaleiros para libertar uma princesa, nesse grupo não poderá haver cavaleiros rivais.
Determine de quantas maneiras é possível escolher esse grupo.

5. Prove uma versão generalizada do Segundo Lema de Kaplansky igual fizemos no exemplo
(20.0.5).

6. Seis pessoas devem se sentar em vinte cadeiras colocadas em torno de uma mesa circular. De
quantos modos isso pode ser feito se para cada cadeira ocupada devemos ter duas cadeiras
livres de cada lado?

7. (OBM 2010) Diamantino gosta de jogar futebol, mas se jogar dois dias seguidos ele fica com
dores musculares. De quantas maneiras Diamantino pode escolher em quais de dez dias
seguidos ele vai jogar bola sem ter dores musculares? Uma maneira é não jogar futebol em
nenhum dos dias.

8. De quantas maneiras podemos acomodar 3 casais em torno de uma mesa circular de modo
que pessoas do mesmo sexo não se sentem juntas e que nenhum homem fique ao lado de
sua esposa ?

111
21 Números Binomiais
Relembremos aqui a relação de Stiefel.

Proposição 21.0.1 – (Relação de Stiefel ) Sejam n, k inteiros não-negativos com k ≤ n.


Então      
n+1 n n
= + .
k k k−1

Vimos em aulas anteriores o teorema das linhas e o teorema das diagonais.

1. (Teorema das linhas ) n0 + n1 + · · · + nn = 2n .


  
Proposição 21.0.2 –

2. (Teorema das Diagonais ) n0 + n+1 + · · · + n+p = n+p+1


   
1 p p .

Vamos provar agora um teorema similar a esses.

Proposição 21.0.3 – (Teorema das colunas )


       
k k+1 k+n k+n+1
+ + ··· + = .
k k k k+1

Demonstração. A prova usa apenas a Relação de Stiefel. Vamos a ela.Usando a Relação de


Stiefel várias vezes, temos as seguintes igualdades
     
k+1 k k
= +
k+1 k+1 k
     
k+2 k+1 k+1
= +
k+1 k+1 k
     
k+3 k+2 k+2
= +
k+1 k+1 k
..
 .    
k+n+1 k+n k+n
= +
k+1 k+1 k

Somando dois lados da igualdade e cancelando os termos iguais segue o teorema.

Vamos dá algumas aplicações desses teoremas.

Exemplo 21.0.4. Calcule 1 · 2 · 3 + 2 · 3 · 4 + · · · + 50 · 51 · 52.

112
Números Binomiais

Solução. Escrevendo em notação de somatório,


50 50 50  
X k(k + 1)(k + 2) X
X k+2
k(k + 1)(k + 2) = 3! · = 6·
3! 3
k=1 k=1 k=1
50    
X k+2 53
= 6 =6· .
3 4
k=1

Onde na última igualdade usamos o teorema das colunas.

Exemplo 21.0.5. Mostre que

n(n + 1)(2n + 1)
S = 12 + 22 + · · · + n2 = .
6

n
X
Solução. Escrevendo em notação de somatório, temos S = k 2 . Gostaríamos de usar uma
k=1
ideia parecida com a do problema anterior. Para tal, precisamos de produto de naturais
consecutivos. Então, vamos tentar achar A, B, C de forma que

k 2 = Ak(k + 1) + Bk + C.

Por igualdade de polinômios, obtemos A = 1, A + B = 0, C = 0. Portanto, A = 1, B =


−1, C = 0. Assim, k 2 = k(k + 1) − k. Portanto,
n
X n
X n
X n
X
S = k2 = [k(k + 1) − k] = k(k + 1) − k
k=1 k=1 k=1 k=1
n    
X k+1 n(n + 1) n+2 n(n + 1)
= 2! − =2· −
2 2 3 2
k=1
(n + 2)(n + 1)n n(n + 1) n(n + 1) n(n + 1)(2n + 1)
= 2 − = (2(n + 2) − 3) = .
3! 2 6 6

Exemplo 21.0.6. (IMO-1981) Sejam 1 ≤ r ≤ n e considere todos os subconjuntos com r


elementos do conjunto {1, 2, · · · , n}. Cada um desses subconjuntos tem um menor elemento.
Chame de F (n, r) a média aritmética desses menores elementos. Prove que
n+1
F (n, r) = .
r+1

113
Números Binomiais

Proposição 21.0.7 – (Binômio de Newton)


Sejam x, y números reais e n um número inteiro não-negativo. Então
n  
X n
n
(x + y) = xk y n−k (21.1)
k
k=0

Solução. Note que (x + y)n = (x + y) · · · (x + y). Quando fizermos a distributiva e juntarmos


todos os termos semelhantes, nosso objetivo é achar o coeficiente de xk y n−k . Note que isso
equivale a escolher k elementos iguais a x e n − k elementos iguais a y nos parênteses. Isso é
o mesmo que saber de quantas  formas
 podemos permutar x · · · xy · · · y. Já sabemos que isso
n! n
pode ser feito de = .
(n − k)!k! k

Exemplo 21.0.8. Fazendo x = y = 1 no Binômio de Newton temos


n  
n n
X n
2 = (1 + 1) =
k
k=0

Isso nos dá uma nova prova do teorema das linhas.

Exemplo 21.0.9. Fazendo x = 1, y = −1 no Binômio de Newton temos


n        
n
X
k n n n n n
0 = (1 − 1) = (−1) = − + · · · + (−1) = 0.
k 0 1 n
k=0

Logo,        
n n n n
+ + ··· = + + ···
0 2 1 3

1 9
 
Exemplo 21.0.10. Qual o coeficiente de x2 no desenvolvimento de x3 − 2 ?
x
Solução. Pelo Binômio de Newton um termo genérico desse desenvolvimento é
   9−k  
9 3 k −1 9−k 9
(x ) = (−1) x5k−18
k x2 k
 
9
Portanto 5k − 18 = 2 o que implica k = 4. Logo o coeficiente de x2 é (−1) 9−4
= −126.
4

Podemos estender a fórmula do Binômio de Newton para quando tivermos não só 2 ter-
mos.

114
Números Binomiais 21.1. Exercícios Propostos

Proposição 21.0.11 – Para quaisquer x1 , x2 , · · ·k números reais e n um inteiro não negativo


vale
X n

n
(x1 + x2 + · · · + xk ) = xj1 · · · xjkk
j1 , j2 , · · · , jk 1
onde a soma é tomada sobre todos os ji com j1 + j2 + · · · + jk = n e relembremos que
 
n n!
=
j1 , j2 , · · · , jk j1 ! · j2 ! · · · jk !

§21.1 Exercícios Propostos


1. Resolva em k as equações abaixo.
a) 2k10 10
 
= k−2
b) k29+k = k+1 9
 
.

2. Prove que        
n n n n
+ + ··· = + + · · · = 2n−1 .
0 2 1 3

3. Sejam n, m, k inteiros não-negativos com m ≤ n. Prove que


     
n k n n−k
= .
k m m k−m

4. Calcule S = 13 + 23 + · · · + n3

5. Calcule S = 12 · 3 + 32 · 4 + · · · 992 · 52.

6. Seja n um inteiro positivo. Prove que


n
(−1)k−1 n
 
X 1 1 1
=1+ + + ··· +
k k 2 3 n
k=1

7. Seja n um inteiro não-negativo. Prove que


n  2  
X n 2n − 1
k =n .
k n−1
k=0

8. Prove que
Pn
a) 2 n n−2 .

k=1 k k = n(n + 1)2
Pn
b) 3 n 2 n−3 .

k=1 k k = n (n + 3)2

9. Determine o coeficiente de
a) x2 em (x + 2)5 .
15
b) x5 em x3 − x12 .
c) Determine o coeficiente de xn+1 em (x + 2)3 (1 + x)n .

10. No desenvolvimento de (1 + x2 + x3 )9 qual o valor do coeficiente de x8 ?

115
22 Princípio das Gavetas
Uma pergunta bem simples motiva o estudo do conteúdo deste capítulo.

Exemplo 22.0.1. Qual o número mínimo de pessoas em uma sala de aula que precisamos
ter para garantir que duas delas fazem aniversário no mesmo dia?
Intuitivamente sabemis que a resposta é 13, uma vez que se pensarmos no pior caso e
tentarmos distribuir cada pessoa em um mês diferente, sobra uma pessoa (pois apenas cabem
12 pessoas, uma em cada mês do ano). Esta pessoa deve fazer aniversário em um dos 12
meses do ano, ou seja, ela faz aniversário no mês que alguma outra pessoa também faz por
como organizamos o problema.

Princípio das Gavetas. Se n + 1 meias forem guardadas em n gavetas, então com certeza
haverá uma gaveta com duas meias.

Exemplo 22.0.2. Dados 5 pontos√ sobre um quadrado de lado, prove que existem dois deles
com distância menor ou igual a 2.
Note que podemos dividir o quadrado de lado 2 em quatro quadrados menores de lado 1
como na figura abaixo. Como 5 pontos vão ser distribuídos no quadrado de lado 2, existe um
quadrado menor que deve conter dois pontos (dentro ou em cima de seus lados).


Como a distância máxima num quadrado de lado 1 é sua diagonal que
√ mede 2, os dois
pontos dentro do mesmo quadrado têm distância menor ou igual a 2, como queríamos
demonstrar.

Exemplo 22.0.3. Considere o conjunto A = {1, 2, 3, . . . , 2022}. Escolhendo aleatoriamente


1012 elementos de A, existem dois deles cujo mdc é 1.
Temos 1011 pares de números consecutivos, a saber os pares

{1, 2}, {3, 4}, {5, 6}, . . . , {2021, 2022}.

Como pegamos 1012 números, há dois deles que estão no mesmo conjunto acima. Ou seja,
existem dois deles que são consecutivos, digamos i e i + 1. Utilizando o fato que i e i + 1
sempre são primos entre si, concluímos que mdc(i, i + 1) = 1.

Exemplo 22.0.4. Dados 2023 números naturais, provar que existem dois deles cuja diferença
é um múltiplo de 2022.
Seja A = {a1 , a2 , . . . , a2023 } o conjunto desses tais números. Pelo algoritmo da divisão

116
Princípio das Gavetas

euclidiana, cada ai pode ser escrito na forma

ai = 2022 · qi + ri , (22.1)

onde 0 ≤ ri < 2022. Ou seja, para cada i, temos 2022 possibilidades para o número ri , a
saber os valores 0, 1, 2, . . . , 2021. Como temos 2023 números no conjunto A e apenas 2022
possibilidades para o resto de cada um deles na divisão por 2022, devem haver, pelo princípio
das gavetas, dois deles, digamos am e an , que deixam mesmo resto, digamos r. Assim, temos
que

am = 2022 · qm + r
an = 2022 · qn + r.

Tomando a diferença obtemos que

am − an = (2022 · q1 + r) − (2022 · q2 + r)
= 2022 · (qm − qn ),

um múltiplo de 2022, o que demonstra o que queríamos.

Exemplo 22.0.5. Mostre que todo inteiro positivo n tem um múltiplo que só tem algarismos
0 e 1.
Para isto, imitaremos a demonstração do Exemplo 22.0.4 em certo sentido. Considere os
n + 1 números da forma
i vezes
z }| {
ai = 1111 . . . 1,

onde 1 ≤ i ≤ n + 1. Então, por um argumento semelhante ao do exemplo anterior, existem


n + 1 números inteiros qi e ri tais que

ai = n · qi + ri ,

onde 0 ≤ ri < n. Daí, temos n + 1 números ai e apenas n opções de resto (os números
0, 1, 2 . . . , n − 1). Pelo príncipio das gavetas, existe dois índices m e n tais que am e an têm
mesmo resto na divisão por n. Suponha am > an .
Já sabemos que am − ak é múltiplo de n, resta provar que é um número formado apenas
por algarismos 0 e 1. De fato, temos que

1. . . 11. . . 1
− 1. . . 1
1. . . 10. . . 0

onde o primeiro número acima tem m algarismos 1 e o que está sendo subtraído tem k
algarismos 1. O resultado (am −an ) inicia com m−k algarismos 1 e termina com k algarismos
0.

No exemplo a seguir, consideraremos que duas pessoas A e B se conhecem mutuamente quando


A conhece B e B conhece A. O mesmo vale para um grupo maior de pessoas, no sentido de que
um grupo com n pessoas se conhece mutuamente se cada par de pessoas no grupo se conhece
mutuamente.

117
Princípio das Gavetas 22.1. Exercícios Propostos

Exemplo 22.0.6 (Número de Ramsey). Considere um grupo com 6 pessoas. Provar que
sempre existem 3 pessoas que se conhecem mutuamente ou 3 pessoas que se desconhecem
mutuamente.
Observe que podemos desenhar um grafo para a situação. Nele, cada uma das seis pessoas
é um vértice e indicamos se duas pessoas se conhecem ligando os vértices que os representa
por uma aresta azul; e ligamos os dois vértices por uma aresta vermelho se as duas pessoas
não se conhecem.
No grafo, cada vértice tem 5 arestas que incidem sobre ele. Pelo princípio das gavetas,
pelo menos 3 dessas arestas é azul ou vermelho. Suponha, sem perda, que há três arestas
vermelhas incidindo sobre o vértice F e (de Felipe). Abaixo representamos essa situação

V1
V2

Fe V5

V3
V4

Se os três vértices V1 , V2 , V3 (de Verônica, Verão e Vonildo) se ligam por arestas azuis, então
temos 3 pessoas que se conhecem mutuamente e satisfazemos o que queremos. Caso contrário,
há dois deles, digamos V1 e V2 , que se ligam por aresta vermelha. Assim V1 , V2 , F e se ligam
por arestas vermelhas e portanto se desconhecem mutuamente.

§22.1 Exercícios Propostos


1. Suponha que você tenha 8 meias brancas e 7 meias pretas misturadas em uma gaveta escura.
Você seleciona as meias aleatoriamente. Qual é o número mínimo de meias que você deve
pegar para garantir que tenha pelo menos um par da mesma cor?

2. Num conjunto de 400 pessoas, quantas pessoas com CERTEZA, nasceram num mesmo mês
?

3. Uma prova com 6 questões que tem 4 alternativas cada uma foi aplicada numa sala. Sabe-se
que houve duas provas que tiveram exatamente as mesmas respostas. Quantas pessoas no
mínimo tinham fazendo a prova?

4. Dê um exemplo mostrando que com 5 pessoas o exemplo (22.0.6) não é verdade.

5. Prove que existe uma potência de três que termina com os algarismos 001.

6. Uma matriz 3 × 3 só tem algarismos −1, 0, 1. Prove que ,entre as oito somas possíveis (
linhas, colunas e diagonais) , há duas que têm a mesma soma.

7. (IMO) Prove que, em um conjunto de números inteiros positivos de dois dígitos cada, há
sempre dois subconjuntos disjuntos cujas somas de seus elementos são iguais.

8. (OBM 1991) Demonstre que existem infinitos múltiplos de 1991 que são da forma 1999...9991.

118
23 Espaços de Probabilidade
A probabilidade vai tratar de experimentos aleatórios. Experimentos aleatórios é aquilo que
não se pode prever. Por exemplo, lançar uma moeda e saber qual face ficará voltada para cima.
Saber se irá chover amanhã. Tudo isso são experimentos aleatórios.
Definição 23.1. Um espaço amostral, que denotaremos pela letra grega (Ω, lê-se ômega), é o
conjunto de todos os resultados possíveis de um experimento aleatório.
Definição 23.2. Um evento é qualquer subconjunto A ⊂ Ω.

Exemplo 23.0.1. Jogar uma moeda e observar A face. Neste caso, Ω = {cara, coroa}

Exemplo 23.0.2. Jogar um dado e observar o número da face voltada para cima. Neste
caso, Ω = {1, 2, 3, 4, 5, 6}. Ainda neste exemplo, poderíamos ter o evento A = sair face par.
Neste caso, A = {2, 4, 6}.

Exemplo 23.0.3. Qual a probabilidade de ao jogarmos um dado, sair uma face par voltada
para cima ?
Solução. A nossa intuição diz que isso deveria ser 1/2. Pois temos 3 números pares num
total de 6. Seja A = {2, 4, 6}. Denote por P a probabilidade. Temos então

|A| 3 1
P (A) = = = .
|Ω| 6 2

O exemplo acima é um protótipo do que conhecemos como probabilidade uniforme. Que é


quando cada elemento do espaço amostral tem a mesma probabilidade. Mais precisamente, Seja
1
Ω = {a1 , a2 , · · · , an }. P (ai ) = . Neste caso, podemos definir então a probabilidade de um
n
evento A ⊂ Ω como sendo
|A|
P (A) =
|Ω|
onde |X| denota o número de eleentos do conjunto X. Note que dessas condições temos
(i) P (Ω) = 1;
(ii) 0 ≤ P (A) ≤ 1;
(iii) Se A e B são eventos disjuntos, então P (A ∪ B) = P (A) + P (B).
|Ω|
Demonstração. (i) P (Ω) = = 1.
|Ω|
(ii) O número de elementos de A é sempre maior ou igual a zero e no máximo o número de
elementos do espaço amostral Ω.
(iii) Segue do principio aditivo, pois se A e B são disjuntos então |A ∪ B| = |A| + |B| e portanto
|A ∪ B| |A| + |B| |A| |B|
P (A ∪ B) = = = + = P (A) + P (B).
|Ω| |Ω| |Ω| |Ω|

119
Espaços de Probabilidade

Exemplo 23.0.4. Duas moedas são jogadas ao mesmo tempo. Qual a probabilidade de sair
Duas caras voltadas para cima ?
Solução. Denote Ca para representar Cara e Co para representar Coroa. O espaço amostral
Ω é Ω = {(Ca, Ca), (Ca, Co), (Co, Ca), (Co, Co)} O evento sair duas caras voltadas para
cima é A = {(Ca, Ca)}. Logo a probabilidade pedida é

|A| 1
P (A) = = .
|Ω| 4

A definição de probabilidade não precisa ser essa uniforme de casos favoráveis sobre casos possíveis.
Vamos imitar o que fizemos acima para probabilidade uniforme e definir uma probabilidade um
pouco mais geral.

Definição 23.3. Dado um espaço amostral Ω, definimos uma probabilidade P como sendo uma
função P que satisfaz

(i) 0 ≤ P (A) ≤ 1;

(ii) P (Ω) = 1;

(iii) Se A e B são eventos disjuntos, então P (A ∪ B) = P (A) + P (B).

Proposição 23.0.5 – (1) P (Ω \ A) = 1 − P (A).

(2) Se A ⊂ B então P (B \ A) = P (B) − P (A).

(3) Se A ⊂ B então P (A) ≤ P (B).

(4) Se A e B são eventos não necessariamente disjuntos então P (A ∪ B) = P (A) + P (B) −


P (A ∩ B).
Demonstração. (1) Note que 1 = P (Ω) = P (A ∪ (Ω \ A) = P (A) + P (Ω \ A)) e logo segue
o resultado.
(2). Para 2, veja que vale a seguinte decomposição disjunta do conjunto B = (B \ A) ∪ A.
Portanto,
P (B) = P ((B \ A) ∪ A) = P (B \ A) + P (A)
segue então que
P (B \ A) = P (B) − P (A).
(3). Como P (C) ≥ 0 qualquer que seja o conjunto C ⊂ Ω, em particular, P (B \ A) ≥ 0,
pelo item (2), P (B) − P (A) = P (B \ A) ≥ 0 e portanto P (A) ≤ P (B).
(4). Para (4), faça a seguinte decomposição disjunta do conjunto A∪B. A∪B = A∪(B \A).
Assim,

P (A ∪ B) = P (A ∪ (B \ A)) = P (A) + P (B \ A)

Por outro lado, B = (B \ A) ∪ (A ∩ B), daí P (B) = P (B \ A) + P (A ∩ B). o que implicq


que P (B \ A) = P (B) − P (A ∩ B). Concluimos que

P (A ∪ B) = P (A ∪ (B \ A)) = P (A) + P (B) − P (A ∩ B).

120
Espaços de Probabilidade 23.1. Exercícios Propostos

Exemplo 23.0.6. É escolhido aleatoriamente um número entre 1 e 300. Qual a probabilidade


dele ser divisível por 3 ou por 5 ?
Solução. Seja A o conjunto dos inteiros entre 1 e 300 que são divisíveis por 3. Seja B o
conjunto dos inteiros positivos entre 1 e 300 que são divisíveis por 5. Neste caso A ∩ B é o
conjunto dos inteiros positivos entre 1 e 300 que são divisíveis por 15. Veja que o queremos
calcular é P (A ∪ B). Note que |A| = 100,|B| = 60 e |A ∩ B| = 20. Logo
100 60 20 7
P (A ∪ B) = P (A) + P (B) − P (A ∩ B) = + − = .
300 300 300 15

Exemplo 23.0.7. Em um grupo de n pessoas, qual a probabilidade de haver pelo menos


duas que faz aniversário no mesmo dia ?
Solução. Chamemos de P (n) essa probabilidade. Vamos calcular primeiramente a pro-
babilidade do complementar. Ou seja, de todas as n pessoas fazerem aniversário em dias
diferentes.
A primeira pessoa pode escolher qualquer dia do ano (365 possibilidades), a segunda pessoa
pode escolher um dia diferente (364 possibilidades), a terceira pessoa pode escolher outro
dia diferente (363 possibilidades) e assim por diante, até a última pessoa escolher um dia
diferente (365 − (n − 1) possibilidades). Portanto, a probabilidade de que todas as n pessoas
tenham aniversários diferentes é:
365 · 364 · 363 · · · · (365 − (n − 1))
365n
Logo,
365 · 364 · 363 · · · · (365 − (n − 1))
P (n) = 1 − .
365n
Por exemplo, P (25) = 57%, P (50) = 97% e P (60) = 99.5%.

Exemplo 23.0.8. D = {1, 2, · · · , 365}. Escolhendo um subconjunto de 2 elementos de D


ao acaso, qual a probabilidade de a soma de seus elementos ser 183?
Solução. O número de subconjuntos de 2 elementos é 365 2 . Dentre esses, os que dão soma
183 são {1, 182}, {2, 181} · · · {91, 92} que são num total de 91 conjuntos. Logo a probabilidade
pedida é
91 182 1
365 = 365 · 364 = 730 .
 (23.1)
2

§23.1 Exercícios Propostos


1. Em um baralho de 52 cartas, qual a probabilidade de escolher um Ás?

2. Uma urna contém 8 bolas vermelhas e 4 bolas azuis. Se duas bolas forem retiradas sem
reposição, qual a probabilidade de que ambas sejam vermelhas?

3. Uma moeda justa é lançada 3 vezes. Qual a probabilidade de obter cara em todas as três
vezes?

4. Um dado de seis faces é lançado duas vezes. Qual a probabilidade de obter um número par
no primeiro lançamento e um número ímpar no segundo lançamento?

121
Espaços de Probabilidade 23.1. Exercícios Propostos

5. Um pacote de cartas contém 10 cartas numeradas de 1 a 10. Se duas cartas forem selecionadas
ao acaso, com reposição, qual a probabilidade de que ambas tenham números pares?

6. Um armário tem 8 repartições, em 4 níveis, como mostra a figura abaixo.


Ocupando-se metade das repartições,qual a probabilidade de que se tenha uma repartição
ocupada em cada nível ?

7. Para determinada prova, são sorteados 3 questões dentre um conjunto de 5 questões. É


aprovado o aluno que acertar pelo menos duas das três questões. Um aluno sabe 3 das 5
questões , qual a probabilidade dele passar na prova ?

8. Se 20 pessoas querem se sentar em fila, entre os quais estão Felipe e João. Qual a
probabilidade de haver exatamente 5 pessoas entre Felipe e João?

9. Numa caixa tem n bolinhas numeradas de 1 a n. Três bolinha são sortedas ( sem reposição).
Calcule a probabilidade das 3 bolinhas terem números consecutivos.

10. Considere uma população com 10000 homens e 10000 mulheres, em que sejam daltônicos
5% dos homens e 025% das mulheres. Calcule a probabilidade de que seja mulher uma
pessoa daltônica selecionada dessa população.

11. (ITA) Em um espaço amostral com uma probabilidade P , são dados os eventos A, B, C
tais que P (A) = P (B) = 12 , com A e B independentes. P (A ∩ B ∩ C) = 16 1
e sabe-se que
P ((A ∩ B) ∪ (A ∩ C)) = 10 . Calcule as probabilidade condicionais P (C|A ∩ B e P (C|A ∩ B c ).
3

12. (OBMU) Jogamos 10 dados comuns (com 6 faces equiprováveis numeradas de 1 a 6). Calcule
a probabilidade de que a soma dos 10 resultados seja igual a 20

13. (OBMU) Joãozinho joga repetidamente uma moeda comum e honesta. Quando a moeda dá
cara ele ganha 1 ponto, quando dá coroa ele ganha 2 pontos. Encontre a probabilidade (em
função de n) de que Joãozinho em algum momento tenha exatamente n pontos.

122
24 Probabilidade Condicional
No exemplo abaixo, Ω é o conjunto dos possíveis resultados em um dado de 6 faces não-viciado,
ou seja, Ω = {1, 2, 3, 4, 5, 6}.

Exemplo 24.0.1. Um dado não-viciado foi lançado. Responda os seguintes itens.

a. Qual a probabilidade de o resultado ser menor ou igual a 3?

b. Sabendo que o resultado é um número primo, qual a probabilidade dele ser menor ou
igual a 3?

a. Estamos interessados no eventos A =“o resultado é um número menor ou igual a 3”.


Assim, temos que

A = {resultado menor ou igual a 3} = {1, 2, 3},

e portanto

|A| 3 1
P(A) = = = .
|Ω| 6 2

b. Agora considerando o evento B =“o resultado é um número primo”, temos que


B = {2, 3, 5}, de onde segue que A ∩ B = {2, 3} e portanto |B| = 3 e |A ∩ B| = 2. Assim,
queremos calcular a probabilidade

|A ∩ B| 2
P(A|B) = = .
|B| 3

Definição 24.1. A probabilidade condicional de A dado que ocorreu B é

P(A ∩ B)
P(A|B) := ,
P(B)

onde A e B são eventos no espaço amostral Ω.

Exemplo 24.0.2. Uma urna contém 4 bolas brancas e 6 bolas pretas. Retiram-se alea-
toriamente duas bolas da urna sem reposição. Determine a probabilidade de ambas serem
brancas.
Considere os eventos

A = “a primeira bola é branca”


B = “a segunda bola é branca”.

Queremos calcular P(A ∩ B), que satisfaz

P(A ∩ B) = P(B|A) · P(B).

Nos ocuparemos em calcular P(B|A) e P(B). Para o evento B, temos 4 casos favoráveis (as 4
bolas brancas) dentro de 10 possíveis (as 10 bolas totais), de onde P(B) = 25 . Agora dado

123
Probabilidade Condicional

que A ocorreu, temos que a primeira bola retirada foi branca. Sabendo que não há reposição,
sobram para a segunda retirada, 9 bolas, das quais apenas 3 são brancas. Daí, P(B|A) = 13 .
Com os dois resultados acima, concluímos que
1 2 2
P(A ∩ B) = · =
3 5 15

Exemplo 24.0.3. Talita está pensando em escrever uma carta para Ana. A probabilidade
de Taqlita escrever tal carta é 10
8
. O correio da cidade de Talita não perde a carta com
probabilidade 10 . Dado que o correio não perdeu a carta, a probabilidade de o carteiro da
9

cidade de Ana entregar é 109


. Dado que Ana não recebeu a carta, qual a probabilidade de
Talita não ter escrito.
Temos o seguinte diagrama, com as probabilidades indicadas nos parenteses

Talita escreve a carta?

Não escreveu ( 10
2
) Sim, escreveu ( 10
8
)

Correio não perdeu ( 10


9
) Correio perdeu ( 10
1
)

Carteiro entregou ( 10
9
) Carteiro não entregou ( 10
1
)

Note que estamos interessados há três formas possíveis (e mutuamente exclusivas) de Ana
não receber a carta:

1. Talita não escreveu a carta;

2. Talita escreveu, mas o correio perdeu a carta;

3. Talita escreveu, o correio não perdeu, mas o carteiro não entregou a carta.

Denote por A o evento “Talita não escreveu a carta” e B o evento “Ana não recebeu a carta”.
Não é difícil ver que P(A) = 10 2
. Além do mais, pelo diagrama acima e utilizando os itens
1., 2. e 3. acima, conseguimos ver que P(B) = 10
2 8
+ 10 1
· 10 8
+ 10 9
· 10 1
· 10 352
= 1000 . Por último, note
que P(A ∩ B) = P(A), já que A está contido em B. Concluímos, portanto que a probabilidade
de A dado B (o que queremos calcular) é dada por

P(A ∩ B) P(A)
P(A|B) = =
P(B) P(B)
2
10 25
= 352 = ,
1000
44

a probabilidade pedida na questão.

124
Probabilidade Condicional 24.1. Exercícios Propostos

Provaremos que dado um evento de probabilidade positiva A em Ω, então a função definida

PA : Ω → [0, 1]
B 7→ PA (B) = P(B|A)

é uma probabilidade. Lembre-se que P : Ω é uma probabilidade se para cada A, B ∈ Ω, satisfaz

i. P (Ω) = 1;

ii. 0 ≤ P (A) ≤ 1;

iii. P (A ∪ B) = P (A) + P (B) se A ∩ B = ∅.

Prossigamos então para a

Proposição 24.0.4 – Seja A um evento de probabilidade positiva. Então a função PA é uma


probabilidade.

Demonstração. Sejam B, C ∈ Ω com B ∩ C = ∅. Então

i. Por definição de probabilidade condicional etemos que

P(Ω ∩ A) P(A)
PA (Ω) = = = 1;
P(A) P(A)

ii. Para ver que PA (B) ≥ 0 observe que

P(A ∩ B)
PA (B) = ≥ 0,
P (A)

pois P é uma probabilidade. Além do mais, temos que A ∩ B ⊂ A, de onde P(B ∩ A) ≤ P(A)
e portanto
P(A ∩ B)
PA (B) = ≤ 1.
P (A)
iii. Por fim, observe que

P((B ∪ C) ∩ A)
PA (B ∪ C) = .
P(A)

Por outro lado, sabemos que (B ∪ C) ∩ A = (B ∩ A) ∪ (C ∩ A). Para concluir a demonstração,


observe que como são disjuntos B e C, então são disjuntos B ∩A e C ∩A (estamos diminuindo
conjuntos disjuntos, logo a interseção continua vazia). Daí, por definição de probabilidade
temos que
P((B ∪ C) ∩ A) = P(B ∩ A) + P(C ∩ A).
Substituindo a expressão acima em PA (B ∪ C), obtemos o resultado desejado, ou seja, que
PA (B ∪ C) = PA (B) + PA (C) sempre que B ∩ C = ∅.

§24.1 Exercícios Propostos


1. Escolhendo-se ao acaso um número entre 1 e 50. Se o número é primo, qual a probabilidade
de que seja ímpar ?

2. Uma moeda equilibrada é jogada duas vezes. Sejam A e B os eventos:

125
Probabilidade Condicional 24.1. Exercícios Propostos

• A: cara na primeira jogada


• B: cara na segunda jogada.
Verfique que A e B são independentes.

3. Se A e B são eventos independentes tais que P (A) = 1


3 e P (B) = 12 . Calcule :
(a) P (A ∪ B);
(b) P ((Ω \ A) ∪ (Ω \ B)).

4. Joguei um dado duas vezes. Calcule a probabilidade de obter 3 na primeira jogada, sabendo
que a soma dos resultados foi 7.

5. Prove que se A e B são independentes então A e Ω \ B também são.

6. Uma urna contém 10 bolas numeradas de 1 a 10. Sacam-se , com reposição, 4 bolas dessa
urna. Sejam X e Y respectivamente o mínimo e o máximo dos números das bolas sacadas.
Calcule
(a) P (X > 3)
(b) P (X < 3)
(c) P (X = 3)
(d) P (X = 3|Y = 9)

7. Felipe lança uma moeda não-viciada 4 vezes. João lança a mesma moeda 3 vezes. Calcule a
probabilidade de Felipe obter mais caras do que João.

8. Quantas vezes, no mínimo, se deve lançar um dado não viciado para que a probabilidade de
obter algum 6 seja superior a 0.9 ?

9. Um júri de 3 pessoas tem dois jurados que decidem corretamente ( cada um ) com probabi-
lidade p e um terceiro jurado que decide por cara ou coroa. As decisões são tomadas por
maioria. Outro júri tem probabilidade p de tomar uma decisão correta. Qual dos júris tem
maior probabilidade de acerto ?

10. Um prisioneiro possui 50 bolas brancas, 50 bolas pretas e duas urnas iguais. O prisioneiro
deve colocar do modo que preferir as bolas nas duas urnas ( nenhuma das urnas pode ficar
vazia ). As urnas serão embaralhadas e o prisioneiro deverá, de olhos fechados, escolher
uma urna e, nesta urna, uma bola. Se a bola for branca ele será libertado e, caso contrário,
condenado. Como deve proceder o prisioneiro para maximizar a probabilidade de ser
libertado ?

11. Considere uma população com 10000 homens e 10000 mulheres, em que sejam daltônicos
5% dos homens e 025% das mulheres. Calcule a probabilidade de que seja mulher uma
pessoa daltônica selecionada dessa população.

12. (ITA) Em um espaço amostral com uma probabilidade P , são dados os eventos A, B, C
tais que P (A) = P (B) = 12 , com A e B independentes. P (A ∩ B ∩ C) = 16 1
e sabe-se que
3
P ((A ∩ B) ∪ (A ∩ C)) = 10 . Calcule as probabilidade condicionais P (C|A ∩ B e P (C|A ∩ B c ).

126
25 Variáveis Aleatórias
Começaremos definindo o objeto central desta seção.
Definição 25.1. Uma variável aleatória é uma função
X : Ω → R.
Uma variável aleatória associa para cada evento do espaço amostral um valor. É útil definir as
variáveis aleatórias de forma esperta de acordo com o problema.

Exemplo 25.0.1. Imagine o experimento que consiste em lançar uma moeda n vezes.
Podemos definir uma variável aleatória X que conta a quantidade de caras que aparece nos
lançamentos. Normalmente representamos assim

X = “número de caras nos n lançamentos”.

Para dois lançamentos, por exemplo, temos espaço amostral Ω = {CC, CK, KC, KK}. Então
X(CC) = 2, X(CK) = X(KC) = 1 e X(KK) = 0.

Exemplo 25.0.2. Lança-se um dado um total de 3 vezes. Defina a variável aleatória

X = “máximo dentre os 3 resultados”.

Por exemplo, se o primeiro dado deu 3; o segundo, 4; e o terceiro, 2, ou seja, o evento 342,
temos que X(342) = 4. Por outro lado, X(166) = X(653) = 6.

Agora vamos calcular a probabilidade de uma variável aleatória assumir um valor desejado.

Exemplo 25.0.3. Lança-se um dado honesto um total de 2 vezes. Defina a variável aleatória

X = “máximo dentre os 2 resultados”.

Vamos calcular P(X = 6).


Comece observando que os resultados possíveis são um dos 36 pares ordenados

(1, 1), (1, 2), . . . , (6, 5), (6, 6),

todos com mesma probabilidade. Os resultados favoráveis são aqueles que têm 6 na primeira
ou na segunda coordenada. Ou seja,

{X = 6} = {(1, 6), (2, 6), (3, 6), (4, 6), (5, 6), (6, 6),
(6, 1), (6, 2), (6, 3), (6, 4), (6, 5)},

de onde segue que |{X = 6}| = 11. Daí, temos que


11
P(X = 6) = .
36

Definição 25.2. Seja X uma variável aleatória. A esperança (ou valor esperado) de X é definida
como sendo o valor X
E(X) = x · P(X = x).

127
Variáveis Aleatórias

Note que na soma acima só não zeram os valores em que P(X = x) é diferente de 0. Assim, só
precisamos realizar a soma sobre os valores x tais que P(X = x) ̸= 0.
Continuando na saga das variáveis aleatórias, calcularemos agora o valor esperado de caras em
um determinado experimento com lançamento de moedas utilizando uma variável aleatórias que
conta as caras depois de realizado o experimento.

Exemplo 25.0.4. Lança-se uma moeda 3 vezes. Defina a variável aleatória

X = “número de caras nos 3 lançamentos”.

Iremos calcular o valor esperado de caras utilizando a variável aleatória X.


Note que a variável aleatória X pode assumir apenas algum dos quatro valores 0, 1, 2, 3.
Por definição de valor esperado, temos que

E(X) = 0 · P(X = 0) + 1 · P(X = 1) + 2 · P(X = 2) + 3 · P(X = 3)


1 3 3 1 1
=0· +1· +2· +3· =3· .
8 8 8 8 2

Deixamos o resultado na forma 3 · 12 de maneira proposital. Veremos agora que para o tipo
de experimento realizado no Exemplo 25.0.4, a esperança de X é np, onde n é o número de
lançamentos e p é a probabilidade de sair o resultado que a variável aleatória X conta.

Distribuição Uniforme. Seja X uma variável aleatória que assume os valores x1 , x2 , . . . , xn .


Se P(X = xi ) = n1 para todo 1 ≤ i ≤ n, diremos que X tem distribuição uniforme

Distribuição de Bernoulli. Diremos que X é uma variável aleatória com distribuição de


Bernoulli se X assume apenas os valores 0 e 1, com probabilidades P (X = 0) = 1 − p e
P (X = 1) = p.

Costumamos escrever X ∼ Be(p) para indicar que X tem distribuição de Bernoulli com
probabilidade P(X = 1) = p.

Exemplo 25.0.5. O experimento mais comum é o do lançamento de uma única moeda


honesta, uma única vez, em que X indica se o resultado de cara. Temos a variável aleatória

0, se o resultado é coroa;

X=
1, se o resultado é cara.

Neste caso, associamos ao evento {X = 1} probabilidade 12 e ao evento {X = 0}, probabilidade


2 . Podemos, mais geralmente tratar experimentos aos resultados de um experimento os status
1

de sucesso ou fracasso. Neste caso, temos a variável aleatória com distribuição de Bernoulli,
X que assume o valor 0 em caso de fracasso (com probabilidade 1 − p) e assume o valor 1
em caso de sucesso (com probabilidade p).

Distribuição Binomial. Diremos que X é uma variável com distribuição binomial se

128
26 Esperança
A esperança tem as seguintes propriedades.

Proposição 26.0.1 – Sejam X e Y variáveis aleatórias e c um número real então

1. E(X + Y ) = E(X) + E(Y )

2. E(X) = c se X for constante igual a c.


X
3. E(f (X)) = f (x)P (X = x).
x∈Im(X)

Definição 26.1. Seja X uma variável aleatória com E(X) = µ. A variância de X, denotada por
V (X) é
V (X) = E((X − µ)2 ).
A variância é uma medida de quanto a variável aleatória se afasta da Esperança.

Exemplo 26.0.2. Jogue um dado não-viciado. Seja X é o número da face voltada para
7
cima. Já vimos que E(X) = . Calcule V (X).
2
Solução.
X  7 2

7 2
V (X) = E((X − ) ) = x− P (X = x)
2 2
x∈Im(X)
2 2 2 2
7 2 1 7 2 1
       
7 1 7 1 7 1 7 1
= 1− · + 2− · + 3− · + 4− · + 5− · + 6− ·
2 6 2 6 2 6 2 6 2 6 2 6
 
1 25 9 1 1 9 25 35
= + + + + + = .
6 4 4 4 4 4 4 12

A proposição abaixo nos dá uma fórmula alternativa para a variância.

Proposição 26.0.3 – Seja X uma variável aleatória, então

V (X) = E(X 2 ) − (E(X))2 .


Demonstração. Por simplicidade, chame E(X) = µ.

V (X) = E((X − µ)2 ) = E(X 2 − 2µX + µ2 )


= E(X 2 ) − 2µE(X) + E(µ2 ) = E(X 2 ) − 2µ2 + µ2
= E(X 2 ) − µ2 .

Vamos listar aqui algumas propriedades da variância.

129
Esperança 26.1. Exercícios Propostos

Proposição 26.0.4 – 1. V (X + c) = V (X), para qualquer c ∈ R.

2. V (aX) = a2 V (X).

3. Se X e Y são independentes, então V (X + Y ) = V (X) + V (Y )


Vamos provar aqui apenas a propriedade 3. 1 e 2 deixaremos como exercício.

V (X + Y ) = E((X + Y )2 ) − (E(X + Y ))2 = E(X 2 + 2XY + Y 2 ) − (E(X) + E(Y ))2


= E(X 2 ) + 2E(XY ) + E(Y 2 ) − [(E(X))2 + 2E(X)E(Y ) + (E(Y ))2 ]
= V (X) + V (Y )

Vamos calcular a variância de algumas variáveis aleatórias importantes que já vimos an-
tes.

Exemplo 26.0.5. Seja X uniforme no conjunto {1, · · · , n}. Calcule V (X). Primeiro,
começamos calculando E(X 2 ),
n
2
X 12 + 2 2 + . . . + n2
E(X ) = k 2 P (X = k) =
n
k=1

Lembrando da fórmula

n(n + 1)(2n + 1)
12 + 2 2 + . . . + n2 =
6
temos
n(n+1)(2n+1)
2 6
E(X ) =
n
Simplificando a expressão, temos:

(n + 1)(2n + 1)
E(X 2 ) =
6
n+1
Já vimos que E(X) = , portanto
2
 2
2 (n + 1)(2n + 1)
2 n+1
V (X) = E(X ) − (E(X)) = −
6 2
n2 − 1
= (26.1)
12

§26.1 Exercícios Propostos


Demonstração.1. Considere uma variável aleatória X com a seguinte função de massa de
probabilidade:

X 0 1 2 3
P (X) 0.1 0.2 0.4 0.3

Calcule a variância de X.

130
Esperança 26.1. Exercícios Propostos

2. Uma urna contém 5 bolas vermelhas e 7 bolas azuis. Duas bolas são retiradas sem reposição.
Seja X o número de bolas vermelhas retiradas. Determine E(X) e V (X).

3. Uma moeda viciada é lançada repetidamente até que ocorra o primeiro sucesso. A probabili-
dade de sucesso em um único lançamento é p. Seja X o número de lançamentos necessários.
Calcule sua variância.

4. Suponha que X seja uma variável aleatória com função de massa de probabilidade dada
por:

X −2 0 2 4
P (X) 0.1 0.3 0.4 0.2

Calcule a variância de X.

5. Um jogo consiste em lançar dois dados justos e somar os resultados obtidos. Seja X a soma
dos números obtidos nos lançamentos. Encontre a função de massa de probabilidade de X
e calcule sua variância.

6. Considere uma variável aleatória X com a seguinte função de massa de probabilidade:

X −1 0 1 2 3
P (X) 0.1 0.15 0.35 0.3 0.1

Calcule a variância de X.

7. Uma urna contém 8 bolas numeradas de 1 a 8. Três bolas são retiradas sem reposição. Seja
X o maior número observado. Calcule sua variância.

8. Considere um experimento em que você joga um dado justo até obter um número par. Seja
X o número de lançamentos necessários. Calcule sua variância.

131
27 Enunciado das Leis dos grandes números
Imagine que você esteja jogando um dado justo de seis faces. Agora seja X a variável aleatória
que anota a face que fica voltada para cima no dado.
Se você jogar o dado apenas algumas vezes, os resultados individuais podem variar considera-
velmente. Por exemplo, em três lançamentos consecutivos, você pode obter os números 2, 4 e 6.
A média desses três lançamentos é (2 + 4 + 6)/3 = 4.
No entanto, à medida que você continua jogando o dado um número cada vez maior de vezes,
você notará que a média dos resultados se aproxima de 3,5, que é a média da variável X. Quanto
mais vezes você jogar o dado, maior a probabilidade de a média dos resultados se aproximar de
3,5.
Esse é um exemplo clássico da Lei dos Grandes Números em ação. À medida que o número de
lançamentos do dado aumenta, a média dos resultados se aproxima da média. Mais precisamente
temos a seguinte proposição.

Proposição 27.0.1 – (Lei fraca dos Grandes Números) Sejam X1 , X2 , · · · , variáveis aleatórias
independentes todas elas com mesma média E[Xi ] = µ, então

X1 + X2 + · · · + Xn
−→ µ
n
quando n tende ao infinito.

Proposição 27.0.2 – (Lei forte dos Grandes Números) Sejam X1 , X2 , · · · , variáveis aleatórias
independentes todas elas com mesma média E[Xi ] = µ e V (Xi ) < ∞, então dado ε > 0
 
X1 + X2 + · · · + Xn
P − µ ≥ ε −→ 0
n

Dito, de outra maneira,


 
X1 + X2 + · · · + Xn
P − µ < ε −→ 1
n

A lei dos grandes nos afirma que à medida que aumentamos o número de experimento, a
probabilidade dele ficar ”longe” dá média vai ficando cada vez mais perto de zero. Essa lei segue de
uma desigualdade probabilística muito importante que é desigualdade de Chebyshev.

Proposição 27.0.3 – (Desigualdade de Chebyshev) Seja X uma variável aleatória com


E[X] = µ, então para qualquer ε > 0

V (X)
P (|X − µ| ≥ ε) ≤
ε2

Vamos dá uma ideia da demonstração da Lei forte dos grandes números como aplicação da
X1 + · · · + Xn
Desigualdade de Chebyshev. Seja X = , então
n
E[Xi ] = µ e V (Xi ) = σ 2

132
Enunciado das Leis dos grandes números 27.1. Exercícios propostos

, assim usando propriedades da variância, temos

σ2
 
X1 + · · · + Xn 1
V (X) = V = 2 V (X1 + · · · + Xn ) = .
n n n

Assim pela Desigualdade de Chebyshev, temos

σ2
 
X1 + X2 + · · · + Xn V (X)
P −µ ≥ε ≤ = −→ 0
n ε2 nε2

§27.1 Exercícios propostos


1. Faça uma simulação de jogar um dado algumas milhares de vezes e registre os resultados.
Compare a média dos resultados com o valor esperado.

2. Considere uma variável aleatória X com média 10 e variância 25. Utilizando a Desigualdade
de Chebyshev, determine o limite superior para a probabilidade de X estar no intervalo de
0 a 20.

3. Seja X uma variável aleatória com média 5 e variância 9. Utilize a Desigualdade de


Chebyshev para obter uma estimativa superior para a probabilidade de X estar no intervalo
de 1 a 9.

4. Jogue uma moeda 100 vezes. Ache uma cota superior para a probabilidade do número de
caras ser pelo menos 40 e no máximo 60.

5. Seja X uma variável aleatória com E(X) = 0 e V (X) = 1. Ache o maior inteiro k tal que
P (|X| ≥ k) ≤ 0.1 ?

6. Seja X uma variável aleatória cuja imagem é 0, 1, 2, · · · , n. Além disso, E(X) = V (X) = 1.
1
Mostre que para qualquer inteiro positivo k, P (X ≥ k + 1) ≤ 2 .
k
7. Seja X uma variável aleatória com E(X) = µ e V (X) = σ 2 . Use a desigualdade de
Chebyshev para mostrar que
1
P (|X − µ| < kσ) ≥ 1 − .
k2

8. Seja X o número de caras em 100 lançamentos de uma moeda. Use o teorema central do
limite para estimar as probabilidades abaixo.
a) P (X ≤ 45)
b) P (45 < X < 55)
c) P (X > 63).

9. Seja X o número de caras em 200 lançamentos de uma moeda. Estime P (X = 90).

10. Considere uma dado especial com 10 faces numeradas de 1 a 10. Jogue esse dado 10000
vezes. Seja X o número de vezes que a face 3 ficou virada para cima. Faça o que se pede.
a) Calcule E(X)
b) Calcule V (X).
c) Use o teorema central do limite para estimar a probabilidade de sair no máximo 931
números 3.

133
Enunciado das Leis dos grandes números 27.1. Exercícios propostos

11. Uma moeda justa é jogada 400 vezes. Seja X o número de caras no lançamentos.Determine
o número xa tal que a probababilidade de X estar entre 200−a e 200+a é aproximadamente
80%.

12. Um dado é jogado 420 vezes. Qual a probabilidade da soma dos resultados obtidos estar
entre 1400 e 1550?

134
28 Enunciado do Teorema Central do
Limite
Para falar sobre o Teorema Central do Limite precisamos introduzir a distribuição Normal de
Gauss. Vimos até então exemplos de distribuições discretas. A Distribuição Normal de Gauss é
um primeiro exemplo de Distribuição Contínua.

Definição 28.1. Uma variável aleatória X tem distribuição normal de Gauss com média 0 e
variância 1. se Z b
1 2
P (a ≤ X ≤ b) = √ e−x /2 dx. (28.1)
2π a
1 2
A função f (x) = √ e−x /2 é a função densidade da distribuição Normal.

Proposição 28.0.1 – (Teorema Central do Limite) Sejam X1 , · · · , Xn · · · uma sequência de


variáveis aleatórias independentes todas com a mesma média E(Xi ) = µ e V (Xi ) = σ 2 então

X1 + · · · + Xn nµ
− √ −→ N (0, 1) (28.2)
n σ n

quando n → ∞.

Exemplo 28.0.2. Seja X o número de caras em 100 lançamentos de uma moeda não viciada.
Estime P (X ≤ 45).
45  
X 1 100
Solução. Se fôssemos fazer na força bruta isso seria . Daí iríamos precisar
2100 k
k=0
estimar os binomiais. Mas usando o o teorema central do limite sabemos que X se aproxima
de uma normal. Precisamos só padronizar ela. Calcular a esperança e a variância de X. Já
vimos antes que
100 1 1
E(X) = = 50 e V (X) = 100 · · = 25
2 2 2
Portanto,
X − 50 45 − 50
P (X < 45) = P ( < ) = P (Z < −1)
5 5
X − 50
onde Z = é uma normal com média 0 e variância 1. Usando uma tabela muito
5
conhecida de uma gaussiana temos que P (Z < −1) = 0.1587. Ou seja,

P (X < 45) = 15.87| = %.

§28.1 Exercícios Propostos


1. A concentração de um poluente em água liberada por uma fábrica tem distribuição N(8;
1,5). Qual a chance, de que num dado dia, a concentração do poluente exceda o limite
regulatório de 10 ppm?

135
Enunciado do Teorema Central do Limite 28.1. Exercícios Propostos

2. A altura

3. Seja X o número de caras em 100 lançamentos de uma moeda. Use o teorema central do
limite para estimar as probabilidades abaixo.
a) P (X ≤ 45)
b) P (45 < X < 55)
c) P (X > 63).

4. Seja X o número de caras em 200 lançamentos de uma moeda. Estime P (X = 90).

5. Considere uma dado especial com 10 faces numeradas de 1 a 10. Jogue esse dado 10000
vezes. Seja X o número de vezes que a face 3 ficou virada para cima. Faça o que se pede.
a) Calcule E(X)
b) Calcule V (X).
c) Use o teorema central do limite para estimar a probabilidade de sair no máximo 931
números 3.

6. Uma moeda justa é jogada 400 vezes. Seja X o número de caras no lançamentos.Determine
o número xa tal que a probababilidade de X estar entre 200−a e 200+a é aproximadamente
80%.

7. Um dado é jogado 420 vezes. Qual a probabilidade da soma dos resultados obtidos estar
entre 1400 e 1550?

136
III
Funções Elementares e Matrizes

137
29 Noções de Lógica e Indução Finita
§29.1 Proposição
Assim como construir uma casa se faz pondo um bloquinho de tijolo por vez, o avanço da ciência
se faz de modo extremamente similar, mas nesse caso, os “tijolos” normalmente são os trabalhos
feitos por um grupo anterior de cientistas e os resultados obtidos por eles. É claro que queremos
que nossa construção seja robusta e sem defeitos, assim, iremos criar ferramentas para verificar a
qualidade da nossa matéria prima em questão.
Vamos agora introduzir o elemento mais básico do nosso estudo:
Definição 29.1. Uma proposição é qualquer sentença que podemos julgar como verdadeira
ou falsa de maneira exclusiva, isto é, uma proposição não pode ser verdadeira e falsa ao mesmo
tempo. Quando duas sentenças P e Q serão equivalentes quando possuem o mesmo valor lógico e,
neste caso, escrevemos P ≡ Q.

Exemplo 29.1.1. Como exemplo de sentenças que são (ou não são) proposições mostramos
os seguintes
Francisco gosta de azul Qual sua idade ?
São Se π é par, então 2 + 2 = 4 8 ÷ (2 + 2) Não são
proposições Neymar é cantor ou piloto Eu gosto proposições

x2 + π = −1 Esta frase é falsa

Tipicamente expressamos proposições por letras maiúsculas, como, P, Q ou R. Denotando


proposições desse modo nos permite apenas considerar os valores lógicos delas, não levando em
conta o seu significado.

§29.2 Negação
Como cada proposição possui apenas um valor lógico, podemos estar interessados em inverter-lo.
Assim, definimos a negação de uma proposição e denotaremos a negação da proposição P por
∼P . Alguns autores preferem usar a notação ¬P para denotar negação de P .

Exemplo 29.2.1. Considerando as proposições P : “6 é par”, Q : “a bola é vermelha” e



R : x2 + π = −1 nós temos

P 6 é par ∼P 6 não é par


Q A bola é vermelha ∼Q A bola não é vermelha
√ √
R x2 + π = −1 ∼R x2 + π ̸= −1

E ao considerarmos S : “Está chovendo”, sua negação é ∼S : “Não está chovendo” e a


negação dessa proposição é ∼(∼S) : “Não é verdade que está chovendo”, que é equivalente a
“Está chovendo” e esta é precisamente a proposição S.

Pelo exemplo anterior, vemos que as proposições S e ∼(∼S) possuem o mesmo valor lógico.
Podemos ver que isso ocorre com qualquer proposição através da tabela verdade
P ∼P ∼(∼P )
V F V
F V F

138
Noções de Lógica e Indução Finita 29.3. Conectivos

Assim, podemos escrever simbolicamente que P ≡ ∼(∼P ).

§29.3 Conectivos
Imitando a nossa comunicação diária, podemos juntar duas proposições para criar uma situação
mais complexa, por exemplo:

“Estou comendo e você tem 15 anos”


“Sua mãe é alta ou baixa”

Nas duas sentenças anteriores usamos os conectivos “e/ou”. Normalmente o conectivo “e”
é usado para representar sentenças que ocorrem simultaneamente e este é representado simbo-
licamente por ∧ (esse operador é chamado de conjunção). Já o conectivo “ou” é usado para
representar que as sentenças não precisam necessariamente ocorrer simultaneamente e este é
representado simbolicamente por ∨ (esse operador é chamado de disjunção).

Exemplo 29.3.1. Considere as seguintes afirmações:

• P : 3 é ímpar • R : 5 é par

• Q : 4 é par • S : 6 é impar

Ora, é claro que P e Q são verdadeiros e R e S são falsos. Usando os conectivos podemos
criar as proposições

• P ∧ Q : 3 é ímpar e 4 é par • P ∧ R : 3 é ímpar e 5 é par

• R ∨ S : 5 é par ou 6 é ímpar • P ∨ S : 3 é ímpar ou 6 é impar

• ∼R ∧ P : 5 é ímpar e 3 é ímpar • R ∨ ∼P : 5 é par ou 3 é par

Usando os valores lógicos de P, Q, R e S concluímos que P ∧ Q, P ∨ S e ∼R ∧ P são


proposições verdadeiras e as outras demais são falsas.

Como vimos, os conectivos são responsáveis para combinar uma ou mais proposições, então
podemos separar proposições em duas categorias distintas. Chamamos de proposição simples
aquelas que são compostas apenas por uma proposição e proposição composta são aquelas que
contém duas ou mais proposições em sua composição.
Podemos resumir a natureza dos conectivos lógicos ∧ e ∨ pelas tabelas verdades :

P Q P ∧Q P Q P ∨Q
V V V V V V
F V F F V V
V F F V F V
F F F F F F

Observação 29.3.I. A conjuncão P ∧ Q é verdeira apenas quando P e Q são ambas


verdadeiras e a disjunção P ∨ Q é verdadeira quando pelo menos uma das proposições P e Q.

A proposição a seguir resume propriedades de extrema importância no cálculo sentencial.

139
Noções de Lógica e Indução Finita 29.4. Condicionais

Proposição 29.3.2 – Se P, Q e R são proposições, então valem

a) Comutatividade
(i) P ∨ Q ≡ Q ∨ P ;
(ii) P ∧ Q ≡ Q ∧ P ;

b) Associatividade
(i) P ∨ (Q ∨ R) ≡ (P ∨ Q) ∨ R;
(ii) P ∧ (Q ∧ R) ≡ (P ∧ Q) ∧ R;

c) Distributividade
(i) P ∧ (Q ∨ R) ≡ (P ∧ Q) ∨ (P ∧ R);
(ii) P ∨ (Q ∧ R) ≡ (P ∨ Q) ∧ (P ∨ R);

d) Leis de De Morgan
(i) ∼(P ∧ Q) ≡ ∼P ∨ ∼Q;
(ii) ∼(P ∨ Q) ≡ ∼P ∧ ∼Q.

Uma demonstração simples destes resultados pode ser realizada através de tabelas verdade.
Por exemplo, para verificar ∼(P ∧ Q) ≡ ∼P ∨ ∼Q podemos considerar a tabela

P Q ∼P ∼Q P ∧Q ∼(P ∧ Q) ∼P ∨ ∼Q
V V F F V F F
V F F V F V V
F V V F F V V
F F V V F V V

E como as duas últimas colunas coincidem em todas as linhas, então fica demonstrado que
∼(P ∧ Q) ≡ ∼P ∨ ∼Q.

§29.4 Condicionais
Há ainda proposições que transmitem a ideia de causa e consequência, isso naturalmente ocorre
no nosso dia a dia:

“Se eu estiver com dinheiro, então irei ao cinema.”


“Se amanhã é segunda-feira, então hoje é domingo.”
“Comemorarei se meu time ganhar.”

Na verdade, a matemática utiliza muito este tipo de sentença, por exemplo

Teorema (Teorema de Pitágoras) – Se △ABC é triângulo retângulo de hipotenusa AC,


então AC 2 = AB 2 + BC 2 .

Estas são proposições condicionais e a proposição condicional composta por P e Q será


representada por P → Q, onde lê-se “Se P , então Q”,“P é condição necessária para Q” ou “Q é
condição suficiente para P ”.

140
Noções de Lógica e Indução Finita 29.4. Condicionais

Exemplo 29.4.1. Para entendermos o funcionamento desse novo operador lógico vamos a
um exemplo do cotidiano: “Se nasci em Maceió, então sou alagoano”.
Esta proposição é a condicional gerada pelas proposições P : “Nasci em maceió” e Q : “Sou
alagoano”. Vamos procurar quando que esta sentença possui valor lógico falso. Faremos
algumas observações simples:

(i) Ora, se P for verdade, então é claro que Q também será.

(ii) De modo similar, se Q for falso, então P não pode ser verdade.

(iii) Se P for falso, então o valor lógico da nossa sentença muda de acordo com o valor de
Q. Basta que o nascimento seja em qualquer outro município alagoano e dai P → Q é
verdadeiro. E o outro caso nos dá uma contradição, onde P → Q é falsa.

Desse modo, o único caso que faz a proposição condicional P → Q ser falsa é quando P é
verdade e Q é falsa.

Embora o nosso último exemplo tenha a particularidade de P e Q possuírem uma relação


geográfica entre si, ela nos induz a definir o condicional através da tabela verdade

P Q P →Q
V V V
V F F
F V V
F F V

Note que P → Q tem valor lógico falso apenas quando P é verdadeiro e Q é falsa. Além disso,
observe que de qualquer afirmação falsa segue-se qualquer outra afirmação, independente se ela
for verdadeira ou não. Por exemplo, a proposição

“Se 5 é par, então eu sei voar”

é logicamente verdadeira.

Observação 29.4.I. Vale ressaltar que o operador condicional não é uma criação abstrata
de regras e sim na verdade uma composição de outras já tratadas. Para dar sustentação a
afirmação anterior mostraremos que

P → Q ≡ ∼P ∨ Q

De fato, basta considerar a tabela verdade de ambas as proposições mencionadas.

P Q ∼P P →Q ∼P ∨ Q
V V F V V
V F F F F
F V V V V
F F V V V

Há outro condicional, conhecido como proposição bicondicional e representada por P ↔ Q


onde lê-se “P se, e somente se, Q” ou “P é condição necessária e suficiente para Q”. Este operador
lógico será verdade quando P e Q possuírem o mesmo valor lógico. Assim, o seu comportamento
pode ser descrito pela seguinte tabela verdade

141
Noções de Lógica e Indução Finita 29.5. Tautologias

P Q P ↔Q
V V V
V F F
F F F
F V V

Exemplo 29.4.2. Como a nomenclatura e o símbolo sugerem, podemos verificar que

P ↔ Q ≡ (P → Q) ∧ (Q → P )

via tabela verdade.

P Q P →Q Q→P P ↔Q (P → Q) ∧ (Q → P )
V V V V V V
V F F V F F
F V V F F F
F F V V V V

Como as duas últimas colunas coincidem em todos os casos possíveis, então nossa afirmação
está provada.

§29.5 Tautologias
Dizemos que uma sentença é uma tautologia se esta é uma proposição composta por outras
ligadas por conectivos e condicionais tal que seu valor lógico é verdadeiro, independente dos
valores lógicos das sentenças que a compõe.

Exemplo 29.5.1. Há exemplos simples de tautologias, como P ∨ ∼P , P → P ou P ↔ P .


Um exemplo não tão simples é conhecido por Modus Ponens

[(P → Q) ∧ P ] → Q.

Pela natureza do condicional “→”, sabemos que esta proposição seria falsa apenas se (P →
Q) ∧ P fosse verdadeira e Q falsa. Ora, se (P → Q) ∧ P é verdadeira, então P e P → Q são
proposições verdadeiras e novamente pelo comportamento do operador “→” segue que Q
deve ser verdadeira. Mas como Q não pode admitir dois valores lógicos simultaneamente,
então a proposição Modus Ponens nunca é falsa, ou seja, é uma tautologia.

Exemplo 29.5.2. Poderíamos também utilizar a Observação 29.4.I para demonstrar que

[(P → Q) ∧ ∼Q] → ∼P

é tautologia do seguinte modo: Utilizando as leis de De Morgan e a distributividade dos


conectivos nos vem que

[(P → Q) ∧ ∼Q] → ∼P ≡ ∼[(P → Q) ∧ ∼Q] ∨ ∼P ≡ [∼(P → Q) ∨ Q] ∨ ∼P


≡ ∼(P → Q) ∨ (∼P ∨ Q) ≡ (P → Q) ∨ ∼(P → Q)

Como a última expressão é uma tautologia, segue que a nossa expressão inicial também o é.

142
Noções de Lógica e Indução Finita 29.6. Proposições logicamente falsas

Vale ressaltar que esses métodos se estendem para outras proposições. Desse modo, se desafie
a encontrar novas tautologias.

§29.6 Proposições logicamente falsas


Dizemos que uma sentença é uma proposição logicamente falsa (ou contradição) se esta é
uma proposição composta por outras ligadas por conectivos e condicionais tal que seu valor lógico
é falso, independente dos valores lógicos das sentenças que a compõe.

Exemplo 29.6.1. É notável que o exemplo

“3 é ímpar e 3 não é ímpar”

nos soa estranho, podemos observar que esta sentença é da forma P ∧ ∼P . Como P e ∼P
possuem valores lógicos opostos, então esta é um exemplo de proposição logicamente falsa.
Outro modo para percebermos que esta é uma contradição é observar que P ∨ ∼P é uma
tautologia cuja a negação é P ∧ ∼P .
Ou seja, a negação de uma tautologia nos gera uma proposição logicamente falsa e vice-
versa.

§29.7 Relação de implicação


Quando a sentença P → Q é uma tautologia, dizemos que “P implica Q” e denotamos P =⇒ Q.

Exemplo 29.7.1. Ilustraremos essa propriedade com alguns exemplos

a) “Se um polígono é um quadrado, então este é um retângulo”;

b) “Se N é um número múltiplo de 22, então N é múltiplo de 2”;

c) “Todo triângulo retângulo possui um ângulo interno de 90◦ ”;

d) “Se x2 = 4 e x é positivo, então x = 2”.

§29.8 Relação de equivalência


Se P e Q são tais que P ↔ Q é uma tautologia, dizemos que P é equivalente a Q e denotamos
P ⇐⇒ Q.
Observe que nem todo teorema é desta forma, por exemplo, a relação entre quadrados e
retângulos já apresentada no Exemplo 29.7.1 não vale a recíproca, isto é, nem todo retângulo é
um quadrado.
Por outro lado, é possível mostrar que Teorema de Pitágoas é uma relação de equivalência, ou
seja, que se num triângulo △ABC vale AC 2 = AB 2 + BC 2 , então △ABC é retângulo em B.

§29.9 Sentenças abertas


Nem sempre podemos julgar a veracidade de uma proposição com facilidade pois as vezes este
fato depende das variáveis envolvidas. Este é o caso da proposição “x2 = 25”, de fato, se x tomar
qualquer outro valor diferente de ±5 a proposição possui valor lógico falso e exatamente nesses
valores a proposição é verdadeira.

143
Noções de Lógica e Indução Finita 29.10. Quantificadores

Proposições que apenas podem ser julgadas verdadeira ou falsamente quando são atribuídas
valores para suas variáveis são chamadas de sentenças abertas. Normalmente denotamos
sentenças abertas explicitando a variável em questão, como por exemplo P (x) : “x é racional”.

Exemplo 29.9.1. Considere as sentenças abertas

P (n) : n2 − n + 1 é primo e Q(x) : n3 − n + 1 é primo

Iremos determinar o valor lógico do condicional P (n) → Q(n) quando n = 1, 2 ou 3.

• P (1) = 1 é primo • P (2) = 3 é primo • P (3) = 7 é primo

• Q(1) = 1 é primo • Q(2) = 7 é primo • Q(3) = 25 é primo

É claro que P (2), Q(2) e P (3) são verdadeiros e os demais são falsos. Portanto, apenas os
condicionais P (1) → Q(1), P (2) → Q(2) são verdadeiros.

§29.10 Quantificadores
Em sua maioria, os exemplos anteriores trataram apenas de sentenças que não levassem em
conta a ideia de quantidade, mas esta se faz presente na lógica e estes artifícios são conhecidos
quantificadores. Dentre os quantificadores há dois tipos: quantificador universal e o
quantificador existencial, que serão denotados por ∀ e ∃, respectivamente.
Podemos ler o símbolo ∀ como “para todo”, “para cada” ou “qualquer que seja” . Já o símbolo ∃
pode ser lido como “existe”, “existe algum” ou “existe pelo menos um”.

Exemplo 29.10.1. a) Podemos considerar a proposição P (x, y) : “x2 −y 2 = (x+y)(x−y)”


e nos perguntar se é falsa ou não. Um cálculo rápido nos mostra que P (x, y) é verdadeira
para quaisquer números x e y

(x + y)(x − y) = x(x − y) + y(x − y) = x2 − xy + yx − y 2 = x2 − y 2

Desse modo, ao escrevemos (∀x, y)P (x, y) obtemos uma proposição verdadeira.

b) Já para a proposição Q(p) : “Se p é primo, então 2p − 1 é primo” podemos observar que
Q(2), Q(3), Q(5) e Q(7) são verdadeiras. Porém, para p = 11 nós temos

211 − 1 = 2047 = 23 × 89,

logo Q(11) é falso e desse modo (∃p) ∼Q(p) é outra proposição verdadeira.

c) Podemos misturar os dois quantificadores numa mesma proposição como a seguintes


(∀x ∈ R, ∃y ∈ R)x2 = y e esta é lida como “Para cada x real existe y real tal que
x2 = y”.

§29.11 Como negar proposições


Até agora somos capazes de negar proposições simples e usando as Leis de De Morgan podemos
negar proposições com conectivos. Pela Observação 29.4.I, nós concluímos que P → Q e ∼P ∨ Q
são equivalentes e pela Exemplo 29.4.2 vimos que P ↔ Q ≡ (P → Q) ∧ (Q → P ). Desse modo,
podemos agora negar os condicionais da seguinte forma ∼(P → Q) ≡ ∼(∼P ∨ Q) ≡ P ∧ ∼Q.

144
Noções de Lógica e Indução Finita 29.11. Como negar proposições

Já para o bicondicional temos que sua negação é dada por

∼(P ↔ Q) ≡ ∼[(P → Q) ∧ (Q → P )] ≡ ∼(P → Q) ∨ ∼(Q → P ) ≡ (P ∧ ∼Q) ∨ (Q ∧ ∼P )


≡ [(P ∧ ∼Q) ∨ Q] ∧ [(P ∧ ∼Q) ∨ ∼P ]
≡ [(P ∨ Q) ∧ (∼Q ∨ Q)] ∧ [(P ∨ ∼P ) ∧ (∼Q ∨ ∼P )] ≡ (P ∨ Q) ∧ (∼P ∨ ∼Q)

Agora nos resta mostrar como que são as negações de proposições que possuem quantificadores.
Para dar motivação vamos a uma exemplo do cotidiano

Exemplo 29.11.1. Suponha que Abinaldo possua um guarda-roupas com 2023 camisas, das
quais uma é azul e as 2022 demais são vermelhas.

E então Bernardo, seu irmão, chega perto de Abinaldo e acontece o seguinte diálogo:

– Poxa Abinaldo, todas as suas camisas são vermelhas !


– Epa ! Você está errado, olha aqui essa camisa azul.

Então este é um exemplo extremamente simples, mas nos indica que a negação do quantificador
“para todo” não é “não existe nenhuma” e sim “existe algum que falha a regra”. Simbolicamente,
se P (x) : “x é vermelho”, então (∀ camisa)P (camisa) : “Toda camisa é vermelha” e sua negação
é (∃ camisa) ∼P (camisa) : “Existe alguma camisa que não é vermelha”.

Exemplo 29.11.2. Suponha que Abinaldo possua um chaveiro com 2023 chaves e ele quer
abrir um cadeado E, novamente seu irmão chega perto de Abinaldo e acontece o seguinte
diálogo:

– Poxa Abinaldo, você já tentou aquela chave ali ?


– Já sim ! Não existe chave que abra o cadeado.
– Entendi. Todas as chaves do chaveiro não abrem o cadeado.

Então este é outro exemplo extremamente simples, mas nos indica que a negação do quan-
tificador “existe algum” não é “não existe” e sim “para todos elementos a regra falha”.
Simbolicamente, se P (x) : “x abre o cadeado ”, então (∃ chave)P (chave) : “Alguma chave
abre o cadeado” e sua negação é (∀ chave) ∼P (chave) : “Todas as chaves não abrem o
cadeado”.

Observação 29.11.I. Generalizando os exemplos anteriores concluímos que

∼(∀x)(P (x)) ≡ (∃x) ∼P (x) e ∼(∃x)(P (x)) ≡ (∀x) ∼P (x).

145
Noções de Lógica e Indução Finita 29.12. Princípio de Indução Finita

§29.12 Princípio de Indução Finita


Em alguns problemas surgem padrões de fácil reconhecimento, embora que a passagem de
uma conjectura para uma prova não seja da mais agradável possível. Agora mostraremos uma
ferramenta do mais poderoso calibre matemático, isto é, embora que na sua essência possua
simplicidade na argumentação ela se mostra capaz de atacar os mais diversos problemas.
A ferramenta que venho mencionando é conhecida por Princípio de Indução Finita ou
simplesmente PIF. Na linguagem que construímos, este é um resultado que pode ser expresso na
forma de um teorema

Teorema 29.1 (Princípio de Indução Finita) – Seja P (n) é uma sentença aberta para todo
n ∈ N. Suponha que:

(i) P (1) é verdadeira;

(ii) Se k ∈ N é tal que k ≥ 1 e P (k) é verdadeira e isto implica que P (k + 1) é verdadeira.

Então, P (n) é verdade para todo n ∈ N.

Observação 29.12.I. No teorema anterior, o item (i) é normalmente chamado de Base de


Indução e no item (ii) a primeira parte é chamada de Hipótese de Indução e a passagem
P (k) =⇒ P (k + 1) é conhecida por Passo Indutivo.

De modo leigo, podemos pensar o PIF como uma fileira de dominós onde o primeiro deles cairá
e para qualquer outro que cai, este derruba o seguinte, então, eventualmente todos os dominós
cairão. Para estimular a importância desta nova ferramenta vamos expor alguns exemplos

Exemplo 29.12.1. Considere a sentença aberta

n(n + 1)
P (n) : 1 + 2 + 3 + · · · + n = .
2
Mostraremos que P (n) é verdadeira para todo natural n ∈ N. Ora, o caso P (1) é verdadeira
1(1 + 1)
pois 1 = . Suponha agora que para algum k ≥ 1 seja verdadeira a sentença P (k), ou
2
k(k + 1)
seja, vale 1 + · · · + k = . Desse modo, somando k + 1 em ambos os lados nos vem
2
que
 
k(k + 1) k (k + 1)(k + 2)
1 + 2 + · · · + k + (k + 1) = + (k + 1) = (k + 1) +1 =
2 2 2

Dai P (k + 1) é verdadeiro. Portanto, pelo Princípio de Indução Finita P (n) é verdadeira


para todo n ∈ N, ou seja, vale para todo n ∈ N

n(n + 1)
1 + 2 + 3 + · · · + (n − 1) + n = .
2

Exemplo 29.12.2. Considere a sentença aberta

P (n) : 1 + 3 + 5 + 7 + · · · + (2n − 1) = n2 .

146
Noções de Lógica e Indução Finita 29.12. Princípio de Indução Finita

Mostraremos que P (n) é verdadeira para todo natural n ∈ N. Ora, o caso P (1) é verdadeira
pois 1 = 12 . Suponha agora que para algum k ≥ 1 seja verdadeira a sentença P (k), ou seja,
vale 1 + 3 + 5 + · · · + (2k − 1) = k 2 . Desse modo, somando 2k + 1 em ambos os lados nos
vem que
1 + 3 + 7 + · · · + (2k − 1) + (2k + 1) = k 2 + (2k + 1) = (k + 1)2
Dai P (k + 1) é verdadeiro. Portanto, pelo Princípio de Indução Finita P (n) é verdadeira
para todo n ∈ N, ou seja, vale para todo n ∈ N

1 + 3 + 5 + 7 + · · · + (2n − 1) = n2 .

Exemplo 29.12.3 (Desigualdade de Bernoulli). Para qualquer número real x ≥ −1, então
para todo natural n > 0 vale
(1 + x)n ≥ 1 + nx.
Considerando P (n) como a desigualdade acima, então imediatamente temos que P (1) é
verdadeira. Supondo n ≥ 1 é tal que (1 + x)n ≥ 1 + nx, então multiplicando por 1 + x ≥ 0
em ambos os lados nós obtemos

(1 + x)n+1 = (1 + x)(1 + x)n ≥ (1 + x)(1 + nx) = 1 + (n + 1)x + nx2 ≥ 1 + (n + 1)x

Portanto, P (n + 1) é verdadeiro, ou seja, vale para todo n ∈ N que (1 + x)n ≥ 1 + nx.

Há outra versão do princípio da indução com uma pequena variação:

Teorema 29.2 (Princípio da Indução Forte) – Seja P (n) é uma sentença aberta para todo
n ∈ N. Suponha que:

(i) P (a) é verdadeira;

(ii) Se para todo a ≤ n ≤ k e P (n) implica que P (k + 1) é verdadeira.

Então, P (n) é verdade para todo n ∈ N.

Exemplo 29.12.4 (Teorema Fundamental da Aritmética). O Teorema Fundamental da


Aritmética afirma que qualquer inteiro n > 1 pode ser escrito de forma única como produto
de primos. Uma demonstração da existência dos primos não pode ser pela Indução usual
pois a fatoração de dois números consecutivos não possuem relação nenhuma entre si. Desse
modo, faremos uso da Indução Forte para provar a existência deste teorema.
Veja que 2 é o produto de um primo (ele mesmo), assim temos a base de indução verificada.
Suponha que 2, 3, . . . , n − 1, n pode ser escrito de forma única como produto de primos. Se
n + 1 for primo então nada temos a demonstrar. Porém se n + 1 não for primo, então existem
a, b ∈ N tais que n + 1 = a · b. Assim, como a e b são menores que n + 1 então esses podem
ser escritos como produtos de primos, logo, a = p1 p2 · · · ps e b = q1 q2 · · · qt e dai segue

n + 1 = a · b = (p1 p2 · · · ps )(q1 q2 · · · qt )

Exemplo 29.12.5 (Representação Binária). Todo número pode ser escrito de uma maneira
única como soma de potências de 2 com expoentes inteiros não negativos dois-a-dois distintos.

147
Noções de Lógica e Indução Finita 29.12. Princípio de Indução Finita

Provaremos por indução forte que a representação existe para todo n ∈ N. Para tanto,
considere a maior potência de 2 menor ou igual a n, isto é, 2k ≤ n < 2k+1 . Se n = 2k , então
nada temos a provar. Senão, 1 ≤ n − 2k < n, e pela hipótese de indução existem inteiros
não-negativos 0 ≤ a1 < · · · < ap tais que n − 2k = 2a1 + 2a2 + · · · + 2ap < 2k , logo, segue
ap < k. Portanto, n = 2a1 + 2a2 + · · · + 2ap + 2k com 0 ≤ a1 < a2 < · · · < ap < k.

Exemplo 29.12.6 (Tome cuidado com PIF!). Usos errados do PIF pode causar resultados
absurdamente falsos !

Afirmação 29.12.7 (Todos os números naturais são pares.) — Assuma que os números
1, 2, 3, . . . , n são pares. Assim, como a soma de números pares é ainda um número par,
então pela hipótese de indução temos que n − 1 e 2 são pares, logo n + 1 = (n − 1) + 2 é
ainda um número par. Portanto, todo número inteiro é par. □

O erro nessa “prova” está na base de indução, pois claramente ela não é verdadeira.

Afirmação 29.12.8 (Todos os animais são da mesma raça.) — Por simplicidade se a e b


são dois animais e escreveremos a = b quando eles possuírem a mesma raça. Além disso,
consideramos a afirmação P (n) : “Qualquer conjunto de n animais, então todos possuem
a mesma raça”. Ora, P (1) é verdadeira, pois apenas tem um único animal. Supondo que
P (n) é verdade, ou seja, “Qualquer grupo de n animais é tal que todos possuem a mesma
raça”. Então considere um grupo de n + 1 animais, digamos, a1 , . . . , an , an+1 . Então os
animais a1 , . . . , an possuem a mesma raça e isto acontece com o grupo a2 , . . . , an , an+1 .
Desse modo, a1 = a2 = · · · = an = an+1 , ou seja, P (n + 1) é verdadeira. E portanto
todos os animais são da mesma raça.

Sabemos que a afirmação anterior possui um erro e deixamos ao leitor encontra-lo.

148
Noções de Lógica e Indução Finita 29.13. Exercícios

§29.13 Exercícios
Exercícios Introdutórios
Exercício 29.1. Para a sentença aberta P (n) : 2n − 4 > 2023 onde n ∈ Z, determine os valores n ∈ N tais
que P (n) é verdade e quais os valores n ∈ N para que P (n) falsa.
Exercício 29.2. Considere as proposições :
√ 1 √
P : 2 é racional, Q: é racional, R: 2023 é inteiro.
2023
Escreva as proposições a seguir e determine quais delas são verdades.

a) (P ∧ Q) → R c) (P ↔ R) ∨ ∼Q
b) (P ∧ Q) → ∼R d) ∼(∼P → Q)

Exercício 29.3. Use tabela verdade para provar as Leis de De Morgan

∼(P ∧ Q) ≡ ∼P ∨ ∼Q e ∼(P ∨ Q) ≡ ∼P ∧ ∼Q.

Exercício 29.4. Considere o condicional P → Q, então definimos a contrapositiva ∼Q → ∼P , a recíproca


Q → P e a inversa ∼P → ∼Q. Encontre quais dos novos condicionais são equivalentes a P → Q e dê
exemplos.

Exercícios de Aprofundamento
Exercício 29.5. Para todo n ∈ N valem:
n(4n2 − 1)
a) 12 + 32 + 52 + · · · + (2n − 1)2 = ;
3
b) 13 + 23 + 33 + · · · + n3 = (1 + 2 + 3 + · · · + n)2 .
Exercício 29.6. Decida quais das sentenças abaixo são tautologia:

a) [(P ∧ Q) → R] → [P → (Q → R)]; c) (P → Q) → [(P ∧ R) → (Q ∧ R)];


b) [P → (Q ∨ R)] ↔ [(P ∧ ∼Q) → R]; d) [(P → Q) ∧ ∼Q] → ∼P .

Exercício 29.7. Mostre que vale 2n ≥ 1 + n para todo n ∈ Z e conclua que 2m+n ≥ 4mn para quaisquer
m, n ∈ Z.
Exercício 29.8. Mostre que para todo n ∈ N o número 2n+2 + 7n é divisível por 5.

Exercícios Avançados
Exercício 29.9. Um plano está dividido em regiões com n retas. Mostre que é possível colorir essas regiões
com duas cores de modo que quaisquer duas regiões adjacentes tenham cores diferentes.
Exercício 29.10. Mostre que um tabuleiro de tamanho 2n × 2n que teve um quadrado removido pode ser
coberto com peças triminó, onde triminó é uma peça onde foi subtraído uma das quinas de um quadrado
2 × 2.
Exercício 29.11. A Sequência de Fibonacci é definida como f1 = f2 = 1 e fn+1 = fn + fn−1 . O Teorema
de Zekendorff afirma que todo número natural pode ser unicamente escrito como soma de números
de Fibonacci de índices maiores que 1 e não consecutivos. Mostre, por indução, a existência desta
representação para todo número natural. Embora a segunda parte também possa ser provada com indução
esta é um pouco mais delicada, mesmo assim recomendo a tentativa !

149
30 Conjuntos e Noções Básicas de Funções
§30.1 Operações com conjuntos
Entendemos como conjunto uma coleção de objetos ou símbolos, que chamamos de elementos.
Costumeiramente escrevemos letras maiúsculas para indicar conjuntos e letras minúsculas indicam
seus elementos. Para indicar que x é um elemento de X nós escrevemos x ∈ X, isto pode ser lido
como “x pertence a X”. Já se y não for um elemento de X, escrevemos y ∈ / X. Por exemplo, no
conjunto das vogais, que podemos indicar por V , existem os elementos a, e, i, o, u, mas a letra v
não pertence a V e então v ∈/ V.
Um elemento de um conjunto pode ser de qualquer espécie, ou seja, pode ser um número, letras
ou nomes e até mesmo outro conjunto. Como exemplo do cotidiano de conjuntos formados por
conjuntos podemos considerar o conjunto dos cidadãos brasileiros e os estados onde cada um
deles moram.
Iremos admitir a existência de um conjunto sem elementos conhecido por conjunto vazio
e o denotaremos por ∅. Quando todos os elementos de um conjunto X também são elementos
do conjunto Y , então dizemos “X está contido em Y ” (ou “Y contém X”, ou “X é um
subconjunto de Y ”) e denotamos X ⊂ Y . Quando os conjuntos X e Y são tais que X ⊂ Y e
Y ⊂ X, escreveremos X = Y .
O conjunto vazio está contido em qualquer outro conjunto X. De fato, se assim não fosse,
deveria existir pelo menos um elemento do conjunto vazio que não pertencesse a X, mas como ∅
não contém elementos o argumento é sempre válido.
Definição 30.1 (União de conjuntos). Dados dois conjuntos X e Y podemos considerar o
conjunto da união (ou reunião) formado por eles, isto é, a coleção dos elementos que pertencem
a, pelo menos, um dos conjuntos X ou B. Representamos a união de X e Y por X ∪ Y .
Como propriedades imediatas da definição de união de conjuntos obtemos a seguinte proposição:

Proposição 30.1.1 – Para quaisquer conjuntos A, B e C temos:

a) A ∪ B = B ∪ A;

b) B ⊂ A =⇒ A ∪ B = A;

c) A ∪ ∅ = A;

d) (A ∪ B) ∪ C = A ∪ B ∪ C = A ∪ (B ∪ C)

Definição 30.2 (Interseção de conjuntos). Dados dois conjuntos X e Y podemos considerar o


conjunto da interseção formado por eles, isto é, a coleção dos elementos que pertencem a ambos
os conjuntos X e B. Representamos a interseção de X e Y por X ∩ Y .

Proposição 30.1.2 – Para quaisquer conjuntos A, B e C temos:

a) A ∩ B = B ∩ A;

b) B ⊂ A =⇒ A ∩ B = B;

c) A ∩ ∅ = ∅;

d) (A ∩ B) ∩ C = A ∩ B ∩ C = A ∩ (B ∩ C).

150
Conjuntos e Noções Básicas de Funções 30.2. Descrição de um conjunto

Definição 30.3 (Diferença de conjuntos). Dados dois conjuntos X e Y podemos considerar o


conjunto da diferença formado por X e Y , nessa ordem, é a coleção dos elementos que pertencem
X mas não a Y . Representamos a diferença de X e Y por X − Y .

Proposição 30.1.3 – Para quaisquer conjuntos A e B temos:

a) A − B ⊂ A;

b) ∅ − A = ∅;

c) A − ∅ = A;

d) A − (A ∩ B) = A − B.

As operações com conjuntos podem ser representadas geometricamente através dos Diagramas
de Venn:

§30.2 Descrição de um conjunto


Podemos descrever conjuntos e seus elementos de algumas formas, as mais comuns são :

• Enumerando ou explicitando os seus elementos e os escrevendo entre chaves. Independen-


temente se o conjunto é finito ou não, o expressaremos seus elementos escrevendo entres
chaves. Vale ressaltar que a adição de reticências é útil para assegurar a não finitude de um
conjunto, embora que uma notação parecida também é empregada quando o conjunto é
finita e nesse caso escrevemos os elementos iniciais, colocamos reticências e logo após vem
os elementos finais. Como exemplos da nossa notação veja os casos a seguir :
i) O conjunto dos números pares pode ser descrito por {0, 2, 4, 6, . . . }.
ii) Os números inteiros de 1 até 100 pode ser expresso por {1, 2, 3, 4, . . . , 98, 99, 100}.
iii) Os países africanos com a Língua Portuguesa como idioma oficial podem ser identifica-
dos por {Angola, Cabo Verde, Guiné-Bissau, Moçambique, São Tomé e Príncipe}.

151
Conjuntos e Noções Básicas de Funções 30.2. Descrição de um conjunto

• Outra forma é cita-los por meio de propriedades e características. Digamos que que-
remos escrever os elementos que possuem a propriedade P , assim, denotaremos por
{x | x tem a propriedade P }. Como exemplos dessa notação veja os casos a seguir :
i) O conjunto dos números pares pode ser descrito por {n | n é par } ou ainda {2n | nn é natural}.
ii) Os números inteiros de 1 até 100 pode ser expresso por {n | n é natural e 1 ≤ n ≤ 100}.
iii) Os países africanos com a Língua Portuguesa como idioma oficial podem ser identifica-
dos por {x | x é pais africano ∧ a população de x fala português}.

Observação 30.2.I. O mesmo conjunto pode ter várias representações, então como regra
de prioridade utilizaremos qual for mais conveniente ao contexto. Por exemplo, podemos
expressar o conjunto vazio como o conjunto dos elementos que satisfazem qualquer proposição
falsa {x | x é positivo e negativo } = {x | x ̸= x} = {x | x é inteiro e 0 < x < 1} = ∅.

Exemplo 30.2.1. Dado o conjunto X = {1, 2, 3, 3, 4}, podemos afirmar que :

(a) O conjunto X possui 4 elementos, a saber, os números 1, 2 e 3 e o conjunto 3, 4.

(b) Os números 1 e 2 pertencem a X, ou seja, 1 ∈ X e 2 ∈ X.

(c) Pelo item anterior, todos os elementos de 1, 2 são também elementos de X, ou seja,
1, 2 ⊂ X.

(d) Não é verdade que {3, 4} ⊂ X, pois 4 não é elemento de X. Mas é verdade que
{{3, 4}} ⊂ X pois {3, 4} é um elemento de X.

§30.2.2 Conjuntos dos números


Há conjuntos que são fundamentais para nossos estudos são eles

• Os números naturais são denotados por N = {0, 1, 2, 3, 4, . . . }. É comum denotar por


N∗ = N − {0} o conjunto dos naturais não nulos.

Observação 30.2.II. Definimos as operações de adição e multiplicação entre números


naturais satisfazendo para quaisquer a, b, c ∈ N os seguintes itens:
(A.I). Associatividade da adição: (a + b) + c = a + (b + c);
(A.II). Comutatividade da adição: a + b = b + a;
(A.III). Elemento neutro da adição: a + 0 = a = 0 + a;
(M.I). Associatividade da multiplicação: (a · b) · c = a · (b · c);
(M.II). Comutatividade da multiplicação: a · b = b · a;
(M.III). Elemento neutro da multiplicação: a · 1 = a = 1 · a;
D. Distributividade da multiplicação com relação a adição: (a + b) · c = a · c + b · c.

• Os números inteiros são denotados por Z = {. . . , −3, −2, −1, 0, 1, 2, 3, . . . }. Também


denotamos Z∗ = Z − {0} como o conjunto dos inteiros não nulos. Veja que se n é natural,
então é imediato que n ∈ Z, desse modo Z contém N.

152
Conjuntos e Noções Básicas de Funções 30.2. Descrição de um conjunto

Observação 30.2.III. As operações de adição e multiplicação entre números inteiros


podem ser estendidas dos números naturais de modo que ainda satisfaçam as pro-
priedades (A.I), (A.II), (A.III), (M.I), (M.II), (M.III) e D com a adição da seguinte
propriedade: (A.IV) Dado a ∈ Z, existe −a ∈ Z tal que a + (−a) = 0.

• Os números racionais são denotados por Q = {p/q | p ∈ Z, q ∈ Z∗ }, isto é, os números


p
racionais são aqueles que podem ser representados pelas frações , onde p ∈ Z e q ∈ Z∗ .
q

n
Observação 30.2.IV. Observe que para todo n ∈ Z temos n = ∈ Q, logo o
1
conjunto dos números inteiros está contido nos números racionais. Quando estamos
p
considerando frações do tipo , chamamos p de numerador e q de denominador e
q
quando mdc(p, q) = 1 dizemos que a fração é irredutível. Sobre os racionais iremos
adotar como definições

a c a c ac
(i) Igualdade := ⇐⇒ ad = bc; (iii) Multiplicação · = .
b d b d bd
a c ad + bc
(ii) Adição : + = ;
b d bd

Assim, as propriedades (A.I), (A.II), (A.III), (A.IV), (M.I), (M.II), (M.III) e D são
p
similares e adicionamos mais uma propriedade da multiplicação: (M.IV) Dado ∈ Q∗ ,
q
q p q
existe ∈ Q tal que · = 1. Por conta de (M.IV) podemos estabelecer que a divisão
p q p
a/b a d
de números racionais satisfaz = · .
c/d b c

Os números racionais possuem uma propriedade interessante quanto a sua representação.


Existem dois casos para a representação de uma fração na base decimal:

a) Sua representação tem uma quantidade finita de algarismos, diferentes de zero, isto é, uma
decimal exata, como por exemplo 2/1 = 2 ou 1/4 = 0, 25.

b) Sua representação tem uma quantidade infinita de algarismos que se repetem periodicamente,
isto é, uma dízima periódica, como por exemplo 1/3 = 0.333 · · · = 0, 3.

Quando os números não pertencem a essa categoria de representação são chamados de números
irracionais. Para mostrarmos que existem números irracionais segue a seguinte afirmação
√ √
Afirmação 30.2.3 — O número 2 não é racional, isto é, 2 ∈
/ Q.

Prova: Suponha que podemos escrever 2 como uma fração p/q, onde mdc(p, q) = 1.
Elevando ao quadrado obtemos p2 = 2q 2 , logo p2 é um número par e assim p é par. Então
existe k ∈ Z tal que p = 2k e substituindo em 2q 2 = p2 obtemos 2q 2 = (2k)2 =⇒ q 2 = 2k 2 ,
ou seja, q é par. Mas isto é um absurdo, pois
√ tínhamos assumido que mdc(p, q) = 1. Portanto,
não pode existir uma representação de 2 por meio de uma fração. □

O argumento anterior pode ser adaptado para nos mostrar que p não é um número
racional sempre que p ∈ N é primo. Em 300 A.C., Euclides de Alexandria provou em sua

153
Conjuntos e Noções Básicas de Funções 30.3. Descrição de intervalos

obra “Os Elementos” que existem infinitos números primos. Então a nossa afirmação implica
que existem infinitos números irracionais.
Agora podemos considerar o último conjunto numérico que trabalharemos :
• Chama-se conjunto dos números reais, representado por R, aquele formado pela reunião
do conjunto dos números racionais e dos números racionais.

Observação 30.2.V. Novamente, as operações de soma e multiplicação possuem as mesmas


propriedades das operações em Q. Além disso, se α é irracional e r ∈ Q∗ , então os números
α r
α + r, α · r, e
r α
são irracionais.

Em geral, se X ⊂ R, então denotaremos X− o conjunto dos elementos negativos de X, X+ o


conjunto dos elementos positivos de X e X ∗ o conjunto dos elementos não-nulos de X.

Exemplo 30.2.4. Considerando os conjuntos

i) A = {n ∈ N∗ | n ≤ 9} iii) C = {x ∈ R | x2 − 2 = 0}

ii) B = {x ∈ Q | x ≤ 9} iv) D = {x ∈ Q | x2 − 2 = 0}

pede-se:

a) Descreva os elementos de A listando seus elementos;

b) Dê um exemplo de três elementos que pertencem a B mas não pertencem a A;

c) Descreva o conjunto C listando seus elementos;

d) Descreva o conjunto D de outra maneira.

a) Podemos listar os elementos de A por {1, 2, 3, 4, 5, 6, 7, 8, 9};

b) Ora, como números inteiros são ainda números racionais e o conjunto B contém os
inteiros negativos, então podemos considerar como exemplo os números −1, −2 e −3;

c) Os números
√ √ reais tais que x 2 − 2 = 0, então x2 = 2 e isto nos diz que x = ± 2, logo

C = {− 2, 2};
√ √
d) Já demonstramos que 2 ∈ / Q, assim − 2 ∈ / Q. Portanto, D = ∅

§30.3 Descrição de intervalos


Os números reais são ordenados, isto é, podemos impor uma noção de grandeza entre os números.
Definimos que a < b sempre que b − a é um número positivo e a > b sempre que a − b é um
número positivo diremos que “a é menor que b” e “a é maior que b”, respectivamente.
A notação a ≤ b significa que b − a é positivo ou zero e de modo similar definimos a ≥ b.
Quando a < b e b < c escreveremos apenas a < b < c.
Chamaremos de intervalo um conjunto X ⊂ R tal que se x, y ∈ X então qualquer t ∈ R
satisfazendo x < t < y implica que t ∈ X. Dados a, b ∈ R, com a < b, podemos considerar o
intervalo cujo os extremos são a e b, os únicos casos são:

154
Conjuntos e Noções Básicas de Funções 30.4. Produto cartesiano (par ordenado)

(a) Intervalo aberto de extremos a e b é o (c) Intervalo fechado à esquerda (ou aberto
conjunto: à direita) de extremos a e b é o conjunto:

(a, b) = {x ∈ R | a < x < b}; [a, b) = {x ∈ R | a ≤ x < b};

(d) Intervalo fechado à direita (ou aberto


(b) Intervalo fechados de extremos a e b é à esquerda) de extremos a e b é o con-
o conjunto: junto:

[a, b] = {x ∈ R | a ≤ x ≤ b}; (a, b] = {x ∈ R | a < x ≤ b};

Também são intervalos reais os “intervalos infinitos” assim definidos:

(a) (−∞, a) = {x ∈ R | x < a}; (c) (a, +∞) = {x ∈ R | a < x};

(b) (−∞, a] = {x ∈ R | x ≤ a}; (d) [a, +∞) = {x ∈ R | a ≤ x};

§30.4 Produto cartesiano (par ordenado)


Embora a representação de um conjunto não dependa da ordem da qual seus elementos são
listados (por exemplo, os conjuntos {1, 2} e {2, 1} são os mesmos), podemos impor uma noção de
ordem para pares de elementos.
Esses são conhecidos por pares ordenados e representaremos o par ordenado formado pelos
elementos x e y, nesta ordem, por (x, y), de modo que tenhamos

(x, y) = (z, w) ⇐⇒ x = z e y = w

O produto cartesiano dos conjuntos A e B é definido como a união dos pares ordenados,
onde a primeira entrada é um elemento de A e a segunda é um elemento de B, ou seja,

A × B = {(a, b) | a ∈ A, b ∈ B}

Exemplo 30.4.1. Se A = {1, 2, 3} e B = {x, y}, então o produto cartesiano entre A e B é


dado por

A × B = {(a, b) | a ∈ A, b ∈ B} = {(1, x), (1, y), (2, x), (2, y), (3, x), (3, y)}

e o produto cartesiano entre B e A é dado por

B × A = {(b, a) | a ∈ A, b, ∈ B} = {(x, 1), (x, 2), (x, 3), (y, 1), (y, 2), (y, 3)}

155
Conjuntos e Noções Básicas de Funções 30.5. Noções básicas de funções

Note que não há um elemento de A×B que pertença a B×A e vice-versa, então, A×B ̸= B×A.

Observação 30.4.I. Convencionaremos que o produto cartesiano que envolva o conjunto


vazio é ainda o conjunto vazio, isto é, A × ∅ = ∅ e ∅ × A = ∅ para qualquer que seja o
conjunto A.

§30.5 Noções básicas de funções


Podemos definir uma relação entre conjuntos como um subconjunto do produto cartesiano
entre eles que satisfazem certa propriedade.

Exemplo 30.5.1. Por exemplo, considerando A = {−1, 0, 1, 2} e B = {1, 2} temos

A × B = {(−1, 1), (−1, 2), (0, 1), (0, 2), (1, 1), (1, 2), (2, 1), (2, 2)}

e os seguintes subconjuntos de A × B

R = {(x, y) ∈ A × B | x = y} = {(1, 1), (2, 2)}

e
e = {(x, y) ∈ A × B | y = x + 1} = {(0, 1), (1, 2)}.
R

Para certos conjuntos pequenos podemos representar geometricamente relações com um dia-
grama de flechas

Exemplo 30.5.2. Considerando os conjuntos A = {0, 1, 2, 3} e B = {−1, 0, 1, 2, 3} e as


relações entre esses conjuntos

P = {(x, y) ∈ A × B | y 2 − x2 = 0} = {(0, 0), (1, 1), (1, −1), (2, 2), (3, 3)}
Q = {(x, y) ∈ A × B | y = x} = {(0, 0), (1, 1), (2, 2), (3, 3)}
R = {(x, y) ∈ A × B | y = 0} = {(0, 0), (1, 0), (2, 0), (3, 0)}

Geometricamente, podemos representar essas relações pelos diagramas a seguir

As relações Q e R possuem uma peculiaridade: para cada x ∈ A existe um único y ∈ B tal


que (x, y) é um elemento da relação. A relação P falha esta condição pois para o elemento
1 ∈ A temos que os elementos (1, −1) e (1, 1) pertencem a relação.

Definição 30.4. Dados dois conjuntos A e B não vazios dizemos que uma relação f entre A e B
é uma função de A em B quando para cada x ∈ A existe um único elemento y ∈ B tal que
(x, y) é um elemento de A × B que pertence a relação f . Neste caso, a função f será indicada por
f : A → B.

156
Conjuntos e Noções Básicas de Funções 30.5. Noções básicas de funções

Observação 30.5.I. Observe que a definição de função entre dois conjuntos nos diz que o
diagrama de flechas de uma função deve satisfazer as duas condições :

(i) Todo elemento de A deve servir como ponto de partida de uma flecha;

(ii) Cada elemento de A deve servir como ponto de partida de uma única flecha.

Isto nos dá uma forma prática e fácil de decidir se uma relação é uma função ou não

Definição 30.5. Se f : A → B é uma função, então dizemos que A é o domínio da função e B


é o contradomínio da função. Chamamos de imagem da função o conjunto dos elementos
y ∈ B tais que existe x ∈ A tal que o par (x, y) pertence a relação. Os conjuntos domínio e
imagem da função f são normalmente denotados por Dom(f ) e Im(f ).

Geralmente, podemos definir uma função através da sentença aberta y = f (x), isto é, dado
x ∈ A determina-se y ∈ B tal que (x, y) é um elemento da relação. Esta sentença aberta é
conhecida como lei de correspodência (ou lei de formação).

Exemplo 30.5.3. Considere a função f : {0, 1, 2, 3} → R definida por f (x) = x + 2. Assim,


teríamos que o domínio de f é o conjunto Dom(f ) = {0, 1, 2, 3} e o contradomínio da função
é o conjunto R dos números reais. Já a imagem de f deve ser o conjunto que contém os
elementos f (0) = 0 + 2 = 2, f (1) = 1 + 2 = 3, f (2) = 2 + 2 = 4, f (3) = 3 + 2 = 5, assim,
Im(f ) = {2, 3, 4, 5}.
Desse modo, a função f de {0, 1, 2, 3} em R definida por f (x) = x + 2 é um exemplo de
função tal que o contradomínio de f e sua imagem são conjuntos diferentes.

Exemplo 30.5.4. Para funções entre conjuntos numéricos, podemos procurar qual o “maior”
conjunto de forma que os valores de x a expressão matemática y = f (x) está definida, isto
é, quais valores podem ser atribuídos à variável x de modo a não violar as condições de
existência da expressão matemática. Vejamos alguns casos que ilustram essa busca :

i) Para a função f (x) = 2023x temos para todo x ∈ R o produto com 2023 é ainda um
número real, então podemos definir Dom(f ) = R.
1
ii) Para a função g(x) = não podemos definir seu domínio como R, pois
2023x − 2022
não podemos dividir um número real por zero. Neste caso, devemos remover de R
os valores de xtais que
 2023x − 2022 = 0, ou seja, x = 2022/2023. Desse modo,
2022
Dom(g) = R − .
2023

iii) Um caso parecido do anterior acontece para a função definida por h(x) = 2023 − x.
De fato, não podemos tomar raíz quadrada de números negativos, então o domínio h será
os valores para os quais 2023 − x ≥ 0, logo, x ≤ 2023 e assim Dom(h) = (−∞, 2023].

Exemplo 30.5.5. Podemos encontrar a lei de formação de uma função se for dado algumas
características sobre ela. Por exemplo, considere a função f : R → R tal que

f (x + y) = f (x) · f (y), f (1) = 2 e f ( 2) = 4

157
Conjuntos e Noções Básicas de Funções 30.6. Gráfico de uma função


e pede-se para calcular f (3 + 2). Note que

f (2) = f (1 + 1) = f (1) · f (1) = 2 · 2 = 4


f (3) = f (1 + 2) = f (1) · f (2) = 2 · 4 = 8
√ √
f (3 + 2) = f (3) · f ( 2) = 8 · 4 = 32

Com indução podemos mostrar que f (n + m 2) = 2n · 4m = 2n+2m para todos n, m ∈ N.

Definição 30.6. Duas funções f : A → B e g : C → D são iguais quando possuem o mesmo


domínio, o mesmo contradomínio e mesma imagem.

x2 − 1
Exemplo 30.5.6. As funções f : N → R e g : N → R dadas por f (x) = x−1 e g(x) =
x+1
x2 − 1
são são iguais pois para todo x ∈ N temos x2 − 1 = (x + 1)(x − 1), logo, = x + 1.
r √ x−1
x−1 x−1
Já as funções cuja as leis de formação são f (x) = e g(x) = √ podem não ser
x+1 x+1
iguais pois seus domínios não coincidem. Maiores detalhes serão deixados ao leitor cuidadoso.

§30.6 Gráfico de uma função


Definição 30.7. O gráfico de uma função f : R → R é o conjunto dos pontos (x, y) que
pertencem ao plano cartesiano tais que y = f (x).
Em geral, uma vez que temos o gráfico de uma função é bem tranquilo identificar quais são o
domínio e imagem dela. Além disso, o gráfico nos serve de guia para o comportamento de uma
função em algum intervalo determinado.

Observação 30.6.I. Vale ainda observar-


mos que se f é uma função, então para cada
x ∈ Dom(f ) devemos ter um único y ∈ R
tal que y = f (x) isto pode ser traduzido
geometricamente como: “Nenhuma reta pa-
ralela ao eixo-y pode tocar o gráfico de f
mais de uma vez.”
Então por exemplo, uma circunferência não
pode ser o gráfico de uma função.

Exemplo 30.6.1. Vamos exibir alguns exemplos para gráficos de funções, mas sem se
preocupar em qual o domínio ou imagem delas.

158
Conjuntos e Noções Básicas de Funções 30.7. Função injetora, sobrejetora e bijetora

Teorema 30.1 – O gráfico da função f (x) = ax + b, onde a, b ∈ R é uma reta.

Demonstração. No caso a = 0 nós temos que f (x) = b, ou seja, f é uma função constante,
logo todos os pontos estão sobre a reta y = b. Já se a ̸= 0, então considerando os pontos
A(x1 , y1 ), B(x2 , y2 ) e C(x3 , y3 ). Observe que os triângulos △ABE e △BCD são semelhantes.

De fato, como A, B e C são pontos do grá-


fico de f , então temos y1 = ax1 + b, y2 =
ax2 +b e y3 = ax3 +b. Subtraindo membro
a membro obtemos
(
y3 − y2 = a(x3 − x2 )
y2 − y1 = a(x2 − x1 )

y3 − y2 y2 − y1
donde temos =a= . As-
x3 − x2 x2 − x1
sim, os triângulos △ABE e △BCD tem
lados proporcionais, logo são semelhantes.

Desse modo, os ângulos BAE


\ e CBD
\ são iguais e portanto A, B e C são pontos colineares.

Exemplo 30.6.2. Com o Teorema 30.1 em


mãos podemos tentar esboçar o gráfico de
funções da forma f (x) = ax + b. Por exem-
plo, pondo a = 1 e b = 2 nós temos que
f (x) = x + 2. Tomando alguns valores obte-
mos o esboço a seguir
x y = f (x)
−3 −1
−2 0
−1 1
0 2
1 3
2 4

§30.7 Função injetora, sobrejetora e bijetora


Definição 30.8. Se f : A → B é uma função, então dizemos que f é uma função injetora
quando f (x) = f (y) implica que x = y. Ou equivalentemente, x ̸= y implica que f (x) ̸= f (y).

Exemplo 30.7.1. A função f (x) = ax + b é uma função injetora para quaisquer a, b ∈ R,


com a ̸= 0, pois

f (x) = f (y) =⇒ ax + b = ay + b =⇒ ax = ay =⇒ x = y

159
Conjuntos e Noções Básicas de Funções 30.7. Função injetora, sobrejetora e bijetora

Já a função f : R → R dada por f (x) = x2 não é injetora pois f (1) = 1 = f (−1). Mas se
tomarmos g : R+ → R com a lei g(x) = x2 nós temos que g é injetiva.

Observação 30.7.I. Voltando ao diagrama de flechas, uma função injetora pode ser pensada
como aquela que o diagrama não possui duas flechas chegando num mesmo elemento do
contradomínio. Já o gráfico de uma função injetora pode ser caracterizado por: “toda reta
paralela ao eixo-x intersecta o gráfico de f no máximo em um ponto”.

Definição 30.9. Uma função f : A → B é dita ser função sobrejetora quando para todo
y ∈ B existe x ∈ A tal que f (x) = y. Ou equivalentemente, quando sua imagem coincide com o
contradomínio.

Exemplo 30.7.2. As funções da forma f (x) = ax + b, onde a, b ∈ R e a =


̸ 0 são sobrejetoras.
De fato, dado y ∈ R, considerando x = (y − b)/a nós obtemos
 
y−b y−b
f (x) = f =a· + b = (y − b) + b = y.
a a

Observação 30.7.II. No diagrama de flechas de uma função sobrejetoras, todo elemento do


contradomínio deve ser o ponto de chegada de pelo menos uma flecha. No plano cartesiano,
se todas as retas horizontais cortam o gráfico, então a função é sobrejetiva.

Exemplo 30.7.3. Suponha que f : [0, 1] → [0, 1] é uma função sobrejetora tal que
|f (x) − f (y)| ≤ |x − y| para quaisquer x, y ∈ [0, 1]. Pela sobrejetividade de f existem
a, b ∈ [0, 1] tais que f (a) = 0 e f (b) = 1, assim

1 = |1 − 0| = |f (b) − f (a)| ≤ |b − a| ≤ 1

Logo, |b − a| = 1 e isto nos implica que a = 0 e b = 1 ou a = 1 e b = 0. Suponha que a = 0 e


b = 1 e considere c ∈ (0, 1). Assim, pela desigualdade triangular nós obtemos

1 = |f (1) − f (0)| ≤ |f (1) − f (c)| + |f (c) − f (0)| ≤ |1 − c| + |c − 0| = (1 − c) + c = 1

donde concluímos que |f (c) − f (0)| = |c − 0| e uma vez que c e f (c) são números não-negativos
então f (c) = c. Como c ∈ (0, 1) foi arbitrário, segue que f (x) = x para todo x ∈ [0, 1].
O caso a = 1 e b = 0 é tratado de modo similar e concluímos que f (x) = 1 − x para todo
x ∈ [0, 1].

Definição 30.10. Dizemos que f é uma função bijetora se esta é injetora e sobrejetora.

Exemplo 30.7.4. Juntando os argumentos dados no Exemplo 30.7.1 e no Exemplo 30.7.2


obtemos as funções da forma f (x) = ax + b, onde a, b ∈ R e a ̸= 0, como exemplo imediato
de bijeção.

160
Conjuntos e Noções Básicas de Funções 30.8. Função composta

Observação 30.7.III. Há um princípio de contagem conhecido como Princípio da Casas


dos Pombos, este afirma que se tivermos n + 1 pombos para serem colocados em n casas,
então pelo menos uma casa deverá conter dois ou mais pombos. A prova deste princípio é por
contradição. Suponha que nenhum das casas possui mais de um pombo, assim a quantidade
de pombos será no máximo n o que contradiz a hipótese inicial sobre a quantidade de pombos.
Usaremos esse princípio para estudar o “tamanho” dos domínios e contradomínios de
funções injetoras e sobrejetoras.

A noção de tamanho de um conjunto finito pode ser tratada como a quantidade de elementos
que ele possui e chamaremos isto de cardinalidade de um conjunto. É comum denotarmos a
cardinalidade de um conjunto finito A por Card(A), #A ou |A|.

Proposição 30.7.5 – Seja f : A → B uma função onde A e B são conjuntos finitos.

a) Se |A| > |B|, então f não é injetiva;

b) Se |A| < |B|, então f não é sobrejetora.

Demonstração. a) Considere cada elemento de A como um pombo e os elementos de B


como uma casa. Dado um elemento a ∈ A, colocaremos este pombo na casa b ∈ B
se f (a) = b. Como existem mais casas do que pombos, pelo Princípio da Casa dos
Pombos há uma casa que possui pelo menos dois pombos, ou seja, existem a, ã ∈ A
tais que f (a) = f (ã). Portanto, f não é injetiva.

b) Como f é uma função, então para cada a ∈ A deve existir um único b ∈ B a ser
associado por f (a) = b. Assim, no máximo |A| elementos de B podem ser mapeados
por f . Desse modo, se |A| < |B|, então deve existir algum elementos de B que não foi
relacionado por f , ou seja, f não é sobrejetiva.

Observação 30.7.IV. A contrapositiva da Proposição 30.7.5 é mais interessante pois ela


nos diz que se f é injetiva, então |A| ≤ |B| e se f é sobrejetiva, então |A| ≥ |B|. Isto implica
que para uma função ser bijeção devemos ter |A| = |B|. Essas afirmações também valem
quando os conjuntos considerados são infinitos, mas este estudo foge do escopo deste texto.

§30.8 Função composta


Definição 30.11. Sejam A, B e C conjuntos, f : A → B e g : B → C. Definimos a função
composta g ◦ f : A → C por (g ◦ f )(a) = g(f (a)) para todo a ∈ A. Escreveremos apenas g ◦ f
para denotar (g ◦ f )(a) para todo a no domínio de f .

161
Conjuntos e Noções Básicas de Funções 30.9. Função inversa

Exemplo 30.8.1. Considere as funções f, g : R → R dadas por f (x) = x2 e g(x) = x + 1,


assim as composições f ◦ g e g ◦ f são dadas por

(f ◦ g)(x) = f (g(x)) = f (x + 1) = (x + 1)2 e (g ◦ f )(x) = g(f (x)) = g(x2 ) = x2 + 1.

Este exemplo ilustra que em geral temos f ◦ g ̸= g ◦ f , ou seja, a composição de funções


não é uma operação comutativa. Pode ainda acontecer que apenas uma dessas composições
estejam definidas.

Exemplo 30.8.2. Dizemos que uma função h é ímpar se vale h(−x) = −h(x) para todo
x ∈ R. Se g : R → R é uma função ímpar tal que g(x) > 0 para todo x > 0, então existe
f : R → R tal que g = f ◦ f . De fato, basta considerar a função definida por partes
(
−x, se x ≥ 0,
f (x) =
−g(x), se x < 0.

Note que para x ≥ 0 temos

(f ◦ f )(x) = f (f (x)) = f (−x) = −g(−x) = g(x)

e para x < 0 temos

(f ◦ f )(x) = f (f (x)) = f (−g(x)) = f (g(−x)) = −g(−x) = g(x).

Proposição 30.8.3 – Sejam f : A → B e g : B → C, então :

a) Se g ◦ f é injetora, então f é injetora;

b) Se g ◦ f é sobrejetora, então g é sobrejetora;

c) Se f e g são injetoras, então f ◦ g é injetora;

d) Se f e g são sobrejetora, então f ◦ g é sobrejetora;

e) Se f e g são bijetoras, então f ◦ g é bijetora.

Observação 30.8.I. A prova da proposição anterior é bastante simples e deixamos ao cargo


do leitor. Vale ressaltar que as recíprocas dos itens a) e b) não são verdadeiras pois basta
considerar f (x) = x e g(x) = x2 no primeiro item e f (x) = x2 e g(x) = x no segundo.

§30.9 Função inversa


Definição 30.12. Para um conjunto A definimos a função identidade IdA : A → A por IdA (x) = x
para todo x ∈ A. Dado uma função f : A → B definimos a função inversa de f pela função
f −1 : B → A que satisfaz f −1 ◦ f = IdA e f ◦ f −1 = IdB .

162
Conjuntos e Noções Básicas de Funções 30.9. Função inversa

Observação 30.9.I. Podemos ter uma noção de como a função inversa funciona através do
diagrama de flechas. Intuitivamente podemos pensar que as flechas de f −1 fazem o caminho
contrário das flechas de f , assim se tomarmos A = {1, 2, 3, 4}, B = {2, 4, 8, 16} e a função
f (x) = 2x nós temos que os diagramas de flechas de f e f −1 são os seguintes

Exemplo 30.9.1 (Nem toda função admite inversa !). Para mostrar que na definição
Definição 30.12 não garante a existência de inversa para qualquer função iremos considerar
os conjuntos A = {1, 2}, B = {3} e definir a função f : A → B por f (1) = 3 e f (2) = 3.
Agora nos perguntamos quem deveria ser a inversa de f ? Bom, pela definição deveria ser
uma função f −1 : B → A que satisfaz f −1 ◦ f = IdA , ou seja,

f −1 (3) = f −1 (f (1)) = (f −1 ◦ f )(1) = 1 e f −1 (3) = f −1 (f (2)) = (f −1 ◦ f )(2) = 2

Mas isto nos diz que f −1 não é uma função, pois no diagrama flechas de f −1 há duas flechas
saindo de 3. Então mesmo que a função seja sobrejetora, não é garantido que exista função
inversa.
Definindo g : B → A por g(3) = 1 nós temos uma função injetiva que também não possui
inversa pois g −1 (x) não está definida para x = 2, logo g −1 : B → A não é função.

Desse modo, as condições de injetividade e sobrejetividade por si só não garantem a


existência de inversa e daí devemos impor mais condições para garantir a existência desta
função.

Teorema 30.2 – Seja uma função f : A → B. A função inversa f −1 : B → A existe se, e


somente se, f for uma bijeção.

Demonstração. (⇒) Se f −1 : B → A é uma função, então para todo y ∈ B existe um único


x ∈ A tal que f −1 (y) = x, logo, f (x) = f (f −1 (y)) = y e portanto f é sobrejetiva. Nos
resta mostrar que f é injetiva. Desse modo, considere a1 , a2 ∈ A tais que f (a1 ) = f (a2 ),

163
Conjuntos e Noções Básicas de Funções 30.9. Função inversa

aplicando f −1 em ambos os lados segue


f (a1 ) = f (a2 ) =⇒ f −1 (f (a1 )) = f −1 (f (a2 )) =⇒ a1 = a2
e portanto f é uma função injetora. Donde concluímos que f é uma bijeção.
(⇐) Assuma que f é uma bijeção, assim, para todo b ∈ B existe um único a ∈ A tal que
f (a) = b. Definiremos uma função g : B → A por g(b) = a sempre que f (a) = b. Como
f é sobrejetora, então para todo b ∈ B existe a ∈ A tal que (a, b) ∈ f e isto implica que
(b, a) ∈ g. Agora nos resta mostrar que (b, a) é o único elemento de g cuja a primeira
coordenada é b. Daí, se b ∈ B é tal que g(b) = a1 e g(b) = a2 , para algum a1 , a2 ∈ A, pela
definição de g temos f (a1 ) = b e f (a2 ) = b. Usando o fato de f ser injetora, então segue
que a1 = a2 . Desse modo, mostramos que para todo b ∈ B existe um único a ∈ A tal que
(b, a) ∈ g, ou seja, g é uma função de B em A. Além do mais, temos para todo a ∈ A e
b∈B
(g ◦ f )(a) = g(f (a)) = a e (f ◦ g)(b) = f (g(b)) = b
Portanto, g é a inversa de f .

Como um corolário imediato da demonstração do teorema anterior temos

Corolário 30.3 – Se f : A → B é uma bijeção, então f −1 : B → A é uma bijeção.

Exemplo 30.9.2. Pelo Exemplo 30.7.2 sabemos que as funções da forma f (x) = ax + b, onde
a, b ∈ R e a ̸= 0, são bijeções, logo podemos encontrar sua inversa. Desse modo, queremos
encontrar a expressão de f −1 : B → A que satisfaz (f ◦ f −1 )(x) = x para todo x ∈ R, logo

x−b
(f ◦ f −1 )(x) = x ⇐⇒ a · f −1 (x) + b = x ⇐⇒ f −1 (x) = .
a
Note que desta expressão também temos (f −1 ◦ f )(x) = f −1 (ax + b) = x. Portanto a
b−x
inversa de f (x) = ax + b é dada por f −1 (x) = .
a

Para encerrarmos o nosso estudo, convidamos ao leitor a provar e explorar os casos que não
são igualdades no máximo de itens da proposição a seguir

Proposição 30.9.3 – Sejam f : X → Y e g : W → X funções e suponhamos que R ⊆ W ,


S, S ′ ⊆ X, e T, T ′ ⊆ Y . Então :
i) T ⊃ f (f −1 (T )); ix) f (S ∩ S ′ ) ⊂ f (S) ∩ f (S ′ ).

ii) T ⊂ T ′ ⇒ f −1 (T ) ⊂ f −1 (T ′ ). x) f (S \ S ′ ) ⊃ f (S) \ f (S ′ ).

iii) f −1 (T ∪ T ′ ) = f −1 (T ) ∪ f −1 (T ′ ). xi) f (S) ∩ T = f (S ∩ f −1 (T )).

iv) f −1 (T ∩ T ′ ) = f −1 (T ) ∩ f −1 (T ′ ). xii) f (S) ∪ T ⊃ f (S ∪ f −1 (T )).

v) f −1 (T \ T ′ ) = f −1 (T ) \ f −1 (T ′ ). xiii) S ∩ f −1 (T ) ⊂ f −1 (f (S) ∩ T ).

vi) S ⊂ f −1 (f (S)). xiv) S ∪ f −1 (T ) ⊂ f −1 (f (S) ∪ T ).

vii) S ⊂ S ′ ⇒ f (S) ⊂ f (S ′ ). xv) (f ◦ g)−1 (T ) = g −1 (f −1 (T )).

viii) f (S ∪ S ′ ) = f (S) ∪ f (S ′ ). xvi) (f ◦ g)(R) = f (g(R)).

164
Conjuntos e Noções Básicas de Funções 30.10. Exercícios

§30.10 Exercícios
Exercícios Introdutórios
Exercício 30.1. Dados os conjuntos A = {n ∈ Z | n2 ≤ 5}, B = {2023, 2024, 2025} e C = N. Descreva o
conjuntos A e B de outro modo. Além disso, determine A ∪ B, A − C e B ∩ C.
2x + 3
Exercício 30.2. Seja f : R − {5} → R dada por f (x) = . Qual elemento do domínio de f tal que
x−5
sua imagem é 2023 ?
Exercício 30.3. Sejam f, g : R → R funções tais que g(x) = 2x − 3 e (f ◦ g)(x) = 2x2 − 4x + 1. Encontre
a expressão que define a função f .
3x
Exercício 30.4. Seja A = R − {2} e considere f (x) = . Determine um conjunto B ⊂ R para que
x−2
f : A → B seja uma bijeção. Para esse tal conjunto B, determine a inversa de f .

Exercícios de Aprofundamento
Exercício 30.5. Encontre dois conjuntos X e Y tais que (X × Y ) ∩ (Y × X) possua exatamente 2 elementos.
É possível que nesta interseção existam 3 elementos ?
Exercício 30.6. Mostre que:
a) f : R → R onde f (x) = x2 não é injetiva, sobrejetiva ou bijetiva;
b) g : R+ → R onde g(x) = x2 é injetiva, mas não é sobrejetiva ou bijetiva;
c) h : R → R+ onde h(x) = x2 é sobrejetiva, mas não é injetiva ou bijetiva;
d) p : R+ → R+ onde p(x) = x2 é injetiva, sobrejetiva e bijetiva.
Exercício 30.7. Sejam A e B conjuntos tais que |A| = |B|. Mostre que f : A → B é injetora se, e somente
se, é sobrejetora.

Exercícios Avançados
f (n)
Exercício 30.8. Considere a função f : N → R onde f (1) = 1 e f (n + 1) = para todo n ≥ 1.
1 + 2f (n)
Calcule f (n) para todo n ∈ N.
Exercício 30.9. Seja f : Q → Q uma função tal que f (x + y) = f (x) + f (y) para todos x, y ∈ Q. Prove os
seguintes itens:
a) f (0) = 0 e f (−x) = −f (x) para todo x ∈ Q;
b) f (x − y) = f (x) − f (y) para todos x, y ∈ Q;
c) f (kx) = kf (x) para todo x ∈ Q e k ∈ Z;
d) f (1/n) = f (1)/n para todo n ∈ Z∗ ;
e) f (m/n) = m/n · f (1) para todos m, n ∈ Z, n ̸= 0.
Exercício 30.10. Dê um exemplo de uma função sobrejetora f : N → N tal que para todo n ∈ N o conjunto
{k ∈ N | f (k) = n} seja infinito.

165
31 Funções Reais e Funções Elementares
O gráfico mostra como a função varia em relação aos diferentes valores de entrada. Veremos
que o gráfico de uma função pode ter diferentes formas, como uma linha reta, uma curva suave,
ou até mesmo uma série de pontos desconectados.
Estudar o gráfico de funções é importante para compreender as relações entre variáveis, então
este estudo é importante se queremos resolver equações, desigualdades ou simplesmente comunicar
informações de forma clara mostrando padrões, tendências e relações complexas de uma maneira
que seja fácil de entender.
Portanto, o gráfico pode ser usado para visualizar a natureza da função, incluindo seu domínio,
sua imagem e suas propriedades, como simetria, períodos e descontinuidades. Também pode ser
usado para encontrar interseções, máximos e mínimos locais e globais, e para traçar gráficos de
funções inversas e compostas.

§31.1 Sinais de uma função


Dada uma função f : A → B vamos estudar o problema de encontrar os valores de x ∈ A tal que
f (x) > 0 ou f (x) < 0. No caso de funções reais, ou seja, funções da forma f : X → R, onde
X ⊂ R, podemos usar o gráfico de f para determinar onde as imagem tomam valores positivos
ou negativo.

Exemplo 31.1.1. Vamos considerar uma função real que possui o seguinte gráfico

Então podemos representar as regiões positivas e negativas do gráfico como a seguir

ou de forma mais simplificada ainda

Desse modo, temos que a função considerada é positiva em (−8, 1) ∪ (25, +∞) e negativa em
(−∞, −8) ∪ (1, 10) ∪ (10, 25).

166
Funções Reais e Funções Elementares 31.2. Zeros de uma função

Exemplo 31.1.2. Para considerarmos um caso mais complexo, tomemos as funções f (x) =
x − 2, g(x) = −3x + 1 e h(x) = 7x + 4. Vejamos que

f (x) > 0 ⇐⇒ x − 2 > 0 ⇐⇒ x > 2 e f (x) < 0 ⇐⇒ x − 2 < 0 ⇐⇒ x < 2.

Podemos repetir o processo para as funções g e h, onde encontramos que g(x) é positiva para
x < 1/3 e negativa para x > 1/3 e h(x) é positiva para x > −4/7 e negativa para x < −4/7.
Então para a a função F (x) = (x − 2)(−3x + 1)(7x + 4) = −21x3 + 37x2 + 14x − 8 temos o
seguinte diagrama

Assim, podemos afirmar que −21x3 + 37x2 + 14x − 8 é negativa quando x ∈ (−4/7, 1/3) ∪
(2, +∞) e positiva quando x ∈ (−∞, −4/7) ∪ (1/3, 2).

Observação 31.1.I. Apesar de ser uma regra simples, queremos dar destaque a seguinte
propriedade: Vale −(−x) = x para todo x ∈ R.

Demonstração. Considere x ∈ R, então devemos ter que −(−x) + (−x) = 0. Somando x em


ambos os lados e observando que (−x) + x = 0, nos vem que

−(−x) + (−x) = 0 ⇐⇒ −(−x) + (−x) + x = 0 + x


⇐⇒ −(−x) + (−x + x) = x
⇐⇒ −(−x) + 0 = x
⇐⇒ −(−x) = x.

Portanto, temos −(−x) = x para qualquer x ∈ R.

§31.2 Zeros de uma função


Já que expomos ideias para estudar o sinal de uma função f : X ⊂ R → R, nos resta estudarmos
os zeros de funções reais, isto é, os números x ∈ R tais que f (x) = 0. Pensando no gráfico
da função, os seus zeros, se existirem, determinam onde em quais pontos a função cruza o eixo
horizontal (também chamado de eixo x) e também podem ajudar a entender o comportamento
geral da função.

167
Funções Reais e Funções Elementares 31.2. Zeros de uma função

Exemplo 31.2.1. Vamos mostrar alguns casos onde os zeros podemos calcular zeros de
funções elementares

a) Considere a função f (x) : R → R dada por f (x) = ax + b, onde a. O zero de f existe


e é único. Podemos determina-lo do seguinte modo f (x) = 0 ⇐⇒ ax + b = 0, daí
b
x=− .
a
b) Usando o método de completamento de quadrados podemos encontrar os zeros da
função g(x) = ax2 + bx + c, onde a ̸= 0. De fato, podemos reescrever ax2 + bx + c = 0
b2
como ax2 + bx = −c. Pondo a em evidência e somando e retirando o termo 2 nos
4a
vem que

b2 b2 b 2 b2
   
2 2 b c
ax + bx + c = 0 ⇐⇒ a x + x + 2 − 2 = −c ⇐⇒ x + − 2 =−
a 4a 4a 2a 4a a
2 2

b2 − 4ac

b b − 4ac b
⇐⇒ x + = 2
⇐⇒ x + =±
2a 4a 2a 2a

−b ± b2 − 4ac
⇐⇒ x =
2a

c) Já para a função h(x) = x3 + ax2 + bx + c o trabalho de procurar zeros agora se torma


√ √
bem mais complicado. O processo para tal se inicia definindo y = 3 x1 + 3 x2 , onde x1
e x2 são soluções da equação x2 − (x1 + x2 )x + x1 x2 = 0. Por simplicidade, definiremos
S = x1 + x2 e P = x1 x2 . Elevando y ao cubo nós obtemos,
√ √
q q
3
y = ( x1 + x2 ) = x1 + 3 x1 x2 + 3 3 x1 x22 + x22
3 3 3 3 2

√ √ √ √
3
= x1 + x2 + 3 3 x1 x2 ( 3 x1 + 3 x2 ) = S + 3 P y

Ou seja, sabemos encontrar os zeros de funções h(y) = y 3 −3 3 P y −S e observe que essa
expressão falta o termo quadrático que aparece na função h que estamos considerando.
Assim, para acabarmos com o termo quadrático de h faremos a substituição x = y − a/3
em h(x) e assim a equação que nos resta é
 a 3  a 2  a
h(y − a/3) = y − +a y− +b y− +c
3 3 3
a2 2a3 ab
 
= y3 + b − y+ − + c = y 3 + py + q,
3 27 3

a2 2a3 ab
onde p = b − eq= − + c. Comparando os termos de h(y − a/3) com os de
3 27 3 √
h(y) obtemos as relações p = −3 3 P e q = −S, ou seja, P = −p/27 e S = −q. Vamos
agora retornar para as expressões S = x1 + x2 e P = x1 x2 vemos x2 = −(x1 + p/27) e
substituindo isso em P nós ganhamos pelo item anterior
r
2+4
p3
−q + q
r
p 3 p 3 q q2 p3
2
−x1 (x1 +q) = − ⇒ x1 +qx1 − = 0 ⇒ x1 = 27 =− + +
27 27 2 2 4 27
logo, r
q q2 p3
x2 = −1 − x1 = − − +
2 4 27

168
Funções Reais e Funções Elementares 31.3. Função crescente e função decrescente

√ √
Voltando para a expressão x + a/3 = y = 3 x1 + 3 x2 obtemos uma fórmula para os
zeros de h(x) = x3 + ax2 + bx + c que pode ser escrita como
s r s r
a 3 q q 2 p 3 3 q q2 p3
x=− + − + + + − − +
3 2 4 27 2 4 27

Observação 31.2.I. Toda a ideia do método exposto no item c) do Exemplo 31.2.1 é


atribuída aos matemáticos Scipione Del Ferro (1465-1526), Girolamo Cardano (1501-1576)
e Tartaglia (1500-1557) que, de certo modo, se envolveram numa batalha matemática que
rendeu na publicação do tratado de álgebra de Cardado entitulado de Ars Magna. Em
resumo, por volta de 1515, Scipione conseguiu encontrar uma expressão para as soluções de
x3 + bx + c = 0 mas não publicou sua descoberta. Em torno de 1535, Tartaglia divulgou que
tinha desenvolvido obter uma soluções de x3 + ax2 + c = 0 e Cardano foi capaz de reduzir a
equação geral ao caso de Tartaglia. Também podemos citar que a demonstração feita no
item c) é inspirada no artigo “Uma solução das equações do 3◦ e do 4◦ graus” escrito por
Carlos Gustavo T. de A. Moreira na Revista Professor de Matemática.

Observação 31.2.II. Para a função f (x) = x3 + px + q podemos definir o discriminante


δ = 27q 2 + 4p2 . Este é dispositivo é capaz de determinar a quantidade de zeros que f possui:
Se δ > 0, então f possui apenas uma único zero real; Se δ = 0, então f possui dois zeros
reais; Se δ < 0, então f possui 3 zeros reais. A demonstração deste resultado não é tão difícil
mas foge do escopo do texto.

Exemplo 31.2.2. Existem funções que não possuem zeros e vamos expor alguns exemplos.

a) Por exemplo a função f : R → R dada por f (x) = 1 para todo x ∈ R não possui zeros.

b) Outra função que é mais interessante seria g : R → R dada por g(x) = x2 + 1. Para
explicar o motivação para considerar esta função é o fato que x2 ≥ 0 para todo xR,
logo
g(x) = x2 + 1 ≥ 0 + 1 = 1 > 0.

c) Há casos que podem se parecer com o item a) do Exemplo 31.2.1, como a função
h : Z → R dada por h(x) = 2x − 1, mas h não admite zeros. De fato, se existisse
teríamos que o zero de h seria dado por x = 1/2, mas esse não é um elemento de Z.

§31.3 Função crescente e função decrescente


Definição 31.1. Dizemos que f : A → B é uma função crescente em X ⊂ A se para todo
x, y ∈ X onde x < y implica que f (x) < f (y). Equivalentemente, f é crescente em X ⊂ A se
f (x) − f (y)
x ̸= y implique que > 0 para quaisquer x, y ∈ X.
x−y
Voltando para a ideia gráfica, dizer que uma
função é crescente significa que o gráfico da fun-
ção sobe quando variamos argumento a partir
da esquerda para a direita. Este movimento
crescente ocorre sem pontos de inflexão, isto é,
a curva nunca começa a descer.

169
Funções Reais e Funções Elementares 31.3. Função crescente e função decrescente

Exemplo 31.3.1. Casos simples como as funções identidade IdA : A ⊂ R → R dada por
IdA (x) = x é uma função crescente. Outros casos não tão imediatos são as seguintes

a) A função f : R+ → R dada por f (x) = x3 + 2x é crescente. De fato, para números


reais quaisquer 0 < a < b, temos

f (b) − f (a) = (b3 + 2b) − (a3 + 2a) = (b3 − a3 ) + 2(b − a)


= (a − b)(a2 + ab + b2 ) + 2(b − a) = (b − a)(b2 + ab + a2 + 2)

Nos resta mostrar que a2 + ab + b2 + 2 > 0. Mas usando a desigualdade entre a médias

xy ≤ (x + y)/2, para x, y > 0, temos

a2 + b2 + ab + 2 ≥ 2ab + ab + 2 = 3ab + 2 > 0

b) A função g : R+ → R dada por g(x) = x/(1 + x) é crescente. De fato, para 0 < a < b
temos

a < b ⇐⇒ a + ab < b + ab ⇐⇒ a(1 + b) < b(1 + a)


a b
⇐⇒ f (a) = < = f (b)
1+a 1+b

c) Se a > 0, então a função h(x) = ax2 + bx + c é crescente no conjunto [−b/2a, +∞).


b
De fato, se y > x ≥ −b/2a, temos x + y ≥ − daí segue
a
h(y) − h(x) = (ay 2 + by + c) − (ax2 + bx + c) = a(y 2 − x2 ) + b(y − x)
= a(y − x)(y + x) + b(y − x) = (y − x)[a(y + x) + b]
 
b
= a(y − x) x + y + ≥0
a

Portanto, h(x) = ax2 + bx + c, onde a > 0, é crescente em [−b/2a, +∞).

No item b) mostramos que a função g : R+ → R dada por g(x) = x/(1 + x) é crescente,


então temos para 0 < a < b + c que g(a) < g(b + c), ou seja,

a b+c b c b c
< = + ≤ +
1+a 1+b+c 1+b+c 1+b+c 1+b 1+c
Portanto, podemos usar funções crescentes para demonstrar certas desigualdades.

Definição 31.2. Dizemos que f : A → B é uma função decrescente em X ⊂ A se para todo


x, y ∈ X onde x < y implica que f (x) > f (y). Equivalentemente, f é decrescente em X ⊂ A se
f (x) − f (y)
x ̸= y implique que < 0 para quaisquer x, y ∈ X.
x−y
Voltando para a ideia gráfica, dizer que uma
função é decrescente significa que o gráfico da
função desce quando variamos argumento a par-
tir da esquerda para a direita. Este movimento
decrescente ocorre sem pontos de inflexão, isto
é, a curva nunca começa a subir.

170
Funções Reais e Funções Elementares 31.4. Função constante

Exemplo 31.3.2. Seja f : R → R dada por f (x) = ax2 + bx + c, onde a > 0. A função
h(x) = ax2 + bx + c é decrescente no conjunto (−∞, −b/2a]. De fato, se x < y ≤ −b/2a,
b
temos x + y ≤ − daí segue
a
f (y) − f (x) = (ay 2 + by + c) − (ax2 + bx + c) = a(y 2 − x2 ) + b(y − x)
= a(y − x)(y + x) + b(y − x) = (y − x)[a(y + x) + b]
 
b
= a(y − x) x + y + ≤0
a

Portanto, f (x) = ax2 + bx + c, onde a > 0, é decrescente em (−∞, −b/2a].


Exemplo 31.3.3. Mostraremos que a função a : N → R dada por a(n) = n n! é crescente e
a(n + 1) − a(n) a(n + 1)
depois provaremos que b(n) = = −1 é decrescente. Por simplicidade
a(n) a(n)
denotaremos an e bn para as funções anteriores. Note que an+1
n+1 = (n + 1)! = (n + 1)an , logo
n
 n
an+1 n+1
= . Ora, cada um dos termos envolvidos no produto (n + 1)! são menores
an an+1
que n + 1, logo an+1
n+1 = (n + 1)! < (n + 1)
n+1 o que implica que a
n+1 < n + 1. Daí concluímos
 n
an+1 n+1
= > 1 ⇐⇒ ann+1 > ann ⇐⇒ an+1 > an
an an+1

o que conclui a demonstração da primeira parte da nossa afirmação. Para a segunda


an+2 an+1
parte, devemos mostrar que bn+1 < bn , ou seja, < vale para todo n ∈ N, ou
an+1 an
equivalentemente, an+2 an < a2n+1 e elevando a n + 2 nós obtemos an+2 n+2 < a2n+4 . Pela
n+2 an n+1
definição de an temos

an+2 n+2
n+2 an < a2n+4 2 2 2
n+1 ⇐⇒ (n + 2)!n!an < [(n + 1)!] an+1
an 2 [(n + 1)!]2
 
n+1
⇐⇒ < = .
an+1 n!(n + 2)! n+2

Iremos provar a última desigualdade por indução em n. Para n = 1 temos (a1 /a2 )2 = 1/2 <
2/3. Suponha que vale para algum k ∈ N, então para k + 1 temos
" 2 #k+2
(k + 1)!ak+1 2 (k + 1)!ak+1 2 (k + 1)k!ak+1 2
     
ak+1
= = =
ak+2 (k + 2)! (k + 2)! (k + 2)(k + 1)!
" #2 
(k + 1)akk ak+1 ak k k + 1 2 k + 1 k+2 k + 2 k+2
      
= = < <
(k + 2)ak+1
k+1
ak+1 k+2 k+2 k+3

Tomando raízes completamos a nossa prova por indução. Portanto bn é decrescente.

§31.4 Função constante


Uma função constante é uma função matemática que sempre retorna o mesmo valor, inde-
pendentemente do valor de entrada. Matematicamente, dizemos que a função f : A ⊂ R → R é
constante se para todo x real temos f (x) = k para alguma constante k ∈ R.

171
Funções Reais e Funções Elementares 31.5. Função afim

No Exemplo 31.2.2 comentamos que a função


f (x) = 1 não possui zeros e este argumento pode
ser generalizado para qualquer função constante
g : X ⊂ R → R dada por g(x) = k, onde k ̸= 0.
Para o caso k = 0, dizemos que a g é a função
nula em X. Além disso, a função constante
possui sinal constante e depende do valor de k.
Note ainda que função constante não é injetiva
ou sobrejetiva. E o gráfico da função constante
é uma reta paralela ao eixo-x.

§31.5 Função afim


Definição 31.3. Uma função f : R → R recebe o nome de função afim quando é dada por
f (x) = ax + b, onde a ̸= 0. Para o caso b = 0, chamamos a função g(x) = ax de função linear.
É comum chamarmos a constante a de coeficiente angular e b de coeficiente linear.

Vimos no Exemplo 31.2.1 zeros da função afim


b
f (x) = ax + b, é dado por x = − . Além disso,
a
já comentamos também em exemplos anteriores
que uma função afim é injetiva e sobrejetiva,
logo, uma bijeção. Relembre também que o grá-
fico de uma função afim é uma reta que não é
paralela ao eixo-x.

Proposição 31.5.1 – Seja f : R → R uma função afim, dada por f (x) = ax + b. Então :

a) A função f é crescente se, e somente se, a > 0.

b) A função f é decrescente se, e somente se, a < 0.

Demonstração. Para o item a), vejamos que


f (y) − f (x)
f (x) = ax + b é crescente ⇐⇒ > 0, ∀x ̸= y
y−x
(ay + b) − (ax + b)
⇐⇒ > 0, ∀x ̸= y;
y−x
a(y − x)
⇐⇒ = a > 0, ∀x ̸= y.
y−x
O item b) é tratado de forma semelhante.

Observação 31.5.I. Note que a proposição anterior nos diz que a condição de crescimento,
ou decrescimento, da função afim não depende de um conjunto específico ou outra propriedade
sobre a função. Desse modo, sabendo que o único zero de uma função afim f (x) = ax + b
ocorre em −b/a, podemos facilmente determinar o sinal desta função. Por exemplo, se f é
crescente então para qualquer x > −b/a temos f (x) > f (−b/a) = 0 e se x < −b/a temos
f (x) < f (−b/a) = 0.

172
Funções Reais e Funções Elementares 31.5. Função afim

Vamos explicar o motivo para o coeficiente da variável x da função afim ser chamado de
coeficiente angular. Relembre que a razão dos catetos de um triângulo retângulo é chamada de
tangente e este está relacionado com ângulo que é feito entre a hipotenusa e um dos catetos.

Pelo Teorema 30.1, sabemos que o gráfico da


função afim f (x) = ax + b é uma reta, logo, na
figura ao lado, os triângulos △ABE e △BCD
são retângulos e semelhantes. Assim, como os
pontos A, B e C são pontos do gráfico de f ,
temos y1 = ax1 + b e y2 = ax2 + b. Daí, a razão
y2 − y1
dos catetos do triângulo △BCD é =a
x2 − x1
e pelo comentário anterior concluímos tan α = a.
Portanto, podemos considerar a equação o grá-
fico de f faz um ângulo constante α com as
paralelas do eixo-x.

Explorando este resultado com um pouco mais de trigonometria, podemos por exemplo
considerar a reta que é perpendicular ao gráfico de y = ax + b. Assuma que a equação da reta
procurada é da forma y = cx + d.

modo que a interseção entre as retas seja o


ponto O(0, 0), assim as equações das retas são
y = ax e y = cx. Considerando os pontos
A(1, y1 ), B(1, 0) e C(1, y2 ), onde √
y1 = a e y2 = c.
Por
√ Pitágoras, temos que OA = 1 + a2 , OC =
1 + c e AC = (1 − 1) + (a − c)2 = a − c.
p
2 2
2 2
Já no triângulo △OAC, temos OA + OC =
AC
p 2 p 2
1 + a2 + 1 + c2 = (a − c)2
(1 + a2 ) + (1 + c2 ) = a2 − 2ac + c2
Por simplicidade, transladamos a figura de 2 = −2ac ⇐⇒ ac = −1 ⇐⇒ c = −1/a

Reciprocamente, se c = −1/a, então vale a relação de pitágoras no triângulo △OAC então este
é retângulo em O, ou seja, as retas são perpendiculares. Portanto, acabamos de demonstrar a
seguinte proposição

Proposição 31.5.2 – Para que as retas y = ax + b e y = cx + d sejam perpendiculares é


necessário e suficiente que tenhamos ac = −1.

173
Funções Reais e Funções Elementares 31.6. Exercícios

§31.6 Exercícios
Exercícios Introdutórios
Exercício 31.1. Se α e β são os zeros da função f (x) = x2 + x − 1, encontre uma função da forma
g(x) = ax2 + bx + c onde os zeros são exatamente α3 e β 3 .
Exercício 31.2. Determine os valores de m ∈ R tais que f (x) = (m2 + 1 − 10/m)x + 2023 é crescente.
p √
Exercício 31.3. Encontre os zeros da função f : R+ → R dada por f (x) = 2 + x − 8/x.
Exercício 31.4. Sejam α e β reais os zeros da função f (x) = x2 − 13x + 9 e α2 e β 2 são os zeros da função
g(x) = x2 + ax + b, onde a, b ∈ R. Calcule a + b.
Exercício 31.5. Sejam a, b ∈ R quaisquer e considere o intervalo [a, b] ⊂ R. Mostre que se f : [a, b] → R é
uma função crescente, então f é injetiva

Exercícios de Aprofundamento
Exercício 31.6. Definimos uma Progressão Aritmética (ou simplemente P.A.) de razão r ∈ R como uma
sequência (ak )k≥1 de números que satisfazem an+1 = an + r para todo n ∈ N. Para reais dados a e b,
com a ̸= 0, defina f (x) = ax + b. Mostre que se (ak )k≥1 é uma P.A. de razão r, então a sequência (bk )k≥1
onde bk = f (ak ) é uma P.A. e encontre sua razão.
Exercício 31.7. Os valores de uma sequência (ak )k≥1 é uma P.A. onde a1 , a2 , a3 , . . . são os valores
f (1), f (2), f (3), . . . onde f é uma função afim. Mostre que:
a) Mostre que cada ak é igual à área de um trapézio delimitado pelo gráfico de f , pelo eixo-x e pelas
retas verticais de equações x = k − 1/2 e x = k + 1/2.

b) Mostre que a soma S = a1 + a2 + · · · + an é igual à área do trapézio delimitado pelo gráfico de f ,


pelo eixo-x e pelas retas verticais x = 1/2 e x = n + 1/2.
(a1 + an )n
c) Conclua que S = .
2
Exercício 31.8. Sejam (ak )k≥1 e (bk )k≥1 duas progressões aritméticas. Mostre que existe uma, e somente
uma, função afim tal que f (an ) = bn para todo n ∈ N.

Exercícios Avançados
Exercício 31.9. Encontre todas as funções crescentes f : N → N tais que tenhamos f (n + f (n)) = 2f (n)
para todo n ∈ N.
Exercício 31.10. Seja f : R → R uma função crescente. Mostre que as seguintes afirmações são equivalentes:
(i) f (nx) = nf (x) para todo n ∈ Z e todo x ∈ R.
(ii) Pondo a = f (1), tem-se f (x) = ax para todo x ∈ R.
(iii) f (x + y) = f (x) + f (y) para quaisquer x, y ∈ R.
 n
n+1
Exercício 31.11. Prove por indução que ≤ n para todo n ≥ 3 e conclua que a sequência
√ √ √ n
1, 2, 3 3, 4 4, . . . é decrescente a partir do terceiro termo.

174
32 Funções Quadráticas e Problemas de
Otimização
§32.1 Definições e Preliminares
Definição 32.1. Uma função f : R → R chama-se função quadrática quando existem números
reais a, b e c, com a ̸= 0, tais que f (x) = ax2 + bx + c para todo x ∈ R. O número a é conhecido
por coeficiente do termo quadrático, b é o coeficiente do termo linear e c é o coeficiente constante.
Os zeros de uma função quadrática também são chamados de raízes.

Já discutimos os zeros de uma função quadrática na Aula 3, mais precisamente no Exemplo 31.2.1.
Neste momento, mergulharemos mais a fundo nesse tópico para explorar outras propriedades que
serão de extrema importância para o nosso estudo futuro.
Relembre que a técnica de somar e subtrair certo termo a uma expressão dada a fim de
completar o quadrado é bastante poderosa. Dados a, b, c ∈ R, com a ̸= 0, consideremos o trinômio
ax2 + bx + c e notemos que
 
2 2 b c
ax + bx + c = a x + x +
a a
b2 b2
 
b c 4a
= a x2 + 2 · ·x+ 2 − 2 + ·
2a 4a 4a a 4a
" 2 #
b b2 − 4ac
=a x+ −
2a 4a2

Aplicando o método de completar quadrados, acabamos de mostrar outra forma de expressar


o trinômio ax2 + bx + c e esta forma é conhecida como forma canônica do trinômio. É comum
ainda chamarmos o termo ∆ = b2 − 4ac de discriminante, esta é uma quantidade que depende
apenas dos coeficientes do trinômio e nos permite deduzir algumas propriedades das raízes sem
calculá-las. De fato, a partir da forma canônica imediatamente nós temos a seguinte proposição:

Proposição 32.1.1 – Sejam a, b e c reais, com a ̸= 0. A função quadrática f (x) = ax2 +bx+c

−b ± ∆
possui zeros se, e somente se, ∆ ≥ 0. Neste caso, as soluções são dadas por x = .
2a

Demonstração. Se queremos que x ∈ R seja zero de f , então pela forma canônica nós temos
" #
b 2 b 2
  
∆ ∆
2
ax + bx + c = 0 ⇐⇒ a x + − 2 = 0 ⇐⇒ x + = 2 (32.1)
2a 4a 2a 4a
r √
b ∆ −b ± ∆
⇐⇒ x + =± ⇐⇒ x = (32.2)
2a 4a2 2a

Veja que (x + b/2a)2 ≥ 0 para todo x real, então a passagem da primeira para a segunda linha só
faz sentido se tivermos ∆ ≥ 0

Observação 32.1.I. Note que se ∆ = 0, a função quadrática f (x) = ax2 +bx+c ainda possui
dois zeros, mas eles não são distintos. Nesse caso, dizemos que a equação ax2 + bx + c = 0

175
Funções Quadráticas e Problemas de Otimização 32.1. Definições e Preliminares

possui uma raiz dupla.

Observação 32.1.II. O caso ∆ < 0 gera problemas pois queremos calcular a raiz quadrada
deste número e valores negativos não está no domínio desta função. Isto deu motivação para
matemáticos para definir i como a solução da equação x2 + 1 = 0 e assim nasce o conjunto
C dos números complexos, onde são os números que são da forma a + bi, onde a, b ∈ R.

Veja que se ∆ ≥ 0, então a soma e o produto dos zeros de uma função quadrática podem ser
expressos em fator de seus coeficientes. Com efeito, para verificar a afirmação sobre a soma basta
observar que
√ √ √ √
−b + ∆ −b − ∆ (−b + ∆) + (−b − ∆) −2b b
+ = = =−
2a 2a 2a 2a a
e para o produto dos zeros temos
√ √ √ √ √
−b + ∆ −b − ∆ (−b + ∆) · (−b − ∆) (−b)2 − ( ∆)2 b2 − (b2 − 4ac) c
· = 2
= 2
= 2
=
2a 2a 4a 4a 4a a
Essa observação feita com uma linguagem bem mais moderna, na verdade tem sua origem em
textos cuneiformes escritos pelos babilônios. O método descrito por eles remonta uma técnica
muito boa para encontrar dois números conhecendo sua soma S e seu produto P . No nosso
contexto, isto é equivalente a encontrar soluções da equação x2 − Sx + P = 0. Vamos expor um
pouco mais sobre isso no próximo exemplo.

Exemplo 32.1.2 (Um método babilônico!). Veja primeiramente que se a e b são dois
números reais então
(x − a)(x − b) = x2 − (a + b)x + ab
ou seja, o problema de encontrar dois números reais conhecendo a sua soma S e seu produto
P é equivalente a encontrar os zeros de f (x) = x2 − Sx + P . Suponha que α e β são os
números procurados e α ≤ β. Assim, sua média aritmética é S/2 = α+β 2 . Conhecendo a
diferença d = β − S/2 = S/2 − α, podemos expressar os números procurados por α = S/2 − d
e β = S/2 + d. Curiosamente, é mais simples encontrar qual o valor de d pois
    2
S S S
P = αβ = −d +d = − d2 .
2 2 2

Reorganizando os termos nos vem que


 2 s 
2 S S 2
d = − P ⇐⇒ d = −P
2 2

e portanto, os números procurados são dados por


s  s 
S S 2 S S 2
α= − −P e β = + −P
2 2 2 2

Observação 32.1.III. Já sabemos que f (x) = ax2 + bx + c possui zeros se, e só se, seu
discriminante é maior ou igual a zero, então no Exemplo 32.1.2 estamos assumindo que o
problema admite solução, ou seja, implicitamente assumimos que o discriminante da função

176
32.2. A imagem da função quadrática
Funções Quadráticas e Problemas de Otimização

f (x) = x2 − Sx + P possui essa propriedade. Desse modo, estamos considerando que


 2
2 S
(−S) − 4P ≥ 0 ⇐⇒ − P ≥ 0.
2

Pelos textos babilônicos é possível notar que eles não se preocuparam com esse fato, o que
provavelmente causou algum tipo de mistério quando tentaram encontrar os números cujo
a soma e o produto são iguais a 2. Nesses casos eles simplesmente diziam que os números
procurados não existem.

Exemplo 32.1.3. Observe que tudo o que foi aprendido até agora não se restringe apenas
a encontrar zeros de funções quadráticas. Por exemplo, podemos encontrar as soluções de
x4 + 5x2 − 7 = 0. Fazendo a substituição y = x2 , a equação se torna y 2 + 5y − 7 = 0, onde
seu discriminante é ∆ = 52 − 4(−7) = 53 ≥ 0 e √ assim podemos aplicar√qualquer método para
−5 ± 53 5 + 53
determinarmos que as soluções são y = . Note que − < 0, logo não faz
2 √ 2 r √
−5 + 53 −5 + 53
parte da solução da equação original. Portanto, x2 = , ou seja, x = ± .
2 2
Outras substituições também são interessantes. Por exemplo, se queremos encontrar os
zeros da função f (x) = 2x4 + 5x3 + 6x2 + 5x + 2, podemos dividir ambos os lados da equação
2x4 + 5x3 + 6x2 + 5x + 2 = 0 por x2 e assim encontramos
   
4 3 2 2 1 1
2x + 5x + 6x + 5x + 2 = 0 ⇐⇒ 2 x + 2 + 5 x + + 6 = 0.
x x

Fazendo uso agora da substituição y = x + 1/x temos y 2 = x2 + 1/x2 + 2, logo podemos


reescrever a equação como 2 y 2 − 2 + 5y + 6 = 0 e novamente podemos prosseguir com
todas as ferramentas do nosso estudo para encontrar as soluções.
Como último exemplo, vamos encontrar as soluções reais da equação
156
x2 + x + 1 = .
x2+x

Observe que o termo x2 + x aparece duas vezes na equação, então isso nos induz considerar
a substituição y = x2 + x, donde a expressão se torna
156 156
x2 + x + 1 = ⇐⇒ y + 1 = ⇐⇒ y 2 + y = 156.
x2 + x y

Note que o discriminante desta equação é ∆ = 12 − 4(−156) = 625 = 252 > 0, então os
possíveis valores para y são 13 ou 12. Logo, obtemos duas equações x2 + x = −13 ou
x2 + x = 12. Por conta do descriminante, vemos que a primeira equação não possui solução,
já na segunda temos que as soluções são x = −4 ou x = 3.

§32.2 A imagem da função quadrática


Vamos agora estudar a imagem da função quadrática f (x) = ax2 + bx + c. Para realizarmos esse
estudo basta encontrarmos y ∈ R tais que ax2 + bx + c = y, mas pela discussão anterior, desse
modo, queremos que a equação ax2 + bx + (c − y) = 0 possua solução. Pela Proposição 32.1.1
sabemos que esta condição é equivalente a pedirmos que o discriminante dessa equação seja maior

177
32.2. A imagem da função quadrática
Funções Quadráticas e Problemas de Otimização

ou igual a zero. Daí,

b2 − 4a(c − y) ≥ 0 ⇐⇒ b2 − 4ac + 4ay ≥ 0 ⇐⇒ 4ay ≥ −∆


∆ ∆
No caso em que a > 0, temos y ≥ − e se a < 0, temos y ≤ − . Portanto, demonstramos a
4a 4a
seguinte proposição

Proposição 32.2.1 – Considerando a função quadrática f (x) = ax2 + bx + c, então temos :


 

i) Se a > 0, a imagem de f é o intervalo Im(f ) = − , +∞ ;
4a
 

ii) Se a < 0, a imagem de f é o intervalo Im(f ) = −∞, − .
4a

Exemplo 32.2.2. i) A imagem da função f (x) = 6x2 − 5x + 8 pode ser determinada


pela Proposição 32.2.1. De fato, note que temos nesse caso a = 6, b = −5 e c = 8,
então segue que ∆ = (−5)2 − 4 · 6 · 8 = −167. Logo, a imagem de f é o intervalo
[167/24, +∞).

ii) Já a função g(x) = −2x2 −3x+4 possui discriminante ∆ = (−3)2 −4·(−2)·4 = 41, então
pela mesma proposição podemos afirmar que sua imagem é o intervalo (−∞, 41/8].

Podemos ainda nos perguntar quando a função é crescente ou decrescente. Desse modo, para o
primeiro caso, vamos procurar os valores para x ̸= y tal que f (y)−f
y−x
(x)
> 0. Assim,

f (y) − f (x) (ay 2 + by + c) − (ax2 + bx + c) a(y 2 − x2 ) + b(y − x)


> 0 ⇐⇒ 0 < =
y−x y−x y−x
 
a(y − x)(y + x) + b(y − x) b
⇐⇒ 0 < = a(y + x) + b = a x + y + .
y−x a
Assim, se a > 0 então podemos considerar x e y pertencentes ao intervalo [−b/2a, +∞), pois
b b b b
assim teremos x + y ≥ − − = − , ou equivalentemente, x + y + ≥ 0. Já se a < 0,
2a 2a 2a a
podemos considerar x, y ∈ (−∞, −b/2a]. Uma conta totalmente análoga nos mostra o caso em
que f é decrescente. Podemos, então, resumir esses fatos na seguinte proposição:

Proposição 32.2.3 – Considerando a função quadrática f (x) = ax2 + bx + c, então :


   
b b
a) Se a > 0, então f é crescente em − , +∞ e decrescente em −∞, − ;
2a 2a
   
b b
b) Se a < 0, então f é crescente em −∞, − e decrescente em − , +∞ .
2a 2a

§32.2.4 Sinais de uma função quadrática


O caso ∆ ≤ 0 é bem especial pois assim f tem sinal constante. De fato,
" suponha primeiramente
#
b 2


que ∆ < 0 e relembre que a forma canônica de f é dada por f (x) = a x + − 2 . Note
2a 4a

178
32.2. A imagem da função quadrática
Funções Quadráticas e Problemas de Otimização

que pela nossa hipótese temos que −∆/4a é positivo. Assim, para todo x ∈ R
" #
b 2

2 ∆
a · f (x) = a x+ − 2 =⇒ a · f (x) > 0
2a 4a

Já se ∆ = 0, então pela forma canônica temos para x ∈ R − {−b/2a}


" #
b 2 b 2
  
2 ∆ 2
a · f (x) = a x+ − 2 =a x+ >0
2a 4a 2a

Isto pode ser resumido na seguinte proposição.

Proposição 32.2.5 – Se f (x) = ax2 + bx + c é tal que seu discriminante é não-positivo, então:

i) Se ∆ < 0, então a e f (x) possuem o mesmo sinal para todo x ∈ R;

ii) Se ∆ = 0, então a e f (x) possuem o mesmo sinal para todo x ∈ R − {−b/2a}.

Exemplo 32.2.6. i) A função f (x) = x2 − 2x + 4 é positiva para todo x ∈ R, pois seu


discriminante é ∆ = 4 − 4 · 4 = −12 < 0 e o coeficiente do termo quadrático é positivo.

ii) A função g(x) = −x2 + x − 1 é negativa para todo x ∈ R, pois seu discriminante é
∆ = 12 − 4(−1)(−1) = −3 < 0 e o termo quadrático possui coeficiente positivo.

iii) Já a função h(x) = −2x2 + 8x − 8 possui discriminante ∆ = 82 − 4(−2)(−8) = 0 então


h possui uma raiz dupla em −b/2a = 2 e o coeficiente do termo quadrático é negativo,
então concluímos que h(x) < 0 para todo x ∈ R − {2}.

Nos falta considerarmos o caso ∆ > 0, onde a função quadrática admite duas raízes distintas,
para estudarmos o seu sinal. Primeiramente, note que se ∆ ≥ 0, então pela forma canônica nós
temos
" #  √ !2 
b 2
  2
∆ b ∆ 
f (x) = a x + − 2 = a x + −
2a 4a 2a 2a
" √ ! √ !#
b ∆ b ∆
=a x+ + x+ − = a(x − x1 )(x − x2 )
2a 2a 2a 2a
√ √
−b − ∆ −b + ∆
onde x1 = e x2 = . Pela Proposição 32.1.1, sabemos que x1 e x2 são os zeros
2a 2a
de f . Assim, toda função quadrática pode ser escrita como produto de funções afim, onde os zeros
desses fatores são x1 e x2 . Vamos considerar um exemplo para mostrar que tipo de informação
podemos extrair deste comentário.

Exemplo 32.2.7. Veja que a função f (x) = 5x2 − 15x + 10 possui discriminante igual a
∆ = (−15)2 − 4 · 5 · 10 = 25 > 0, logo essa possui duas raízes distintas. Pela Proposição
32.1.1, sabemos que os zeros são x = 1 e x = 2. Desse modo, a função pode ser expressa
por f (x) = 5(x − 1)(x − 2). Assim, podemos analisar o sinal de cada função afim junto do
coeficiente do termo quadrático para determinar o sinal de f .

179
Funções Quadráticas e Problemas de Otimização 32.3. Gráfico da função quadrática

Portanto, f é negativa no intervalo (1, 2) e positiva no seu complementar.


O sinal do coeficiente quadrático tem que ser levado em conta para o estudo do sinal, pois
a função g(x) = −5x2 + 15x − 10 também possui raízes em x = 1 e x = 2, mas em x = 3/2,
que pertence ao intervalo (1, 2), temos que g(3/2) = −5(3/2)2 + 15 · 3/2 − 10 = 5/4 > 0.

Proposição 32.2.8 – Se uma função quadrática f (x) = ax2 + bx + c possui discriminante


∆ > 0, então a função quadrática f pode ser escrita como f (x) = a(x − x1 )(x − x2 ), onde x1
e x2 são as raízes de f . Assumindo que x1 < x2 podemos afirmar que:

i) Se a > 0, então f é negativa sobre o intervalo aberto (x1 , x2 ) e positiva em seu


complementar.

ii) Se a < 0, então f é positiva sobre o intervalo aberto (x1 , x2 ) e negativa em seu
complementar.

A Proposição 32.2.5 pode ainda gerar uma aplicação bastante útil para o estudo de desigualdades.
Vamos mostrar agora um resultado bastante importante e básico dessa teoria.

Exemplo 32.2.9 (Desigualdade de Cauchy-Schwarz). Considere n > 1 e números reais


a1 , a2 , . . . , an , b1 , b2 , . . . , bn não-negativos. Defina a função f (x) = (a1 x − b1 )2 + (a2 x − b2 )2 +
(a3 x − b3 )2 + · · · + (an x − bn )2 , por simplicidade escreveremos f (x) = Ax2 − 2Bx + C, onde
A = a21 +a22 +· · ·+ann , B = a1 b1 +a2 b2 +· · ·+an bn e C = b21 +b22 +· · ·+b2n . Como f (x) é a soma de
quadrados, então devemos ter f (x) ≥ 0 para todo x ∈ R, assim f possui sinal constante. Por
outro lado, como A > 0 temos que seu discriminante ∆ = (−2B)2 − 4AC = 4(B 2 − AC) ≤ 0,
ou seja, B 2 ≤ AC. Substituindo os valores de A, B e C obtemos a expressão

(a1 b1 + a2 b2 + · · · + an bn )2 ≤ a21 + a22 + · · · + a2n b21 + b22 + · · · + b2n .


 

Esta é conhecida como Desigualdade de Cauchy-Schwarz. Deixamos ao leitor analisar quando


ocorre a igualdade na Desigualdade de Cauchy-Schwarz.

§32.3 Gráfico da função quadrática


Depois da discussão da seção anterior sobre a imagem, os intervalos de crescimento e decrescimento,
assim como o sinais de uma função quadrática podemos esboçar o gráfico desta família de funções.
Vamos juntar mais alguns resultados sobre o seu gráfico que usaremos mais tarde.
Em geometria, o eixo de simetria é uma linha que divide uma figura em duas partes simétricas,
isto é, como se fossem o objeto e a sua imagem refletida em um espelho. Vejamos que o gráfico
de uma função quadrática possui este eixo.

Proposição 32.3.1 – O gráfico de uma função quadrática possui um eixo de simetria sobre
uma reta perpendicular ao eixo−x.

180
Funções Quadráticas e Problemas de Otimização 32.3. Gráfico da função quadrática

Demonstração. Considere a função


" quadrática # = ax + bx + c, onde a =
f (x) 2 ̸ 0. Sabemos que
2
b ∆ b
sua forma canônica é f (x) = a x + − 2 . Assim, para x = p − temos
2a 4a 2a
" #
b 2
      
b b ∆ ∆ ∆
f p− =a p− + − 2 = a p2 − 2 = a (−p)2 − 2
2a 2a 2a 4a 4a 4a
" #
b 2
  
b ∆ b
= a −p − + − 2 = f −p −
2a 2a 4a 2a
     
b b b b
Assim, os pontos p − , f p − e −p − , f −p − estão sobre uma reta
2a 2a 2a 2a
paralela ao eixo−x e eles possuem a mesma distância da reta vertical x = −b/2a. Como p ∈ R é
arbitrário, então a reta x = −b/2a é de fato o eixo de simetria do gráfico de f .

Definição 32.2. Dizemos que o número yM ∈ Im(f ) é o valor máximo da função y = f (x) se, e
somente se, yM ≥ y para qualquer y ∈ Im(f ). O número xM ∈ Dom(f ) tal que yM = f (xM ) é
chamado ponto de máximo da função.
Definição 32.3. Dizemos que o número ym ∈ Im(f ) é o valor mínimo da função y = f (x) se, e
somente se, ym ≤ y para qualquer y ∈ Im(f ). O número xm ∈ Dom(f ) tal que ym = f (xm ) é
chamado ponto de mínimo da função.
Relembre que para uma função quadrática f (x) = ax2 + bx + c, onde a =
̸ 0 temos f (−b/2a) =
∆/4a. Então o ponto (−b/2a, f (−b/2a)) = (−b/2a, −∆/4a) pertence tanto ao eixo de simetria
quanto ao gráfico da função quadrática. Portanto, chamamos o ponto
 
b ∆
V = − ,−
2a 4a
de vértice do gráfico de f .
Note que a primeira coordenada de V está sobre a reta vertical que contém o ponto médio das
raízes de f .
Observe que a maioria dos resultados dependem do sinal do coeficiente do termo quadrático da
função f (x) = ax2 + bx + c. Quando a > 0, a concavidade de f está voltada para cima. Já
se a < 0, a concavidade de f está voltada para baixo.

Pela Proposição 32.2.1 vemos que se a função quadrática possui concavidade para cima, então
a função possui valor mínimo e se possui
"concavidade para#baixo, a função possui valor máximo.
2
b ∆
Veja que a forma canônica f (x) = a x + − 2 nos mostra com facilidade quem é o
2a 4a
valor máximo ou mínimo de f . Suponhamos que a > 0, então o menor valor de f ocorre quando o
primeiro termo, aquele que depende de x, é igual a zero, ou seja, quando x = −b/2a. E a mesma
análise pode ser feita quando a < 0. Deste modo, segue a seguinte proposição

181
Funções Quadráticas e Problemas de Otimização 32.3. Gráfico da função quadrática

Proposição 32.3.2 – O valor de máximo ou de mínimo de uma função quadrática y =


ax2 + bx + c ocorre sobre o vértice de seu gráfico. Ou seja, quando x = −b/2a e y = −∆/4a.

Definição 32.4. Dado um ponto F e uma reta


d tal que F ∈ / d pertencentes ao plano carte-
siano R . Definimos a parábola de foco F e
2

reta diretriz como o conjunto dos pontos que


possuem a mesma distância da reta e do ponto
F.

Proposição 32.3.3 – O gráfico de uma função quadrática é uma parábola.

Assumiremos esse resultado sem mostrar a ideia da prova, mas o leitor cuidadoso não deverá
ter muitas dificuldades em demonstrar essa proposição.
Podemos finalmente esboçar o gráfico de f (x) = ax2 + bx + c, onde a ̸= 0. Vamos sempre
procurar algumas informações para nos guiar de que modo o gráfico de f está situado no plano,
que são:
1◦ ) O gráfico de f é uma parábola, cujo eixo de simetria é a reta x = −b/2a.
2◦ ) Se a > 0, a parábola possui concavidade virada para cima. Se a < 0, a parábola possui
concavidade virada para baixo.
3◦ ) i) Se o discriminante ∆ for positivo, então os zeros de f são os pontos
√ ! √ !
−b − ∆ −b + ∆
P1 ,0 e P2 ,0
2a 2a

ii) Se ∆ = 0, então f encontra o eixo−x apenas no ponto P (−b/2a, 0).


iii) Já se ∆ < 0, então f não intersecta o eixo−x.
 
b ∆
4 ) o vértice V − , − 2 é o ponto de máximo de f se a < 0 e de mínimo se a > 0.

2a 4a
Os únicos tipos de gráficos podem ser os seguintes

182
Funções Quadráticas e Problemas de Otimização 32.3. Gráfico da função quadrática

Exemplo 32.3.4. Façamos o esboço do gráfico da função y = x2 − 4x + 3. Vejamos primeiro


que esta deverá ser uma parábola com a concavidade virada para cima, pois seu coeficiente
quadrático é igual a 1. Calculando o seu discriminante temos ∆ = (−4)2 − 4 · 1 · 3 =
√ 4 > 0,
4− 4
então a função dada possui duas raízes distintas e estas são dadas por x = =1
√ 2
4+ 4
e x = = 3. O vértice de y = x2 − 4x + 3 é o ponto cuja as coordenadas são
2
−b −∆
xm = − = 2 e ym = − = −1. Portanto, obtemos o seguinte esboço
2a 4a

Exemplo 32.3.5. Podemos também encontrar a função quadrática se temos algumas


informações sobre seu gráfico. Por exemplo, consideremos agora o seguinte gráfico

Veja que agora o coeficiente do termo quadrático deve ser negativo, pois sua concavidade
está virada para baixo. Além disso, sabemos que as coordenadas do seu vértice são xM = 2 e
yM = 3. Daí devemos ter
b
− = 2 =⇒ b = 4a =⇒ b2 = 16a2
2a
e substituindo isto em yM nós obtemos

b2 − 4ac
− = 3 =⇒ b2 − 4ac = −12a =⇒ 16a2 − 4ac = −12a.
4a
Dividindo ambos os lados por 4a, nós obtemos 4a−c = −3. Relembre que a soma das raízes x1
e x2 é igual a −b/a = 4, logo como x1 = −1 temos x1 + x2 = −b/a =⇒ −1 + x2 = 4, ou seja,
x2 = 5. E o produto das raízes é igual a c/a dai x1 · x2 = c/a =⇒ −5 = c/a =⇒ 5a + c = 0.
Somando esta com a equação 4a − c = −3 nós obtemos 9a = −3, donde temos a = −1/3.
Concluímos assim que b = 4/3 e c = 5/3, portanto a função que possui o gráfico dado é
1 4 5
f (x) = − x2 − x + .
3 3 3

183
Funções Quadráticas e Problemas de Otimização 32.4. Problemas de Otimização

§32.4 Problemas de Otimização


Um problema de otimização é um tipo de problema matemático que envolve encontrar a melhor
solução possível entre várias alternativas possíveis, de acordo com um critério ou objetivo
específico. Essa solução é conhecida como “ótima” ou “ideal” e é geralmente determinada por
meio da maximização ou minimização de uma função objetivo.
Por exemplo, em um problema de otimização de produção, o objetivo pode ser maximizar o
lucro ou minimizar o custo. Em um problema de otimização de transporte, o objetivo pode ser
minimizar a distância percorrida ou o tempo de entrega.
Na maioria das vezes, em um problema de otimização, a tarefa é descobrir a mistura perfeita
das variáveis disponíveis que nos leve à melhor solução, mas sem quebrar as regras impostas
pelo problema. Ou seja, é como fazer um bolo delicioso seguindo a receita, mas ajustando os
ingredientes até chegar ao ponto ideal.
Vamos utilizar as ideias das proposições anteriores para determinarmos a solução de problemas
em que procuramos o máximo ou o mínimo de certas funções.

Exemplo 32.4.1. Suponha que y = −t2 + 5t + 1 descreve a altura, em metros, de uma


pedra lançada após t > 0 segundos. Vamos nos restringir apenas ao 6 primeiros segundos
e determinaremos, neste intervalo, o maior (yM ) e o menor (ym ) valor que y assume. Note
que a altura da pedra é descrita por uma função quadrática de coeficientes a = −1, b = 5 e
c = 1, logo seu discriminante é ∆ = 52 − 4 · (−1) · 1 = 29 > 0. Pensando no problema físico,
a condição ∆ > 0 nos diz que a função considerada possui duas raízes distintas e estes são
exatamente os dois momentos em que a pedra toca o chão. Calculando suas raízes, temos
√ √
5 + 29 5 − 29
t= >0 e t= < 0,
2 2
vamos desconsiderar a segunda raiz pois estamos trabalhando apenas com valores positivos
b 5 ∆
para segundos. Além disso, o seu vértice possui coordenadas xM = − = e yM = − =
2a 2 4a
29
. Portanto, como xM < 6, a maior altura da pedra nos 6 primeiros segundos é yM = 29/4
4
metros e a altura mínima da pedra é de 0 metros, quando ela toca o chão.

Exemplo 32.4.2. Dentre todos os números reais de soma 8, pergunta-se aqueles cujo
produto é máximo. Para responder esse problema chamemos A e B para esses números e seu
produto denotaremos por P , logo, P = A · B e A + B = 8. Veja que substituindo B = 8 − A
na expressão do produto temos P = A(8 − A) = −A2 + 8A. Desse modo, obtemos que P é
uma função quadrática na variável A com concavidade virada para baixo, e assim, P possui
um valor máximo. Veja ainda que o vértice desta função quadrática possui coordenadas

8 82 − 4 · (−1) · 0
A=− =4 e P =− = 16.
2 · (−1) 4 · (−1)

Portanto, os números que somam 8 e possuem produto máximo são A = 4 e B = 8 − A = 4.

184
Funções Quadráticas e Problemas de Otimização 32.5. Exercícios

§32.5 Exercícios
Exercícios Introdutórios
Exercício 32.1. Determine o valor de m ∈ R na função real f (x) = 3x2 − 2x + m para que o valor mínimo
seja 5.
Exercício 32.2. Determine os valores de m ∈ R tais que f (x) = x2 + mx + 5 possua raízes inteiras.
Exercício 32.3. Dadas as equações x2 − 5x + k = 0 e x2 − 7x + 2k = 0, sabe-se que uma das raízes da
segunda equação é o dobro de uma das raízes da primeira equação. Sendo k ̸= 0, determine k.
Exercício 32.4. Determine os valores de m ∈ R para que a função quadrática f (x) = mx2 + (2m − 1)x +
(m − 2) tenha dois zeros reais e distintos.
Exercício 32.5. Um avião de 100 lugares foi fretado para uma excursão. A companhia exigiu de cada
passageiro R$ 800, 00 mais R$ 10, 00 por cada lugar vago. Para que número de passageiros a rentabilidade
da empresa é máxima?
Exercício 32.6. O diretor de uma orquestra percebeu que, com o ingresso a R$ 9, 00, em média 300 pessoas
assistem aos concertos e que, para cada redução de R$ 1, 00 no preço dos ingressos, o público aumenta
100 espectadores. Qual deve ser o preço do ingresso para que a receita seja máxima?

Exercícios de Aprofundamento

Exercício 32.7. Encontre as soluções da equação x4 − 7x3 + 14x2 − 7x + 1 = 0.

Exercício 32.8. Um objeto foi arremessado e tem


sua trajetória representada pelo gráfico da função
quadrática esboçado na figura a seguir. Qual é a
altura máxima atingida por esse objeto ?

Exercício 32.9. Determine o retângulo de maior área contido num triângulo equilátero de lado 4 cm,
estando a base do retângulo num lado do triângulo.
Exercício 32.10. Mostre que, para todos a, b, c ∈ R, sendo a ̸= 0, a equação
1 1 1
+ = 2
x−b x−c a
possui exatamente duas raízes reais distintas.
p p
Exercício 32.11. Resolva a equação x = x − 1/x + 1 − 1/x para x ∈ R.

Exercícios Avançados
Exercício 32.12. Prove que se a, b e c são inteiros ímpares, as raízes de y = ax2 + bx + c não são racionais.
Exercício 32.13. Mostre que se (ak ) é uma P.A. e f é uma função quadrática qualquer, então a sequência
definida por bn = f (an+1 ) − f (an ) é uma P.A.. Dê um exemplo para mostrar que a sequência cn = f (an )
não é uma P.A..
Exercício 32.14. Considere a função quadrática f (x) = ax2 + bx + c, onde a ̸= 0. Considere x1 , x2 ∈ R
quaisquer e mostre que vale  
x1 + x2 f (x1 ) + f (x2 )
f ≤ .
2 2
Mais ainda, mostre que para todo 0 < t < 1 temos f (tx1 + (1 − t)x2 ) ≤ tf (x1 ) + (1 − t)f (x2 ).

185
33 Função Modular
§33.1 Definições Básicas
A motivação para definir funções por partes vem da necessidade de modelar situações em que
uma única expressão não é suficiente para descrever todo o comportamento da função em seu
domínio. Em muitos casos, uma função pode apresentar diferentes comportamentos em intervalos
distintos de seu domínio, o que torna necessária a definição de expressões diferentes para cada
intervalo.
Por exemplo, considere a função que descreve o custo de um serviço de entrega em uma empresa
de transporte. O custo pode variar de acordo com a distância percorrida e o peso da carga. Nesse
caso, é possível definir uma função por partes, em que cada expressão descreve o custo para um
conjunto específico de condições. Essa abordagem permite que a função descreva corretamente o
comportamento do custo em todas as situações possíveis.

Exemplo 33.1.1. Mostraremos alguns exemplos de funções definidas por partes.

i) Um exemplo simples de funções definido por partes é a função do tipo degrau, onde
f (x) = 1 se x ≥ 0 e f((x) = −1. Uma outra forma de expressar essa função é do
1, se x ≥ 0
seguinte modo f (x) = . O gráfico dessa função é dado por
−1, se x < 0

ii) Podemos usar quantas proposições quisermos para definir funções. Uma função definida
pelas proposições abertas P (x) : x2 , Q(x) : x e R(x) = 2 − x é a seguinte

se x < 0

2
x ,

f (x) = x, se 0 ≤ x < 1
2 − x, se x ≥ 1

e esta função possui o seguinte gráfico

186
Função Modular 33.2. A função modular

§33.2 A função modular


Definição 33.1. O valor absoluto, ou módulo, de um número real x é definido por
(
x, se x ≥ 0
|x| =
−x, se x < 0
Outra maneira de definirmos o módulo de x consiste em por |x| = max{x, −x}, isto é, o valor de
|x| é simplesmente o maior dos valores entre x e −x.
Assim como fizemos na seção anterior, podemos facilmente esboçar o gráfico da função modular
|x|.

Exemplo 33.2.1. O estudo da função |x| não é tão interessante, por isso os casos mais
interessantes são da forma |f (x)|, onde f (x) é uma função real qualquer. Já sabemos que a
função modular é uma função por partes, então o mesmo deve acontecer com a função
(
f (x), se f (x) ≥ 0
|f (x)| = ,
−f (x), se f (x) < 0

cada expressão pode ser descrita se conhecermos o sinal da função f em todo o seu domínio.

Por exemplo, para a função linear f (x) = x − 2 temos que f (x) > 0 sempre que x > 2 e
f (x) < 0 se x < 2. Então, seu módulo |f (x)| = |x − 2| pode ser expresso como a seguinte
função por partes (
x − 2, se x ≥ 2
|f (x)| = |x − 2| =
2 − x, se x < 2
Assim, o seu gráfico é

Exemplo 33.2.2. Para explicarmos a relação entre o gráfico da função com seu módulo
vamos considerar a função f (x) = 1 − x2 . Observe que nesse caso, o descriminante é igual
a ∆ = b2 − 4ac = 02 − 4 · (−1) · 1 = 4 > 0, logo f possui duas raízes e elas são −1 e 1.
Veja ainda que o vértice dessa parábola é V (−b/2a, −∆/4a) = (0, 1). Assim, sabemos que
f (x) = −(x − 1)(x + 1) é positiva apenas no intervalo (−1, 1). Desse modo, quando tomamos
o módulo de f devemos obter
(
1 − x2 , se − 1 ≤ x ≤ 1
|f (x)| =
x2 − 1, se x < −1 ou x > 1

187
Função Modular 33.2. A função modular

Assim, seu gráfico é simplesmente

Note que toda a parte negativa da f foi excluída e substituída pelo seu “reflexo” em torno
do eixo-x.

Exemplo 33.2.3. Suponha que queremos resolver a seguinte equação modular |x − 3| = 6.


Diferente do que fazíamos antes, a função modular nos força a considerar separadamente
os casos onde a função x − 3 é positiva ou negativa. Mas como x − 3 é positiva apenas no
intervalo (3, +∞), então temos que
(
x − 3, se x ≥ 3
|x − 3| = .
3 − x, se x < 3

Daí, para x ∈ [3, +∞) temos a equação x − 3 = 6, onde a solução é x = 9 e para x ∈ (−∞, 3)
temos a equação 3 − x = 6, onde x = −3 é a solução. Portanto, as soluções de |x − 3| = 6
são x = −3 e x = 6.

Observação 33.2.I. Podemos mostrar uma solução geral para as equações da forma |x−a| =
b, onde a, b ∈ R. De fato, observe primeiramente que o módulo de qualquer número é sempre
um número maior ou igual a zero, logo, se b < 0, então a equação modular considerada não
possui solução. Já se b > 0, então após analisar o sinal de x − a temos que as soluções da
equação dada são x = a + b ou x = a − b.

Exemplo 33.2.4. Consideremos agora a seguinte equação modular |x + 1| + |x − 2| = 7.


Como fizemos anteriormente, podemos afirmar que
(
x + 1, se x ≥ −1
|x + 1| =
−x − 1, se x < −1
(
x − 2, se x ≥ 2
|x − 2| =
2 − x, se x < 2

Deste modo, temos três intervalos a considerar (−∞, −1), [−1, 2) e [2, +∞).

i) No caso em que x ∈ (−∞, −1) a expressão |x+1|+|x−2| se torna −x−1+2−x = 1−2x,


assim, podemos afirmar que a solução de 1 − 2x = |x + 1| + |x − 2| = 7 é x = −3.

ii) Se −1 < x < 2, então |x + 1| + |x − 2| = x + 1 + 2 − x = 3. Logo, neste intervalo não


existe solução da equação |x + 1| + |x − 2| = 7.

188
Função Modular 33.3. Uma interpretação geométrica do módulo

iii) Já para x ≥ 2 temos que |x + 1| + |x − 2| = x + 1 + x − 2 = 2x − 1 e disso temos que a


solução da equação modular nesse intervalo é x = 4.

Portanto, as soluções da equação |x + 1| + |x − 2| = 7 são x = −3 e x = 4.

Observação 33.2.II. De certo modo, ao analisarmos os intervalos no Exemplo 33.2.4


mostramos que
1 − 2x, se x < −1


|x + 1| + |x − 2| = 3, se − 1 ≤ x < 2 .
2x − 1, se x ≥ 2

Então resolver a equação |x + 1| + |x − 2| = 7 nada mais é que encontrar os pontos em que o


gráfico desta função toca a reta y = 7. Assim, a versão geométrica desse problema pode ser
analisada através do seguinte esboço

Exemplo 33.2.5. Vamos encontrar os valores de x ∈ R tais que x2 − x|x| − 2 = 0. Como


esta expressão envolve o valor absoluto |x| devemos, então, considerar dois casos:

(I) Suponha que x ≥ 0. Assim, |x| = x e logo temos

x2 − x|x| − 1 = x2 − x2 − 2 = −1

assim x2 − x|x| − 2 = 0 não possui solução em [0, +∞).

(II) Suponha agora que x < 0. Assim, |x| = −x e segue que

x2 − x|x| − 1 = 0 =⇒ x2 − x(−x) − 2 = 0 =⇒ 2x2 − 2 = 0 =⇒ x2 = 1 =⇒ x = ±1

Mas observe que x = 1 não pertence ao intervalo que estamos considerando, logo,
x = −1 é a única solução.

§33.3 Uma interpretação geométrica do módulo


Existe uma interpretação geométrica importante sobre o valor absoluto de um número. Usaremos
como base a reta real e consideremos dois números x e y que foram marcados, assim a distância
entre os números marcados é exatamente |x − y|.

189
Função Modular 33.3. Uma interpretação geométrica do módulo

Desse modo, o valor |x| mede a distância do ponto x até a origem 0, pois |x| = |x − 0|. Além
disso, é claro que a distância entre x e y é o mesmo que a distância entre y e x, assim isso pode
ser traduzido como |x − y| = |y − x|. Além disso, igualdades como |x − 1| = 3 significa x assume
os valores que distam 3 do número 1, ou seja, x = 1 + 3 = 4 e x = 1 − 3 = −2. Resumimos
algumas propriedades da função modular na próxima proposição.

Proposição 33.3.1 – Para quaisquer x, y ∈ R temos:

a) x ≤ |x|.

b) |x| = 0 se, e somente se, x = 0;

c) |x · y| = |x| · |y|;

d) |x|2 = x2 ;

e) (Desigualdade Triangular) |x + y| ≤ |x| + |y|;

f) ||x| − |y|| ≤ |x − y|.

Demonstração. a) Relembre que |x| é o maior dos valores entre −x e x, assim, x ≤ |x| para
qualquer que seja x ∈ R.

b) Se x = 0, então é claro que |x| = 0. Por outro lado, se |x| = 0, então o máximo entre x e
−x é zero, em qualquer que seja o caso temos x = 0.

c) Deixamos a prova pro leitor.

d) Se x ≥ 0, então |x| = x. Disso temos |x|2 = |x| · |x| = x · x = x2 .


Se x < 0, então |x| = −x. Daí, |x|2 = |x| · |x| = (−x)(−x) = x2 .

e) Usando os itens a), c) e d) temos

|x + y|2 = (x + y)2 = x2 + 2xy + y 2 ≤ |x|2 + 2|x||y| + |y|2 = (|x| + |y|)2

Ou seja, |x + y|2 ≤ (|x| + |y|)2 e como ambos os lados dessa desigualdade são quadrados de
termos não-negativos podemos concluir que |x + y| ≤ |x| + |y|.

f) Veja que usando a desigualdade triangular temos |x| = |(x − y) + y| ≤ |x − y| + |y|, ou


seja, |x| − |y| ≤ |x − y|. De mesmo modo, podemos concluir |y| − |x| ≤ |y − x|, ou ainda,
−|x − y| ≤ |x| − |y|. Assim,

−|x − y| ≤ |x| − |y| ≤ |x − y| =⇒ ||x| − |y|| ≤ |x − y|.

Observação 33.3.I. Para motivar o nome Desigualdade Triangular para |x + y| ≤ |x| + |y|
substitua x = a − b e y = b − c, assim, a desigualdade se torna |a − c| ≤ |a − b| + |b − c|. Pela
nossa intuição geométrica, isto nos diz que a distância entre a e c é sempre menor do que
caminharmos sobre o trajeto de a até b e depois de b até c.

190
Função Modular 33.3. Uma interpretação geométrica do módulo

Observação 33.3.II. Usamos no fim da proposição anterior o fato que |x| ≤ a ⇐⇒ −a ≤


x ≤ a. A prova disto é bem simples. De fato,

|x| ≤ a ⇐⇒ x2 = |x|2 ≤ a2 ⇐⇒ x2 − a2 = (x − a)(x + a) ≥ 0 ⇐⇒ −a ≤ x ≤ a.

Podemos mostrar, com uma ideia similar, que |x| ≥ a ⇐⇒ x ≤ −a ou x ≥ a. Com efeito,

|x| ≥ a ⇐⇒ x2 = |x|2 ≥ a2 ⇐⇒ x2 − a2 = (x − a)(x + a) ≥ 0 ⇐⇒ x ≤ −a ou x ≥ a

Podemos obter uma visão geométrica da Observação 33.3.II interpretando que a desigualdade
|x − a| < b, onde a e b são números reais fixos, significa os números x tais que a distância até o
número a é no máximo b. Então por um pensamento parecido com o anterior, podemos concluir
que |x − a| > b são os números x tais que a distância até a é pelo menos b.

Exemplo 33.3.2. Considere o intervalo centrado em a de raio r > 0, isto é, o intervalo


I = (a − r, a + r). Para qualquer par x, y ∈ I de elementos de I e t ∈ [0, 1] o número
Pt = tx + (1 − t)y ainda está em I. De fato, note que x, y ∈ I implica |x − a| < r e |y − a| < r.
Assim, tomando t ∈ [0, 1] nós obtemos pela Desigualdade Triangular

|[tx + (1 − t)y] − a| = |t(x − a) + (1 − t)(y − a)|


≤ |t(x − a)| + |(1 − t)(y − a)|
= t|x − a| + (1 − t)|y − a|
< tr + (1 − t)r = r

Podemos ver esse resultado geometricamente através da seguinte imagem

Exemplo 33.3.3 (A razão áurea). Dados dois números reais a < b, considere o intervalo de
extremos a e b. Assim, pelo Exemplo 33.3.2, sabemos que o ponto Pt = ta + (1 − t)b está
Pt − a
contido em (a, b), sempre que t ∈ [0, 1]. Além disso, para este ponto Pt , nós temos =t
b−a
e esta é a razão em que foi dividido o intervalo (a, b). Em particular, temos que para t = 1/2
temos P1/2 = a · 1/2 + (1 − 1/2)b = (a + b)/2 ou seja, o Ponto Médio do segmento de extremos
a e b.
Diz-se que o ponto x ∈ (a, b) divide o segmento de extremos a e b de acordo com a divisão
x−a b−x
áurea quando se tem = . Observe que isso se transforma em uma equação do
b−a x−a

191
Função Modular 33.3. Uma interpretação geométrica do módulo

segundo grau em que podemos determinar as soluções


x−a b−x
= =⇒ (x − a)2 = (b − x)(b − a)
b−a x−a
=⇒ x2 − 2ax + a2 = b2 − ab − x(b − a)
=⇒ x2 + (b − 3a)x + [a2 − b2 + ab] = 0
p
(3a − b) ± (b − 3a)2 − 4(a2 − b2 + ab)
=⇒ x =
2
Veja que

(b − 3a)2 − 4(a2 − b2 + ab) = b2 − 6ab + 9a2 − 4a2 + 4b2 − 4ab


= 5(b2 − 2ab + a2 ) = 5(b − a)2 .

Disso podemos concluir que √


(3a − b) ± (b − a) 5
x= .
2

Então se tomarmos a = 1 e b = 2 temos


√ um segmento de comprimento 1 e que é dividido na
1+ 5
razão áurea apenas quando x = , que é aproximadamente, 1, 618 . . . . Por este motivo
√ 2
1+ 5
o número é conhecido como número de ouro.
2

Exemplo 33.3.4. Uma aplicação interessante para a desigualdade triangular é encontrar


estimativas para o valor de funções em um certo intervalo. Por exemplo, considere a função
x2 − 3
f (x) = . Veja que se |x − 1| < 2/3, ou seja, se x ∈ (1 − 2/3, 1 + 2/3) = (1/3, 5/2)
x−2
temos
x2 − 3 (x − 1)2 + 2(x − 2) (x − 1)2 (x − 1)2
= = +2 ≤ +2
x−2 x−2 x−2 x−2
Mas como |x − 1| < 2/3, então elevando ambos os lados ao quadrado temos (x − 1)2 < 4/9 e
disso segue
2 1 1
|x − 2| = |(x − 1) − 1| ≥ −1 = =⇒ ≤ 3.
3 3 |x − 2|
Portanto, temos que
x2 − 3 4 10
<3· +2= .
x−2 9 3
Com um pouco mais de trabalho da pra mostrar que esta função é positiva no intervalo
(1/3, 5/3) e que o seu valor máximo é igual a 2 neste mesmo intervalo.

192
Função Modular 33.4. Exercícios

§33.4 Exercícios
Exercícios Introdutórios
Exercício 33.1. Durante o ano de 2023 uma empresa teve seu lucro diário L dado pela função L(x) =
50(|x − 100| + |x − 200|). Para qual dia x > 0 temos o lucro igual R$ 10000?
Exercício 33.2. Esboce o gráfico das funções

 (
−2, se x ≤ −2
 −x2 + 4x + 3, se x < 0
(b) f (x) =
(a) f (x) = x, se − 2 < x < 2 −x2 − 4x + 3, se x ≥ 0

2, se x ≥ 2

Exercício 33.3. Determine os zeros da função f (x) = x2 − 3|x| + 1 e esboce seu gráfico.
Exercício 33.4. Determine os valores de x ∈ R tais que:

i) |2x + 5| > 1; ii) |3x + 1| < −4; iii) |5x + 1| ≤ 3; iv) |7x + 1| ≥ −9

Exercícios de Aprofundamento
Exercício 33.5. Esboce o gráfico da função f (x) = ||2x − 2| − 4|.
Exercício 33.6. Quando a igualdade é atingida na desigualdade triangular? Isto é, dados x, y ∈ R quando
vale |x + y| = |x| + |y| ?
Exercício 33.7. Se as soluções de x2 − |x| − 6 = 0 são raízes da equação x2 − αx + β = 0, calcule o valor
de α e β.
Exercício 33.8. Mostre os seguintes itens:
a) Usando a Desigualdade Triangular, mostre que |x − ℓ| + |x − 50 − ℓ| ≥ 50 vale para qualquer y ∈ R
e ℓ ∈ N.
b) Conclua que |x − 1| + |x − 2| + · · · + |x − 100| ≥ 502 para todo x ∈ R.

Exercícios Avançados
Exercício 33.9. Sejam α e β números reais tais que a equação x2 + α|x| + β = 0 possua raízes reais. Prove
que a soma de tais raízes é igual a zero.
Exercício 33.10. Considere a sequência (fn ) dada pela a recorrência fn+1 = fn + fn−1 com f1 = 1 e
fn
f2 = 2. Mostre que vale (fn )2 + fn−1 fn ≥ 2fn−1 fn para todo n ∈ N. Definindo xn = verifique para
fn−1
todo n ∈ N a desigualdade
1
|xn+2 − xn+1 | ≤ |xn+1 − xn |.
2
Exercício 33.11. Seja f : R → R uma função tal que |f (y) − f (x)| = |y − x| para quaisquer x, y ∈ R.
i) Pondo f (0) = a, defina a função g : R → R assim: g(x) = f (x) − a. Prove então que |g(x)| = |x|
para todo x ∈ R. Em particular, g(1) = 1 ou g(1) = −1. Também (g(x))2 = x2 .
1 2
ii) Use a identidade xy = [x + y 2 − (x − y)2 ] para mostrar que xy = g(x) · g(y).
2
iii) Se g(1) = 1, mostre que g(x) = x para todo x ∈ R. Se g(1) = −1, mostre que g(x) = −x para todo
x ∈ R.
iv) Conclua que f (x) = x + a para todo x ∈ R ou então f (x) = −x + a para todo x ∈ R.

193
34 Polinômios e Equações Polinomiais
Os polinômios são expressões matemáticas que consistem em uma soma de termos, cada um dos
quais é um produto de uma constante e uma ou mais variáveis elevadas a potências inteiras. Eles
têm uma ampla variedade de utilidades em diversas áreas da matemática, da física, da engenharia
e de outras ciências.
Por exemplo, para análise de dados, os polinômios são frequentemente usados para ajustar mo-
delos de regressão, que ajudam a descrever a relação entre duas variáveis. Nesta situação, é usado
fortemente um propriedade interessante de polinômios, onde podemos usar esses para aproximar
qualquer tipo de função, onde normalmente essas são de grande complexidade computacional.
Essas são apenas algumas das muitas utilidades dos polinômios. Em geral, eles são uma
ferramenta poderosa para descrever e resolver problemas matemáticos em uma variedade de
campos.

§34.1 Definições Básicas


Definição 34.1. Dada uma coleção de números reais a0 , a1 , a2 , . . . , an−1 , an consideramos a
função f : R → R dada por f (x) = an xn + an−1 xn−1 + · · · + a2 x2 + a1 x + a0 , esta é conhecida
por função polinomial ou polinômio. Chamamos cada termo da forma ak xk de monômio e o
termo ak são os coeficientes. Para o monômio de maior potência de x que possui coeficiente
não nulo, definimos esta potência sendo o grau do polinômio, isto é, para a função definida
anteriormente temos que seu grau é igual a n e denotamos Grau(f ) = n.
Um bom observador irá perceber que já tratamos de polinômios em aulas anteriores. De fato,
quando estudamos funções afim, na verdade estávamos estudando polinômios de grau 1 e no
estudo das funções quadráticas foram tratados polinômios de grau 2. Até as funções constantes
são polinômios de grau zero, a menos da função identicamente nula que apesar de ser polinômio
não definimos o seu grau.

Exemplo 34.1.1. Veja que temos duas operações elementares para funções polinomiais que
são a soma e a multiplicação. Por exemplo, sejam f (x) = x3 + x2 + 1 e g(x) = 2x2 + x, então

(f + g)(x) = f (x) + g(x) = (x3 + x2 + 1) + (2x2 + x) = x3 + 3x2 + x + 1


(f · g)(x) = f (x) · g(x) = (x3 + x2 + 1) · (2x2 + x) = 2x5 + 3x4 + x3 + 2x2 + x

Note que as funções (f + g)(x) = f (x) + g(x) e (f · g)(x) = f (x) · g(x), são ainda polinômios
para quaisquer que sejam os polinômios f (x) e g(x). Assim, como vimos no caso anterior, a
soma de polinômios nos dá um polinômio cujo o grau não pode passar nem do grau de f ou
de g.
Para ver que o grau da soma de polinômios pode diminuir, basta consideramos os polinômios
de grau 3 dados por p(x) = −3x3 + 2x2 + 1 e q(x) = 3x3 − x2 , onde temos

(p + q)(x) = p(x) + q(x) = (−3x3 + 2x2 + 1) + (3x3 − x2 ) = x2 + 1

Por outro lado, o produto de polinômios gera um polinômio de grau igual a soma dos
graus dos polinômios envolvidos no produto. Este é mais intuitivo de pensar por conta da
propriedade distributiva que já conhecemos dos números reais.

Resumindo as observações do Exemplo 34.1.1 nós temos a seguinte proposição que apresentamos
sem demonstração

194
Polinômios e Equações Polinomiais 34.1. Definições Básicas

Proposição 34.1.2 – Dados os polinômios não nulos f e g, temos:

(i) Grau(f + g) ≤ max{Grau(f ), Grau(g)};

(ii) Grau(f g) = Grau(f ) + Grau(g).

Definimos a igualdade entre polinômios f (x) = an xn + · · · + a1 x + a0 e g(x) = bk xk + · · · +


b1 x + b0 quando ambos possuem o mesmo grau, ou seja, quando n = k e se ai = bi para todo
1 ≤ i ≤ k, isto é, quando todos os coeficientes dos monômios de mesmo grau coincidem.

Exemplo 34.1.3. Suponhamos estamos buscando polinômios que satisfaçam a relação

f (x) + f (1 − x) = 1.

Para grau 0 a única solução é a função f (x) = 1/2. Já para Grau(f ) = 1, temos que a função
é da forma f (x) = ax + b, assim, a condição se traduz como

f (x) + f (1 − x) = 1 =⇒ (ax + b) + (a(1 − x) + b) = 1


1−a
=⇒ a + 2b = 1 =⇒ b =
2
Logo, todas as funções polinomiais de grau um que satisfazem f (x) + f (1 − x) = 1 são da
1−a
forma f (x) = ax + . Para um exemplo concreto, tome a = 1 e assim obtemos f (x) = x.
2
Já para com grau três devemos encontrar uma função da forma f (x) = x3 + ax2 + bx + c
que satisfaz a relação dada. Neste caso, como f (1 − x) = −x3 + (a + 3)x2 + (−2a − b − 3)x +
(a + b + c + 1) temos,

1 = f (x) + f (1 − x)
= [x3 + ax2 + bx + c] + [−x3 + (a + 3)x2 + (−2a − b − 3)x + (a + b + c + 1)]
= (2a + 3)x3 + (−2a − 3)x + (a + b + 2c + 1)

Igualando os coeficientes nós obtemos 2a + 3 = 0 e a + b + 2c + 1 = 1, ou seja, a = −3/2 e


b = −2c+3/2. Então todos os polinômios
 de
 grau 3 que satisfazem a relação f (x)+f (1−x) = 1
3 3
são da forma f (x) = x3 − x2 + − 2c x + c.
2 2

§34.1.4 Relação entre coeficientes e raízes de polinômios


Vejamos uma aplicação bem legal para a igualdade entre polinômios. Sabemos que um polinômio
de grau 2 é da forma ax2 + bx + c e que também pode ser escrito como a(x − r1 )(x − r2 ).
Expandindo este ultimo produto temos

a(x − r1 )(x − r2 ) = a(x2 − (r1 + r2 )x + r1 r2 ) = ax2 − a(r1 + r2 )x + ar1 r2 .

Mas, pela igualdade entre os polinômios ax2 + bx + c e a(x − r1 )(x − r2 ) devemos ter as seguintes
igualdades
r1 + r2 = − b
( 
b = −a(r1 + r2 )
=⇒ a
c = ar1 r2 r1 · r2 = c
a
Essas relações são bem interessantes pois conectam as raízes de um polinômio quadrático com seus
coeficientes. Vejamos que o mesmo ocorre para polinômios de grau 3, ou seja, polinômios que são

195
Polinômios e Equações Polinomiais 34.1. Definições Básicas

da forma ax3 + bx2 + cx + d e que por outro lado podem ser expressos por a(x − r1 )(x − r2 )(x − r3 ).
Assim, como anteriormente, vamos expandir o produto e encontramos
a(x − r1 )(x − r2 )(x − r3 ) = a[x2 − (r1 + r2 )x + r1 r2 ](x − r3 )
= a[x3 − (r1 + r2 + r3 )x2 + (r1 r2 + r1 r3 + r2 r3 )x − r1 r2 r3 ]
= ax3 − a(r1 + r2 + r3 )x2 + a(r1 r2 + r1 r3 + r2 r3 )x − ar1 r2 r3

Pela igualdade de polinômios temos



b
r1 + r2 + r3 = −
 
b = −a(r1 + r2 + r3 )

a
 

 c
c = a(r1 r2 + r1 r3 + r2 r3 ) =⇒ r1 · r2 + r1 · r3 + r2 · r3 = .
  a

d = −a(r1 r2 r3 )

 d
r1 · r2 · r3 = −

a
Então já temos base para conjecturar que um polinômio da forma ax4 + bx3 + cx2 + dx + e
cuja as raízes são r1 , r2 , r3 e r4 deve satisfazer

b
r1 + r2 + r3 + r4 = −


a



 c
r1 r2 + r1 r3 + r1 r4 + r2 r3 + r2 r4 + r3 r4 =


a
d

 r1 r2 r3 + r1 r2 r4 + r1 r3 r4 + r2 r3 r4 = −
a



 e
r1 r2 r3 r4 =

a
De fato isso ocorre e a verificação é similar ao que já fizemos. Essas equações são conhecidas
como Equações de Girard. Para polinômios de grau n, as equações podem ser enuncia-
das dizendo que o polinômio an xn + an−1 x n−1 + · · · + a x2 + a x + a pode ser expresso por
2 1 0
n n−1 n−2 + · · · + (−1) σn , onde σ1 significa a soma das raízes desse polinômio,
n

an x − σ1 x + σ2 x
σ2 significa a soma dos produtos dois a dois das raízes, σ3 a soma dos produtos três a três das
raízes e assim por diante.

Exemplo 34.1.5. Considere o polinômio x3 + 2023x − 10 e suponha que suas raízes são a, b
e c. Vamos calcular quanto vale a3 + b3 + c3 . Vejamos que como a, b e c são raízes, então
temos as três equações a3 + 2023a − 10 = 0, b3 + 2023b − 10 = 0 e c3 + 2023c − 10 = 0 a
soma dessas igualdades nos dá

a3 + b3 + c3 + 2023(a + b + c) − 30 = 0.

Mas pelas equações de Girard, a + b + c = 0 pois este é o coeficiente quadrático do polinômio


que estamos trabalhando. Assim, a3 + b3 + c3 = 30.

Exemplo 34.1.6 (ITA – 2018). Seja f (x) = x3 + ax2 + bx um polinômio cuja raízes são
não-negativas e estão em Progressão Aritmética. Sabendo que a soma dos seus coeficientes é
igual a 10, podemos afirmar que a soma das raízes é igual a quanto ?
Solução. Pelas Equações de Girard, temos que o produto das raízes é igual a 0, pois o
coeficiente constante não aparece na expressão de f (x) = x3 + ax2 + bx. Assim, uma das
raízes é x = 0 e como as outras estão em progressão aritmética, então vamos dizer que as
raízes são 0, r e 2r. Como a soma dos coeficientes é igual a 10, então 1 + a + b = 10, ou
ainda, a + b = 9. Além disso, usando novamente Girard, temos que −a = 0 + r + 2r e

196
Polinômios e Equações Polinomiais 34.1. Definições Básicas

b = 0 · r + 0 · 2r + r · 2r, ou seja, a = −3r e b = 2r2 . Donde,

a + b = 9 =⇒ −3r + 2r2 − 9 = 0 =⇒ r = −3/2 ou r = 3

Veja que as raízes de f (x) são numeros não-negativos, então o único valor válido é r = 3,
assim, a soma das raízes é igual a 0 + r + 2r = 9.

Observação 34.1.I. Veja que não estamos nos restringindo a raízes reais, logo as Equações
de Girard também no caso mais geral, onde admitimos raízes complexas.

Suponha que um polinômio an xn + an−1 xn−1 + · · · + a1 x + a0 possa ser escrito como an (x −


r1 )(x − r2 ) · · · (x − rn ), onde r1 , . . . , rn são as raízes deste polinômio. Daí vem
Uma investigação interessante que podemos fazer sobre polinômios nasce de um questionamento
simples: Se conhecermos algumas informações sobre o seu comportamento, como seu grau e
alguns valores numéricos, então será possível encontrar sua expressão ? Essa questão ainda não
será totalmente respondida, mas mostraremos casos onde podemos sim encontrar as expressões
de polinômios.

Exemplo 34.1.7. Suponhamos que estamos à procura de um polinômio f (x) de grau 1


tal que f (4) = 4 e f (16) = 10. Assim, procuramos funções da forma f (x) = ax + b que
satisfaçam ao seguinte sistemas de equações lineares

4 = f (4) = 4a + b
10 = f (16) = 16a + b

Subtraindo a segunda da primeira linha nós obtemos

(16a + b) − (4a + b) = 10 − 4 =⇒ 12a = 6 =⇒ a = 1/2

Logo, substituindo este valor na primeira linha nos vem que

4a + b = 4 =⇒ 2 + b = 4 =⇒ b = 2
1
Portanto, o polinômo procurado é f (x) = x + 2.
2

Exemplo 34.1.8. Suponhamos que estamos à procura de um polinômio f (x) de grau 2 tal
que f (−1) = f (2) = 0 e f (0) = 2. Assim, procuramos funções da forma f (x) = ax2 + bx + c
que satisfaçam ao seguinte sistemas de equações lineares
  
· 2 + b · (−1) + c −

0 = f (−1) = a (−1) 
 a b + c = 0 a − b = 2

2
0 = f (2) = a · 2 + b · 2 + c =⇒ 4a + 2b + c = 0 =⇒ 2a + b = −1
  
 2
2 = f (0) = a · 0 + b · 0 + c

c=2

c=2

Somando as duas primeiras linhas nós obtemos

(a − b) + (2a + b) = 0 + 0 =⇒ 3a = −3 =⇒ a = −1.

Daí, substituindo este valor em a − b = 2 concluímos que b = 1. Portanto, o polinômio


procurado é f (x) = −x2 + x + 2.

197
Polinômios e Equações Polinomiais 34.2. Divisão de polinômios

Observação 34.1.II. Em geral, se conhecermos n + 1 valores de um polinômio de grau n


então, pelo método anterior, podemos determinar a sua expressão. Se mudarmos o grau e
mantivermos os mesmos valores numéricos, o polinômio procurado deixa de ser único, por
exemplo, os polinômios f (x) = 0, g(x) = (x − 2)(x − 5) e h(x) = (x − 2)(x − 5)(x − 8)
possuem graus distintos e são tais que se anulam para x = 2 e x = 5.

O matemático Joseph Louis Lagrange (1736-1813) foi capaz de desenvolver um método conhecido
por Interpolação de Lagrange, que é bastante simples para encontrar o polinômio de menor grau
que satisfaz P (a1 ) = b1 , P (a2 ) = b2 , . . . , P (an+1 ) = bn+1 , onde a1 , . . . , an+1 , b1 , . . . , bn+1 são
números reais conhecidos. Naturalmente, todos os a1 , . . . , an+1 são distintos. Este método parte
do fato do polinômio

(x − a1 )(x − a2 ) · · · (x − ai−1 )(x − ai+1 ) · · · (x − an+1 )


Li (x) =
(ai − a1 )(ai − a2 ) · · · (ai − ai−1 )(ai − ai+1 ) · · · (ai − an+1 )

possuir os números a1 , a2 , . . . , ai−1 , ai+1 , . . . , an+1 como seus zeros e ainda Li (ai ) = 1. Assim, o
Polinômio Interpolador de Lagrange é dado por

P (x) = b1 L1 (x) + b2 L2 (x) + · · · + bn+1 Ln+1 (x).

Exemplo 34.1.9. Vejamos o Polinômio Interpolador de Lagrange que satisfaz P (−1) =


3, P (2) = 6 e P (4) = −2. Assim,

(x − 2)(x − 4) 1
L1 (x) = = (x − 2)(x − 4)
[(−1) − 2][(−1) − 4] 15
[x − (−1)](x − 4) 1
L2 (x) = = − (x + 1)(x − 4)
[2 − (−1)](2 − 4) 6
[x − (−1)](x − 2) 1
L3 (x) = = (x + 1)(x − 2)
[4 − (−1)](4 − 2) 10

Donde temos que o polinômio interpolador é dado por

P (x) = 3 · L1 (x) + 6 · L2 (x) + (−2) · L3 (x)


3 6 2
= (x − 2)(x − 4) − (x + 1)(x − 4) − (x + 1)(x − 2) = −x2 + 2x + 6
15 6 10

§34.2 Divisão de polinômios


Vamos considerar dois polinômios A(x) e B(x), onde B(x) é não nulo. Dividir o polinômio A(x) por
B(x) é o mesmo que encontrar os polinômios Q(x) e R(x) que satisfazem A(x) = B(x)D(x)+R(x)
e Grau(R) < Grau(Q) ou R(x) é o polinômio nulo. Assim como fazemos para números reais,
A(x) é o polinômio dividendo, B(x) é o polinômio divisor, Q(x) é o polinômio quociente e R(x) é
o polinômio resto. Quando temos que R(x) é o polinômio nulo, dizemos que A(x) é um divisível
por B(x).

§34.2.1 Método da Chave


Mostraremos o Método da Chave como uma forma prática de realizar a divisão de dois
polinômios. Faremos a divisão entre os polinômios A(x) = 8x3 + 4x2 + 1 e B(x) = 4x2 + 1.
Seguiremos as seguintes instruções:

198
Polinômios e Equações Polinomiais 34.2. Divisão de polinômios

(1◦ ) Escrevemos o polinômio dividendo e divisor seguindo a ordem decrescente das potências de
x, completando ou deixando em branco os termos de coeficientes zero.

8x3 + 4x2 + 1 4x2 + 1

(2◦ ) Dividimos o termo de maior grau de A(x) pelo termo de maior grau de B(x), obtendo
assim, 8x3 /4x2 = 2x como o primeiro termo do polinômio Q(x)

8x3 + 4x2 + 1 4x2 + 1


2x
(3◦ ) Multiplicando o termo encontrado, 2x, pelo divisor e subtraímos do dividendo o resultado
obtido, 8x3 + 2x, chegando ao resultado parcial 4x2 − 2x + 1.

8x3 + 4x2 + 1 4x2 + 1


− 8x 3 − 2x 2x

(4◦ ) Dividimos o termo de maior grau do resultado parcial pelo termo de maior grau do divisor,
assim encontramos 4x2 /4x2 = 1 como o próximo termo do quociente. Repetimos o mesmo
processo anterior para obtermos um novo resultado parcial.

8x3 + 4x2 + 1 4x2 + 1


− 8x3 − 2x 2x + 1
4x2 − 2x + 1
− 4x2 −1
− 2x

(5◦ ) A divisão termina quando o grau do resto é menor que o grau do divisor ou quando o resto
é zero. Nesse caso, ela termina agora e podemos verificar que os polinômios encontrados
Q(x) = 2x + 1 e R(x) = −2x são tais que A(x) = B(x) · Q(x) + R(x), ou seja,

8x3 + 4x2 + 1 = (4x2 + 1)(2x + 1) − 2x.

Exemplo 34.2.2. Vamos mostrar mais dois exemplos de divisão com chave e encorajamos o
leitor cuidadoso a verificar todos os passos para que este método se torne mais natural.

x3 + 3x2 + 5x + 6 x + 2 6x3 − 2x2 + x + 3 x2 − x + 1


− x3 − 2x2 x2 + x + 3 − 6x3 + 6x2 − 6x 6x + 4
x2 + 5x 4x2 − 5x + 3
− x2 − 2x − 4x2 + 4x − 4
3x + 6 −x−1
− 3x − 6
0

Neste primeiro caso temos que x3 + 3x2 + 5x + 6 é divisível por x + 2, ou seja, podemos
fatorar o polinômio dividendo como (x + 2)(x2 + x + 3).

199
Polinômios e Equações Polinomiais 34.2. Divisão de polinômios

Exemplo 34.2.3. Determine os valores de a e b para que o polinômio −x3 + 2x2 − ax + 2b


seja divisível por x2 − x + 1.
Pelo Método das Chaves temos,

− x3 + 2x2 − ax + 2b x2 − x + 1
x3 − x2 +x −x+1
x2 + (1 + −1a) x + 2b
− x2 +x −1
(2 + −1a) x + (−1 + 2b)
Assim queremos que o polinômio (2 − a)x + (2b − 1) seja igual ao polinômio nulo, assim,
pela igualdade de polinômios devemos ter 2 − a = 0 e 2b − 1 = 0, ou seja, a = 2 e b = 1/2.

Vamos agora nos restringir a divisão por polinômios da forma x − a. Fazendo uso do método
da chave vemos que o resto divisão de P (x) = 2x3 − 9x2 + 3x + 6 por x − 1 é igual a 2.

2x3 − 9x2 + 3x + 6 x − 1
− 2x3 + 2x2 2x2 − 7x − 4
− 7x2 + 3x
7x2 − 7x
− 4x + 6
4x − 4
2
Por outro lado, P (1) = 2 · 12 − 9 · 12 + 3 · 1 + 6 = 2 − 9 + 3 + 6 = 2, que é o mesmo valor do
resto encontrado! Talvez isso já fosse óbvio, pois na divisão de um polinômio P (x) por x − a o
polinômio resto tem que ser um polinômio de grau zero ou o polinômio nulo, em qualquer caso o
resto sempre será um número real que chamaremos de R. Pela igualdade P (x) = Q(x)(x − a) + R
ao substituir x = a encontramos P (a) = Q(x)(a − a) + R = R. O que prova o seguinte teorema

Teorema 34.1 (Teorema do Resto) – O resto da divisão de um polinômio P (x) por x − a é


igual a P (a).

E assim obtemos um corolário imediato desse teorema. De fato, se P (x) for divisível por x − a
então o resto da divisão entre eles é zero, mas pelo teorema esse é o valor de P (a), ou seja,
P (a) = 0.

Corolário 34.2 – O polinômio P (x) é divisível por x − a se, e somente se, a é raiz de P (x).

Exemplo 34.2.4. Vamos calcular o valor de c para que o polinômio x3 + 2x2 − (9c)x + 2c
seja divisível por x + 2. Pelo corolário, para que isso ocorra devemos ter −2 como uma das
raízes do polinômio dado, assim,

23 + 2 · 22 − (9c) · 2 + 2c = 0 =⇒ 8 + 8 − 18c + 2c = 0 =⇒ 16c = 16 =⇒ c = 1.

200
Polinômios e Equações Polinomiais 34.2. Divisão de polinômios

Observação 34.2.I. O Teorema do Resto e o seu corolário se estendem a encontrar o


resto da divisão por polinômios de grau 1 dados por ax + b. Com efeito, basta notar que
P (x) = Q(x)(ax + b) + R e aplicando x = −b/a temos R = P (−b/a). Assim, o resto da
divisão de um polinômio P (x) por ax + b é P (−b/a).

§34.2.5 Método de Briot-Ruffini


Já estudamos a divisão de um polinômio P (x) por x − a de dois modos diferentes. Agora vamos
mostrar um método para encontrar o quociente e o resto de uma forma rápida e prática para
esses casos de divisão. Faremos a divisão entre os polinômios A(x) = 2x3 − 4x + 1 e B(x) = x − 2
seguindo as seguintes instruções:

(1◦ ) Na primeira entrada colocamos a raiz de x − 2 e depois dispomos apenas os coeficientes do


polinômio 2x3 − 4x + 1 na ordem decrescente das potências de x.

2 2 0 −4 1

(2◦ ) Repetimos, na linha de baixo, o coeficiente de maior potência de x.

2 2 0 −4 1
2

(3◦ ) Multiplicamos a raiz de x − 2 por esse coeficiente e somamos com o próximo coeficiente do
dividendo, colocando o resultado 2 · 2 + 0 = 4 imediatamente abaixo

2 2 0 −4 1
2 4

(4◦ ) Multiplicamos o resultado que acabado de obter pela raiz de x − 2 e somamos o produto
obtido com o próximo coeficiente do dividendo, colocando o resultado 2 · 4 + (−4) = 4
imediatamente abaixo
2 2 0 −4 1
2 4 4

(5◦ ) Repetimos esse processo até o último coeficiente de P (x). O último resultado obtido é o
resto da divisão e todos os coeficientes anteriores são do polinômio quociente.

2 2 0 −4 1
2 4 4 9

Desse modo, 9 é o resto da divisão entre 2x3 − 4x + 1 e x − 2 e o polinômio quociente é


Q(x) = 2x2 + 4x + 4.

Exemplo 34.2.6. Vamos mostrar mais dois exemplos de divisão com chave e encorajamos o
leitor cuidadoso a verificar todos os passos para que este método se torne mais natural.

5 −3 2 −1 2 0 −1 −3 3 2 −4
−3 − 13 − 66 − 328 − 1640 − 8201 3 −7 17

201
Polinômios e Equações Polinomiais 34.2. Divisão de polinômios

8 1 −1 1 −2 −1 1 0 0 0 2 0 −3
1 7 57 454 1 −1 1 −1 3 −3 0

Observação 34.2.II. Note que podemos usar Briot-Ruffini para expressões da forma ax + b,
onde a raiz é −b/a, porém, temos que multiplicar o quociente obtido por 1/a. Pois, se Q(x)
e R são o quociente é o resto da divisão de P (x) por x + b/a, então vale
 
1 1
P (x) = Q(x)(x + b/a) + R = Q(x) · · a(x + b/a) + R = Q(x) (ax + b) + R.
a a

Podemos repetir o método de Briot-Ruffini para encontrarmos a divisão por polinômios da


forma (x − a)(x − b) se o polínômio for divisível por x − a. Neste caso, aplicamos o método
primeiramente para x − a e como o resto será zero, aplicamos novamente o método para x − b.

Exemplo 34.2.7. Por exemplo, vamos mostrar que x3 − 3x2 − 6x + 8 é divisível (x + 2)(x − 4).
−2 1 −3 −6 8
Assim, aplicando o método primeiro para x + 2 temos . Como o
1 −5 4 0
4 1 −5 4
resto foi zero, aplicamos ao quociente encontrado o método para x−4, assim, .
1 −1 0
Portanto, podemos afirmar que x3 − 3x2 − 6x + 8 = (x − 1)[(x + 2)(x − 4)]. Em particular,
encontramos todas as raízes deste polinômio.

Neste material, na maior parte dele, estamos trabalhando apenas com números reais. Porém,
existe o conjunto dos números complexos C = {a + bi | a, b ∈ R}, onde i é conhecida como unidade
imaginária e é raiz de z 2 + 1 = 0, ou seja, i2 = −1. Nesse novo mundo, existe um teorema
fantástico que faz parte da nossa teoria e não podemos deixa-lo de fora.

Teorema 34.3 (Teorema Fundamental da Álgebra) – Qualquer polinômio P (z) com coefici-
entes complexos e de grau não-nulo, possui alguma raiz complexa.

Toda a nossa teoria sobre divisão de polinômios funciona para números complexos, uma vez
que não nos foi necessário o fato de estarmos restritos a números reais. Assim, pelo Teorema do
Resto, sabemos que um polinômio P (z) de grau n pode ser expresso por (z − z1 )Q1 (z), onde z1 é
sua raiz e Q1 (z) é um polinômio de coeficientes complexos de grau n − 1. O mesmo argumento se
aplica a Q1 (z), logo P (z) = (z − z1 )(z − z2 )Q2 (z). Repetindo o mesmo processo uma quantidade
finita de vezes obtemos o seguinte resultado.

Corolário 34.4 – Qualquer polinômio de coeficientes complexos e grau n admite n raízes e


pode ser expresso por a(z − z1 )(z − z2 ) · · · (z − zn ), onde z1 , z2 , · · · zn são suas raízes.

§34.2.8 Multiplicidade de uma raiz


A partir do Teorema Fundamental da Álgebra, vemos que polinômios de grau n admitem n raízes
complexas, mas não necessariamente todas são distintas. Assim, nasce uma quantidade que está
relacionada com a raiz do polinômio e sua fatoração chamada multiplicidade de uma raiz.
Desse modo, uma raiz α do polinômio P (z) possui multiplicidade k se P (z) = (z − α)k Q(z) e

202
Polinômios e Equações Polinomiais 34.2. Divisão de polinômios

Q(α) ̸= 0. Por exemplo, o polinômio (x − 3)5 (x − 2)2 (x + 1) admite x = 3, x = 2 e x = −1 como


raízes de multiplicidade 5, 2 e 1, respectivamente.

Exemplo 34.2.9. Sabendo que o polinômio x4 + x3 − Ax2 − Bx − C admite x = −1 como


raiz de multiplicidade 3, determine os valores A, B e C.
Aplicando Briot-Ruffini três vezes para x = −1 temos

−1 1 1 −A −B −C
−1 1 0 −A A−B −A + B − C
−1 1 −1 1 − A 2A − B − 1
1 2 3−A

Logo, pelo Corolário do Teorema do Resto, devemos ter que P (x) é divisível por (x + 1)3
   
−A + B − C = 0
 C = −A + B
 C = B − A
 C = 2

2A − B − 1 = 0 =⇒ B = 2A − 1 =⇒ B=5 =⇒ B = 5
   
3−A=0 A=3 A=3 A=3
   

§34.2.10 Raízes Racionais

Teorema 34.5 (Teorema das Raízes Racionais) – Seja an xn + · · · + a1 x + a0 um polinômio


de coeficientes inteiros e p/q uma raiz racional, onde mdc(p, q) = 1, então p é divisor de a0 e
q é divisor de an .

Este teorema é bem útil para encontrarmos fatorações de polinômios que são de difícil manipu-
lação. Exibiremos no próximo exemplo este fato.

Exemplo 34.2.11. Resolver a equação x3 + 2x2 − 5x + 2 = 0.


Efetuando a pesquisa de raízes racionais, temos que os possíveis valores para p são
{−1, 1 − 2, 2} e os possíveis valores para q são {−1, 1}. Assim, p/q ∈ −1, 1, −2, 2 e veja que
substituindo x = 1 no polinômio dado vemos que esta é uma raiz. Por Briot-Ruffini, temos

1 1 2 −5 2
.
1 3 −2 0

Assim, x3 + 2x2 − 5x + 2 = (x − 1)x2 + 3x − 2 nos resta encontrar as raízes de x2 + 3x − 2,


mas essas são facilmente encontradas
√ e concluímos
√ que os valores de x ∈ R que satisfazem
−3 − 17 −3 − 17
x3 + 2x2 − 5x + 2 = 0 são 1, e .
2 2

203
Polinômios e Equações Polinomiais 34.3. Exercícios

§34.3 Exercícios
Exercícios Introdutórios
Exercício 34.1 (UFF - RJ). As raízes de um polinômio P (x) de grau 3 são r, s e t. Então, as raízes do
polinômio Q(x) = [P (x)]2 são:
(a) r2 , s2 , t2 (b) 2r, 2s, 2t (c) r, s, t (d) r/2, s/2, t/2 (e) r˘2, s˘2, t˘2

Exercício 34.2. O polinômio P (x), quando dividido por x2 + x + 1, fornece o quociente x + 1 e o resto
x˘1. O coeficiente do termo do primeiro grau no polinômio P (x) é igual a quanto ?
Exercício 34.3. Determine os valores de a, b e c para que tenhamos a igualdade entre os polinômios
(2a + b)x3 + (a − b)x2 + (b + c)x + c/2 − 3 e 4x3 − 10x2 + 2x − 6.
Exercício 34.4. Dados os polinômios F (x) = −3x3 + 2x2 + 2 e G(x) = x4 − x3 + x2 − x + 1, determine:
(a) F (x) + G(x) (b) F (x) − 3G(x) (c) F (x) · G(x) (d) G(x) + 3x · F (x)

Exercício 34.5. Sejam Q(x) e R(x) o resto da divisão de 2x4 + x3 − x2 + 2x − 1 por x3 − x2 + 1. Obtenha
o resto da divisão R(x) por Q(x).

Exercícios de Aprofundamento

Exercício 34.6. A equação x5 − 3x4 + cx3 + (3a + 8b)x2 + 3(ab + 6)x + a + 2b − 1 = 0 admite x = 1 como
raiz, zero como raiz de multiplicidade 2 e duas outras duas raízes reais. Determine a, b e c.
Exercício 34.7 (PUC - PR). Se o polinômio x4 + px2 + q é divisível pelo polinômio x2 − 6x + 5, então
p + q vale:
(a) −1 (b) 3 (c) 5 (d) −4 (e) 10
3
Exercício 34.8. A razão harmônica entre 3 números a, b e c é dada por H = . Desse modo,
1/a + 1/b + 1/c
a razão harmônica das três raízes reais do polinômio x3 − 3x2 − 60x + 100 é igual a quanto ?
1
Exercício 34.9 (IME – 2016). O polinômio x3 + ax2 + bx + c possui raízes reais r, −r e . Portanto, o
r
b
valor da soma b + c2 + ac + 2 é igual a quanto ?
c
Exercício 34.10 (IME - 2020). Um polinômio P (x) de grau maior que 3 quando dividido por x − 2, x − 3 e
x − 5 deixa restos 2, 3 e 5, respectivamente. O resto da divisão de P (x) por (x − 2)(x − 3)(x − 5) é:
(a) 1 (b) x (c) 30 (d) x − 1 (e) x − 30

Exercício 34.11 (ITA - 2015). Considere o polinômio p dado por p(x) = 2x3 + ax2 + bx − 16, com a, b ∈ R.
Sabendo-se que p admite raiz dupla e que 2 é uma raiz de p, então o valor de b − a é igual a:
(a) −36 (b) −12 (c) 6 (d) 12 (e) 24

Exercícios Avançados
Exercício 34.12. Considere o polinômio f (x) = x3 + px2 + qx + r, onde p, q, r ∈ R. Suponha que f (x)
possui 3 raízes reais.
(i) Mostre que se as raízes estão em Progressão Aritmética, então vale 2p3 + 27r = 9pq.
(ii) Mostre que se as raízes estão em Progressão Geométrica, então vale rp3 = q 3 .
Exercício 34.13 (Canadá). Seja f (x) um polinômio de grau n, tal que f (k) = k/(k + 1), para todo inteiro
0 ≤ n. Calcule f (n + 1) para todo inteiro positivo n.
Exercício 34.14 (Moldávia – 2000). Os números inteiros a, b e c satisfazem à relação a + b + c = 0. Mostre
que o número 2(a4 + b4 + c4 ) é um quadrado perfeito.
Exercício 34.15. Seja p(x) = xn + an−1 xn−1 + an−2 xn−2 + · · · + a1 x + a0 um polinômio de coeficientes
reais satisfazendo a2n−2 < 2an−2 . Mostre que p tem pelo menos duas raízes que são complexas não reais.

204
35 Função Exponenciais e Equações
Exponenciais
§35.1 Definições de Potenciação e Radiciação
dri

Definição 35.1. Considerando um número real a e um número inteiro n ≥ 1 chamamos de


potência de base a e expoente n ao número an = a
| · a{z· · · a} . Ou seja, podemos definir a potência
n fatores
an a partir da recorrência an = a · an−1 para todo inteiro n ≥ 2.

Veja que dessa definição temos que se n e m são inteiros maiores que 1 e a, b ∈ R, então

an+m = a | · a{z· · · a} · a
| · a{z· · · a} = a
n
| · a{z· · · a} = a · a
m

n+m fatores n fatores m fatores


n
(a · b) = (a · b) · · · (a · b) = a
| ·{z · · }b = an · bn
· · a} b| ·{z
| {z }
n fatores n fatores n fatores
n fatores n fatores
n m n n
· · a · · · a} = an·m
z }| { z }| {
(a ) | ·{z
=a · · a } = |a · · · a ·{z
m fatores m·n fatores

an am+(n−m) am · an−m
e se n ≥ m e a ̸= 0, então m = = = an−m . Vamos resumir essas
a am am
propriedades na seguinte proposição.

Proposição 35.1.1 – Se a e b são números reais não nulos e n, m são inteiros positivos então
valem:
(PI) an+m = an · am , (PIII) (an )m = an·m ,
an
(PII) (a · b)n = an · bn , (PIV) Se n ≥ m, então = an−m .
am

Observação 35.1.I. Estas propriedades devem ser demonstradas por indução, mas esse
nível de rigor não será necessário para o nosso estudo e as contas feitas anteriormente nos
dão uma boa noção das propriedades de potências inteiras positivas.

Exemplo 35.1.2. Por exemplo,

(−2)3 = (−2) · (−2) · (−2) = −8


 5 
1 5

3 1 243
= 3· = 35 · 5 =
2 2 2 32
E se a e b são reais não nulos, então vale
3 2
a4 · b3 · a2 · b = (a4 )3 · b9 · (a2 )2 · b2 = a12 · b9 · a4 · b2 = a16 · b11

205
35.1. Definições de Potenciação e Radiciação
Função Exponenciais e Equações Exponenciais

5 5
a4 · b3 a2 · a2 · b2 · b
 
5
= = a2 · b2 = (a2 )5 · (b2 )5 = a10 · b10
a2 · b a2 · b

Definição 35.2. Para todo número real a e inteiro positivo n definimos a−n como o inverso
1
multiplicativo de an , isto é, a−n = n .
a
Veja que a−n = a(−1)·n = (a−1 )n , assim, essa definição carrega as mesmas propriedades da
proposição Proposição 35.1.1, ou seja, as propriedades enunciadas lá são válidas para potências
inteiras negativas.

Exemplo 35.1.3. Por exemplo,


 −2
−3 1 1 3 1 1 4
(−2) = 3 = e − =  2 = = .
2 8 2 3 9 9
− 4
2

Além disso, se a e b são não nulos,

(a3 · b−2 )−2 a3·(−2) · b(−2)·(−2) a−6 · b4 (−6)−(−12) 4−9 6 −5 a6


= = = a · b = a · b = .
(a−4 · b3 )3 a(−4)·3 · b3·3 a−12 · b9 b5

Observação 35.1.II. Veja que para qualquer real a não nulo vale
an
a0 = an−n = an · a−n = = 1.
an
O que mostra que para qualquer real não nulo temos que a0 = 1. Note ainda que não
podemos assumir a = 0, uma vez que não podemos dividir por zero. Desse modo, 00 não é
um número definido.

Definição 35.3. Definimos a raiz n-ésima de a ≥ 0 pelo número b > 0 tal que bn = a e

indicaremos a raiz n-ésima de a por n a. Normalmente, o número a é chamado radicando e n é o
√ √
índice. Para n = 2, vamos denotar a ao invés de 2 a.

√ Veja que
√ segue√ da definição
√ ( n a)n = a para todo a ≥ 0. Como exemplo vamos expor
4 = 2, 3 8 = 2, 3 0 = 0 e 5 32 = 2.

Observação 35.1.III. √ Para não causar confusões ao leitor
√ vamos deixar
√ claro que√ 36 = 6
e não é verdade que 36 = ±6. Porém, as sentenças √ − 8 = −2, − 4p= −2 e ± 9 = ±3
3

são verdadeiras. Para não confundirmos, vamos por a2 = |a|, assim, (−4)2 = | − 4| = 4.

Definição
√ 35.4. Para p/q ∈ Q, vamos definir para todo a ≥ 0 a potência de expoente racional
ap/q = q ap .

Há algumas propriedades para raízes n-ésimas que vamos enunciar na proposição a seguir.

Proposição 35.1.4 – Sejam reais a, b ≥ 0 e os inteiros n, m, p ≥ 1, então valem:


√ √ √ √ m
(R-I) np amp = n am , (R-III) n am = ( n a) ,
√ √ √ p√ √
(R-II) n a · b = n a · n b, (R-IV) n m a = n·m a.

206
35.1. Definições de Potenciação e Radiciação
Função Exponenciais e Equações Exponenciais

Demonstração. Cada item é facilmente verificado. Para √ expor essas ideias vamos√demonstrar os
itens (R-I) e (R-II). Para o primeiro√item veja que pm apn = √ a pn/pm = an/m = m an . Já para o

√ n = (√ n = (√
segundo item, chamemos √ x = n
a · n
b, assim, x n
a · n
b) n
a)n · ( n b)n = a · b. Logo,
√ √
pela definição temos n a · b = x = n a · n b. Outros itens são deixados para verificação pelo
leitor.

Exemplo 35.1.5. Por exemplo,


√ √ √ √ √ √
8 = 23 = 22 · 2 = 22 · 2 = 2 2,

3

3
√3
√ √ √
27 = 26 · 2 = 26 · 2 = 22 · 2 = 4 2,
3 3 3

√ √ r r
3
4
12 4
4 12 3
4
12 2
8 √
12

12

12
√4
= √
12 3
= 3
= 3
= 28−3 = 25 = 32
2 2 2 2

Além disso, podemos agora simplificar algumas expressões algébricas como


√ √ √ √ √ √ √
q q q q
7 + 24 · 7 − 24 = (7 + 24)(7 − 24) = 72 − ( 24)2 = 49 − 24 = 25 = 5
√ √
11 11 7+ 5 11(7 + 5) 1 √
√ = √ · √ = √ = (7 + 5)
7− 5 7− 5 7+ 5 72 − ( 5)2 4

p √ √
Exemplo 35.1.6 (Radicais Internos). Mostre a igualdade 161 + 72 5 = 2 + 5.
4

p √ √
Solução. Veja que se a + b = x + y, ( então elevando ao quadrado nos vem que
√ √ a = x2 + y
a + b = (x2 + y) + 2x y. Assim, devemos ter √ √ . Elevando a segunda linha
b = 2x y
ao quadrado e substituindo a primeira segue que s √
2 2 a + a2 − b
b = 4x y = 4y(a − y) ⇐⇒ 4y − 4ay + b = 0 ⇐⇒ y =
2

a − a2 − b
Assim, substituindo em x2 = a − y obtemos x2 = a − y = ⇐⇒ x =
r √ r √ r √ 2
a − a2 − b p √ a + a2 − b a − a2 − b
. Portanto, a + b = + . Em particular,
2 2 2
temos que
s √ s √
√ 2 2 161 − 1612 − 5 · 722 √ √ √
q
161 + 161 − 5 · 72
161 + 72 5 = + = 81+ 80 = 9+4 5
2 2
r √ r √
p √ 9 + 92 − 5 · 42 9 − 92 − 5 · 42 √ √ √
E ainda, 9 + 4 5 = + = 4 + 5 = 2 + 5. Daí,
2 2
podemos afirmar que
rq
√ √ √ √
q q
4
161 + 72 5 = 161 − 72 5 = 9 + 4 5 = 2 + 5

Observação 35.1.IV. O aclamado matemático indiano Srinivāsa Rāmānujan foi capaz de


desenvolver várias identidades algébricas elegantes sobre radicais internos. Por exemplo,
em um dos seus problemas propostos à revista Journal of the Indian Mathematical Society
envolvia a seguinte identidade

207
Função Exponenciais e Equações Exponenciais 35.2. Funções Exponenciais

√ √ √ √ √ √
q q q
3 = 9 = 1 + 8 = 1 + 2 · 4 = 1 + 2 16 = 1 + 2 1 + 15 = 1 + 2 1 + 3 · 5
r r r
√ √ √
q q q
= 1 + 2 1 + 3 25 = 1 + 2 1 + 3 1 + 24 = 1 + 2 1 + 3 1 + 4 · 6 = · · ·

Podemos ainda definir potências de expoentes irracionais. Veja que podemos aproximar números
reais por números racionais, por exemplo, sabemos que 3, 3.1, 3.14, 3.141, 3.1415, 3.14159, . . . é
uma sequência de números racionais que se aproxima de π ≈ 3.14159265359 . . . Assim, podemos
definir 2π pelo número que é aproximado por

23 = 8
23.1 = 8.57418770029 . . .
23.14 = 8.81524092701 . . .
23.141 = 8.82135330455 . . .
23.1415 = 8.82441108248 . . .
23.14159 = 8.82496159506 . . .
23.141592 = 8.82497382906 . . .
.. ..
. .
2π = 8.82497782708 . . .

Como já temos as propriedades garantidas para números racionais, podemos estende-las para
números reais, ou seja, vale a seguinte proposição.

Proposição 35.1.7 – Considere os números reais a, b, c ∈ R onde a > 0, então valem:


(P-I) ab+c = ab · ac (P-III) (a · b)c = ac · bc

ab
(P-II) = ab−c (P-IV) (ab )c = ab·c
ac

Exemplo 35.1.8. Note que agora podemos manipular com números do tipo
√ √ √ √
3·2 3
· 2− 3
=3·2 3− 3
= 3 · 20 = 3
√ √ √ √ √ 2 2
(3 2−1 2+1
) = 3( 2−1)( 2+1) = 3( 2) −1 = 32−1 = 3

√ !−1/ 5 √ √
4 5 (4 5 )−1/ 5 4−1 4−1 4−1 1
√ = √ √ = √ = √ =
−2
= −2 · 4−1−(−2) = 22 · 4 = 16
8 20 (8 20 )−1/ 5 8− 4 (2 · 4)− 4 (2 · 4) 2

§35.2 Funções Exponenciais


Definição 35.5. Dado um número real a > 0 tal que a ̸= 1, chamamos de função exponencial de
base a a função f : R → R dada por f (x) = ax .
Usando a Proposição 35.1.7 nós temos que para qualquer função f (x) = ax satisfaz para
quaisquer x, y ∈ R
f (x + y) = ax+y = ax · ay = f (x) · f (y)
Disto segue que
x x  x   x  h  x i2
f (x) = f + =f ·f = f ≥0
2 2 2 2 2

208
Função Exponenciais e Equações Exponenciais 35.2. Funções Exponenciais

e veja que nenhuma função exponencial possui zeros pois se f (x0 ) = 0, então para qualquer x ∈ R
teremos
f (x) = f (x0 + (x − x0 )) = f (x0 ) · f (x − x0 ) = 0 · f (x − x0 ) = 0
ou seja, a função é constante igual a zero, o que não pode ocorrer. Desse modo, acabamos de a
proposição a seguir

Proposição 35.2.1 – Seja a > 0 e considere a função f (x) = ax . Assim, f é uma função
exponencial que não admite zeros e ainda f (x) é positivo para todo x ∈ R.

Exemplo 35.2.2 (O comportamento de uma função exponencial). Para ter uma ideia do
comportamento de uma função exponencial considere que você está na extremidade de uma
rua que mede 1 km. A cada hora você anda metade da distância que falta até a outra
extremidade. Assim, na primeira hora você anda 500 m, na segunda hora você anda 250 m,
na terceira 125 m e assim por diante. Como a cada hora você fica mais próximo da outra
extremidade, então você caminhará distâncias menores a cada vez que as horas aumentam.
Veja que este cenário é a representação da função f (t) = 1000(1/2)t , onde t representa as
horas passadas e f (t) o quanto que você precisa caminhar. Isto nada mais é que dizer que
esta é uma função decrescente !
Suponha que você é um organizador de uma festa e convidou dois amigos dizendo que
cada um deles podem levar outros dois amigos como convidados. Estes amigos convidaram 4
pessoas repetindo a mesma informação. Assim, Cada uma dessas 4 pessoas convidaram 2
outras pessoas e estas convidaram mais 2 e assim por diante. Ou seja, a quantidade de pessoas
dobra a cada convite feito, pois no começo existia apenas seus 2 amigos, depois 4, depois 8,
16, 32 etc. Observe que isto pode ser representado matematicamente pela função f (n) = 2n ,
onde n foi a quantidade de convites feitos e f (n) é a quantidade pessoas convidadas após n
convites. Pelo nosso argumento, vemos que essa é uma função crescente !

Podemos generalizar o argumento feito no Exemplo 35.2.2 para uma função f (x) = ax qualquer
dividindo em dois casos: a < 1 ou a > 1.

Proposição 35.2.3 – Considerando a função exponencial f (x) = ax . Podemos afirmar que:

a) Se a < 1, então f (x) = ax é decrescente;

b) Se a > 1, então f (x) = ax é crescente.

Note que a natureza da função exponencial se traduz em velocidade, então podemos esboçar o
gráfico de funções exponenciais facilmente.

209
Função Exponenciais e Equações Exponenciais 35.2. Funções Exponenciais

Vale ressaltar que os gráficos de funções exponenciais são todos parecidos, o que muda é apenas
a sua velocidade de crescimento ou decrescimento e isto está diretamente ligado com o número
que aparece na base da exponencial.

210
Função Exponenciais e Equações Exponenciais 35.2. Funções Exponenciais

§35.2.4 Equações Exponenciais


Podemos mostrar que funções exponenciais são injetivas sobre R e sobrejetivas em R+ isso é
bastante importante para resolvermos equações exponenciais. A ideia geral para resolvermos
esses tipos de equações é sempre tentarmos expressar a equação sobre uma mesma base, pois
assim teremos ab = ac ⇐⇒ b = c.

Exemplo 35.2.5. Para resolvermos 8x = 1/32 basta notar que 1/32 = 32−1 = (25 )−1 = 2−5
e 8x = (23 )x = 23x , assim, a equação se torna 23x = 2−5 . Desse modo, temos que 3x = −5 e
portanto a única solução da equação dada é x = −5/3.
√ √ √
De um modo parecido podemos resolver a equação 5x−2 · 252x−5 − 53x−2 = 0. De
x 2x

fato, Note que


√ √
x

2x x−2 2x−5 3x−2
5x−2 · 252x−5 = 53x−2 ⇐⇒ 5 2 · (52 ) x = 5 2x
x−2 2x−5 3x−2
⇐⇒ 5 2 +2· x = 5 2x
x−2 2x − 5 3x − 2
⇐⇒ +2· =
2 x 2x
⇐⇒ x2 + 3x − 18 = 0

Desse modo, as soluções procuradas são x = 3 e x = −6.

Exemplo 35.2.6. Após um longo estudo de 2023, foi descoberto que a população da cidade
de Maçapiraca é dada pela função exponencial f (t) = 1000 · 20.2t , onde t denota quantos
anos se passaram desde o início do estudo.

(i) Qual a quantidade da população em 2023 de Maçapiraca ?

(ii) Haverá quantas pessoas nesta cidade após 10 anos ?

(iii) Após quantos anos a população será de 64000 pessoas ?

Solução : (i) Ora, a população inicial desse estudo é dada quando decorrem 0 anos, logo,
a quantidade procurada é f (0) = 1000 · 20.2·0 = 1000 · 20 = 1000.

(ii) Após 10 anos teremos uma população de f (10) = 1000 · 20.2·10 = 1000 · 22 = 4000
habitantes.

(iii) Veja que basta encontrarmos a solução da equação f (t) = 64000, ou seja,

1000 · 20.2t = 64000 =⇒ 20.2t = 26 =⇒ 0.2t = 6 =⇒ t = 30

Exemplo 35.2.7. Há outros truques algébricos que podemos usar para resolvermos equações
exponenciais. Uma destas é a substituição. Vejamos algumas aplicações desta técnica.
Aplicação 1 — A única solução da equação 4x + 4 · 2x = 5 é x = 0.

Veja que 4x = (2x )2 , assim a equação se transforma em (2x )2 + 4 · 2x = 5 o que nos indica
a considerarmos a substituição y = 2x . Veja que agora temos y 2 + 4y = 5, onde as solução
são y = 1 ou y = −5. Mas relembre que não podemos ter imagens negativas em funções

211
Função Exponenciais e Equações Exponenciais 35.2. Funções Exponenciais

exponenciais, então 2x = −5 não possui soluções. Já de 2x = 1 obtemos x = 0, uma vez que


1 = 20 .
√ √
Aplicação 2 — A única solução da equação 25 x + 124 · 5 x = 125 é x = 9.
√ √ √
Ora, 25 x = (5 x )2 e isto nos induz a considerar y = 5 x . Desse modo, a equação inicial
se transforma em y 2 − 124y = 125. Usando Bhaskara, podemos encontrar √ y = −1 ou y = 125.

Novamente, excluiremos a opção y = −1. Já de y = 125 nós obtemos 5 x = 53 , logo x = 3,
ou seja, x = 9.

Exemplo 35.2.8. Podemos ainda resolver sistemas de equações exponenciais. Considere o


sistema dado por 
2x · 4y = 1
2
7x+y = 1

Na primeira linha temos 2x · 4y = 2−1 , ou ainda, 2x+2y = 2−1 e assim x + 2y = −1. Já na


segunda linha temos 7x+y = 70 , assim, x + y = 0. Juntando essas informações encontramos o
seguinte sistema de equações (
x + 2y = −1
x+y =0
Subtraindo a primeira da segunda linha nós temos y = −1 e substuindo isto em x + y = 0
concluímos que x = 1.

212
Função Exponenciais e Equações Exponenciais 35.3. Exercícios

§35.3 Exercícios
Exercícios Introdutórios
2 · (1/3)−1 − 22
Exercício 35.1. Se a = (1/4)−2 + (1/3)−2 e b = , determine o valor de ab .
(1/2)−2
Exercício 35.2. Simplifique:
2n+4 − 2 · 2n
s√ s √
i) 2+ 3 2− 3
2 · 2n+3 iii) √ + √
2− 3 2+ 3
√ √
√ √ 2+ 3 2− 3
iv) √ √ +√ √
p p
ii) 7+ 24 · 7− 24
p p
2+ 2+ 3 2− 2− 3

Exercício 35.3. Os técnicos de um laboratório observaram que uma população de certo tipo de bactérias
cresce segundo a função B(t) = 109 · 43t , com t sendo medido em horas. Qual o tempo necessário para
que ocorra uma reprodução de 6.4 · 1010 bactérias?
Exercício 35.4 (FUVEST-SP-Modificada). Seja f (x) = 22x+1 . Se a e b são tais que f (a) = 4f (b), pode-se
afirmar que a − b é igual a quanto ?
2
−7x+5
Exercício 35.5. Determine a quantidade de soluções da equação 32x = 1.

Exercícios de Aprofundamento
Exercício 35.6. Resolva as seguintes equações exponenciais:
i) 23x−1 = 32 2
vii) 4x +4x = 224
ii) 74x+3 = 49 √ x+1
√ √
6
2x+5 viii) 8x−1 · 42x−3 = 25x+3
iii) 11 =1
p√ √
iv) 73x+4 = 492x−3 ix)
x−1 3
23x−1 −
3x−7
8x−3
√ √
v) ( 2)3x−1 = ( 3 16)2x−1
√3
3x+2 · 9x 812x
vi) 82x+1 = 4x−1 x) 5x+1
= 3−4x
243 27
Exercício 35.7. Resolva a equacão 4x + 6x = 2 · 9x .
Exercício 35.8. Determine a soma dos valores de x que satisfazem a equação 25x − 24 · 5x − 25 = 0.
Exercício 35.9. Sejam a, b e c números reais positivos tais que ab = 343, bc = 10 e ac = 7. Quanto vale bb ?
q √ √ √
Exercício 35.10. Mostre que 3 9( 3 2 − 1) = 1 − 3 2 + 3 4.

Exercícios Avançados
0.2x+0.5 √
Exercício 35.11 (EsPCEx 2022). Ao resolver a equação = 3 5 · 0.04x−2 , encontra-se um valor de
5
x compreendido entre
(a) 1 e 2 (b) 2 e 3 (c) 3 e 4 (d) 4 e 5 (e) 5 e 6
144x + 324x 6
Exercício 35.12 (IME-2023). Seja a equação = . A soma dos módulos das soluções reais
64x + 729x 7
desta equação é
(a) 1 (b) 2 (c) 3 (d) 8 (e) 9

Exercício

35.13

(ITA-2013-Modificada).

A soma de todos os valores de x que satisfazem a equação
8 x+1 + 44(2 x+1 ) + 64 = 19(4 x+1 ) é igual a quanto ?

213
36 Logaritmos
§36.1 Definição de Logaritmo
Definição 36.1. Dados a ̸= 1 e b números reais positivos, chamamos de llogaritmo de b na
base a o número x = loga (b) tal que ax = b.

Veja que com o nosso conhecimento sobre funções exponenciais éramos capazes de resolver
equações como 3x = 9 ou 49y = 7 e o método para resolução era apenas fazer manipulações para
deixarmos ambos os lados da igualdade com a mesma base. Agora, com o logaritmo em mãos
somos capazes de dizer, por exemplo, que a solução de 3x = 2 é x = log2 (3), mas infelizmente
não conseguimos ainda dizer quanto esse número vale.

Exemplo 36.1.1. Vamos calcular alguns valores de logaritmos.


• 62 = 36 ⇐⇒ log6 (36) = 2 • 3−2 = 1/9 ⇐⇒ log3 (1/9) = −2

• 20230 = 1 ⇐⇒ log2023 (1) = 0 • ( 3 12)3 = 12 ⇐⇒ log √
3
12 (12) = 3

Para √ exibir um exemplo um pouco mais complicado, podemos encontrar o valor √ de


log1/8 (( 2) ) usando apenas a definição de logaritmo. Lembre que se x = log1/8 (( 2)3 ),
3

então temos
 x  x
1 √ 3 1 3 1
= ( 2) =⇒ 3
= 23/2 =⇒ 2−3x = 23/2 =⇒ −3x = =⇒ x = −
8 2 2 2

Portanto, acabamos de mostrar que log1/8 (( 2)3 ) = −1/2.

Exemplo 36.1.2 (Não se assuste com o logaritmo!). Vamos calcular quanto vale
 2023
2log3 (5) − 5log3 (2) .

Chamemos de x = log3 (5) e y = log3 (2), assim usando a definição nos vem que 3x = 5 e
3y = 2. Veja que se elevarmos a primeira igualdade por y e a segunda por x obtemos a
seguinte relação
5log3 (2) = 5y = (3x )y = 3xy = (3y )x = 2x = 2log3 (5) .
2023
Portanto, segue que 2log3 (5) − 5log3 (2) = 0.

§36.2 Propriedades dos Logaritmos


Note que pela definição e nossos conhecimentos sobre funções exponenciais podemos deduzir
algumas propriedades básicas sobre os logaritmos.

214
Logaritmos 36.2. Propriedades dos Logaritmos

Proposição 36.2.1 – Suponha que a ̸= 1, b e c são um números reais positivos. Então valem:
(a) loga (1) = 0; (b) loga (a) = 1; (c) aloga b = b;

(d) loga (b · c) = loga (b) + loga (c); (e) loga (b/c) = loga (b) − loga (c);

(f) Se k ∈ R, então loga (bk ) = k · loga (b).


1
(g) Se k ∈ R − {0}, então log(ak ) (b) = loga (b).
k

Demonstração. (a) Observe que x = loga 1 é o mesmo que ax = 1 = a0 , assim, x = 0.

(b) Se y = loga (a), então ay = a = a1 , ou seja, y = 1.

(c) Isto é imediato da definição pois z = loga (b) é justamente o número que é solução da
equação az = b.

(d) Escrevendo x = loga (b) e y = loga (c) temos que ax = b e ay = c, então bc = ax · ay = ax+y .
Por outro lado, a solução da equação ax+y = bc é o logaritmo x + y = loga (bc). Portanto,
acabamos de mostrar que

loga (bc) = x + y = loga (b) + loga (c).

(e) Pelo item anterior veja que temos

loga (b) = loga ((b/c)c) = loga (b/c) + loga (c) =⇒ loga (b/c) = loga (b) − loga (c).

(f) Sejam x = loga (b) e y = loga (bk ). Assim, por definição, ax = b e ay = bk . Elevando a
primeira das igualdades por k temos que axk = bk = ay , o que implica que xk = y. Portanto,
loga (bk ) = k · loga (b).

(g) Deixamos a prova deste item para o leitor cuidadoso.

Observação 36.2.I. As propriedades citadas na Proposição 36.2.1 são a alma dos logaritmos.
Essas propriedades foram o impulso para a definição de logaritmo feita pelo inglês John Napier
e o suíço Joost Bürgi no início do século XVII. Elas nos permitem simplificar e transformar
cálculos exponenciais em operações mais simples, tornando-se ferramentas essenciais em
problemas complexos. Isso é extremamente útil em situações onde precisamos lidar com
números muito grandes ou muito pequenos, como em cálculos envolvendo crescimento
exponencial, taxas de decaimento ou magnitude de grandezas físicas.

Exemplo 36.2.2. A tabela de logaritmos é uma ferramenta histórica que foi amplamente
utilizada antes do advento das calculadoras e computadores para facilitar cálculos envolvendo
logaritmos. Ela consiste em uma tabela que relaciona os valores dos logaritmos de diferentes
números em uma determinada base.
Suponhamos que em um tábua encontramos que log1 0(2, 023) = 0, 3059. Assim, para
determinarmos log10 (2023) vejamos que

log10 (2023) = log10 (2, 023 · 1000) = log10 (2, 203) + log10 (1000)
= log10 (2, 203) + log10 (103 ) = 0, 3059 + 3 log10 (10) = 3, 3059

215
Logaritmos 36.2. Propriedades dos Logaritmos

Exemplo 36.2.3 (Não se assuste com o logaritmo! - Parte 2). Calcule

2019log2019 (2020)·log2020 (2021)·log2021 (2022)·log2022 (2023) .

Chamemos a expressão a ser calculada de N e note que pela Proposição 36.2.1 temos que
2019log2019 (2020) = 2020, 2020log2020 (2021) = 2021, 2021log2021 (2022) = 2022 e 2022log2022 (2023) =
2023. Assim,

N = 2019log2019 (2020)·log2020 (2021)·log2021 (2022)·log2022 (2023)


 log2020 (2021)·log2021 (2022)·log2022 (2023)
= 2019log2019 (2020)
= 2020log2020 (2021)·log2021 (2022)·log2022 (2023)
 log2021 (2022)·log2022 (2023)
= 2020log2020 (2021)
 log2022 (2023)
= 2021log2021 (2022)·log2022 (2023) = 2021log2021 (2022)
= 2022log2022 (2023) = 2023

Proposição 36.2.4 (Mudança de Base) – Sejam a, b e c números reais positivos tais que a e c
são diferentes de 1. Então vale
logc (b)
loga (b) = .
logc (a)

Demonstração. Como sempre, escrevemos x = loga (b), y = logc (b) e z = logc (a). Pela definição
de logaritmo temos as igualdades ax = b, cy = b e cz = a. Por sua vez, as duas primeiras nos
mostra que ax = cy e assim

logc (b)
cy = ax = (a)x = (cz )x = cxz =⇒ y = xz =⇒ loga (b) = .
logc (a)

Observação 36.2.II. A mudança de base nos da uma demonstração do último item da


Proposição 36.2.1. De fato,
loga b loga b 1
logak b = k
= = loga b.
loga a k loga a k

Exemplo 36.2.5. Vamos voltar a expressão calculada no Exemplo 36.2.3. Veja que
M = log2019 (2020) · log2020 (2021) · log2021 (2022) · log2022 (2023) pode ser simplificada usando
a mudança de base já que

M = log2019 (2020) · log2020 (2021) · log2021 (2022) · log2022 (2023)


log2019 (2021)
= log2019 (2020) · · log2021 (2022) · log2022 (2023)
log2019 (2020)

216
Logaritmos 36.3. Equações Logarítmicas

log2019 2022
M = log2019 (2021) · · log2022 (2023)
log2019 (2021)
log2019 (2023)
= log2019 (2022) · = log2019 (2023)
log2019 (2022)

Portanto, podemos afirmar que 2019M = 2019log2019 (2023) = 2023.

§36.3 Equações Logarítmicas

Exemplo 36.3.1. Podemos nos perguntar para quais valores de x ∈ R temos log4 (x + 1) = 2.
Pela definição temos que x + 1 = 42 , ou seja, x = 15. De modo similar, podemos encontrar a
solução de logy 64 = 2, pois pela definição devemos ter y > 0 e ainda 64 = y 2 , logo y = 8.

Exemplo 36.3.2. Encontre o valor de x ∈ R tal que (log10 x)2 − 5 log10 x + 4 = 0.

Podemos fazer a substituição y = log10 x para nossa equação se tornar y 2 − 5y + 4 = 0.


Desse modo, as únicas soluções são y = 1 e y = 4, ou seja, log10 x = 1 e log10 x = 4. Usando
a definição de logaritmo vemos que as soluções para esse problema são x = 10 e x = 10000.

Exemplo 36.3.3. Podemos ainda resolver equações exponenciais como 22x − 7 · 2x + 12 = 0.


Pois a substituição y = 2x nos leva a equação y 2 − 7y + 12 = 0 cuja as soluções são y = 3
e y = 4. Mas isso nos diz que 2x = 3 e 2x = 4, ou seja, as soluções são x = log2 3 e
x = log 24 = 2.

217
Logaritmos 36.4. Exercícios

§36.4 Exercícios
Exercícios Introdutórios
Exercício 36.1. Determine o valor dos logaritmos abaixo:
a) log2 (32) c) log2 (1/2) e) log2 (0, 5) + log10 (25)

b) log5 (125) d) log10 (log3 (log10 1000)) f) log1/5 25 + log7 (4925 / 7)

Exercício 36.2. Se A = log7 7, B = log76 1, C = log0,5 8 e D = log8 8−2 , determine B A + CD.


Exercício 36.3. Sabendo que log10 2 ≈ 0, 3 e log10 5 ≈ 0, 7, determine o valor aproximado de:

a) log10 (5/2) b) log10 (20) c) log2 5

Exercício 36.4. Seja a = log10 8. Mostre que vale log 5 = 1 − a/3. [Dica: Note que 10/2 = 5.]
Exercício 36.5. Se A = log1/5 (16) · log16 (1/5) e B = 1/ log25 (5), determine:
a) A + B b) A/B c) B A d) (B − A)/33

Exercício 36.6. Determine o valor da expressão logb x · logx y · logy k. Para k = 128 e b = 2 qual sera este
resultado ?

Exercícios de Aprofundamento
Exercício 36.7. Sendo que log3 4 = a e log2 5 = b, determine, em função de a e b, o valor de log3 5.
log10 (log10 a)
Exercício 36.8. Sejam a > 0 e b = . Simplifique a expressão ab .
log10 (a)
Exercício 36.9. Determine o valor de x ∈ R nas equações abaixo.
a) log3 x = log3 8 c) log0,03 x = −3
b) log4 (8x ) = log2 (64) d) log5 (x) · logx2 −6 (5) = 1

Exercício 36.10. Resolva as equações.


(a) log21 (x + 2) + log21 (x + 6) = 1
(b) log2 (x − 2) − log2 (2x − 7) = 1 − log2 (x − 3)
Exercício 36.11. Resolva a equação log10 (x2 ) = (log10 x)2
Exercício 36.12. Resolva o sistemas abaixo.
( (
log10 (x) + log10 y = log10 2 x + y 2 = 50
(a) (c)
x2 + y 2 = 5 logy x = 2
( (
3x+y = 729 log2 (x + y) − log3 (x − y) = 1
(b) (d)
log10 x + log10 y = log10 8 x2 − y 2 = 2

Exercício 36.13. Sejam a e b números reais satisfazendo a2 + b2 = 7ab. Mostre que


 
a+b 1
log10 = (log10 a + log10 b) .
3 2

Exercício 36.14. Resolva a equação


q √ √ √
log√5 x logx (5 5) + log√5 (5 5) = − 6.

Exercício 36.15. Se a = log10 (x − 1/x) e b = log10 (x2 + 1/x2 + 1). Calcule log10 (x3 − 1/x3 ) em função de
a e b.

218
37 Matrizes
As matrizes são um conceito fundamental na matemática e possuem uma grande importância
em diversas áreas do conhecimento, como a física, a engenharia, a economia, a estatística e a
computação, entre outras.
As matrizes também são amplamente utilizadas na área da computação, especialmente em
programação. Elas são fundamentais para a representação de imagens, para a resolução de sistemas
de equações lineares e para a criação de algoritmos de processamento de dados. Além disso, as
matrizes são frequentemente utilizadas em aprendizado de máquina e inteligência artificial, como
uma forma de representar dados complexos de forma mais simples e eficiente.
Definição 37.1. Chamamos uma matriz de ordem m × n qualquer tabela de m · n elementos
dispostas em m linhas e n colunas. Em geral, escrevemos a matriz M de ordem m × n como
 
a11 a12 a13 · · · a1n
 a21 a22 a23 · · · a2n 
M = . .. .. . .. 
 
 .. . . . . . 
an1 an2 an3 · · · ann
Podemos ainda escrever resumidamente M = [aij ], onde aij é o elemento da linha i e coluna j.
Como exemplos de matrizes temos
   
  1 2 3 π
1 3 −5
D = eπ 
 
A= , B = 4 5 6 , C = 2023 2022 2021 1×3
, .
0 2 3 2×3 e
7 8 9 3×3 π 3×1
harafterx 1

Exemplo 37.0.1. Vamos encontrar a matriz M = [aij ] de ordem 2 × 3, onde


(
i + j, se i ≥ j
aij = .
i − j, se i < j
 
a11 a12 a13
Vejamos que esta matriz é da forma M = . Assim, usando a condição
a21 a22 a23
dada temos    
1+1 1−2 1−3 2 −1 −2
M= =
2+1 2+2 2−3 3 4 −1

Definição 37.2. Dizemos que as matrizes A = [aij ] e B = [bij ] são iguais, quando estas possuem
a mesma ordem e ainda vale aij = bij para qualquer que seja o par (i, j).

Exemplo 37.0.2. Podemos procurar se existem valores para x e y tais que


   
2x 3y x+1 2y
= .
3 4 3 y+4

Pela igualdade entre matrizes devemos ter as entradas de mesma posições iguais, assim,
obtemos as equações 2x = x + 1, 3y = 2y e 4 = y + 4. Veja que de 4 = y + 4 segue que y = 0
e a mesma conclusão podemos obter da equação 3y = 2y. Já de 2x = x + 1 nós obtemos

219
Matrizes 37.1. Operações com matrizes

x = 1. Assim, pondo x = 1 e y = 0 obtemos a igualdade procurada.

§37.1 Operações com matrizes


Definição 37.3. Dadas as matrizes A = [aij ] e B = [bij ] de mesma ordem, definimos a soma
desta matrizes por A + B = [aij + bij ]. Além disso, se c é um número real, definimos cA = [c · aij ].
Portanto, a soma de duas matrizes é obtida ao somarmos as entradas de mesma posição de cada
uma dessas matrizes e o produto de uma matriz por um número real é apenas a matriz cuja as
todas as entradas foram multiplicadas por esse número.

  
1 2 5 6
Exemplo 37.1.1. (i) Considerando as matrizes e , podemos calcular sua
3 4 7 8
soma do seguinte modo
       
1 2 5 6 1+5 2+6 6 8
+ = =
3 4 7 8 3+7 4+8 10 12
   
2 5 1 5 10 1
(ii) Se A = eB= , então a matriz 4A + B é calculada do seguinte
−4 6 2 −2 −7 2
modo
       
2 5 1 5 10 4·2 4·5 1/2 · 5 1/2 · 10
4 + = +
−4 6 2 −2 −7 4 · (−4) 4 · 6 1/2 · (−2) 1/2 · (−7)
     
8 20 5/2 5 21/2 25
= + =
−16 24 −1 −7/2 −17 55/2

Definição 37.4. Dadas as matrizes A = [aij ]m×n e B = [bij ]n×p , podemos definir a matriz
produto AB, pela matriz C = [cij ]m×p tal que
n
X
cij = ai1 · b1j + ai2 · b2j + ai3 · b3j + · · · + an1 · bnj = aik · bkj .
k=1

Em outras palavras, estamos definindo o elemento da linha i e coluna j da matriz produto AB


como a soma de todos os produtos dos termos correspondentes da linha i de A com a coluna j de B.

Apesar da definição ser pouco intuitiva, a multiplicação de matrize satisfaz algumas propriedades
que já estamos acostumados e vamos expor estas na seguinte proposição.

Proposição 37.1.2 – Se as matrizes A, B e C possuem ordens tais que as operações de soma


e multiplicação estejam definidas, então valem:

(i) A(BC) = (AB)C

(ii) A(B + C) = AB + AC

(iii) (A + B)C = AC + BC

220
Matrizes 37.1. Operações com matrizes

Exemplo 37.1.3. Vamos considerar as matrizes


 
  7 8
1 2 3
A= e B =  9 10 .
4 5 6
11 12

Como A é uma matriz 2 × 3 e B é uma matriz 3 × 2, então podemos calcular a matriz


produto AB e esta será de ordem 2 × 2. Escrevemos por simplicidade AB = [cij ]2×2 , onde
cij é o elemento da linha i e coluna j. Para determinar, por exemplo, a entrada de linha
1 e coluna 1 de AB vamos multiplicar as entradas correspondentes da primeira linha de A
pela primeira coluna de B, assim, c11 = 1 · 7 + 2 · 9 + 3 · 11 = 58. Já para encontrarmos
c12 vamos multiplicar a primeira linha de A com a segunda coluna de B, assim, obtemos
c12 = 1 · 8 + 2 · 10 + 3 · 12 = 64. Já para as demais entradas temos

c21 = 4 · 7 + 5 · 9 + 6 · 11 = 139
c22 = 4 · 8 + 5 · 10 + 6 · 12 = 154

Portanto, a matriz resultante AB é


   
1 · 7 + 2 · 9 + 3 · 11 1 · 8 + 2 · 10 + 3 · 12 58 64
AB = =
4 · 7 + 5 · 9 + 6 · 11 4 · 8 + 5 · 10 + 6 · 12 139 154

Exemplo 37.1.4. A multiplicação de matrizes, em geral, não é comutativa, ou seja, o


produto de duas matrizes depende da ordem em que elas são multiplicadas, assim, podemos
ter AB e BA sendo duas matrizes diferentes. Isto talvez seja claro quando BA talvez nem
faça sentido para ser calculada ou que possua uma ordem diferente. Por exemplo, se A
possui ordem 2 × 3 e B é de ordem 3 × 4, então AB é possível de ser calculada mas BA
não, pois suas ordens são incompatíveis. Mesmo quando as matrizes AB e BA existam e
são do mesmo tamanho
 é possível
 que tenhamos AB diferente de BA. De fato, considere as
1 2 5 6
matrizes A = eB= , assim,
3 4 7 8
      
1 2 5 6 1·5+2·7 1·6+2·8 19 22
AB = = =
3 4 7 8 3·5+4·7 3·6+4·8 43 50
e       
5 6 1 2 5·1+6·3 5·2+6·4 23 34
BA = = =
7 8 3 4 7·1+8·3 7·2+8·4 31 46

Definição 37.5. Chamamos a matriz de ordem m × n cujas as entradas são todas nulas de
matriz nula ou matriz zero e denotaremos esta por 0. Caso seja necessário enfatizar sua ordem,
podemos escrever 0m×n .
Observe que a matriz nula desempenha o mesmo papel do número zero quando estamos
considerando a operação de soma, pois A + 0 = 0 + A = A para qualquer que seja a matriz A.

Exemplo 37.1.5. Existem várias curiosidades e peculiaridades sobre o produto de matrizes


e vamos agora mostrar duas dessas. Considerando o produto de matrizes
      
4 2 3 −4 4 · 3 + 2 · (−6) 4 · (−4) + 2 · 8 0 0
= =
2 1 −6 8 2 · 3 + 1 · (−6) 2 · (−4) + 1 · 8 0 0

221
Matrizes 37.2. A relação de matrizes com sistemas lineares

observamos que nenhuma das matrizes operadas é a matriz nula e mesmo assim o seu
produto é a matriz nula. A outra curiosidade que mostraremos é que a igualdade AB = AC
não implica
  B = C. Recomendamos
   ao leitor cuidadoso que
 aoconsiderar as matrizes
0 1 1 1 2 5 3 4
A= ,B = eC= conclua AB = AC = .
0 2 3 4 3 4 6 8

Definição 37.6. Dada a matriz A = [aij ] de ordem m × n, consideremos a matriz AT = [bij ]


de ordem n × m cujo os elementos são dados por bij = aji . Chamamos a matriz AT de matriz
transposta de A. Quando ocorre A = AT , dizemos que A é uma matriz simétrica e quando
AT = −A dizemos que A é uma matriz anti-simétrica.

Exemplo 37.1.6. Vamos expor alguns exemplos de matrizes e suas matrizes transpostas.
   
1 2 3 1 0 3
(i) A matriz transposta da matriz 0 −1 −2 é a matriz 2 −1 4.
3 4 5 3 −2 5
 
  1 0
1 2 3 4 2 1
(ii) A matriz transposta da matriz é a matriz 
3 2.

0 1 2 3
4 3
 
6 2
(iii) Observe que a transposta de é ela mesma, assim esta é um exemplo de matriz
2 3
simétrica.
     
1 −6 1 6 1 −6
(iv) Já a transposta de é a matriz =− , logo esta é um exemplo
6 20 −6 20 6 20
de matriz anti-simétrica.

Proposição 37.1.7 – Considerando as matrizes A e B e λ um número real, valem:

(i) (AT )T = A (iii) (λA)T = λAT

(ii) (A + B)T = AT + B T (iv) (AB)T = B T AT

§37.2 A relação de matrizes com sistemas lineares


(
1, se i = j
Definição 37.7. Vamos definir a matriz quadrada I = [δij ] onde δij = , esta matriz
0, se i ̸= j
é conhecida como matriz identidade. Caso seja necessário enfatizar seu tamanho escrevemos
In . Alguns exemplos são
 
  1 0 0 0
  1 0 0
  1 0 0 1 0 0
I1 = 1 , I2 = , I3 = 0 1 0 , I4 =  0 0 1 0 , . . .

0 1
0 0 1
0 0 0 1

A matriz identidade tem um papel importante no produto entre matrizes, pois é um elemento

222
Matrizes 37.2. A relação de matrizes com sistemas lineares

neutro da multiplicação de matrizes. Vejamos isso considerando uma matriz A = [aij ]3×2 .
     
a11 a12   a11 · 1 + a12 · 0 a11 · 0 + a12 · 1 a11 a12
1 0
AI2 = a21 a22  = a21 · 1 + a22 · 0 a21 · 0 + a22 · 1 = a21 a22  = A
0 1
a31 a32 a31 · 1 + a32 · 0 a31 · 0 + a32 · 1 a31 a32

e por outro lado,


      
1 0 0 a11 a12 1 · a11 + 0 · a21 + 0 · a31 1 · a12 + 0 · a22 + 0 · a22 a11 a12
I3 A = 0 1 0 a21 a22  = 0 · a11 + 1 · a21 + 0 · a31 0 · a12 + 1 · a22 + 0 · a22  = a21 a22  = A
0 0 1 a31 a32 0 · a11 + 0 · a21 + 1 · a31 0 · a12 + 0 · a22 + 1 · a22 a31 a32

Essa propriedade pode sempre ser verificada, assim, se A é uma matriz de ordem m × n, então
vale
AIn = A = Im A.

     
7 1 x 15
Exemplo 37.2.1. Considere as matrizes A = ,x = eb= e suponha que
13 2 y 28
valha equação matricial Ax = b. Usando a definição de multiplicação de matrizes temos que
    
7 1 x 7x + y
Ax = = .
13 2 y 13x + 2y

Observe que a equação Ax = b, por igualdade de matrizes, se torna um sistema linear pois
    (
7x + y 15 7x + y = 15
Ax = b ⇐⇒ = ⇐⇒ .
13x + 2y 28 13x + 2y = 28

Este sistema é facilmente resolvido substituindo y = 15 − 7x na segunda equação, mas


usaremos nossa teoria de matrizes para apresentar
 um novo método para resolver este
2 −1
problema. Vamos agora introduzir a matriz M = . Vejamos que
−13 7
      
2 −1 7 1 2 · 7 + (−1) · 13 2 · 1 + (−1) · 2 1 0
MA = = = = I.
−13 7 13 2 −13 · 7 + 7 · 13 −13 · 1 + 7 · 2 0 1

Desse modo, ao multiplicarmos pela esquerda a equação matricial Ax = b por M temos

Ax = b =⇒ M Ax = M b =⇒ Ix = Bb =⇒ x = M b.
   
2 · 15 + (−1) · 28 2
Portanto a solução, desta equação é x = Bb = = , ou seja, as soluções
−13 · 15 + 7 · 28 1
desse sistema linear são x = 2 e y = 1.

Utilizando as ideias expostas no Exemplo 37.2.1 podemos generalizar o argumento para mostrar
que qualquer sistema linear pode ser expresso como uma equação matricial, ou seja,


a11 x1 + a12 x2 + · · · + a1n xn = b1
    


 a11 a12 ··· a1n x1 b1
a21 x1 + a22 x2 + · · · + a2n xn = b2  a21 a22 ··· a2n   x2   b2 

.. ⇐⇒  .. .. .. ..   ..  =  .. 
    


 .  . . . .  .   . 
am1 am2 · · · amn xn bm

am1 x1 + am2 x2 + · · · + amn xn = bm

223
Matrizes 37.2. A relação de matrizes com sistemas lineares

Definição 37.8. Seja A uma matriz quadrada, se existir uma outra matriz B de mesma ordem
tal que AB = BA = I, então diremos que A é uma matriz invertível e que B é a matriz
inversa de A. Neste caso, normalmente denotamos B = A−1 . Caso não exista uma matriz com
essa propriedade, diremos que A é uma matriz singular ou matriz não invertível.

Supondo que a matriz inversa de A exista, então esta é única. De fato, se B e C são inversas
de A, então
B = BI = B(AC) = (BA)C = IC = C.
Observe que a técnica mostrada no Exemplo 37.2.1 para resolver equação Ax = b nada mais
era que multiplicar esta igualdade pela esquerda pela matriz inversa de A. Veja que quando existe
a inversa de A a equação Ax = b é facilmente resolvida pois nesse caso temos,

Ax = b ⇐⇒ A−1 Ax = A−1 b ⇐⇒ Ix = A−1 b ⇐⇒ x = A−1 b

Neste momento ainda não é tão claro quais são as condições para que exista inversa de uma
matriz, mas vamos continuar nossos estudos procurando jeitos para calcular esta matriz.

Exemplo 37.2.2. No caso de procurarmos a inversa  de uma matriz 2x2 as contas são
5 4
relativamente curtas, por exemplo, considerando podemos procurar a sua matriz
6 5
    
5 4 x y 1 0
inversa buscando valores para x, y, z e w para que tenhamos = e isto
6 5 z w 0 1
se reduz a um sistema linear de 4 equações



 5x + 4z = 1

5y + 4w = 0


 6x + 5z = 0

6y + 5w = 1

Multiplicando a segunda linha por −6, a ultima por 5 e somando estas equações obtemos

(−6)·(5y +4w)+5·(6y +5w) = (−6)·0+5·1 ⇐⇒ −30y −24w +30y +25w = 5 ⇐⇒ w = 5

Usando que w = 5 na segunda linha obtemos 5y = −20, ou seja, y = −4. Multiplicando a


primeira linha por −6, a quarta por 5 e somando estas equações obtemos

(−6)·(5x+4z)+5·(6x+5z) = (−6)·1+5·0 ⇐⇒ −30x−24z +30x+25z = −6 ⇐⇒ z = −6

Usando que z = −6 na quarta linha nos vem que x = 5. Portanto, acabamos de mostrar que
 −1  
5 4 5 −6
=
6 5 −4 5

Observação 37.2.I. De um modo mais geral, podemos  adaptar os passos feitos no Exemplo
a b
37.2.2 para mostrar que existe inversa da matriz se, e somente se, ad − bc =
̸ 0 e ainda
c d
 −1  
a b 1 d −b
= .
c d ad − bc −c a

224
Matrizes 37.3. Método para encontrar A−1

 
2 6
Exemplo 37.2.3. Podemos verificar que a matriz A = satisfaz a equação A2 −
4 11
13A − 2I = 0. Vejamos que esta equação pode ser reescrita como

A2 − 13A − 2I = 0 ⇐⇒ A2 − 13A = 2I ⇐⇒ A(A − 13I) = 2I ⇐⇒ (A − 13I)A = 2I

1
Então podemos dizer que A−1 = (A − 13I)
2

§37.3 Método para encontrar A−1


Vamos definir três operações elementares com as linhas de uma matriz A.

1. Multiplicar uma linha por uma constante c não nula.

2. Trocar duas linhas entre si.

3. Somar a uma linha uma outra multiplicada por uma constante c não nula.

Podemos dizer que as matrizes A e B são equivalentes por linhas se uma delas pode ser obtida
a partir da outra por meio de sequências de operações elementares com linhas.
Para fixar notações considere o seguinte exemplo. Considerando a matriz identidade I2 ,
multiplicando a segunda linha de I2 por −3 obtemos
   
1 0 (−3)L2 →L2 1 0
−−−−−→
0 1 0 −3

Exemplo 37.3.1. Considere a identidade I3 e a matriz que


 é resultado após somarmos

1 0 0 1 0 2 3
3 vezes a primeira linha na terceira, ou seja, B = 0 1
 0. Seja A = 2 −1 3 6 e
3 0 1 1 4 4 0
assim     
1 0 0 1 0 2 3 1 0 2 3
BA = 0 1 0 2 −1 3 6 = 2 −1 3 6 .
3 0 1 1 4 4 0 4 4 10 9
Note que esta última matriz é precisamente a matriz obtida ao somarmos 3 vezes a primeira
linha de A na terceira linha de A.

Vamos assumir um resultado sobre matrizes invertíveis que mostraremos na próxima proposição.

Proposição 37.3.2 – Se A é uma matriz quadrada, então as seguintes afirmações são


equivalentes:

(a) A é invertível.

(b) A única solução de Ax = 0 é x = 0.

(c) A matriz A é equivalente a matriz identidade.

(d) A matriz A é o produto de matrizes elementares.

225
Matrizes 37.4. Classificação de sistemas lineares

Exemplo 37.3.3. Estas operações são suficientes para encontrarmos a matriz inversa de
A, pois podemos considerar a matriz [A | I] de ordem n × 2n e vamos efetuar operações
elementares com as linhas desta matriz aumentada de modo que o lado se transforma em I,
assim, o lado direito se transforma em A−1 .  
2 1 1
Desse modo, para encontrarmos a inversa da matriz A = 1 1 1 faremos os seguintes
1 1 2
passos
   
2 1 1 1 0 0 1
L →L1
1 1/2 1/2 1/2 0 0
 1 1 1 0 1 0 − 2 1
−−−−→  1 1 1 0 1 0 
1 1 2 0 0 1 1 1 2 0 0 1
   
1 1/2 1/2 1/2 0 0 1 1/2 1/2 1/2 0 0
L2 −L1 →L2 L3 −L1 →L3
−−−−−→  0 1/2 1/2 −1/2 1 0  − −−−−→  0 1/2 1/2 −1/2 1 0 
1 1 2 0 0 1 0 1/2 3/2 −1/2 0 1
   
1 1/2 1/2 1/2 0 0 L − 1 L →L 1 1/2 1/2 1/2 0 0
2L2 →L2 3 2 2 3
−−− −−→  0 1 1 −1 2 0  −−− −−→  0 1 1 −1 2 0 
0 1/2 3/2 −1/2 0 1 0 0 1 0 −1 1
   
L1 − 12 L3 →L1
1 1/2 1/2 1/2 0 0 L1 − 21 L3 →L1
1 1/2 0 1/2 1/2 −1/2
−−−−−→  0 1 0 −1 3 −1  −−−−−→  0 1 0 −1 3 −1 
0 0 1 0 −1 1 0 0 1 0 −1 1
 
L1 − 12 L2 →L1
1 0 0 1 −1 0
−−−−−→  0 1 0 −1 3 −1 
0 0 1 0 −1 1
 
1 −1 0
Portanto, a matriz inversa de A é dada por A−1 = −1 3 −1.
0 −1 1

O processo descrito no exemplo Exemplo 37.3.3 é conhecido como Método de Gauss-Jordan.

Exemplo 37.3.4. Este método


  também serve para mostrar quando uma matriz não é
1 3
invertível. Considere A = . Assim,
2 6
   
1 3 1 0 L2 −2L1 →L2 1 3 1 0
−−−−−→
2 6 0 1 0 0 −2 1

Então como a matriz A é equivalente a uma matriz que possui uma linha nula, logo, A não é
invertível.

§37.4 Classificação de sistemas lineares


Já sabemos que um sistema linear pode ser escrito como uma equação matricial da forma Ax = b
que envolve produto de matrizes, agora vamos considerar a matriz [A | b], onde A é a matriz dos
coeficientes e b é coluna das igualdades do sistema linear, ou seja,

226
Matrizes 37.4. Classificação de sistemas lineares


a11 x1 + a12 x2 + · · · + a1n xn = b1
 


 a11 a12 ··· a1n b1
a21 x1 + a22 x2 + · · · + a2n xn = b2 a21 a22 ··· a2n b2 
 
.. =⇒  .. .. .. ..
 
. . . .



 .  
am1 am2 · · · amn bm

am1 x1 + am2 x2 + · · · + amn xn = bm

Chamamos essa matriz [A | b] de matriz aumentada do sistema Ax = b. Nos exemplos


anteriores, lidamos com sistemas lineares que possuíam solução única. No entanto, existem outros
casos a serem considerados, nos quais o sistema pode ter infinitas soluções ou até mesmo não ter
solução. Abordaremos esses outros casos nos exemplos a seguir.


x − 2y − z = 1

Exemplo 37.4.1. Podemos procurar uma solução para o sistema 2x + y − 3z = 0 vendo

x − 7y = 3

que isto é equivalente a usar apenas operações elementares na matriz aumentada
 
1 −2 −1 1
 2 1 −3 0  .
1 −7 0 3

Desse modo,
     
1 −2 −1 1 1 −2 −1 1 1 −2 −1 1
L2 −2L1 →L2 L3 −L1 →L3
 2 1 −3 0  −−−−−→  0 5 −1 −2  −−−−−→  0 5 −1 −2 
1 −7 0 3 1 −7 0 3 0 −5 1 2
   
1 −2 −1 1 1
L →L
1 −2 −1 1
L3 +L2 →L3 5 2 2
−−−−−→  0 5 −1 −2  − −−−−→  0 1 −1/5 −2/5 
0 0 0 0 0 0 0 0
 
1 0 −7/5 1/5
L1 +2L2 →L2
−−−−−→  0 1 −1/5 −2/5 
0 0 0 0

7 1 1 2
Isto significa que x − z = e y − z = − , ou seja, para qualquer z real temos que
5 5 5 5
1 + 7z z−2
x= ey= são as soluções do sistema considerado. Então neste caso temos
5 5
infinitas soluções e dizemos que z é uma variável livre, pois qualquer que seja o valor de z as
soluções do sistema são dadas pelas tripla [(1 + 7z)/5, (z − 2)/5, z].


3x + 2y + 2z = −1

Exemplo 37.4.2. Considerando o sistema 2x − y − z = −3 , vamos fazer operações

x+y+z =1

elementares com as linhas da matriz aumentada para tentar encontrar soluções deste sistema
linear. Desse modo,
     
3 2 2 −1 1 1 1 1 1 1 1 1
↔L3 2 −2L1 →L2
 2 −1 −1 −3  −L −1−−−→  2 −1 −1 −3  L− −−−−→ 0 −3 −3 −5 
1 1 1 1 3 2 2 −1 3 2 2 −1

227
Matrizes 37.4. Classificação de sistemas lineares

   
1 1 1 1 1 1 1 1
L3 −3L1 →L2 L2 −3L3 →L2
−−−−−→  0 −3 −3 −5  − −−−−→  0 0 0 7 
0 −1 −1 −4 0 −1 −1 −4

Vejamos que a segunda linha da última matriz aumentada nos diz que 0x + 0y + 0z = 7, o
que é um absurso. Portanto, este sistema não possui solução.

Veja que nos dois últimos exemplos encontramos exemplos de sistemas lineares cuja as matrizes
dos coeficientes não possuem inversa, mas em um dos casos o sistema admite infinita soluções e
no outro não possui.
Observe ainda que em todos os casos estamos usando operações elementares para obter um
sistema linear que é mais simples de ser resolvido e estamos fazendo isso forçando alguns coeficientes
do sistema serem iguais a zeros. O nome dado a esse processo é escalonamento de matrizes ou
sistemas lineares. Visualmente este processo deixa a matriz aumentada com uma “escada” de
valores não nulos, como por exemplo,
∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗
     
 0 ∗ ∗ ∗ ∗ ∗ ∗   0 ∗ ∗ ∗ ∗ ∗ ∗   0 ∗ ∗ ∗ ∗ ∗ ∗ 
     
 0 0 ∗ ∗ ∗ ∗ ∗   0 0 ∗ ∗ ∗ ∗ ∗   0 0 ∗ ∗ ∗ ∗ ∗ 
, ,
 0 0 0 ∗ ∗ ∗ ∗ ,
   
 0 0 0 ∗ ∗ ∗ ∗   0 0 0 ∗ ∗ ∗ ∗ 
     
 0 0 0 0 ∗ ∗ ∗   0 0 0 0 0 0 0   0 0 0 0 0 0 ∗ 
0 0 0 0 0 ∗ ∗ 0 0 0 0 0 0 0 0 0 0 0 0 0 0

onde ∗ representa uma entrada não-nula. Na verdade, os exemplos de matrizes aumentadas


nos exemplos anteriores são os únicos casos possíveis após um escalonamento de um sistema.
No primeiro caso, nós conseguimos resolver a última equação. Substituindo este resultado na
linha a cima encontramos a solução da penúltima linha e repetindo esse processo conseguimos
resolver o sistema todo, ou seja, ele possui solução única e assim dizemos que o sistema é um
Sistema Possível e Determinado (SPD).
No segundo caso, nós obtemos um sistema equivalente que possui mais variáveis do que equações
e assim aparecem variáveis livres, ou seja, encontramos soluções que vão depender dessas variáveis
e portanto obtemos infinitas soluções. Quando isto ocorre, chamamos o sistema de um Sistema
Possível Indeterminado (SPI).
Já no terceiro caso obtemos uma linha que é uma contradição matemática, pois um lado de
uma das linhas é igual a zero enquanto que o outro é um número não nulo. Daí o sistema não
possui soluções e dizemos que este é um Sistema Impossível (SI).

(
4x + (m + 1)y = 0
Exemplo 37.4.3. Vejamos como classificar o sistema conforme o
(m − 1)x + 2y = 0
parâmetro m. Note que a matriz aumentada é equivalente a
 

4
 m−1
m + 1 0 L2 − 4 L1 →L2  4 m + 1 0
−−−−−→ 9 − m2 
m−1 2 0 0 0
4

Assim, se m2 − 9 ̸= 0 temos que o sistema é SPD pois nesse caso teríamos y = 0 e substituindo
na primeira equação nos vem que x = 0. Porém se m2 − 9 = 0, ou seja, se m = 3 ou m = −3
nós temos que a segunda linha é toda nula e portanto obtemos y como uma variável livre,
nesse caso temos que o sistema é SPI.

228
Matrizes 37.4. Classificação de sistemas lineares

Exemplo 37.4.4. Para quais valores de a e b temos que o sistema



x + y + z = 0

x − y + az = 2

2x + y − z = b

pode ser classificado como:

(i) Sistema Possível Determinado, (iii) Sistema Impossível.


(ii) Sistema Possível Indeterminado,

Realizando as operações L2 − L1 → L2 , L3 − 2L1 → L3 e L3 − 12 L2 → L3 obtemos o


sistema 
x + y + z = 0


−2y + (a − 1)z = 2 .
 −a − 5 z = b − 1


2
Assim, se a ̸= −5 então podemos resolver a última equação e para o valor encontrado para z
substituímos na segunda linha e encontramos o valor para y e portanto também podemos
encontrar o valor de x. Portanto o sistema é Sistema Possível Determinado se a ̸= −5.
Se a = −5 e b = 1 a última equação se torna totalmente nula e o nosso sistema passa a
ter mais variáveis do que equações, portanto neste caso temos um sistema Sistema Possível
Indeterminado.
Já se a = −5 e b ̸== 1 temos uma contradição na última linha, portanto o sistema é
classificado como Sistema Impossível.

229
Matrizes 37.5. Exercícios

§37.5 Exercícios
Exercícios Introdutórios
     
a 1 2 b 3 2
Exercício 37.1. Encontre valores para a, b, c e d de modo que tenhamos + = .
1 2 0 −1 c d
Exercício 37.2. Considere as matrizes
       
3 0   3 0 1 5 2 6 1 3
4 −1
A = −1 2 , B = , C = −1 2 , D = −1 0 1 , E = −1 1 2 .
0 2
1 1 1 1 3 2 4 4 1 3

Quando for possível, realize as operações a seguir:


i) D + E ii) DC − 2A iii) 2B − C iv) BC T + 2023B T B
 
x x−y 1
Exercício 37.3. Determine todos os valores de x e y para que a matriz A = y 2 4 seja simétrica.
1 2y + x 3
Exercício 37.4. Uma pessoa dispõe de 17 moedas, sendo algumas de um real, outras de cinquenta centavos
e outras de dez centavos. Ela percebe que, gastando todas as moedas de um real, fica com R$ 1, 50.
Percebe, por outro lado, que se gastar todas de dez centavos, fica com R$ 11, 00. De quantas moedas de
cada tipo a pessoa dispõe?
Exercício 37.5. Um par de tênis, duas bermudas e três camisas custam juntos R$ 100,00. Dois pares de
tênis, cinco bermudas e 8 camisetas custam juntas R$ 235,00. Quanto custam juntos um par de tênis,
uma bermuda e uma camiseta ?

Exercícios de Aprofundamento

(e + e−x )/2 (ex − e−x )/2


 x 
Exercício 37.6. Encontre a matriz inversa de .
(ex − e−x )/2 (ex + e−x )/2
 
1 2 0
Exercício 37.7. Seja A = 0 1 1. Mostre que (I − A)3 = 0 e use que (I − A)3 = I − 3A + 3A2 − A3
0 0 1
para encontrar a matriz inversa A−1 .
 
1 2
Exercício 37.8. Calcule a expressão A2 − 4A − 5I, onde A =
4 3
 
2 −1 1
Exercício 37.9. Dada a matriz A = 3 −2 1, calcule (I − A)(A2 − I).
0 0 1


 x + 3y + 5z + 7w = 12

3x + 5y + 7z + w = 0
Exercício 37.10. Resolva o sistema


 5x + 7y + z + 3w = 4
7x + y + 3z + 7w = 16

Exercícios Avançados
Exercício 37.11. Sejam A, B e P matrizes, onde P é invertível e satisfaz A = P −1 BP , mostre que
An = P −1 B n P para todo n natural.
Exercício 37.12. Se A é uma matriz quadrada tal que Ak = 0 para algum inteiro positivo k, então

(I − A)−1 = I + A + A2 + · · · + Ak−1 .
1
Exercício 37.13. Se A2 = λA, para algum λ ∈ R diferente de 1, então (A + I)−1 = I − A
1+λ

230
38 Determinantes
Agora estamos imersos num contexto que apenas existem matrizes e sistemas lineares. Vamos
introduzir o determinante de uma matriz como uma função que nos retorna um valor numérico
que pode ser visto como a área ou volume de certa região ou que ainda nos gera um novo método
para para resolver sistemas lineares.
Nós vamos começar a trabalhar com matrizes pequenas e como caso inicial que vamos considerar
são as matrizes 2 × 2.
   
a b a b
Definição 38.1. O determinante da matriz é definido como det = ad − bc. O
c d c d
determinante de uma matriz 1 × 1 é trivial, pois é definido como o valor dessa única entrada.

Exemplo 38.0.1. Como exemplos iniciais vamos considerar algumas matrizes simples.
   
1 2 1 0
• det = 1 · 4 − 2 · 3 = −2 • det = 1 · 0 − 32 · 0 = 0
3 4 32 0
   
5 7 2 4
• det = 5 · 2 − 7 · 4 = −4 • det =2·8−4·4=0
4 2 4 8

§38.1 Propriedades dos determinantes 2 × 2


Vamos resumir algumas propriedades importantes para o nosso estudo nas três proposições a
seguir.

Proposição 38.1.1 – Sejam λ ̸= 0 e a, b, c, d, a′ , b′ , c′ , d′ ∈ R números reais quaisquer. Valem


os seguintes itens:

(i) Para qualquer matriz A de ordem 2 × 2 temos que det A = det AT .


     
λa λb a b a b
(ii) det = det = λ det
c d λc λd c d

a + a′ b + b′
     ′ ′
a b a b
(iii) det = det + det
c d c d c d
     
a b a b a b
(iv) det = det + det ′ ′
c + c′ d + d′ c d c d

(v) Se trocarmos a ordem de duas linhas (ou colunas) de uma matriz seu determinante
muda de sinal.

Demonstração. (i) Este primeiro item decorre imediatamente da definição do determinante.


(ii) Para qualquer λ ̸= 0 temos que
   
λa λb a b
det = (λa)d − (λb)c = λ(ad − bc) = λ det
c d c d
As outras igualdades são verificadas da mesma maneira.

231
Determinantes 38.1. Propriedades dos determinantes 2 × 2

(iii) Uma conta direta nos mostra que

a + a′ b + b′
 
det = (a + a′ )d + (b + b′ )c = (ad + bc) + (a′ d + b′ c)
c d
   
a b a b
= det + det ′ ′
c d c d

(iv) A prova deste item é uma ligeira adaptação da prova do item anterior.
   
c d a b
(v) Basta ver que det = bc − ad = −(ad − bc) = − det
a b c d

Observação 38.1.I. Os itens (iii) e (iv) da Proposicao 38.1.1 não devem ser confundidos
com det(A + B) = det A + det B pois esta última igualdade é falsa! De fato,
 
2 0
det(I2 + I2 ) = det = 4 ̸= 2 = det(I2 ) + det(I2 )
0 2

Observação 38.1.II. Podemos usar ainda a Proposicao 38.1.1 para verificar que se temos
uma matriz 2 × 2 onde uma linhas (ou colunas)
 é múltiplada outra,
 então seu determinante
λa λb a b
é zero. De fato, basta observar que det = λ det = λ(ab − ab) = 0.
a b a b

Proposição 38.1.2 – Sejam λ =


̸ 0 e a, b, c, d ∈ R números reais quaisquer. Valem as seguintes
igualdades      
a + λc b + λd a b a b
det = det = det
c d c + λa d + λb c d

Demonstração. Fazendo uso da Proposicao 38.1.1 e Observação 38.1.II nós obtemos que
       
a + λc b + λd a b λc λd a b
det = det + det = det
c d c d c d c d

Observação 38.1.III. As proposições 38.1.2 e 38.1.1 nos mostra com o determinante é


alterado após operações elementares em uma matriz.

Proposição 38.1.3 – Para quaisquer matrizes A e B de ordem 2 × 2 temos que

det(AB) = det(A) det(B).

A prova desta proposicao não é nada além do que uma conta direta, então deixamos a cargo do
leitor.

232
Determinantes 38.2. Determinante visto como área

 n  
1 1 fn+1 fn
Exemplo 38.1.4. É possível mostrar através de indução que = para
1 0 fn fn−1
todo n ∈ N, onde {fn } é a sequência de Fibonnaci. Usando a Proposição 38.1.3 temos que
   n 
2 fn+1 fn 1 1
fn+1 fn−1 − (fn ) = det = det = (−1)n
fn fn−1 1 0

Esta é igualdade é conhecida como Identidade de Cassini e pode ser usada para encontrarmos
várias outras identidades envolvendo a sequência de Fibonacci.

§38.2 Determinante visto como área


Veja que essa definição de determinante não se parece nada intuitivo, então vamos dar uma
motivação geométrica para esse valor numérico.
Considere o paralelogramo formado pelos pontos (0, 0), (a, b), (c, d) e (a + c, b + d). Estamos
interessados em descobrir a área desta região. Faremos isso de um modo indireto, pois podemos
calcular de um modo mais simples a área de uma região exterior ao paralelogramo considerado.

Veja que na figura anterior o paralelogramo está dentro do retângulo de vértices (0, 0), (a +
c, 0), (a + c, a + d) e (b + d). Note que podemos particionar a área deste retângulo como a soma da
área do paralelogramo e a outra região que pode ser dividida em dois triângulos e dois trapézios.
Desse modo, área da região exterior ao paralelogramo e interior ao retângulo citado é dado
1 1 1 1 1
Área(exterior) = ab + (2b + d)c + cd + (a + 2c)b = [2ab + 4bc + 2cd] = ab + 2bc + cd
2 2 2 2 2
Daí a área do paralelogramo é dado por
Área(paralelogramo) = Área(retângulo) − Área(exterior)
= (a + c)(b + d) − (ab + 2bc + cd)
 
a b
= ad − bc = det
c d

Observação 38.2.I. Poderíamos definir a igualdade acima como a área orientada do


paralelogramo considerado, pois se mudarmos a ordem que consideramos os vértices encon-
tramos o valor da área com o sinal trocado. Caso não quisermos se preocupar com a ordem
considerada basta tomar a função módulo nesta última igualdade.

Então podemos concluir que apesar da definição genérica do determinante, ele carrega um
significado geométrico. Usando a intuição geométrica podemos explorar os resultados das três
proposições anteriores para entendermos geometricamente o que cada nos diz.

233
Determinantes 38.2. Determinante visto como área

Exemplo 38.2.1 (Área de um triângulo qualquer). Sabemos da Geometria Euclidiana que


uma diagonal do paralelogramo divide este quadrilátero em dois triângulos congruentes. Daí,
podemos calcular a área de qualquer triangulo com vértices (0, 0), (a, b) e (c, d), pois, este
será dado por  
1 a b
det .
2 c d
O uso da função modular nos permite a considerar qualquer ordem dos vértices e é mais
apropriada para memorização.
Para o caso de um triângulo qualquer de vértices P1 (x1 , y1 ), P2 (x2 , y2 ) e P3 (x3 , y3 ) vamos
considerar a translação da figura de modo que o vértice P3 se torne a origem. Isto ocorre
quando subtraímos x3 e y3 de cada uma das coordenadas dos demais vértices. Exemplo
38.2.2 temos os vértices P1 , P2 e P3 = P4 . Assim, temos que sua área é dada por
 
1 x − x3 x1 − x3
Área(P1 P2 P3 ) = det 1 .
2 x2 − x4 x2 − x4

Exemplo 38.2.2 (Área de um quadrilátero qualquer). Podemos nos perguntar como calcular
a área de um quadrilátero qualquer usando um determinante, porém não podemos fazer
isso diretamente por motivos bem simples. Primeiramente, veja que a área de qualquer
quadrilátero não pode ser calculada com a teoria que vimos até agora, pois ela nos permite
apenas a nos restringir ao paralelogramos com um dos vértices sendo a origem. Vamos então
encontrar a área de um quadrilátero sabendo as coordenadas de seus vértices.

Veja que se considerarmos um quadrilátero de vértices P1 (x1 , y1 ), P2 (x2 , y2 ), P3 (x3 , y3 ) e


P4 (x4 , y4 ), então podemos considerar uma ‘recorte’ deste quadrilátero pelo segmento entre os
vértices P1 e P3 . Para garantir que um dos vértices seja a origem, procedemos transladando
toda a figura de modo que o vértice P1 seja transformado na origem. Isso é alcançado
Juntando estas observações e a Proposição 38.1.1 podemos concluir que a área do quadrilá-
tero que estamos considerando é dado por
   
1 x2 − x1 y2 − y1 1 x3 − x1 y3 − y1
Área(P1 P2 P3 P4 ) = det + det
2 x 3 − x 1 y3 − y1 2 x4 − x1 y4 − y1
 
1 x − x3 y1 − y3
= det 1
2 x 2 − x 4 y2 − y4

Novamente quero levantar a atenção para a ordem que consideramos os vértices e esta
igualdade vale apenas nesta mesma ordem, caso contrário deve ser tomado a função modular.

234
Determinantes 38.3. Determinantes de ordens maiores

Exemplo 38.2.3. O método que mostramos nos Exemplos 38.2.2 e 38.2.1 talvez não funcione
para um polígono qualquer, então buscamos aqui um novo jeito para calcular a área de um
polígono onde conhecemos as coordenadas de cada um de seus vértices. Vamos usar o fato
1 a b
de det ser a área orientada do triângulo de vértices (0, 0), (a, b) e (c, d).
2 c d
Assim, encontrar a área de um triangulo
de vértices P1 (x1 , y1 ), P2 (x2 , y2 ) e P3 (x3 , y3 ),
onde esses vértices estão em ordem anti-
horária, é possível pois podemos considerar
os triângulos OP1 P2 , OP2 P3 e OP3 P1 e pela
Observação 38.2.I o primeiro desses triângu-
los possui área positiva (por este motivo, na
figura ao lado possuem arestas em vermelho
e outra em azul). Logo, a área de P1 P2 P3 é
dada por
     
1 x1 y1 1 x2 y2 1 x 3 y3
det + det + det
2 x2 y2 2 x3 y3 2 x 1 y1

Podemos adaptar esse argumento para qualquer polígono sem auto-interseções cujo os
pontos P1 (x1 , y1 ), . . . , P1 (xn , yn ) formam uma orientação anti-horária. Neste caso a área do
polígono P1 P2 · · · Pn é dada por
n  
1X xi yi
Área(P1 P2 · · · Pn ) = det
2 xi+1 yi+1
i=1

onde estamos considerando que xn+1 = x1 e yn+1 = y1 .

§38.3 Determinantes de ordens maiores


Definição 38.2. Se A for uma matriz quadrada, então o determinante menor da entrada aij
é denotado por Mij e definido como o determinante da submatriz que sobra quando excluímos a
i-ésima linha e a j-ésima coluna de A. O número Cij = (−1)i+j Mij é denominado cofator da
entrada aij .

Exemplo 38.3.1. Vamos considerar a matriz seguinte 3 × 3


 
2 4 1
A = −1
 0 3
5 −2 1

Para encontrar os cofatores das entradas da matriz, precisamos calcular o determinante de


cada matriz 2 × 2 formada pela exclusão da linha e coluna correspondentes à entrada em
questão.

• Para a entrada a11 = 2 temos que seu cofator é


 
1+1 2 0 3
C11 = (−1) M11 = (−1) det = 0 · 1 − 3 · (−2) = 6
−2 1

235
Determinantes 38.3. Determinantes de ordens maiores

• Para a entrada na posição (1, 2):


 
1+2 3 −1 3
C12 = (−1) M12 = (−1) · det = −(−1 · 1 − 3 · 5) = 16
5 1

• Para a entrada a13 = 1 que seu cofator é


 
1+1 2 −1 0
C13 = (−1) M11 = (−1) det = (−1) · (−2) − 0 · 5 = 2
5 −2

Podemos repetir o mesmo processo para as demais entradas da matriz que encontraremos

C11 = 6 C12 = 16 C13 = 2


C21 = −6 C22 = −3 C23 = 24
C31 = 12 C32 = −7 C33 = 4

Observação 38.3.I. Observe que o fator (−1)i+j no cofator Cij nos gera uma matriz com
uma sequência alternada de sinais de + e −, semelhante ao padrão de um tabuleiro de xadrez.
 
+ − + − + ···
− + − + − · · ·
 
+ − + − + · · ·
 
− + − + − · · ·
 
+ − + − + · · ·
.. .. .. .. .. . .
 
. . . . . .

Observação 38.3.II. Outra observação que podemos fazer é que o determinante menor
0 2 1
pode ser calculado de uma forma visual. Por exemplo, para a matriz 3 −1 2 temos que
4 0 1
as matrizes que geram os determinantes menores M11 , M23 e M32 são, respectivamente,
     
0 2 1 0 2 1 0 2 1
 3 −1 2   3 −1 2   3 −1 2 
4 0 1 4 0 1 4 0 1
Onde as linhas em vermelho representam a linha e coluna que foi suprimida em cada caso.

 
a11 a12
Motivação — Veja que para a matriz os cofatores são C11 = a22 , C12 =
a21 a22
−a21 , C21 = −a12 e C22 = a11 . Observe que
 
a b
det = a11 · C11 + a12 · C12 = a11 · C11 + a21 · C21
c d
= a21 · C21 + a22 · C22 = a12 · C12 + a22 · C22

Ou seja, o determinante de uma matriz 2 × 2 pode ser calculado como a soma dos produtos
entre as entradas da matriz e seus respectivos cofatores, utilizando uma mesma linha ou

236
Determinantes 38.3. Determinantes de ordens maiores

coluna fixada. A partir disso vamos definir o determinante de matrizes de ordens maiores
como a seguir.
Definição 38.3 (Expansão por Cofatores). Se A for uma matriz de tamanho n × n, então o
número obtido multiplicando as entradas de uma linha ou coluna qualquer de A pelos cofatores
correspondentes e somando os produtos assim obtidos é denominado determinante de A, será
denotado por det A. Cada uma dessas somas são denominadas expansões em cofatores de
det A, ou seja,
det A = ai1 · Ci1 + ai2 · Ci2 + ai3 · Ci3 + · · · + ain · Cin
= a1j · C1j + a2j · C2j + a3j · C3j + · · · + a1n · C1n
A primeira das igualdades acima é chamada de expansão em cofatores ao longo da linha
i e a segunda expansão em cofatores ao longo da coluna j. Note que disto temos que
det A = det AT .

Exemplo 38.3.2.
 No Exemplo
 38.3.1 mostramos que os cofatores da primeira linha da
2 4 1
matriz A = −1 0 3 são dados por C11 = 6, C12 = 16 e C13 = 2. Vamos primeiramente
5 −2 1
usar a primeira linha para calcularmos o determinante da matriz A. Assim, a expansão por
cofatores sobre esta linha nos mostra que

det A = 2 · C11 + 4 · C12 + 1 · C13 = 2 · 6 + 4 · (−16) + 1 · 2 = 78

Vamos agora usar a segunda coluna para calcularmos o mesmo determinante.

det A = 4 · C12 + 0 · C22 + (−2) · C32 = 4 · C12 + (−2) · C32


   
1+2 0 3 3+2 2 1
= 4 · (−1) det + (−2) · (−1) det = 78
−2 1 −1 3

Exemplo 38.3.3 (Regra de Sarrus). Sabemos que o determinante de uma matriz 2 × 2 é


nada mais que o produto de uma das diagonais subtraído do produto da outra e para matrizes
maiores definimos sendo a expansão por cofatores, mas será que existe algum método mais
simples para matrizes de ordem 3 × 3? Neste exemplo mostraremos a Regra de Sarrus, esta
regra nada mais é que uma outra forma para calcularmos determinantes de matrizes 3 × 3
e que se parece muito com a definição que demos para matrizes 2 × 2. Vamos dividir em
passos:
(i) Utilizando a expansão em cofatores pela primeira linha temos que
 
a b c      
e f d f d e
det d e f = a · det
  − b · det + c · det
h i g i g h
g h i

(ii) Continuando a conta do item anterior e arrumando a ordem dos termos nós obtemos
 
a b c
det d e f  = aei + bf g + cdh − gec − hf a − idb.
g h i

(iii) Escrevendo a matriz original e copie as duas primeiras colunas da matriz à direita da
3ª coluna, de modo que seja obtida uma tabela de 3 linhas e 5 colunas. Nessa nova
tabela, observe que os termos aei, bf g, cdh, gec, hf a e idb são os produtos de termos

237
Determinantes 38.3. Determinantes de ordens maiores

que aparecem em uma mesma diagonal e marque essas diagonais com setas apontando
para cima e outras apontando para baixo.

Portanto o determinante de uma matriz 3 × 3 pode ser calculado através da soma dos
produtos de cada uma das setas que apontam para baixo subtraído dos produtos das
setas que apontam para cima. Esta é a Regra de Sarrus e para alguns é a maneira
mais prática para calcular determinante de matrizes 3 × 3. Vale ainda observar que
esta regra não vale para matrizes quadradas de qualquer outra ordem.

Como aplicação desse regra, vejamos que

2 1 2 2 1 2 2 1
1 3 0 =⇒ 1 3 0 1 3
0 2 −1 0 2 −1 0 2

Então temos
 
2 1 2
det 1 3 0  = 2 · 3 · (−1) + 1 · 0 · 0 + 2 · 1 · 2 − 0 · 3 · 2 − 2 · 0 · 2 − (−1) · 1 · 1 = −1
0 2 −1

Observação 38.3.III. Por simplicidade, podemos representar o determinante de uma matriz


substituindo o termo det por duas barras verticais ao lado da matriz. Desse modo,
 
  ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗
∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗
det ∗ ∗ ∗ = ∗ ∗ ∗ , det  ∗ ∗ ∗ ∗ = ∗ ∗ ∗ ∗

∗ ∗ ∗ ∗ ∗ ∗
∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗

e assim por diante.

Exemplo 38.3.4. Infelizmente esta definição para calcular determinante não nos dá uma
forma rápida de realizarmos esse processo, mas podemos fazer uma escolha esperta de linha
ou coluna para que nossos cálculos sejam mais eficientes. Consideremos o seguinte exemplo e
calculamos o determinante usando a linha ou coluna que está representada na cor vermelha

−1 0 0 3 1 0
−1 0 0 1 0
2 3 1 −1 0 2
2 3 1 0 2
1 0 3 2 0 0
= 2 · C64 =2· 1 0 3 0 0 = 2 [(−1) · C11 + 1 · C14 ]
0 0 2 1 0 −1
0 0 2 0 −1
0 2 1 0 3 0
0 2 1 3 0
0 0 0 2 0 0
 
3 1 0 2 2 3 1 2
 0 3 0 0 1 0 3 0 
=2·
(−1) · 0 −1· 
2 0 −1 0 0 2 −1 
2 1 3 0 0 2 1 0

238
Determinantes 38.4. Propriedades dos determinantes n × n

−1 0 0 3 1 0
2 3 1 −1 0 2     
3 1 2 2 1 2 2 3 2
1 0 3 2 0 0
= 2 (−1) −3 0 3 0  − 1 2 1 3 0 − 1 1 0 0 
0 0 2 1 0 −1
0 2 −1 0 2 −1 0 0 −1
0 2 1 0 3 0
0 0 0 2 0 0
= 2 {(−1)[(−3) · (−9)] − 1[2 · (−1) − 1 · 3]} = −44

Vejamos que cada uma das vezes que fizemos as escolhas de uma linha ou coluna preferimos
aquelas que tem a maior quantidade de zeros, pois nesses casos não precisamos calcular seus
cofatores e isto é um jeito um pouco mais eficiente para calcularmos o determinante de uma
matriz grande.

Exemplo 38.3.5. Usando o Exemplo 38.2.3 sabemos que a área do triângulo de vértices
P1 (x1 , y1 ), P2 (x2 , y2 ) e P3 (x3 , y3 ), onde esses vértices estão em ordem anti-horária, é dada
por       
1 x y x y x y
det 1 1 + det 2 2 + det 3 3
2 x 2 y2 x 3 y3 x1 y1
Por outro lado, expandindo pela última coluna obtemos que
 
x1 y1 1       
1 1 x 2 y2 x1 y 1 x y1
det x2 y2 1 = det − det + det 1
2 2 x3 y3 x3 y3 x2 y2
x3 y3 1
      
1 x1 y1 x2 y2 x y3
= det + det + det 3 = Área(P1 P2 P3 )
2 x 2 y2 x3 y 3 x1 y1

§38.4 Propriedades dos determinantes n × n


Vamos agora estender as propriedades que tínhamos para os determinantes 2 × 2. Como o caso
inicial, vamos considerar matrizes 3 × 3 e vamos dividir em partes.

(i) Em geral, não é verdade que det(A + B) = det(A) + det(B) para quaisquer duas matrizes e
é fácil mostrar que não ocorre a igualdade com um exemplo simples. Por outro lado, usando
a expansão na primeira linha temos que

a + a′ b + b′ c + c′
 
     
′ e f ′ d f ′ d e
det  d e f  = (a + a ) det − (b + b ) det + (c + c ) det
h i g i g h
g h i
     
e f d f d e
= a det − b det + c det
h i g i g h
     
′ e f ′ d f ′ d e
+ a det − b det + c det
h i g i g h
   ′ ′ ′
a b c a b c
= det d e f + det d e f 
  
g h i g h i

239
Determinantes 38.4. Propriedades dos determinantes n × n

(ii) Usando a expansão na terceira linha


 
a b c      
b c a c a b
det a b c  = d det − e det + i det =0
b c a c a b
d e f

e usando a expansão na primeira linha para qualquer k ∈ R vale


   
ka kb kc       a b c
e f d f d e
det  d e f  = ka det − kb det + kc det = k · det d e f  .
h i g i g h
g h i g h i

(iii) Podemos juntar os itens (i) e (ii) para mostrar que temos
   
a + kd b + ke c + kf a b c
det  d e f  = det d e f 
g h i g h i

onde k ∈ R.

(iv) Utilizando os itens (i) e (ii) podemos explicar as igualdades a seguir


     
a+d b+e c+f a b c d e f
det a + d b + e c + f  = det a + d b + e c + f  + det a + d b + e c + f 
g h i g h i g h i
       
a b c a b c d e f d e f
= det a b c + det d e f  + det a b c  + det d e f  .
g h i g h i g h i g h i
   
d e f a b c
Portanto isto implica que det a b c  = − det d e f .
g h i g h i

Embora tenhamos focado na primeira linha em alguns itens, podemos repetir essa mesma conta
com outras linhas ou colunas e os passos serão os mesmos.

Exemplo 38.4.1. Vamos misturar as duas formas para calcular o determinante de uma
matriz 3 × 3 para mostrar uma
 identidade
 algébrica. Desse modo, sejam a, b e c números reais
a b c a b c a b
e considere a matriz M = c a b . Para usarmos Sarrus, vejamos que c a b c a
 
b c a b c a b c
nos mostra que det M = a + b + c − 3abc. Por outro lado, se somarmos todas as colunas
3 3 3

na primeira temos que

a+b+c b c 1 b c
det M = a + b + c a b = (a + b + c) 1 a b = (a + b + c)(a2 + b2 + c2 − ab − ac − bc).
a+b+c c a 1 c a

Portanto, podemos concluir que

a3 + b3 + c3 − 3abc = (a + b + c)(a2 + b2 + c2 − ab − ac − bc)

240
Determinantes 38.4. Propriedades dos determinantes n × n

Problema 38.1 — Mostre que


   
p+x q+y r+z a b c
det a + x b + y c + z  = 2 det  p q r 
a+p b+q c+r x y z

Solução: Lembrando que operações de linha/colunas não alteram o determinante segue

     
p+x q+y r+z p+x q+y r+z p+x q+y r+z
2 −L1 →L2 
a + x b + y c + z L− L3 +L2 →L3
−−−−→ a − p b − q c − r −−−−−→ a − p b − q c − r 
a+p b+q c+r a+p b+q c+r 2a 2b 2c
 
p+x q+y r+z
L3 +L2 →L3
−−−−−→ a − p
 b − q c − r
2a 2b 2c

Daí temos que


     
p+x q+y r+z p+x q+y r+z p+x q+y r+z
det a + x b + y c + z  = det a − p b − q c − r  = 2 det a − p b − q c − r 
a+p b+q c+r 2a 2b 2c a b c

Como ainda temos


     
p+x q+y r+z p+x q+y r+z x y z
2 −L3 →L2 
a − p b − q c − r L− L1 +L2 →L1
−−−−→ −p −q −r  −−−−−→ −p −q −r
a b c a b c a b c

Donde concluímos que


       
p+x q+y r+z x y z a b c a b c
det a + x b + y
 c + z  = 2 det −p −q −r = −2 det −p −q −r = 2 det  p q r 
a+p b+q c+r a b c x y z x y z

Como a expansão por cofatores de um determinante 4×4 se reduz a soma de alguns determinantes
3×3, então todas as propriedades que fizemos no inicio da seção também valem para esse novo caso.
Pelo mesmo argumento determinantes 5 × 5 devem possuir as mesmas propriedades. Utilizando
indução podemos mostrar o seguinte teorema

Teorema 38.2 – Para quaisquer matrizes n × n valem:

(i) Podemos fazer operações elementares de linhas que o determinante se mantém o mesmo.

(ii) Se uma linha está sendo multiplicada por uma constante k, então o determinante é k
vezes o determinante da matriz cuja esta mesma linha foi dividida por esta constante.

(iii) Se trocarmos duas linhas em uma matriz, então o determinante muda de sinal

Observação 38.4.I. Relembre que da definição, temos que det AT = det A e assim o Teorema
38.2 também vale se transferirmos as afirmações para afirmações sobre as colunas da matriz.

241
Determinantes 38.4. Propriedades dos determinantes n × n

Observação 38.4.II. Quero chamar atenção ao leitor que o item (ii) do Teorema 38.2 nos
diz que se A é uma matriz n × n e k ∈ R qualquer, então det(kA) = k n det A, pois cada uma
das n linhas está sendo multiplicada pela mesma constante k.

Observação 38.4.III. Lembre que o escalonamento de uma matriz produz vários zeros nela
e o Teorema 38.2 nos diz que o determinante da matriz original e da matriz escalonada
é o mesmo (a menos de um sinal). Então podemos utilizar esse truque para calcularmos
determinantes de matrizes maiores.

Definição 38.4. Definimos a diagonal principal de uma matriz A = [Aij ]n×n pela diagonal que
possui os elementos da forma aii , para i = 1, 2, . . . , n. Se para todo i > j temos aij = 0, ou seja,
quando todos os elementos abaixo da diagonal principal são zeros dizemos que A é uma matriz
triangular superior. Se para todo i < j temos aij = 0, ou seja, quando todos os elementos
acima da diagonal principal são zeros dizemos que A é uma matriz triangular inferior.

Exemplo 38.4.2.

Considere uma matriz

triangular superior A = [aij ], assim, a matriz é
a11 a12 a13 · · · a1n
 0 a22 a23
 · · · a2n 

da forma A = 
 0 0 a33  . Então pela Observação 38.3.I e sempre expandindo
· · · a3n 
 .. .. .. .. .. 
 . . . . . 
0 0 0 · · · ann
pela primeira coluna temos que det A = a11 · a22 · a33 · · · ann . O mesmo ocorre para matrizes
triangulares inferiores.

Problema 38.3 — Calcule o determinante da matriz A = [aij ]6×6 , onde


(
2, se i = j
aij = .
(−1)|i−j| , se i ̸= j

2 −1 1 −1 1 −1
 
−1 2 −1 1 −1 1 
 
 1 −1 2 −1 1 −1
Solução: Vejamos que a matriz definida no enunciado é dada por A = 
−1 1 −1 2 −1 1 .

 
 1 −1 1 −1 2 −1
−1 1 −1 1 −1 2
Somando a última linha nas linhas ímpares e subtraindo das linhas pares, obtemos a seguinte
matriz
2 −1 1 −1 1 −1
     
1 0 0 0 0 1 1 0 0 0 0 1
−1 2 −1 1 −1 1 0 1 0 0 0 −1 0 1 0 0 0 −1
     
 1 −1 2 −1 1 −1
→ 0 0 1 0 0 1 → 0 0 1 0 0 1
 
 
−1 1 −1 2 −1 1 0 0 0 1 0 −1 0 0 0 1 0 −1
   
 1 −1 1 −1 2 −1 0 0 0 0 1 1 0 0 0 0 1 1
−1 1 −1 1 −1 2 −1 1 −1 1 −1 2 0 0 0 0 0 7

Onde realizamos no último passo as seguintes operações L6 + L1 → L6 , depois L6 + L3 → L6 ,


depois L6 + L5 → L6 , seguido de L6 − L2 → L6 e por fim L6 − L4 → L6 . Desse modo, pelo
Exemplo 38.4.2, temos que det A = 1 · 1 · 1 · 1 · 1 · 7 = 7.

Como última propriedade do determinante vamos expor, sem demonstração, o seguinte teorema

242
Determinantes 38.4. Propriedades dos determinantes n × n

Teorema 38.4 – Sejam A e B duas matrizes quadradas de mesma ordem, então

det(AB) = det(A) det(B).

Observação 38.4.IV. O Teorema 38.4 nos diz que embora tenhamos AB ̸= BA, vale que

det(AB) = det A · det B = det B · det A = det(BA).

Exemplo 38.4.3. Considerando para todo n ∈ N a matriz dada por


 
2 2 2 ··· 2 1−n
n + 2
 1 1 ··· 1 −n 
 1 n + 2 1 · · · 1 −n 
M (n) =  1
 
1 n + 2 ··· 1 −n 
 . .. .. .. .. .. 
 
 .. . . . . . 
1 1 1 · · · n + 2 −n n×n

é possível mostrar que [M (n)]n = 0, então segue pelo Teorema 38.4 que

0 = det([M (n)]n ) = det M (n) · det M (n) · · · det M (n) = (det M (n))n
| {z }
n fatores

Logo, det M (n) = 0 para todo n inteiro.

Exemplo 38.4.4. Seja M uma matriz invertível. Assim,


1
1 = det In = det(M · M −1 ) = det M · det M −1 =⇒ det M −1 =
det M
logo, se M é invertível então det M ≠ 0. Considerando a matriz A = P −1 BP não é difícil
mostrar por indução que A = P B n P para todo n ∈ N. Assim, para todo n ∈ N temos
n −1

que

det(An ) = det(P −1 B n P ) = det(P −1 ) det(B n ) det P


1
= det(B n ) det P = det(B n ) = [det B]n
det P
Isto é útil quando B é uma matriz triangular! Por exemplo, tomando
     
−5 10 −6 −7 −5 1 −1 0 0 1 1 0 0 0 0
−4 8 −4 −4 −2 0 1 0 −1 1 0 2 0 0 0
1 0 1 0 1 e B = 0
     
A=  6 −7 7 4 4 , P =    0 3 0 0
−2 3 −2 1 0 0 0 0 1 1 0 0 0 4 0
2 −3 2 3 4 1 −1 1 1 1 0 0 0 0 5

Podemos mostrar que A = P −1 AP e isto nos implica que det A = det B = 5!.

243
Determinantes 38.4. Propriedades dos determinantes n × n

§38.4.5 Determinante de Vandermonde


Considerando x1 , x2 , · · · , xn sendo números reais quaisquer, definimos a Matriz de Vander-
monde de ordem n por  
1 1 ··· 1
 x1
 x2 · · · xn  
2 x22 · · · x2n 
Vn =  x1 .

 .. .. . . .. 
 . . . . 
n−1 n−1 n−1
x1 x2 · · · xn
Neste momento estamos interessados em calcular det V4 . Considerando as operações L4 −
x4 L3 → L4 , L3 − x4 L2 → L3 , L2 − x4 L1 → L2 , temos que

1 1 1 1 1 1 1 1
x x2 x3 x4 x1 − x4 x2 − x4 x3 − x4 0
det V4 = 12 =
x1 x22 x23 x24 x1 (x1 − x4 ) x2 (x2 − x4 ) x3 (x3 − x4 ) 0
x31 x32 x33 x3n x21 (x1 − x4 ) x22 (x2 − x4 ) x23 (x3 − x4 ) 0
x1 − x4 x2 − x4 x3 − x4 1 1 1
= x1 (x1 − x4 ) x2 (x2 − x4 ) x3 (x3 − x4 ) = (x1 − x4 )(x2 − x4 )(x3 − x4 ) x1 x2 x3
x21 (x1 − x4 ) x22 (x2 − x4 ) x23 (x3 − x4 ) x21 x22 x23

Note que agora precisamos calcular det V3 . Realizando as operações L3 −x3 L2 → L3 e L2 −x3 L1 →
L2 segue que

1 1 1 1 1 1
det V3 = x1 x2 x3 = x1 − x3 x2 − x3 0
x21 x22 x23 x1 (x1 − x3 ) x2 (x2 − x3 ) 0
1 1
= (x1 − x3 )(x2 − x3 ) = (x1 − x3 )(x2 − x3 )(x2 − x1 )
x1 x2

Portanto, temos que

det V4 = (x1 − x4 )(x2 − x4 )(x3 − x4 )(x1 − x3 )(x2 − x3 )(x2 − x1 ).

Estas contas nos mostram que para calcular det Vn+1 se reduz a calcular det Vn , ou seja,
podemos tentar provar uma fórmula geral por indução.

Afirmação 38.4.6 — Para todo n ∈ N temos que det Vn =


Q
1≤i<j≤n (xj − xi ).

Demonstração. A prova será por indução em n ∈ N. Já mostramos para n = 3, os casos n = 1


e n = 2 deixamos para o leitor. Assuma que o resultado vale para n − 1 e considere qualquer
escolha de x1 , x2 , . . . , xn ∈ R. Veja que se dois desses números escolhidos forem o mesmo, então
imediatamente temos duas colunas iguais em Vn , logo o determinante é zero. Podemos então
assumir que todos esses são dois-a-dois distintos. Considere o polinômio

1 1 ··· 1 1
x1 x2 · · · xn−1 y n−1
p(y) = .. .. .. .. .. = (det Vn )y + an−2 y n−2 + · · · + a1 y + a0
. . . . .
xn−1
1 xn−1
2 · · · xn−1
n−1 y
n−1

para
Q certos a0 , a1 , . . . , an−2 ∈ R. Pela hipótese de indução temos que o coeficiente líder é
(xj − xi ). Note que se 1 ≤ i ≤ n é qualquer inteiro, então temos p(xi ) = 0, ou seja,
1≤i<j≤n
p(x1 ) = p(x2 ) = · · · = p(xn−1 ) = 0 são n − 1 zeros de um polinômio de grau n − 1, logo podemos

244
Determinantes 38.5. Sistemas Lineares e Determinantes

Qn−1
fatorar o polinômio p(y) como p(y) = (y − xi ). Tomando y = xn nós
Q
(xj − xi ) · i=1
1≤i<j≤n
temos que

1 1 ··· 1 1
Y x1 x2 · · · xn−1 xn
(xj − xi ) = p(xn ) = .. .. .. .. .. = det Vn
1≤i<j≤n . . . . .
xn−1
1 xn−1
2
n−1
· · · xn−1 xn−1
n

§38.5 Sistemas Lineares e Determinantes


Já sabemos que todo sistema linear pode ser expresso da forma Ax = b, onde A é uma matriz
quadrada. Lembre que se A−1 existe então a solução deste sistema é dada por x = A−1 b. Daí é
importante podermos caracterizar quando A−1 existe ou não. No Exemplo 38.4.4 mostramos a
seguinte implicação
“A é invertível =⇒ det A ̸= 0′′
Será que a recíproca é verdadeira? Vamos estudar as relações entre determinantes e sistemas
lineares e vamos mostrar uma forma explícita para calcularmos a matriz inversa. A resposta para
este questionamento será uma consequência imediata deste estudo.

Motivação 5 — Vamos considerar uma matriz A de ordem 4 × 4. Vamos criar uma outra
matriz 4 × 4 sendo que esta é uma cópia da anterior a menos das duas primeiras linhas, que
agora serão iguais. Por exemplo, temos
   
1 2 3 4 1 2 3 4
5 6 7 8 1 2 3 4
A=  9 10 11 12 =⇒ B =  9 10 11 12
  

13 14 15 16 13 14 15 16

Assim, independente da matriz A, o determinante de B é zero pois temos duas linhas iguais.
Daí, expandindo em cofatores pela segunda linha temos que

0 = det B = 1 · C21 + 2 · C22 + 3 · C23 + 4 · C24

Note que esta expressão se parece muito com o cálculo do termo da primeira linha e segunda
coluna do produto entre A e outra matriz que envolvem os cofatores de A. De fato, basta
observar que     
1 2 3 4 ∗ C21 ∗ ∗ ∗ 0 ∗ ∗
 5 6 7 8  ∗ C22 ∗ ∗ ∗ ∗ ∗ ∗
 9 10 11 12 ∗ C23 ∗ ∗ = ∗ ∗ ∗ ∗
    

13 14 15 16 ∗ C24 ∗ ∗ ∗ ∗ ∗ ∗
Os asteriscos representam termos que não são importantes. Podemos repetir a mesma
construção copiando a linha i e substituindo esta pela linha j. Pelo mesmo argumento, se
i ̸= j, teremos que esta nova matriz possui determinante zero e a expansão por cofator
nesta linha copiada pode ser vista como o elemento da posição (i, j) do produto entre duas
matrizes. Porém, se i = j, então o elemento da posição (i, i) do produto considerado será

245
Determinantes 38.5. Sistemas Lineares e Determinantes

simplesmente det A. Em resumo, vale a seguinte igualdade


    
1 2 3 4 C11 C21 C31 C41 det A 0 0 0
 5 6 7 8  C12 C22 C32 C42 = 0 det A 0 0 

  
 9 10 11 12 C13 C23 C33 C43   0 0 det A 0 
13 14 15 16 C14 C24 C34 C44 0 0 0 det A

Observe que na Motivação 5 não há nada especial na matriz A que foi considerada, então podemos
repetir as mesmas contas para uma matriz qualquer matriz de ordem n × n. Desse modo, nos
vem a seguinte definição
Definição 38.5. Dada a matriz A = [aij ]n×n , onde Cij é o cofator de aij , então consideramos
Adj(A) = [Cij ]T , isto é, a transposta da matriz dos cofatores. A matriz Adj(A) é conhecida como
matriz adjunta da matriz A.

Teorema 38.6 – Para qualquer matriz A de ordem n × n temos que

A · Adj(A) = Adj(A) · A = (det A)In .

Demonstração. A ideia da prova é repetir os passos da Motivação 5. Considere a matriz A = [aij ],


onde Cij é o cofator de aij , então temos
n
X n
X
aki Ckj = Ckj aki = δij (det A),
k=1 k=1
(
1, i = j
onde δij = . Então A · Adj(A) = Adj(A) · A = (det A)In .
̸ j
0, i =

1
Corolário 38.7 – Se det A ̸= 0, então A−1 = Adj(A).
det A

Veja que este corolário completa a equivalência que citamos no inicio da seção e vamos expor
isto como o seguinte corolário:

Corolário 38.8 – Seja A uma matriz quadrada. A é invertível se, e somente se, det A ̸= 0.

Exemplo 38.5.1.
 Podemos
 encontrar (novamente) a inversa de uma matriz 2 × 2. De fato,
a b
considere A = , assim C11 = d, C12 = −c, C21 = −b e C22 = d. Portanto,
c d
 T    
C11 C12 C11 C21 d −b
Adj(A) = = =
C21 C22 C12 C22 −c a

e usando o Corolário 38.7 segue que


 −1  
a b 1 d −b
= .
c d ad − bc −c a

246
Determinantes 38.5. Sistemas Lineares e Determinantes

Problema 38.9 — Encontre a matriz A que satisfaz


 
T 1 1 0
4A−1 − I = 0 1 0
2 1 1

Relembre que se X é invertível, então (X T )T = X e (X −1 )−1 = X. Então


   T
T 1 1 0 1 1 0
4A−1 − I = 0 1 0 =⇒ 4A−1 − I = 0 1 0
2 1 1 2 1 1
 T  
1 1 0 2 0 2
=⇒ 4A−1 = 0 1 0 + I = 1 2 1
2 1 1 0 0 2
   
2 0 2 1/2 0 1/2
1
=⇒ A−1 = 1 2 1 = 1/4 1/2 1/4
4
0 0 2 0 0 1/2
 −1
1/2 0 1/2
=⇒ A = 1/4 1/2 1/4
0 0 1/2

1
Para calcular a matriz inversa usaremos a fórmula B −1 = · Adj(B). Podemos seguir
det(B)
os seguintes passos:  
1/2 0 1/2
1. Calcular o determinante de B = 1/4 1/2 1/4 utilizando a expansão por cofatores
0 0 1/2
utilizando a 3 linha:
a

1 1/2 0 1
det(B) = · =
2 1/4 1/2 8
2. Calcular a adjunta de B encontrando a matriz transposta dos cofatores:

 T
1/2 1/4 1/4 1/4 1/4 1/2
 0 −
1/2 0 1/2 0 0   T

 0
 1/4 −1/8 0
1/2 1/2 1/2 1/2 0
Adj(B) = 

− 0 −  = 0 1/4 0 
1/2 0 1/2 0 0 

 0
 −1/4 0 1/4
1/2 1/2 1/2 1/2 0 

1/2 1/4 1/4 1/4 1/4 1/2
 
1/4 0 −1/4
= −1/8
 1/4 0 
0 0 1/4

3. Calcular a inversa de A utilizando a fórmula:


   
1/4 0 −1/4 2 0 −2
1 1 
A = B −1 = · Adj(B) = · −1/8 1/4 0  = −1 2 0 
det(B) 1/8
0 0 1/4 0 0 2

247
Determinantes 38.5. Sistemas Lineares e Determinantes

Voltando ao Corolário 38.8 temos que o sistema linear




 a11 x1 + a12 x2 + · · · + a1n xn = b1

a21 x1 + a22 x2 + · · · + a2n xn = b2

..


 .

an1 x1 + an2 x2 + · · · + ann xn = bn

o qual pode ser escrito de forma matricial como Ax = b possui solução se, e somente se, det A ̸= 0,
onde A = [aij ]n×n , b = [bi ]n×1 e x = [xi ]n×1 . Denote por Ai a matriz obtida a partir de A
substituindo a i-ésima coluna de A pela matriz b. Além disso, como a solução é dada por x = A−1 b
1
e neste caso vale que A−1 = Adj(A), então como
det A
    
C11 C21 · · · Cn1 b1 C11 b1 + C21 b2 + · · · + Cn1 bn
 C12 C22 · · · Cn2   b2   C12 b1 + C22 b2 + · · · + Cn2 bn 
Adj(A)b =  . .. . ..   ..  =  ..
    
 .. . . . .  .   .


C1n C2n · · · Cnn bn C1n b1 + C2n b2 + · · · + Cnn bn

e observando que a soma C1i b1 + C2i b2 + · · · + Cni bn significa calcular o determinante da matriz
Ai usando a expansão de cofatores sobre a i-ésima coluna, então cada variável do sistema Ax = b
det Ai
é dada por xi = , para cada i = 1, 2, . . . , n.
det A
O que acabamos de mostrar é um método para resolver sistemas lineares através da matriz
adjunta!

Teorema 38.10 (Regra de Cramer) – Seja A uma matriz quadrada invertível e b uma matriz
coluna. Denote por Ai a matriz obtida a partir de A substituindo a i-ésima coluna de A pela
matriz b. Então o sistema linear Ax = b, possui solução única x = [xi ]n×1 dada por

det Ai
xi = ,
det A
para cada i = 1, 2, . . . , n.

Observação 38.5.I. Duas restrições para a aplicação da Regra de Cramer são imediatas.

(i) Os sistemas em questão devem ter exatamente o mesmo número de equações que de
incógnitas para garantir que todas as matrizes envolvidas sejam quadradas e, portanto,
seja possível calcular seus determinantes.

(ii) O determinante da matriz dos coeficientes não pode ser zero, uma vez que ele aparece
no denominador de uma fração. Se o determinante de A for igual a zero, então a Regra
de Cramer não pode ser aplicada.

Observação 38.5.II. Embora a Regra de Cramer forneça um método sistemático para a


solução de equações lineares simultâneas, o número de cálculos envolvidos pode se tornar
impressionante quando a ordem do determinante é grande. Assim, para sistemas grandes, a
Regra de Cramer quase nunca é utilizada. A grande vantangem que este método oferece é
quando queremos encontrar o valor de uma única variável do sistema linear dado.

248
Determinantes 38.5. Sistemas Lineares e Determinantes

Exemplo 38.5.2. Para resolvermos o sistema



−3x + 4y + 6z = 30

−x − 2y + 3z = 8

x + 2z = 6

Basta considerarmos as matrizes


       
−3 4 6 30 4 6 −3 30 6 −3 4 30
A = −1 −2 3 , Ax =  8 −2 3 , Ay = −1 8 3 e Az = −1 −2 8 
1 0 2 6 0 2 1 6 2 1 0 6

cujo os determinante são det A = 44, det Ax = −40, det Ay = 72 e det Az = 152. Pela Regra
de Cramer as soluções desse sistema linear é dado por
det Ax −40 det Ay 72 det Az 152
x= = ,y = = ez= = .
det A 44 det A 44 det A 44

Problema 38.11 (Lei dos Cossenos) — Num triângulo qualquer △ABC, mostre que
2 2 2
BC = AB + BC − 2AB · BC cos Â

Solução: Por simplicidade, detonaremos as arestas do triângulo por AB = c, AC = b e


BC = a e os ângulos internos serão  = α, B̂ = β e Ĉ = γ. A partir do vértice A trace a
altura do triângulo e divida o lado BC em segmentos de comprimento m e n.

Logo, cos β = n/c e cos γ = m/b e disto concluímos que vale c cos β + b cos γ = n + m = a.
Repita o processo anterior para os outros vértices de △ABC e obtemos as equações

c cos β + b cos γ = a
    
 0 c b cos α a
a cos γ + c cos α = b ⇐⇒  c 0 a   cos β = b 
 
b a 0 cos γ c

b cos α + a cos β = c

   
0 c b a c b
Pela Regra de Cramer devemos considerar A =  c 0 a e Aα =  b 0 a, donde
b a 0 c a 0
det A = 2abc e det Aα = −a + ab + ac . Portanto,
3 2 2

det Aα −a3 + ab2 + ac2 −a2 + b2 + c2


cos α = = =
det A 2abc 2bc
ou seja, a2 = b2 + c2 − 2bc cos α e isto é justamente o que queremos mostrar.

249
Determinantes 38.6. Exercícios

§38.6 Exercícios
Exercícios Introdutórios
Exercício 38.1. Usando a forma escalonada matriz, calcule o determinante de cada um das matrizes
abaixo:

     
2 −1 5 −1 0 2 1 −2 1 4 2
(i)
−4 3 0 −3 −2 4 2 4 2 0 −4
(iv)    
  0 0 −4 2 3
(vi)  8 −6 5 1
0 −1 −2 
0 0 0 3 0 0 4 1 3
(ii) −1 0 −3
2 2 0 −3 4
2 1 2  
  1 −2 1 4
0 1 −5 2 −4 0 2
(v)  
(iii) 2 6 3  0 0 1 6
0 3 5 5 3 4 0

Exercício 38.2. Usando a Regra de Cramer, resolva os seguintes sistemas lineares:

(  
(i)
3x + 6y = 5 2x − 4y − 3z = −20
 


4x + y + z + w = 6
(ii) 7x + 9z = 50 3x + 7y − z + w = 1
12x − 2y = −12
 (iii)
−6x + 3y − 9z = −39 7x + 3y − 5z + 8w = −3
 


x + y + z + 2w = 3

 
3 1
Exercício 38.3. Encontre para quais valores de λ ∈ R temos det(A − λI) = 0, onde A = . Calcule
4 6
a soma e o produto desses números e compare com tr(A) e det(A).
 
  1 0 −3
x −1
Exercício 38.4. Para quais valores de x ∈ R temos det = det 2 x −6 .
3 1−x
1 3 1 − 5x
Exercício 38.5. A função min(i, j) calcula o mínimo entre os valores i e j. Considere a matriz A = [aij ]5×5 ,
1
onde aij = . Calcule o determinante de A.
min(i, j)

Exercícios de Aprofundamento
Exercício 38.6. Decida quais das matrizes abaixo são invertíveis. Caso uma delas seja, encontre sua
inversa através do uso da matriz adjunta.

       
2 5 5 2 0 2 2 −3 5 1 4 3 1
(i) −1 −1 0 (ii)  0 3 2 (iii) 0 1 −3 2 5 2 2
(iv)  
2 4 −3 −2 0 −4 0 0 −4 1 3 8 9
1 3 2 2
 
a b c
Exercício 38.7. Se det d e f  = −5, então calcule:
g h i

     
g h i a b c a+d b+e c+f
(i) det d e f (iii) det  d e f (v) det  −d −e −f 
a b c 2a 2b 2c g h i
     
d e i 3a 3b 3c −3a −3b −3c
(ii) det g h i (iv) det −d −e −f  (vi) det  d e f 
a b c 4g 4h 4i g − 4d h − 4e i − 4f

250
Determinantes 38.6. Exercícios

Exercício 38.8. Sem calcular diretamente os determinantes, mostre que:

(a) (b)
       
2a + p 2b + q
2c + r a b c a1 + b1 a1 − b1 c1 a1 b1 c1
det 2p + x 2q + y
2r + z  = 9 det  p q r det a2 + b2 a2 − b2 c2  = −2 det a2 b2 c2 
2x + a 2y + b
2z + c x y z a3 + b3 a3 − b3 c3 a3 b3 c3
 
0 2 0 0 5
0 7 0 2 0
 
Exercício 38.9. Considerando a matriz A =  2 3 4 0 7 . Encontre os seguintes determinantes:
0 0 5 0 0
1 3 1 1 1

(i) det(AT ) (ii) det(5A) (iii) det(10A−1 )

Exercícios Avançados
Exercício 38.10. Seja a um número real qualquer. Para todo n ≥ 3 defina Dn como o determinante da
matriz  
a 1 0 0 ··· 0 0 0
−1 a 1 0 ··· 0 0 0
 
 0 −1 a 1 · · · 0 0 0
 
Dn = det  0
 0 −1 a · · · 0 0 0 
 .. .. .. .. . . .. .. .. 
 .
 . . . . . . .
0 0 0 0 · · · −1 a 1
0 0 0 0 · · · 0 −1 a n×n
(i) Calcule D3 , D4 e D5 .
(ii) Mostre que para todo n ≥ 5 vale

Dn = a · Dn−1 + Dn−2 .

Exercício 38.11. Considere x1 , x2 , . . . , xn reais quaisquer. Considere a matriz A = [aij ]n×n , onde
(
1 + xj , se i = j
aij = .
xj , se i ̸= j

Mostre que o determinante da matriz A é 1 + x1 + x2 + x3 + · · · + xn .


Exercício 38.12. Considere x1 = 0 e x2 , x3 , . . . , xn reais quaisquer. Considere a matriz A = [aij ]n×n , onde
(
1 + xi , se i = j
aij = .
1, se i ̸= j

Mostre que o determinante da matriz A é x2 x3 x4 · · · xn .


Exercício 38.13. Se uma matriz quadrada é tal que a soma de cada linha é igual a zero, então esta matriz
não é invertível.
1
Exercício 38.14. Se A for invertível, então Adj(A) é invertível e [AdjA]−1 = A = Adj(A−1 )
det A

251

Você também pode gostar