„Division mit Rest“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Keine Bearbeitungszusammenfassung
Tabelle mit Rest/Modulo Operatoren, aus der englischen Wikipedia
Zeile 6: Zeile 6:


== Natürliche Zahlen ==
== Natürliche Zahlen ==
{| class="wikitable" style="float:right; margin-left:1em; margin-right:0; width:30%;"
|+ Operatoren für den Rest einer ganzzahlige Division in verschiedenen Programmiersprachen
|-
! Programmiersprache
! Operator
! abbr="Sign" | Das Ergebnis hat dasselbe Vorzeichen wie
|-
| [[ActionScript]] || <tt>%</tt> || Dividend
|-
| rowspan="2" | [[Ada (Programmiersprache)|Ada]]
| <tt>mod</tt> || Divisor
|-
| <tt>rem</tt> || Dividend
|-
| [[Active Server Pages|ASP]] || <tt>Mod</tt> || Nicht definiert
|-
| [[Algol 68]] || <tt>%×</tt> || Immer positiv
|-
| [[AMPL]] || <tt>mod</tt> || Dividend
|-
| [[AppleScript]] || <tt>mod</tt> || Dividend
|-
| [[BASIC]] || <tt>Mod</tt> || Nicht definiert
|-
| [[Basic Calculator|bc]] || <tt>%</tt> || Dividend
|-
| [[Bourne-again shell|bash]] || <tt>%</tt> || Dividend
|-
| [[C (Programmiersprache)|C]] (ISO 1990) || <tt>%</tt> || Implementierungsabhängig
|-
| [[Varianten_der_Programmiersprache_C#C99|C (ISO 1999)]] || <tt>%</tt> || Dividend<ref name="C99">http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf, section 6.5.5</ref>
|-
| [[C++]] (ISO 1998) || <tt>%</tt> || Implementierungsabhängig<ref>{{cite journal|title=ISO/IEC 14882:2003 : Programming languages -- C++|publisher=[[International Organization for Standardization|ISO]], [[International Electrotechnical Commission|IEC]]|year=2003|location=5.6.4|postscript=<!--None-->}}. "the binary % operator yields the remainder from the division of the first expression by the second. .... If both operands are nonnegative then the remainder is nonnegative; if not, the sign of the remainder is implementation-defined".</ref>
|-
| [[C++11|C++ (ISO 2011)]] || <tt>%</tt> || Dividend
|-
| [[C-Sharp|C#]] || <tt>%</tt> || Dividend
|-
| [[Clarion (Programmiersprache)|CLARION]] || <tt>%</tt> || Dividend
|-
| [[Clojure]] || <tt>mod</tt> || Divisor
|-
| [[COBOL]] || <tt>FUNCTION&nbsp;MOD</tt> || Divisor
|-
| [[ColdFusion]] || <tt>%, MOD</tt> || Dividend
|-
| rowspan="2" | [[Common Lisp]]
| <tt>mod</tt> || Divisor
|-
| <tt>rem</tt> || Dividend
|-
| [[D (Programmiersprache)|D]] || <tt>%</tt> || Dividend<ref>{{cite web|title=Expressions|url=http://www.digitalmars.com/d/2.0/expression.html#MulExpression|work=D Programming Language 2.0|publisher=Digital Mars|accessdate=29 July 2010}}</ref>
|-
| [[Dart (Programmiersprache)|Dart]] || <tt>%</tt> || Divisor
|-
| [[Eiffel (Programmiersprache)|Eiffel]] || <tt>\\</tt> || Dividend
|-
| [[Erlang (Programmiersprache)|Erlang]] || <tt>rem</tt> || Dividend
|-
| rowspan="2" | [[Euphoria (Programmiersprache)|Euphoria]]
| <tt>mod</tt> || Divisor
|-
| <tt>remainder</tt> || Dividend
|-
| [[F-Sharp|F#]] || <tt>%</tt> || Dividend
|-
| [[FileMaker]] || <tt>Mod</tt> || Divisor
|-
| rowspan="2" | [[Fortran]]
| <tt>mod</tt> || Dividend
|-
| <tt>modulo</tt> || Divisor
|-
| [[Frink]] || <tt>mod</tt> || Divisor
|-
| [[Game Maker Language|GML (Game Maker)]] || <tt>mod</tt> || Dividend
|-
| [[Go (Programmiersprache)|Go]] || <tt>%</tt> || Dividend
|-
| rowspan="2" | [[Haskell (Programmiersprache)|Haskell]]
| <tt>mod</tt> || Divisor
|-
| <tt>rem</tt> || Dividend
|-
| [[J (Programmiersprache)|J]] || <tt><nowiki>|~</nowiki></tt> || Divisor
|-
| [[Java (Programmiersprache)|Java]] || <tt>%</tt> || Dividend
|-
| [[JavaScript]] || <tt>%</tt> || Dividend
|-
| [[Lua|Lua 5]] || <tt>%</tt> || Divisor
|-
| [[Lua|Lua 4]] || <tt>mod(x,y)</tt> || Divisor
|-
| [[Liberty Basic]] || <tt>MOD</tt> || Dividend
|-
| [[Mathcad]] || <tt>mod(x,y) || Divisor
|-
| [[Maple (Software)|Maple]] || <tt> e mod m </tt> || Immer positiv
|-
| [[Mathematica]] || <tt>Mod</tt> || Divisor
|-
| rowspan="2" | [[MATLAB]]
| <tt>mod</tt> || Divisor
|-
| <tt>rem</tt> || Dividend
|-
| rowspan="2" | [[Maxima (Computeralgebrasystem)|Maxima]]
| <tt>mod</tt> || Divisor
|-
| <tt>remainder</tt> || Dividend
|-
| [[Maya Embedded Language]] || <tt>fmod<tt> || Immer positiv
|-
| [[Microsoft Excel]] || <tt>=MOD()<tt> || Divisor
|-
| [[Minitab]] || <tt>MOD<tt> || Divisor
|-
| [[MUMPS]] || <tt>#</tt> || Divisor
|-
| [[Oberon (Programmiersprache)|Oberon]] || <tt>MOD</tt> || Divisor
|-
| [[OCaml]] || <tt>mod</tt> || Dividend
|-
| [[Occam]] || <tt>\</tt> || Dividend
|-
| [[Pascal (Programmiersprache)|Pascal (Delphi)]] || <tt>mod</tt> || Dividend
|-
| [[Pascal (Programmiersprache)|Pascal (ISO-7185 and ISO-10206)]] || <tt>mod</tt> || Immer positiv
|-
| [[Perl]] || <tt>%</tt> || Divisor
|-
| [[PHP]] || <tt>%</tt> || Dividend
|-
| [[PIC Basic Pro]] || <tt>\\</tt> || Dividend
|-
| [[PL/I]] || <tt>mod</tt> || Divisor (ANSI PL/I)
|-
| [[PowerBuilder]] || <tt>mod(x,y)</tt> || ?
|-
| [[PowerShell]] || <tt>%</tt> || Dividend
|-
| [[OpenEdge Advanced Business Language|Progress]] || <tt>modulo</tt> || Dividend
|-
| rowspan="2"| [[Prolog]] (ISO 1995)
| <tt>mod</tt> || Divisor
|-
| <tt>rem</tt> || Dividend
|-
| [[Python (Programmiersprache)|Python]] || <tt>%</tt> || Divisor
|-
| [[RealBasic]] || <tt>MOD</tt> || Dividend
|-
| [[R (Programmiersprache)|R]] || <tt>%%</tt> || Divisor
|-
| [[RPG (Programmiersprache)|RPG]] || <tt>%REM</tt> || Dividend
|-
| rowspan="2" | [[Ruby (Programmiersprache)|Ruby]]
| <tt>%, modulo()</tt> || Divisor
|-
| <tt>remainder()</tt> || Dividend
|-
| [[Scala (Programmiersprache)|Scala]] || <tt>%</tt> || Dividend
|-
| rowspan="2" | [[Scheme]]
| <tt>modulo</tt> || Divisor
|-
| <tt>remainder</tt> || Dividend
|-
| rowspan="2" | [[Scheme]] R<sup>6</sup>RS
| <tt>mod</tt> || Immer positiv<ref name="r6rs">http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-14.html#node_sec_11.7.3.1</ref>
|-
| <tt>mod0</tt> || Am nächsten bei Null<ref name="r6rs"/>
|-
| rowspan="2" | [[Seed7]]
| <tt>mod</tt> || Divisor
|-
| <tt>rem</tt> || Dividend
|-
| rowspan="2" | [[SenseTalk]]
| <tt>modulo</tt> || Divisor
|-
| <tt>rem</tt> || Dividend
|-
| rowspan="2" | [[Smalltalk]]
| <tt>\\</tt> || Divisor
|-
| <tt>rem:</tt> || Dividend
|-
| [[SQL]] ([[SQL:1999]]) || <tt>mod(x,y)</tt> || Dividend
|-
| rowspan="2" | [[Standard ML]]
| <tt>mod</tt> || Divisor
|-
| <tt>Int.rem</tt> || Dividend
|-
| [[Stata]] || <tt>mod(x,y)</tt> || Immer positiv
|-
| [[Tcl]] || <tt>%</tt> || Divisor
|-
| [[Torque Game Engine]] || <tt>%</tt> || Dividend
|-
| [[Turing (Programmiersprache)|Turing]] || <tt>mod</tt> || Divisor
|-
| [[Verilog]] (2001) || <tt>%</tt> || Dividend
|-
| rowspan="2" | [[VHDL]]
| <tt>mod</tt> || Divisor
|-
| <tt>rem</tt> || Dividend
|-
| [[Visual Basic]]||<tt>Mod</tt>||Dividend
|-
| [[ASM86|x86 Assembler]] || <tt>IDIV</tt> || Dividend
|}
{| class="wikitable" style="float:right; clear:right; margin-left:1em; margin-right:0; width:30%;"
|+ Fließkommaoperatoren für den Rest einer Division in verschiedenen Programmiersprachen
|-
! Programmiersprache
! Operator
! abbr="Sign" | Das Ergebnis hat dasselbe Vorzeichen wie
|-
| [[C (Programmiersprache)|C]] (ISO 1990) || <tt>fmod</tt> || ?
|-
| rowspan="2" | [[C99|C (ISO 1999)]]
| <tt>fmod</tt> || Dividend
|-
| <tt>remainder</tt> || Am nächsten bei Null
|-
| [[C++]] (ISO 1998) || <tt>std::fmod</tt> || ?
|-
| rowspan="2" | [[C++11|C++ (ISO 2011)]]
| <tt>std::fmod</tt> || Dividend
|-
| <tt>std::remainder</tt> || Am nächsten bei Null
|-
| [[C-Sharp|C#]] || <tt>%</tt> || Dividend
|-
| rowspan="2" | [[Common Lisp]]
| <tt>mod</tt> || Divisor
|-
| <tt>rem</tt> || Dividend
|-
| [[D (Programmiersprache)|D]] || <tt>%</tt> || Dividend
|-
| [[F-Sharp|F#]] || <tt>%</tt> || Dividend
|-
| rowspan="2" | [[Fortran]]
| <tt>mod</tt> || Dividend
|-
| <tt>modulo</tt> || Divisor
|-
| [[Go (Programmiersprache)|Go]] || <tt>math.Fmod</tt> || Dividend
|-
| [[Haskell (Programmiersprache)|Haskell]] (GHC) || <tt>Data.Fixed.mod'</tt> || Divisor
|-
| [[Java (Programmiersprache)|Java]] || <tt>%</tt> || Dividend
|-
| [[JavaScript]] || <tt>%</tt> || Dividend
|-
| [[OCaml]] || <tt>mod_float</tt> || Dividend
|-
| [[Perl]] || <tt>POSIX::fmod</tt> || Dividend
|-
| [[Perl (Programmiersprache)#Perl 6|Perl6]] || <tt>%</tt> || Divisor
|-
| [[PHP]] || <tt>fmod</tt> || Dividend
|-
| rowspan="2"| [[Python (Programmiersprache)|Python]]
| <tt>%</tt> || Divisor
|-
| <tt>math.fmod</tt> || Dividend
|-
| rowspan="2" | [[Ruby (Programmiersprache)|Ruby]]
| <tt>%, modulo()</tt> || Divisor
|-
| <tt>remainder()</tt> || Dividend
|-
| rowspan="2" | [[Scheme]] R<sup>6</sup>RS
| <tt>flmod</tt> || Immer positiv
|-
| <tt>flmod0</tt> || Am nächsten bei Null
|-
| [[Standard ML]] || <tt>Real.rem</tt> || Dividend
|}

Wenn zwei [[natürliche Zahlen]], der Dividend ''a'' und der Divisor ''b'' (ungleich 0), mit Rest dividiert werden sollen, also wenn
Wenn zwei [[natürliche Zahlen]], der Dividend ''a'' und der Divisor ''b'' (ungleich 0), mit Rest dividiert werden sollen, also wenn
: <math>a : b\,</math>
: <math>a : b\,</math>
Zeile 162: Zeile 448:
* Dirk Louis: C/C++ Kompendium, Pearson Education, 2007, ISBN 9783827243652 [http://books.google.de/books?id=XPdOBeqXeZMC (online)] Seite 214
* Dirk Louis: C/C++ Kompendium, Pearson Education, 2007, ISBN 9783827243652 [http://books.google.de/books?id=XPdOBeqXeZMC (online)] Seite 214
* [http://www.uibk.ac.at/mathematik/personal/pauer/vortragpauerwien2004.pdf Division mit Rest - der heimliche Hauptsatz der Algebra] (PDF-Datei; 86&nbsp;kB)
* [http://www.uibk.ac.at/mathematik/personal/pauer/vortragpauerwien2004.pdf Division mit Rest - der heimliche Hauptsatz der Algebra] (PDF-Datei; 86&nbsp;kB)

== Einzelnachweise ==
<references />


[[Kategorie:Arithmetik]]
[[Kategorie:Arithmetik]]

Version vom 7. März 2013, 15:28 Uhr

Die Division mit Rest oder der Divisionsalgorithmus ist ein mathematischer Satz aus der Algebra und der Zahlentheorie. Er besagt, dass es zu zwei Zahlen und eindeutig bestimmte Zahlen und gibt, für die

gilt. Die Zahlen und lassen sich durch die schriftliche Division ermitteln.

Die Division mit Rest ist auch für Polynome definiert. Die allgemeinste mathematische Struktur, in der es eine Division mit Rest gibt, ist der euklidische Ring.

Natürliche Zahlen

Operatoren für den Rest einer ganzzahlige Division in verschiedenen Programmiersprachen
Programmiersprache Operator Das Ergebnis hat dasselbe Vorzeichen wie
ActionScript % Dividend
Ada mod Divisor
rem Dividend
ASP Mod Nicht definiert
Algol 68 Immer positiv
AMPL mod Dividend
AppleScript mod Dividend
BASIC Mod Nicht definiert
bc % Dividend
bash % Dividend
C (ISO 1990) % Implementierungsabhängig
C (ISO 1999) % Dividend[1]
C++ (ISO 1998) % Implementierungsabhängig[2]
C++ (ISO 2011) % Dividend
C# % Dividend
CLARION % Dividend
Clojure mod Divisor
COBOL FUNCTION MOD Divisor
ColdFusion %, MOD Dividend
Common Lisp mod Divisor
rem Dividend
D % Dividend[3]
Dart % Divisor
Eiffel \\ Dividend
Erlang rem Dividend
Euphoria mod Divisor
remainder Dividend
F# % Dividend
FileMaker Mod Divisor
Fortran mod Dividend
modulo Divisor
Frink mod Divisor
GML (Game Maker) mod Dividend
Go % Dividend
Haskell mod Divisor
rem Dividend
J |~ Divisor
Java % Dividend
JavaScript % Dividend
Lua 5 % Divisor
Lua 4 mod(x,y) Divisor
Liberty Basic MOD Dividend
Mathcad mod(x,y) Divisor
Maple e mod m Immer positiv
Mathematica Mod Divisor
MATLAB mod Divisor
rem Dividend
Maxima mod Divisor
remainder Dividend
Maya Embedded Language fmod Immer positiv
Microsoft Excel =MOD() Divisor
Minitab MOD Divisor
MUMPS # Divisor
Oberon MOD Divisor
OCaml mod Dividend
Occam \ Dividend
Pascal (Delphi) mod Dividend
Pascal (ISO-7185 and ISO-10206) mod Immer positiv
Perl % Divisor
PHP % Dividend
PIC Basic Pro \\ Dividend
PL/I mod Divisor (ANSI PL/I)
PowerBuilder mod(x,y) ?
PowerShell % Dividend
Progress modulo Dividend
Prolog (ISO 1995) mod Divisor
rem Dividend
Python % Divisor
RealBasic MOD Dividend
R %% Divisor
RPG %REM Dividend
Ruby %, modulo() Divisor
remainder() Dividend
Scala % Dividend
Scheme modulo Divisor
remainder Dividend
Scheme R6RS mod Immer positiv[4]
mod0 Am nächsten bei Null[4]
Seed7 mod Divisor
rem Dividend
SenseTalk modulo Divisor
rem Dividend
Smalltalk \\ Divisor
rem: Dividend
SQL (SQL:1999) mod(x,y) Dividend
Standard ML mod Divisor
Int.rem Dividend
Stata mod(x,y) Immer positiv
Tcl % Divisor
Torque Game Engine % Dividend
Turing mod Divisor
Verilog (2001) % Dividend
VHDL mod Divisor
rem Dividend
Visual Basic Mod Dividend
x86 Assembler IDIV Dividend
Fließkommaoperatoren für den Rest einer Division in verschiedenen Programmiersprachen
Programmiersprache Operator Das Ergebnis hat dasselbe Vorzeichen wie
C (ISO 1990) fmod ?
C (ISO 1999) fmod Dividend
remainder Am nächsten bei Null
C++ (ISO 1998) std::fmod ?
C++ (ISO 2011) std::fmod Dividend
std::remainder Am nächsten bei Null
C# % Dividend
Common Lisp mod Divisor
rem Dividend
D % Dividend
F# % Dividend
Fortran mod Dividend
modulo Divisor
Go math.Fmod Dividend
Haskell (GHC) Data.Fixed.mod' Divisor
Java % Dividend
JavaScript % Dividend
OCaml mod_float Dividend
Perl POSIX::fmod Dividend
Perl6 % Divisor
PHP fmod Dividend
Python % Divisor
math.fmod Dividend
Ruby %, modulo() Divisor
remainder() Dividend
Scheme R6RS flmod Immer positiv
flmod0 Am nächsten bei Null
Standard ML Real.rem Dividend

Wenn zwei natürliche Zahlen, der Dividend a und der Divisor b (ungleich 0), mit Rest dividiert werden sollen, also wenn

berechnet werden soll, so wird gefragt, wie man die Zahl a als Vielfaches von b und einem „kleinen Rest“ darstellen kann:

Hier ist c der so genannte Ganzzahlquotient und r der Rest. Entscheidende Nebenbedingung ist, dass r eine Zahl in ist. Hierdurch wird r eindeutig bestimmt.

Der Rest ist also die Differenz zwischen dem Dividenden und der größten Zahl, die höchstens so groß wie der Dividend und durch den Divisor teilbar ist, für die die Division also keinen Rest ergibt. Ein Rest ungleich 0 ergibt sich folglich nur, wenn zwei Zahlen nicht Vielfache voneinander sind. Man sagt auch: Der Dividend ist nicht durch den Divisor teilbar, weshalb ein Rest übrigbleibt.

Liegt der Divisor fest, so spricht man beispielsweise auch vom Neunerrest einer Zahl, also dem Rest, der sich bei Division dieser Zahl durch neun ergibt.

Beispiel

  • 7:3 = 2, Rest 1, da 7 = 3×2 + 1 („drei passt zweimal in 7 und es bleibt eins übrig“ – der Rest ist also eins)
  • 2:3 = 0, Rest 2, da 2 = 3×0 + 2
  • 3:3 = 1, Rest 0, da 3 = 3×1 + 0

Bestimmung des Restes für spezielle Teiler

Häufig kann man den Rest an der Dezimaldarstellung ablesen:

  • bei Division durch 2: der Rest ist 1, wenn die letzte Ziffer ungerade ist, und 0, wenn die letzte Ziffer gerade ist
  • bei Division durch 3: der Rest ist gleich dem Rest, den die iterierte Quersumme bei Division durch 3 lässt
  • bei Division durch 5: der Rest ist gleich dem Rest, den die letzte Ziffer bei Division durch 5 lässt
  • bei Division durch 9: der Rest ist die iterierte Quersumme oder 0, falls diese 9 ist
  • bei Division durch 10: der Rest ist die letzte Ziffer

Ähnliche, wenn auch etwas kompliziertere Regeln, existieren für etliche weitere Teiler.

Ganze Zahlen

Ist b eine negative ganze Zahl, dann gibt es keine natürlichen Zahlen zwischen 0 und b-1. Stattdessen fordert man, dass der Rest zwischen 0 und |b|-1 (dem Betrag von b minus 1) liegt. Alternativ kann man aber auch verlangen, dass der Rest in diesem Fall zwischen b+1 und 0 liegt, also dasselbe Vorzeichen hat wie b. Eine dritte Möglichkeit ist, den betragskleinsten Rest zu wählen. Diese Variante liefert für a = b · c + r die beste Näherung b · c für a.

Beispiel

Dividiert man negative Zahlen, ergibt sich entsprechend der Alltagserfahrung folgendes Bild:

 7 :   3 =  2 Rest  1
−7 :   3 = −2 Rest −1

übertragen auf negative Teiler – obwohl wenig anschaulich – folgt:

 7 :  −3 = −2 Rest  1
−7 :  −3 =  2 Rest −1

(hierbei wird für die Wahl von Quotient und Rest zunächst so getan, als gäbe es keine Vorzeichen, sie werden sozusagen nach der „eigentlichen Berechnung wieder hinzugefügt“). Als Quotient wird hier immer ein Wert bestimmt, dessen Betrag kleiner oder gleich dem Betrag des Quotienten im Bereich der rationalen Zahlen ist. Der Rest und sein Vorzeichen folgen aus der Wahl des Quotienten.

Wie groß der Rest bei einer Division nun ausfällt sei Geschmackssache, könnte man meinen, denn es steht jedem frei, nur einen Teil einer gegebenen Größe zu teilen, den verbleibenden Rest erklärt er einfach zum „Rest“. Lassen wir hierbei auch zu, dass „Schulden“ gemacht werden dürfen, sind beispielsweise alle folgenden Ergebnisse zulässig:

 7 :  3 =  1 Rest  4
 7 :  3 =  2 Rest  1
 7 :  3 =  3 Rest −2

oder

−7 :  3 = −1 Rest −4
−7 :  3 = −2 Rest −1
−7 :  3 = −3 Rest  2

Zur Normierung wird in der Mathematik die Konvention verwendet, die Vorzeichen der Reste aus denen der Teiler zu beziehen, wie in den folgenden Beispielen dargestellt:

 7 :   3 =  2 Rest  1
−7 :   3 = −3 Rest  2
 7 :  −3 = −3 Rest −2
−7 :  −3 =  2 Rest −1

hierbei kann die Zugehörigkeit einer Zahl zu einer Restklasse direkt am Rest abgelesen werden.

Implementierung in Computersystemen

Man beachte, dass DIV- und MOD-Befehle (für ganzzahlige Division und Restbildung) in den meisten Programmiersprachen (und sogar in Intels 80x86-Prozessoren) genau diesem Alltagsansatz entsprechend implementiert sind.

Einige Programmiersprachen und Computeralgebrasysteme tragen dieser Vielfalt von Konventionen Rechnung, indem sie zwei Modulo- oder Rest-Operatoren zur Verfügung stellen. Im Beispiel Ada hat:

  • (A rem B) dasselbe Vorzeichen wie A und einen Absolutwert kleiner als der Absolutwert von B
  • (A mod B) dasselbe Vorzeichen wie B und einen Absolutwert kleiner als der Absolutwert von B

Modulo

Modulo berechnet den Rest b der Division n geteilt durch m. Man kann eine Funktion definieren, welche jedem Zahlenpaar { n ; m } eindeutig den Teilerrest b zuordnet. Diese nennt man „Modulo“ [ˈmoːduloː] (lat. Modulus, Kasus Ablativ: „durch Maß“ oder auch „mit Maß“, somit Mehrzahl modulis) und wird meistens mit mod abgekürzt. In vielen Programmiersprachen wird sie durch % dargestellt und als Operator behandelt.

Wir betrachten die Funktion

Die Gaußklammer bezeichnet die größte ganze Zahl, die kleiner oder gleich der Zahl in der Gaußklammer ist, also ohne den Rest der Division . Hier gilt stets
aber im Allgemeinen ist
z. B. .
Ist positiv, so ist für alle .

Neben dieser sogenannten „Mathematischen Variante“ wird oft auch eine ähnliche Funktion als Modulo bezeichnet, welche für negative Argumente unterschiedliche Ergebnisse liefert und „symmetrische Variante“ genannt wird:

dabei bezeichnet den zur Null hin gerundeten Quotienten , gegeben durch , wobei die Vorzeichenfunktion bezeichnet. Für diese Variante gilt
,
aber im Allgemeinen
, z. B. .
hat stets dasselbe Vorzeichen wie , oder es gilt .

Gilt und , so ergeben beide Varianten dasselbe Ergebnis. In Programmiersprachen ist die implementierte Variante nicht einheitlich. So verwenden Ruby, Python und Perl die mathematische Variante, wo hingegen Java, C, JavaScript und PHP die symmetrische einsetzen, was besonders wichtig bei Portierungen ist. Der in der Googlesuche enthaltene Rechner verwendet die mathematische Variante.

Steht in einer Sprache wie C(++) oder Java nur die symmetrische Variante zur Verfügung, kann man Ergebnisse nach der mathematischen Variante erhalten mit:

a mod b = ( a % b + b) % b

wobei % der symmetrischen Modulooperation entspricht und mod der mathematischen.

Beispiele

  • 17 mod 3 = 2, da („3 passt fünfmal in 17 und es bleiben 2 übrig“ – der Rest ist also 2)
  • 2 mod 3 = 2, da
  • 3 mod 3 = 0, da

Wenn , dann folgt nicht daraus, dass ist, sondern nur, dass sich und um ein ganzzahliges Vielfaches von unterscheiden, also: mit . Eine derartige Gleichung kann auch einfacher mit Hilfe der in der Zahlentheorie verbreiteten Kongruenzrelation geschrieben werden:

oder auch

Grundrechenarten modulo einer natürlichen Zahl

Ist die Zahl m eine Primzahl, so kann man die aus den reellen Zahlen gewohnten Grundrechenarten mit anschließender Modulo-Berechnung anwenden und erhält einen sogenannten endlichen Körper.

Beispiele

  • Restklasse modulo 3:
  • Restklasse modulo 5:

Verallgemeinerung: Reelle Zahlen

Sind a und b reelle Zahlen, b ungleich 0, dann kann man eine Division mit Rest folgendermaßen definieren: Der ganzzahlige Quotient c und Rest r im halboffenen Intervall [0, |b|) sind diejenigen (eindeutig bestimmten) Zahlen, die die Gleichung a = b · c + r erfüllen.

Auch hier gibt es die Alternativen, dem Rest dasselbe Vorzeichen wie b zu geben oder den betragskleinsten Rest zu wählen. Letztere Alternative entspricht der Rundung: Die Division mit Rest von a durch 1 liefert eine ganze Zahl c und eine reelle Zahl r mit Betrag ≤ 0,5, die die Gleichung a = c + r erfüllen. Die Zahl c ist der auf ganze Zahlen gerundete Wert von a.

Es ist zu beachten, dass hierbei der Quotient nicht aus derselben Menge (der reellen Zahlen) genommen wird wie Divisor und Dividend.

Polynome

Bei der Division mit Rest für Polynome muss das als Divisor auftretende Polynom aus dem Polynomring eine Voraussetzung erfüllen: Der Leitkoeffizient von muss eine Einheit von sein (insb. ist nicht das Nullpolynom). Unter dieser Bedingung gibt es zu jedem eindeutig bestimmte Polynome mit

Ein Beispiel ist das folgende Polynom.

Die Polynome und lassen sich durch Polynomdivision bestimmen.

Anwendung

Programmierung

Die Division mit Rest (Modulo) wird in der Programmierung relativ häufig verwendet. Die Syntax ist dabei die eines Operators. Mit mod kann geprüft werden, ob eine Zahl gerade ist: if ( (x mod 2) == 0), dann ist x gerade. Modulo kann man immer benutzen, wenn man alle X Schleifendurchläufe einen speziellen Programmcode ausführen will. Auch bei vielen Berechnungen und Algorithmen ist er sinnvoll einsetzbar. Allgemein kann man mit mod prüfen, ob eine Zahl durch eine andere genau teilbar ist, dann ist der Modulo nämlich Null. Andersrum muss man in der Programmierung oft auf ganze Vielfache von einer Zahl ergänzen (z. B. 4 Bytes) und bekommt durch den Modulo heraus, wie viele „Pad-Bytes“ noch fehlen. Durch die Funktion divmod werden Ganzzahlquotient und Rest ausgewertet.

Beispiel
Man programmiert eine Uhr und hat die Zeit als Sekundenwert seit 0 Uhr gegeben. Dann kann man den Sekundenwert Mod 3600 berechnen. Ist dieser gleich 0, so weiß man, dass eine volle Stunde angefangen hat. Diese Information kann man nutzen, um z. B. ein akustisches Signal (Gong zur vollen Stunde) auszulösen. Mit der Berechnung Sekundenwert Mod 60 erhält man die Sekunde in der aktuellen Minute, die oftmals von Digitaluhren als letzte zwei Stellen angezeigt werden.

Weitere Anwendungen

Siehe auch

Literatur

  • Kristina Reiss, Gerald Schmieder: Basiswissen Zahlentheorie. Eine Einführung in Zahlen und Zahlenbereiche. Springer-Verlag, Berlin u. a. 2005, ISBN 3-540-21248-5.
  • Peter Hartmann: Mathematik für Informatiker. Ein praxisbezogenes Lehrbuch. 4. überarbeitete Auflage. Vieweg, Wiesbaden 2006, ISBN 3-8348-0096-1, S. 62, (online).
  • Albrecht Beutelspacher, Marc-Alexander Zschiegner: Diskrete Mathematik für Einsteiger. Mit Anwendungen in Technik und Informatik. Vieweg, Wiesbaden 2007, ISBN 978-3-8348-0094-7, S. 65, (online).

Einzelnachweise

  1. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf, section 6.5.5
  2. ISO/IEC 14882:2003 : Programming languages -- C++. ISO, IEC, 5.6.4 2003.. "the binary % operator yields the remainder from the division of the first expression by the second. .... If both operands are nonnegative then the remainder is nonnegative; if not, the sign of the remainder is implementation-defined".
  3. Expressions. In: D Programming Language 2.0. Digital Mars, abgerufen am 29. Juli 2010.
  4. a b http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-14.html#node_sec_11.7.3.1