• Aucun résultat trouvé

5.4 Le jour de la semaine

5.4.3 La correction

Quand une annéeaest-elle bissextile ?

À partir du 15 octobre 1582, une annéeaest bissextile si :

aest divisible par 4 etan’est pas divisible par 100 ou siaest divisible par 400.

Par exemple :

1900 est divisible par 4, par 100 mais pas par 400 donc 1900 n’est pas bissextile.

2000 est divisible par 4, par 100 et par 400 donc 2000 est bissextile.

Le test suras’écrit donc :

bissextile(a):=(irem(a,4)==0 and irem(a,100)!=0) or irem(a,400)==0.

On tape :

bissextile(1900) On obtient :

faux On tape :

bissextile(2000) On obtient :

vrai

Nombre d’année bissextile depuis l’annéea

En supposant que le calendrier débute en l’an 0, le nombre d’année bissextile depuis l’annéeaest :

nbre_de_bissextile(a):=iquo(a,4)- iquo(a,100) + iquo(a,400) On tape :

nbre_de_bissextile(1800)

On obtient : 436 On tape :

nbre_de_bissextile(1900) On obtient :

460 On tape :

nbre_de_bissextile(2000) On obtient :

485

En effet dans l’intervalle ]1800,1900] il y a 24=(460-436) années bissextiles et dans l’intervalle]1900,2000]il y a 25=(485-460) années bissextiles.

Étant donné une annéeanon bissextile et un mois m (m = 1..12) on constitue la listeSLqui permettra de trouver le numèro d’ordre du jourjdu moism dans l’annéea.

Si l’annéeaest non bissextile on tape :

L:=[0,31,28,31,30,31,30,31,31,30,31,30]

SL:=cumSum(L) SLest alors la liste :

[0,31,59,90,120,151,181,212,243,273,304,334]

Si l’annéeaest bissextile on tape :

L:=[0,31,29,31,30,31,30,31,31,30,31,30]

SL:=cumSum(L) SLest alors la liste :

[0,31,60,91,121,152,182,213,244,274,305,335]

cela veut dire que :

le 1 janvier est le 0+1=1ier jour de l’annéea, le 4 janvier est le 0+4=4ième jour de l’annéea, le 2 février est le 2+31=33ième jour de l’annéea,

le 21 septembre d’une année non bissextile est le 21+243=264 ième jour de l’année a

mais le 21 septembre d’une annèe bissextile est le 21+244=265 ième jour de l’an-néea.

Donc le jourj du mois md’une annéeabissextile (ou non) est lej+SL[m-1]

ième jour de l’annéea(il faut mettre comme indicem−1car les indices des listes commencent à 0).

On tape le programme qui renvoie le nombre 0 pour dimanche, 1 pour lundi,.., et 6 pour samedi.

La variablebest le numèro d’ordre du jourjdu mois mdans l’année acompté depuis l’an 0 :

(a-1)*365+iquo(a1,4)+iquo(a1,400)-iquo(a1,100)est le nombre de jours écoulés entre le début de l’an 0 et la fin de l’annéea−1etSL[m-1]+j est le le numèro d’ordre du jourjdu moismdans l’annéea.

Remarque On devra ensuite :

— soit ajuster le programme en vérifiant la réponse pour une date comme le 15 octobre 1583 qui doit renvoyer 5 ou pour la date du jour (ici le 21 septembre

2014 qui doit renvoyer 0).

— soit remarquer que 1582 n’est pas bissextile et que 1582=7*226 c’est à dire que 1582 est l’année 0 modulo 7, que le 15 octobre d’une année non bissextile est le 288 ième jour de l’annèe. Comme le résultat est le reste de la division par 7, le 15 octobre d’une année anon bissextile est donc le même jour de la semaine que le 1ier janvier et le 31 decembre de cette annéeacar on a 1=0*7+1, 288=7*41+1 et 365=7*52+1.

En supposant que le calendrier grégorien débute en l’an 1 que l’an 1 n’est pas bissextile, le nombre d’années bissextiles entre le 1,1,1 et le 31,12 1581 est :

iquo(1581,4)+iquo(1581,400)-iquo(1581,100)qui renvoie 383 = 5 mod 7.

Commeirem(383,7)vaut 5 cela veut dire que si le 1,1,1 est un lundi alors le 15,10,1582 sera un vendredi et donc on n’aura rien à ajuster.

On vérifie :

Si le 1,1,1 est le 1ier jour, le 1,1,2 est le le 366 ième jour et on a :

1+365*1+0=2 mod 7Si le 1,1,1 est le 1ier jour, le 1,1,5 est le 1+365*4+1 ième jour et on a :

1+365*4+1=6 mod 7Si le 1,1,0 est le 1ier jour, le 1,1,1582 est le : 1+365*1581+383=5 mod 7Si le 1,1,0 est le 1ier jour, le 15,10,1582 est le 1+287+365*1581+383 ième jour et on a :

1+287+365*1581+383=5 mod 7On peut dire que si le 1,1,1 est le 1ier jour i.e. un lundi alors le 15,10,1582 sera un vendredi.

On tape :

jour_semaine0(j,m,a):={

local L,SL,a1,b;

si j<=0 or m<=0 or a<=0 alors return "erreur : j>,m>0,a>0"; fsi;

L:=[0,31,28,31,30,31,30,31,31,30,31,30];

si (irem(a,4)==0 and irem(a,100)!=0) or irem(a,400)==0 then L[2]:=29;

fsi;

SL:=cumSum(L);

a1:=a-1;

b:=a1*365+iquo(a1,4)+iquo(a1,400)-iquo(a1,100)+SL[m-1]+j;

return irem(b,7);

}:;

