今更ですが
大人の動物占い®的なページを踏んでしまいました
2023年って、大分昔の話ですね(気が付くのが遅い)
いや、気になったのは占いの方じゃないんです
該ページの一覧表

:

めちゃ数字が一杯並んでる
どういう並び?
表引きじゃなくて計算できない?
うー、うずうずする…
まずは目視で
- 値は 0~59 の範囲を循環する
- 値は増加傾向にあるけど単調ではない
し、逆戻りもしてるし… - 偶数月と奇数月でそれぞれ別系列
っぽい
お次はExcelで俯瞰してみましょうか
取敢えず系列毎に並べて差分をとってみると…
をぅ、すごい周期的 ![]()
奇数列と偶数列ではパターンが異なるけど、48か月するとまた元に戻ってる?
こいつは縦一列では把握しづらいので、元の縦横に整列させてみますかな
こう

うむ、やはり48か月毎にきれいに循環しているようですね(この12年に限って言えば)
おめでとうございます
1959年12月生まれのあなた
あなたのタイプは 53 の様ですよ
因みに、この態でぬるっと進めてみると

と云う事になって、元資料の終端とも一致しています
(序に、今年分まで出してみました)
でもなー
まぁ、計算で出しているか?
って観点で云えば、そう云えなくもないかも知れないけど
実態は謎の48か月テーブルを参照しながら、足し算をしているだけ
突き詰めて根本的な問題は(今回)1960年の1月と2月のタイプを足掛かりにしている点
前掲の今年のタイプを求めるには、60数年分の累積が必要になる
これでは、うずうずが治まったとは云い難いっす
ではどうするか
どうしよう…
う~~~ん
今までは、先々月との差分を謎の48か月テーブルとして頼っていた訳だったので…
48か月と云う周期性に当てはめる方向性で
キレイに4年周期が浮かび上がった
しかもどうやら、3月始まりの一年と云う事かな?
では、どこか基準点を探しましょうか
あ、先程出てきた足掛かりの「値」ではなくて「位置」です、決めたいのは
1960年の3月を基準にしても良いんでしょうけど、 24・55 っていうのがね、イマイチしっくりこないというか…
んー、なんとなくですけど1960年から遡ってみましょうかねぇ

あ、ここです
1944年3月が 0 で始まるので良さげです
(んー、零点=0と云う値を決めたとも云えなくはないけど、あくまでも位置 のつもり)
もう一歩踏み込む
基準点が決まりましたが、これが固定だとまた色々めんどくさいかも
ここらへん、もう少し掘り下げたいと思います
えぇっと
最初に出てきた数列ふたつ
$0, 1, 1, 2, 1, 1, -1, 1, 1, 2, 1, 1, -1, 1, 1, 2, 1, 1, -1, 1, 1, 2, 1, 1$
と
$0, 1, 1, 1, 1, 2, -1, 1, 1, 1, 1, 2, -1, 1, 1, 1, 1, 2, -1, 1, 1, 1, 1, 2$
これ、それぞれ足すと 21 になります
当然、6 + 5 + 5 + 5 = 21を考えると、両方とも 21 になって貰わないと困りますけどねー
これはつまり、タイプは4年毎に 21 づつ進むという事なので
$a + 21k \equiv a \pmod{60}$
で
$21k \equiv 0 \pmod{60}$
ここから、
$k = \frac{60}{\gcd(21, 60)} = \frac{60}{3} = 20$
つまり、20回繰り返すと元に戻るという事ですね
結局、$20 {\times} 4 = 80$
で、 80年 周期で同じパターンを繰り返す筈です
さて
ここまでで分かった情報は
- 80年周期で全体を繰り返す
- 4年毎にタイプは21ずつ加算される
- 4年内の加算パターンは 6,5,5,5 である
それ以外に
- 一年は3月始まりである
- 1944年の3月が一つの基準点となる
となると、任意の年に対して
- その年が80年周期のどの位置に相当するか
- その年が4年周期のどの位置に相当するか
が、分かれば、算出することができるという事ですよね?
よしよし、ゴールに近づいてきたぞ
月毎のパターン
年のパターンが分かっても、月のパターンが特定できない事には話になりません
そいつを考えましょう
いま、基準に置いた1944年の12か月分のタイプパターンは以下の通りです

