「0年」というのがあるという事を初めて知った

今、サイモン・シン「宇宙創成」という本を読んでいます。すごく面白いです。前作の「暗号解読」、前々作の「フェルマーの最終定理」も良かったのですが、今回も期待通りです。サイモン・シンにハズレなしですね。

文庫版上巻120ページで以下のような記述を見つけました。

延々と年数を数え上げ、歴史の研究を積み重ねた結果、アッシャーはついに、天地創造は紀元前4004年の10月22日土曜日だったと宣言することができた。

17世紀のアイルランドの人が聖書とその他の歴史書の日付を数え上げて整合性を取り、聖書が主張する天地創造の日付を決定したと言う話。それが「紀元前4004年の10月22日土曜日」だとのこと。
なんだか、この「土曜日」と言うのが気になってrubyで確認してみました。本当に紀元前4004年の10月22日は土曜日なのか?*1


特定の日付の曜日を知りたいときはDateクラスのwdayメソッドを使います。

wday

曜日を返します (0-6、日曜日は零)。

http://www.ruby-lang.org/ja/man/html/Date.html

Dateクラスのコンストラクタに年月日を渡すと日付オブジェクトが作れるのでrubyのコードは以下のようになります。

irb(main):010:0> Date.new(-4004,10,22).wday
=> 5

5が返ってくると言うことは金曜日をあらわしています。おかしいな。


rubyのDateクラスのリファレンスをもう一度読み直してみると、以下のようにあります。

このクラスでは、紀元前の年を天文学の流儀で勘定します。 1年の前は零年、零年の前は-1年、のようにします。

http://www.ruby-lang.org/ja/man/html/Date.html

つまり、紀元前4004年はrubyでは-4004ではなくて、-4003と表現するのが正しいということのようです。
やり直します。

irb(main):014:0> Date.new(-4003,10,22).wday
=> 6

6が返ってきたので土曜日で間違いないようですね。


西暦1年の前の年は紀元前1年だとばかり思っていましたが、場合によっては「0年」というのを使うことがあるそうです。

西暦(キリスト紀元)は0年を設けないが、ISO 8601:2004や天文学における暦(Astronomical year numbering)では西暦0年を設定している。具体的には紀元前1年を「西暦0年」と置き替え、紀元前2年を負数で「−1年」と表現しつつ紀元前の年を1年ずつずらして用いている。これは、「1」の次に「−1」が続く西暦をそのまま適用しようとすると整数の原則に反してしまい、コンピューターを用いて日食など天文学的事象を演算する際に不具合が生じるためである。

0年 - Wikipedia

紀元前の日付を扱うこともあまりないような気もするのですが、意外とはまりどころだったりするかもしれません。


サイモン・シンといえば「フェルマーの最終定理」に触発されて円周率の近似値をrubyで求めたことがありました。


サイモン・シンの本を読むとコードが書きたくなるのでプログラマーの人は読んでみるといいかもしれません(適当)。

宇宙創成(上) (新潮文庫)

宇宙創成(上) (新潮文庫)

宇宙創成(下) (新潮文庫)

宇宙創成(下) (新潮文庫)

フェルマーの最終定理 (新潮文庫)

フェルマーの最終定理 (新潮文庫)

*1:まあサイモン・シンがすでに確認しているとは思いますが。