teoria dos números

A caminhada dos primos que se recusa a caminhar

Comecei querendo só portar um script de primos em Python para o navegador e animar uma caminhada no plano. Esperava algo parecido com a espiral de Ulam: uma nuvem irregular, com estrutura, dessas que a gente fica olhando tentando enxergar padrão.

O que saiu foi uma fita diagonal de largura $\sqrt{2}$. Sempre. Em qualquer escala, com qualquer início.

Demorei um pouco para aceitar que não era bug. A regra que eu estava animando é matematicamente incapaz de produzir a imagem que eu esperava — e o motivo é bem mais interessante do que o desenho que eu queria.

A regra

> Um ponto se move num plano. A cada inteiro $n$, se $n$ for primo ele vira à esquerda; se for composto, vira à direita. Depois dá um passo à frente.

É a "caminhada aleatória dos primos", nome que já entrega parte do problema — ela não tem nada de aleatória, como vamos ver. Começamos na origem apontando para o Leste, e o passo básico é um giro de 90°.

Com o ângulo acumulado em radianos, a implementação cabe em três linhas:

ang += ehPrimo(n) ? passo : -passo;   // primo = esquerda, composto = direita
x += Math.cos(ang);
y += Math.sin(ang);

Veja acontecer

Clique em iniciar. Os controles mudam o ângulo da curva, a faixa de $n$ e a velocidade — ao mexer em qualquer um deles a caminhada volta ao começo, e é preciso clicar em iniciar de novo. Ao chegar no último $n$, aparece tracejado o bounding box da trajetória, com suas dimensões. Deixe em 90° para ver o problema; os outros ângulos são o assunto da última seção.

n atual primos (esquerda) compostos (direita) distância da origem

Os vinte primeiros passos

Antes de olhar a imagem grande, vale acompanhar a caminhada na mão. A última coluna é a soma $x+y$ — guarde ela.

$n$ tipo curva direção posição $x+y$
2 primo esquerda ↑ Norte (0, 1) 1
3 primo esquerda ← Oeste (−1, 1) 0
4 composto direita ↑ Norte (−1, 2) 1
5 primo esquerda ← Oeste (−2, 2) 0
6 composto direita ↑ Norte (−2, 3) 1
7 primo esquerda ← Oeste (−3, 3) 0
8 composto direita ↑ Norte (−3, 4) 1
9 composto direita → Leste (−2, 4) 2
10 composto direita ↓ Sul (−2, 3) 1
11 primo esquerda → Leste (−1, 3) 2
12 composto direita ↓ Sul (−1, 2) 1
13 primo esquerda → Leste (0, 2) 2
14 composto direita ↓ Sul (0, 1) 1
15 composto direita ← Oeste (−1, 1) 0
16 composto direita ↑ Norte (−1, 2) 1
17 primo esquerda ← Oeste (−2, 2) 0
18 composto direita ↑ Norte (−2, 3) 1
19 primo esquerda ← Oeste (−3, 3) 0
20 composto direita ↑ Norte (−3, 4) 1
21 composto direita → Leste (−2, 4) 2

Em sequência compacta, com E para esquerda e D para direita:

E E D E D E D D D E D E D D D E D E D D

São 8 esquerdas e 12 direitas — exatamente os 8 primos até 21.

Três coisas já saltam da tabela:

  • Os eixos se alternam sem exceção. Nunca há dois passos horizontais em sequência, nem dois verticais.
  • A coluna $x+y$ só assume os valores 0, 1 e 2. Nenhuma exceção — e isso não é sorte dos primeiros passos, como a figura da próxima seção mostra.
  • Quatro compostos seguidos formam um quadrado fechado, quatro passos que não levam a lugar nenhum. O primeiro caso aparece logo depois do fim da tabela: os passos 25 a 28 saem de $(-1, 2)$ e voltam a $(-1, 2)$.

Vinte passos adiante, em $n = 41$, a caminhada está de volta na origem depois de percorrer 40 arestas.

O que a imagem revela

Rodando a animação, o desenho é uma fila de quadrados unidos pelos vértices, formando uma única linha reta a 45°. Não é impressão nem artefato de escala: todos os pontos visitados satisfazem $x + y \in \{0, 1, 2\}$. A trajetória inteira vive numa faixa diagonal de largura $\sqrt{2}$ — as três diagonais tracejadas na figura abaixo.

