Lewis Carroll – computing the day of the week for any given date (1887)
futilitycloset.com
futilitycloset.com
JH Conway used a different technique[1] which I have swutch to when computing days in the current year. It's quicker and easier, but I find that it's harder to compute "The Doomsday" for other years (it's Thursday this year), so I revert to my standard method[2].
Example: Today is 2024/05/24
Years since 2012 is 12
Leap years is 12/4 = 3
Magic month number = 2
Date is 24
Add mod 7 is (12+3+2+24) = (-2)+3+2+3 = 6 = Friday
[0] A "magic number" for each month. There are mnemonics, and they can be computed from first principles if needed. It's also easy to remember a few and then compute the others. 144 : Jan, Feb, Mar
025 : Apr, May, Jun
036 : Jul, Aug, Sep
146 : Oct, Nov, Dec
[1] https://en.wikipedia.org/wiki/Doomsday_rule[2] All values computed mod 7. Take years since 1900. Add number of leap years since 1900 (so (YYYY-1900)/4 rounded down). Add the magic number for the month. Add the day of the month. Then Sunday=1, Wednesday=4, etc.
Because the calendar repeats every 28 years, for more recent dates you can start with 2012 instead of 1900.
That's a past participle I've never seent before
(i.e. past perfect, I think?)
Perfect: "to which I have swutch"
Pluperfect/past perfect: "to which I had swutch"
I'm going to go with swutcheted
On the other hand, Chinese verbs are even easier. They don't even have a tense!
However, the verbs themselves don't have tense. So these sentences can be identical: "I will walk home, then I will eat a cake" and "I walked home, then I ate a cake".
The overall timeframe can be given by a larger context: "Once my shift is over, I ..." / "I drank too much yesterday, that's all I remember: ".
It's simply not possible in English because every verb has a grammar tense built into it.
…and the duck said to the bartender, “put it on my bill”
Compilation error at line 173.
144 : Jan, Feb, Mar
025 : Apr, May, Jun
036 : Jul, Aug, Sep
146 : Oct, Nov, Dec
You mean: Jan = 1, Feb = 4, Mar = 4, etc.I remember them in this table because they are squares (except for December), as well as "highlights" ... May=2 and August=3 are two that I have "to hand".
For example, what day of week was September 2, 1945?
45/4 = 11 (mod 7 = 4)
45 mod 7 = 3 (easy to work out from 7 times table)
September = 6
2
So you've got 4 + 3 (disappears under mod 7) and 6 + 2 mod 7 = 1. So, the second world war ended on a Sunday.1: A calculation for the Century-Item ... divide by 4, take overplus from 3, multiply remainder by 2.
2: A calculation for the Year-Item ... Add together the number of dozens, the overplus, and the number of 4’s in the overplus.
3: A calculation for the Month-Item ... alternatively, memorise a table: the required final numbers after division by 7 are January, 0; February, 3; March, 3; April, 6; May, 1; June, 4; July, 6; August 2; September, 5; October, 0; November, 3; and December, 5.
Note that these numbers are exactly those in my table, minus 1.
4: Include the Day-Item.
Then add them all (mod 7) and convert the number to a month.
It's exactly equivalent to what I described, except the Carroll method has additional calculations for the year.
(E.g. 1900 is not a leap year but 2000 is)
A statement I find to be true in general.
No, you don't need to do it relentlessly as you go, but it can be used in an ad hoc manner to keep the numbers small.
Having said that, if you have 24, you can reduce it (mod 7) to 10, which you might find it easier to work with rather than reducing it to 3. Similarly if you start with 27 you can reduce it to -1 (mod 7). You don't always need to reduce things to the range [0..7).
(Note, by convention the square bracket implies "included" and the round bracket implies "excluded", so [0..7) is the collection {0,1,2,3,4,5,6}.)
That way when using the system you don't have to care about leap years except during January and February. The formulas always give February 28th as the day before March 1 which in leap years is one day too late because of February 29th, and so as you surmised you need to adjust by -1 for dates in those months.
-- https://www.rudy.ca/doomsday.html
Likely that sprung to mind because of the "Domesday Book":
"Domesday Book (/ˈduːmzdeɪ/ DOOMZ-day; the Middle English spelling of "Doomsday Book") is a manuscript record of the Great Survey of much of England and parts of Wales completed in 1086 at the behest of King William the Conqueror."
> 144 : Jan, Feb, Mar
025 : Apr, May, Jun
036 : Jul, Aug, Sep
146 : Oct, Nov, Dec
It can be useful to combine mnemonics and computation. Consider this sequence: 0, 1, -1, 0, 0, 1, 1, 2, 3, 3, 4, 4
It is the offset between the day of the year of the 1st of each month and the day of the year the 1st would be if the preceding months had all been 30 day months. For example if the first 11 months had all been 30 day months Christmas, December 25, would be day 30 x 11 + 25 = 355. Add the 12th item from the offset sequence, 4, to that to get the real day of the year for December 25th, which is 359.The offset sequence is fairly easy to memorize.
Once you have that sequence memorized its easy to get the month magic numbers for day of week calculations. There are a few different sets of month magic numbers in use, but for all of them:
Magic(n) = 2 n + Offset(n) + c
where Magic(n) is the magic number for month n (1 ≤ n ≤ 12), Offset(n) is the n'th item in the offset sequence, and c is a constant that depends on just what set of magic month numbers you use. For the 1 4 4 0 2 5 0 3 6 1 4 6 magic numbers c = -1.For example for month 12, December, we get 2 x 12 + 4 + -1 = 6 mod 7.
By memorizing the offset sequence and using that to get the month magic numbers you get, at the cost a small amount of calculation to get the month numbers, easy day of year and days between dates calculations.
Of course it works both ways. Given memorized month magic numbers you can compute Magic(n) - 2 n - c and that will equal Offset(n) mod 7. As long as you remember that Offset(n) is in [-1,4] and so adjust anything outside that range by adding/subtracting multiples of 7 to get into range it should be fine.
That's a helpful encoding because it matches up with numbering that's routinely used in Portuguese, Hebrew, Greek, and by Quakers, among many others.
https://en.wikipedia.org/wiki/Names_of_the_days_of_the_week#...
These are mostly ultimately because of the Hebrew Bible account in which Sunday is the first day of creation (e.g. Genesis 1:5, 1:8, 1:13, ...).
Sunday is the day of creation in the Bible because it was the first day in the calendar being used where Genesis was written and translated, so "Day 1" became "Sunday" because to the translator "Sunday" was the first day. That calendar itself was not mathematical - the Hebrew calendar was an empirical lunisolar calendar with arbitrary intercalarion for thousands of years until it was fixed in 2CE in Judea, and it took another thousand years for this practice to become consensus, so Sunday being the day of creation is purely incidental and not a necessary intersection.
Ascribing the Bible into it is gratuitous and useless. While it might be a reason why a small proportion Christians use it, it only explains a tiny minority of its usage, not most of it. It's just explained by it being an obvious way to name days.
I'm pretty curious about this question, which I've previously asked in the form of "for how long has there been a worldwide consensus about which day of the week it is?". One answer that I heard is sort of akin to sudosysgen's account, in that some people suggested that the question might not be meaningful: there may have been different cultures with a seven-day week and, when they made sustained contact, instead of debating with each other about "which day of the week it is", they may have understood themselves to be translating their existing names for the weekdays -- some of which were based on numbers.
To the extent that that's a good way of talking about it, I also don't have a good understanding of when those translations would have happened, or who would have made them.
This author argues that the "the Jewish, biblical week and the planetary week of astrological origin" were combined in Rome rather than Greece, while agreeing that there are earlier antecedents for the use of the seven-day week.
https://blogs.fu-berlin.de/zodiacblog/2022/05/02/the-origins...
Wikipedia on "nundinae" seems to roughly agree with this interpretation:
> The 7-day week first came into use in Italy during the early imperial period. For a time, both systems were used together, but the nundinae are seldom mentioned in extant sources after the Julio-Claudian period. The nundinal cycle had probably fallen out of use by the time Constantine adopted the Hebrew weeks for official use in AD 321, altering the day of rest by declaring the Lord's day the Day of the Sun (dies Solis) a legal holiday. Different scholars have placed the end of 8-day markets at various dates from the late 1st to early 5th centuries.
Years since 2012 is 20
Leap years is 20/4 = 5
Magic month number = 4
Date is 7
(20 + 5 + 4 + 7) % 7 = 1
So I was expecting Sunday, but the answer is Saturday. After some thought I realised: 2032 is a leap year and the chosen date is before February 29th. In those cases (on or before that day), it is necessary to subtract 1.> Leap years is 20/4 = 5
... but because you are in February you have not yet had that leap year, so it's only 4, and then the sums work.
> Even months aside from February, same date as the month, so 4/4, 6/6, 8/8, 10/10, 12/12.
> “Working 9 to 5 at 7-11”: 5/9, 7/11, 9/5, 11/7
> Jan–Mar are a bit arbitrary: Feb is the last day of the month (so 2/28 or 2/29), March is the 0th day (same), and Jan is 1/31 or 1/“32” depending on if it’s a leap year.
So Jan=1, Feb=4, Mar=4
> 025 : Apr, May, Jun
So Apr=0, May=2, Jun=5
... and so on.
And we can substitute 2012 for 1900 because we make a correction in Jan and Feb in leap years. Knowing that 1900 was not a leap year means we don't make the correction, but 2012 was a leap year so we do.
> 1,4,4 : Jan, Feb, Mar.
From [1]: By the 18th century, the English legal year – used for legal, financial and other civil purposes – had for centuries begun on 25 March, or Lady Day.[13][i] Thus, for example, 24 March 1707 was immediately followed by 25 March 1708, while the day following 31 December 1708 was 1 January 1708, with 1709 still nearly three months away.
Thank goodness that happened.
[1] https://en.m.wikipedia.org/wiki/Calendar_(New_Style)_Act_175...
It was quite frosty that June and people were hoping for a warm summer come December.
And July used to be Quintilis (5) and August was Sextilis (6), but then Julius Cesar and Emperor Augustus came.. and got their own month names.
https://github.com/util-linux/util-linux/blob/9f15d2de811773...
[1] https://theconversation.com/why-the-uk-tax-year-begins-on-ap...
Although disputed by some, apparently the switch to the Gregorian calendar is also the basis for "April Fools' Day."
Maybe a better (or much worse!) behavior would be to show the switch in the current locale, so in ru_RU it happens in 1918, but in es_ES (or es_MX, es_CO, es_AR, es_PY, ...) it happens in 1582.
1676, February 23
...
Dates before 1752 would in England be given Old Style with 25 March as the
first day of the new year. Carroll's method however assumes 1 January as
the first day of the year, thus he fails to arrive at the correct answer,
namely "Friday".
...
It is noteworthy that those who have republished Carroll's method have
failed to point out his error"
Indeed, the linked article has this flaw, too (:[1] https://en.wikipedia.org/wiki/Determination_of_the_day_of_th...
From the article:
The Month-Item. — If it begins or ends with a vowel, subtract the number, denoting its place in the year, from 10. This, plus its number of days, gives the item for the following month. The item for January is ‘0’; for February or March (the 3rd month), ‘3’; for December (the 12th month), ’12.’ [So, for clarity, the required final numbers after division by 7 are January, 0; February, 3; March, 3; April, 6; May, 1; June, 4; July, 6; August 2; September, 5; October, 0; November, 3; and December, 5.]
My attempt to implement:
For January, the preceding month is December, which neither begins nor ends with a vowel, so I do not subtract 10. The days in December are 31, so 12+31 = 43 mod 7 = 1, not the 0 of the article.
For February, the preceding month is January, which ends in a vowel, so I subtract 1 from 10, giving 9, add the days in January 1+31 = 32 mod 7 = 4, not the 3 of the article.
For March, the preceding month is February, which ends in a vowel, so I subtract 2 from 10 giving 8 and add February's 28 days 8+28 = 36 mod 7 = 1, not the 3 of the article. Had I used a leap year 29 for the days in February at this step the result would be 2, which still does not match the article result. Since the article has a constant result for March, it is either always using 28 or always using 29 days in February.
For April, the preceding month is March, which neither begins nor ends in a vowel so I do not subtract it from 10. 31 days in March gives 3+31 = 34 mod 7 = 6, which does match the article result.
For May, the preceding month is April, which starts with a vowel, so I subtract its position from 10, 10-4 = 6, add April's 30 days 6+30 = 36 mod 7 = 1 which does match the article.
For June, the preceding month is May, ending in a vowel, so I subtract May's 5 from 10, and adding May's 31 days gives 5+31= 36 mod 7 = 1 which does not match the article.
This should suffice to illustrate my misunderstanding; what have I got wrong?
[edit: typos]
1. Every month's item number can be calculated from the preceding month's item number by the method given. I.e. add the number of days in the preceding month to the preceding month's item number then take mod 7.
2. For January we take it that there is no preceding month. Therefore the numbers in such a calculation are all zero, so we end up with zero.
3. For later months you don't need to start at January and go month by month to the month you want; you can start at a month with a start- or end-vowel and use the shortcut that such a month's item number is ten minus the month number.
4. For the purposes of 3, 'y' does not count as a vowel.
Or maybe it's easier just to learn them!
February, March -- The item ... for February or March (the 3rd month), ‘3’ = 3
December -- The item ... for December (the 12th month), ’12.’
So these all use fixed values.
The `(10-place)+days mod 7` logic works for May, July, September, and November using the previous month's values -- effectively every other month. The vowel trick is likely a nmemonic for not having to remember which months to do this for.
The other months are the previous month's `item+days mod 7`, although it is unclear where this interpretation is deduced. -- The "If it begins or ends with a vowel, subtract the number, denoting its place in the year, from 10." text does not apply, so I would have assumed that is was 0 not the calculated item value. Thus, I would have expected it to just use the days in month.
Very clever, and obvious once you know.
[0] https://www.ted.com/talks/arthur_benjamin_a_performance_of_m... ... starts at 7:47
The Century-Item:
The year is 2024. The century is 20.
20/4 = 5, with no remainder. Overplus is 0. 3-0 = 3. 3x2 = 6.
The Year-Item:
The year part is 24. Number of dozens: 2
24/12=2. Overplus: 24 mod 12 = 0. Number of 4's in the overplus: 0. 2+0+0 = 2.
The Month-Item: May: 1 (from the text).
The Day-Item: The day is 24.
Adding all items:
6+2+1+24=33. 33 mod 7 = 5, which is Friday.
This was the part I as hoping you'd write out :) I can't make heads or tails of the explanation.
I'd go as far as saying that in mathematics little other than notation matters and the same is true in computer science.
This is why lisp like languages are the obvious choice when variables are explicit.
Here's how that move would have been written at various times from the 17th century to the present [1].
Early 1600s: The white king commands his owne knight into the third house before his owne bishop.
Mid-1700s: K. knight to His Bishop's 3d.
Early 1800s: K.Kt. to B.third sq.
Around 1850: K.Kt to B's 3rd.
Around 1860: K.Kt to B. 3d.
Around 1870: K.Kt to B3.
Around 1890: KKt-B3.
Early 1900s: Kt-KB3.
Mid 1900s: N-KB3.
Last quarter of 1900s to present: Nf3 or if you want to avoid language-specific piece names ♘f3.
[1] https://www.knightschessclub.org/the_history_of_notation.htm...
He didn't consider himself a "rapid computer".
# Enter a date (yyyy-mm-dd): 2024-05-24
# The day of the week for 2024-05-24 is Friday.
def compute_day_of_week(date):
day, month, year = date
century = year // 100
year_part = year % 100
# Compute Century-Item
if year < 1752 or (year == 1752 and (month < 9 or (month == 9 and day < 14))):
century_item = (18 - century) % 7
else:
century_item = ((3 - (century % 4)) * 2) % 7
# Compute Year-Item
year_item = (year_part + (year_part // 4)) % 7
# Compute Month-Item
month_items = [0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5]
month_item = month_items[month - 1]
# Compute Day-Item
day_item = day % 7
# Total
total = (century_item + year_item + month_item + day_item) % 7
# Correction for Leap Year
if month <= 2 and (year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)):
total = (total - 1 + 7) % 7
return total
def day_of_week_string(day_index): days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
return days[day_index]
# Prompt for the datedate_input = input("Enter a date (yyyy-mm-dd): ")
year, month, day = map(int, date_input.split('-'))
date = (day, month, year)
# Compute and print the day of the week
day_index = compute_day_of_week(date) day_name = day_of_week_string(day_index) print(f"The day of the week for {date_input} is {day_name}.")
These skipped days were a rolling problem across the world, when they were applied varied by country and religion of the recorder of historic accounts - they were by no means uniformly applied in the same year across the planet.
Lagniappe: https://en.wikipedia.org/wiki/List_of_adoption_dates_of_the_...
* shout out to Kiribati (UTC+14)! I'd like to think the bronze age danes rocked their string skirts in much the same way the Kiribati do their "grass" [pandanus] ones. https://www.youtube.com/watch?v=ZUhs1TdHMt0
We really should just declared the year to be 360 days long, with 12 months, 30 days each, split into 6 day long weeks. The extra 5 days? Everybody take a vacation. Leap days go in there too somehow. Every month starts with a Monday and ends with a Sunday. Wednesday will be removed because it was no good anyway.
Let Y = 10 T + U, i.e., T is the first digit of the two digit year and U is the second digit.
If T is even, the year part is:
2 T + U if U = 0, 1, 2, or 3
2 T + U + 1 if U = 4, 5, 6, or 7
2 T + U + 2 if U = 8 or 9
If T is odd: 3 + 2 T + U if U = 0 or 1
3 + 2 T + U + 1 if U = 2, 3, 4, or 5
3 + 2 T + U + 2 if U = 6, 7, 8 or 9
Algorithmically I compute it something like this: Compute 2 T + U
If T is even
Add 1 if T >= 4 and add another 1 if T >= 8
else
Add 3
Add 1 if T >= 2 and add another 1 if T >= 6
Those add 1s come from the way leap years are distributed within decades. The 2 T + U takes into account any leap years when U = 0. The add 1s are to take care of the leap years that happen when U != 0. In even decades those occur at 4 and 8, and in odd decades they occur at 2 and 6.Example: for 2024, T=2 and U=4. Mentally my train of thought would be:
2 doubles to 4, plus 4 = 8 = 1 mod 7, even decade so add 1 for 4 <= T < 8 giving 2.
For that example there is not really easier than Conway's Y + Y//4, which would be 24 + 6 = 30 = 2 mod 7.Example: for 2099, T = 9 and U = 9. Mentally that goes something like this:
9 = 2 mod 7 doubles to 4, add 9 = 2 mod 7 giving 6
T was odd so add 3 giving 9 = 2 mod 7
T was odd so the so there were leap years at 2 and 6, which each add 1
That gives us 4
I find that easier that Conway's 99 + 99/4. I can do that, and at decent speed, but I can make mistakes.With my method you never have to deal with a number above 32, and that's only if you do no reductions mod 7 along the way. If you reduce mod 7 whenever you can you never have to deal with anything above 12.
Note: when reducing mod 7 along the way it is crucial to remember that whether you take the T is even case or the T is odd case depends on the actual value of T. E.g., when I am doing 2099 I reduce both T and U to 2 right away but first note that 9 is odd so will need to take the odd case.
https://en.m.wikipedia.org/wiki/International_Fixed_Calendar