2026年3月27日金曜日

干支の計算

「今年はうま年だ」のように, なに年かが気になるのは, 現代人では正月 の頃だけであろう. また「初午」, 「土用の丑の日」, 「三の酉」のよう に日付けにも十二支が対応していることも常識であろう. 十二支は曜日の ように, 正確に順番に対応して来たので, 利用できる場面が多い.

歴史上の事件ではその年の干支を付けて, 「壬申の乱」とか「辛亥革命」 とか, 干支で識別されることがある.

しかし最近は「今年の干支はひのえうま」や, 「庚申(こうしん)の日」と か十干の方まで気にする人は絶滅危惧種かも知れない.

絶滅寸前かも知れないが, 私は時々「この前の甲子(きのえね)は何年だった か」のように, 年の干支が知りたくなることがある. また青木信仰「時と 暦」によると, 日本書紀には漏刻(水を使った時計)の使用開始が671年の「夏 四月丁卯朔辛卯」と書いてあるそうで, これも日付けにしてみたい.

干支は表Aの十干(天干ともいう)と, 表Bの十二支(地支ともいう)を順に組 み合わせたものである. 10と12は互いに素ではなく, 最大公約数が2, 最 小公倍数が60なので, 組合せは表Cの様に60個になる.

十干の方は「こう, おつ, へい, てい」位までは音読みで知っている人は いるであろう. 十二支は訓で読むと「ね, うし, とら, ..., いぬ, い」で, 大 体の人は知っているに違いない.

百人一首には喜撰法師の「わが庵は都のたつみしかぞ住む 世をうぢ山と 人はいふなり」があり, それをもじって「わが庵は都のたつ, み, うま, ひつじ, さる, とり, いぬ, い, ね,うし, とら, う」と本歌取りした人 がいた.

しかし干支の組合せは音読みの方が普通なので, この機会に表の音読み を覚えのはどうか. 次の音読みは旧かな遣いで書いてあり, 実際には 「甲」, 「庚」は「こう」,「丑」は「ちゅう」, 「卯」は「ぼう」と読 む.

さらに十干や十二支の番号も知っていると役立つ. 十干は「こう, おつ」, 「へい, てい」の ように2つずつ組にして覚えると, その組が「き, ひ, つち, か, みづ」に対応する. また十二支は「し, ちう, いん, ばう」, 「しん, し, ご, び」, 「しん, ゆう, じゅつ, がい」 と4つずつにすると, それぞれの組の先頭の年がうるう年になるので都合がよい.

さてこれからが表題の「干支の計算」である. 表Cの干支の一覧が 手元にあり, 今年の干支が「丙午」であることを知っていれば, その前の「甲子」を知るには, 2026年の「丙午」 がn=42で, 「甲子」はn=0だから, 2026-42=1984と判る.

漏刻の使用開始は, 朔(4月1日)の干支, 丁卯がn=3で, 開始日の 干支, 辛卯がn=27だから, 1+(27-3)=25日と判る.

しかし, 表Cのような一覧表なしで, 干支の番号(0<=n<60)を知りたい時 はどうするか. もちろん, ここでは十干の番号(0<=s<10)と十二支の番号 (0<=b<12)は判っているとする. つまり「丙」のs=2, 「午」のb=6 から「丙午」のn=42を知る方法の話である.

下の図を見て欲しい. 縦に3つの図がある. 上の図は, 横軸のnに対して, 赤で示すs, 青で示すbの対応を示す. 赤線, 青線の左端の塗り潰しの 丸は閉区間, 白抜きの丸は開区間を示す. つまりn=10 の時のsは一番左の赤線の値ではなく, その次の赤線の値, 0であることを 示す.

中の図は, s-bを示す. 10<=n<12でs-bが負になっているが, これを 12だけ上に移動すると10になり, 12<=n<20の線と一緒になって, 10<=n<20の区間でs-bの値が2になる. 他の負の値の場所も同様になる. それが下の図である. これで判明したことは, sbからnを作るに は, この値の2を5倍してsを足せばよい. Schemeで書くと
(define (nval s b)
  (let ((d (- s b)))
    (+ s (* 5 (if (< d 0) (+ d 12) d))))))
丙午の場合(s=2, b=6)なら
  (nval 2 6) => 42
Schemeの関数(modulo n d)は, 0<=r<dの剰余を返すから
(define (nval s b)
  (+ s (* 5 (modulo (- s b) 12))))
と書ける.

Schemeでなくても, Pythonのように負の分子に正の剰余を返す言語なら
def nval(s,b):
    return s+5*((s-b)%12)
でもこの方式だと, 丁卯(s=3, b=3)と辛卯 (s=7, b=3)の差は, それぞれのnを 計算してから差をとることになる. sbのそれぞれの 差からnの差が得られると嬉しい. そこでそれぞれの差分dsdbの差とnの差の 関係を作ってみると, 次の表のようであり, これは何と, sbからnを得るのと同じであった. 考えてみるとまぁ そうなるのは当然である.
ds=7-3=4, db=3-3=0 だから
4+5*((4-0)%12)=24
である.

これで今回の話題は完了した. 以下は蛇足である.

いつか書いたかも知れないが, グレゴリオ暦の曜日を知るには, その日のユリウス日JDに 1を足して7で割った剰余をとると, (日曜を0とする)曜日の番号を得る. この方式が干支に 使えないかとやってみると, JDから1を引いて10で割った 剰余は(甲を0とする)十干の番号になる. さらにJDに1を足して12で割った剰余は(子を0 とする)十二支の番号になる. 2025年12月21日は日曜で甲子であった. その日のJDは 2461031. それを7, 10, 12で割った剰余は6, 1, 11である. JDから干支を 計算するには, s=(JD-1)mod 10. b=(JD+1)mod 12から, このブログの式 n=s+(s-b+12)mod 12 *5で 計算してもよいが, JDを60で割った剰余が11なので, JD-11を60で割るのが 簡単である.

整理すると
曜日 (JD+1)%7
十干 (JD-1)%10
十二支 (JD+1)%12
干支 (JD-11)%60
だけ覚えればよい. 偶然だが足したり引いたるがすべて1なのが覚え易い. 私のiPhone には, 個人用電卓があり, JDを計算する機能もあるから, この情報は貴重である.

干支とは関係ないが, 暦の最重要な計算は復活祭である. puzzle and paradoxにある アルゴリズムでは, 今年は4月5日. ということは, ConwayのいうDoomsdayは今年は 土曜日だ. この話題はまたいつか.

0 件のコメント: