Modulo scheint die einfachste Operation in der Programmierung zu sein – nur der Rest nach der Division – bis eine negative Zahl auftaucht und Ihre Sprache mit der daneben stehenden Zahl nicht übereinstimmt. Dieser Rechner zeigt jede Antwort auf einmal an, sodass Sie immer wissen, welche Konvention Sie betrachten, und fügt modulare Potenzierung für die Kryptographie- und Hashing-Fälle hinzu, in denen Modulo wirklich seinen Unterhalt verdient.

Der Rest ist nicht eindeutig – der Quotient entscheidet darüber

Division ganzer Zahlen erzeugt einen Quotienten und einen Rest, die durch eine Identität verknüpft sind: a = q·n + r. Der Haken ist, dass diese einzelne Gleichung mehr als eine ganzzahlige Lösung hat, sobald Vorzeichen involviert sind. Legen Sie fest, wie Sie den Quotienten runden und der Rest folgt automatisch.

Runden Sie den Quotienten gegen Null (abgeschnittene Division) und der Rest erhält am Ende das Vorzeichen des Dividenden a. Runden Sie es in Richtung negative Unendlichkeit (Division mit Boden), und der Rest erhält das Vorzeichen des Divisors n. Bestehen Sie darauf, dass der Rest nicht negativ ist, und Sie erhalten die euklidische Konvention, die in der gesamten Mathematik verwendet wird. Nichts davon ist „falsch“ – es handelt sich um drei in sich konsistente Antworten auf eine wirklich zweideutige Frage.

Warum JavaScript und Python unterschiedlicher Meinung sind

-7 % 3 ist -1 in JavaScript, C, C++, Java, Go und Rust, aber 2 in Python und Ruby. Die Sprachen der C-Familie haben vor Jahrzehnten die verkürzte Division standardisiert, sodass ihr % das Vorzeichen des Dividenden behält. Die Designer von Python haben sich für die Floored-Division entschieden, weil sich % dadurch gut für die häufigste reale Verwendung verhält – das Einschließen eines Index in einen festen Bereich –, bei dem Sie fast immer ein nicht negatives Ergebnis wünschen.

Dies ist eine häufige Fehlerquelle beim Portieren von Code oder Aufrufen über Sprachgrenzen hinweg. Ein Muster wie arr[i % len] ist in Python auch dann sicher, wenn i negativ ist, aber in JavaScript kann es mit einer negativen Zahl indizieren. Die portable Lösung besteht darin, das euklidische Ergebnis explizit zu erzwingen: ((i % len) + len) % len.

Wo Modulo tatsächlich wichtig ist: Uhren, Hashing und Krypto

Umfassende Mathematik. Uhren (Mod 12 oder 24), Wochentage (Mod 7) und Winkel (Mod 360) sind alle euklidisches Modulo. Alles, was zyklisch läuft, ist ein getarntes Modulo.

Hashing und Lastausgleich. Hash-Tabellen platzieren einen Schlüssel im Bucket hash(key) mod numBuckets. Da Hashes häufig signiert werden, liegt genau hier der Fehler beim negativen Rest – und warum Sie für einen gültigen Bucket-Index die Euklidische Konvention benötigen.

Kryptographie. RSA und Diffie-Hellman basieren auf modularer Potenzierung: Erhöhen einer Zahl auf eine große Potenz modulo einer großen Zahl. Eine direkte Berechnung der Potenz ist nicht möglich (die Zwischenwerte hätten astronomisch viele Stellen), daher reduziert die schnelle Quadrat-und-Multiplikations-Methode Modulo m nach jedem Schritt. Die Registerkarte „Modulare Potenzierung“ in diesem Rechner führt genau diesen Algorithmus über BigInt aus.