Die Vorzeichenkonventionen verstehen
Sind beide Zahlen positiv, so liefern die beiden Konventionen identische Ergebnisse; sobald ein negativer Wert beteiligt ist, laufen sie hingegen auseinander, wie die folgende Übersicht zeigt.
| a | b | Abrundendes Ergebnis (Vorzeichen von b) | Abschneidendes Ergebnis (Vorzeichen von a) |
|---|---|---|---|
| 13 | 5 | 3 | 3 (gleich — beide positiv) |
| −13 | 5 | 2 | −3 |
| 13 | −5 | −2 | 3 |
| −13 | −5 | −3 | −3 (gleich — beide negativ) |
- Das abrundende Modulo, das hier als primäres Ergebnis ausgewiesen wird, ist die in der reinen Mathematik und der Zahlentheorie gebräuchlichste Konvention und entspricht dem eingebauten Operator % in Python.
- Das abschneidende Modulo, das als sekundäres Ergebnis erscheint, entspricht dem eingebauten Operator % in JavaScript, C, C++, Java und den meisten Sprachen der C-Familie, in denen das Vorzeichen des Restes dem Dividenden folgt.
- Modulo durch null ist nicht definiert und wird von diesem Rechner nicht ausgeführt; der Divisor muss von null verschieden sein.
Was ist die Modulo-Operation?
Die Modulo-Operation, geschrieben a mod b (oder a % b), liefert den Rest der Division von a durch b. So gilt etwa 13 mod 5 = 3, da 13 = 2 × 5 + 3 ist — die Division von 13 durch 5 ergibt den Quotienten 2 und den Rest 3. Modulo ist grundlegend für die Zahlentheorie (modulare Arithmetik bzw. Restklassenrechnung), die Informatik (Hashing, zyklische Indizierung, Prüfsummen) und den alltäglichen Umgang mit Resten und Zyklen (etwa Wochentage oder Uhrzeiten).
Für das Vorzeichen des Ergebnisses bei negativen Zahlen sind zwei mathematische Konventionen verbreitet: das abrundende Modulo, bei dem das Ergebnis stets dasselbe Vorzeichen wie der Divisor b trägt, und das abschneidende Modulo, bei dem das Ergebnis stets dasselbe Vorzeichen wie der Dividend a trägt. Beide sind mathematisch gültige Definitionen des Restes und stimmen genau dann überein, wenn a und b beide positiv sind; sie laufen erst auseinander, sobald ein negativer Wert beteiligt ist.
Die Wahl der Konvention ist praktisch bedeutsam, da verschiedene Programmiersprachen unterschiedliche Voreinstellungen umsetzen: Der Operator % in Python arbeitet abrundend, während JavaScript, C, C++, Java und die meisten Sprachen der C-Familie abschneidend arbeiten und damit dem Vorzeichen des Dividenden folgen. Dieser Rechner weist beide Ergebnisse ausdrücklich aus, sodass sich jede Konvention unmittelbar ablesen lässt.
So verwenden Sie diesen Modulo-Rechner
- Geben Sie den Dividenden (a) ein — die Zahl, die geteilt wird.
- Geben Sie den Divisor (b) ein — die Zahl, durch die geteilt wird. Der Divisor darf nicht 0 sein, da Division und damit auch Modulo durch null nicht definiert sind.
- Lesen Sie das Ergebnis der abrundenden Konvention ab (Vorzeichen stets wie beim Divisor) — die in der Zahlentheorie gebräuchlichste mathematische Konvention.
- Vergleichen Sie es mit dem Ergebnis der abschneidenden Konvention (Vorzeichen stets wie beim Dividenden), wenn Sie den eingebauten Operator % einer bestimmten Programmiersprache nachbilden möchten, und prüfen Sie den Quotienten sowie die vollständige Divisionsgleichung für eine ausführliche Aufschlüsselung.
Die Formeln des abrundenden und des abschneidenden Modulo
Das abrundende Modulo definiert den Quotienten als q = ⌊a ÷ b⌋ (abgerundet in Richtung minus unendlich) und anschließend r = a − b×q. Dadurch trägt der Rest r stets dasselbe Vorzeichen wie der Divisor b (oder ist 0), und für b > 0 gilt 0 ≤ r < |b|. Rechenbeispiel: 13 mod 5: q = ⌊13/5⌋ = 2, r = 13 − 5×2 = 3.
Rechenbeispiel mit negativem Dividenden: −13 mod 5 (abrundend): q = ⌊−13/5⌋ = ⌊−2,6⌋ = −3, r = −13 − 5×(−3) = −13 + 15 = 2. Das Ergebnis ist positiv und folgt damit dem positiven Divisor, was sich vom abschneidenden Ergebnis weiter unten unterscheidet.
Das abschneidende Modulo rundet den Quotienten nicht in Richtung minus unendlich, sondern in Richtung null und bestimmt den Rest anschließend auf gleiche Weise; dadurch trägt der Rest stets dasselbe Vorzeichen wie der Dividend a (oder ist 0). Rechenbeispiel: −13 mod 5 (abschneidend, das Ergebnis von % in JavaScript, C und Java): Der Quotient wird von −2,6 in Richtung null auf −2 gerundet, sodass r = −13 − 5×(−2) = −13 + 10 = −3 folgt — negativ wie der Dividend und damit anders als das abrundende Ergebnis von +2 bei denselben Eingaben.
Häufige Fehler
- Annehmen, alle Programmiersprachen berechneten a mod b bei negativen Zahlen gleich — JavaScript, C, C++ und Java arbeiten abschneidend, während Python und viele Mathematiklehrbücher abrundend arbeiten, sodass die Ergebnisse bei negativem a auseinandergehen.
- Vergessen, dass das abrundende Ergebnis das Vorzeichen des Divisors trägt und nicht das des Dividenden — genau umgekehrt zur abschneidenden Konvention nach JavaScript-Art.
- a mod 0 berechnen wollen — die Modulo-Operation ist ebenso wie die Division nicht definiert, wenn der Divisor null ist.
- Nicht ganzzahlige Eingaben verwenden und dabei eine Restklassenarithmetik wie bei ganzen Zahlen erwarten — dieser Rechner nimmt reelle Zahlen entgegen und wendet dieselbe Abrundungs- bzw. Abschneidelogik an, doch viele klassische Eigenschaften der modularen Arithmetik (etwa die Uhrzeitrechnung) sind eigens für ganze Zahlen definiert.
Häufig gestellte Fragen
Worin unterscheiden sich das abrundende und das abschneidende Modulo?
Das abrundende Modulo rundet den Quotienten in Richtung minus unendlich, weshalb der Rest stets dasselbe Vorzeichen wie der Divisor trägt. Das abschneidende Modulo rundet den Quotienten in Richtung null, weshalb der Rest stets dasselbe Vorzeichen wie der Dividend trägt. Bei zwei positiven Zahlen stimmen beide überein, bei einem negativen Wert unterscheiden sie sich — so ergibt −13 mod 5 abrundend 2, abschneidend hingegen −3.
Warum liefert −13 mod 5 in verschiedenen Rechnern verschiedene Ergebnisse?
Das hängt von der verwendeten Vorzeichenkonvention ab. Das abrundende Modulo ergibt 2 (das Ergebnis folgt dem positiven Divisor und erfüllt 0 ≤ r < 5). Das abschneidende Modulo ergibt −3 (das Ergebnis folgt dem negativen Dividenden). Der Operator % liefert in Python 2 (abrundend), in JavaScript, C und Java hingegen −3 (abschneidend). Keine der beiden Varianten ist richtiger als die andere — es handelt sich um zwei verschiedene, gleichermaßen gültige mathematische Definitionen.
Wie berechnet man a mod b von Hand?
Man teilt a durch b, rundet den Quotienten gemäß der gewählten Konvention (abwärts beim abrundenden, in Richtung null beim abschneidenden Verfahren) und subtrahiert anschließend b mal diesen gerundeten Quotienten von a: Rest = a − b × Quotient. Für 13 mod 5 gilt: 13 ÷ 5 = 2,6, was in beiden Konventionen den Quotienten 2 ergibt, also Rest = 13 − 5×2 = 3.
Was bedeutet mod in der modularen Arithmetik und der Uhrzeitrechnung?
Die modulare Arithmetik behandelt Zahlen so, als würden sie beim Erreichen des Moduls wieder von vorn beginnen — das klassische Beispiel ist das Zifferblatt einer Uhr, bei dem die Zeit mod 12 (oder mod 24 bei 24-Stunden-Zählung) gerechnet wird. So entspricht 15 Uhr in der 24-Stunden-Zählung wegen 15 mod 12 = 3 der Stelle 3 auf dem Zwölf-Stunden-Zifferblatt. Modulo ist genau die Operation, die diesen umlaufenden Rest liefert.
Darf der Divisor beim Modulo negativ sein?
Ja. Nach der abrundenden Konvention liefert a mod b bei negativem b einen Rest mit demselben Vorzeichen wie b — so gilt etwa 13 mod −5 = −2, da 13 = (−3)×(−5) + (−2) ist. Nach der abschneidenden Konvention folgt der Rest hingegen dem Vorzeichen des Dividenden: 13 mod −5 = 3, da der Quotient in Richtung null auf −2 gerundet wird und sich 13 − (−5)×(−2) = 13 − 10 = 3 ergibt.
Quellenangaben
- Rosen KH. Elementary Number Theory and Its Applications. 6th ed. Pearson, 2010. (Division algorithm and modular arithmetic.)
- Leijen D. Division and Modulus for Computer Scientists. Utrecht University Technical Report UU-CS-2001-20, 2001. (Formal comparison of flooring, truncating and Euclidean division conventions.)
- ECMA International. ECMA-262: ECMAScript Language Specification — the remainder operator (%). ecma-international.org.