On remarque que si(j,m,a)=(1,1,1)alorsb=1donc il n’y à rien à ajuster ; On vérifie qu’il n’y à rien à ajuster, on tape :

jour_semaine0(15,10,1582)et on obtient bien5.

Ou en mettant une date de référence par exemple on sait que le 21 septembre 2014 est un dimanche.

On tape :

jour_semaine0(21,9,2014) On obtient :

0

Comme le résultat est le reste de la division par 7 on peut taper puisque 365=7*52+1 on peut aussi écrire :

jour_semaine1(j,m,a):={

local L,SL,a1,b;

si j<=0 or m<=0 or a<=0 alors return "erreur : j>,m>0,a>0"; fsi;

L:=irem([0,31,28,31,30,31,30,31,31,30,31,30],7);

si (irem(a,4)==0 and irem(a,100)!=0) or irem(a,400)==0 then L[2]:=L[2]+1;

fsi;

SL:=irem(cumSum(L),7);

a1:=a-1;

b:=a1+iquo(a1,4)+iquo(a1,400)-iquo(a1,100)+SL[m-1]+j;

return irem(b,7);

}:;

Remarque

On tape pouranon bissextile :

SL7:=irem([0,31,59,90,120,151,181,212,243,273,304,334],7) On obtient :

[0,3,3,6,1,4,6,2,5,0,3,5]

On tape :

LL:=[(iquo(23*m,9)+5)$(m=1..2),(iquo(23*m,9)+3)$(m=3..12)]

On obtient :

[7,10,10,13,15,18,20,23,26,28,31,33]

On tape :

LL7:=irem(LL,7) On obtient :

[0,3,3,6,1,4,6,2,5,0,3,5]

et pourabissextile, on tape :

SL7:=irem([0,31,60,91,121,152,182,213,244,274,305,335],7) On obtient :

[0,3,4,0,2,5,0,3,6,1,4,6]

On tape :

LL:=[(iquo(23*m,9)+5)$(m=1..2),(iquo(23*m,9)+4)$(m=3..12)]

On obtient :

[7,10,11,14,16,19,21,24,27,29,32,34]

On tape :

LL7:=irem(LL,7) On obtient :

[0,3,4,0,2,5,0,3,6,1,4,6]

DoncLL7etSL7sont identiques : on peut donc modifier le programme.

La variablebivaut0si l’année n’est pas bissextile et vaut1si l’année est bissex-tile.

On utilse alors les valeurs :

bi+(iquo(23*m,9)+5)pourm=1(janvier) etm=2(fevrier) et bi+(iquo(23*m,9)+3)pour les autres mois.

On tape (plus besoin de listes !) : jour_semaine2(j,m,a):={

local L,SL,a1,b,bi;

si j<=0 or m<=0 or a<=0 alors return "erreur : j>,m>0,a>0"; fsi;

a1:=a-1;bi:=0;

si (irem(a,4)==0 and irem(a,100)!=0) or irem(a,400)==0 alors bi:=1;

fsi;

si (m==1) ou (m==2) alors

b:=a1+iquo(a1,4)+iquo(a1,400)-iquo(a1,100)+iquo(23*m,9)+5+j;

sinon

b:=bi+a1+iquo(a1,4)+iquo(a1,400)-iquo(a1,100)+iquo(23*m,9)+3+j;

fsi;

return irem(b,7);

}:;

Ou bien si on utilisea:=a−1pour janvier et février etapour les autres mois, en mettant :

a+iquo(a,4)+iquo(a,400)-iquo(a,100)on ne doit pas tester siaest bissextile.

En effeta+iquo(a,4)+iquo(a,400)-iquo(a,100)est égale à :

a1+1+bi+iquo(a1,4)+iquo(a1,400)-iquo(a1,100) (avec les nota-tions du programme précédent).

Donc pour janvier et février puisquea:=a-1, on a :

b:=a+iquo(a,4)+iquo(a,400)-iquo(a,100)+iquo(23*m,9)+5+j;

et

pour les autres mois

b:=a+iquo(a,4)+iquo(a,400)-iquo(a,100)+iquo(23*m,9)+2+j;

d’où la dernière commande :

si (m==1) ou (m==2) alors return irem(b,7) sinon return irem(b-3,7);fsi;

On tape et alors dans ce cas le programme marche pour l’année 0 qui est considérée comme bissextile :

jour_semaine3(j,m,a):={

local L,SL,b;

//si j<=0 or m<=0 or a<=0 alors return "erreur : j>,m>0,a>0"; fsi;

si (m==1) ou (m==2) alors a:=a-1; fsi;

b:=a+iquo(a,4)+iquo(a,400)-iquo(a,100)+iquo(23*m,9)+5+j;

si (m==1) ou (m==2) alors return irem(b,7) sinon return irem(b-3,7);fsi;

}:;

On peut rajouter :

Affichage_jour(n ):={

if irem(n, 7) == 1 then return("Lundi");

elif irem(n,7) == 2 then return("Mardi");

elif irem(n, 7) == 3 then return("Mercredi");

elif irem(n, 7) == 4 then

return("Jeudi");

elif irem(n, 7) == 5 then return("Vendredi");

elif irem(n, 7) == 6 then return("Samedi");

elif irem(n, 7) == 0 then return("Dimanche");

end;

}:;

jour_semaine4(j,m,a):={

local L,SL,b;

si (m==1) ou (m==2) alors a:=a-1; fsi;

b:=a+iquo(a,4)+iquo(a,400)-iquo(a,100)+iquo(23*m,9)+5+j;

si (m==1) ou (m==2) alors return Affichage_jour(irem(b,7));

sinon return Affichage_jour(irem(b-3,7));fsi;

}:;

5.4.4 Le programme commenté de l’étudiant Thomas Luka

Documents relatifs