MÃ Dulo I - Apostila NES
MÃ Dulo I - Apostila NES
MÃ Dulo I - Apostila NES
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
ii
Conteúdo Conteúdo
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
iii
Conteúdo Conteúdo
26 Esperança 129
26.1 Exercícios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
iv
Conteúdo Conteúdo
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:
4. Se o número atual for maior que armazenado, substituir o número armazenado pelo
número atual.
Exemplo 1.1.2. Algoritmo para fazer um bolo de cenoura com cobertura de chocolate:
4. Adicione os ovos, o óleo e a baunilha à mistura de farinha e misture bem até ficar
homogêneo.
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 #include <stdio.h>
2
3 int main() {
4 printf("Ola, mundo!\n");
5 return 0;
6 }
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.
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.
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.
5
Primeiro programa 1.4. Primeiro programa
print("Olá, mundo!")
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.
• nome-completo
7
Fundamentos de programação 2.1. Variáveis
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.
Já uma tupla em Python pode conter uma combinação de tipos de objetos ou objetos de
um único tipo:
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}
§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.
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
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)
10
Fundamentos de programação 2.3. Operadores de atribuição
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.
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
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.
12
Fundamentos de programação 2.6. Formatação de strings
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.
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().
13
Fundamentos de programação 2.6. Formatação de strings
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:
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.
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}")
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.
• == (igual a)
• != (diferente de)
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)
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:
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
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.
• >> (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.
A B A and B
True True True
False True False
True False False
False False False
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.
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:
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.
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.
20
Estruturas de repetição 4.2. Laço for
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.
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:
21
Estruturas de repetição 4.2. Laço for
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:
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.
enumerate(iterable, start=0)
• O parâmetro start é opcional e indica o valor inicial do contador. O seu valor padrão é 0.
Saída:
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.
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
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.
24
Estruturas de repetição 4.4. Comando continue
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.".
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.
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.
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.
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 = '$#@!'
• Operador de Concatenação (+): utilizado para unir duas sequências do mesmo tipo
em uma única sequência.
27
Sequências 6.3. Indexação de sequências
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.
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'
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
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
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:
lista_b = lista_a[:]
30
Sequências 6.4. Listas
§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.
1 lista = [1, 2, 3]
2 lista.append(4)
3 print(lista) # Saída: [1, 2, 3, 4]
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.
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:
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:
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’.
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
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:
2. Percorrendo por valores: outra forma de percorrer uma lista é utilizando o laço de
repetição for diretamente com seus valores. Por exemplo:
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:
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.
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.")
35
Strings 7.2. Métodos lower() e upper()
1 s = "olá mundo"
2 substring = s[4:]
3 print(substring) # Saída: "mundo"
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:
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.
36
Strings 7.2. Métodos lower() e upper()
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.
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
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)
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.
38
Strings 7.4. Quebra e junção de strings
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.
39
Strings 7.4. Quebra e junção de strings
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.
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().
string_final = separador.join(lista_de_strings)
Onde:
• separador: a string que será usada para separar cada item da lista na string final.
40
Strings 7.5. Método replace()
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.
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
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.
string.strip(caracteres)
Onde:
• 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).
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.
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)
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 é:
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]
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.
• Iterar nas chaves: utilizando o método keys() do dicionário, é possível iterar sobre todas
44
Dicionários 9.2. Combinando dicionários
Como esse é o modo padrão de iteração de um dicionário, o loop também pode ser escrito
assim:
• Iterar nos valores: utilizando o método values() do dicionário, é possível iterar sobre
todos os valores do dicionário. Exemplo:
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.
dicionario1.update(dicionario2)
45
Dicionários 9.2. Combinando dicionários
46
Dicionários 9.3. Deletando itens de dicionários
16 print(deposito1)
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.
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.
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
• 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.
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()
48
Funções 10.2. Funções com retorno
mostrar_informacoes("Maria", 25)
49
Funções 10.3. Escopo de variáveis
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á:
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.
A saída será:
Como podemos ver, a variável x é definida fora da função e pode ser acessada dentro da função
e fora dela.
51
Funções 10.4. Recursão
A saída será:
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:
52
Funções 10.4. Recursão
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.
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.
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:
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
math.sqrt(25)
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)
55
Bibliotecas 11.2. Bibliotecas nativas
• os: Fornece funções para interação com o sistema operacional, como manipulação de
arquivos e diretórios.
• 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/
56
Bibliotecas 11.3. Mais bibliotecas
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.
• 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.
57
Bibliotecas 11.3. Mais bibliotecas
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 é:
Ou:
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:
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
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]
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.
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
61
NumPy, parte 1 12.2. Operações 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
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
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]
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.
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:
64
NumPy, parte 1 12.4. Indexação e fatiamento
linspace_array = np.linspace(0, 1, 5)
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.
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
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.
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.
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]
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)
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]]
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.
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.
• 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.
• trace(a): Retorna a soma dos elementos da diagonal principal de um array 2-D (uma
matriz).
• solve(a, b): Resolve o sistema linear de equações ‘ax = b‘ para x, onde a é uma matriz
e b é um vetor.
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.
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.
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.
72
NumPy, parte 2 13.4. Geração de 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)
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
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.
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
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
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.
• ValueError: É lançada quando uma operação ou função recebe um argumento com o tipo
correto, mas valor inapropriado.
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.
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
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.
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.
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
Neste exemplo, uma nova linha é adicionada ao final do arquivo file.txt. A função
write é usada para escrever no arquivo.
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)
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)
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.
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.
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
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.
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
• 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 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.
83
Pandas, parte 1 15.3. Filtrando DataFrames
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.
84
Pandas, parte 1 15.3. Filtrando DataFrames
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.
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)
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’.
• 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.
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.
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
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_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.
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 é:
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:
• ’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.
• ’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.
91
Pandas, parte 2 16.2. Plotagem
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.
• 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.
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
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.
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.
Exemplo 17.0.3. O Teorema Fundamental da Aritmética nos afirma que cada número
natural n pode ser escrito como
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.
96
Permutações com e sem repetições; permutações circulares 17.1. Permutações
§17.1 Permutações
Dada uma lista de objetos distintos a1 , · · · , an . De quantas maneiras é possível ordená-los?
Comecemos com um exemplo.
Por exemplo, 3! = 3 · 2 · 1 = 6.
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
(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.
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!
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:
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
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!
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
101
Combinações a argumentos combinatórios; combinações com repetição; contagem
Dupla 18.2. Combinações com repetições
(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.
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:
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?
103
Combinações a argumentos combinatórios; combinações com repetição; contagem
Dupla 18.3. Exercícios Propostos
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.
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?
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.
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
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
n
X n n!
= |Ai ∩ Aj | = · (n − 2)! = ,
2 2!
1≤i<j≤n
[ n
X X X
| Ai | = |Ai | − |Ai ∩ Aj | + |Ai ∩ Aj ∩ Ak | −
i=1 1≤i<j≤n 1≤i<j<k≤n
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!
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
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?
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
• 2-subconjuntos {1, 3}, {1, 4}, {1, 5}, {2, 4}, {2, 5}, {3, 5};
{1, 3, 4} 7→ 101100, .
{1, 3, 5} 7→ 101010.
0 0 0
109
Lemas de Kaplansky
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
x1 + x2 + · · · + xp + xp+1 = n − p (20.2)
y1 + y2 + · · · + yp+1 = n − p − pr − r. (20.3)
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.
112
Números Binomiais
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.
113
Números Binomiais
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
2. Prove que
n n n n
+ + ··· = + + · · · = 2n−1 .
0 2 1 3
4. Calcule S = 13 + 23 + · · · + n3
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 .
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.
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
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.
am − an = (2022 · q1 + r) − (2022 · q2 + r)
= 2022 · (qm − qn ),
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,
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.
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.
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?
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
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;
P (A ∪ B) = P (A ∪ (B \ A)) = P (A) + P (B \ A)
120
Espaços de Probabilidade 23.1. Exercícios Propostos
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?
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}.
b. Sabendo que o resultado é um número primo, qual a probabilidade dele ser menor ou
igual a 3?
e portanto
|A| 3 1
P(A) = = = .
|Ω| 6 2
|A ∩ B| 2
P(A|B) = = .
|B| 3
P(A ∩ B)
P(A|B) := ,
P(B)
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
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
Não escreveu ( 10
2
) Sim, escreveu ( 10
8
)
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:
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
124
Probabilidade Condicional 24.1. Exercícios Propostos
PA : Ω → [0, 1]
B 7→ PA (B) = P(B|A)
i. P (Ω) = 1;
ii. 0 ≤ P (A) ≤ 1;
P(Ω ∩ A) P(A)
PA (Ω) = = = 1;
P(A) P(A)
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)
125
Probabilidade Condicional 24.1. Exercícios Propostos
4. Joguei um dado duas vezes. Calcule a probabilidade de obter 3 na primeira jogada, sabendo
que a soma dos resultados foi 7.
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
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.
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
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)},
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.
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.
Costumamos escrever X ∼ Be(p) para indicar que X tem distribuição de Bernoulli com
probabilidade P(X = 1) = p.
0, se o resultado é coroa;
X=
1, se o resultado é cara.
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).
128
26 Esperança
A esperança tem as seguintes propriedades.
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
129
Esperança 26.1. Exercícios Propostos
2. V (aX) = a2 V (X).
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
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.
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
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.
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
σ2
X1 + · · · + Xn 1
V (X) = V = 2 V (X1 + · · · + Xn ) = .
n n n
σ2
X1 + X2 + · · · + Xn V (X)
P −µ ≥ε ≤ = −→ 0
n ε2 nε2
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.
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).
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.
2π
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,
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).
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
§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 .
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
§29.3 Conectivos
Imitando a nossa comunicação diária, podemos juntar duas proposições para criar uma situação
mais complexa, por exemplo:
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).
• 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
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
139
Noções de Lógica e Indução Finita 29.4. Condicionais
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:
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:
(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.
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
é 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
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
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
P ↔ Q ≡ (P → Q) ∧ (Q → P )
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.
[(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
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.
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.
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”.
É 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”.
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
logo Q(11) é falso e desse modo (∃p) ∼Q(p) é outra proposição verdadeira.
144
Noções de Lógica e Indução Finita 29.11. Como negar proposições
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:
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:
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”.
145
Noções de Lógica e Indução Finita 29.12. Princípio de Indução Finita
Teorema 29.1 (Princípio de Indução Finita) – Seja P (n) é uma sentença aberta para todo
n ∈ N. Suponha que:
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
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
n(n + 1)
1 + 2 + 3 + · · · + (n − 1) + n = .
2
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
Teorema 29.2 (Princípio da Indução Forte) – Seja P (n) é uma sentença aberta para todo
n ∈ N. Suponha que:
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.
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í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:
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:
a) A ∪ B = B ∪ A;
b) B ⊂ A =⇒ A ∪ B = A;
c) A ∪ ∅ = A;
d) (A ∪ B) ∪ C = A ∪ B ∪ C = A ∪ (B ∪ C)
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
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:
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} = ∅.
(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.
152
Conjuntos e Noções Básicas de Funções 30.2. Descrição de um conjunto
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
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.
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:
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 = ∅
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:
(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}
A × B = {(a, b) | a ∈ A, b ∈ B} = {(1, x), (1, y), (2, x), (2, y), (3, x), (3, y)}
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.
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
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
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)}
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
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.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
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.
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
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.
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.
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.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
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.
160
Conjuntos e Noções Básicas de Funções 30.8. Função composta
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|.
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.
161
Conjuntos e Noções Básicas de Funções 30.9. Função inversa
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.
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,
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.
163
Conjuntos e Noções Básicas de Funções 30.9. Função inversa
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
ii) T ⊂ T ′ ⇒ f −1 (T ) ⊂ f −1 (T ′ ). x) f (S \ S ′ ) ⊃ f (S) \ f (S ′ ).
v) f −1 (T \ T ′ ) = f −1 (T ) \ f −1 (T ′ ). xiii) S ∩ f −1 (T ) ⊂ f −1 (f (S) ∩ T ).
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.
Exemplo 31.1.1. Vamos considerar uma função real que possui o seguinte gráfico
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
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.
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
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
√ √ √ √
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
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.
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
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
b) A função g : R+ → R dada por g(x) = x/(1 + x) é crescente. De fato, para 0 < a < b
temos
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.
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
√
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
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
171
Funções Reais e Funções Elementares 31.5. Função afim
Proposição 31.5.1 – Seja f : R → R uma função afim, dada por f (x) = ax + b. Então :
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.
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.
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
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.
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
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
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
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
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
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.
177
32.2. A imagem da função quadrática
Funções Quadráticas e Problemas de Otimização
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,
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
Proposição 32.2.5 – Se f (x) = ax2 + bx + c é tal que seu discriminante é não-positivo, então:
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.
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
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.
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
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
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
182
Funções Quadráticas e Problemas de Otimização 32.3. Gráfico da função quadrática
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
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)
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.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.
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
186
Função Modular 33.2. A função modular
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
Note que toda a parte negativa da f foi excluída e substituída pelo seu “reflexo” em torno
do eixo-x.
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.
Deste modo, temos três intervalos a considerar (−∞, −1), [−1, 2) e [2, +∞).
188
Função Modular 33.3. Uma interpretação geométrica do módulo
x2 − x|x| − 1 = x2 − x2 − 2 = −1
Mas observe que x = 1 não pertence ao intervalo que estamos considerando, logo,
x = −1 é a única solução.
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.
a) x ≤ |x|.
c) |x · y| = |x| · |y|;
d) |x|2 = x2 ;
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.
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|.
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
Podemos mostrar, com uma ideia similar, que |x| ≥ a ⇐⇒ x ≤ −a ou x ≥ a. Com efeito,
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.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
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.
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
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
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
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
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)
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
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.
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
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.
4 = f (4) = 4a + b
10 = f (16) = 16a + b
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
(a − b) + (2a + b) = 0 + 0 =⇒ 3a = −3 =⇒ a = −1.
197
Polinômios e Equações Polinomiais 34.2. Divisão de polinômios
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
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
(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
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.
(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)
(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.
(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,
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.
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
− 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
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,
200
Polinômios e Equações Polinomiais 34.2. Divisão de polinômios
2 2 0 −4 1
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
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
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.
202
Polinômios e Equações Polinomiais 34.2. Divisão de polinômios
−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
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.
1 1 2 −5 2
.
1 3 −2 0
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
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
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.
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.
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.
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.
√ √ 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
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
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.
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
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.
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
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
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.
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,
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
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.
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.
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);
(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 (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).
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
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,
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)
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
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)
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.
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.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.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
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).
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
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
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.
(ii) A(B + C) = AB + AC
(iii) (A + B)C = AC + BC
220
Matrizes 37.1. Operações com matrizes
c21 = 4 · 7 + 5 · 9 + 6 · 11 = 139
c22 = 4 · 8 + 5 · 10 + 6 · 12 = 154
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.
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
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.
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
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
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,
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
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
1
Então podemos dizer que A−1 = (A − 13I)
2
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
Vamos assumir um resultado sobre matrizes invertíveis que mostraremos na próxima proposição.
(a) A é invertível.
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
Então como a matriz A é equivalente a uma matriz que possui uma linha nula, logo, A não é
invertível.
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
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
(
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
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
Exercícios de Aprofundamento
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
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.
231
Determinantes 38.1. Propriedades dos determinantes 2 × 2
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
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
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.
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
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.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.
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
235
Determinantes 38.3. Determinantes de ordens maiores
Podemos repetir o mesmo processo para as demais entradas da matriz que encontraremos
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
(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.
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
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
(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
(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.
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
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
240
Determinantes 38.4. Propriedades dos determinantes n × n
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
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
(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.
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
Como última propriedade do determinante vamos expor, sem demonstração, o seguinte teorema
242
Determinantes 38.4. Propriedades dos determinantes n × n
Observação 38.4.IV. O Teorema 38.4 nos diz que embora tenhamos AB ̸= BA, vale que
é 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
que
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
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
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.
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
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
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
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.
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
246
Determinantes 38.5. Sistemas Lineares e Determinantes
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
247
Determinantes 38.5. Sistemas Lineares e Determinantes
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.
248
Determinantes 38.5. Sistemas Lineares e Determinantes
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 Â
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
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
(
(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
(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
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
251