Die Osterrechnung von Claus Tøndering

Karl-Heinz Lewin

Die deutschsprachige Wikipedia beschrieb unter dem Stichwort Osterdatum unter der Überschrift "Berechnung des Osterdatums" ab der Version "08:25, 22. Apr. 2003" bis zu der Version "12:00, 28. Jan. 2009" (zu finden unter dem Tab-Reiter "Versionsgeschichte", siehe [de.wikipedia.org] im Literaturvereichnis unten) den folgenden schönen Algorithmus, den ich für den Julianischen Kalender bereits in meinem ersten einschlägigen Artikel [Lewin 2005] (allerdings fehlerhaft mit einem ausgelassenen Zwischenschritt) beschrieben hatte.

Dieser Algorithmus stammte von Claus Tøndering. Seine eigene Formulierung des Algorithmus ist zur Zeit der Abfassung dieser Webseite (März 2024) zu finden unter Isn’t there a simpler way to calculate Easter? (Gibt es keinen einfacheren Weg, Ostern zu berechnen?).


Julianischer Kalender Gregorianischer Kalender Bedeutung
G = Jahr mod 19 G = Jahr mod 19 Mondparameter, Goldene Zahl - 1, Silberne Zahl
C = Jahr ÷ 100 Jahrhundert (÷ ist die Integer-Division)
H = ( C - C ÷ 4 - ( 8 × C + 13 ) ÷ 25 + 19 × G + 15 ) mod 30 H ist (23 - Epakte) modulo 30
I = ( 19 × G + 15 ) mod 30 I = H - H ÷ 28 × ( 1 - 29 ÷ ( H + 1 ) ) × ( ( 21 - G ) ÷ 11 ) Grenzzahl (Abstand des Ostermondes vom 21. März)
J = ( Jahr + Jahr ÷ 4 + I ) mod 7 J = ( Jahr + Jahr ÷ 4 + I + 2 - C + C ÷ 4 ) mod 7 Wochentag des Ostermondes (0 = Sonntag, 1 = Montag, ... 6 = Samstag)
OM = 21 + I OM = 21 + I Ostermond, auch Ostergrenze   (1)
L = I - J L = I - J Anzahl der Tage vom 21. März bis zum Sonntag am oder vor dem Ostermond (eine Zahl zwischen -6 und 28)
Ostermonat = 3 + ( L + 40 ) ÷ 44 Ostermonat = 3 + ( L + 40 ) ÷ 44   (2)
Ostertag = L + 28 - 31 × ( Ostermonat ÷ 4 ) Ostertag = L + 28 - 31 × ( Ostermonat ÷ 4 )  (3)

Anmerkungen:

(1) von mir eingefügt, nicht aus Wikipedia und auch nicht explizit bei Tøndering, jedoch erschließbar aus seiner Festlegung der Bedeutung von I

(2) in Wikipedia ab Version 1:51, 25. Mär. 2008 geändert in: Falls L < 4 dann Ostermonat = 3, andernfalls Ostermonat = 4

(3) in Wikipedia ab Version 1:51, 25. Mär. 2008 geändert in: Falls L < 4 dann Ostertag = L + 28, andernfalls Ostertag = L - 3


Implementierung in einem Tabellenkalkulatiosnprogramm

(Hier Microsoft Excel 2007, deutschsprachige Lizenz)

Ich zeige hier nur die Lösung für den Julianischen Kalender.

Feld

Inhalt

Bedeutung

A1

'Jahr

Jahreszahl

B1

'G

Silberne Zahl = Goldene Zahl - 1

C1

'I

Grenzzahl (Abstand des Ostermondes vom 21. März)

D1

'J

Wochentag des Ostermondes (So=0, Mo=1, Di=2, Mi=3, DO=4, Fr=5,Sa=6)

E1

'L

I-J, Anzahl der Tage vom 21. März bis zum Sonntag am oder vor dem Ostermond (eine Zahl zwischen -6 und 28)

F1

'OM

Tag des Ostermonds, gezählt ab 1. März

G1

'OS

Tag des Ostersonntags, gezählt ab 1. März

A2

532

Startjahr

B2

=REST(A2;19)

C2

=REST((19*B2+15);30)

D2

=REST((A2+GANZZAHL(A2/4)+C2);7)

E2

=C2-D2

F2

=21+C2

G2

=28+E2

A3

=A2+1

B3:G3

Kopie von B2:G2

A4:G96

Kopie von A3:G3

Ausgabe

Jahr	G	I	J	L	OM	OS
 532	0	15	1	14	36	42
 533	1	 4	5	-1	25	27
 534	2	23	4	19	44	47
 535	3	12	1	11	33	39
 536	4	 1	6	-5	22	23
 537	5	20	5	15	41	43
 538	6	 9	2	 7	30	35
 539	7	28	1	27	49	55
 540	8	17	6	11	38	39
 541	9	 6	3	 3	27	31
 542	10	25	2	23	46	51
 543	11	14	6	 8	35	36
 544	12	 3	4	-1	24	27
 545	13	22	3	19	43	47
 546	14	11	0	11	32	39
 547	15	 0	4	-4	21	24
 548	16	19	4	15	40	43
 549	17	 8	1	 7	29	35
 550	18	27	0	27	48	55
 ...	 	 	 	 	 	  

