The Easter calculation of Carl Friedrich Gauß

Karl-Heinz Lewin

Here I use the formulas for the Julian calendar from the article Gaußsche Osterformel from the German Wikipedia (as well as an additional one for the Easter moon):


Julian calendar Gregorian calendar Meaning
a = year mod 19 a = year mod 19 Moon parameter
b = year mod 4 b = year mod 4
c = year mod 7 c = year mod 7
k = year div 100
p = (8k + 13) div 25
q = k div 4
M = 15 M = (15 + k - p - q) mod 30
d = (19a + M) mod 30 d = (19a + M) mod 30
If d=29 or d=28 and a > 10,
then d = d - 1   (1)
Germ for the first full moon in spring
om = 21 + d om = 21 + d Day of the Easter moon, the first full moon of spring, counted from 1 March
N = 6 N = (4 + k - q) mod 7
e = (2b + 4c + 6d + N) mod 7 e = (2b + 4c + 6d + N) mod 7 Distance of Easter Sunday from the Easter border (i.e. from the Easter moon)
os = 22 + d + e
(The conditions for the correction
do not occur here.)
os = 22 + d + e
Wikipedia here has the exceptions:   (2) (3)
If d=28 and e=6 and a>10, then os=49
If d=29 and e=6, then os=50
Day of Easter Sunday, counted from 1 March

Anmerkungen:

(1) The correction is borrowed from the "Astronomischer Osterrechner" by Nikolaus Alexander Bär, see the source code of one of the two HTML pages listed in the bibliography, there respectively in the Javascript code in the "function EastCalc".
Bär had the correction in the calculation of the cyclic Easter moon "luna", which I call "om" here; I make the corresponding correction directly to the variable "d".

(2) Thanks to the correction of d (see note (1)), the correction of Easter Sunday is unnecessary, because:
If previously d=29 and e=6, then this resulted
om = 21 + d = 21 + 29 = 50 → 19 April,
os = 22 + d + e = 22 + 29 + 6 = 57 → 26 April,
the latter was corrected to os = 50 → 19 April.
Now it is corrected to d = 28 and thus e = 0, resulting in
om = 21 + d = 21 + 28 = 49 → 18 April,
os = 22 + d + e = 22 + 28 + 0 = 50 → 19 April!
If d=28 and e=6 (and a > 10), then the result is
om = 21 + d = 21 + 28 = 49 → 18 April,
os = 22 + d + e = 22 + 28 + 6 = 56 → 25 April,
the latter has been corrected to os = 49 → 18 April.
Now it is corrected to d = 27 and thus e = 0, which results in
om = 21 + d = 21 + 27 = 48 → 17 April,
os = 22 + d + e = 22 + 27 + 0 = 49 → 18 April!

(3) The stated rule for d=28 does not cover all liturgically necessary exceptional cases. This concerns "Exception Rule No.2" in [Voigt 146]. The Gaussian Easter formula therefore fails in the years 1954, 2049, 3165, 3260, 3317, 4080 and 4099 [Voigt 148]. This can be easily checked with the comparison calculator for the Gregorian calendar: In these years the Easter moon is with Gauß on the day on which with the comparison algorithms (Donald Knuth and Claus Tøndering) is Easter Sunday (18 April), and Easter Sunday is with Gauß a week later, on 25 April.
Of course, there are also such "slips" in the period up to 1582, if you also want to compare the algorithms for these periods, but nobody has done the maths yet because it has no practical significance.


Implementation in a spreadsheet program

(Here Microsoft Excel 2007, German licence)

I am only showing the solution for the Julian calendar here.

Field

Contents

Meaning

A1

'Year

Year number

B1

'a

Moon parameter

C1

'b

D1

'c

E1

'd

Germ for the first full moon in spring

F1

'e

Distance of Easter Sunday from the Easter moon

G1

'om

Day of the Easter moon, counted from 1 March

H1

'os

Day of Easter Sunday, counted from 1 March

A2

532

Start year

B2

=REST(A2;19)

C2

=REST(A2;4)

D2

=REST(A2;7)

E2

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

F2

=REST((2*C2+4*D2+6*E2+6);7)

G2

=21+E2

H2

=22+E2+F2

A3

=A2+1

B3:H3

Copy of B2:H2

A4:H96

Copy of A3:H3

Output

  A	B	C	D	E	F	G	H
Jahr	a	b	c	d	e	om	os
 532	0	0	0	15	5	36	42
 533	1	1	1	4	1	25	27
 534	2	2	2	23	2	44	47
 535	3	3	3	12	5	33	39
 536	4	0	4	1	0	22	23
 537	5	1	5	20	1	41	43
 538	6	2	6	9	4	30	35
 539	7	3	0	28	5	49	55
 540	8	0	1	17	0	38	39
 541	9	1	2	6	3	27	31
 542	10	2	3	25	4	46	51
 543	11	3	4	14	0	35	36
 544	12	0	5	3	2	24	27
 545	13	1	6	22	3	43	47
 546	14	2	0	11	6	32	39
 547	15	3	1	0	2	21	24
 548	16	0	2	19	2	40	43
 549	17	1	3	8	5	29	35
 550	18	2	4	27	6	48	55
 ...


Implementation 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 CFrGaussGregorianEasterTableLine( j ) {
		// assert( j >= 0 && j <= 4999 );
		var k = div( j, 100 );
		var p = div( 8 * k + 13, 25 );
		var q = div( k, 4 );
		var M = ( 15 + k - p - q ) % 30;
		this.g_d = ( 19 * this.g_a + M ) % 30;
		if ( this.g_d == 29  || this.g_g == 28 && this.g_a > 10 ) {
			this.g_d -- ;
		}
		var N = ( 4 + k - q ) % 7;
		this.g_e = ( 2 * this.g_b + 4 * this.g_c + 6 * this.g_d + N ) % 7;
		return this;
	}

	function CFrGaussJulianEasterTableLine( j ) {
		// assert( j >= 0 && j <= 4999 );
		const M = 15;
		this.g_d = (( 19 * this.g_a + M ) % 30 );
		const N = 6;
		this.g_e = ( 2 * this.g_b + 4 * this.g_c + 6 * this.g_d + N ) % 7;
		return this;
	}

	function CFrGaussEasterTableLine( j, cal ) {
		// assert( j >= 0 && j <= 4999 );
		this.g_j = j;
		this.g_a = j % 19;
		this.g_b = j % 4;
		this.g_c = j % 7;
		switch ( cal ) {
			case 'J': // Julian calendar
			    ee = CFrGaussJulianEasterTableLine( j );
				break;
			case 'G': // Gregorian calendar
			    ee = CFrGaussGregorianEasterTableLine( j );
				break;
			case 'A': // Occidental calendar ("Abendländischer Kalender")
			    ee = ( j <= 1582 ) 
				   ? CFrGaussJulianEasterTableLine( j )
				   : CFrGaussGregorianEasterTableLine( j );
				break;
		}
		this.g_om = 21 + this.g_d;
		this.g_os = 22 + this.g_d + this.g_e;
		return this;
	}

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


Formal verification of the algorithm

If you click on the button below, you will see for a comparison with the first 19-year section of the spreadsheet program output shown above a calculation of the Easter moon and Easter Sunday dates generated according to the algorithm just developed with the shown JavaScript functions with all the intermediate results.
An Easter calculator with this algorithm, where you can enter the start year, the number of years and the type of calendar (Julian, Gregorian, Occidental (i.e. Julian until 1582, Gregorian from 1583)) can be found at The Easter calculation by Carl Friedrich Gauß as a table calculator.



Literature

Bär, Nikolaus Alexander (2006): Berechnung des Osterdatums - Astronomischer Osterrechner; http://www.nabkal.de:80/ostrech2.html; or: Astronomischer Osterrechner, Rechner pur; http://www.nabkal.de:80/osterrechner2.html

de.wikipedia: Keyword Gaußsche Osterformel

Voigt, Ulrich (2003): Das Jahr im Kopf. Kalender und Mnemotechnik; Likanas Verlag, Hamburg


The author is a mathematician and worked as a software developer.

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

Copyright © Karl-Heinz Lewin, 2024