Módulo parece a operação mais simples em programação — apenas o resto após a divisão — até que um número negativo apareça e sua linguagem discorde do próximo a ele. Esta calculadora mostra todas as respostas de uma vez para que você sempre saiba qual convenção está olhando e adiciona exponenciação modular para criptografia e casos de hash onde o módulo realmente ganha seu sustento.

O resto não é único – o quociente decide isso

A divisão de inteiros produz um quociente e um resto ligados por uma identidade: uma = q·n + r. O problema é que esta única equação tem mais de uma solução inteira quando os sinais são envolvidos. Determine como você arredonda o quociente e o resto segue automaticamente.

Arredonde o quociente para zero (divisão truncada) e o resto termina com o sinal do dividendo a. Arredonde-o em direção ao infinito negativo (divisão mínima) e o restante assume o sinal do divisor n. Insista que o resto seja não negativo e você obterá a convenção euclidiana usada em toda a matemática. Nada disso está “errado” – são três respostas internamente consistentes para uma pergunta genuinamente ambígua.

Por que JavaScript e Python discordam

-7 % 3 é -1 em JavaScript, C, C++, Java, Go e Rust, mas 2 em Python e Ruby. As linguagens da família C padronizaram a divisão truncada décadas atrás, então seu % mantém o sinal do dividendo. Os designers do Python escolheram a divisão por piso porque ela faz com que % se comporte bem para o uso real mais comum — agrupar um índice em um intervalo fixo — onde você quase sempre deseja um resultado não negativo.

Essa é uma fonte frequente de bugs ao portar código ou chamar além dos limites da linguagem. Um padrão como arr[i % len] é seguro em Python mesmo quando i é negativo, mas em JavaScript ele pode indexar com um número negativo. A solução portátil é forçar o resultado euclidiano explicitamente: ((i % len) + len) % len.

Onde o módulo realmente importa: relógios, hashing e criptografia

Matemática abrangente. Relógios (mod 12 ou 24), dias da semana (mod 7) e ângulos (mod 360) são todos módulos euclidianos. Qualquer coisa que circule é um módulo disfarçado.

Hashing e balanceamento de carga. As tabelas hash colocam uma chave no bucket hash(key) mod numBuckets. Como os hashes são frequentemente assinados, é exatamente aqui que o bug do resto negativo aparece - e por que a convenção euclidiana é o que você deseja para um índice de bucket válido.

Criptografia. RSA e Diffie-Hellman são construídos em exponencialização modular: elevar um número a um grande módulo de potência um grande número. Calcular a potência diretamente é impossível (os valores intermediários teriam astronomicamente muitos dígitos), então o método rápido de quadrado e multiplicação reduz o módulo m após cada etapa. A guia Exponenciação Modular nesta calculadora executa esse algoritmo exato no BigInt.