中华农历论坛知识讨论区历法知识 → [原创]已知公历日期快速计算星期


  共有17485人关注过本帖树形打印

主题:[原创]已知公历日期快速计算星期

帅哥哟,离线,有人找我吗?
tgs28
  1楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:5 积分:279 威望:0 精华:0 注册:2006/9/27 2:14:00
[原创]已知公历日期快速计算星期  发帖心情 Post By:2006/9/27 4:28:00

已知公历日期快速计算星期

作者:谭笑风

    从历书中可以查到2002年1月1日是星期二,所以要知道2002年1月几日是星期几,只需把这个日期数加1后除以7,所得余数是几,那么这个日期就是星期几,余数为0即为星期日,以下同。如1月25日,因为(25+1)÷7=3…5,所以1月25日应是星期五。
  2002年2月1日是星期五,所以要知道2002年1月几日是星期几,只需把这个日期数加4后除以7,所得余数是几,那么这个日期就是星期几。如2月25日,因为(25+4)÷7=4…1,所以2月25日应是星期一。
  以此类推,把1至12月份的日期分别顺次加上以下12个数,由每月1号的星期数减1得到:
1,4,4,0,2,5,0,3,6,1,4,6,再除以7,所得余数是几,则这个日子就是星期几了。
如2002年10月1日,按序应加1,得2,所以该日是星期二。又如2002年12月31日,按序应加6,31+6=37,37÷7=5…2所该日是星期二。
    这样只要记住这12个数(在此我把它称之为月余数),就可以推算2002年任意一天的星期数:
1,4,4。0,2,5。0,3,6。1,4,6。(记忆口诀:3个一段,144,025,036,146,分别是12,5,6的平方数,以及12的平方加2)
   
    接着下去,2003年1月1日是星期三,所以推算2003年任意一天的星期数,只要在2002年的基础上再加1就可以了,在此我把所加的数1称之为年余数,如2003年12月31日,年余数+月余数+日期=1+6+31=38=7*5+3,所以该日是星期三。
    再接着下去,2004年情况稍有不同,2004年是闰年,2月是29天,所以年余数如果在2003年的基础上加1,即规定为2,则3-12月份的月余数都要加上1,为了计算方便,我如果把年余数规定为3,这样3-12月份月余数都不改变,只有闰年1月份和2月份的月余数比原来少1,分别是0,3。如推算2004年1月22日星期几,年余数+月余数+日期=3+0+22=25=7*3+4,所以该日是星期四;再如推算2004年12月31日星期几,年余数+月余数+日期=3+6+31=40=7*5+5,所以2004年12月31日星期五。
    如果是平年,这一年的年余数为前一年的年余数加1,如果是闰年,这一年的年余数为前一年的年余数加1后再加1。在这里引进一个函数:y=[x],人称之为高斯函数,[x]表示不超过数x的最大整数,x大于0时,[x]即表示数x的整数部分。因为一般是4年一闰,所以年余数在平常的基础上每4年多1,利用高斯函数,把年份末两位数除以4后取整数,正好是每4年多1,根据这个可以解析21世纪(即2000年-2099年)的年余数的一般表达式:
设21世纪某年年份末两位数是b,则年余数f(b)的表达式为
f(b)=b+[b/4]-2=[5b/4]-2,[x]表示不超过数x的最大整数。
比如2006年的年余数=6+[6/4]-2=6+1-2=5,2006年12月31日的年余数+月余数+日期=5+6+31=42=7*6+0,所以该日是星期日。
   
    设年份数为y,4年一闰的表达式为+[y/4],
根据这个规律,容易推出100年不闰的表达式为-[y/100],400年又闰的表达式为+[y/400]。
所以年余数f(y)的表达式为
f(y)=[y/4]-[y/100]+[y/400]+y+ε,(ε为校正常数,跟历书对照可算得其值)
设b为年份的末两位数,a为年份去掉末两位数后剩下的数(多数情况下为年份前两位数),
即y=100a+b,代入上式得
f(y)=[25a+b/4]-[a+b/100]+[y/4+b/400]+100a+b+ε,
f(y)=125a+[b/4]-a-[b/100]+[a/4+b/400]+b+ε,
b为年份的末两位数,所以0≤b<100,所以[b/100]=0,b/400<1/4,
用讨论的方法(设a=4k+0,1,2,3)可以证明[a/4+b/400]=[a/4],所以
f(y)=124a+[b/4]+[a/4]+b+ε,因为所得的余数最后还要被7除求余数,所以可用7作模(除数),于是
f(y)=124a+[b/4]+[a/4]+b+ε,
≡5a+[a/4]+b+[b/4]-2 (mod7),

