L’autre bogue de l’an 2000 et plus tard 4000…

Michel J. DUMONTIER

 

 

Introduction : Quand on parle du bogue de l’an 2000, on parle surtout du passage à l’an 2000 du 31 décembre 1999 au 1er Janvier 2000.

Si les ordinateurs avaient existé en 1900 il aurait fallu tenir compte que cette année là, comme les autres années divisibles par 100, n’était pas bissextile.

Mais il y a exception, les années divisibles par 400 comme l’an 2000 redeviennent bissextiles et cela durera jusqu’à l’an 3999 car à nouveau, l’an 4000 ne sera pas bissextile.

 

Le 1er Mars 2000 : Seuls les cancres et les bons auront raison !

Ceux (les cancres) qui n’auront programmé que la divisibilité par 4 pour le calcul des années bissextiles seront justes : effectivement, l’an 2000 est une exception dans les années multiples de 100, elle est bissextile.

Ceux (les moyens) qui n’auront retenu que les années multiples de 4 sauf celles multiples de 100 pour le même calcul, se trouveront avec une année non bissextile et le 1er mars 2000 sera pour eux un mardi au lieu d’être un mercredi !

Ceux (les bons) qui auront retenu le paramètre 400 comme test de divisibilité, auront raison comme les cancres, mais à juste titre et cela jusqu’à l’an 3999.

En l’an 4000, il faudra être très bon pour avoir programmé en plus le test de divisibilité par 4000 pour considérer 4000 comme une année non bissextile.

 

Un peu de pédagogie : La programmation du calcul des années bissextiles est triviale en APL, déjà connu pour sa clarté et sa concision.

La première fois que j’ai rencontré cette fonction, bien qu’assez mal programmée, elle reflétait remarquablement déjà l’absence de bruit de fond.

On ne trouvait dans cette fonction que les 4 paramètres 4 100 400 4000 entourés de fonctions : difficile de faire moins de bruit de fond !

Voici la fonction en notation ¸ ¾ :

 

BIM: 0¬.=4 100 400 4000|¾

 

NB : autre écriture :

 

BIS: -/0=4 100 400 4000|¾

 

Mais on peut faire mieux :

 

Nous sommes en face d’une fonction qui change de véracité chaque fois qu’une nouvelle condition est vraie  et qui commence par être vraie: à quoi cela vous fait penser ?

 

Solution : c’est xor scan bien sûr et comme c’est le résultat à la fin qui compte pour nous, dans la fonction, il n’y aura plus que xor slash.

 

Rappelons que xor scan sur une chaîne de bits tous à 1 donne la suite alternée 1 0 1 0 1 0 etc…car xor donne la parité de la chaîne en nombres de bits à 1.

 

Nous pouvons tout de suite écrire la fonction de calcul des années bissextiles en notation ¸ ¾:

 

 

BI: ¬/0=4 100 400 4000|¾

 

 

Essayons-la :

 

      BI 1940

1

      BI 1900

0

      BI 2000

1

      BI 4000

0

      BI 1996

1

 

NB : comme ici, il n’y a que la parité qui compte, nous pourrions nous amuser à permuter les 4 données, le résultat serait le même c’est-à-dire que la fonction BI pourrait s’écrire :

 

BI: ¹/0= 400 100 4000 4 |¾

 

(Il n’en serait pas de même si on faisait subir le même sort à la fonction BIS !).

En prime, donnons ici une fonction qui donne le jour de la semaine correspondant à une date donnée, vous pourrez ainsi connaître (ou vérifier) le jour de votre naissance ou d’un événement quelconque…

 

Calcul de l’indice du premier jour de l’année X:

(voir commentaire)

 

Z„DA X

Z„7|X+-/˜(X-1)÷4 100 400 4000

© 0=DIMANCHE, 1=LUNDI, SUR LEQUEL COMMENCE L'ANNEE

GREGORIENNE

 

 

Quel jour débutera l’an 2000 ?

 

      DA 2000

6

Ce sera donc un samedi.

 

Calcul du nombre de jours de chaque mois de l’année X :

 

Z„JM X

Z„28+3,(BI X),10½5½3 2

© NB DE JOURS DANS 12 MOIS DE L'ANNEE GREGORIENNE X

 

Calcul du jour de l’année :

 

