Start / Der Modulo-Operator
Inhalt
Definition
Schaltjahresprüfung
Wochentagsbestimmung
Wann ist Ostern?
Pythonbeispiele
Definition
Bisher kennen wir die vier Grundrechenarten und ihre Operatoren. $$ +~-~\cdot~: $$
Nun führen wir eine neue Rechenart ein: „Modulo“.
Den Operator bezeichen wir mit mod.
Beispiel:
$$
5~mod~3 = 2~~~~\text{weil}~5:3=1~\text{Rest}~2~\text{ist}
$$
Lies: „5 modulo 3 gleich 2“
Die Rechenart Modulo liefert also immer den Divisionsrest.
Schaltjahresprüfung
Aber wann interessieren wir uns für den Rest einer Division?
Zum Beispiel, wenn wir feststellen möchten, ob eine Zahl durch eine andere teilbar ist. Das ist ja genau dann der Fall, wenn der Rest der Division 0 ergibt. Aus dieser Erkenntnis können wir eine mathematisch formale Definition der Teilbarkeit aufstellen: $$ b~\text{teilt}~a~\Leftrightarrow~a~mod~b=0 $$
Ist ein Jahr ein Schaltjahr?
Ob ein Jahr ein Schaltjahr ist, folgt einer einfachen Regel:
Ist die Jahreszahl durch 4 teilbar, so ist es ein Schaltjahr.
Waren 2020 und 2021 Schaltjahre? Wir rechnen:
$$
2020~mod~4=0\\
2021~mod~4=1
$$
Aus unserer Rechnung folgt:
2020 war ein Schaltjahr, weil es ohne Rest durch 4 geteilt werden kann.
2021 war kein Schaltjahr, weil beim teilen durch 4 ein Rest (1) bleibt.
Allerdings ist die Regel für Schaltjahre etwas komplizierter.
Ausnahme: Alle 100 Jahre fällt das Schaltjahr aus.
Ausnahme von der Ausnahme: Alle 400 Jahre fällt das Schaltjahr doch nicht aus.
War 2000 ein Schaltjahr und wird 2100 ein Schaltjahr sein? Wir rechnen:
$$
\begin{array}{lcrcr}
2000&mod&4&=&0\\
2000&mod&100&=&0\\
2000&mod&400&=&0\\
2100&mod&4&=&0\\
2100&mod&100&=&0\\
2100&mod&400&=&100
\end{array}
$$
Es folgt:
2000 war ein Schaltjahr und 2100 wird kein Schaltjahr sein.
Wochentagsbestimmung
Wir haben uns in der ersten Anwendung nur dafür interessiert, ob der Rest 0 ist oder nicht. Wann benötigen wir den genauen Wert des Restes?
Angenommen, der 1.1. eines Jahres wäre ein Sonntag gewesen. Auf welchen Wochentag fiele dann der 25.1.? Wir rechnen:
$$
25~mod~7=4
$$
Nummerieren wir die Wochentage (von 0 an) durch: 0-So, 1-Mo, 2-Di, 3-Mi, 4-Do, 5-Fr und 6-Sa,
so liefert uns der Divisionrest den passenden Wochentag: Donnerstag.
Auf diese Weise können wir zu jedem beliebigen Datum den Wochentag herausfinden. Wir müssen nur berechnen, wieviele Tage seit dem 1. Januar im Jahre 0 bis zu diesem Datum vergangen sind. Die Anzahl der Tage modulo 7 liefert uns die Wochentagsnummer. Da als 1.1.0 Sonntag festgelegt wurde.
Wann ist Ostern?
Die im folgenden beschriebene Methode zur Berechnung des Osterdatums geht auf Carl Friedrich Gauß (1777 - 1855) zurück.
Anmerkung: div bedeutet ganzzahlige Division. Dabei werden Nachkommastellen ohne zu runden abgeschnitten.
J ist die Jahreszahl
$$
\begin{array}{lcrcr}
a&=&J&mod&19\\
b&=&J&mod&4\\
c&=&J&mod&7\\
k&=&J&div&100\\
p&=&k&div&3&\\
q&=&k&div&4\\
M&=&(15 + k − p − q)&mod&30\\
d&=&(19a + M)&mod&30\\
N& =& (4 + k − q) &mod& 7\\
e &=& (2b + 4c + 6d + N) &mod& 7\\
\text{Ostern}&= &(22 + d + e)\text{ter Maerz}
\end{array}
$$
Wobei der 32. März der 1. April und so weiter ist.
Ausnahmen:
Falls $d=29$ und $e=6$, dann Ostern 19. April
Falls $d=28$ und $e=6$ und $(11M + 11)~~mod~~30 < 19$, dann Ostern=18. April
Beispiel: Wann ist Ostern 2023? $$ \begin{array}{lcrcr} a&=&2023&mod&19&=&9\\ b&=&2023&mod&4&=&3\\ c&=&2023&mod&7&=&0\\ k&=&2023&div&100&=&20\\ p&=&20&div&3&=&6\\ q&=&20&div&4&=&5\\ M&=&(15 + 20 − 6 − 5)&mod&30&=&24\\ d&=&(19 \cdot 9 + 24)&mod&30&=&15\\ N& =& (4 + 20 − 5) &mod& 7&=&5\\ e &=& (2 \cdot 3 + 4 \cdot 0 + 6 \cdot 15 +5) &mod& 7&=&3\\ \text{Ostern}&= &(22 + 15 + 3)&=&40. \text{Maerz}&=&9. \text{April} \end{array} $$
Pythonbeispiele
Wenn Sie Python beherrschen schreiben Sie jeweils ein Pythonprogramm, dass
a) den Wochentag für ein beliebiges Datum ermittelt
b) das Osterdatum zu einem bestimmten Jahr errechnet
Falls Sie sich das nicht zutrauen finden Sie im folgenden Lösungsvorschläge.
Wochentagsberechnung:
Osterdatum: