同余
日期的星期数
闰年?
被4整除,世纪数被4整除。闰年366天,2月29天。
y年m月d日,星期数?
用C 代表世纪数,0~6代表星期几。
为计算方便从3月1日开始计算,相当于把3月看成1月。现在y年m月d日变为Y年M月D日,有如下关系:
M=(m−3)mod12+1
Y=y−⌊m/11⌋
由于365≡1(mod7),3月1日的星期数每过一个平年+1,每过一个闰年+2,设1600年3月1日的星期数为w1600,y年3月1日(Y年3月1日)的星期数为wY,设y=Y=100C+X,从1600年到 Y 年要经过100C+X-1600年,星期数应加:
100C+X−1600≡2C+X−3(mod7)
每4年有一个闰年,有
⌊(100C+X−1600)/4⌋=25C+⌊X/4⌋−400
个闰年,考虑到世纪年,应从这个数中减去C-16,再加⌊(C−16)/4⌋=⌊C/4⌋−4。因此:
wY≡w1600+(2C+X+3)+(25C+⌊X/4⌋−400)−(C−16)+(⌊C/4⌋−4)
≡w1600−2C+X+⌊X/4⌋+⌊C/4⌋(mod7)
已知2004年3月1日是星期一,代入上式,
1≡w1600−2×30+4+⌊4/4⌋+⌊20/4⌋≡w1600+5(mod7)
得w1600=3,于是,得到
wY≡3−2C+X+⌊X/4⌋+⌊C/4⌋(mod7)
接下来计算从当年3月1日到每个月1号的天数,除每个月+30天外,3、5、7、8、10、12、1月有31天,应另外加的天数 z 如下表所示:
M | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
z | 0 | 1 | 1 | 2 | 2 | 3 | 4 | 4 | 5 | 5 | 6 | 7 |
z 可表示成
z=\left{ \begin{array}{lcl} \lfloor M/2\rfloor & & {1 \leqslant M \leqslant 6}\ \lfloor (M+1)/2\rfloor & & {7 \leqslant M \leqslant 11}\ \lfloor (M+1)/2\rfloor +1 & & {M=12}\ \end{array} \right.
=⌊(M+⌊M/7⌋)/2⌋+⌊M/12⌋
因此,M月d日应在 wY 上加
30(M−1)+⌊(M+⌊M/7⌋)/2⌋+⌊M/12⌋+d−1
=2M+⌊(M+⌊M/7⌋)/2⌋+⌊M/12⌋+d−3(mod7)
最后将 (1)(2)两式合并,得到y年m月d日的星期数计算公式如下:
w≡X+⌊X/4⌋+⌊C/4⌋−2C+2M+⌊(M+⌊M/7⌋)/2⌋+⌊M/12⌋+d(mod7)
其中 M=(m−3)mod12+1,Y=y−⌊M/11⌋=100C+X
例如,中华人民共和国成立月1949年10月1日,C=19,X=49,M=8,d=1
w≡49+⌊49/4⌋+⌊19/4⌋−2×19+2×8+⌊(8+⌊8/7⌋)/2⌋+⌊8/12⌋+1≡6(mod7)
参考资料
- 《离散数学》