Algoritme for å bestemme ukedag

For å regne ut på hvilken ukedag en bestemt dato falt i fortid eller vil falle i fremtiden, kan man bruke ulike algoritmer. Alternativt kan man benytte evighetskalendere, som ikke krever noen beregninger fra brukerens side. Typisk kan man ønske å fastslå på hvilken ukedag noen ble født eller på hvilken ukedag en spesifikk historisk begivenhet fant sted.

 Innføring 
For å bestemme ukedagen til en dato fra numeriske beregninger, starter man ved å tildele hver av de syv ukedagene (søndag, mandag, … lørdag) et tall, i rekkefølge. Vanligvis brukes 0 til 6, som tilsvarer ISO 8601s  alternative bruk av 1 = mandag til 7 = søndag. Dette oppnås ved aritmetikk modulo 7. Modulo 7 er en operasjon som beregner resten av et tall når det deles med 7, for eksempel er 10 modulo 7 lik 3. Da behandles tallet 7 som null, tallet 8 som 1, tallet 9 som 2, osv. Dette tolkes slik at om søndag representeres som 0, så er 7 dager senere også en søndag, 8 dager senere er en mandag, osv.

Utgangspunktet for så godt som alle disse metodene er å starte med en gitt historisk dato hvor ukedagen er kjent, for eksempel ta utgangspunkt i at 1. januar 1800 var en onsdag. Deretter regner man ut hvor mange dager det er mellom den datoen og datoen man ønsker å finne ukedagen til. Til slutt bruker man modulær aritmetikk 7 for å fastslå på hvilken ukedag den aktuelle datoen falt eller vil falle.

En standardmetode er å slå opp numerisk verdi for første ukedag i et gitt århundre, slå opp (eller beregne, ved en kongruensmetode) en månedkorreksjon, beregne antall skuddår siden starten av århundret, endelig legge disse sammen med antall år siden århundrets begynnelse. Til slutt finner man antall forløpte dager og bruker modulo 7 for å bestemme ukedagen.Richards, E.G. (1999). Mapping Time: The Calendar and Its History. Oxford University Press.

Man kan enten summere først og finne resten (ved deling med 7) til slutt eller finne resten ved hvert trinn, som i Lewis Carrolls metode. Begge metodene er praktiske, den første metoden er enklere for elektroniske kalkulatorer og dataprogrammer, mens den siste kan være bedre egnet for hoderegning. Ingen av metodene gitt her sjekker inngangsdata, så hvis en starter med ufornuftige datoer vil det gi feil svar.

 Nyttige begrep 
 Samsvarende måneder 
«Samsvarende måneder» er de månedene innenfor samme kalenderår som starter på samme ukedag. For eksempel er det samsvar mellom september og desember, fordi 1. september faller på samme ukedag som 1. desember. Måneder kan bare samsvare hvis antallet dager mellom deres førstedager er delelig med 7, med andre ord, om det er et helt antall uker mellom deres førstedager. For eksempel februar samsvarer med mars (unntatt skuddår) fordi februar har 28 dager, som er nøyaktig fire uker. I et skuddår vil januar og februar ha andre samsvarsmåneder enn i et vanlig år, siden 29. februar betyr at alle senere måneder starter en dag senere.

Månedene samsvarer slik:
For vanlige år:
 januar og oktober.
 februar, mars og november.
 april og juli.
 Ingen måneder samsvarer med august.
For skuddår:
 januar, april og juli.
 februar og august.
 mars og november.
 Ingen måneder samsvarer med oktober.
For alle årene:

 september og desember.
 Ingen måneder samsvarer med mai eller juni.
I månedtabellen under, så har samsvarende måneder det samme tallet, et faktum som følger direkte fra definisjonen.

 Samsvarende år 

Det er syv mulige forskjellige ukedager et år kan starte, og skuddår vil endre ukedagen for alle dager etter 29. februar.  Dette betyr at et år kan ha 14 forskjellige konfigurasjoner (med andre ord, det er 14 forskjellige mulige årskalendere). For eksempel, 2011 er et normalår som begynner på en lørdag, som betyr at 2011 samsvarer med kalenderåret 2005. Men 2012 er et skuddår som starter på en søndag, som betyr at de første to månedene det året starter på samme dag som de gjør i 2006 (1. januar er en søndag, mens 1. februar er en onsdag), men på grunn av skuddår, så samsvarer de ti siste månedene det året med de ti siste månedene av 2007.

 En tabellmetode for å beregne ukedag 
 Grunnleggende metode for hoderegning 
Denne metoden er gyldig både for den den gregorianske kalenderen  og for den julianske kalenderen. Storbritannia med sine kolonier begynte å bruke den gregorianske kalenderen på torsdag 14. september 1752, dagen før denne var onsdag, 2. september 1752 (Old Style).  De områdene som nå utgjør USA begynte å bruke den nye kalenderen på forskjellige tidspunkt, avhengig av hvilken kolonimakt de lå under: Spania og Frankrike hadde brukt den nye kalenderen siden 1582, mens Russland stadig brukte den julianske kalenderen da Alaska ble kjøpt fra dem i 1867.

Formelen er , hvor:
 d er dag i måneden,
 m er månedens tall i månedstabellen,
 y er de to siste siffrene i årstallet, og
 c er århundretallet. For en gregoriansk dato så er dette 6 hvis de første to sifrene i årstallet er delelig med fire og etterfølgende århundrer er 4-2-0 (så århundretallene for 2000, 2100, 2200, og 2300 er respektive 6, 4, 2 og 0).  For en juliansk dato, så er dette 6 for 1200 og etterfølgende århundrer trekker man fra 1 inntil 0, så er neste århundre 6 igjen (så 1300 er 5 og 1100 er 0).

