Cómo calcular la fecha de Pascua para un año determinado usando el Algoritmo de Gauss

Dado un entero Y , que denota un año, como entrada, la tarea es encontrar la fecha de Pascua para ese año.

Ejemplos: 

Entrada: Y = 2020 
Salida: 2020-04-12 
Explicación:  En 2020, la Pascua fue el 12 de abril. Por lo tanto, la fecha de Pascua será 2020-04-12

Entrada: Y = 1991 
Salida: 1991-03-30 
Explicación:  En 1991, la Pascua era el 30 de marzo. Por lo tanto, la fecha de Pascua será 1991-03-30 

Enfoque: el algoritmo de Pascua de Gauss se utiliza para calcular fácilmente la fecha de Pascua durante un año. Este algoritmo fue pensado por primera vez por Carl Friedrich Gauss. No hay una explicación adecuada sobre cómo Gauss llegó a este algoritmo, pero la implementación de este algoritmo ha demostrado ser muy precisa. 
Una explicación detallada del Algoritmo Pascua de Gauss es la siguiente: 

  • Primero, calcule la ubicación del año Y en el ciclo metónico.

A = Y mod 19

  • Ahora, encuentra el número de días bisiestos según el calendario juliano.

B = Y módulo 4

  • Entonces, tengamos en cuenta que el año no bisiesto es un día más largo que 52 semanas.

C = Y módulo 7

  • M depende del siglo del año Y. Para el siglo XIX, M = 23. Para el siglo XXI, M = 24 y así sucesivamente. 
    Se calcula utilizando las siguientes relaciones:

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

  • La diferencia entre el número de días bisiestos entre el calendario juliano y el gregoriano viene dada por:

N = (4 + P – (P / 4)) módulo 7

  • El número de días que hay que sumar al 21 de marzo para encontrar la fecha del Plenilunio Pascual viene dado por:

D = (19*A + M) módulo 30

  • Y, el número de días desde el plenilunio pascual hasta el próximo domingo viene dado por:

E = (N + 2*B + 4*C+ 6*D) módulo 7 

  • Por lo tanto, usando D y E , la fecha del Domingo de Pascua será marzo (22 + D + E) . Si este número resulta ser mayor que 31, entonces pasamos a abril.
  • Ahora bien, el mes lunar no tiene exactamente 30 días sino un poco menos de 30 días. Por lo que para anular esta inconsistencia, se siguen los siguientes casos:

si (D == 29) y (E == 6) 
devuelven «19 de abril» de 
lo contrario si (D == 28) y (E == 6) 
devuelven «18 de abril» 

A continuación se muestra la implementación del enfoque anterior:

C++

// 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

// 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

# 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
Producción

2100-03-28

Complejidad temporal: O(1) 
Espacio auxiliar: O(1)
 

Publicación traducida automáticamente

Artículo escrito por rahulhegde97 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *