Imperdível para amantes da matemática! 10 belas fórmulas úteis para programação
A programação e a matemática podem, à primeira vista, parecer campos completamente diferentes. A programação é o trabalho lógico e concreto de escrever códigos, enquanto a matemática é a disciplina acadêmica que busca verdades abstratas e universais. No entanto, a matemática está sempre presente na base da ciência da computação. Na otimização de algoritmos, ciência de dados, aprendizado de máquina, computação gráfica, e até mesmo nos bastidores de aplicativos cotidianos, belas fórmulas matemáticas trabalham de forma silenciosa e poderosa.
Neste artigo, selecionamos 10 fórmulas que não são apenas matematicamente belas, mas que também desempenham papéis muito práticos e importantes no contexto da programação e dos algoritmos. Exploraremos a fundo o contexto matemático de cada fórmula e explicaremos detalhadamente, juntamente com trechos de código concretos em Python e C++, como elas são aplicadas no dia a dia da programação.
Bem-vindo ao mundo onde a beleza da matemática e a praticidade da programação se encontram.
1. Identidade de Euler (Euler’s Identity)
A beleza e visão geral da fórmula
Esta é a identidade de Euler, aclamada como “o tesouro da humanidade” e “a fórmula mais bela do mundo”. As cinco constantes mais importantes da matemática (o número de Euler $e$, a unidade imaginária $i$, a constante pi $\pi$, o elemento neutro da multiplicação $1$ e o elemento neutro da adição $0$) estão integradas em uma única e simples equação.
$$ e^{i\pi} + 1 = 0 $$Esta igualdade é derivada substituindo $\theta = \pi$ na fórmula mais geral de Euler $e^{i\theta} = \cos\theta + i\sin\theta$.
Aplicações na programação
Na programação, especialmente na computação gráfica e no desenvolvimento de jogos, a fórmula de Euler é uma ferramenta extremamente poderosa para lidar com “rotações”. A rotação de pontos em um espaço 2D pode ser feita com cálculos de matrizes, mas o uso de números complexos torna os cálculos extremamente simples e intuitivos. As rotações no plano complexo podem ser realizadas apenas multiplicando por $e^{i\theta}$, o que torna o código conciso.
Exemplo de implementação (C++)
Abaixo está um programa que rotaciona um ponto em coordenadas bidimensionais por um ângulo especificado (radianos) usando a biblioteca padrão do C++ <complex>.
| |
Explicação detalhada: A vantagem dessa abordagem está no fato de que o cálculo da matriz de rotação (4 multiplicações e 2 adições) pode ser encapsulado como uma operação de números complexos. Além disso, no espaço 3D, utiliza-se uma expansão desse conceito, os “quatérnions (quaternions)”. Ao usar quatérnions, é possível evitar o problema fatal conhecido como “Gimbal Lock”, que ocorre nos ângulos de Euler, e alcançar uma interpolação linear esférica suave (Slerp).
2. Série de Taylor (Taylor Series)
A beleza e visão geral da fórmula
A série de Taylor é uma técnica matemática que expressa funções complexas (como funções trigonométricas e exponenciais) como a soma infinita de polinômios. A série de Taylor de uma função $f(x)$ em torno de um ponto $a$ é definida da seguinte forma:
$$ f(x) = \sum_{n=0}^\infty \frac{f^{(n)}(a)}{n!}(x-a)^n $$Especialmente quando $a=0$, ela é chamada de “Série de Maclaurin”.
Aplicações na programação
Computadores (CPUs e FPUs) só podem, essencialmente, executar operações aritméticas básicas como adição, subtração, multiplicação e divisão. Então, como sin(x) e exp(x) são calculados? Nos processadores modernos, o algoritmo CORDIC ou a aproximação de Chebyshev são frequentemente usados, mas a série de Taylor (ou suas variantes) é diretamente útil ao implementar funções matemáticas em nível de software, ou ao criar funções de aproximação de alta velocidade onde a precisão é ligeiramente sacrificada em prol do desempenho.
Exemplo de implementação (Python)
Abaixo está um código Python que calcula a aproximação da função seno usando a série de Maclaurin.
$$ \sin(x) \approx x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \dots $$ | |
Explicação detalhada:
No código acima, o valor de entrada x é normalizado no intervalo $[-\pi, \pi]$. Isso ocorre porque a série de Taylor tem a propriedade de que o erro cresce rapidamente à medida que nos afastamos do centro da expansão (neste caso, 0), o que é chamado de erro de truncamento. Uma vez que cálculos infinitos são impossíveis em programação, o cálculo é interrompido com um número finito de terms. Gerenciar o compromisso (trade-off) entre o “erro de arredondamento” e o “erro de truncamento” causados por isso é a chave da programação numérica.
3. Teorema de Bayes (Bayes’ Theorem)
A beleza e visão geral da fórmula
O teorema de Bayes é um teorema para atualizar a probabilidade de um evento (probabilidade a posteriori) com base no conhecimento prévio (probabilidade a priori) relacionado a esse evento. É uma das fórmulas mais importantes na teoria das probabilidades e na estatística.
$$ P(A|B) = \frac{P(B|A)P(A)}{P(B)} $$Aqui, $P(A|B)$ representa a probabilidade de que o evento A ocorra dada a condição de que o evento B ocorreu (probabilidade a posteriori).
Aplicações na programação
É amplamente utilizado nas áreas de machine learning e ciência de dados como o “Classificador Naive Bayes (Naive Bayes Classifier)”. Um exemplo representativo de sua aplicação é a filtragem de e-mails de spam. “Qual é a probabilidade deste e-mail ser um spam se contiver a palavra ‘grátis’?” Esse tipo de cálculo é feito dinamicamente com base em dados passados.
Exemplo de implementação (Python)
Código que mostra a lógica básica de um filtro de spam.
| |
Explicação detalhada:
Na implementação real (Classificador Naive Bayes), as probabilidades de várias palavras são multiplicadas em conjunto. No entanto, se você multiplicar milhares de probabilidades (valores de 0 a 1), o valor se tornará zero devido aos limites da representação de ponto flutuante do computador (underflow). Portanto, na programação no mundo real, a técnica de converter os produtos de probabilidade em “somas de logaritmos” (log(a * b) = log(a) + log(b)) é usada como uma técnica essencial.
4. Entropia de Shannon (Shannon Entropy)
A beleza e visão geral da fórmula
A “entropia”, definida por Claude Shannon, o pai da teoria da informação, é uma fórmula que quantifica a “incerteza”, “desordem” ou a “quantidade média de informação” contida em uma fonte de informação.
$$ H(X) = - \sum_{i=1}^n P(x_i) \log_2 P(x_i) $$Aplicações na programação
A entropia é indispensável para algoritmos de compressão de dados (como os limites teóricos da codificação Huffman ou algoritmos de compressão ZIP), na avaliação da força de números aleatórios na teoria da criptografia e no algoritmo das “Árvores de Decisão” (Decision Trees, como ID3 e C4.5) no machine learning. Na construção de árvores de decisão, procura-se a característica (feature) que maximize a redução de entropia (Ganho de Informação - Information Gain) quando os dados são divididos.
Exemplo de implementação (Python)
Uma função que calcula a entropia de uma string (conjunto de dados) e avalia a quantidade de informação.
| |
Explicação detalhada:
A unidade da entropia é o “bit” (bits). Se a entropia for 1.5, significa que, em média, você precisará de pelo menos 1,5 bits por elemento para representar esses dados. Na área da programação, ela é rotineiramente calculada como um referencial para testar a eficiência de algoritmos de compressão e como um indicador fundamental na seleção de características (feature selection) de modelos de aprendizado de máquina.
5. Transformada Rápida de Fourier (Fast Fourier Transform - FFT)
A beleza e visão geral da fórmula
A Transformada Discreta de Fourier (DFT) transforma sinais no domínio do tempo para o domínio da frequência. Sua equação matemática é a seguinte:
$$ X_k = \sum_{n=0}^{N-1} x_n e^{-i 2\pi k n / N} $$Se calcularmos a DFT de forma ingênua, a complexidade de tempo será $O(N^2)$, tornando o cálculo explosivamente lento à medida que a quantidade de dados aumenta. O algoritmo que acelera isso drasticamente para $O(N \log N)$ através da técnica “dividir para conquistar” (divide and conquer) é a “Transformada Rápida de Fourier (FFT)”. É considerado um dos 10 algoritmos mais importantes do século 20.
Aplicações na programação
A FFT é uma tecnologia essencial que sustenta a sociedade moderna. Desde o reconhecimento de voz (Siri e Alexa), compressão de dados MP3 ou JPEG/MPEG, comunicações digitais como LTE e Wi-Fi, até mesmo a multiplicação de números inteiros gigantescos (algoritmo de Schönhage-Strassen), a FFT está trabalhando ativamente em todo lugar.
Exemplo de implementação (Python)
Este é um exemplo de implementação simples do algoritmo recursivo de Cooley-Tukey. (※ Na prática, são usadas bibliotecas extremamente otimizadas em C ou Assembly como FFTW ou numpy.fft)
| |
Explicação detalhada: O núcleo deste algoritmo reside na utilização da simetria e da periodicidade dos números complexos, conhecidos como “Fatores de Rotação (Twiddle factors)”. Ao fazer isso, o desperdício de realizar cálculos duplicados é eliminado, reduzindo as operações necessárias para $N=1024$ de $1.048.576$ para apenas cerca de $10.240$. Isso pode realmente ser chamado de um milagre criado pela fusão da matemática com algoritmos.
6. Fórmula de Haversine (Haversine Formula)
A beleza e visão geral da fórmula
É a fórmula usada para calcular a distância mais curta (distância do círculo máximo) entre dois pontos na superfície de uma esfera, como a Terra.
$$ a = \sin^2\left(\frac{\Delta\phi}{2}\right) + \cos\phi_1 \cos\phi_2 \sin^2\left(\frac{\Delta\lambda}{2}\right) $$ $$ c = 2\cdot \text{atan2}\left(\sqrt{a}, \sqrt{1-a}\right) $$ $$ d = R \cdot c $$(Aqui, $\phi$ é a latitude, $\lambda$ é a longitude e $R$ é o raio da Terra)
Aplicações na programação
É uma fórmula essencial ao calcular a distância entre duas coordenadas de latitude e longitude em aplicativos de rastreamento por GPS ou serviços baseados em localização, como Uber ou Pokémon GO. No cálculo da distância em linha reta usando o teorema de Pitágoras, a curvatura da Terra não é levada em consideração, causando grandes erros em longas distâncias.
Exemplo de implementação (Python)
Uma função que recebe duas coordenadas (latitude, longitude) e retorna a distância (em quilômetros) entre elas.
| |
Explicação detalhada:
Também é possível usar a lei dos cossenos da trigonometria esférica, mas quando a distância entre dois pontos é muito curta (por exemplo, alguns metros), há uma tendência a ocorrer “cancelamento catastrófico (catastrophic cancellation)” na precisão do cálculo de ponto flutuante. A fórmula de Haversine utiliza sin^2, proporcionando a enorme vantagem computacional de permitir cálculos numericamente estáveis até mesmo para distâncias diminutas. Se uma precisão ainda maior for necessária, as fórmulas de Vincenty (Vincenty’s formulae), que tratam a Terra como um elipsoide, são utilizadas.
7. Método de Newton-Raphson (Newton-Raphson Method)
A beleza e visão geral da fórmula
É um algoritmo de busca de raízes incrivelmente poderoso para encontrar recursivamente as soluções (raízes) de equações da forma $f(x) = 0$ usando a reta tangente.
$$ x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} $$Utilizando o valor da função na posição atual $f(x_n)$ e a sua inclinação (derivada) $f'(x_n)$, tenta-se deduzir e encontrar a posição mais precisa seguinte $x_{n+1}$ a ser explorada.
Aplicações na programação
É usado em renderização de engines gráficas, detecção de colisões em simulações de física e problemas de otimização. Em particular, um marco notável foi o hack “Fast Inverse Square Root” embutido no código fonte do lendário jogo de FPS “Quake III Arena”. Era um hack genial onde se aplicava o método de Newton apenas uma vez para calcular a velocidade alucinante de $1/\sqrt{x}$, sendo essencial para normalizações vetoriais.
Exemplo de implementação (C++)
Como exemplo claro, mostramos a forma de calcular a raiz quadrada padrão $\sqrt{N}$ (ou seja, a solução para $x^2 - N = 0$) utilizando o método de Newton. Neste cenário, as funções utilizadas são $f(x) = x^2 - N$ e $f'(x) = 2x$.
| |
Explicação detalhada:
O maior atrativo do método de Newton é que, se as condições forem atendidas, ele atinge “convergência quadrática (Quadratic convergence)”. Isso significa uma velocidade assombrosa em que o número de dígitos corretos dobra a cada iteração executada. Considerando que a busca binária (binary search) possui apenas convergência linear, é possível entender quão formidável é a utilização da informação sobre a inclinação (a derivada). O hack usado em “Quake III” providenciava esse valor inicial da estimativa para o método de Newton com incrível precisão por meio da exploração da estrutura de ponto flutuante IEEE 754 e de um número mágico (magic number), o 0x5f3759df.
8. Curvas de Bézier (Bézier Curves)
A beleza e visão geral da fórmula
Trata-se de uma equação paramétrica que define uma curva suave usando múltiplos Pontos de Controle (Control Points). A curva de Bézier cúbica (Cubic Bézier Curve) mais comumente utilizada possui 4 pontos: $P_0, P_1, P_2, P_3$, com as coordenadas da curva $B(t)$ determinadas por um parâmetro iterativo $t \ (0 \le t \le 1)$.
$$ B(t) = (1-t)^3 P_0 + 3(1-t)^2 t P_1 + 3(1-t) t^2 P_2 + t^3 P_3 $$Aplicações na programação
A curva de Bézier está no cerne da computação gráfica. Ela é utilizada em ferramentas de desenho vetorial como o Adobe Illustrator, na renderização de fontes (TrueType e OpenType), nas funções de easing (abrandamento) de animações e transições no CSS (cubic-bezier()), no controle da trajetória de câmeras dentro de jogos e em praticamente qualquer ocasião onde “formas ou movimentos suaves” precisam ser desenhados via código.
Exemplo de implementação (Python)
Aqui está um código que gera um conjunto de coordenadas ao longo de uma curva de Bézier cúbica a partir de 4 pontos de controle.
| |
Explicação detalhada: Esta equação matemática é a aplicação direta e expansão matemática do “Algoritmo de De Casteljau”, que utiliza a interpolação linear (Lerp: Linear Interpolation) recursivamente, providenciando a resposta diretamente usando equações polinomiais (polinômios de Bernstein). Na programação, as curvas são exibidas visualmente desenhadas na tela através da aproximação agrupada de incontáveis “minúsculas linhas retas”. Devido a este fato, ao gerenciar a resolução $t$ (ajustando o valor de ‘steps’), controlamos o equilíbrio prático entre a qualidade visual da renderização e a performance computacional.
9. Função Sigmoide (Sigmoid Function)
A beleza e visão geral da fórmula
É uma função de curva em “S” incrivelmente suave, que recebe qualquer entrada numérica real $x \ ( -\infty < x < \infty )$ e a comprime (squeeze) perfeitamente para resultar em um valor entre $0$ e $1$.
$$ \sigma(x) = \frac{1}{1 + e^{-x}} $$Aplicações na programação
Historicamente, ela desempenhou um papel vital como “Função de Ativação” (Activation Function) na regressão logística e em redes neurais (deep learning). A sua maior vantagem é converter valores para a faixa restrita entre 0 e 1, permitindo que os resultados finais sejam naturalmente interpretados como “probabilidades”.
Exemplo de implementação (Python)
Aqui está um código que demonstra a aplicação da função sigmoide a um array (tensor) de entrada.
| |
Explicação detalhada:
O motivo de criarmos uma ramificação condicional separando o caso x >= 0 dos demais no código é para prevenir ativamente restrições programacionais temidas como os erros numéricos de limite (“overflows”). Por exemplo, para um $x = -1000$, o programa precisaria processar $e^{1000}$, ocorrendo o risco da execução travar (crash) ou retornar Inf. Atualmente no deep learning, com o objetivo de acelerar cálculos nas camadas ocultas e escapar de desaparecimentos do gradiente, a função ativadora dominante é a ReLU ($f(x) = \max(0, x)$). Entretanto, a função sigmoide continua garantindo sua liderança imortal providenciando as regras finais nas camadas de saída para cenários de classificação binária.
10. Distância Euclidiana e Teorema de Pitágoras (Euclidean Distance & Pythagorean Theorem)
A beleza e visão geral da fórmula
Tendo as suas origens baseadas na Grécia antiga, é a fórmula geométrica clássica que define a medição da distância da linha reta exata calculada entre dois pontos em qualquer espaço de dimensão $n$. Quando no espaço 2D, ela trata-se rigorosamente do mundialmente prestigiado “Teorema de Pitágoras” ($a^2 + b^2 = c^2$).
Em um espaço 3D, a “Distância Euclidiana $d$” estabelecida entre o ponto $P(x_1, y_1, z_1)$ e $Q(x_2, y_2, z_2)$ é maravilhosamente descrita matematicamente na seguinte equação:
$$ d = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2 + (z_2-z_1)^2} $$Aplicações na programação
É o coração que alimenta praticamente todo motor básico nas modelagens matemáticas, física de jogos e processos essenciais fundamentais dentro de machine learning, fornecendo base ao algoritmo de agrupamento (K-Means) ou aos modelos classificadores “K-Vizinhos Mais Próximos” (K-Nearest Neighbors / KNN). Na área gráfica focada ao desenvolvimento de jogos, ela lidera as diretrizes computando o detetamento ativo de contato (colisões) entre estruturas, como esferas ou círculos delimitadores de limite (“Bounding Circle / Sphere Collision”), que muitas vezes ocorrem repetitivamente processados de modo insano aos milhões a cada quadro de exibição atualizado (frame).
Exemplo de implementação (C++)
Abaixo está uma estrutura algorítmica incrivelmente otimizada em C++ destinada a determinar se ocorre alguma colisão exata baseada na intersecção entre as áreas delimitadoras circulares (ou esferas).
| |
Explicação detalhada:
Se o processamento fosse construído literalmente ao pé da letra acadêmico equacionando a avaliação da fórmula clássica, resultaria no encargo de extrair imperiosamente a “raiz quadrada ($\sqrt{\cdot}$ / sqrt())” no término dos cálculos numéricos envolvidos. Entretanto, na programação da engenharia, chamadas frequentes solicitando essa rotina “Extratora de raízes sqrt()” infligem e geram exigências brutais pesadas na performance dos processamentos de CPUs. Considerando isso, quando o alvo analítico prático do processamento estipulado destina-se puramente à checagem e verificação comparativa (para resolver se é simplesmente menor ou não), existe um padrão brilhante consagrado entre desenvolvedores de motores lógicos computacionais de jogos focando em manter propositalmente e operando comparativamente a formatação inalterada aos valores na matriz “em sua base de forma elevada ao Quadrado”, resultando maravilhosamente na regra equacionada de distanceSquared <= radiiSumSquared. Empregar e desfrutar do vasto arsenal de maravilhosas manipulações provenientes e fundamentadas magicamente com diretrizes matemáticas exatas operacionais para aniquilar as cargas de desempenho pesadas nas equações providencia a evidência do encanto genial no processo por trás das criações no glorioso ofício construtor ao desenvolvimento nas arquiteturas aos arranjos algorítmicos.
Resumo
O que você achou de todas estas esplêndidas fórmulas? Como pôde visualizar brilhantemente e maravilhosamente, desde a identidade de Euler até o admirável Teorema de Pitágoras, todo esse seleto elenco matemático formidável jamais foi constituído limitadamente para decorar abstratamente manuais teóricos estáticos e inativos nos cantos e prateleiras das velhas bibliotecas acadêmicas. Eles funcionam dinamicamente por trás de toda e qualquer tela nas linguagens codificadas invisíveis para computar compressões, instigar predições dinâmicas ativas interativamente em models de machine learning providenciando inteligência maravilhosa formidável, renderizando sedosas imagens polidas animadas interativamente, transformando-os no grande coração poderoso imortal girando engrenagens pulsando infinitamente nos bastidores de maravilhosos cálculos computacionais rotineiramente processados.
Adentrar nas ricas teorias de base referencial equacionada fundamentadas nelas se mostra extremamente indispensável e formidável a capacitar codificadores simplórios limitados (Aqueles condicionados tristemente e cegamente ao importar pacotes de matriz com a submissão cega de módulos de terceiros sem raciocínio, ex.: math.sin ou bibliotecas numpy.fft) para ascendê-los ao seleto nível de supremos e geniais engenheiros experientes providenciando o poder total operando magistralmente limites super potentes em hardware. Na próxima oportunidade, divirta-se criando rotinas no código providenciando à tela maravilhosas formas, expanda suas perspectivas, maravilhe-se visualizando qual brilhante matriz equacionada e fórmula puramente sublime bate poderosa por trás desse texto invisivelmente dando poder à estrutura.
Happy Coding and Math!
