Conteúdos da cadeira

Indução e recorrências

Indução simples e forte, sequências, recorrências lineares e equação característica.

Markdown

Perguntar sobre esta página

ChatGPTClaudePerplexityGeminiCopiar e abrir

Envia o link e pede à IA para ler a página. No Gemini, cola a pergunta copiada.

Ver pergunta para copiar
Nesta página

Como provas uma afirmação sobre todos os naturais se não podes testá-los um a um? A indução responde: prova o primeiro caso e prova que cada caso implica o seguinte, como uma fila de dominós onde derrubar o primeiro deita todos abaixo. E quando um problema se define à custa de casos anteriores (fatorial, juros, algoritmos recursivos), uma relação de recorrência modela-o e a indução prova a solução.

Indução simples: os três passos

Para provar P(n)P(n) para todo o nn0n \ge n_0:

  1. Base: prova P(n0)P(n_0).
  2. Hipótese de indução: assume P(k)P(k) para um kk genérico.
  3. Passo indutivo: prova P(k+1)P(k+1) usando a hipótese.

Exemplo: 20+21++2n1=2n12^0 + 2^1 + \dots + 2^{n-1} = 2^n - 1 para n1n \ge 1.

  • Base (n=1n = 1): o lado esquerdo é 20=12^0 = 1 e o direito é 211=12^1 - 1 = 1. Verdadeiro.
  • Hipótese: assume i=0k12i=2k1\sum_{i=0}^{k-1} 2^i = 2^k - 1.
  • Passo: i=0k2i=(i=0k12i)+2k=(2k1)+2k=22k1=2k+11\sum_{i=0}^{k} 2^i = (\sum_{i=0}^{k-1} 2^i) + 2^k = (2^k - 1) + 2^k = 2 \cdot 2^k - 1 = 2^{k+1} - 1. É P(k+1)P(k+1).

Há uma leitura bonita em binário: o lado esquerdo é o número de nn bits todos a 1 (11112111\dots1_2), e 2n2^n é 10002100\dots0_2; somar 1 ao primeiro dá o segundo, o que confirma a igualdade.

O que pode correr mal

Três falhas típicas, todas elas pedidas em exercícios de “encontra o erro”:

  • Base em falta ou falsa. Sem base, o passo indutivo prova apenas “se um dominó cai, o seguinte cai”, com a fila toda de pé. A indução sem base não prova nada.
  • Usar a hipótese onde ela não chega. Na passagem de kk para k+1k+1 tens de invocar P(k)P(k) explicitamente. Se a prova de P(k+1)P(k+1) nunca usa a hipótese, desconfia: ou a afirmação é trivial, ou há erro.
  • Falsa indução. A “prova” de que todos os cavalos têm a mesma cor assume que dois conjuntos de kk cavalos com k1k-1 em comum partilham a cor, o que falha na passagem de 1 para 2 (a interseção é vazia). O passo tem de valer para todo o kk, incluindo o primeiro.

Indução forte

Na indução forte, a hipótese assume P(j)P(j) para todos os jj de n0n_0 até kk, e prova P(k+1)P(k+1). É preciso quando o caso k+1k+1 depende de vários anteriores, não só do imediato.

Exemplo: todo o inteiro n2n \ge 2 é primo ou produto de primos.

  • Base: n=2n = 2 é primo.
  • Hipótese forte: assume que todos os inteiros de 22 a kk fatorizam em primos.
  • Passo: considera k+1k+1. Se k+1k+1 é primo, está feito. Se é composto, k+1=abk+1 = a \cdot b com 2a,bk2 \le a, b \le k; pela hipótese, aa e bb fatorizam em primos, e juntando as fatorizações obténs a de k+1k+1.

Com indução simples isto emperrava, porque aa e bb não são necessariamente kk. Sempre que a decomposição “salta para trás” mais de uma casa, usa a forte.

A indução (simples ou forte) equivale ao princípio da boa ordenação: todo o conjunto não vazio de naturais tem mínimo. Se PP falhasse algures, o conjunto dos contraexemplos teria um mínimo mm, e o passo indutivo aplicado a m1m - 1 contradiria a minimalidade.

Sequências: três formas de definir

Uma sequência é uma função de um conjunto infinito de inteiros (normalmente N\mathbb{N}) para R\mathbb{R}. Pode definir-se:

  • Por lista: 1,4,9,16,1, 4, 9, 16, \dots (exige adivinhar o padrão).
  • Recursivamente: a1=2a_1 = 2, ak+1=2aka_{k+1} = 2a_k (cada termo à custa dos anteriores).
  • Por fórmula explícita: an=2na_n = 2^n (cálculo direto).

As clássicas: a aritmética (ak+1=ak+da_{k+1} = a_k + d, termo geral an=a+(n1)da_n = a + (n-1)d, soma Sn=n(2a+(n1)d)/2S_n = n(2a + (n-1)d)/2) e a geométrica (ak+1=raka_{k+1} = r a_k, termo geral an=arn1a_n = a r^{n-1}, soma Sn=a(1rn)/(1r)S_n = a(1-r^n)/(1-r) para r1r \ne 1). Exemplo: 7,4,1,2,5,8,-7, -4, -1, 2, 5, 8, \dots é aritmética de razão 33; 1,2,4,8,1, 2, 4, 8, \dots é geométrica de razão 22.