Z„JOUR X;D;M;A;ŒIO;J;S

ŒIO„0 ª D„X[0] ª M„X[1] ª A„X[2]

J„(DA A) + (+/(¯1+M)†JM A)+D-1

S„7 2½'DILUMAMEJEVESA' ª Z„S[7|J;]

 

Exemple : Le jour de ma naissance est un vendredi : vérifions-le :

 

      JOUR 25 10 1940

VE

 

Vérifions si le 1er mars 2000 est bien un mercredi :

 

      JOUR 1 3 2000

ME

 

Et n’oubliez pas de faire intervenir le paramètre 400 dans vos ordinateurs pour l’an 2000… sinon, gare aux surprises du 1er mars ! (pour une fois que ce n’est pas le 1er avril !).

 

Puisque nous sommes en fin d’année, voici la fonction qui permet de faire un calendrier pour une année quelconque et qui tient compte d’un bon calcul des années bissextiles !

 

Z„M CAL X;A;S;I;J;K;L;D;N

A„'JAVFEVMARAVRMAIJUNJULAUTSEPOCTNOVDEC'

S„'DILUMAMEJEVESA'

J„12 6 21½3 0•(-7|(DA X)+0,+\¯1‡MD X)²((MD X)°.‰¼42)×12 42½¼42

I„(12 21½' ',7 2½S),[2]J

Z„2 1 3³(8,M,264÷M)½8 12 22†2 1 3³(12 21†12 ¯12†12 3½A),[2]I

D„½Z ª N„×/D ª Z„,Z ª

L„1+((Z ŒSS ' 0') IOTA 1) ª Z[L]„' ' ª Z„D½Z

 

La fonction IOTA se trouve à la page 87 du N°29 des Nouvelles d’APL.

 

Nous la reproduisons quand même ici :

 

Z„X IOTA Y

Z„(X=Y)/¼½X

 

Voici maintenant le calendrier de l’an 2000 par trimestre : l’argument gauche de CAL désigne la division de l’année (par exemple, en divisant par 6, on aurait 6 bimestres).

 

      4 CAL 2000

         JAV                   FEV                   MAR

 DI LU MA ME JE VE SA  DI LU MA ME JE VE SA  DI LU MA ME JE VE SA

                    1         1  2  3  4  5            1  2  3  4

  2  3  4  5  6  7  8   6  7  8  9 10 11 12   5  6  7  8  9 10 11

  9 10 11 12 13 14 15  13 14 15 16 17 18 19  12 13 14 15 16 17 18

 16 17 18 19 20 21 22  20 21 22 23 24 25 26  19 20 21 22 23 24 25

 23 24 25 26 27 28 29  27 28 29              26 27 28 29 30 31

 30 31

 

         AVR                   MAI                   JUN

 DI LU MA ME JE VE SA  DI LU MA ME JE VE SA  DI LU MA ME JE VE SA

                    1      1  2  3  4  5  6               1  2  3

  2  3  4  5  6  7  8   7  8  9 10 11 12 13   4  5  6  7  8  9 10

  9 10 11 12 13 14 15  14 15 16 17 18 19 20  11 12 13 14 15 16 17

 16 17 18 19 20 21 22  21 22 23 24 25 26 27  18 19 20 21 22 23 24

 23 24 25 26 27 28 29  28 29 30 31           25 26 27 28 29 30

 30

 

         JUL                   AUT                   SEP

 DI LU MA ME JE VE SA  DI LU MA ME JE VE SA  DI LU MA ME JE VE SA

                    1         1  2  3  4  5                  1  2

  2  3  4  5  6  7  8   6  7  8  9 10 11 12   3  4  5  6  7  8  9

  9 10 11 12 13 14 15  13 14 15 16 17 18 19  10 11 12 13 14 15 16

 16 17 18 19 20 21 22  20 21 22 23 24 25 26  17 18 19 20 21 22 23

 23 24 25 26 27 28 29  27 28 29 30 31        24 25 26 27 28 29 30

 30 31

 

         OCT                   NOV                   DEC

 DI LU MA ME JE VE SA  DI LU MA ME JE VE SA  DI LU MA ME JE VE SA

  1  2  3  4  5  6  7            1  2  3  4                  1  2

  8  9 10 11 12 13 14   5  6  7  8  9 10 11   3  4  5  6  7  8  9

 15 16 17 18 19 20 21  12 13 14 15 16 17 18  10 11 12 13 14 15 16

 22 23 24 25 26 27 28  19 20 21 22 23 24 25  17 18 19 20 21 22 23

 29 30 31              26 27 28 29 30        24 25 26 27 28 29 30

                                             31

 

