# Texto e fórmulas

Um exemplo simples, escrito em Markdown.

Página: https://resumos.rgo.pt/exemplo/apontamentos/

## Uma ideia de cada vez

Um apontamento pode ter **definições**, exemplos e pequenos exercícios. Usa as tuas palavras e liga às fontes que consultaste.

Neste exemplo, vamos somar os inteiros de 1 até $n$, com $n$ inteiro não negativo. Para $n=0$, a soma não tem termos e vale zero. O resultado é:

$$
\sum_{k=1}^{n} k = \frac{n(n+1)}{2}
$$

Para $n = 4$, temos $1 + 2 + 3 + 4 = 10$.

Para perceber a fórmula, escreve a soma por ordem crescente e depois por ordem decrescente. Ao somar as duas linhas coluna a coluna, cada coluna dá $n+1$. Há $n$ colunas, por isso o dobro da soma é $n(n+1)$. Dividir por 2 recupera a soma original. Este argumento também funciona quando $n$ é ímpar.

## Um pequeno programa

```
def soma_naturais(n):
    return n * (n + 1) // 2

print(soma_naturais(4))  # 10
```

Em Python, `//` faz a divisão inteira. Aqui não perdemos uma parte decimal: de dois inteiros consecutivos, $n$ e $n+1$, um é par. O produto é sempre divisível por 2.

## Uma tabela

| n | Soma |
| --- | --- |
| 1 | 1 |
| 2 | 3 |
| 3 | 6 |
| 4 | 10 |

Para calcular a média de pontos por fila, divide o total pelo número de filas. Com quatro filas, temos $10/4=2{,}5$ pontos por fila em média. A média pode não ser inteira, mesmo quando cada fila tem um número inteiro de pontos.

## Limites de um ciclo

Em Python, `range(1, n + 1)` percorre os inteiros de 1 até n. O limite superior fica excluído. Começa com `total = 0` e, para cada `k`, soma `k` ao total. Antes dessa atualização, `total` contém a soma de 1 até `k - 1`; depois, contém a soma de 1 até `k`.

Se n for zero, `range(1, 1)` está vazio. O total continua a zero, que é o valor da soma vazia.

## Contar as operações

O ciclo faz n atualizações. A fórmula faz um número fixo de operações aritméticas. Se cada operação tiver custo constante, os custos são Θ(n) e Θ(1), respetivamente. Com inteiros de precisão arbitrária, como os de Python, o custo também depende do número de bits dos valores.

## Uma imagem