−2 4 10 16 4 −4 −10 −16 x y origem todo ponto cai sobre uma das três diagonais tracejadas x + y = 0, 1 e 2
Os 800 primeiros passos. São 799 passos sobre apenas 98 arestas distintas — a caminhada repisa o próprio rastro quase o tempo todo. A faixa sombreada é a região $0 \le x + y \le 2$, e as três tracejadas são as diagonais $x + y = 0$, $1$ e $2$: cada ponto da caminhada cai exatamente sobre uma delas — os 75 desta figura se repartem em 24, 26 e 25 —, e o mesmo vale em $n = 100.000$.

E isso se mantém em qualquer escala:

$n$ passos bounding box pontos distintos pontos por passo
100 99 8 × 8 25 25/99 = 25,253%
1.000 999 27 × 27 81 81/999 = 8,108%
5.000 4.999 41 × 41 123 123/4999 = 2,460%
20.000 19.999 69 × 69 208 208/19999 = 1,040%
100.000 99.999 338 × 338 1.014 1014/99999 = 1,014%

Chamando de $L$ o lado da bounding box, o número de pontos distintos é $3L$ ou $3L+1$ em todas as linhas — as três diagonais e mais nada. A faixa nunca engorda; só estica. Dos 99.999 segmentos até $n = 100.000$, 98.986 caem sobre um ponto já visitado, e um deles é pisado 599 vezes. Cem mil passos desenham só 1.350 arestas distintas.

Por que é assim

Duas propriedades da regra, combinadas.

1. Os passos alternam obrigatoriamente entre horizontal e vertical. Toda curva é de $\pm 90°$, então a direção muda de paridade a cada número: se o passo $n$ foi horizontal, o passo $n+1$ é necessariamente vertical. Cada par de passos consecutivos é portanto um deslocamento diagonal $(\pm 1, \pm 1)$, de comprimento $\sqrt{2}$ — e a escada de quadrados é inevitável.

2. A direção não tem nada de aleatório. Sendo $\pi(n)$ a contagem de primos e $c(n)$ a de compostos até $n$, e numerando as direções como $0$ = Leste, $1$ = Norte, $2$ = Oeste, $3$ = Sul, a direção depois do passo $n$ é exatamente

$$d_n \equiv \big(\pi(n) - c(n)\big) \bmod 4.$$

Cada primo soma $+1$ e cada composto soma $+3$; como $3 \equiv -1 \pmod 4$, virar à direita é o mesmo que subtrair 1, e o acumulado vira $\pi - c$. Nos mesmos vinte passos da tabela lá de cima, a coluna da direção bate linha a linha — sem nenhuma consulta ao caminho já percorrido:

$n$ $\pi(n)$ $c(n)$ $\pi-c$ $d_n$ direção
2 1 0 1 1 ↑ Norte
3 2 0 2 2 ← Oeste
4 2 1 1 1 ↑ Norte
5 3 1 2 2 ← Oeste
6 3 2 1 1 ↑ Norte
7 4 2 2 2 ← Oeste
8 4 3 1 1 ↑ Norte
9 4 4 0 0 → Leste
10 4 5 −1 3 ↓ Sul
11 5 5 0 0 → Leste
12 5 6 −1 3 ↓ Sul
13 6 6 0 0 → Leste
14 6 7 −1 3 ↓ Sul
15 6 8 −2 2 ← Oeste
16 6 9 −3 1 ↑ Norte
17 7 9 −2 2 ← Oeste
18 7 10 −3 1 ↑ Norte
19 8 10 −2 2 ← Oeste
20 8 11 −3 1 ↑ Norte
21 8 12 −4 0 → Leste

Nenhuma aleatoriedade, apesar do nome. E como os compostos dominam numa razão de quase 8 para 1 nessa faixa, a diferença $\pi(n) - c(n)$ decresce de forma quase monótona: a caminhada é essencialmente um giro horário constante, fechando um quadrado a cada 4 compostos. Os primos entram só como defeitos raros que deslocam a fase do ciclo.

Cada defeito desses empurra a caminhada um passo diagonal para fora do quadrado atual. Como o empurrão é sempre no mesmo sentido, o acúmulo aponta sempre na mesma diagonal — e é isso que produz a fita.

A conclusão que me custou a tarde: a degenerescência é da regra, não do código. Nenhum ajuste de implementação abre esse desenho, porque com apenas $\pm 90°$ e um sinal determinístico a caminhada não tem grau de liberdade para se espalhar.

O que abre a imagem

A propriedade (1) depende de o ângulo dividir 360° em quatro. Qualquer outro ângulo quebra a alternância de eixos e a faixa se solta. Com 20.000 passos:

ângulo bounding box distância final da origem
90° 69 × 69 79,9
60° 124 × 82 68,3
45° 88 × 118 30,0
120° 48 × 71 40,3