O problema central: dada a definição recursiva, descobrir a explícita. É o que resolve a teoria das recorrências.

Relações de recorrência de primeira ordem

O modelo do empréstimo: capital em dívida cnc_n no mês nn, juro mensal JJ, prestação constante PP, capital inicial CC. Cada mês o capital rende juros e abate a prestação:

cn=(1+J)cn1P,n1,c0=C.c_n = (1+J)c_{n-1} - P, \quad n \ge 1, \quad c_0 = C.

Resolve-se em duas partes: a solução da homogénea (qn=d(1+J)nq_n = d(1+J)^n) mais uma solução particular constante (pn=bp_n = b com b=(1+J)bPb = (1+J)b - P, logo b=P/Jb = P/J). A solução geral é cn=d(1+J)n+P/Jc_n = d(1+J)^n + P/J, e c0=Cc_0 = Cd=CP/Jd = C - P/J:

cn=(CPJ)(1+J)n+PJ.c_n = \left(C - \frac{P}{J}\right)(1+J)^n + \frac{P}{J}.

Exemplo numérico: C=3500C = 3500 euros, TAN 26%26\% (logo J=0,26/120,021667J = 0{,}26/12 \approx 0{,}021667), N=12N = 12 meses. Impondo c12=0c_{12} = 0 obtém-se P=CJ(1+J)12/((1+J)121)334,36P = C \cdot J(1+J)^{12}/((1+J)^{12}-1) \approx 334{,}36 euros. Podes confirmar a fórmula simulando mês a mês:

Python
C, J, N = 3500.0, 0.26 / 12, 12
P = C * J * (1 + J) ** N / ((1 + J) ** N - 1)
print(f"prestacao = {P:.2f}")
saldo = C
for mes in range(1, N + 1):
    saldo = (1 + J) * saldo - P
print(f"saldo final = {saldo:.6f}")  # proximo de 0
Dados de entrada

Recorrências lineares de segunda ordem

Uma recorrência linear homogénea de segunda ordem tem a forma an=Aan1+Ban2a_n = A a_{n-1} + B a_{n-2}. Tenta soluções da forma an=rna_n = r^n: substituindo e dividindo por rn2r^{n-2} obténs a equação característica r2=Ar+Br^2 = Ar + B. Se ela tem duas raízes distintas r1,r2r_1, r_2, a solução geral é an=c1r1n+c2r2na_n = c_1 r_1^n + c_2 r_2^n; as condições iniciais fixam c1,c2c_1, c_2.

Exemplo resolvido: an=5an16an2a_n = 5a_{n-1} - 6a_{n-2} com a0=0a_0 = 0 e a1=1a_1 = 1.

  1. Equação característica: r25r+6=0r^2 - 5r + 6 = 0, raízes r=2r = 2 e r=3r = 3.
  2. Solução geral: an=c12n+c23na_n = c_1 2^n + c_2 3^n.
  3. a0=0a_0 = 0c1+c2=0c_1 + c_2 = 0; a1=1a_1 = 12c1+3c2=12c_1 + 3c_2 = 1. Resolvendo: c1=1c_1 = -1, c2=1c_2 = 1.
  4. Solução: an=3n2na_n = 3^n - 2^n.

Verifica por indução os primeiros termos: a2=94=5a_2 = 9 - 4 = 5 e a recorrência dá 5160=55 \cdot 1 - 6 \cdot 0 = 5; a3=278=19a_3 = 27 - 8 = 19 e 5561=195 \cdot 5 - 6 \cdot 1 = 19. Confere.

Os casos especiais: raiz dupla rr (solução an=(c1+c2n)rna_n = (c_1 + c_2 n) r^n) e termo independente não nulo (procura-se uma particular com a forma do termo independente, como no empréstimo). A sequência de Fibonacci, F0=0F_0 = 0, F1=1F_1 = 1, Fn=Fn1+Fn2F_n = F_{n-1} + F_{n-2}, resolve-se pelo mesmo método, com equação r2=r+1r^2 = r + 1.

Indução prova correção de programas

A mesma técnica prova que um ciclo faz o que promete, via invariante. No cálculo iterativo do fatorial (fat acumulador, i contador), o invariante é: no fim de cada iteração, fat=i!fat = i!. Vale antes do ciclo (i=1i = 1, fat=1fat = 1) e cada iteração preserva-o (fat(i+1)=(i+1)!fat \cdot (i+1) = (i+1)!). Quando o ciclo termina com i=ni = n, tens fat=n!fat = n!. Base e passo, outra vez: invariantes são indução disfarçada, e voltarão em AED e noutras cadeiras.

Ver o ficheiro no GitHub

À tua maneira

Escolhe como preferes ler.

Aparência
Ajustar cores e largura
Cor de destaque do tema FEUP
Tipo de letra

Álgebra, lógica e uma ideia de cada vez.

As tuas escolhas ficam guardadas neste navegador.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.