Only in German

Wann ist Ostern ?
Im Jahr 1999 erhielt ich über den JOYCE-Club eine Info für die Berechnung von Ostern. Dies regte mich an, den dargestellten Algorithmus in verschiedene Programmierprachen umzusetzen.
Hier jedoch zunächst die Information:

Ostern wird nach langer christlicher Tradition am ersten Sonntag nach dem ersten Vollmond im Frühling (auf der nördlichen Halbkugel) gefeiert. Die Bestimmung des kalendarischen Datums ist Bestandteil der grundlegenden Arbeit von Christopher Clavius zur Kalenderreform Papst Gregors XIII gewesen. Carl Friedrich Gauß (1777 - 1855) hat für die Datumsberechnung eine Vorschrift angegeben, die hier jedoch in der modifizierten Form von Dr. Heiner Lichtenberg, Bonn (H. Lichtenberg, Zur Interpretation der Gaußschen Osterformel und ihrer Ausnahmeregeln, Historia Mathematica 24 (1997), S. 441 - 444) angegeben wird. In dieser Form läßt sie sich nämlich leicht in ein Computerprogramm übersetzen. In den nachfolgenden Gleichungen bedeuten INT(a/b) der ganzzahlige Teil des Quotienten a/b und MOD(a,b) der nicht-negative Rest den a beim Teilen durch b läßt. Zu berechnen ist für die Jahreszahl X:

1.Die Säkularzahl
 K(X) = INT (X / 100);
2.Die säkulare Mondschaltung
 M(K) = 15 + INT ((3 * K + 3) / 4) - INT ((8 * K + 13) / 25);
3.Die säkulare Sonnenschaltung
 S(K) = 2 - INT ((3 * K + 3) / 4);
4.Der Mondparameter
 A(X) = MOD (X,19);
5.Der Keim für den ersten Vollmond im Frühling
 D(A, M) = MOD (19 * A + M, 30);
6.Die kalendarische Korrekturgröße
 R(D, A) = INT (D / 29) + (INT (D / 28) - INT (D / 29)) * INT (A / 11);
7.Die Ostergrenze
 OG(D, R) = 21 + D - R;
8.Der erste Sonntag im März
 SZ(X, S) = 7 - MOD (X + INT (X / 4) + S, 7);
9.Die Entfernung in Tagen, die der Ostersonntag von der Ostergrenze hat (Osterentfernung)
 OE(OG, SZ) = 7 - MOD (OG - SZ, 7);
10.Das Datum des Ostersonntags, dargestellt als Märzdatum, wobei ein Märzdatum > 31 durch Abziehen von 31 auf ein Aprildatum zu reduzieren ist. Der 32. März entspricht dem 1. April usw.
 OG + OE;

Liegt der Ostertermin (Os) erst einmal fest, so berechnen sich daraus weitere besondere Kalenderdaten, und zwar

Os-46: AschermittwochOs+49: Pfingstsonntag
Os+39: Christi HimmelfahrtOs+60: Fronleichnam


Man erkennt, dass die Berechnung - bis auf den Aschermittwoch - relativ einfach ist. Ist der Ostertermin erst berechnet - was einfacher ist als es aussieht -, dann braucht nur noch die (feste) Anzahl der Tage in den Monaten März und April vom Ergebnis abgezogen werden.
Beim Aschermittwoch ist das anders, weil für die Berechnung die Länge des Februars benötigt wird, der ja bekanntlich 28 oder 29 Tage lang ist.
Hier half mir Heiner Lichtenberg von der Physikalisch-Technische Bundesanstalt mit folgender Info:
Zur bequemen, nämlich fallunterscheidungsfreien Erledigung des Aschermittwochproblems könnte Ihnen vielleicht die Funktion s(x) nützlich sein, die für Gemeinjahre x den Wert 0 und für Schaltjahre x den Wert 1 annimmt. Diese Funktion kann man wie folgt notieren:

s(x) = int(x/4) - int((x-1)/4) - int((3*int(x/100)+3)/4) + int((3*int((x-1)/100)+3)/4)

Hierbei bedeutet int(a/b) die größte im Quotienten a/b enthaltene ganze Zahl.
Vier Beispiele:
x = 1900. s(1900) = 475 - 474 - 15 + 14 = 0. 1900 ist ein Gemeinjahr.
x = 1960. s(1960) = 490 - 489 - 15 + 15 = 1. 1960 ist ein Schaltjahr.
x = 1961. s(1961) = 490 - 490 - 15 + 15 = 0. 1961 ist ein Gemeinjahr.
x = 2000. s(2000) = 500 - 499 - 15 + 15 = 1. 2000 ist ein Schaltjahr.

Mit s(x) läßt sich die Zahl der Tage im Jahr x bequem, nämlich folgendermaßen angeben:
x enthält 365 + s(x) Tage.

Hier nun also die Umsetzung des Oster-Algorithmus in verschiedene Sprachen:

Ich habe die Programmierung ohne Optimierung vorgenommen und auch nur Stichproben gemacht, was die Berechnung angeht.

  1. BASIC
    Ich habe das Programm mit dem JOYCE MALLARD-80 BASIC von Locomotive Software sowie mit MBASIC von Microsoft getestet.
  2. PASCAL
    Hier habe ich mit TURBO PASCAL und Pro Pascal (von Prospero Software) getestet.
  3. C
    Das C Programm ist mit dem Hi-Tech Compiler (Public-Domain) getestet.
  4. Assembler
    Das Assembler-Programm ist in Z80-Code geschrieben, mit dem M80 assembliert und mit dem LINK fertiggestellt. Bei dem Assembler-Programm erkennt man schnell, daß der kleinste Teil der Algorithmus ist, das meiste geht drauf für Hilfsprogramme. (Bei diesen Hilfsprogrammen handelt es sich um Teile aus einer Bibliothek)
Implementierte Sprachen
BASIC PASCAL C Z80 Assembler