Hvis resultatet er 0, så var datoen en søndag, hvis 1, en mandag, osv.

 Dagstabell 
 Dato  d  Dag 01  08  15  22  29  1  Mandag 02  09  16  23  30  2  Tirsdag 03  10  17  24  31  3  Onsdag 04  11  18  25      4  Torsdag 05  12  19  26      5  Fredag 06  13  20  27      6  Lørdag 07  14  21  28      0  Søndag

 Månedstabell 
 Måned      m        Skuddår  Januar     0  6 Februar    3  2 Mars       3 April      6 Mai        1   Juni       4 Juli       6 August     2  September  5 Oktober    0 November   3 Desember   5 

 Årstabell 
 Årstall modulo 100y 00  06     17   23   28  34   45  51  56  62    73  79  84  90     0 01  07  12  18    29  35  40  46   57  63  68  74   85  91  96    1  02    13  19  24  30   41  47  52  58   69  75  80  86   97   2 03  08  14   25  31  36  42   53  59  64  70   81  87  92  98   3     09  15  20  26   37  43  48  54   65  71  76  82   93  99   4 04  10   21  27  32  38   49  55  60  66   77  83  88  94    5 05  11  16  22   33  39  44  50   61  67  72  78   89  95     6

 Århundrestabell 
Gregoriansk kalender Juliansk kalender  Århundre mod 4  Århundre mod 7c (1700, 2100)  1     (1400, 0700) 0    4                        (1500, 0800)  1   3  (1800, 2200)  2     (1600, 0900)  2   2                      (1700, 1000) 3   1  (1900, 2300)  3     (1800, 1100) 4    0  (2000, 2400)  0     (1200, 0500) 5     6                      (1300, 0600)  6   5

 Fullstendig tabell 
 Dato   01 02 03 04 05 06 07         08 09 10 11 12 13 14         15 16 17 18 19 20 21         22 23 24 25 26 27 28 Måned  29 30 31          Årstall modulo 28  Århundre mod 4   Århundre mod 7 4 7    Søn Man Tir Ons Tor Fre  Sat  01 07 12 18 24  1600 2000 0  0500 1200 5 9 12    Lør Søn Man Tir Ons Tor Fre 02 08 13 19 24               0600  1300 6  6       Fre  Lør Søn Man Tir Ons Tor 03 08 14 20 25  1700 2100 1  0700 1400 0 2 3 11  Tor  Fre  Sat Søn Man Tir Ons  04 09 15 20 26                  0800 1500 1    8      Ons Tor  Fre  Lør Søn Man Tir  04 10 16 21 27  1800 2200 2  0900 0200 2 5       Tir Ons Tor  Fre  Lør Søn  Mon  05 11 16  22 00             1000 0300 3 1 10  Mon  Tue Wed Tor  Fre  Lør Søn  06 12 17 23 00 1900 2300 3  1100 0400 4
For å bestemme ukedag (1. januar 2000, lørdag)
dag i måneden: 1 ~ 31 (1)
måneden: 1 for januar ~ 12 for desember (1，man) 
året: 00 ~ 99 mod 28 og kursiv for januar eller februar i skuddår (00 ~ man)
århundre mod 4 for den gregorianske kalenderen og mod 7 for den julianske kalenderen (20 or 0 ~ lør).
For å bestemme søndagsbokstaven til et årstall: (2100 C ~ 2199 F)
the century column: from the century row to Sun which is in the column and in the row (21 or 1)
the dominical letter: Mon for A ~ Sun for G from the year row to the century column (00 ~ Wed for C, 15 for 99 ~ Sat for F).

For den gregorianske datoen 1. januar 2000 (et skuddår):
dag i måneden: 1
January in the months table: 6
siste to sifre i året (delt på 4): 0
Century number: 6
Resultatet er 13, leaving a remainder of 6 when divided by 7, så 1. januar, 2000 var en lørdag.

For den julianske datoen 13. oktober 1307:
dag i måneden: 13
October in the months table: 0
siste to sifre i året delt på 4: 1
siste to sifre i året: 7
Century number: 5
Resultatet er 26, leaving a remainder of 5 when divided by 7, så 13. Oktober, 1307 var en fredag.

 Gauss' algoritme 

 Formler utledet fra Gauss' algoritme 

 Andre varianter 

 Andre, rent matematiske algoritmer 

  Zellers algoritme

 Kraitchiks algoritme

 Schwerdtfegers variant

 Tønderings algoritme

 Dinhs algoritme

 Andre metoder (som bruker tabeller eller lignende) 

 Lewis Carrolls metode 

 Implementasjons-avhengige metoder av Sakamoto, Lachman, Keith og Craver 

 Babwanis metode 

Se også
 Ukenummer: Enkel utregning av ukesnummer
 Ukedager: Enkel utregning av ukedag
 ISO 8601
 Søndagsbokstav
 Påskeformelen
 Solsyklus
 Gyldentall

 Referanser 

 Litteratur 

 Eksterne lenker 
 Compact tabular method for memorization, also for the Julian calendar
 An algorithm for both Gregorian and Julian calendars
 When countries changed from the Julian calendar
 World records for mentally calculating the day of the week in the Gregorian calendar 
 A recent reworking of the method of Keith & Craver eliminating the need to recall a value for each year.
 A trainer for mental calculation of the day of the week

Kategori:Kalendere