![Quatro filas de pontos com um, dois, três e quatro pontos, num total de dez.](https://resumos.rgo.pt/examples/pontos.svg)

A imagem representa a mesma soma. É um SVG local e inclui uma descrição para quem usa um leitor de ecrã.

> Experimenta: quantos pontos teria a figura com cinco filas?

## Links e próximos passos

A [documentação do Markdown no Astro](https://docs.astro.build/en/guides/markdown-content/) explica como escrever páginas. As fórmulas usam [KaTeX](https://katex.org/docs/supported.html).

Na página seguinte, juntamos [gráficos, diagramas e vídeo](https://resumos.rgo.pt/exemplo/diagramas/) num ficheiro MDX.

## Notas de rodapé

As notas de rodapé servem para uma fonte ou uma explicação que pode ficar para depois.[1](https://resumos.rgo.pt/exemplo/apontamentos/#user-content-fn-fonte)

```
Uma afirmação com uma fonte.[^fonte]

[^fonte]: Autor, título e ligação à fonte.
```

## Avisos em Markdown

Uma ideia por parágrafo

Começa pela ideia principal. Junta um exemplo e só depois acrescenta os detalhes.

Ver uma solução

Para somar os primeiros quatro naturais, podemos juntar os extremos: $1 + 4 = 5$ e $2 + 3 = 5$. A soma é $10$.

## Notas de rodapé

1.  Este é um exemplo de nota de rodapé. A seta no fim volta ao ponto do texto onde estavas. Podes incluir [ligações](https://www.markdownguide.org/extended-syntax/#footnotes) e **formatação**. [Voltar](https://resumos.rgo.pt/exemplo/apontamentos/#user-content-fnref-fonte)
    

## Exercícios

1\. Justificar a fórmula

Justifica a fórmula da soma de 1 até n sem indução. O teu argumento deve funcionar também para n ímpar.

Pista

Escreve a soma uma vez por ordem crescente e outra por ordem decrescente.

Mais uma pista

Soma as duas linhas coluna a coluna. Quantas colunas tens e quanto vale cada uma?

Solução

Se S = 1 + 2 + … + n, então 2S = (1 + n) + (2 + n − 1) + … + (n + 1). Há n colunas, cada uma com soma n + 1. Logo S = n(n + 1)/2, incluindo n ímpar.

Confere a tua resposta:

*   Associei o primeiro termo ao último.
*   Cada par soma n + 1.
*   Expliquei como contar os termos sem falhar quando n é ímpar.

Erros frequentes

Dizer que há n/2 pares sem tratar o termo central quando n é ímpar. A soma das duas linhas evita esse problema.

[Voltar à explicação](https://resumos.rgo.pt/exemplo/apontamentos/#uma-ideia-de-cada-vez)

2\. Calcular sem enumerar

Quanto vale a soma de todos os inteiros de 1 até 20, incluindo ambos os extremos?

Pista

Usa a fórmula com n = 20.

Mais uma pista

Calcula 20 × 21 e divide o resultado por 2.

Solução

20 × 21 / 2 = 210. Como a soma é inteira e exata, a tolerância é zero.

Erros frequentes

Usar 19 como último termo ou esquecer a divisão por 2.

[Voltar à explicação](https://resumos.rgo.pt/exemplo/apontamentos/#uma-ideia-de-cada-vez)

3\. Interpretar uma média

Uma figura tem seis filas, com 1, 2, 3, 4, 5 e 6 pontos. Qual é o número médio de pontos por fila? Arredonda a duas casas decimais.

Pista

A média é a soma dividida pelo número de filas.

Mais uma pista

Há 21 pontos distribuídos por seis filas.

Solução

A média é 21/6 = 3,50 pontos por fila. A média não precisa de ser um número inteiro de pontos.

Erros frequentes

Dividir pelo último valor da soma parcial ou arredondar prematuramente para um inteiro.

[Voltar à explicação](https://resumos.rgo.pt/exemplo/apontamentos/#uma-tabela)

4\. Prever a saída

Qual é o valor que este programa escreve?

```
total = 0
for k in range(1, 4):
    total += k
print(total)
```

Pista

O limite superior de `range` não é incluído.

Mais uma pista

O ciclo soma os valores 1, 2 e 3.

Solução

O programa escreve 6. Não executa uma iteração com k = 4.

Erros frequentes

Prever 10 porque se incluiu o limite superior.

[Voltar à explicação](https://resumos.rgo.pt/exemplo/apontamentos/#limites-de-um-ciclo)

5\. Escolher o estado certo

No ciclo anterior, o que representa total imediatamente antes de executar `total += k`?

Pista

Segue as duas primeiras iterações, antes de cada atualização.

Mais uma pista

Quando k = 2, total já contém 1, mas ainda não contém 2.

Solução

Antes da atualização, total contém a soma de 1 até k − 1. Depois, contém a soma de 1 até k. O instante a que o estado se refere faz parte da resposta.

*   **A soma de 1 até k − 1.** Antes da soma de k, só foram processados os inteiros anteriores. Para k = 1, a soma vazia vale zero.
*   **A soma de 1 até k.** Essa é a situação depois de executar `total += k`, não antes.
*   **Sempre zero.** Só é zero antes da primeira iteração. As seguintes conservam o total acumulado.

Erros frequentes

Descrever a variável sem indicar se estás antes ou depois da atualização.

[Voltar à explicação](https://resumos.rgo.pt/exemplo/apontamentos/#limites-de-um-ciclo)

6\. Corrigir uma função

Corrige `soma_naturais(n)` para devolver a soma de 1 até n, incluindo n. Recebe um inteiro não negativo; não deve imprimir.

```python
def soma_naturais(n):
    total = 0
    for k in range(1, n):
        total += k
    return total
```



### Testes

**Soma vazia**


```python
print(soma_naturais(0))
```


Saída esperada:

```text
0
```

**Primeiro termo**


```python
print(soma_naturais(1))
```


Saída esperada:

```text
1
```

**Quatro termos**


```python
print(soma_naturais(4))
```


Saída esperada:

```text
10
```

**Vinte termos**


```python
print(soma_naturais(20))
```


Saída esperada:

```text
210
```

Pista

Verifica n = 1: quantas iterações faz o ciclo original?

Mais uma pista

O limite superior de `range` é exclusivo. Para incluir n, usa o inteiro seguinte.

Solução

Substitui `range(1, n)` por `range(1, n + 1)`. Para n = 0, não há iterações e o total fica a zero. Para n = 4, somamos 1 + 2 + 3 + 4 = 10. A fórmula `n * (n + 1) // 2` também devolve a soma, sem um ciclo. Passar estes testes não prova o resultado para todos os inteiros.

Erros frequentes

Excluir n do ciclo, usar `print` em vez de `return` ou devolver um valor fixo que só funciona para uma entrada.

[Voltar à explicação](https://resumos.rgo.pt/exemplo/apontamentos/#limites-de-um-ciclo)

7\. Explicar o caso vazio

Na função corrigida, por que motivo n = 0 devolve zero? Confirma o resultado pela fórmula e pelo ciclo.

Pista

Observa `range(1, 1)`.

Mais uma pista

O conjunto de valores do ciclo é vazio, por isso total conserva o valor inicial.

Solução

O ciclo não executa iterações e total continua a zero. Na fórmula, 0 × (0 + 1)/2 = 0. Os dois métodos concordam sobre a soma vazia.

Confere a tua resposta:

*   Indiquei que o ciclo não executa nenhuma iteração.
*   Relacionei o resultado com o valor inicial zero.
*   Verifiquei que a fórmula também dá zero.

Erros frequentes

Dizer que a função falha por não haver iterações ou confundir soma vazia com produto vazio.

[Voltar à explicação](https://resumos.rgo.pt/exemplo/apontamentos/#limites-de-um-ciclo)

8\. Comparar os dois métodos

Compara o custo do ciclo e da fórmula quando n aumenta. Que hipótese sobre o custo das operações estás a usar?

Pista

Conta quantas vezes cada método atualiza ou calcula um valor.

Mais uma pista

O ciclo repete uma soma n vezes. A fórmula não contém um ciclo, mas os inteiros podem crescer.

Solução

Com operações aritméticas de custo constante, o ciclo custa Θ(n) e a fórmula custa Θ(1). Para inteiros de precisão arbitrária, o custo de uma operação depende do número de bits. A conclusão Θ(1) não é uma análise do custo em bits.

Confere a tua resposta:

*   Contei n atualizações no ciclo.
*   Identifiquei um número fixo de operações aritméticas na fórmula.
*   Indiquei que esta comparação assume operações aritméticas de custo constante.

Erros frequentes

Afirmar que qualquer multiplicação demora o mesmo tempo, independentemente do tamanho dos inteiros.

[Voltar à explicação](https://resumos.rgo.pt/exemplo/apontamentos/#contar-as-opera%C3%A7%C3%B5es)
