Wann ist Ostern ?

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.  K= INT (X / 100);
  2.  M= 15 + INT ((3 * K + 3) / 4) - INT ((8 * K + 13) / 25);
  3.  S= 2 - INT ((3 * K + 3) / 4);
  4.  A= MOD (X,19);
  5.  D= MOD (19 * A + M, 30);
  6.  R= INT (D / 29) + (INT (D / 28) - INT (D / 29)) * INT (A / 11);
  7.  OG = 21 + D - R;
  8.  SZ = 7 - MOD (X + INT (X / 4) + S, 7);
  9.  OE = 7 - MOD (OG - SZ, 7);

Dann ist OS = OG + OE das Datum des Ostersonntags, als Datum im Monat März dargestellt. Der 32. März entspricht dem 1. April usw.

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

Os-46: Aschermittwoch,        Os+49: Pfingstsonntag,
Os+39: Christi Himmelfahrt,   Os+60: Fronleichnam

(c)  Physikalisch-Technische Bundesanstalt



Moin, moin, Du hast es so gewollt ;-)


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

BASIC, TURBO PASCAL, C und Z80 Assembler.

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

Bei dem Assembler Programm erkennt man schnell, daß der kleinste Teil der Algorithmus ist, das meiste geht drauf für Hilfsprogramme (Diese sind übrigens aus meiner Library, die ca. 400-450 Module umfaßt).

Das C Programm ist mit dem Hi-Tech Compiler und das Assembler Programm mit dem M80 (dann LINK) getestet; letzteres bitte noch mal durchlaufen lassen, denn ich habe schnell (in einer Z80-freien Umgebung) noch ein paar Kommentare eingefügt - hoffentlich ohne Syntax Fehler zu erzeugen!

Gruss, Werner Cirsovius \\ 16.02.1999

   10 ' Wann ist Ostern ?
   11 ' Nach einem Artikel der Physikalisch-Technischen Bundesanstalt
   12 ' Ausfuehrung in BASIC, Werner Cirsovius, Februar 1999
   13 '
   20 INPUT "Das Jahr eingeben bitte ... ";x
   30 IF x < 1583 THEN PRINT "Julianischer Kalender kann nicht berechnet werden!":END
   40 k = x \ 100
   50 l = (3 * k + 3) \ 4
   60 m = 15 + l - (8 * k + 13) \ 25
   70 s = 2 - l
   80 a = (x MOD 19)
   90 d = ((19 * a + m) MOD 30)
   100 r = (d \ 29) + ((d \ 28) - (d \ 29)) * (a \ 11)
   110 og = 21 + d - r
   120 sz = 7 - ((x + (x \ 4) + s) MOD 7)
   130 oe = 7 - ((og - sz) MOD 7)
   140 os = og + oe
   150 ps = os + 49
   160 ch = os + 39
   170 fl = os + 60
   180 mess$ = " Ostern" : v = os : GOSUB 260
   190 mess$ = " Pfingsten" : v = ps : GOSUB 260
   200 mess$ = " Himmelfahrt" : v = ch : GOSUB 260
   210 mess$ = "Fronleichnam" : v = fl : GOSUB 260
   220 END
   230 '
   240 ' Ausgabe
   250 '
   260 PRINT mess$;" ist am ";
   270 mo = 3
   280 da = v
   290 IF da <= 31 THEN GOTO 350
   300 da = da - 31 : mo = mo + 1
   310 IF da <= 30 THEN GOTO 350
   320 da = da - 30 : mo = mo + 1
   330 IF da <= 31 THEN GOTO 350
   340 da = da - 31 : mo = mo +1
   350 PRINT USING "##";da;
   360 PRINT "." USING "##";mo;
   370 PRINT "." USING "####";x
   380 RETURN

Und hier gibt es alle Umsetzungen als Download ... KLICK = download