Open In App

How to calculate the Easter date for a given year using Gauss’ Algorithm

Given an integer Y, denoting a year, as input, the task is to find the date of Easter for that year.

Examples: 



Input: Y = 2020 
Output: 2020-04-12 
Explanation: In 2020, Easter was on 12 April. Hence, Easter date will be 2020-04-12

Input: Y = 1991 
Output: 1991-03-30 
Explanation: In 1991, Easter was on 30 March. Hence, Easter date will be 1991-03-30 



Approach: Gauss Easter Algorithm is used to easily calculate the date of Easter for a year. This algorithm was first thought of by Carl Friedrich Gauss. There is no proper explanation on how Gauss landed up with this algorithm, but the implementation of this algorithm has proved to be very accurate. 
A detailed explanation of the Gauss Easter Algorithm is as follows: 

A = Y mod 19

B = Y mod 4

C = Y mod 7

P = floor (Y / 100) 
Q = ((13 + 8 * P) / 25) 
M = (15 – Q + P – (P / 4)) mod 30 

N = (4 + P – (P / 4)) mod 7

D = (19*A + M) mod 30

E = (N + 2*B + 4*C + 6*D) mod 7 

if (D == 29) and (E == 6) 
return “April 19” 
else if (D == 28) and (E == 6) 
return “April 18” 

Below is the implementation of the above approach:




// C++ program for the
// above approach
 
#include <iostream>
#include <math.h>
 
using namespace std;
 
// Function calculates and prints
// easter date for given year Y
void gaussEaster(int Y)
{
    float A, B, C, P, Q, M, N, D, E;
 
    // All calculations done
    // on the basis of
    // Gauss Easter Algorithm
    A = Y % 19;
    B = Y % 4;
    C = Y % 7;
    P = floor((float)Y / 100.0);
 
    Q = floor((float)(13 + 8 * P) / 25.0);
 
    M = (int)(15 - Q + P - (floor)(P / 4)) % 30;
 
    N = (int)(4 + P - (floor)(P / 4)) % 7;
 
    D = (int)(19 * A + M) % 30;
 
    E = (int)(2 * B + 4 * C + 6 * D + N) % 7;
 
    int days = (int)(22 + D + E);
 
    // A corner case,
    // when D is 29
    if ((D == 29) && (E == 6)) {
        cout << Y << "-04-19";
        return;
    }
    // Another corner case,
    // when D is 28
    else if ((D == 28) && (E == 6)) {
        cout << Y << "-04-18";
        return;
    }
    else {
        // If days > 31, move to April
        // April = 4th Month
        if (days > 31) {
            cout << Y << "-04-" << (days - 31);
            return;
        }
        else {
            // Otherwise, stay on March
            // March = 3rd Month
            cout << Y << "-03-" << days;
            return;
        }
    }
}
 
// Driver Code
int main()
{
    int Y = 2100;
    gaussEaster(Y);
 
    return 0;
}




// Java program for the
// above approach
 
import java.util.Date;
import java.util.Scanner;
 
// Function calculates and prints
// easter date for given year Y
public class GaussEaster {
 
    static void gaussEaster(int Y)
    {
        float A, B, C, P, Q, M, N, D, E;
 
        // All calculations done
        // on the basis of
        // Gauss Easter Algorithm
        A = Y % 19;
        B = Y % 4;
        C = Y % 7;
        P = (float)Math.floor(Y / 100);
        Q = (float)Math.floor((13 + 8 * P) / 25);
        M = (int)(15 - Q + P - Math.floor(P / 4)) % 30;
        N = (int)(4 + P - Math.floor(P / 4)) % 7;
        D = (19 * A + M) % 30;
        E = (2 * B + 4 * C + 6 * D + N) % 7;
        int days = (int)(22 + D + E);
 
        // A corner case,
        // when D is 29
        if ((D == 29) && (E == 6)) {
            System.out.println(Y + "-04"
                               + "-19");
            return;
        }
        // Another corner case,
        // when D is 28
        else if ((D == 28) && (E == 6)) {
            System.out.println(Y + "-04"
                               + "-18");
            return;
        }
        else {
 
            // If days > 31, move to April
            // April = 4th Month
            if (days > 31) {
                System.out.println(Y + "-04-"
                                   + (days - 31));
                return;
            }
            // Otherwise, stay on March
            // March = 3rd Month
            else {
                System.out.println(Y + "-03-" + days);
                return;
            }
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int Y = 2100;
        gaussEaster(Y);
    }
}




# Python3 program for the
# above approach
import math
 
# Function calculates and prints
# easter date for given year Y
def gaussEaster(Y):
   
