Wie ist mod für n < 0 definiert?
-
Tja im Titel steht die Frage ja bereits.
In "Diskrete algebraische Strukturen" haben wir gelernt, dass zB
-1 mod 4 = 3
gilt.
Jetzt war ich gerade eben über meinen Java Compiler verärgert, weil der beim obigen Beispiel "-1" ausrechnet und damit eine Zugriffsverletzung beim Zugriff auf ein Array verursacht hat.
Habe etwas "Nachforschung" betrieben, und dabei ist folgende Kuriosität rausgekommen:
-1 mod 4 = -1 sagen:
- alle java compiler
- vs c++ compiler
- windows taschenrechner1- mod 4 = 3 sagen:
- mein DAS Prof.
- linux taschenrechner
- realer taschenrechner
- ichIst das eine Definitionssache? Habe das Problem zwar lösen können indem ich einfach "in die andere Richtung gerechnet" habe, würde mich aber mal interessieren was das soll.
-
0x00000001 schrieb:
Ist das eine Definitionssache?
ja. und es sollte harmonieren mit der definitionssache, was bei (-1)/4 rauskommt.
-
volkard schrieb:
0x00000001 schrieb:
Ist das eine Definitionssache?
ja. und es sollte harmonieren mit der definitionssache, was bei (-1)/4 rauskommt.
wieso definitionssache?
(n-1) === -1 | (mod n)
es ist einfach das gleiche.
-
OK, alles klar.
Danke.
Edit:
Wobei wenn nur (n-x) === -x | (mod n) gelten muss,
dann könnten die ganzen Rechner ja auch.....7, 3, -1,-5, -9,.......
ausgeben.
Naja, wenn man weiß was kommt kann man drauf reagieren, ich seh das jetzt nicht so eng.
-
der standard garantiert, dass
( a / b ) * b + a % b == afür alle b != 0
er garantiert nicht, dass die division für negative a/b in richtung 0 rundet. das ist aber bei praktisch allen implementationen der fall und führt automatisch dazu, dass a%b negativ oder 0 ist, wenn a und b verschiedene vorzeichen haben.
-
Der Modulo Operator in C++ und Java arbeitet falsch im mathematischen Sinn
#include <iostream> using namespace std; // Mathematisch korrekte Modulooperation int mod(int a, int b) { return(b + (a%b)) % b; } int main() { cout<<mod(-14, 3)<<endl; // Gibt 1 aus }
mehr dazu findet man unter Zahlentheorie -> Teilen mit Rest
einfach mit Google nach Forster und Zahlentheorie suchen - der Herr Forster hat momentan ein Skript zur Vorlesung Zahlentheorie online - im 2ten Kapitel wird teilen mit Rest behandelt
-
Vertexwahn schrieb:
Der Modulo Operator in C++ und Java arbeitet falsch im mathematischen Sinn
falsch.
-
> falsch
reste sind immer positiv im mathematischen Sinn - ich verweise hier auf die Bücher von Forster + Hartmann - Mathematik für Informatiker
warum falsch?
Welche Quellen hast du den?
-
Vertexwahn hat recht! Und weil es so schön ist:
Bsp.:
-7 mod 5 = 3 (mathematisch) ->richtig
-7 mod 5 = -2 (V$ 6.0) ->falsch
-
Vertexwahn schrieb:
reste sind immer positiv im mathematischen Sinn
nicht-negativ *duck*
-
jedeer kann und darf sich mod definieren, wie er mag. es gibt keine "mathematische" definition. "die mathematik" ist kein großes grünes monster, das uns irgendetwas vorschreibt.
willste ne vorschrift, dann such in den DIN-normen, wie mod definiert ist. dort schaut man ja auch nac, wenn man wissen will, ob 0 eine natürliche zahl ist. nicht in der mathematik, dort steht es nämlich nicht (bzw dort stehen klar und deutlich beide sich widersprechende definitionen). und jetzt hört mit dem albernen "mathematisch korrekt" auf.
-
Beim Hashing ist es vorteilhaft, wenn man nur positive Reste hat - ein negativer Indexwert in einem Array kann böse Folgen haben
ok: dann definiert sich halt jeder seine Modulooperation so wie er will -
a mod b ist immer 1in der Mathematik (und wir sind jetzt im Mathematik Forum) ist es halt mal so das die modulo Operation so festgelegt wird wie beschrieben - zeig mir ein Skript, Buch wo es anders gemacht wird
BTW: @Volkard: Danke für deinen C++ Kurs! Hat mir sehr geholfen!
-
In einigen Sprachen (z.b. Ada und Common Lisp) gibt es einen mod-Operator und einen rem-Operator. Ersterer arbeitet "mathematisch korrekt", wenn man das denn so nennen will, also so dass a mod b = c bedeutet, a in der c-ten Restklasse (modulo b) liegt, d.h. c liegt in [0, b-1] für positive b, unabhängig vom Vorzeichen von a. Für negative b ist c dann entsprechend negativ.
Beim rem-Operator ("remainder" = Rest) hat das Ergebnis das Vorzeichen von a. In C++ ist es unspezifiziert, welche Bedeutung % hat.