PC天文教材【1】  暦計算のはなし  【2】
作花一志 「天文教育」 5月号 2005   

1. 暦雑識
 あなたは自分の生まれた日が何曜日か知っていますか? 曜日は7日で繰り返すのだから計算で求まるはずですね。でも1ケ月は31日,30日,28日と不定だし,また閏年では1年は366日となり,計算はかなり複雑のようです。1900年1月1日を第1日として yy 年 mm 月 dd 日までの通日 T は
  T=[365.25*yy]−[yy/100]+[yy/400] +[30.59*(mm−2)]+dd−693931     (1)
で与えられます。ただし[ ]は切り捨て整数化の記号で,また1月と2月は前年の13月,14月とします。そして T を7で割った余りが 0なら日曜日,1なら月曜日,...,6なら土曜日となります。
 では干支はどうでしょうか?十二支はわかっていても,十干はあまりなじみがありません。十二支は年を12で割った余りで,また十干は10で割った余りで決まります。2005は10で割って余り5だから十干では乙(きのと),また12で割って1余るから十二支では酉,すなわち今年は乙酉の年です。歴史的に有名な事件には,干支がつけられているものが少なくありませんね。壬申の乱は672年に,辛亥革命は1911年に起こりました。
 太陽黄経が15の倍数になる日には季節感溢れる名前がついていて,「二十四節気」として親しまれています。もっとも最近は温暖化のせいで合わなくなったものもあります。そのうち黄経が30の倍数になるものは中,そうでないものは節といわれます。これらの日々は毎年±2日の範囲で変わります。毎年の二十四節気は筆者のウェブサイトから求まります。

2. 暦計算
 では実際パソコンで計算してみましょう。 Excelで曜日を求めるにはweekday関数とtext関数で簡単にできますが,次の2点を注意する必要があります。
@有効なのは1900年3月1日以降である。1899年までは全く無効で、1900年の1月と2月は曜日が1つずれている。
Aweekday関数で求めた曜日番号は1から7までで,1・・・日,2・・・月,と7・・・土と定義されている。
19世紀さらに紀元前の曜日や干支を求めるには割算の余りを計算する必要があります。 aをbで割ったときの余りrを求める演算子・関数はいろいろ用意されています。

  Excel  r=mod(a,b)
  VB    r=a mod b   
    Java     r=a%b 
    C        r=a%b
ところが a<0 の場合にはExcel以外は余りが負の数となってしまいます。余りを 0 以上の数で表すには
   r = a−[a/b] * b
とします。[x] は x>0 の場合には切り捨てを表しますが、x<0も含めると一般にxを越えない最大整数です。CやJavaの場合には実数より整数へのキャスティングが必要になります。ともあれこれで年,月,日を入力し干支を求め,また(1)よりTを計算して曜日を求めることができました。
 次に二十四節気の場合は太陽黄経を表す式が必要です。太陽は365.2422日で天球上を360度移動しますから1日については平均0.985647332度,したがって春分からt日後の太陽黄経は
   λ=0.985647332 t
となりそうですが,二十四節気を算出するにはこの式では不十分です。地球は等速円運動をしているわけではないので,λの時間変化はもっと複雑です。海上保安庁発行の『天体位置表』にtの3次とsin,cosを含む式が載っており,tを求めるためにはこの非線形方程式を解かねばなりません。高次方程式,非線形方程式の解法にはニュートン法がよく使われますが,ここでは,微分係数の知識なしで解を求めます。6月20日、21日、22日のλを計算し90度を越すかどうかを調べる。すなわち21日JST 0時では λ<90で、22日JST 0時では λ>90 ならば21日に夏至点通過が起こったはずですから,夏至は21日であることがわかります。このようにして24個の太陽黄経に対する日付を求めることができます。また,二十四節気の他に,年間4回の「土用」があります。春の土曜はλが27になる日から立夏(λ=45)の前日まで,夏の土曜は λが117になる日から立秋(λ=135)の前日まで・・・以下λを90づつ加えていけば土用の期間が求まります。さて今年うなぎを食べた日は何月何日でしょうか?
 以上のうち曜日と干支の算出は筆者が京都コンピュータ学院のプログラム演習の教材として使ったものです。なお,ユリウス暦時代,紀元前までの曜日と干支を求めるには ここをご覧ください。