Zellers kongruens - Zeller's congruence

Zellers kongruens er en algoritme utviklet av Christian Zeller for å beregne ukedagen for en hvilken som helst juliansk eller gregoriansk kalenderdato . Det kan anses å være basert på konverteringen mellom juliansk dag og kalenderdatoen.

Formel

For den gregorianske kalenderen er Zellers kongruens

for den julianske kalenderen er det

hvor

  • h er ukedagen (0 = lørdag, 1 = søndag, 2 = mandag, ..., 6 = fredag)
  • q er dagen i måneden
  • m er måneden (3 = mars, 4 = april, 5 = mai, ..., 14 = februar)
  • K århundrets år ( ).
  • J er det nullbaserte århundret (faktisk ). For eksempel er de nullbaserte århundrene for 1995 og 2000 henholdsvis 19 og 20 (ikke å forveksle med den vanlige ordinære århundreoppregningen som angir 20. i begge tilfeller).
  • er gulvfunksjonen eller heltallsdelen
  • mod er modulo -operasjonen eller resten etter divisjon

I denne algoritmen regnes januar og februar som månedene 13 og 14 året før. Hvis det for eksempel er 2. februar 2010, teller algoritmen datoen som den andre dagen i den fjortende måneden i 2009 (02/14/2009 i DD/MM/ÅÅÅÅ -format)

For en ISO -ukedato Ukedag d (1 = mandag til 7 = søndag), bruk

Analyse

Disse formlene er basert på observasjonen av at ukedagen utvikler seg på en forutsigbar måte basert på hver del av den datoen. Hvert begrep i formelen brukes til å beregne forskyvningen som er nødvendig for å oppnå riktig ukedag.

For den gregorianske kalenderen kan de forskjellige delene av denne formelen derfor forstås som følger:

  • representerer utviklingen av ukedagen basert på månedsdagen, siden hver påfølgende dag resulterer i en ekstra forskyvning på 1 i ukedagen.
  • representerer utviklingen av ukedagen basert på året. Forutsatt at hvert år er 365 dager langt, vil den samme datoen for hvert påfølgende år oppveies av en verdi på .
  • Siden det er 366 dager i hvert skuddår, må dette redegjøres for ved å legge til ytterligere en dag i ukedagens offsetverdi. Dette oppnås ved å legge til offset. Dette begrepet er beregnet som et heltall. Resten kastes.
  • Ved bruk av lignende logikk kan progresjonen på ukedagen for hvert århundre beregnes ved å observere at det er 36524 dager i et normalt århundre og 36525 dager i hvert århundre delbart med 400. Siden og , uttrykket står for dette.
  • Begrepet justerer for variasjonen i månedene. Fra og med januar er dagene i en måned {31, 28/29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}. 28 eller 29 dager i februar er et problem, så formelen ruller januar og februar rundt til slutten, så februar's korte telling vil ikke forårsake et problem. Formelen er interessert i ukedager, så tallene i sekvensen kan tas modulo 7. Da ville antall dager i en måned modulo 7 (fortsatt med januar) være {3, 0/1, 3, 2 , 3, 2, 3, 3, 2, 3, 2, 3}. Fra og med mars veksler sekvensen i utgangspunktet 3, 2, 3, 2, 3, men hver femte måned er det to 31-dagers måneder på rad (juli-august og desember-januar). Fraksjonen 13/5 = 2,6 og gulvfunksjonen har den effekten; nevneren på 5 angir en periode på 5 måneder.
  • Den generelle funksjonen normaliserer resultatet til å ligge i området 0 til 6, noe som gir indeksen for riktig ukedag for datoen som skal analyseres.

Grunnen til at formelen er forskjellig for den julianske kalenderen er at denne kalenderen ikke har en egen regel for skuddhundre og blir forskjøvet fra den gregorianske kalenderen med et fast antall dager hvert århundre.

Siden den gregorianske kalenderen ble vedtatt på forskjellige tidspunkter i forskjellige regioner i verden, er plasseringen av en hendelse viktig for å bestemme riktig ukedag for en dato som skjedde i denne overgangsperioden. Dette er bare påkrevd gjennom 1929, da dette var det siste året den julianske kalenderen fremdeles var i bruk av noe land på jorden, og derfor ikke er nødvendig for 1930 eller senere.

Formlene kan brukes proleptisk , men "Årgang 0" er faktisk år 1 f.Kr. (se astronomisk årstall ). Den julianske kalenderen er faktisk proleptisk helt fram til 1. mars e.Kr. på grunn av dårlig forvaltning i Roma (men ikke Egypt) i perioden siden kalenderen ble satt i kraft 1. januar 45 f.Kr. (som ikke var et skuddår). I tillegg kan modulo -operatøren kutte heltall til feil retning (tak i stedet for gulv). For å imøtekomme dette kan man legge til et tilstrekkelig multiplum på 400 gregorianske eller 700 julianske år.

Eksempler

For 1. januar 2000 vil datoen bli behandlet som den 13. måneden i 1999, så verdiene vil være:

Så formelen vurderes som .

(36 kommer fra , avkortet til et heltall.)

Imidlertid blir datoen for 1. mars 2000 behandlet som den tredje måneden i 2000, så verdiene blir

så formelen vurderes som .

Implementeringer i programvare

Grunnleggende modifikasjon

Formlene er avhengige av matematikerens definisjon av modulodeling , noe som betyr at -2 mod 7 er lik positiv 5. Dessverre, på den avkortende måten de fleste dataspråk implementerer resten -funksjonen, returnerer -2 mod 7 et resultat av -2. Så for å implementere Zellers kongruens på en datamaskin, bør formlene endres litt for å sikre en positiv teller. Den enkleste måten å gjøre dette på er å erstatte - 2 J ved + 5 J og - J ved + 6 J . Så formlene blir:

for den gregorianske kalenderen, og

for den julianske kalenderen.

Man kan lett se at 1. mars (hvis det er en lørdag, så 2. mars) i et gitt år er en god testdato; og at det beste teståret i et gitt århundre er det som er et multiplum av 100.

Felles forenkling

Zeller brukte desimalregning, og fant det praktisk å bruke J og K for å representere året. Men når du bruker en datamaskin, er det enklere å håndtere det modifiserte året Y og måneden m , som er Y - 1 og m + 3 i løpet av januar og februar:

for den gregorianske kalenderen (i dette tilfellet er det ingen mulighet for overløp fordi ), og

for den julianske kalenderen.

Algoritmen ovenfor er nevnt for den gregorianske saken i RFC  3339 , vedlegg B, om enn i en forkortet form som returnerer 0 for søndag.

Andre varianter

Minst tre andre algoritmer deler den overordnede strukturen for Zellers kongruens i sin "vanlige forenkling" -type, også ved hjelp av en m ∈ [3, 14] ∩ Z og "modifisert år" -konstruksjonen.

  • Michael Keith publiserte et stykke veldig kort C -kode i 1990 for gregorianske datoer. Månedslengdekomponenten ( ) erstattes av .
  • JR Stockton gir en Sunday-is-0-versjon med , og kaller det en variant av Zeller.
  • Claus Tøndering beskriver som en erstatning.

Begge uttrykkene kan vises for å utvikle seg på en måte som er slått av med en sammenlignet med den opprinnelige månedslengdekomponenten over det nødvendige området på m , noe som resulterer i en startverdi på 0 for søndag.

Se også

Referanser

Bibliografi

Hver av disse fire lignende avbildede papirene omhandler for det første ukedagen og for det andre datoen for påskedag, for de julianske og gregorianske kalenderne. Sidene lenker til oversettelser til engelsk.

Eksterne linker