Discussion Modèle:NEXTSUNDAYLEAP29

Un article de Wikipédia, l'encyclopédie libre.

Sommaire

[modifier] principes utilisés pour le calcul

La façon de calculer l'année du prochain dimanche 29 février n'est pas si triviale. Si on compare, la règle des fins de siècle pour les années bissextiles (3 fois sur 4) n'est pas si problématique. Car en cas d'exception, il suffit de sauter un cran dans la cycle et aller au cran suivant du même cycle. (Si pas bissextile, il suffit d'ajouter 4 une fois de plus).

Par contre, il n'y a pas pour nous de cycle à proprement parler. Au départ il semble y avoir un cycle de 28 ans. On le verra dans la suite, chaque période de 4 ans décale une date fixée du calendrier de 5 jours dans la semaine. Pour retomber sur un dimanche il faut donc 5n=7k. La première solution est n=7 (k=5) donc 7 cycles de 4 ans pour retomber sur un dimanche. 7×4=28.

Mais le tout est décalé de 12 années supplémentaires en cas d'exception de fin de siècle. Voyons cela :

[modifier] pourquoi 12 ans ?

D'abord notons qu'un cycle de 4 ans (dont l'un est bissextile) fait avancer de 5 jours le jour de la semaine. (3×365+366) mod 7 = 5.

Si une année n'est pas bissextile comme "prévu" alors le dimanche prévu tombe début mars (qui aurait dû être un lundi s'il y avait eu un 29 février). On est donc décalé dans notre cycle d'un jour. Tout se passe comme s'il y avait eu un 29 février mais que celui-ci avait été un samedi au lieu d'un dimanche. Il faudrait décaler de 1 jour (modulo 7) pour retomber sur un dimanche.

12 ans est le premier compte qui convient. Soit 3 cycles de 4 années; chacun décale de 5 jours la semaine; soit 3×5=15 jours d'avance ; on avait un jour de retard par rapport au dimanche. Donc on passe à 14 jours de décalage exactement par rapport au dimanche, soit 2 semaines donc à nouveau un dimanche.

Une manière pratique de dire, est que 12 annnées permettent de rattraper un jour de retard sur le 29 février.

[modifier] Gérer l'exception dans le cycle de 28 ans

Dans les cas exceptionnels (fin de siècle) il ne suffit pas d'ajouter 28 une fois de plus. Il ne s'agit plus de sauter un cran dans un cycle mais d'ajouter 12, qui n'est pas un multiple de 28.

Cerise sur le gâteau, il ne s'agit pas véritablement de multiples de 28 années de toute façon, car jours et années n'étant pas synchronisés, le premier dimanche 29 février utile tombait en 2004... Ce qui fait débuter les années à 16 (2004 modulo 28).

En clair, les années candidates pour un dimanche 29 février pourront s'écrire 16 + 28×N + 12×K. Ce qui est bien le cas ne notre suite : 2004 (référence=16+71×28), 2032, 2060, 2088, 2128, 2156, 2184, 2224, 2252, 2280, 2320, 2348, 2376, 2404...

[modifier] astuce

Plutôt que de résoudre l'équation permettant de trouver N et K les plus proches pour l'année en cours, ce qui est délicat avec la syntaxe de wiki, il suffit en fait de regarder de combien de jours de décalage on aurait besoin.

Et on sait qu'il suffit d'ajouter 12 ans pour rattraper chaque jour d'écart. Exemple, si le prochain 29 février tombe un samedi, il suffira d'y ajouter 12 ans pour retrouver un dimanche 29 février. (Décalage de 1 jour = 12 ans d'attente).

Si J est le jour du prochain 29 février (0=lundi à 6=dimanche) alors il faut ajouter à la prochaine année bissextile ( (16-12*J) modulo 28 ) années d'attente. On tombe ainsi sur les restes suivant : 16, 4, 20, 8, 24, 12 ou 0. On préfèrera utiliser un #switch pour augmenter la lisibilité du code et diminuer le nombre de calculs du serveur.

[modifier] Réalisation concrète

  • on n'utilise pas la fonction #time de wiki, car elle est limitée en dates. On préfère le modèle:WEEKDAY. On calcule ainsi le jour du prochain 29 février, donné par le modèle:NEXTLEAP29.
  • Sachant ce jour (lundi à dimanche) on peut en déduire combien d'année ajouter pour tomber sur le prochain dimanche 29 février. On utilise un #switch pour cela.
  • L'addition est faite dans le #expr principal
  • On gère alors le cas particulier des fins de siècle. Pour cela on teste la date déjà obtenue (on doit la recalculer pour cela, dans un #ifexpr). On vérifie qu'elle tombe bien un dimanche.
    • Si c'est bien un dimanche, on ajoute encore zéro (donc rien) car on a trouvé l'année voulue
    • Sinon, la raison de ce décalage (ce n'est pas un dimanche comme attendu) vient nécessairement du franchissement d'une fin siècle (année divisible par 4 mais non bissextile) avant le prochain dimanche 29 février. Donc on ajoute encore 12 ans de plus.
  • Ainsi on tombe comme voulu sur l'année du prochain dimanche 29 février.

[modifier] cas de l'année courante

Le modèle:NEXTLEAP29 ne renvoie l'année courante que si elle est bissextile ET que le mois de février n'est pas encore écoulé. Automatiquement l'année courante n'est donc plus candidate dès le mois de mars. Inutile de refaire un test dans ce modèle.


note importante tout cela suppose que le calendrier grégorien actuel reste inchangé tout comme sa règle des années bissextiles. ( Années divisibles par 4 mais pas par 100 ou années divisibles par 400). Sinon un nouveau décalage de 12 ans pourrait être nécessaire. Il devrait alors suffire de changer les restes précalculés des #switch.

Notons enfin que cette version remplace une version précédente qui utilisait en fait une table pré-mémorisée. Donc cette algorithme lève la limite temporelle.