Was ist der konkrete Unterschied von rem und modulo in der funktionalen Programmierung?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Die Frage ist einfach, wie du bei der Ganzzahldivision rundest.

Hintergrund: Wenn du zwei natürliche Zahlen a und b hast, kannst du die "Division mit Rest" aus der Grundschule durchführen, also a / b = q, Rest r. Oder anders ausgedrückt:

a = b * q + r mit r < b.

Jetzt haben wir das Problem, dass a und b nicht unbedingt natürliche Zahlen sein müssen, sondern beliebige ganze Zahlen sein können. Und mit ganzzahligen Nennern und Resten ist diese Division mit Rest nicht mehr eindeutig. Zum Beispiel:

4 = 0 * (-5) + 4

oder auch:

4 = (-1) * (-5) + (-1).

In beiden Fällen ist |r| < |b|, weswegen beides valide Antworten wären.

Die Frage ist also, was wir als Quotienten betrachten wollen:

Ist 4/(-5) = 0 oder 4/(-5) = (-1)?

Die erste Antwort wäre das Runden zur 0 hin, die zweite Antwort wäre "immer abrunden". Und genau das ist auch der Unterschied:

4 `quot` (-5) = 0, während

4 `div` (-5) = -1.

Dementsprechend ist

4 `rem` (-5) = 4 und

4 `mod` (-5) = -1.

... Wenn du das alles bis hierhin verstanden hast, fragst du dich sicher, weshalb deine erste Eingabe "TRUE" zurückliefert. Das tut sie, weil das Minus-Symbol schwächer bindet als `rem` und `mod`. Du hättest stattdessen

((-4) `mod` 5) == ((-4) `rem` 5) 

eingeben sollen.

Mueller345 
Fragesteller
 14.12.2020, 14:09

Vielen Dank.
Also, bei mir haperts schon am Anfang.

4 = 0 * (-5) + 4
4 = 4 (wahr) 4 < 0 ist falsch

4 = (-1) * (-5) + (-1).
4 = 4 (wahr) -1 < -1 ist falsch

Die zwei Senkricht-Striche bedeuten Betrag, oder?

Wäre nett, wenn du mir den Teil hier nochmal kurz erklären würdest, bevor ich dann den restlichen Teil versuche, zu begreifen.

0
MagicalGrill  14.12.2020, 14:31
@Mueller345

Ja, die senkrechten Striche sind Betragszeichen.

Zugegebenermaßen hab ich die Faktoren heimlich vertauscht. Wenn wir bei der Form

a = bq + r

bleiben wollen, hätte ich eher

4 = (-5) * 0 + 4 schreiben sollen. Dann wäre nämlich

|4| < |-5| korrekt. Analog wäre

4 = (-5) * (-1) + (-1) mit

|-1| < |-5|.

0