(define (month d) (quotient (+ (* 12 d) 373) 367))
の係数についてである.
前回のブログでは, 各月mの最初の日dを決める式を, 閏月を平均的に挿入し,
d=floor((7*(m+10))/12-6)+30*(m-1)
=floor((7m+70-72)/12)+(360m-360)/12
=floor((367m-362)/12)
のようにして求めた. これを使うと
m = 1 2 3 4 5 6 7 8 9 10 11 12
d = 0 31 61 92 122 153 183 214 245 275 306 336
が得られ, gregorianからfixへの変換に使えた. 今回は逆に与えられたdからmを計算したい. 前回の最後の表
d = 0-30 31-60 61-91 92-121 122-152 153-182 183-213 214-244
m = 1 2 3 4 5 6 7 8
d = 245-274 275-305 306-335 336-366
m = 9 10 11 12
を見ると,
0 ≤ d < 31ならm=1,
31 ≤ d < 61ならm=2,
...
としたい. mからdを決める式を代入すると,
floor((367*1-362)/12) ≤ d < floor((367*2-362)/12) ならm=1,
floor((367*2-362)/12) ≤ d < floor((367*3-362)/12) ならm=2,
...
なので,
floor((367m-362)/12) ≤ d < floor((367*(m+1)-362)/12)
の関係が分かる.
等号を右に移動して ≤d< から <d<≤ の形にするには, 両端の式から1を引くか中央の式に1を足す. また下の図で考えると
floor(f(m)) ≤ d < floor(f(m+1))はdのような, 下が閉区間, 上が開区間の範囲である. 従って, d+1は f(m) < d+1 ≤ f(m+1) となり, floorがいらなくなる.
(367m-362)/12 < d+1 ≤ (367*(m+1)-362)/12
367m-362 < (d+1)*12 ≤ 367*(m+1)-362
367m < (d+1)*12+362 ≤ 367*(m+1)
(m+1)=ceiling((12*(d+1)+362)/367)
m=ceiling((12*(d+1)+362)/367)-1
(12*(d+1)+362)/367-1
=(12*d+12+362-367)/367
=(12*d+7)/367
ceilingをfloorにしたいから, 分子に366を足すと
m=floor((12*d+7+366)/367)
=floor((12*d+373)/367)
で前回の式になった.
0 件のコメント:
コメントを投稿