Vale trocar o ângulo no controle acima e ver a diferença — em 60° e 45° aparece a estrutura irregular que eu procurava desde o começo.

Se a intenção for manter os 90°, aí a mudança tem que ser na regra. A variante clássica é virar à esquerda nos primos e seguir reto nos compostos: assim os compostos deixam de fechar quadradinhos e passam a produzir os segmentos longos que dão forma ao desenho. É outra caminhada, mas é a que gera as imagens bonitas que circulam por aí.


educação

O caderno que responde

Desenvolvi um aplicativo para tablet chamado ManuScriptus — de manus (mão) e scriptus (escrita): o latim para aquilo que é escrito à mão. Ele é, na falta de nome melhor, um caderno que responde. Escrevo um problema de matemática à mão, com a caneta; ele lê a minha letra, entende, e responde na mesma página — também manuscrito, como se alguém resolvesse junto, por cima do meu ombro. No vídeo abaixo ele está trabalhando comigo em alguns temas de matemática.

Podia ter sido um chatbot comum. Você digita a pergunta, lê a resposta, copia. Seria mais fácil de construir e resolveria os mesmos problemas — quase. A diferença mora nesse "quase", e é toda a razão de o app existir.

O que a mão ensina ao cérebro

No começo de 2024, uma descoberta correu o noticiário de ciência: escrever à mão acende o cérebro de um jeito que digitar não acende. A origem foi um estudo norueguês (nas referências), mas o que interessa é o consenso que ele firmou na imprensa séria.

O Nexo Jornal resumiu o achado: segundo a neurocientista Audrey van der Meer, escrever à mão gera padrões de conectividade cerebral muito mais elaborados, pela formação cuidadosa de cada letra. A NBC News e a Science News apontaram o mecanismo: a escrita sincroniza ondas theta e alpha — as da memória — entre regiões distantes do cérebro, coesão que some ao teclar. Digitar é rápido demais: sem precisar planejar o traço de cada letra, a integração motora e sensorial despenca. Daí, como notou o NPR, quem anota uma aula à mão costuma lembrar mais do que quem digita.

E há o outro lado. Reportagens como as da National Geographic e do O Povo puxam o fio para a era das telas: digitação, corretor automático e a linguagem das redes trocam o esforço de formular por atalhos — e, numa geração criada no teclado, educadores notam mais dificuldade em sintetizar e estruturar um pensamento no papel. A lentidão da mão, que parecia um defeito a otimizar, era metade do aprendizado.

A virada

A ironia é esta: a mesma tecnologia acusada de atrofiar a escrita — a inteligência artificial — é a que, aqui, obriga a escrever à mão.

Num chatbot, o esforço é terceirizado dos dois lados. Você digita (não escreve) e lê uma resposta que muitas vezes copia (não sintetiza). O ManuScriptus inverte os dois. Para perguntar, você escreve à mão — com a lentidão que faz o cérebro trabalhar. Para receber, você uma resposta manuscrita, no ritmo de quem lê uma explicação, não de quem varre uma tela.

E há um detalhe de ritmo que é o coração da coisa: escrever e ler acontecem na velocidade do cérebro humano — o compasso em que a mão forma as ideias e os olhos as absorvem. Um chatbot atropela esse compasso: despeja-se a pergunta no teclado e recebe-se de volta um muro de texto que a vista percorre sem digerir. O ManuScriptus mantém os dois lados no tempo humano: pensa-se enquanto se escreve, assimila-se enquanto se lê. A IA é veloz por dentro — resolve derivadas, desenha gráficos —, mas se dobra ao ritmo de quem a usa, em vez de impor o dela.

Não é que a ferramenta seja boa ou má em si. O que importa é o esforço que ela pede de você. Um teclado pede pouco. Uma caneta pede exatamente o suficiente. Construir a IA em torno da caneta foi a forma de ficar com o tutor incansável e com o cérebro que a mão mantém aceso.


Referências

As reportagens acima se apoiam nestes estudos revisados por pares:


PSLE

PSLE 2022 Math Paper 2 Q14

In March 2026, Singapore's Minister of Education, Desmond Lee, walked into Parliament during the Ministry of Education budget debate carrying physical copies of a single math problem. He handed them out and asked his colleagues to solve it on the spot.

The problem was Question 14 from Paper 2 of the 2022 PSLE — the Primary School Leaving Examination, sat by twelve-year-olds. Lee's point was that questions famous for being "impossible" are in fact deliberately broken into parts that guide the student's reasoning. MP Lee Hui Ying joked on social media afterwards that her cortisol levels only dropped after she reached the correct answer of 32 cm.