Implementierung in JavaScript

	function DaynumberToDayAndMonth( daynumber ) {
		// assert( daynumber > 0 && daynumber < 62 );
		if ( daynumber <= 31 ) {
			this.dd = daynumber;
			this.mm = 3;
		} else {
			this.dd = daynumber - 31;
			this.mm = 4;
		}
		return this;
	}
	
	function div( a, b ) { // integer division
		return floor( a / b );
	}
	
	function TonderingGregorianEasterTableLine( jr ) {
		// assert( jr >= 0 && jr <= 4999 );
		var c = div( jr, 100 );
		var p = div( 8 * c + 13, 25 );
		var h = ( c - div( c, 4 ) - p + 19 * this.w_g + 15 ) % 30;
		var i = h - div(  h, 28 ) * ( 1 - div( 29, h + 1 ) * div( 21 - g, 11 ) );
		var j = ( jr + div( jr, 4 ) + i + 2 - c + div( c, 4 ) ) % 7 ;
		this.w_h = h;
		this.w_i = i;
		this.w_j = j;
		return this;
	}

	function TonderingJulianEasterTableLine( jr ) {
		// assert( jr >= 0 && jr <= 4999 );
		this.w_h = "";
		this.w_i= (( 19 * this.w_g + 15 ) % 30 );
		this.w_j = ( jr + div( jr, 4 ) + this_w_i ) % 7;
		return this;
	}

	function TonderingEasterTableLine( jr, cal ) {
		// assert( jr >= 0 && jr <= 4999 );
		this.w_jr = jr;
		this.w_g = jr % 19;
		switch ( cal ) {
			case 'J': // Julian calendar
			    ee = TonderingJulianEasterTableLine( jr );
				break;
			case 'G': // Gregorian calendar
			    ee = TonderingGregorianEasterTableLine( jr );
				break;
			case 'A': // Occidental calendar ("Abendländischer Kalender")
			    ee = ( jr <= 1582 ) 
				   ? TonderingJulianEasterTableLine( jr )
				   : TonderingGregorianEasterTableLine( jr );
				break;
		}
		this.w_l = this.w_i - this.w_j;
		this.w_om = 21 + this.w_i;
		this.w_os = 28 + this.w_l;
		return this;
	}

	function TonderingEasterTable( annus, times, cal, outputformatter ) {
		// assert( annus >= 0 && annus <= 4996 );
		// assert( times >= 4 && times <= 532 );
		for ( let jr = annus; jr < annus + times; jr++ ) {
			var line = TonderingEasterTableLine( jr, cal );
			outputformatter( line );
		}
	}


Die formelle Überprüfung des Algorithmus

Wenn Sie auf den unten folgenden Knopf klicken, dann erscheint zum Vergleich mit dem weiter oben gezeigten ersten 19-jährigen Abschnitt der Ausgabe des Tabellenkalkulationsprogramms eine nach dem soeben erschlossenen Algorithmus mit den gezeigten JavaScript-Funktionen erzeugte Berechnung der Ostermond- und Ostersonntagsdaten mit allen Zwischenergebnissen..
Einen Osterrechner mit diesem Algorithmus, bei dem Sie das Startjahr, die Anzahl der Jahre und die Art des Kalenders (Julianisch, Gregorianisch, Abendländisch (d.h. Julianisch bis 1582, Gregorianisch ab 1583)) wählen können, finden Sie unter Die Osterrechnung von Claus Tøndering als Tabellenrechner.



Literatur

de.wikipedia: Stichwort Osterdatum, dort unter dem Tab-Reiter "Versionsgeschichte" auf "älteste" klicken, ab der Version "08:25, 22. Apr. 2003" bis zu der Version "12:00, 28. Jan. 2009" jeweils unter der Überschrift "Berechnung des Osterdatums"

Lewin, Karl-Heinz (2005): Komputistik contra Phantomzeitthese. Führt der Computus Paschalis die Phantomzeitthese ad absurdum?; ZS 17 (2) 455-464; (22023): https://com-pas.de/computuspaschalis/1cyclopaschalisravenna.de.htm

Tøndering, Claus (o. J.): Easter; https://www.tondering.dk/claus/cal/easter.php; sein Algorithmus findet sich im Abschnitt mit der Überschrift "Isn’t there a simpler way to calculate Easter?" (Gibt es keinen einfacheren Weg, Ostern zu berechnen?).
Diese Webseite wurde nach Ostern 2011 erstellt, da Tøndering sich auf Ostern 2001 als ein Ereignis in der Verganbgenheit bezieht ("When was Easter 2011?"). Aber sein Algorithmus war unter dem Titel "Calendar FAQ" auf URL http://www.tondering.dk/claus/calendar.html mindestens vor dem 22. März 2003 im Internet zugänglich, da der Wikipedia-Benutzeer "Flups", der die oben angegebene Version der Wikipedia-Seite "Osterdatum" mit Tønderins Algorithmus erstellt hatte, auf diesen Titel mit der angegebenen URL und auf den (zweifach falsch geschriebenen) Namen "Klaus Tondering" verwies.


Der Autor ist Mathematiker und arbeitete als Software-Entwickler.

Karl-Heinz Lewin, Haar: karl-heinz.lewin@t-online.de

Copyright © Karl-Heinz Lewin, 2024