Calculs avec PARI (1)

 Sections 

Le sujet de cette page est simple : calculer la date en jours juliens c'est à dire déterminer le nombre de jours écoulés depuis le 1 janvier 4713 à midi (Greenwich) avant notre ère. Cette échelle de temps est utile pour synchroniser les calendriers ; c'est celle qui est utilisée en astronomie pour dater les événements.

Le script julien.gp

\\ Julien est en l'honneur de Jules Scaliger, le père du mathématicien
\\ qui a introduit cette échelle de temps en 1583. Le calendrier
\\ grégorien date de 1582. 
\\ Calcul de la date en jours juliens
JD(J,M,A,h,m,s) =
{
    local(AT,BT,JDT) ;
    if (M<3 , A = A-1; M = M+12);
    AT = floor(A/100);
    BT = 2-AT+floor(AT/4);
    JDT = floor(365.25*(A+4716))
                +floor(30.6001*(M+1))
                +J
                +(h+(m+s/60)/60)/24
                +BT
                -1524.5;
    return(JDT);
}

\\ Calcul de la date en jours juliens rapportée à l'époque 2000 
\\ Utile pour l'utilisation des théories planétaires actuelles
JD2000(J,M,A,h,m,s) = JD(J,M,A,h,m,s)-JD(1,1,2000,12,0,0);

\\ Calcul de la date calendaire à partir du JD
\\ La valeur retounée est le vecteur [J,M,A,h,m,s,JS] 
\\ (JS est le jour de la semaine)
CD(jd) =
{
    local(a,A,B,C,D,E,F,G,h,m,s,Z);
    Z = floor(jd+0.5); F = jd+0.5-Z;
    if (Z>=2299161,
	    a = floor((Z-1867216.25)/36524.25);
	    A = Z+1+a-floor(a/4),
	    A = Z;
	);
     B = A+1524;
     C = floor((B-122.1)/365.25);
     D = floor(365.25*C);
     E = floor((B-D)/30.6001);
     G = B-D-floor(30.6001*E)+F;
     h = (G-floor(G))*24;
     m = (h-floor(h))*60;
     s = (m-floor(m))*60;
     if (E<14,E=E-1,E=E-13);
     if (floor(E)>2,C=C-4716,C=C-4715);
     return([floor(G),E,C,floor(h),floor(m),floor(s),(Z+1)%7]);
}

julien.gp en version texte

Le script format.gp

MOIS  = 
["janvier","février","mars","avril","mai","juin",\
"juillet","août","septembre","octobre","novembre","décembre"];
JOURS = 
["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"];
\\ format degrés, minutes, secondes
format_dms(d) = Str(d[1]"°"d[2]"'"floor(d[3])"''");
\\ format j mois AAAA, h:m:s
format_date(d) = Str(JOURS[d[7]+1]" "d[1]" "MOIS[d[2]]" "d[3]\
                     ", "d[4]":"d[5]":"floor(d[6]));

format.gp en version texte

Utilisation

Exemple

\p 15
read("julien.gp");
read("format.gp");
outl("Calcul de la date en jours juliens","section");
oute("JD(4,11,2002,5,0,4)");
oute("JD(12,5,-40,12,0,0)");
outl("Calcul de la durée entre deux dates","section");
oute("a = JD(23,5,1983,17,0,0)");
oute("b = JD(20,1,1988,23,0,0)");
oute("b-a");
outl("Détermination de la date dans le calendrier <i>grégorien</i>","section");
oute("d = CD(2299160)");
out(fb("formaté : "),format_date(d));
oute("d = CD(2299161)");
out(fb("formaté : "),format_date(d));
oute("d = CD(2000000)");
out(fb("formaté : "),format_date(d));
outl("Réversibilité","section");
oute("a = JD(26,2,1848,15,20,0)");
oute("CD(a)");
Calcul de la date en jours juliens JD(4,11,2002,5,0,4) -> 2452582.70837963 JD(12,5,-40,12,0,0) -> 1706582.00000000 Calcul de la durée entre deux dates a = JD(23,5,1983,17,0,0) -> 2445478.20833333 b = JD(20,1,1988,23,0,0) -> 2447181.45833333 b-a -> 1703.25000000000 Détermination de la date dans le calendrier grégorien d = CD(2299160) -> [4, 10, 1582, 12, 0, 0, 4] formaté : Jeudi 4 octobre 1582, 12:0:0 d = CD(2299161) -> [15, 10, 1582, 12, 0, 0, 5] formaté : Vendredi 15 octobre 1582, 12:0:0 d = CD(2000000) -> [14, 9, 763, 12, 0, 0, 3] formaté : Mercredi 14 septembre 763, 12:0:0 Réversibilité a = JD(26,2,1848,15,20,0) -> 2396084.13888888 CD(a) -> [26, 2, 1848, 15, 19, 59, 6]

Formatage des résultats

Pour faire en sorte que certains résultats soient inscrits dans un fichier avec un préformatage HTML, j'utilise un petit script, c'est là que l'on trouve la définition des fonctions commençant par out.

prevar(c) = return(Str(c" = "));
preexe(c) = return(Str(c" -> "));
fb(c) = return(Str("<b>"c"</b>"));
fi(c) = return(Str("<i>"c"</i>"));
out(c,e) = write(sortie,Str("<span class=\"out\">"c" "e"</span>"));
outv(c) = out(prevar(c),eval(c));
oute(c) = out(preexe(c),eval(c));
outl(c,s) = write(sortie,Str("<span class=\""s"\">"c"</span>"));