「復活祭の満月」による太陰太陽暦

昨日の、

| もし1年の日数が今回計算したパターンになるような太陰太陽暦を定義して、

を、ちょっと定義してみました。

月の長さと名前は適当です。

require 'pp'
require 'when_exe'
include When

module CalendarTypes

 #
 # Easter Calendar
 #
 class Easter < TableBased

  # 復活祭の満月
  EasterFullMoon = CalendarNote('Christian?w=7')

  # 年初の通日
  #
  # @param [Array] date ( 年 )
  #
  # @return [Integer] 年初の通日
  #
  def _sdn_(date)
   EasterFullMoon.easter(date.first) - 13
  end

  private

  # オブジェクトの正規化
  def _normalize(args=[], options={})
   @label = 'Easter'

   # Month & Day Index
   @indices ||= [
    When.Index('Jewish::Month', {:branch=>{-1=>When.Resource('_m:Jewish::IntercalaryMonth::*')[0],
                      1=>When.Resource('_m:Jewish::IntercalaryMonth::*')[1]},
                  :shift=>6}),
    When::Coordinates::DefaultDayIndex
   ]

   # Month & Day Arrangement
   @rule_table ||= {
    353 => {'Length'=>[30,29,29,29]  + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12'  },
    354 => {'Length'=>[30,29,30,29]  + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12'  },
    355 => {'Length'=>[30,30,30,29]  + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12'  },
    356 => {'Length'=>[30,30,30,30]  + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12'  },
    382 => {'Length'=>[29,29,29,29,30] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12*,12='},
    383 => {'Length'=>[30,29,29,29,30] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12*,12='},
    384 => {'Length'=>[30,29,30,29,30] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12*,12='},
    385 => {'Length'=>[30,30,30,29,30] + [30,29]*4, 'IDs'=>'1,2,3,4,5,6,7,8,9,10,11,12*,12='}
   }

   super
  end
 end
end

EasterLuniSolar = Calendar('Easter')

5_700_000.times do |year|
 full_moon = CalendarTypes::Easter::EasterFullMoon.easter(year)
 nisan_14th = tm_pos(year,1,14, frame:EasterLuniSolar).to_i
 pp [year, full_moon, nisan_14th] unless full_moon == nisan_14th
end


たしかにズレは一回も起こりません。

「復活祭の満月」は過ぎ越しの月の14日に固定されます。

この記事へのコメント

この記事へのトラックバック