Pour les débutants : Si vous voulez imprimer par semestre, n’oubliez pas de mettre le ŒPW à 132, d’utiliser une police de taille 8 à l’écran et d’imprimer en mode paysage.

Quand on dit que mettre l’origine des indices à 0 permet la plupart du temps de simplifier les calculs, ce ne sont pas des paroles en l'air (je n’en dirai pas autant pour certaines autres prétendues simplifications jamais démontrées…), voici un exemple de plus: le résultat de N|X (indépendant de l’origine des indices) est un nombre compris entre 0 et N-1. Si on se sert de cet indice pour désigner le jour de la semaine, 1 correspond à lundi, 2 à mardi… 6 à samedi et 0 pour dimanche, d’où l’intérêt , pour avoir un accès direct au jour calculé, de mettre dimanche en premier. Sinon, si on est en origine 1, lundi devra être le premier jour du tableau S contenant les jours de la semaine pour que S[I;] désigne le bon jour mais comme 0 correspond à dimanche l’expression S[I;] ne fonctionnera pas, I devra être modifié ainsi : I„I+(7×I=0). Si la langue anglaise est reconnue comme simple et précise, il n’est pas étonnant que leur pensée scientifique le soit aussi : c’est pourquoi dimanche est le 1er jour de la semaine et que les dates s’écrivent en poids décroissant : an, mois, jour.

 

 

Dernière nouvelle : Dans la revue APL Quote Quad que je viens de recevoir (Vol 29 N° 1, page 17) en même temps que celle du congrès APL99 (Vol 29 N° 2), on donne aussi une fonction telle que BI, je la livre telle quelle : Ÿš(0¬4000 100°.|year)^0=400 4°.|year„˜year

 

Par exemple, appelons-la BQQ.

BQQ:Z„Ÿš(0¬4000 100°.|¾)^0=400 4°.|¾„˜¾

 

Bon, d’accord, c’est moins simple, mais ça permet de travailler sur un tableau d’années qui de plus, peuvent être éventuellement le résultat de calculs en nombres non entiers. Par exemple si en astronomie le résultat d’un calcul donne 1968.42 (début mai 1968) le résultat de BQQ 1968.42 sera correct.

 

Exemple d’emploi :

 

      ,BQQ 7 1½1999.9 2000.1 1900.5 4000.75 1984 1700 1968.4

0 1 0 0 1 0 1

 

N.B. : j’ai linéarisé pour ne pas avoir un résultat sur 7 lignes.

 

Pour un tableau :

 

      Œ„T„3 4½1234.5 600 800 1900.5 3456.7 3212.9 5432.1 7654.3 2000.4 4000.5 1212 1515

 1234.5  600    800   1900.5

 3456.7 3212.9 5432.1 7654.3

 2000.4 4000.5 1212   1515

      BQQ T

 0 0 1 0

 1 1 1 0

 1 0 1 0

 

Remarque: Pour répondre à l'enquête de satisfaction, on ne peut quand même pas demander aux auteurs d'expliquer de fond en comble chaque ligne de leurs programmes! Ici il faudrait dire à quoi sert  ¾„˜¾  , pourquoi Ÿš  ,  pourquoi séparer  0¬4000 100°.|¾  et   0=400 4°.|¾  par contre c'est en répondant à toutes ces questions que j'ai trouvé les intentions de l'auteur, et par conséquent comment fonctionnait cette ligne. OK, on ne peut pas demander aux lecteurs de faire cet effort, par contre, on pourrait au moins donner des exemples d'utilisation comme je l'ai fait ci-dessus en guise d'explication. (Sachez que même en donnant plein d'exemples d'utilisation d'une fonction, il y en a encore (je ne citerai pas de noms!) qui n'ont pas compris comment on l'utilise, à quoi elle sert, etc…)

 

Sur ce, je tiens à préciser que dans la revue APL Quote Quad, il n'y avait aucune explication et pas même un seul exemple d'utilisation.