Oster- und Paschaformeln

Einführung

Die Mutter des Mathematikers Karl Friedrich Gauß gab das Geburtsdatum ihres Sohnes am 30.4.1777 als "am Mittwoch der Woche vor Himmelfahrt" an. Vielleicht der Grund warum sich Gauß der Berechnung des Ostertermins annahm und im Jahr 1800 eine Formel dafür entwickelte, für die er den Beweis allerdings schuldig blieb. Zusätzlich entwarf er noch eine Formel mit deren Hilfe der erste Tag des Paschafestes berechnet werden kann.
Diese und andere habe ich in die Programmiersprache BASIC umgeschrieben und getestet. Die Formeln wurden von mir so erweitert, dass die Variable "Ostern%" immer die Tage zum Ostersonntag ab dem 1. Januar angibt. Die Zeilen IF (Jahr&... und Ostern% =... gehören also nicht zur eigentlichen Formel! Bei Formeln die nur zwischen 1900 und 2099 gelten habe ich auf die erweiterte gregorianische Schaltung für Feb% verzichtet.

Die Osterformeln

SUB JulianischeOstern(Jahr&, Ostern%)
  'Gaußsche Formel für den Julianischen Kalender
  IF Jahr& MOD 4 = 0 THEN Feb% = 29 ELSE Feb% = 28
  a& = Jahr& MOD 19
  b& = Jahr& MOD 4
  c& = Jahr& MOD 7
  d& = (19 * a& + 15) MOD 30
  e& = (2 * b& + 4 * c& + 6 * d& + 6) MOD 7
  Ostern% = 31 + Feb% + 21 + d& + e&
END SUB

'Gaußsche Formel für den Gregorianischen Kalender gültig von 1583 bis 2499
SUB Gauss(Jahr&, Ostern%)
  IF (Jahr& MOD 4 = 0 AND Jahr& MOD 100 <> 0) OR Jahr& MOD 400 = 0 THEN Feb% = 29 ELSE Feb% = 28
  SELECT CASE Jahr&
    CASE 1583 TO 1699
      M& = 22: N& = 2
    CASE 1700 TO 1799
      M& = 23: N& = 3
    CASE 1800 TO 1899
      M& = 23: N& = 4
    CASE 1900 TO 2099
      M& = 24: N& = 5
    CASE 2100 TO 2199
      M& = 24: N& = 6
    CASE 2200 TO 2299
      M& = 25: N& = 0
    CASE 2300 TO 2399
      M& = 26: N& = 1
    CASE 2400 TO 2499
      M& = 25: N& = 1
  END SELECT
  a& = Jahr& MOD 19
  b& = Jahr& MOD 4
  c& = Jahr& MOD 7
  d& = (19 * a& + M&) MOD 30
  e& = (2 * b& + 4 * c& + 6 * d& + N&) MOD 7
  Ostern% = 31 + Feb% + 21 + d& + e&
  IF Ostern% - Feb% = 87 THEN
     Ostern% = Ostern% - 7
  ELSEIF a& > 10 AND d& = 28 AND Ostern% - Feb% = 86 THEN
     Ostern% = Ostern% - 7
  END IF
END SUB

'Nach Dr. Heiner Lichtenberg
'Veröffentlicht 1997 in der Zeitschrift "Historia Mathematica 24"
SUB Lichtenberg(Jahr&, Ostern%)
  'Für den julianischen Kalender setze man die säkularen Schaltfunktionen konstant, nämlich S = 0 und M = 15.
  'In diesem Fall braucht man natürlich auch die Größen K und R nicht.
  'Für K gibt's schlicht keine Verwendung mehr und R bleibt konstant Null.
  IF (Jahr& MOD 4 = 0 AND Jahr& MOD 100 <> 0) OR Jahr& MOD 400 = 0 THEN Feb% = 29 ELSE Feb% = 28
  k& = INT(Jahr& / 100)
  m& = 15 + INT((3 * k& + 3) / 4) - INT((8 * k& + 13) / 25)
  s& = 2 - INT((3 * k& + 3) / 4)
  a& = Jahr& MOD 19
  d& = (19 * a& + m&) MOD 30
  r& = INT(d& / 29) + (INT(d& / 28) - INT(d& / 29)) * INT(a& / 11)
  og& = 21 + d& - r&
  sz& = 7 - (Jahr& + INT(Jahr& / 4) + s&) MOD 7
  oe& = 7 - (og& - sz&) MOD 7
  Ostern% = 31 + Feb% + og& + oe& - 1
END SUB

'Von J. M. Oudin aus dem Jahre 1940
SUB Oudin(Jahr&, Ostern%)
  'Étude sur la date de Pâques. in: Bulletin Astronomique, Bd. XII, S. 391-410
  'Zuletzt veröffentlicht in "Explanatory Supplement to the Astronomical Almanac" von P. K. Seidelmann (1992)
  IF (Jahr& MOD 4 = 0 AND Jahr& MOD 100 <> 0) OR Jahr& MOD 400 = 0 THEN Feb% = 29 ELSE Feb% = 28
  c& = INT(Jahr& / 100)
  n& = Jahr& - 19 * INT(Jahr& / 19)
  k& = INT((c& - 17) / 25)
  i& = c& - INT(c& / 4) - INT((c& - k&) / 3) + 19 * n& + 15
  i& = i& - 30 * INT(i& / 30)
  i& = i& - INT(i& / 28) * (1 - INT(i& / 28) * INT(29 / (i& + 1)) * INT((21& - n&) / 11))
  j& = Jahr& + INT(Jahr& / 4) + i& + 2 - c& + INT(c& / 4)
  j& = j& - 7 * INT(j& / 7)
  l& = i& - j&
  m& = 3 + INT((l& + 40) / 44)
  d& = l& + 28 - 31 * INT(m& / 4)
  Ostern% = 31 + Feb% + d& - 1: IF m& = 4 THEN Ostern% = Ostern% + 31
END SUB

'Aus Jean Meeus "Astronomischer Algorithmen"
SUB Butcher(Jahr&, Ostern%)
  '1876 in Butchers "Ecclesiastical Calendar" veröffentlicht.
  IF (Jahr& MOD 4 = 0 AND Jahr& MOD 100 <> 0) OR Jahr& MOD 400 = 0 THEN Feb% = 29 ELSE Feb% = 28
  a& = Jahr& MOD 19
  b& = INT (Jahr& / 100)
  c& = Jahr& MOD 100
  d& = INT(b& / 4)
  e& = b& MOD 4
  f& = INT((b& + 8) / 25)
  g& = INT((b& - f& + 1) / 3)
  h& = (19 * a& + b& - d& - g& + 15) MOD 30
  i& = INT(c& / 4)
  k& = c& MOD 4
  l& = (32 + 2 * e& + 2 * i& - h& - k&) MOD 7
  m& = INT((a& + 11 * h& + 22 * l&) / 451)
  n& = INT((h& + l& - 7 * m& + 114) / 31)
  p& = ((h& + l& - 7 * m& + 114) MOD 31)
  Ostern% = 31 + Feb% + p&: IF n& = 4 THEN Ostern% = Ostern% + 31
END SUB

SUB TU_Braunschweig(Jahr&, Ostern%)
  'Quelle: Aufgabenblatt 5,  Programmieren I,  TU Braunschweig, 1991.
  'Die Formel stammt von Christopher Clavius und Aloysius Lilius aus dem 16. Jahrhundert.
  'Sie gilt für den Gregorianischen Kalender, also ab 1583.
  'Zu den Variablen:   GZ : Goldene Zahl,  JH : Jahrhundert,  GK : Gregorianische Korrektur,  CK1 : Clavische Korrektur.
  'Die Gregorianische Korrektur ist der Versatz des Gregorianischen Kalenders zum Julianischen Kalender.
  'Zur Zeit ist GK=13. Die Clavische Korrektur ist die Angleichung an den Mondlauf. Zur Zeit hat sie den Wert CK = 6.
  'Im Vergleich zur Gauß-Formel ist die in der Formel unten verwendete Variable CK1 = CK - 5.
  IF (Jahr& MOD 4 = 0 AND Jahr& MOD 100 <> 0) OR Jahr& MOD 400 = 0 THEN Feb% = 29 ELSE Feb% = 28
  GZ& = Jahr& MOD 19 + 1
  JH& = INT (Jahr& / 100) + 1
  GK& = INT ((3 * JH&) / 4) - 2
  CK1& = INT((JH& - 16 - INT ((JH& - 18) / 25)) / 3)
  ExtraTage& = INT ((5 * Jahr&) / 4) - GK&
  Epakte& = (11 * GZ&  + CK1& - GK&) MOD 30
  IF Epakte& <= 0  THEN  Epakte& = Epakte& + 30
  IF ((Epakte& = 25) AND (GZ& > 11)) OR (Epakte& = 24)  THEN  Epakte& = Epakte& + 1
  Tag& = 44 - Epakte&
  IF Tag& < 21  THEN  Tag& = Tag& + 30
  Tag& = Tag& + 7 - (ExtraTage& + Tag&) MOD 7
  Monat& = 3
  IF Tag& > 31  THEN  Tag& = Tag& - 31: Monat& =  4
  Ostern% = 31 + Feb% + Tag& - 1: IF Monat& = 4 THEN Ostern% = Ostern% + 31
END SUB

SUB Clavius(Jahr&, Ostern%)
  'Aus "The Art of Computer Programming", Band 1, erstmals veröffentlicht 1962 von Knuth
  'Erstellt nach den Quellen von Christopher Clavius
  IF (Jahr& MOD 4 = 0 AND Jahr& MOD 100 <> 0) OR Jahr& MOD 400 = 0 THEN Feb% = 29 ELSE Feb% = 28
  g& = Jahr& MOD 19 + 1
  j& = INT(Jahr& / 100) + 1
  x& = INT(j& * 3 / 4) - 12
  z& = INT((j& * 8 + 5) / 25) - 5
  d& = INT(Jahr& * 5 / 4) - x& - 10
  e& = (g& * 11 + 20 + z& - x&) MOD 30
  IF (e& = 25 AND g& > 11) OR e& = 24 THEN e& = e& + 1
  t& = 44 - e&
  IF t& < 21 THEN t& = t& + 30
  t& = t& + 7 - (d& + t&) MOD 7
  Ostern% = 31 + Feb% + t& - 1
END SUB

'Osterberechnung für die Jahre von 1583 bis 4099
'von Ronald W. Mallen mit den Originalkommentaren
SUB Mallen(Jahr&, Ostern%)
  'It's free!  Please do not modify code or comments!
  IF (Jahr& MOD 4 = 0 AND Jahr& MOD 100 <> 0) OR Jahr& MOD 400 = 0 THEN Feb% = 29 ELSE Feb% = 28
  FirstDig& = INT (Jahr& / 100)        'first 2 digits of year
  Remain19& = Jahr& MOD 19             'remainder of year / 19
  'calculate PFM date
  temp& = INT((FirstDig& - 15) / 2 + 202 - 11 * Remain19&)
  IF FirstDig& > 26 THEN temp& = temp& - 1
  IF FirstDig& > 38 THEN temp& = temp& - 1
  IF ((FirstDig& = 21) OR (FirstDig& = 24) OR (FirstDig& = 25) OR (FirstDig& = 33) OR (FirstDig& = 36) OR (FirstDig& = 37)) THEN temp& = temp& - 1
  temp& = temp& MOD 30
  tA& = temp& + 21
  IF temp& = 29 THEN tA& = tA& - 1
  IF (temp& = 28 AND Remain19& > 10) THEN tA& = tA& - 1
  'find the next Sunday
  tB& = (tA& - 19) MOD 7
  tC& = (40 - FirstDig&) MOD 4
  IF tC& = 3 THEN tC& = tC& + 1
  IF tC& > 1 THEN tC& = tC& + 1
  temp& = Jahr& MOD 100
  tD& = INT (temp& + temp& / 4) MOD 7
  tE& = ((20 - tB& - tC& - tD&) MOD 7) + 1
  d& = tA& + tE&
  'return the date
  IF d& > 31 THEN
    d& = d& - 31
    m& = 4
  ELSE
    m& = 3
  END IF
  Ostern% = 31 + Feb% + d& - 1: IF m& = 4 THEN Ostern% = Ostern% + 31
END SUB

SUB Wuensche(Jahr&, Ostern%)
  'Von Peter Wünsche für die Jahre von 1900 - 2099
  'OT& = Ostertag, OM& = Ostermonat
  IF Jahr& MOD 4 = 0 THEN Feb% = 29 ELSE Feb% = 28
  a& = Jahr& MOD 19
  b& = Jahr& MOD 4
  c& = Jahr& MOD 7
  d& = (19 * a& + 24) MOD 30
  e& = (2 * b& + 4 * c& + 6 * d& + 5) MOD 7
  OT& = 22 + d& + e&
  OM& = 3
  IF OT& > 31 THEN OT& = d& + e& - 9: OM& = 4
  IF OT& = 26 AND OM& = 4 THEN OT& = 19
  IF OT& = 25 AND OM& = 4 AND d& = 28 AND e& = 6 AND a& > 10 THEN OT& = 18
  Ostern% = 31 + Feb% + OT& - 1: IF OM& = 4 THEN Ostern% = Ostern% + 31
END SUB

SUB Herger(Jahr&, Ostern%)
  'Die Formel liefert richtige Daten für die Jahre von 1900 - 2099
  'Der unbekannte Autor beschränkt die Jahreszahlen jedoch von 1900 - 2078
  IF Jahr& MOD 4 = 0 THEN Feb% = 29 ELSE Feb% = 28
  IF Jahr& < 1900 OR Jahr& > 2078 THEN EXIT SUB
  M& = 24
  N& = 5
  A& = Jahr& MOD 19
  B& = Jahr& MOD 4
  C& = Jahr& MOD 7
  D& = (19 * A& + M&) MOD 30
  E& = ((2 * B&) + (4 * C&) + (6 * D&) + N&) MOD 7
  O& = 22 + D& + E&
  IF O& > 31 THEN
    O& = D& + E& - 9: Monat& = 4
    IF O& = 26 THEN
      O& = 19
    ELSEIF O& = 25 AND D& = 28 AND (Jahr& MOD 19) > 10 THEN
      O& = 18
    END IF
  ELSE
    Monat& = 3
  END IF
  Ostern% = 31 + Feb% + O& - 1: IF Monat& = 4 THEN Ostern% = Ostern% + 31
END SUB

SUB Carter(Jahr&, Ostern%)
  'Für die Jahre von 1900 bis 2099
  IF Jahr& MOD 4 = 0 THEN Feb% = 29 ELSE Feb% = 28
  a& = 225 - 11 * (Jahr& MOD 19)
  b& = (a& - 21) MOD 30 + 21
  IF b& > 48 THEN b& = b& - 1
  c& = INT (Jahr& + (Jahr& / 4) + b& + 1) MOD 7
  d& = b& + 7 - c&
  Ostern% = 31 + Feb% + d& - 1
END SUB

SUB Beirne(Jahr&, Ostern%)
  'Für die Jahre 1900 bis 2099 angeblich von T.O´Beirne
  IF Jahr& MOD 4 = 0 THEN Feb% = 29 ELSE Feb% = 28
  j& = Jahr& - 1900
  a& = j& MOD 19
  b& = INT((7 * a& + 1) / 19)
  m& = (11 * a& + 4 - b&) MOD 29
  q& = INT(j& / 4)
  w& = (j& + q& + 31 - m&) MOD 7
  t& = 24 - m& - w&
  Ostern% = 31 + Feb% + 31 + t&
END SUB

'Die folgende Formel wurde mir von Günther Faust zur Verfügung gestellt.
'Das es sich ohnehin um einen BASIC-Code handelt habe ich auf eine Anpassung verzichtet.
'****************************************************************************
'   Funktion zur Ermittlung des Osterdatums mit Hilfe der Gaußschen
'   Formel. Das Besondere an der Funktion ist die Berechnung der
'   M- und N-Werte, die bei Gauß nur für 1700 bis 2199  tabelliert vorliegen.
'                    (c) 1983 ... 2004 Günther Faust
'****************************************************************************
FUNCTION Odatum$ (Jahr$)
  J = VAL(Jahr$)
  p = J \ 100
  q = p \ 3
  r = p \ 4
  M = (15 + p - q - r) MOD 30
  N = (p + 4 - r) MOD 7
  A = J MOD 19
  B = J MOD 4
  C = J MOD 7
  D = 19 * A + M
  D = D MOD 30
  E = ((2 * B) + (4 * C) + (6 * D) + N) MOD 7
  IF D + E < 10 THEN
    otag = D + E + 22
    omon = 3
  ELSE
    otag = D + E - 9
    omon = 4
    IF otag = 26 THEN otag = 19
    IF otag = 25 AND D = 28 AND A > 10 THEN otag = 18
  END IF

  ot$ = "0" + LTRIM$(STR$(otag))
  om$ = "0" + LTRIM$(STR$(omon))
  Odatum$ = RIGHT$(ot$, 2) + "." + RIGHT$(om$, 2) + "." + Jahr$
END FUNCTION

Die Paschaformel

Beim jüdischen Kalender wird der Jahresanfang vom Neumond bestimmt. Dieser, als Molad bezeichnete Mond, basiert auf einer Berechnungsweise der ein Mondumlauf von 29,5305941235 Tagen zugrunde liegt.
Im Jahre 1802 schuf Karl Friedrich Gauß eine Formel zur Bestimmung des jüdischen Paschafestes. Er selbst beschrieb die Berechnung wie folgt:

"Der 15. Nisan des jüdischen Jahres A, an welchem die Juden ihr Osterfest feiern, fällt in das Jahr A − 3760 = B der christlichen Zeitrechnung; zur Bestimmung des entsprechenden Monatstages dient folgende rein arithmetische Regel: Man berechne den Wert von 32,0440932 + 1,5542418a + 0,25b − 0,003177794A oder von 20,0955877 + 1,5542418a + 0,25b − 0,003177794B und setze ihn M + m, so dass M die ganze Zahl und m den Dezimalbruch bedeute. Endlich dividiere man M + 3A + 5b + 5 oder M + 3B + 5b + 1 mit 7 und setze den Rest = c. - Nun hat man folgende Fälle zu unterscheiden:

  1. Ist c = 2 oder 6, so fällt Ostern auf den (M + 1)ten März alten Stils, wofür man den (M - 30)ten April schreibt, wenn M > 30 wegen Adu.
  2. Ist c = 1, zugleich a > b und außerdem m ≥ 0,63287037, so fällt Ostern auf den (M + 2)ten März alten Stils, wegen Gatrad.
  3. Ist c = 0, zugleich a > 11 und noch m ≥ 0,89772376, so ist Ostern den (M + 1)ten März alten Stils, wegen Betuthakpat.
  4. In allen übrigen Fällen ist Ostern den Mten März alten Stils."

Die Vertagungen

  1. Adu
    Tritt der Neujahrsmolad am Sonntag, Mittwoch oder Freitag ein, so wird Neujahr auf den folgenden Tag verlegt um die Aufeinanderfolge von Sabbat und Versöhnungstag zu verhindern.
  2. Jach Adu
    Tritt der Neujahrsmolad um oder nach 12 Uhr (18 Uhr jüdischer Zeit) ein, so wird Neujahr auf den folgenden Tag verlegt, weil die erste Mondsichel wahrscheinlich erst dann sichtbar wird.
    Diese Regel ergibt sich aus der Formel von selbst und wird daher von Gauß nicht aufgeführt.
  3. Gatrad
    Fällt der Neujahrsmolad eines Gemeinjahres auf Dienstag zwischen 3 Uhr 11,6 Minuten und 21.00 Uhr (9 Uhr 204 Chalakim und 18.00 Uhr jüdischer Zeit) wird das Neujahr auf Donnerstag verschoben. Da das folgende Jahr in diesem Fall erst mit dem Montag beginnen würde und das aktuelle Jahr damit nicht erlaubte 365 Tage hätte.
  4. Betuthakpat
    Fällt der Neujahrsmolad in einem Gemeinjahr nach einem Schaltjahr auf Montag um oder nach 9 Uhr 32,7 Minuten und 21.00 Uhr (15 Uhr 589 Chalakim und 18.00 Uhr) wird das Neujahr auf Dienstag verschoben. Hiermit wird verhindert, dass das vorhergehende Schaltjahr nur eine Länge von 382 Tagen statt der geforderten 383 hat.

Der Programmcode

SUB Pascha(Jahr&)
  'Erster Paschatag unter Berücksichtigung der gregorianischen Kalenderreform
  dcomyear = Jahr&
  dyear = Jahr& + 3760
  da = (12 * dyear + 17) MOD 19
  db = dyear MOD 4
  dm = 32 + 4343 / 98496 + da + da * (272953 / 492480) + db / 4
  dm = dm - dyear * (313 / 98496)
  dmfrac = dm - INT(dm)
  dc = (3 * dyear + 5 * db + INT(dm) + 5) MOD 7
  IF dc = 2 OR dc = 4 OR dc = 6 THEN dm = dm + 1
  IF dc = 1 AND da > 6 AND dmfrac >= 1367 / 2160 THEN dm = dm + 2
  IF dc = 0 AND da > 11 AND dmfrac >= 23269 / 25920 THEN dm = dm + 1
  ds = INT(dcomyear / 100)
  dadd = INT((3 * ds - 5) / 4)
  IF dcomyear > 1582 THEN dm = dm + dadd
  Tag% = INT(dm)
  Monat% = 3
  IF Tag% > 153 THEN Monat% = 8: Tag% = Tag% - 153
  IF Tag% > 122 THEN Monat% = 7: Tag% = Tag% - 122
  IF Tag% > 92 THEN Monat% = 6: Tag% = Tag% - 92
  IF Tag% > 61 THEN Monat% = 5: Tag% = Tag% - 61
  IF Tag% > 31 THEN Monat% = 4: Tag% = Tag% - 31
  PRINT "Erster Paschatag:"; Tag%; Monat%; Jahr&
END SUB

Hauptseite Verzeichnis