こういう事なので、1944年はー
$Array(0,31,1,32,2,33,4,34,5,35,6,37)[月 - 1]$
的な感じで表引きしてあげると、月毎のタイプ基準値を特定できますね
48か月の謎テーブルが12か月分の謎テーブルにまで縮小されました!!!!!
……余り嬉しくないですね
謎は謎のままです
月のパターンも純粋に計算で求めたいです
ここは、タイプを(mod 30)してみましょうか
いいですねー
後戻りせずに、常に増加傾向にあります
もういっその事、べたで数式組み立ててー
初期値はゼロで、4月以降は+1で、更に6月以降は+1で、更に8月以降は+1で、更に…
みたいな、奇っ怪な計算式を組み上げる、ってな事もできますが
いやいや、汚い
ここまで来てそれは無いだろう
もう一捻りしましょうよ
もう一捻り
なんか上手い多項式組めないだろうか…
🐙 🐙 🐙
で、Excelいじっているうちに以下の様な所に辿り着きました

調整項3つをちょっとづつずらして足し合わせると、あら不思議
ぴったり合うじゃん
※ 月数は、3月を1とおいて、翌2月が12と表されているとして
\left\lfloor \frac{month + 3}{5} \right\rfloor \quad … adj1
\left\lfloor \frac{month + 1}{5} \right\rfloor \quad … adj2
\left\lfloor \frac{month - 1}{5} \right\rfloor \quad … adj3
こいつに、偶数月の場合 30 を加えれば謎の12か月テーブルの出来上がり!
謎は謎でなくなりました
一応確認をば
80年毎にパターンを繰り返す、って言いきってしまいましたが、そこら辺はどうなの?
を確認する
1944年を基準年に置いたので、80年後は…
2024年だ!?
掲示されていたタイプ表はちょうど80年分だけだったんですね
よし! じゃぁプログラムだ
手軽なところで、WScriptで…
所謂「JScript」ですね
function YearBlock(yy) {
return Math.floor(((yy + 56) % 80) /4);
}
function YearMod(yy) {
return (yy + 56) % 4;
}
function RefVal(mm) {
return Math.floor((mm + 3) / 5) + Math.floor((mm + 1) / 5) + Math.floor((mm - 1) / 5) + 30 * ((mm - 1) % 2);
}
function GetType(y, m, d) {
var yy = Math.floor((y * 12 + m - 3) / 12);
var mm = (y * 12 + m - 3) % 12 + 1;
return ((RefVal(mm) + 21 * YearBlock(yy) + 5 * YearMod(yy)) % 60 + (d - 1)) % 60 + 1;
}
おしまいっ!
いや、若干の説明を…
-
YearBlock(yy)
80年周期の中で、何番目の4周年期かを返す(zero origin)
yy + 56の 56 は、1944年が80周年の一つの紀元となる様にするための調整項です -
YearMod(yy)
4年周期の中で、何年目かを返す(zero origin) -
RefVal(mm)
基準年のmm月に該当するタイプを返す -
GetType(y, m, d)
西暦y年m月d日 のタイプを返す
でゎ、実測
ん? 測?
ま、いいや
と云っているので…
WScript.Echo(GetType(1970, 9, 25));
を実行してあげると…
C:\Users\Toraja\Script>cscript test.js
Microsoft (R) Windows Script Host Version 10.0
Copyright (C) Microsoft Corporation. All rights reserved.
45
C:\Users\Toraja\Script>
よし、おっけー
序に、これは?
WScript.Echo(GetType(1836, 1, 3));
C:\Users\Toraja\Script>cscript test.js
Microsoft (R) Windows Script Host Version 10.0
Copyright (C) Microsoft Corporation. All rights reserved.
36
C:\Users\Toraja\Script>
らしいっすよ
坂本龍馬 さん
終わりに…
いやー、楽しかった
ただそれだけです
学びも何もなかったですが―――
ひたすら自分が楽しかった、だけの項になります
失礼いたしました









