루이스 캐럴 – 특정 날짜의 요일 계산 기술 (1887)
(futilitycloset.com)- Lewis Carroll은 1887년 3월 31일 Nature에 보낸 편지에서 임의 날짜의 요일을 암산으로 구하는 절차를 제안함
- 날짜를 세기·연도·월·일 네 항목으로 쪼개 더하고, 계산 중간마다 7로 나눈 나머지만 남겨 복잡도를 낮춤
- Carroll은 자신도 평균 약 20초가 걸린다며, 빠른 계산가라면 15초 안에도 가능할 것으로 봄
- 규칙에는 Old Style과 New Style의 차이, 윤년 보정, 월별 항목값이 포함되며 최종값은 0=Sunday, 1=Monday 순서로 해석됨
- 예시 계산에서 1783년 9월 18일은 Thursday, 1676년 2월 23일은 윤년 보정 후 Wednesday가 됨
날짜를 네 항목으로 나누는 방식
- Lewis Carroll은 Nature에 보낸 1887년 3월 31일 편지에서 특정 날짜의 요일을 정신 계산으로 구하는 방법을 제시함
- 입력 날짜는 네 부분으로 나눔
- Century-Item: 연도의 앞 두 자리
- Year-Item: 세기 이후의 연도
- Month-Item: 월
- Day-Item: 그달의 날짜
- 각 항목을 계산해 누적 합계에 더하고, 항목이나 합계가 7을 넘으면 7로 나눈 나머지만 유지함
항목별 계산 규칙
-
Century-Item
- Old Style은 1752년 9월 2일에 끝난 것으로 두고, 세기값을 18에서 뺌
- New Style은 1752년 9월 14일에 시작한 것으로 두며, 세기값을 4로 나눈 나머지를 3에서 뺀 뒤 2를 곱함
- 예를 들어 1811년의 Century-Item에는 앞 두 자리인 18을 사용함
-
Year-Item
- 세기 이후 연도에서 12의 개수, 남은 값, 남은 값 안의 4의 개수를 더함
-
Month-Item
- 월 이름이 모음으로 시작하거나 끝나면, 그 월의 연중 순서를 10에서 뺌
- 여기에 그 월의 일수를 더하면 다음 달의 항목값이 됨
- 7로 나눈 뒤 사용할 월별 값은 다음과 같음
- January 0, February 3, March 3, April 6, May 1, June 4
- July 6, August 2, September 5, October 0, November 3, December 5
-
Day-Item
- 그달의 날짜 자체를 사용함
-
윤년 보정
- 날짜가 윤년의 January 또는 February이면 최종 합계에서 1을 뺌
- 합계가 0이면 먼저 7을 더한 뒤 1을 뺌
- 윤년은 4로 나누어지는 해이지만, New Style의 세기년은 세기 수가 4로 나누어지지 않으면 예외임
- 예시로 1800년은 New Style에서 이 예외에 해당함
- 최종 결과는 요일 번호로 해석하며, 0은 Sunday, 1은 Monday이고 이후 순서대로 대응됨
계산 예시와 출처
- 1783년 9월 18일의 계산 결과는 Thursday임
- 1676년 2월 23일은 윤년 보정을 거쳐 Wednesday가 됨
- 이 절차는 Edward Wakeling의 Rediscovered Lewis Carroll Puzzles, 1995를 통해 전해짐
댓글과 토론
Hacker News 의견들
-
이 방식은 내가 쓰는 방법과 매우 비슷하고, Art Benjamin도 대화해보니 비슷한 방법을 쓰고 있었음. 10~15초 안에 하기는 쉽지만 연습, 아주 적은 암기, 약간의 암산이 필요함
나는 감을 유지하려고도 자주 쓰고, 일단 익히면 의외로 쓸모가 많아서 계속 쓰게 됨. J. H. Conway는 다른 기법인 Doomsday rule을 썼고, 올해 날짜를 계산할 때는 그쪽으로 바꿨음. 더 빠르고 쉽지만 다른 해의 “Doomsday”를 구하는 건 더 어려워서, 그때는 원래 방법으로 돌아감
예를 들어 2024/05/24는 2012년 이후 12년, 윤년 3번, 5월의 마법 숫자 2, 날짜 24를 더해 mod 7을 취하면(12+3+2+24)=6, 즉 금요일이 됨. 각 달의 마법 숫자는144 / 025 / 036 / 146으로 외울 수 있고, 필요하면 원리에서 계산할 수도 있음144 : Jan, Feb, Mar는 Jan=1, Feb=4, Mar=4 같은 뜻으로 이해하면 됨- 이 설명은 바로 외울 수 있었음. 다만 2032년 2월 7일을 해보니
20+5+4+7 ≡ 1이라 일요일을 기대했지만 실제로는 토요일이었고, 2032년이 윤년이며 날짜가 2월 29일 이전이기 때문이었음
이런 경우, 즉 윤년의 2월 29일 이전 또는 그날까지는 1을 빼야 함 - 암기와 계산을 결합하면 유용함.
0, 1, -1, 0, 0, 1, 1, 2, 3, 3, 4, 4는 각 달 1일의 연중 날짜와, 앞선 달들이 모두 30일이었다고 가정했을 때의 연중 날짜 사이의 오프셋임
예를 들어 첫 11개월이 모두 30일이었다면 12월 25일은30×11+25=355일째이고, 여기에 12번째 오프셋 4를 더하면 실제 359일째가 됨. 이 오프셋 수열은 외우기 쉬우며, 외우고 나면 달별 마법 숫자는Magic(n)=2n+Offset(n)+c로 얻을 수 있음
1 4 4 0 2 5 0 3 6 1 4 6마법 숫자에서는c=-1이고, 12월은2×12+4-1 ≡ 6 (mod 7)이 됨. 반대로 외운 마법 숫자에서Magic(n)-2n-c를 계산해 오프셋도 복원할 수 있으며, 오프셋 범위가[-1,4]라는 점만 기억하면 됨 - Lewis Carroll 방식이 훨씬 단순하고 빠르게 느껴지는데, 이 방법이 그보다 어떤 장점이 있는지 잘 모르겠고 복잡도가 꽤 늘어난 듯함
-
글을 읽다가 Old Style/New Style 날짜 차이와 1752년에 벌어진 일을 찾아보게 됨. Calendar (New Style) Act 1750에 따르면 18세기까지 영국의 법률상 한 해는 수세기 동안 3월 25일, 즉 Lady Day에 시작했음
그래서 예를 들어 1707년 3월 24일 바로 다음 날은 1708년 3월 25일이었고, 1708년 12월 31일 다음 날은 여전히 1708년 1월 1일이었으며, 1709년은 거의 석 달 뒤였음. 바뀌어서 정말 다행임- 영국의 세금 연도가 아직도 4월 6일에 시작하는 이유도 거의 300년 전 율리우스력에서 그레고리력으로 넘어간 일과 관련 있음: https://theconversation.com/why-the-uk-tax-year-begins-on-april-6-its-a-very-strange-tale-57247
다른 나라에도 이렇게 옛날의 유산 패치가 많이 남아 있는지 궁금함 - Carroll 방식의 위키 페이지도 Lewis Carroll's method에서 1676년 2월 23일 예시를 두고, 1752년 이전 잉글랜드 날짜는 3월 25일을 새해 첫날로 하는 Old Style로 표기됐다고 설명함
하지만 Carroll 방식은 1월 1일을 새해 첫날로 가정해서 정답인 “Friday”에 도달하지 못함. 흥미롭게도 Carroll 방식을 재출판한 사람들이 이 오류를 짚지 않았고, 링크된 글도 같은 결함이 있음 - Linux의
cal유틸리티는 1752년 9월을 인식하는 특수 처리를 갖고 있음: https://github.com/util-linux/util-linux/blob/9f15d2de8117732845b2e891a2d24d987ee4e3ed/misc-utils/cal.c#L1079 cal 1752를 실행해보니 9월 달력에서 수요일 2일과 목요일 14일 사이 날짜가 빠져 있음
논쟁은 있지만, 그레고리력 전환이 만우절의 기원이라는 설명도 있음: https://en.wikipedia.org/wiki/April_Fools%27_Day, https://en.wikipedia.org/wiki/Gregorian_calendar- 로마도 3월 기준 연도를 썼음. 그래서 2월의 날수가 적고, October가 문자 그대로는 여덟 번째 달임
- 영국의 세금 연도가 아직도 4월 6일에 시작하는 이유도 거의 300년 전 율리우스력에서 그레고리력으로 넘어간 일과 관련 있음: https://theconversation.com/why-the-uk-tax-year-begins-on-april-6-its-a-very-strange-tale-57247
-
글의 월 항목 계산법을 따라가기가 어렵다. 글은 모음으로 시작하거나 끝나는 달이면 그 달의 연중 순서를 10에서 빼고, 여기에 그 달의 일수를 더하면 다음 달의 항목이 된다고 설명함
그런데 1월의 앞 달인 12월은 모음으로 시작하거나 끝나지 않으니 10에서 빼지 않고12+31 ≡ 1이 되어야 하는데 글은 0이라고 함. 2월도 January가 모음으로 끝나므로10-1+31 ≡ 4가 되지만 글은 3이고, 3월도 February 기준으로 계산하면 맞지 않음
4월과 5월은 맞지만 6월은 다시 맞지 않아서, 내가 무엇을 잘못 이해했는지 모르겠음- January는 고정값 0, February와 March는 고정값 3, December도 글에서 직접 주는 고정값으로 보는 듯함
(10-순서)+일수 mod 7논리는 앞 달 기준으로 May, July, September, November 같은 격월에만 맞고, 모음 규칙은 어느 달에 이 계산을 적용할지 기억하기 위한 기억법에 가까워 보임. 나머지 달은 앞 달의item+days mod 7을 쓰는 듯하지만, 그 해석이 글 어디서 도출되는지는 불분명함 - 나도 이 부분에서 막혔고, 가장 그럴듯한 이해는 이렇다. 모든 달의 항목 번호는 앞 달의 항목 번호에 앞 달의 일수를 더한 뒤 mod 7을 취해 계산할 수 있음
1월은 앞 달이 없으니 모두 0으로 보고 결과도 0으로 둠. 원하는 달까지 1월부터 매번 계산할 필요는 없고, 시작이나 끝이 모음인 달은 그 달의 항목 번호가10-월 번호라는 지름길을 쓸 수 있음. 이때y는 모음으로 치지 않음. 아니면 그냥 외우는 편이 더 쉬울 수도 있음 - 나도 같은 문제를 겪었고, 공식의 여러 재해석을 시도해봤지만 아무것도 도움이 되지 않았음
- January는 고정값 0, February와 March는 고정값 3, December도 글에서 직접 주는 고정값으로 보는 듯함
-
Carroll의 알고리즘은 시간이 지나며 발전했음. First Sunday Doomsday Algorithm(https://firstsundaydoomsday.blogspot.com/2009/12/quick-start-guide.html)은 2023년까지 공개된 개선을 포함하고, 연도 코드를 계산하는 Fong & Walters의 “odd+11” 규칙도 들어 있음: https://arxiv.org/abs/1010.0765
-
이걸 더 직관적으로 계산하는 방법이라고 생각해서 정리해둔 글이 있음: https://gcanyon.wordpress.com/2013/04/09/a-better-way-to-calculate-the-day-of-the-week/
-
Art Benjamin이 TED 강연에서 이걸 하는 장면이 정말 흥미로움. 자세히 보면 손동작으로 중간 계산을 추적하는 게 보임
알고 나면 당연해 보이지만 매우 영리함. https://www.ted.com/talks/arthur_benjamin_a_performance_of_mathemagic에서 7:47부터 시작함 -
Lewis Carroll 방식으로 오늘, 즉 2024년 5월 24일을 계산하면 이렇다. 세기 항목은 20세기라서
20/4=5, 나머지 0,3-0=3,3×2=6임
연도 항목은24/12=2, 나머지 0, 그 안의 4의 개수 0이므로2+0+0=2. 월 항목은 글에서 May=1이고, 일 항목은 24. 모두 더하면6+2+1+24=33,33 mod 7 = 5라서 금요일이 됨- 월 항목에서 May=1이 되는 부분을 풀어 써주길 기대했음. 설명을 봐도 도무지 이해가 안 됨
-
표기법이 중요하지 않다고 하는 사람들에게, 더 나은 새 표기법을 얻기 전의 수학이 전부 이런 모습이었다고 말하고 싶음
수학에서는 표기법 말고 중요한 게 거의 없다고까지 말할 수 있고, 컴퓨터 과학도 마찬가지임. 변수가 명시적일 때 Lisp 계열 언어가 명백한 선택지인 이유도 여기에 있음- 체스도 그랬음. 백이 첫 수로 백 킹에 가장 가까운 나이트를 출발점 기준 앞으로 두 칸, 왼쪽 한 칸의 칸으로 옮기는 수를 생각해보면, 17세기부터 현재까지 그 수의 표기가 계속 짧아졌음
1600년대 초에는 “The white king commands his owne knight into the third house before his owne bishop.”였고, 1700년대 중반에는K. knight to His Bishop's 3d., 1800년대 초에는K.Kt. to B.third sq., 1890년 무렵에는KKt-B3, 1900년대 중반에는N-KB3, 지금은Nf3또는 언어별 말 이름을 피하려면♘f3가 됨: https://www.knightschessclub.org/the_history_of_notation.html
- 체스도 그랬음. 백이 첫 수로 백 킹에 가장 가까운 나이트를 출발점 기준 앞으로 두 칸, 왼쪽 한 칸의 칸으로 옮기는 수를 생각해보면, 17세기부터 현재까지 그 수의 표기가 계속 짧아졌음
-
20초 안에 했다면 대단하다고 부를 만함. 본인은 스스로를 빠른 계산가로 여기지 않았음
- 그가 기준으로 삼은 대상은 Oxbridge에서 수학을 가르치던 다른 교수들이었을 것임
-
Python으로 요일 계산 스크립트를 짜서
2024-05-24를 넣으면 Friday가 나옴. 세기 항목, 연도 항목, 월 항목 배열, 일 항목을 더하고, 1~2월 윤년 보정을 적용하는 방식임
1752년 9월 14일 이전은 별도 세기 항목을 쓰도록 처리했음- 1752년을 포함하는 건 까다로움. 대영제국에서는 그레고리력을 도입하면서 9월 3~13일을 건너뛰어, 그해가 355일뿐인 유일한 해였음
이렇게 사라진 날짜들은 전 세계적으로 일괄 적용되지 않았고, 나라와 기록자의 종교에 따라 적용 시점이 달랐기 때문에 역사 기록에서는 계속 골칫거리가 됨
- 1752년을 포함하는 건 까다로움. 대영제국에서는 그레고리력을 도입하면서 9월 3~13일을 건너뛰어, 그해가 355일뿐인 유일한 해였음