Академический Документы
Профессиональный Документы
Культура Документы
Algoritmo en Java
import java.util.Date;
import java.util.Calendar;
/* Constructor de Pascua */
public Pascua(int anno) {
if (anno >= 1583 && anno <= 1699){
M = 22;
N = 2;
}else if ( anno >=1700 && anno <= 1799){
M = 23;
N = 3;
}else if ( anno >=1800 && anno <= 1899){
M = 23;
N = 4;
}else if ( anno >=1900 && anno <=2099){
M = 24;
N = 5;
}else if ( anno >=2100 && anno <=2199){
M= 24;
N= 6;
}else if ( anno>=2200 && anno <= 2299){
M= 25;
N= 0;
}
this.anno = anno;
}
//Cálculo de residuos
a = anno % 19;
b = anno % 4;
c = anno % 7;
d = (19*a + M) % 30;
e = (2*b+4*c+6*d + N) % 7;
return fechaPascua.getTime();
}
System.out.println(java.text.DateFormat.getDateInstance().format(pascua.getFechaPas
cua()));
}
}
Esta es la salida al ejecutar el código anterior.
12/04/2009
Algoritmo en Javascript
function pascua($annio) {
if ($annio>1583 && annio<1699) { $M=22; $N=2; }
else if ($annio>1700 && annio<1799) { $M=23; $N=3; }
else if ($annio>1800 && annio<1899) { $M=23; $N=4; }
else if ($annio>1900 && annio<2099) { $M=24; $N=5; }
else if ($annio>2100 && annio<2199) { $M=24; $N=6; }
else if ($annio>2200 && annio<2299) { $M=25; $N=0; }
$a = $anio % 19;
$b = $anio % 4;
$c = $anio % 7;
$d = ((19*$a) + $M) % 30;
$e = ((2*$b) + (4*$c) + (6*$d) + $N) % 7;
$f = $d + $e;
if ($f < 10) {
$dia = $f + 22;
$mes = 3;
} else {
$dia = $f - 9;
$mes = 4;
};
if ($dia == 26 && $mes == 4){
$dia = 19;
};
if ($dia == 25 && $mes == 4 && $d == 28 && $e == 6 && $a > 10){
$dia = 18;
};
$pascua = new Date($anio,$mes,$dia);
return $pascua;
};
Algoritmo en C#
/// <summary>
/// Método que devuelve el Domingo de Pascua dado un año a consultar.
/// </summary>
/// <param name="anyo">Año a consultar.</param>
/// <returns>Día del año que es Domingo de Pascua.</returns>
public static DateTime GetEasterSunday(int anyo)
{
int M = 25;
int N = 5;
// Excepciones especiales
if (dia == 26 && mes == 4) dia = 19;
if (dia == 25 && mes == 4 && d == 28 && e == 6 && a > 10) dia = 18;
//Console.WriteLine(domingo);
Console.WriteLine("Jueves Santo -> " + jueves.ToShortDateString());
Console.WriteLine("Viernes Santo -> " + viernes.ToShortDateString());
Console.WriteLine("Lunes de Pascua -> " + lunes.ToShortDateString());
}
Algoritmo en Python
La siguiente es una implementación del algoritmo anterior en el lenguaje Python, siguiendo fielmente
los pasos descritos en el algoritmo anterior.
#coding: latin-1
def Pascua(anno):
# Constantes mágicas
M = 24
N = 5
#Cálculo de residuos
a = anno % 19
b = anno % 4
c = anno % 7
d = (19*a + M) % 30
e = (2*b+4*c+6*d + N) % 7
print Pascua(2008)
import sys
# Magic constants
# Años M N
# 1583-1699 22 2
# 1700-1799 23 3
# 1800-1899 23 4
# 1900-2099 24 5
# 2100-2199 24 6
# 2200-2299 25 0
def easter(year):
# Calculation of the Magic constants
if (year>=1583 and year<1700):
M=22
N=2
if (year>=1700 and year<1800):
M=23
N=3
if (year>=1800 and year<1900):
M=23
N=4
if (year>=1900 and year<2100):
M=24
N=5
if (year>=2100 and year<2200):
M=24
N=6
if (year>=2200 and year<2300):
M=25
N=0
# Calculating variables
a = year%19
b = year%4
c = year%7
d = (19*a + M)%30
e = (2*b + 4*c + 6*d + N)%7
date=()
if (d+e<10):
date = ('marzo', d+e+22)
else:
date = ('abril', d+e+-9)
# Calculating Exceptions
if (date[0]=='abril') and ((date[1]==25 and d==28 and e==6 and a>10) or
(date[1]==26)):
date = (date[0], date[1]-7)
return date
if __name__ == '__main__':
year = int(sys.argv[1])
date = easter(year)
print('El %d, Pascua es el %d de %s' % (year, date[1], date[0]))
Algoritmo en Perl
Tomando el algoritmo anterior y pasándolo al lenguaje Perl, Tendríamos algo así:
#perl
#ejecutarlo pasando el año como parámetro.
sub Pascua {
# Constantes mágicas
$M = 24;
$N = 5;
$anno = shift;
#Cálculo de residuos
$a = $anno % 19;
$b = $anno % 4;
$c = $anno % 7;
$d = (19*$a + $M) % 30;
$e = (2*$b+4*$c+6*$d + $N) % 7;
Algoritmo en PHP
(PHP tiene una función propia llamada easter_date() que calcula el día del Domingo de Resurrección).
1
En el siguiente algoritmo, a diferencia de los otros este no solo obtiene la fecha del domingo de pascua
sino también todas las demás fechas de la pascua tales como: Domingo de Pascua, Miércoles de ceniza,
Domingo de Ramos, Jueves y Viernes Santo, Ascensión, Pentecostés, Santísima Trinidad y Corpus
Christi
Tomando los algoritmos anteriores e implementándolo en PHP con salida a HTML tenemos:
<?php
function pascua ($anno){
# Constantes mágicas
$M = 24;
$N = 5;
#Cálculo de residuos
$a = $anno % 19;
$b = $anno % 4;
$c = $anno % 7;
$d = (19*$a + $M) % 30;
$e = (2*$b+4*$c+6*$d + $N) % 7;
# Decidir entre los 2 casos:
if ( $d + $e < 10 ) {
$dia = $d + $e + 22;
$mes = 3; // marzo
}
else {
$dia = $d + $e - 9;
$mes = 4; //abril
}
# Excepciones especiales (según artículo)
if ( $dia == 26 and $mes == 4 ) { // 4 = abril
$dia = 19;
}
if ( $dia == 25 and $mes == 4 and $d==28 and $e == 6 and $a >10 ) { // 4 =
abril
$dia = 18;
}
$ret = $dia.'-'.$mes.'-'.$anno;
return ($ret);
}
function mesespanol($m){
$m=intval($m);
$meses="No
Especificado,Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,N
oviembre,Diciembre";
$mes=explode(",",$meses);
$mesespan=$mes[$m];
return $mesespan;
}
function diaespanol($d){
$d=intval($d);
$dias="No
Especificado,Lunes,Martes,Miercoles,Jueves,Viernes,Sabado,Domingo";
$dia=explode(",",$dias);
$diasspan=$dia[$d];
return $diasspan;
}
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Calcular Semana Santa | Pascua | PHP</title>
</head>
<body>
<center>
<h1>Calcular Pascua:</h1>
<form action="index.php" name="forma" method="post">
<font face="Arial, Helvetica, sans-serif" size="2">
Año: <input type="text" name="anno" size="5" maxlength="4"
value="<?php if(intval($_POST['anno']) > 0){ echo intval($_POST['anno']); }
else{ echo date("Y"); }?>">
<input type="submit" name="Go!" value="Calcular!">
</font>
</form>
</center>
<?php
#ejecutarlo pasando el año como parámetro.
if (isset($_POST['anno'])) {
$fecha = explode('-',pascua($_POST['anno']));
?><br />
<div align=center><font face=arial>
La pascua (domingo de resurrección)
en el año introducido es el:
<strong><?php echo $fecha[0]; ?> de <?php echo mesespanol($fecha[1]); ?> de <?php
echo $fecha[2]; ?></strong><br /><br />
<br />
<table width="400" cellspacing="0" cellpadding="0" style="margin:0px auto;">
<tr>
<td colspan="3" align="center"><strong>Fechas especiales:</strong></td>
</tr>
<tr>
<td colspan="3"> </td>
</tr>
<tr bgcolor="#CCCCCC">
<td align="left"><strong><font
face="arial">Celebracion</font></strong></td>
<td align="center"><strong>Dia</strong></td>
<td align="center"><strong>Fecha</strong></td>
</tr>
<tr>
<td align="left"><strong>Domingo de Pascua</strong></td>
<td align="center"><?php echo diaespanol(date("N",
mktime(0,0,0,$fecha[1],$fecha[0],$fecha[2]))); ?></td>
<td align="center"><?php echo date("d/m/Y", mktime(0,0,0,$fecha[1],
$fecha[0],$fecha[2])); ?></td>
</tr>
<tr>
<td align="left">Miércoles de ceniza</td>
<td align="center"><?php echo diaespanol(date("N",
mktime(0,0,0,$fecha[1],$fecha[0]-46,$fecha[2]))); ?></td>
<td align="center"><?php echo date("d/m/Y", mktime(0,0,0,$fecha[1],
$fecha[0]-46,$fecha[2])); ?></td>
</tr>
<tr>
<td align="left">Domingo de Ramos</td>
<td align="center"><?php echo diaespanol(date("N",
mktime(0,0,0,$fecha[1],$fecha[0]-7,$fecha[2]))); ?></td>
<td align="center"><?php echo date("d/m/Y", mktime(0,0,0,$fecha[1],
$fecha[0]-7,$fecha[2])); ?></td>
</tr>
<tr>
<td align="left"><strong>Jueves Santo</strong></td>
<td align="center"><?php echo diaespanol(date("N",
mktime(0,0,0,$fecha[1],$fecha[0]-3,$fecha[2]))); ?></td>
<td align="center"><?php echo date("d/m/Y", mktime(0,0,0,$fecha[1],
$fecha[0]-3,$fecha[2])); ?></td>
</tr>
<tr>
<td align="left"><strong>Viernes Santo</strong></td>
<td align="center"><?php echo diaespanol(date("N",
mktime(0,0,0,$fecha[1],$fecha[0]-2,$fecha[2]))); ?></td>
<td align="center"><?php echo date("d/m/Y", mktime(0,0,0,$fecha[1],
$fecha[0]-2,$fecha[2])); ?></td>
</tr>
<tr>
<td align="left">Ascensión</td>
<td align="center"><?php echo diaespanol(date("N",
mktime(0,0,0,$fecha[1],$fecha[0]+39,$fecha[2]))); ?></td>
<td align="center"><?php echo date("d/m/Y", mktime(0,0,0,$fecha[1],
$fecha[0]+39,$fecha[2])); ?></td>
</tr>
<tr>
<td align="left">Pentecostés</td>
<td align="center"><?php echo diaespanol(date("N",
mktime(0,0,0,$fecha[1],$fecha[0]+49,$fecha[2]))); ?></td>
<td align="center"><?php echo date("d/m/Y", mktime(0,0,0,$fecha[1],
$fecha[0]+49,$fecha[2])); ?></td>
</tr>
<tr>
<td align="left">Santísima Trinidad</td>
<td align="center"><?php echo diaespanol(date("N",
mktime(0,0,0,$fecha[1],$fecha[0]+56,$fecha[2]))); ?></td>
<td align="center"><?php echo date("d/m/Y", mktime(0,0,0,$fecha[1],
$fecha[0]+56,$fecha[2])); ?></td>
</tr>
<tr>
<td align="left">Corpus Christi</td>
<td align="center"><?php echo diaespanol(date("N",
mktime(0,0,0,$fecha[1],$fecha[0]+60,$fecha[2]))); ?></td>
<td align="center"><?php echo date("d/m/Y", mktime(0,0,0,$fecha[1],
$fecha[0]+60,$fecha[2])); ?></td>
</tr>
</table>
<br />
</font></div>
<?php }?>
</div>
</body>
</html>
Algoritmo en Delphi
function Pascua(Anio: word): TDateTime;
var
a, b, c, d, e, f, g, h, i, k, l, m, n: word;
Mes, Dia: word;
begin
{ Devuelve la fecha del año en la que cae la Pascua de Resurrección.
Se utiliza para ello el Algoritmo de Butcher }
a := anio mod 19;
b := anio div 100;
c := anio mod 100;
d := b div 4;
e := b mod 4;
f := (b + 8) div 25;
g := (b - f + 1) div 3;
h := (19 * a + b - d - g + 15) mod 30;
i := c div 4;
k := c mod 4;
l := (32 + 2 * e + 2 * I - h - k) mod 7;
m := (a + 11 * h - 22 * l) div 451;
n := h + l - 7 * m + 114;
Mes := n div 31;
Dia := 1 + n mod 31;
Fuente: http://www.clubdelphi.com/foros/showthread.php?t=30413
Algoritmo en Ruby
puts "indique el año a calcular"
anio = gets.to_i
case anio
when 1583..1699
M= 22
N= 2
when 1700..1799
M=23
N=3
when 1800..1899
M=23
N=4
when 1900..2099
M=24
N=5
when 2100..2199
M=24
N=6
when 2200..2299
M=25
N=0
end
a = anio % 19
b = anio % 4
c = anio % 7
d = ((19*a + M) % 30)
e = (2*b + 4*c + 6*d + N) % 7
dia = 18 if (d + e -9) == 25 && mes == " Abril" && d==28 && e == 6 && a >10
dia = 19 if (d + e -9) == 26 && mes == " Abril"
Algoritmo en PowerBuilder
//Función: ej. f_calculo_domingo_pascua(ano_a_calcular)
// a_ano=año de cálculo: parámetro(integer) que recibe la función.
//
// Proceso de la función:
//
date ld_fecha
// variables de trabajo.
integer a, b, c, d ,e, M, N
a=Mod(a_ano,19)
b=Mod(a_ano,4)
c=Mod(a_ano,7)
d=Mod(((19*a) + M),30)
e=Mod(((2*b)+(4*c)+(6*d)+N),7)
// se resta 1 (22 dias -1) porque se toma como base el 1ro. de marzo.
ld_fecha=RelativeDate(date('01/03/'+string(a_ano)),((d+e)+(22 - 1)))
ELSE
END IF
//
//
IF ld_fecha=date('26/04/'+string(a_ano)) then
ld_fecha=date('19/04/'+string(a_ano))
ld_fecha=date('18/04/'+string(a_ano))
END IF
return(ld_fecha)
returns date
begin
--
-- @LD_FECHA= VARIABLE QUE RETORNA LA FUNCIÓN.
declare @LD_FECHA date;
declare @A integer;
declare @B integer;
declare @C integer;
declare @D integer;
declare @E integer;
declare @M integer;
declare @N integer;
-- PROCESO DE LA FUNCIÓN:
if @A_ANO>=1583 and @A_ANO<=1699 then
set @M=22;
set @N=2
elseif @A_ANO>=1700 and @A_ANO<=1799 then
set @M=23;
set @N=3
elseif @A_ANO>=1800 and @A_ANO<=1899 then
set @M=23;
set @N=4
elseif @A_ANO>=1900 and @A_ANO<=2099 then
set @M=24;
set @N=5
elseif @A_ANO>=2100 and @A_ANO<=2199 then
set @M=24;
set @N=6
elseif @A_ANO>=2200 and @A_ANO<=2299 then
set @M=25;
set @N=0
end if;
set @A=MOD(@A_ANO,19);
set @B=MOD(@A_ANO,4);
set @C=MOD(@A_ANO,7);
set @D=MOD(((19*@A)+@M),30);
set @E=MOD(((2*@B)+(4*@C)+(6*@D)+@N),7);
--CÁLCULO DE FECHA RELATIVA.
if(@D+@E)<10 then
-- SE RESTA 1 (22 DIAS -1) PORQUE SE TOMA COMO BASE EL 1RO. DE MARZO.
set @LD_FECHA=DAYS("DATE"(STRING(@A_ANO)+'/03/01'),((@D+@E)+(22-1)))
else
-- SE RESTA 1 (9 DIAS -1) PORQUE SE TOMA COMO BASE EL 1RO. DE ABRIL.
set @LD_FECHA=DAYS("DATE"(STRING(@A_ANO)+'/04/01'),(((@D+@E)-9)-1))
end if;
if @LD_FECHA="DATE"(STRING(@A_ANO)+'/04/26') then
set @LD_FECHA="DATE"(STRING(@A_ANO)+'/04/19')
elseif @LD_FECHA="DATE"(STRING(@A_ANO)+'/04/25') and @D=28 and @E=6 and @A>10
then
set @LD_FECHA="DATE"(STRING(@A_ANO)+'/04/18')
end if;
return(@LD_FECHA)
end
Cálculo en EXCEL
Suponiendo que en la celda A3 se tiene el año:
=MULTIPLO.INFERIOR(FECHA(A3;5;DIA(MINUTO(A3/38)/2+56));7)-34
o
=MONEDA(("4/"&A3)/7+RESIDUO(19*RESIDUO(A3;19)-7;30)*14%;)*7-6
Algoritmo en Fortran 9X
PROGRAM pascua
! -------------------------------------------------------------
! pascua: permite calcular el día correspondiente al Domingo
! de Pascua para un año dado.
!
! La fecha del Domingo de Pascua corresponde al primer domingo
! después de la primera luna llena que sigue al equinocio de
! primavera en el hemisferio norte.
!
! La fórmula implementada es válida para años entre 1900 y 2099
!
! Referencia:
! http://es.wikipedia.org/wiki/Cálculo_de_la_fecha_de_Pascua
! -------------------------------------------------------------
! Declaración de variables
! -------------------------------------------------------------
INTEGER, PARAMETER :: min_year = 1900 ! Rango de validez
INTEGER, PARAMETER :: max_year = 2099 ! del año
INTEGER :: year ! Año ingresado por el usuario
INTEGER :: a,b,c,d,e ! Variables auxiliares
INTEGER :: n ! Número de día del mes de marzo
! (abril si n > 31) correspondiente
! al Domingo de Pascua.
INTEGER :: m ! Mes (3 = marzo, 4 = abril)
! -------------------------------------------------------------
! Ingreso de datos
! -------------------------------------------------------------
WRITE(*,'(A)',ADVANCE='no') 'Ingrese año: '
READ(*,*) year
! -------------------------------------------------------------
! Comprobar validez del año en el rango permitido
! -------------------------------------------------------------
IF (year < min_year .OR. &
& year > max_year ) STOP 'Año fuera de rango.'
! -------------------------------------------------------------
! Cálculo del Domingo de Pascua
! -------------------------------------------------------------
a = MOD(year,19)
b = MOD(year,4)
c = MOD(year,7)
d = MOD(19*a+24,30)
e = MOD(2*b+4*c+6*d+5,7)
n = 22+d+e
IF (n <= 31) THEN
m = 3 ! Marzo
ELSE
m = 4 ! Abril
n = n - 31
ENDIF
! -------------------------------------------------------------
! Casos excepcionales
! -------------------------------------------------------------
IF ( m == 4 .AND. n == 26) n = 19
IF ( m == 4 .AND. n == 25 .AND. d == 18 &
& .AND. e == 6 .AND. a > 10 ) n = 18
! -------------------------------------------------------------
! Imprimir el resultado
! -------------------------------------------------------------
WRITE(*,*) 'Domingo de Pascua'
WRITE(*,*) 'Año = ', year
WRITE(*,*) 'Mes = ', m
WRITE(*,*) 'Día = ', n
! -------------------------------------------------------------
! Terminar
! -------------------------------------------------------------
STOP
END PROGRAM pascua
) return date
AS
ld_fecha date;
a_ano number;
a integer;
b integer;
c integer;
d integer;
e integer;
M integer;
N integer;
BEGIN
a_ano := to_number(p_ano_a_calcular);
a:=Mod(a_ano,19);
b:=Mod(a_ano,4);
c:=Mod(a_ano,7);
d:=Mod(((19*a) + M),30);
e:=Mod(((2*b)+(4*c)+(6*d)+N),7);
-- se resta 1 (22 dias -1) porque se toma como base el 1ro. de marzo.
ELSE
ld_fecha:= to_date('01/04/'||p_ano_a_calcular,'dd/mm/yyyy')+(((d+e)-9)-1);
END IF;
ld_fecha:=to_date('19/04/'||p_ano_a_calcular,'dd/mm/yyyy');
ld_fecha:=to_date('18/04/'||p_ano_a_calcular,'dd/mm/yyyy');
END IF;
return ld_fecha;
end;
a = Año Mod 19
b = Int(Año / 100)
c = Año 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 = h + l - 7 * m + 114
mes = Int(n / 31)
día = 1 + n Mod 31
DomingoResurrección = DateSerial(Año, mes, día)
End Function
End Function
AS
BEGIN
DECLARE @LD_FECHA DATETIME,@A INT, @B INT,@C INT,@D INT,@E INT, @M INT,@N INT
-- PROCESO DE LA FUNCIÓN:
IF @A_ANO>=1583 AND @A_ANO<=1699
BEGIN
SET @M=22
SET @N=2
END
IF @A_ANO>=1700 AND @A_ANO<=1799
BEGIN
SET @M=23
SET @N=3
END
IF @A_ANO>=1800 AND @A_ANO<=1899
BEGIN
SET @M=23
SET @N=4
END
IF @A_ANO>=1900 AND @A_ANO<=2099
BEGIN
SET @M=24
SET @N=5
END
IF @A_ANO>=2100 AND @A_ANO<=2199
BEGIN
SET @M=24
SET @N=6
END
IF @A_ANO>=2200 AND @A_ANO<=2299
BEGIN
SET @M=25
SET @N=0
END
SET @A = @A_ANO % 19
SET @B = @A_ANO % 4
SET @C = @A_ANO % 7
SET @D = ((19*@A)+@M) % 30
SET @E = ((2*@B)+(4*@C)+(6*@D)+@N) % 7
IF(@D+@E)<10
BEGIN
SET @LD_FECHA=DATEADD(DD,((@D+@E)+(21)),CAST(@A_ANO AS VARCHAR)
+'0301')
END
ELSE
BEGIN
-- SE RESTA 1 (9 DIAS -1) PORQUE SE TOMA COMO BASE EL 1RO. DE ABRIL.
SET @LD_FECHA=DATEADD(DD,(((@D+@E)-9)-1),CAST(@A_ANO AS VARCHAR)
+'0401')
END
IF @LD_FECHA=CAST(@A_ANO AS VARCHAR)+'0426'
BEGIN
SET @LD_FECHA=CAST(@A_ANO AS VARCHAR)+'0419'
END
RETURN @LD_FECHA
END
Referencias
1.
http://php.net/manual/es/function.easter-date.php