1P by GN⁺ | ★ favorite | 댓글 1개
  • 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년은 거의 석 달 뒤였음. 바뀌어서 정말 다행임

  • 글의 월 항목 계산법을 따라가기가 어렵다. 글은 모음으로 시작하거나 끝나는 달이면 그 달의 연중 순서를 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는 모음으로 치지 않음. 아니면 그냥 외우는 편이 더 쉬울 수도 있음
    • 나도 같은 문제를 겪었고, 공식의 여러 재해석을 시도해봤지만 아무것도 도움이 되지 않았음
  • 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
  • 20초 안에 했다면 대단하다고 부를 만함. 본인은 스스로를 빠른 계산가로 여기지 않았음

    • 그가 기준으로 삼은 대상은 Oxbridge에서 수학을 가르치던 다른 교수들이었을 것임
  • Python으로 요일 계산 스크립트를 짜서 2024-05-24를 넣으면 Friday가 나옴. 세기 항목, 연도 항목, 월 항목 배열, 일 항목을 더하고, 1~2월 윤년 보정을 적용하는 방식임
    1752년 9월 14일 이전은 별도 세기 항목을 쓰도록 처리했음

    • 1752년을 포함하는 건 까다로움. 대영제국에서는 그레고리력을 도입하면서 9월 3~13일을 건너뛰어, 그해가 355일뿐인 유일한 해였음
      이렇게 사라진 날짜들은 전 세계적으로 일괄 적용되지 않았고, 나라와 기록자의 종교에 따라 적용 시점이 달랐기 때문에 역사 기록에서는 계속 골칫거리가 됨