zakuro 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +9 -0
  3. data/.gitignore +69 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +14 -0
  6. data/.travis.yml +6 -0
  7. data/Gemfile +19 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +44 -0
  10. data/Rakefile +20 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/images/12/346/234/210/344/273/245/351/231/215/343/201/256/345/205/245/345/256/232/346/260/227.png +0 -0
  14. data/images/12/346/234/210/344/273/245/351/231/215/343/201/256/346/234/210/343/201/256/351/200/262/351/200/200.png +0 -0
  15. data/images/source/description.numbers +0 -0
  16. data/images//345/205/245/345/256/232/346/260/227/343/201/256/350/265/267/347/256/227.png +0 -0
  17. data/images//345/220/204/346/234/210/343/201/256/346/261/202/343/202/201/346/226/271.png +0 -0
  18. data/images//345/244/252/351/231/275/343/201/250/346/234/210.png +0 -0
  19. data/lib/zakuro.rb +9 -0
  20. data/lib/zakuro/condition.rb +239 -0
  21. data/lib/zakuro/cycle/abstract_remainder.rb +457 -0
  22. data/lib/zakuro/cycle/zodiac.rb +103 -0
  23. data/lib/zakuro/era/gengou/set-001-until-south.yaml +375 -0
  24. data/lib/zakuro/era/gengou/set-002-from-north.yaml +166 -0
  25. data/lib/zakuro/era/gengou/set-003-modern.yaml +12 -0
  26. data/lib/zakuro/era/japan.rb +630 -0
  27. data/lib/zakuro/era/western.rb +412 -0
  28. data/lib/zakuro/merchant.rb +57 -0
  29. data/lib/zakuro/output/error.rb +10 -0
  30. data/lib/zakuro/output/logger.rb +64 -0
  31. data/lib/zakuro/output/response.rb +170 -0
  32. data/lib/zakuro/output/result.rb +219 -0
  33. data/lib/zakuro/output/stringifier.rb +62 -0
  34. data/lib/zakuro/version.rb +7 -0
  35. data/lib/zakuro/version/abstract_version.rb +29 -0
  36. data/lib/zakuro/version/genka/genka.rb +19 -0
  37. data/lib/zakuro/version/gihou/gihou.rb +19 -0
  38. data/lib/zakuro/version/gregorio/gregorio.rb +19 -0
  39. data/lib/zakuro/version/houryaku/houryaku.rb +19 -0
  40. data/lib/zakuro/version/joukyou/joukyou.rb +19 -0
  41. data/lib/zakuro/version/kansei/kansei.rb +19 -0
  42. data/lib/zakuro/version/senmyou/README.md +586 -0
  43. data/lib/zakuro/version/senmyou/base/era.rb +81 -0
  44. data/lib/zakuro/version/senmyou/base/gengou.rb +210 -0
  45. data/lib/zakuro/version/senmyou/base/remainder.rb +60 -0
  46. data/lib/zakuro/version/senmyou/base/solar_term.rb +66 -0
  47. data/lib/zakuro/version/senmyou/base/year.rb +58 -0
  48. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +220 -0
  49. data/lib/zakuro/version/senmyou/monthly/month.rb +112 -0
  50. data/lib/zakuro/version/senmyou/senmyou.rb +34 -0
  51. data/lib/zakuro/version/senmyou/stella/lunar_orbit.rb +332 -0
  52. data/lib/zakuro/version/senmyou/stella/solar_average.rb +192 -0
  53. data/lib/zakuro/version/senmyou/stella/solar_orbit.rb +398 -0
  54. data/lib/zakuro/version/senmyou/stella/winter_solstice.rb +106 -0
  55. data/lib/zakuro/version/senmyou/summary/annual_data.rb +186 -0
  56. data/lib/zakuro/version/senmyou/summary/gengou_data.rb +294 -0
  57. data/lib/zakuro/version/taien/taien.rb +19 -0
  58. data/lib/zakuro/version/tenpou/tenpou.rb +19 -0
  59. data/lib/zakuro/version_factory.rb +59 -0
  60. data/zakuro.gemspec +31 -0
  61. metadata +106 -0
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module Zakuro
5
+ #
6
+ # Result 演算結果
7
+ #
8
+ module Result
9
+ #
10
+ # Stringifier 文字列処理
11
+ #
12
+ module Stringifier
13
+ #
14
+ # 対象インスタンスをハッシュ化する
15
+ #
16
+ # @param [Object] obj 対象インスタンス
17
+ # @param [String] class_prefix インスタンス内でハッシュ変換するクラスのプレフィックス
18
+ #
19
+ # @return [Hash<String, Objcet>] ハッシュ
20
+ #
21
+ def self.to_h(obj:, class_prefix:)
22
+ hash = {}
23
+ obj.instance_variables.each do |var|
24
+ key = var.to_s.delete('@')
25
+ hash[key] = value_to_hash(obj: obj.instance_variable_get(var), class_prefix: class_prefix)
26
+ end
27
+ hash
28
+ end
29
+
30
+ # :reek:TooManyStatements { max_statements: 7 } and :reek:NilCheck
31
+
32
+ #
33
+ # 対象インスタンスをハッシュ化する(再帰処理)
34
+ #
35
+ # @param [Object] obj 対象インスタンス
36
+ # @param [String] class_prefix インスタンス内でハッシュ変換するクラスのプレフィックス
37
+ #
38
+ # @return [Hash<String, Objcet>] ハッシュ
39
+ #
40
+ def self.value_to_hash(obj:, class_prefix:)
41
+ return obj if obj.nil?
42
+
43
+ # 同じモジュール内のオブジェクトは再帰する
44
+ if obj.class.name.start_with?(class_prefix)
45
+ return to_h(obj: obj, class_prefix: class_prefix)
46
+ end
47
+
48
+ # 配列は要素一つずつで再帰する
49
+ if obj.is_a?(Array)
50
+ arr = []
51
+ obj.each do |item|
52
+ arr.push(to_h(obj: item, class_prefix: class_prefix))
53
+ end
54
+ return arr
55
+ end
56
+
57
+ obj
58
+ end
59
+ private_class_method :value_to_hash
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module Zakuro
5
+ # @return [String] library version
6
+ VERSION = '0.0.0'
7
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :nodoc:
4
+ module Zakuro
5
+ #
6
+ # AbstractVersion 暦インターフェース
7
+ #
8
+ # @abstract 暦日を引き当てるためのインターフェース
9
+ #
10
+ class AbstractVersion
11
+ # @return [True] 暦の使用可
12
+ # @return [False] 暦の使用不可
13
+ RELEASE = false
14
+
15
+ #
16
+ # 西暦日から和暦日に変換する
17
+ #
18
+ # @param [Date] western_date 西暦日
19
+ #
20
+ # @return [Result::SingleDay] 和暦日
21
+ #
22
+ # @raise [NotImplementedError] オーバーライドなし
23
+ #
24
+ def self.to_japan_date(western_date:)
25
+ raise NotImplementedError,
26
+ "must be implemented on #{self.class}##{__method__}(#{western_date})"
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../abstract_version'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ #
8
+ # Genka 元嘉暦
9
+ #
10
+ module Genka
11
+ #
12
+ # Gateway アクセサメソッド群
13
+ #
14
+ class Gateway < AbstractVersion
15
+ # @return [False] リリースなし
16
+ RELEASE = false
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../abstract_version'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ #
8
+ # Gihou 儀鳳暦
9
+ #
10
+ module Gihou
11
+ #
12
+ # Gateway アクセサメソッド群
13
+ #
14
+ class Gateway < AbstractVersion
15
+ # @return [False] リリースなし
16
+ RELEASE = false
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../abstract_version'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ #
8
+ # Gregorio グレゴリオ暦
9
+ #
10
+ module Gregorio
11
+ #
12
+ # Gateway アクセサメソッド群
13
+ #
14
+ class Gateway < AbstractVersion
15
+ # @return [False] リリースなし
16
+ RELEASE = false
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../abstract_version'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ #
8
+ # Houryaku 宝暦暦
9
+ #
10
+ module Houryaku
11
+ #
12
+ # Gateway アクセサメソッド群
13
+ #
14
+ class Gateway < AbstractVersion
15
+ # @return [False] リリースなし
16
+ RELEASE = false
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../abstract_version'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ #
8
+ # Joukyou 貞享暦
9
+ #
10
+ module Joukyou
11
+ #
12
+ # Gateway アクセサメソッド群
13
+ #
14
+ class Gateway < AbstractVersion
15
+ # @return [False] リリースなし
16
+ RELEASE = false
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../abstract_version'
4
+
5
+ # :nodoc:
6
+ module Zakuro
7
+ #
8
+ # Kansei 寛政暦
9
+ #
10
+ module Kansei
11
+ #
12
+ # Gateway アクセサメソッド群
13
+ #
14
+ class Gateway < AbstractVersion
15
+ # @return [False] リリースなし
16
+ RELEASE = false
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,586 @@
1
+ # 宣明暦
2
+
3
+ 貞観4年1月1日(859/02/07)-貞享2年12月29日(1686/01/23)
4
+
5
+ # 著者
6
+
7
+ [pldb](https://github.com/pldb)
8
+
9
+ # 前提
10
+
11
+ 宣明暦は太陰太陽暦である
12
+
13
+ 太陰太陽暦の文化的・歴史的な背景には触れず、ここでは暦計算する上で必要なことのみ言及する
14
+
15
+ 私たち現代の日本人が使うグレゴリオ暦は太陽暦である
16
+
17
+ 太陽暦は `年` を太陽に対する公転周期、 `日` を地球の自転周期で求める
18
+
19
+ 太陰太陽暦はそれに加えて、`月` を月の満ち欠けの周期(朔望月)に合わせる
20
+
21
+ 本来この `年` と `月` の周期には何らかの関連性はなく、暦の側で辻褄合わせする必要がある
22
+
23
+ (今回は触れないが、メトン周期はこのような辻褄合わせの一つである)
24
+
25
+ `年` の太陽年は約365.24日、 `月` の1朔望月は約29.5日である
26
+
27
+ 1朔望月 * 12 = 354日であり、 1太陽年には常に約11日ほど満たないことになる
28
+
29
+ 古代中国人はこれを12ヶ月の平年(353/354/355/356日)と、13ヶ月の閏年(383/384/385日)で解決した
30
+
31
+ 問題は1年に含まれる朔望月のそれぞれを1月、2月...などと位置付けるのか
32
+
33
+ これを理解するために、元弘元年-元弘2年を例にする
34
+
35
+ ![太陽と月](../../../../images/太陽と月.png)
36
+
37
+ 「定朔」は月の始まりを示す
38
+
39
+ 毎月1日の始まりであり、ここから次の月までは1朔望月かかる
40
+
41
+ 具体的に言えば、朔月(新月)-> 上弦 -> 望月(満月) -> 下弦 -> 次の朔月(新月)と約29.5日かけて移り変わる
42
+
43
+ 下の「黄経」は(地球から見える)太陽の位置を示し、360度で1太陽年が経過する
44
+
45
+ この黄経15度ごとに名前が与えられており、これを「二十四節気」と呼ぶ
46
+
47
+ 宣明暦ではこの定朔の範囲にどの二十四節気が含まれるかを計算し、中気に対応する月名を与えている
48
+
49
+ 11月を例に取ると、「3-2240」と「33-6480」の間には大雪(「13-4659」)と冬至(「28-6495」)が含まれている
50
+
51
+ この大余小余(xx-xxxx)の表現を細かくは説明しないが、とりあえずは左側の数字だけ見ていただければ良い
52
+
53
+ この冬至は11月の中気であり、これが含まれている1朔望月を「11月」と呼ぶ
54
+
55
+ 次に閏2月を例に取ると、中気が一つも含まれていないことが分かる
56
+
57
+ 「1-329」と「30-4043」の間には節気しかない
58
+
59
+ これを閏月と呼び、これが含まれる元弘3年は13ヶ月ある閏年になる
60
+
61
+ このように、太陰太陽暦では太陽の位置を24分割し、月の所属を明らかにする方法を取っている
62
+
63
+ # 計算
64
+
65
+ 計算にあたって、暦共通の計算と、宣明暦固有の計算がある
66
+
67
+ 現状は他の暦を扱っていないため、暦共通の計算から説明する
68
+
69
+ その上で宣明暦固有の計算を説明することとする
70
+
71
+ ## 共通の計算
72
+
73
+ これから記すことは原則として実装の問題であり、計算手順そのものは特定の資料に依拠するものではない
74
+
75
+ 『日本暦日原典』と同等の計算結果を出すためには、暦法編(同p.491〜)だけでは不十分であり、元号年の求め方など他に求めるべき項目がある
76
+
77
+ これはそれらを補完するための手順となる
78
+
79
+ ### 計算の流れ
80
+
81
+ 正慶1年の日数を出すための流れを図示する
82
+
83
+ ![各月の求め方](../../../../images/各月の求め方.png)
84
+
85
+ 最後の「355日」を出すためには、月ごとの日数を出す必要がある
86
+
87
+ 月ごとの日数は定朔によって得られるが、それは経朔を補正することで得られる
88
+
89
+ この図の正慶1年は宣明暦に属するため、定朔まで求める必要がある
90
+
91
+ 11月定朔に必要な「経朔」「入定気(二十四節気)」「月の進退」は冬至計算で求められる
92
+
93
+ 従って、まずは各年の冬至を求めなければならない
94
+
95
+ 計算の多くはそれぞれの暦に依存するが、まずは共通の計算部分を列挙する
96
+
97
+ ### ある元号の2年目以降について
98
+
99
+ 各元号の1年(元年)の始まりは固定値のため、西暦にて開始日を持つ(例: 正慶1年1月1日 = 1332/01/28)
100
+
101
+ 日本の旧暦(太陰太陽暦)において、元号は1月1日を境に改元または継続する
102
+
103
+ ここで問題となるのは、元号2年目以降はその前年までの計算結果が必要になることである
104
+
105
+ 西暦(太陽暦)のように1年あたりの日数は一定しない
106
+
107
+ 平年(353/354/355/356)または閏年(383/384/385)のパターンがあり、月の大小(29/30)や閏月(中気のない月)の有無で変動する
108
+
109
+ この日数を求めることで、初めて2年目の開始日が求められる(1332/01/28 + 355日 = 1333/1/17 = 正慶2年1月1日)
110
+
111
+ ### 南北朝について
112
+
113
+ 南北朝による元号の並立がある(正慶1年 / 元弘2年)
114
+
115
+ このような場合、元号は早くから始まったほうを基準に計算しなければならない(正慶 よりは 元弘 の方が一年早い)
116
+
117
+ 並立は最大でも2つであり、並びは『日本暦日原典』に従う
118
+
119
+ ## 宣明暦固有の計算
120
+
121
+ 計算手順を以下に示す
122
+
123
+ 1. 11月定朔(補正後の月初日)を求める
124
+ 1. 対象の西暦年から前年冬至を求める
125
+ 2. 対象の西暦年から冬至の月齢を求める
126
+ 3. 前年冬至から11月経朔(補正前の月初日)を求める
127
+ 4. 二十四節気から太陽の運動の補正値を求める
128
+ 5. 月の進退から月の運動の補正値を求める
129
+ 6. 太陽・月の運動の補正値から11月定朔(補正後の月初日)を求める
130
+ 2. 12月定朔(補正後の月初日)を求める
131
+ 1. 11月経朔を進めて12月経朔を求める
132
+ 2. 11月の二十四節気を進めて12月の二十四節気を求める
133
+ 3. 12月の二十四節気から太陽の運動の補正値を求める
134
+ 4. 11月の月の進退を進めて12月の月の進退を求める
135
+ 5. 12月の月の進退から月の運動の補正値を求める
136
+ 6. 太陽・月の運動の補正値から12月定朔(補正後の月初日)を求める
137
+ 3. 1ヶ月ごとの固有値を求める
138
+ 1. 月の大小を求める
139
+ 2. 二十四節気の所属を求める
140
+
141
+ 1の計算方法は『日本暦日原典』p.511-516に依拠する
142
+
143
+ 2は 「安藤有益著『再考長慶宣明暦算法』 について」、さらにその元となる「長慶宣明暦算法」に依拠する
144
+
145
+ ### 11月定朔(補正後の月初日)を求める
146
+
147
+ 『日本暦日原典』に倣い、慶安3年(1650年)を元に計算例を示す
148
+
149
+ 原文は「長慶宣明暦算法」を引用しつつ説明しているが、計算に必要な部分のみ取り出し説明する
150
+
151
+ なお、計算の背景を理解のため適宜補足し、「こえた場合」「より大きい」など境界値の扱いが曖昧な表現は、分かる表現に改めることとする
152
+
153
+ #### 対象の西暦年から前年冬至を求める
154
+
155
+ まずは `天正冬至` (前年冬至)を求める
156
+
157
+ `積年` (7070138年)+ `西暦年` (1650年) - `宣明暦作成年` (長慶2年: 822年) = 7070966年 ...(1)
158
+
159
+ まずは積年で経過年を求める(積年の根拠は「宣明暦の積年と暦元について」に詳しい)
160
+
161
+ 積年の始まりは甲子夜半朔旦冬至(冬至の日で朔日、かつ十干十二支の60通りの1番目の日、かつ1日の始まりである夜半)である
162
+
163
+ `(1)結果` (7070966年) % `旬周` (60日: 504000)= (余り)95130 ...(2)
164
+
165
+ 次に60日で割り、直近の甲子(60日ある十干十二支の1番目)から数えた経過を求める
166
+
167
+ `(2)結果` (95130) / `統法(1日)` (8400) = 11 ... 余り 2730 ...(3)
168
+
169
+ この(3)の 大余小余(11-2730) が慶安3年(1650年)の `天正冬至` (前年冬至)である
170
+
171
+ #### 対象の西暦年から冬至の月齢を求める
172
+
173
+ 次に `天正閏余` (冬至の月齢)を求める
174
+
175
+ `(1)結果` (7070966年) % `章月(1朔望月)` (248057) = (余り)125370 ...(4)
176
+
177
+ 経過年を1朔望月で割り、直近の朔月(新月)からの経過を求める
178
+
179
+ `(4)結果` (125370) * `章閏法` (91371) % `章月(1朔望月)` (248057) = (余り)158067 ...(5)
180
+
181
+ 章閏法は `1太陽年(3068055) - 12朔望月(248057 * 12)` で求められる
182
+
183
+ これは原文にない筆者自身の考察だが、上記(4)-(5) はまわりくどい求め方である
184
+
185
+ `(1)結果` (7070966年) * `1太陽年` (3068055) % `章月(1朔望月)` (248057)
186
+
187
+ この式と結果は変わらないが、思うに、乗算で大きい桁数を扱うのを避けたのではないだろうか
188
+
189
+ `(5)結果` (158067) / `統法(1日)` (8400) = 18 ... 余り 6867 ...(6)
190
+
191
+ この(6) の 大余小余(18-6867) が慶安3年(1650年)の `天正閏余` (冬至の月齢)である
192
+
193
+ #### 前年冬至から11月経朔(補正前の月初日)を求める
194
+
195
+ 次に `11月経朔(補正前の月初日)` を求める
196
+
197
+ 先述の通り、冬至の含まれる月が11月である
198
+
199
+ また、冬至の月齢をすでに得ているので、11月内の朔月(新月)まで遡って求めることができる
200
+
201
+ `天正冬至` (前年冬至) - `天正閏余` (冬至の月齢)
202
+ = 大余小余(11-2730) - 大余小余(18-6867)
203
+ = 大余小余(52-4263)
204
+
205
+ 大余小余の説明をすると、大余は60で繰り上がって0に戻り、小余は8400で繰り上がって大余1を加える
206
+
207
+ 上記の減算をする場合、小余 2730 - 6867 は大余1から小余8400を足して引く
208
+
209
+ 大余 11 - 18 は小余計算で使った1を引き、さらに常に60未満のため、60を足して引く
210
+
211
+ こうして得られた 大余小余(52-4263) が慶安3年(1650年)の前年の `11月経朔(補正前の月初日)` である
212
+
213
+ #### 二十四節気から太陽の運動の補正値を求める
214
+
215
+ `11月経朔(補正前の月初日)` を補正するために、太陽の運動の補正値を求める
216
+
217
+ 地球は太陽の周りを楕円に周っている
218
+
219
+ したがって二十四節気に従い、黄経15度ずつ分割しただけではそれぞれの進み方の違い(冬早く夏遅く)を表現できない
220
+
221
+ この二十四節気ごとの進みの違いは後述する「入気定日加減数」で定義されているが、今はこのうちの小雪(14秒5235分5秒)、大雪(14日4235分5秒)のみ意識すれば良い
222
+
223
+ 前提として、11月の朔日は二十四節気の小雪〜大雪、または大雪〜冬至の範囲内にある
224
+
225
+ ![入定気の起算](../../../../images/入定気の起算.png)
226
+
227
+ 上記はp.513の第五図を参考の上、下記の変更を加えている
228
+
229
+ * 原文はa/bの条件がどちらも「より大きい」となっていたので、境界値の扱いが分かる表記に変えた
230
+ * 定数の値を併記した
231
+
232
+ この図で示した通り、求め方はaかbかで異なる
233
+
234
+ 求める対象は定気(経朔のある二十四節気の始まり)から経朔までの経過であり、以下の減算で求められる
235
+
236
+ a: `大雪定数` (14-5235.5) - `天正閏余`
237
+
238
+ b: `小雪定数` (14-4235.5) - ( `天正閏余` - `大雪定数` (14-5235.5))
239
+
240
+ 慶安3年(1650年)の `天正閏余` (18-6867) はbのパターンであり、以下のように計算できる
241
+
242
+ 18-6867 - 14-5235.5 = 4-2631.3
243
+
244
+ 14-4235.5 - 4-2631.3 = 10-2604.2 ≒ 10-2604 (小数点以下切り捨て)
245
+
246
+ 秒の単位を扱うのはここが初めてだが、 1分=8秒として計算する
247
+
248
+ 最後に秒の切り捨てをしているのは以降の計算では使わないためである
249
+
250
+ 次に損益率・眺朒(ちょうじく)数を求める
251
+
252
+ これは以下の「24気損益眺朒数」という表を用いる
253
+
254
+ |-|a(眺朒数の初日の値)|b(損益率初日の値)|c(一日ごとの差)|
255
+ |:----|:----|:----|:----|
256
+ |冬至(とうじ)|0.0|+33.4511|-0.3695|
257
+ |小寒(しょうかん)|+449.0|+28.0389|-0.3606|
258
+ |大寒(だいかん)|+823.0|+22.6998|-0.3519|
259
+ |立春(りっしゅん)|+1122.0|+17.8923|-0.4068|
260
+ |雨水(うすい)|+1346.0|+11.7966|-0.3998|
261
+ |啓蟄(けいちつ)|+1481.0|+5.7986|-0.3998|
262
+ |春分(しゅんぶん)|+1526.0|-0.2433|-0.3779|
263
+ |清明(せいめい)|+1481.0|-6.1254|-0.3634|
264
+ |穀雨(こくう)|+1346.0|-12.2048|-0.2987|
265
+ |立夏(りっか)|+1122.0|-16.9060|-0.2919|
266
+ |小満(しょうまん)|+823.0|-21.5362|-0.2854|
267
+ |芒種(ぼうしゅ)|+449.0|-26.0498|-0.2854|
268
+ |夏至(げし)|0.0|-30.3119|+0.2854|
269
+ |小暑(しょうしょ)|-449.0|-25.8126|+0.2919|
270
+ |大暑(たいしょ)|-823.0|-21.2454|+0.2987|
271
+ |立秋(りっしゅう)|-1122.0|-17.0296|+0.3634|
272
+ |処暑(しょしょ)|-1346.0|-11.4744|+0.3779|
273
+ |白露(はくろ)|-1481.0|-5.6429|+0.3779|
274
+ |秋分(しゅうぶん)|-1526.0|+0.1432|+0.3998|
275
+ |寒露(かんろ)|-1481.0|+6.1488|+0.4068|
276
+ |霜降(そうこう)|-1346.0|+12.6336|+0.3519|
277
+ |立冬(りっとう)|-1122.0|+17.8043|+0.3606|
278
+ |小雪(しょうせつ)|-823.0|+23.0590|+0.3695|
279
+ |大雪(たいせつ)|-449.0|+28.4618|+0.3695|
280
+
281
+ 定気の日からn日目の損益率/眺朒数を以下のように求める
282
+
283
+ * 損益率 = b + n * c
284
+ * 眺朒数 = a + (n * b) + (1/2)n * (n - 1) * c
285
+
286
+ 先ほどの計算結果 10-2604 と、小雪(経朔のある二十四節気)を用いると次の通りに計算できる
287
+
288
+ 損益率 = 23.0590 + 10 * 0.3695 = 26.7540
289
+
290
+ 眺朒数 = -823.000 + (10 * 23.0590) + (1/2) * 10 * (10 - 1) * 0.3695
291
+ = -823.000 + 230.5900 + 16.6275 = -575.7825
292
+
293
+ 次に、損益率/眺朒数と計算結果 10-2604 を使って最終的な補正値を求める
294
+
295
+ (小数点以下切り捨ての損益率 * 小余) / `統法(1日)` (8400) = 26 * 2604 / 8400 = 8 ... 余り 504
296
+
297
+ この余りは4200以上なら切り上げるが、この場合は504なので切り捨てる
298
+
299
+ この8と 小数点以下切り捨ての眺朒数の -575 を足した値、 -567 が補正値になる
300
+
301
+ #### 月の進退から月の運動の補正値を求める
302
+
303
+ `11月経朔(補正前の月初日)` を補正するために、月の運動の補正値を求める
304
+
305
+ 月もまた地球の公転運動と同じく楕円に周っている
306
+
307
+ したがって地球に近い(近地点)遠い(遠地点)があり、それによる補正値を求める
308
+
309
+ `(1)結果` (7070966年) * `章歳(1太陽年)` (3068055) = 21兆6941億1259万1130 ...(9)
310
+
311
+ 積年を小余を基準にする
312
+
313
+ ( `(9)結果` 21兆6941億1259万1130 - `天正閏余` (18-6867 : 158067) ) % `暦周(1近点月)` (231458.19) = (余り) 126575.76 ...(10)
314
+
315
+ 月が近地点 -> 遠地点 -> 近地点と一巡する暦周(27.55454...日)を使って、直近の遠地点からの経過を求める
316
+
317
+ NOTE: 後述の表が遠地点始まりで地球に向かって進み、近地点から地球から離れるような構成のため「直近の遠地点」と表現している
318
+
319
+ なお、暦周の秒は1分=8秒ではなく1分=100秒であることに留意すること
320
+
321
+ `(10)結果` (126575.76) / `統法(1日)` (8400) = 15 ... 余り 575.76 ...(11)
322
+
323
+ この結果( 15-575.76) は `暦周(1近点月)` (231458.19) の半分の `暦中日(暦周の半分)` (13-6529.095) 以上である
324
+
325
+ この場合は減算する
326
+
327
+ `(11)結果` (15-575.76) - `暦中日(暦周の半分)` (13-6529.095) = 2-2446.665
328
+
329
+ この大余小余をもとに表から値を引く
330
+
331
+ |進退|入暦|小余(下限)|小余(上限)|損益率|眺朒積|備考|
332
+ |:----|:----|:----|:----|:----|:----|:----|
333
+ |進|01日|0000|8400|+830|0|-|
334
+ |進|02日|0000|8400|+726|+830|-|
335
+ |進|03日|0000|8400|+606|+1556|-|
336
+ |進|04日|0000|8400|+471|+2162|-|
337
+ |進|05日|0000|8400|+337|+2633|-|
338
+ |進|06日|0000|8400|+202|+2970|-|
339
+ |進|07日|0000|7465|+53|+3172|-|
340
+ |進|07日|7465|8400|-7|+3225|+3172 + 53(初益)|
341
+ |進|08日|0000|8400|-82|+3218|-|
342
+ |進|09日|0000|8400|-224|+3136|-|
343
+ |進|10日|0000|8400|-366|+2912|-|
344
+ |進|11日|0000|8400|-509|+2546|-|
345
+ |進|12日|0000|8400|-643|+2037|-|
346
+ |進|13日|0000|8400|-748|+1394|-|
347
+ |進|14日|0000|6529|-646|+646|14日の小余は常に6529以下|
348
+ |退|01日|0000|8400|-830|0|-|
349
+ |退|02日|0000|8400|-726|-830|-|
350
+ |退|03日|0000|8400|-598|-1556|-|
351
+ |退|04日|0000|8400|-464|-2154|-|
352
+ |退|05日|0000|8400|-329|-2618|-|
353
+ |退|06日|0000|8400|-195|-2947|-|
354
+ |退|07日|0000|7465|-53|-3142|-|
355
+ |退|07日|7465|8400|+7|-3195|-3142 - 53(初益)|
356
+ |退|08日|0000|8400|+82|-3188|-|
357
+ |退|09日|0000|8400|+225|-3106|-|
358
+ |退|10日|0000|8400|+366|-2881|-|
359
+ |退|11日|0000|8400|+501|-2515|-|
360
+ |退|12日|0000|8400|+628|-2014|-|
361
+ |退|13日|0000|8400|+740|-1386|-|
362
+ |退|14日|0000|6529|+646|-646|14日の小余は常に6529以下|
363
+
364
+ これは第14表に対して改変を加えた表である
365
+
366
+ 原文の表には小余と備考の項目がない
367
+
368
+ 備考はあくまで理解のためだが、小余はこの列がないばかりに余計な条件分岐が増えているため追加した
369
+
370
+ この表を使って実際に引き当てを行う
371
+
372
+ 前回の結果(2-2446.665)を求めるに当たり、`暦中日(暦周の半分)` で減算したが、この場合は 進退列の`退` を見ることになる
373
+
374
+ 次に大余に相当する入暦列、小余に相当する小余列を確認し、損益率 -726 / 眺朒積 -830 を引き当てる
375
+
376
+ ( `損益率` (-726) * `小余` (2446) ) / `統法(1日)` (8400) = -211 ... 余り -3396
377
+
378
+ 余りは四捨五入するが、これは `小余(上限)` (8400) - `小余(下限)` (0) = 8400 を基準にして、絶対値が半分の4200以上なら繰り上げる(繰り上げ方は正数であれば+1、負数であれば-1)
379
+
380
+ 今回の -3396 は -4200 に到達しないため切り捨て、 計算結果は -211 となる
381
+
382
+ この -211 + (-830) = 1041 が月の補正値となる
383
+
384
+ 今回のパターン外の補足として、7日の場合と14日の場合がある
385
+
386
+ 7日は小余7465以下なら損益率+53、7465を超えた場合は-7である
387
+
388
+ 14日は暦中日の範囲に従い、小余6529までとなる
389
+
390
+ #### 太陽・月の運動の補正値から11月定朔(補正後の月初日)を求める
391
+
392
+ これまでの結果をもとに定朔を求める
393
+
394
+ `11月経朔` (52-4263) + `太陽の運動の補正値` (-567) + `月の運動の補正値` (-1041) = 52-2655
395
+
396
+ こうして11月定朔が確定する
397
+
398
+ ### 12月定朔(補正後の月初日)を求める
399
+
400
+ ここからは冬至が含まれる11月をもとに、次月以降を求める手続きを示す
401
+
402
+ 例として12月が良いと考えられたため、12月を参考に求めることとする
403
+
404
+ なお、太陽・月の運動の補正値を求めるくだりは、「安藤有益著『再考長慶宣明暦算法』 について」p.89-90 を参考にする
405
+
406
+ ![各月の求め方](../../../../images/各月の求め方.png)
407
+
408
+ 再掲する形になるが、流れについては上記の図を参考にしてほしい
409
+
410
+ 留意することとして、11月定朔から直接12月定朔を求めることはできない
411
+
412
+ #### 11月経朔を進めて12月経朔を求める
413
+
414
+ まずは前月経朔から当月経朔から求める
415
+
416
+ `11月経朔` (52-4263) + `章月` (29-4457) = 22-320
417
+
418
+ 太陰太陽暦なので1ヶ月は1朔望月、つまり `章月` を指す
419
+
420
+ `章月` の大余小余は 248057 / 8400 = 29-4457 である
421
+
422
+ これを加算することで次月の経朔が得られるが、11月の時と同様にこれで終わりではない
423
+
424
+ #### 11月の二十四節気を進めて12月の二十四節気を求める
425
+
426
+ 次に12月経朔に対応する入定気、つまり定気(経朔のある二十四節気の始まり)から経朔までの経過を求める
427
+
428
+ これには「入気定日加減数」を用いる
429
+
430
+ |二十四節気|経過|
431
+ |:----|:----|
432
+ |冬至(とうじ)・大雪(たいせつ)|14 日 4235 分 5 秒|
433
+ |小寒(しょうかん)・小雪(しょうせつ)|14 日 5235 分 5 秒|
434
+ |大寒(だいかん)・立冬(りっとう)|14 日 6235 分 5 秒|
435
+ |立春(りっしゅん)・霜降(そうこう)|14 日 7235 分 5 秒|
436
+ |雨水(うすい)・寒露(かんろ)|15 日 35 分 5 秒|
437
+ |啓蟄(けいちつ)・秋分(しゅうぶん)|15 日 1235 分 5 秒|
438
+ |春分(しゅんぶん)・白露(はくろ)|15 日 2435 分 5 秒|
439
+ |清明(せいめい)・処暑(しょしょ)|15 日 3635 分 5 秒|
440
+ |穀雨(こくう)・立秋(りっしゅう)|15 日 4835 分 5 秒|
441
+ |立夏(りっか)・大暑(たいしょ)|15 日 5835 分 5 秒|
442
+ |小満(しょうまん)・小暑(しょうしょ)|15 日 6835 分 5 秒|
443
+ |芒種(ぼうしゅ)・夏至(げし)|15 日 7835 分 5 秒|
444
+
445
+ これは第11表に相当する
446
+
447
+ 11月ではこのうちの 小雪(14秒5235分5秒)、大雪(14日4235分5秒) のみ使用していた
448
+
449
+ 12月以降を求めたい場合は、上記の定数を二十四節気の並びに合わせて順次使用する
450
+
451
+ ![12月以降の入定気](../../../../images/12月以降の入定気.png)
452
+
453
+ 12月経朔の入定気は、上図のように弦を4回足して得られる
454
+
455
+ 定数を越えるたびに差分を取り、次の入定気として繰越し続ける
456
+
457
+ 例えば最初は加算は次の通りである
458
+
459
+ `11月経朔の入定気` (10-2604.2) + `弦` (7-3214.2) = 17-5818.4
460
+
461
+ これは小雪定数以上なので、定数を差し引いて次の入定気とする
462
+
463
+ `加算結果` (17-5818.4) - `小雪定数` (14-5235.5) = 3-582.7
464
+
465
+ なお定数と同じく1分=8秒であることに注意する
466
+
467
+ この 3-582.7 は小雪の次の大雪に属することとなる
468
+
469
+ このように順次加算しつづけた結果、12月経朔の入定気、 冬至 10-5990.0 が得られる
470
+
471
+ #### 12月の二十四節気から太陽の運動の補正値を求める
472
+
473
+ ここは全く11月経朔と変わらないため過程は割愛する
474
+
475
+ 冬至 10-5990.0 で「24気損益眺朒数」から対象の値を引いて計算する
476
+
477
+ 結果、 +338 を得る
478
+
479
+ #### 11月の月の進退を進めて12月の月の進退を求める
480
+
481
+ 次に12月経朔に対応する月の進退を求める
482
+
483
+ ![12月以降の月の進退](../../../../images/12月以降の月の進退.png)
484
+
485
+ 基本的な求め方は太陽の時と変わらない
486
+
487
+ 12月経朔の月の進退は、上図のように弦を4回足して得られる
488
+
489
+ ただし、1分=100秒で計算しており、弦が 2/8 = 25/100 になっていることに注意する
490
+
491
+ 11月経朔の時と同様、 `暦中日(暦周の半分)` (13-6529.095) 以上 であれば減算し、合わせて進退を逆転させる
492
+
493
+ このように順次加算しつづけた結果、12月経朔の月の進退、 退4-2245.475 が得られる
494
+
495
+ #### 12月の月の進退から月の運動の補正値を求める
496
+
497
+ ここは全く11月経朔と変わらないため過程は割愛する
498
+
499
+ 退4-2245.475 で表から対象の値を引いて計算する
500
+
501
+ 結果、 -2278 を得る
502
+
503
+
504
+ #### 太陽・月の運動の補正値から12月定朔(補正後の月初日)を求める
505
+
506
+ これまでの結果をもとに定朔を求める
507
+
508
+ `12月経朔` (22-320) + `太陽の運動の補正値` (+338) + `月の運動の補正値` (-2278) = 21-6780
509
+
510
+ ただし、このパターンはこれで終わりではない
511
+
512
+ これは11月12月といった話とも全く関係がないが、 [進朔](http://eco.mtk.nao.ac.jp/koyomi/wiki/C2C0B1A2C2C0CDDBCEF12FBFCABAF3.html) により1日分増える
513
+
514
+ 具体的には、小余が1日の3/4、つまり 8400 * (3/4) = 6300 以上の場合、大余を1つ加算する必要がある
515
+
516
+ つまり、以下により12月定朔は確定する
517
+
518
+ 21-6780 + 大余1 = 22-6780
519
+
520
+ ### 1ヶ月ごとの固有値を求める
521
+
522
+ これまでは定朔を求めてきたが、この定朔をもとに月ごとの固有値を求める
523
+
524
+ この計算は当月と次月の定朔を必要とするため、例として11月定朔/12月定朔を使うことにする
525
+
526
+ #### 月の大小を求める
527
+
528
+ 太陰太陽暦において1ヶ月の日数は29日または30日である
529
+
530
+ 求め方は『日本暦日原典』凡例のp.6を参照した
531
+
532
+ これを求める上で、朔日の大余(1日を示す単位)を比較する
533
+
534
+ 例えば、 11月の朔日(定朔)が 52-2655 で、 12月の朔日(定朔)が 22-6780 の場合、52 と 22 を取り出し、 差分が10で割り切れるかを検証する
535
+
536
+ 52 - 22 = 30 は10で割り切れるため、これは11月は大の月(30日)である
537
+
538
+ もし割り切れない場合(差分が29の場合)は小の月(29日)である
539
+
540
+ なお、引用元では定朔の干支から求めているが、干支の元ネタが大余のため、実装の容易さから上記のような解説となった
541
+
542
+ #### 二十四節気の所属を求める
543
+
544
+ その月が何月であるかは二十四節気の中気にあることはすでに述べた通りである
545
+
546
+ ここでは中気節気と月を対応させることにする
547
+
548
+ 求め方だがこれは確たる引用元がない
549
+
550
+ 『日本暦日原典』においても同著者の「宣明暦に関する研究」に遡っても言及がなかった
551
+
552
+ ただし以下のようにすれば『日本暦日原典』通りに求めることができる
553
+
554
+ 11月定朔を求める時に、前年冬至として 11-2730 を求めていた
555
+
556
+ また、 `気策(24分の1年)` (15-1835.5) が定義されており、二十四節気のそれぞれの間隔が固定値であることが分かる
557
+
558
+ つまり、 `前年冬至` (11-2730) + `気策(24分の1年)` (15-1835.5) = `小寒` (26-4565.5) ≒ 26-4565
559
+
560
+ 結果から秒は省略する(切り捨てる)
561
+
562
+ これを繰り返すことで二十四節気それぞれの値を得ることができる
563
+
564
+ もし前年冬至〜当年冬至まで処理を繰り返す場合は、単に24個分を求めるというよりは、
565
+ 前年大雪(前年冬至 - 気策)、当年冬至、当年小寒まで求めておいた方が良い
566
+
567
+ こうして得られた二十四節気を11月から順に比較していく
568
+
569
+ 11月を例に取ると、 11月定朔( 52-2655 ) <= 二十四節気 < 12月定朔(22-6780) である
570
+
571
+ すでに言及した通り大余は60で一巡して0になるため、範囲計算はそれを考慮して行う必要がある
572
+
573
+ 11月には前年大雪( 56-894 )と前年冬至( 11-2730 )が含まれているため、これが11月の中気/節気(取り上げた順番に従うと 節気/中気)となる
574
+
575
+ 以上の手続きで『日本暦日原典』通りの結果が得られる
576
+
577
+ # 結語
578
+
579
+ 暦共通・宣明暦の暦算は以上である
580
+
581
+ 今後は複数の暦を扱い、適宜ページ分割していくことにしたい
582
+
583
+ # 参考文献
584
+
585
+ * 内田 正男『日本暦日原典』雄山閣出版 1975(1975)
586
+ * [「安藤有益著『再考長慶宣明暦算法』 について」](http://www.kurims.kyoto-u.ac.jp/~kyodo/kokyuroku/contents/pdf/1444-9.pdf)