    # All calculations done
    # on the basis of
    # Gauss Easter Algorithm
    A = Y % 19
    B = Y % 4
    C = Y % 7
     
    P = math.floor(Y / 100)
    Q = math.floor((13 + 8 * P) / 25)
    M = (15 - Q + P - P // 4) % 30
    N = (4 + P - P // 4) % 7
    D = (19 * A + M) % 30
    E = (2 * B + 4 * C + 6 * D + N) % 7
    days = (22 + D + E)
  
    # A corner case,
    # when D is 29
    if ((D == 29) and (E == 6)):
        print(Y, "-04-19")
        return
     
    # Another corner case,
    # when D is 28
    elif ((D == 28) and (E == 6)):
        print(Y, "-04-18")
        return
     
    else:
         
        # If days > 31, move to April
        # April = 4th Month
        if (days > 31):
            print(Y, "-04-", (days - 31))
            return
         
        else:
             
            # Otherwise, stay on March
            # March = 3rd Month
            print(Y, "-03-", days)
            return
         
# Driver Code
Y = 2100
 
gaussEaster(Y)
 
# This code is contributed by code_hunt




// C# program for the
// above approach
using System;
using System.Collections.Generic;
 
// Function calculates and prints
// easter date for given year Y
public class GaussEaster {
 
  static void gaussEaster(int Y)
  {
    float A, B, C, P, Q, M, N, D, E;
 
    // All calculations done
    // on the basis of
    // Gauss Easter Algorithm
    A = Y % 19;
    B = Y % 4;
    C = Y % 7;
    P = (float)(int)(Y / 100);
    Q = (float)(int)((13 + 8 * P) / 25);
    M = (int)(15 - Q + P - (int)(P / 4)) % 30;
    N = (int)(4 + P - (int)(P / 4)) % 7;
    D = (19 * A + M) % 30;
    E = (2 * B + 4 * C + 6 * D + N) % 7;
    int days = (int)(22 + D + E);
 
    // A corner case,
    // when D is 29
    if ((D == 29) && (E == 6)) {
      Console.WriteLine(Y + "-04"
                        + "-19");
      return;
    }
     
    // Another corner case,
    // when D is 28
    else if ((D == 28) && (E == 6)) {
      Console.WriteLine(Y + "-04"
                        + "-18");
      return;
    }
    else {
 
      // If days > 31, move to April
      // April = 4th Month
      if (days > 31) {
        Console.WriteLine(Y + "-04-" + (days - 31));
        return;
      }
      // Otherwise, stay on March
      // March = 3rd Month
      else {
        Console.WriteLine(Y + "-03-" + days);
        return;
      }
    }
  }
 
  // Driver code
  public static void Main(string[] args)
  {
    int Y = 2100;
    gaussEaster(Y);
  }
}
 
// This code is contributed by phasing17.




// JS program for the
// above approach
 
// Function calculates and prints
// easter date for given year Y
function gaussEaster(Y)
{
    let A, B, C, P, Q, M, N, D, E;
 
    // All calculations done
    // on the basis of
    // Gauss Easter Algorithm
    A = Y % 19;
    B = Y % 4;
    C = Y % 7;
    P = Math.floor(Y / 100.0);
 
    Q = Math.floor((13 + 8 * P) / 25.0);
    M = Math.floor(15 - Q + P - Math.floor(P / 4)) % 30;
    N = Math.floor(4 + P - Math.floor(P / 4)) % 7;
    D = Math.floor(19 * A + M) % 30;
    E = Math.floor(2 * B + 4 * C + 6 * D + N) % 7;
 
    let days = Math.floor(22 + D + E);
 
    // A corner case,
    // when D is 29
    if ((D == 29) && (E == 6)) {
        process.stdout.write(Y + "-04-19");
        return;
    }
    // Another corner case,
    // when D is 28
    else if ((D == 28) && (E == 6)) {
        process.stdout.write(Y + "-04-18");
        return;
    }
    else {
        // If days > 31, move to April
        // April = 4th Month
        if (days > 31) {
            process.stdout.write(Y + "-04-" + (days - 31));
            return;
        }
        else {
            // Otherwise, stay on March
            // March = 3rd Month
            process.stdout.write(Y + "-03-" + days);
            return;
        }
    }
}
 
// Driver Code
let Y = 2100;
gaussEaster(Y);
 
// This code is contributed by phasing17

Output
2100-03-28

Time complexity: O(1) 
Auxiliary Space: O(1)
 


Article Tags :