Calculs avec PARI (1)

Jean-Michel Sarlat (
jsarlat@planete.net) - 4 novembre 2002

Voir la page PARI sur ce site

Cette page est un premier essai d'utilisation de PARI à travers les fichiers tagués. Le sujet 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

Fichier : 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]);
}

Le script format.gp

Fichier : 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]));

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 grégorien","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.

Fichier : fabrique.gp

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>"));

Source index.txt mouliné par petitParseur(Z+B) le dimanche 1 décembre 2002.