≡-2a+[a/4]+b+[b/4]-2 (mod7),
其中,经跟历书对照算得ε=-2,≡是数论中表示同余的符号,mod7的意思是指在用7作模数(也就是除数)
为了计算方便进一步化简,定义一个求余数函数f(x)=xmodt,表示x除以t后所得的余数(即mod表示余数运算),例如37mod7=2,因为37÷7=5…2。
(由于f(x)=(x+t)modt=xmodt+tmodt=xmodt,所以这个函数具有周期性,周期为t。)
因为被除数x=除数t*商+余数,(这里的商即x/t的整数部分[x/t],)
所以x=t*[x/t]+xmodt,由此还有[x/t]=(x-xmodt)/t,
考虑到-2(a+4)+[(a+4)/4]≡-2a-8+[a/4]+1≡-2a+[a/4] (mod7),周期为4,于是猜想到
 -2a+[a/4]≡-2*amod4 (mod7)
证明:-2a+[a/4]≡-2*(4*[a/4]+amod4)+[a/4] (mod7)
≡-8*[a/4]-2*amod4+[a/4] (mod7)
≡-7*[a/4]-2*amod4 (mod7)
≡-2*amod4 (mod7)
所以f(y)≡-2(amod4+1)+b+[b/4] (mod7)

综上所述可以得到以下结论:
引进高斯函数:y=[x],[x]表示不超过数x的最大整数,
定义求余数函数:f(x)=xmodt,表示x除以t后所得的余数(即mod表示余数运算),
这两个函数之间的关系为[x/t]=(x-xmodt)/t。
设公元y年m月d日(y≥1583,1≤m≤12)年份的末两位数为b(b=y-[y/100]),
年份去掉末两位数后剩下的数为a(a=[y/100]),即有y=100a+b。
定义函数f(m),仅当ymod4=0(即y=4*[y/4])且ymod100≠0(即y≠100*[y/100])或
ymod400=0(即y=400*[y/400]),且m=1或2时,f(1)=0,f(2)=3;
否则f(1)到f(12)的值分别为1,4,4。0,2,5。0,3,6。1,4,6。
(可以给出f(m)的解析式,
f(m)≡2m+[m/2]+[m/9]-3+([2/m]-[1/m])*(1-[[y/4]-y/4]+[[y/100]-y/100]-[[y/400]-y/400]) (mod7),
特别当3≤m≤12时,f(m)≡2m+[m/2]+[m/9]-3≡[5m/2]+[m/9]-3 (mod7),
根据解析式计算f(m)有些麻烦,不如直接记住f(m)的值来得方便)
则星期数f(y,m,d)
≡[5y/4]-[y/100]+[y/400]+2+[5m/2]+[m/9]+([2/m]-[1/m])*(1-[[y/4]-y/4]+[[y/100]-y/100]-[[y/400]-y/400])+d (mod7)
≡-2(amod4+1)+b+[b/4]+f(m)+d (mod7)
≡5-2*amod4+[5b/4]+f(m)+d (mod7)。(结果等于0时为星期日)
注:因为从公元1582年10月15日(星期五)才开始使用现行公历(格里高利历法),
所以可详细定义y≥1582且y+m/10≥1583且y+m+d/15≥1593;
而对于儒略历y年m月d日,有8≤y≤1582且y+m/10≤1583且y+m+d/4≤1593,
此时f(m)≡2m+[m/2]+[m/9]-3+([2/m]-[1/m])*(1-[[y/4]-y/4]) (mod7),
此时星期数f(y,m,d)≡[y/4]+y+f(m)+d+ε (mod7)(ε为校正常数,查历书算得ε=3)
≡[5y/4]+[5m/2]+[m/9]+([2/m]-[1/m])*(1-[[y/4]-y/4])+d (mod7)
≡-a+[b/4]+b+f(m)+d+3 (mod7).

把以上结论说得通俗一点就是:
计算公元1583年及其以后某年的某月某日是星期几,先把年份前两位数a除以4求余数,把余数乘以-2后,加上5,所得的和称之为“世纪余数”;再把年份末两位数b除以4求其商的整数部分,然后加上年份末两位数b,所得的和除以7之后所得余数称之为“年届余数”;再把每个月对应的一个数字,这个数字称之为“月余数”,除闰年1月份和2月份所对应的数字分别是0和3之外,平时1至12月份所对应的数字分别是1,4,4。0,2,5。0,3,6。1,4,6;最后把所求这一日的“日期数”加上月份对应的“月余数”再加上“世纪余数”和“年届余数”,求得这四个数字的和,再除以7,所得余数是几,这一天便是星期几,余数为0时则是星期日。

举个例子,计算1949年10月1日星期几,年份前两位数19除以4余数为3,余数3乘以-2加5得“世纪余数”为-1;年份末两位数49除以4的商的整数部分是12,加上49(实际是7的倍数不必加),12除以7余5,得“年届余数”为5;10月对应的“月余数”为1;
“日期数”+“月余数”+“世纪余数”+“年届余数”=1+1-1+5=6,除以7之后所得余数为6,所以1949年10月1日是星期六。
熟练掌握这种方法后,每个人都可以“袖里吞金”,用不上10秒钟就能算出来某一天是星期几。
用类似的推导方法还可以推导出日干日支,廿八宿的计算公式,推导起来稍微麻烦,在此不赘述,以后我将介绍一种更为根本更为简便的方法来推导出它们的计算公式。


支持(0中立(0反对(1单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

[原创]已知公历日期快速计算星期








签名