The problem

The figure shows the amount of water in two rectangular containers, X and Y, at first.

Ray poured $\frac{1}{5}$ of the water from X into Y to fill it to the top, without overflowing.

(a) How much water was there in X at first? [2 marks]

(b) Ray then poured all the water from Y into X. $120\text{ cm}^3$ of water overflowed from X. What was the height of X? [3 marks]

Solution

Part (a)

The fraction of water transferred from X — a fifth of its original volume — is precisely the volume needed to fill the empty $8\text{ cm}$ at the top of Y:

$$\frac{V}{5} \;=\; 15 \times 12 \times 8 \;=\; 1440 \text{ cm}^3$$

Therefore:

$$V \;=\; 7200 \text{ cm}^3$$

That is how much water was in X to begin with.

Part (b)

After the first pour, X holds the remaining $\frac{4}{5}$ of its water:

$$\tfrac{4}{5} \times 7200 \;=\; 5760 \text{ cm}^3$$

When Y is full, it contains all $22\text{ cm}$ of water:

$$15 \times 12 \times 22 \;=\; 3960 \text{ cm}^3$$

Ray pours that $3960\text{ cm}^3$ back into X. Of that, $120\text{ cm}^3$ overflows, so the volume that actually fits inside X — added on top of the $5760\text{ cm}^3$ already there — is:

$$3960 - 120 \;=\; 3840 \text{ cm}^3$$

The full capacity of X is therefore:

$$5760 + 3840 \;=\; 9600 \text{ cm}^3$$

X has a $20 \times 15 = 300\text{ cm}^2$ base, so its height $h$ must satisfy:

$$300 \, h \;=\; 9600 \quad\Longrightarrow\quad h \;=\; 32 \text{ cm}$$

So container X is $\boxed{32\text{ cm}}$ tall — the answer that brought Parliament's cortisol levels back to normal.

Why this problem?

What makes Q14 quietly elegant is that neither part rewards memorisation. Part (a) hinges on noticing a single fact — one fifth of X exactly fills the empty space in Y — and turning that sentence into one equation. Part (b) asks the student to track three quantities (water still in X, water poured back from Y, water that overflows) and to realise that their sum is the capacity of X, not its current content.

That layered structure is exactly why Lee distributed the question to Parliament: a problem that looks impossible at a glance and turns out, on second reading, to be a sequence of small steps. Each step is easy. Putting them in the right order is the actual skill being tested.


programação

Mandala interativa controlada pela mão

Fiz um programa que desenha uma mandala generativa em tempo real, controlada pela sua mão na frente da webcam. Sem GPU dedicada, sem nada especial — só Python rodando no seu computador.

Como funciona

A câmera captura o vídeo da sua mão. Um modelo de visão computacional do Google (MediaPipe) detecta 21 pontos na mão em tempo real — ponta dos dedos, juntas, pulso. O programa usa esses pontos para três coisas:

  • Posição do centro da palma → move a mandala pela tela
  • Distância entre o polegar e o indicador (gesto de pinça) → controla o tamanho
  • Ângulo entre o pulso e o dedo médio → gira as camadas da mandala

A mandala tem quatro camadas concêntricas. As camadas pares giram em um sentido, as ímpares no sentido contrário — então quando você vira a palma, a mandala "abre" como um mecanismo. Quando você move a mão rápido, aparecem partículas coloridas voando ao redor.

Tem também um efeito de desfoque de fundo, igual ao do Zoom/Teams: o programa separa sua silhueta do fundo e borra só o fundo. Tudo calculado no processador, frame a frame.

Se você tiver duas mãos na frente da câmera, surgem duas mandalas independentes.

Controles pelo teclado

Tecla Função
1 a 5 Troca a paleta de cores (Terra, Âmbar, Oceano, Ametista, Névoa)
+ / - Aumenta ou diminui o número de pétalas
B Alterna o modo de mistura de cores (Normal ↔ Aditivo/neon)
C Liga/desliga a imagem da câmera no fundo
D Liga/desliga o desfoque de fundo
F Tela cheia
S Salva uma foto da tela
R Inicia/para gravação de vídeo (.mp4)
Q ou ESC Sai

No Windows, as teclas [ e ] também controlam o brilho da câmera.

Como rodar no seu computador

Você vai precisar de Python 3.11 e de uma webcam. O código está no GitHub com instruções completas de instalação para Windows, Linux e macOS, incluindo soluções para os erros mais comuns:

github.com/GianMira/mandala-interativa

git clone https://github.com/GianMira/mandala-interativa
cd mandala-interativa