l'algorithme de Mike Keith

Programmation d'applications complexes
Avatar de l’utilisateur
MLD
Messages : 1103
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

l'algorithme de Mike Keith

Message par MLD »

Ceci repond a un vieux topic de Dobro, ou Détermination du jour de la semaine pour une date quelconque :wink:
l'algorithme de Mike Keith est semblet'il le plus court connu a ce jour.

Code : Tout sélectionner

;======================================
; MLD le 20/12/2010                   =
; Détermination du jour de la semaine =
; pour une date quelconque            =
; selon l'algorithme de Mike Keith    =
; PB 4.51                             =
;======================================
Global Dim Jour.s(6)
Jour(0) = "Dimanche"
Jour(1) = "Lundi"
Jour(2) = "Mardi"
Jour(3) = "Mercredi"
Jour(4) = "jeudi"
Jour(5) = "Vendredi"
Jour(6) = "Samedi"

Procedure joursem(d,m,y)
xz = 0 : z = 0
If m<3
 z = y-1 : xz =0
Else
 z = y : xz = 2
EndIf
D = (((((23*m)/9) + d + 4 + y + (z/4)) - (z/100) + (z/400)) - xz)%7
ProcedureReturn  D
EndProcedure
Date$ = InputRequester("Saisie d'une date", "JJ/MM/AAAA", "14/07/1789")
MessageRequester("reponse",jour(joursem(Val(StringField(Date$, 1, "/")),Val(StringField(Date$, 2, "/")),Val(StringField(Date$, 3, "/")))) + "  " + Date$ ,#PB_MessageRequester_Ok )
Dim Jour.s(0)
End
Faites en ce que vous voulez. :wink:

Michel
Dernière modification par MLD le lun. 20/déc./2010 17:35, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: l'algorithme de Mike Keith

Message par Ar-S »

Image MLD
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: l'algorithme de Mike Keith

Message par Backup »

oui ! excellent Merci :D
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: l'algorithme de Mike Keith

Message par PAPIPP »

Bonjour à tous
Quelques remarques :
L'algorithme de Mike Keith n’est valable que dans le calendrier grégorien à partir du 15/10/1582
Car dans ce calendrier il n’existe pas de date entre le 04/10/1582 et le 15/10/1582
L’algo en trouve !!!!
Autre remarque le 01/01/01 est toujours un dimanche
L’algo me donne un Lundi !!!

Algorithme de Mike Keith

Algorithme

Dans un article publié en 1990 dans le Journal of Recrational Mathematics, Vol. 22, No. 4, 1990, p. 280, Mike Keith propose un algorithme pour la détermination du jour de la semaine correspondant à une date quelconque. Sa formule, inspirée de la congruence de Zeller et traduite en seulement 45 caractères précise-t-il, est la suivante :

(d+=m<3?y--:y-2, 23*m/9 + d + 4 + y/4 -y/100 + y/400) ÷ 7

Mike Keith déclare lui-même qu'il s'agit là de la " plus simple formule possible " pour le calcul du jour de la semaine, " la meilleure qui puisse être construite ", ajoute-t-il. Dans sa forme opérationnelle, son algorithme s'écrit :

Jour de semaine D = { [(23m)/9] + d + 4 + y + [z/4] - [z/100] + [z/400] - 2 (si m >= 3) } mod 7
où:
D = Jour de semaine (D = 0 à 6; 0 = Dimanche, 1 = Lundi, ... , 6 = Samedi)
[x] signifie le nombre entier résultant de la division, le reste étant ignoré
m = Mois (m = 1 à 12; 1 = Janvier, 2 = Février, 3 = Mars, ... , 12 = Décembre) m >= 3 signifie m supérieur ou égal à 3
d = Jour (d = 1 à 31)
y = année
z = y - 1 si m < 3
z = y si m >= 3
Modulo 7 ou mod 7 = reste de la division par 7

Exemples

1er cas : m < 3
Le 18 janvier 1953 tombait quel jour de la semaine?
d = 18, m = 1, y = 1953 et z = y-1 = 1952; d'où
D = { [(23x1)/9] + 18 + 4 + 1953 + [1952/4] - [1952/100] + [1952/400] } mod 7
D = (2 + 18 + 4 + 1953 + 488 - 19 + 4) mod 7
D = 2450 mod 7 = 0 car 2450 = 7 x 350 + 0
18 janvier 1953 = un Dimanche

2eme cas : m > 3
Le 2 août 1953 tombait quel jour de la semaine?
d = 2, m = 8, y = 1953 et z = y = 1953; d'où
D = { [(23x8)/9] + 2 + 4 + 1953 + [1953/4] - [1953/100] + [1953/400] - 2 } mod 7
D = (20 + 2 + 4 + 1953 + 488 - 19 + 4 - 2) mod 7
D = 2450 mod 7 = 0 car 2450 = 7 x 350 + 0
2 août 1953 = un Dimanche

3eme cas : m = 3
Le 13 mars 1998 tombait quel jour de la semaine?
d = 13, m = 3, y = 1998 et z = y = 1998; d'où
D = { [(23x3)/9] + 13 + 4 + 1998 + [1998/4] - [1998/100] + [1998/400] - 2 } mod 7
D = (7 + 13 + 4 + 1998 + 499 - 19 + 4 - 2) mod 7
D = 2504 mod 7 = 5 car 2504 = 7 x 357 + 5
13 mars 1998 = un Vendredi 13 !!!

Au besoin, le lecteur pourrait vérifier ses résultats de calcul du jour de la semaine au moyen de notre Calendrier pratique, du Calendrier permanent ou du Calendrier perpétuel à 12 mois.

@+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: l'algorithme de Mike Keith

Message par Frenchy Pilou »

Sinon il reste la collection du calendrier des Postes :)
Et pour 2011 on peut même se reservir de celui de 2005 ;)
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
MLD
Messages : 1103
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: l'algorithme de Mike Keith

Message par MLD »

PAPIPP a écrit :Bonjour à tous
Quelques remarques :
L'algorithme de Mike Keith n’est valable que dans le calendrier grégorien à partir du 15/10/1582
Car dans ce calendrier il n’existe pas de date entre le 04/10/1582 et le 15/10/1582
L’algo en trouve !!!!
Autre remarque le 01/01/01 est toujours un dimanche
L’algo me donne un Lundi !!!
C'est tout de même mieux que les limitations de dates de PB :D
Je n'ai pas programmer de garde fous pour l'entrée des dates dans l'algo.(J'ai fait confiance a l'intelligence de l'opérateur) :mrgreen:
PAPIPP a écrit :Autre remarque le 01/01/01 est toujours un dimanche
L’algo me donne un Lundi !!!
De quoi ? Du premier jour du monde, de la première année aprés J.C, de l'an 1 de la révolution. :?: quelle est la source :?:
PAPIPP a écrit : Car dans ce calendrier il n’existe pas de date entre le 04/10/1582 et le 15/10/1582
L’algo en trouve !!!!
Autre remarque le 01/01/01 est toujours un dimanche
L’algo me donne un Lundi !!!
Le trou noir de 11 jours :mrgreen: (En fait changement du calendrier Julien en Grégorien "Date variable selon les pays")
Pourtant notre ami Huitbit dans un topic sur ce forum intitulé "Jour Julien,Applications", en basant sur d'autres sources trouve la même chose que Mike Keith. :?: :?:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: l'algorithme de Mike Keith

Message par Backup »

pour moi ton algo va tres bien Merci :)
Répondre