SS blog

C/C++/javaについての話題

イエス・キリスト処刑の日はいつか? 13日の金曜日?

イエス・キリスト処刑の日は、「13日の金曜日」なんて言いますが、これは正しいでしょうか?

エス処刑の日を聖書の記載を追ってどこまで特定できるのかチャレンジしたいと思います。

日にち

マタイによる福音書 26:2 には、イエスのいわゆる「最後の晩餐」の日は過越祭の2日前である事が書かれています。

"post biduum Pascha fiet" 2日後には過越祭が行われる

過越祭はユダヤ最大の祝いの日で、春分の日の次の太陰暦14日に行われることになっています。

この「最後の晩餐」の夜にイエスは逮捕され、翌日には処刑されるので「13日の金曜日」の中の「13日」に関しては太陰暦の日付ではありますが正しいという事になります。

曜日

曜日の方はどうでしょう。

マタイによる福音書 28:1 で、イエス復活についてこのように書かれています。

post sabbatum, cum illucesceret in primam sabbati,

安息日の後、安息日翌日の夜明けに」

安息日は土曜日ですから、イエス復活は日曜日という事になります。復活祭を日曜日に行う所以ですから当然とも言えます。

エス復活の日は、マタイ 27:63 には以下のように記されています。

Post tres dies resurgam 3日目に蘇るであろう

処刑の日から3日目と書かれており、復活が日曜日なら処刑は金曜日という事になります。

どうやら「13日の金曜日」は正しいようです。

年の特定はできるでしょうか?

上記を総合すると、イエスが処刑された日は、春分の後の太陰暦13日が金曜日である年にイエスが処刑された事になります。

エルサレムの出来事ですから時差+1Hとして、紀元30年前後の春分の後の太陰暦13日を列挙してみます。
春分の日

ユリウス暦日付 曜日 備考
20年4月23日  
21年4月12日*  
22年4月2日*  
23年4月20日  
24年4月9日  
25年4月13日*  
26年4月18日*  
27年4月13日  
28年3月27日*  
29年4月14日*  
30年4月3日  
31年3月23日* 春分の日当日が太陰暦13日
31年4月22日 春分の日の後の太陰暦13日
32年4月10日*  
33年4月13日  
34年4月19日  
35年4月9日*  
36年3月28日  
37年4月16日  
38年4月5日*  
39年4月13日  

列挙はしてみたものの特定は難しい言えます。

太陰暦13日と言っても日本の旧暦基準の方式がユダヤ教世界で同じだったと思いません。それで金曜だけでなく前後の木曜日と土曜日にも「*」マークを付けました。

とりあえず、年の特定にはこれ以上の知恵はありませんので、考察は以上とします。

よくある暦の勘違い

現代人は小学校で地動説をならいます。

ただし、小学校でならう地動説はいささか中途半端です。小学生の知識としては良いのですが、暦を考えるとき中途半端な地動説は間違った天動説より悪い結果をもたらすことがあります。

地球が太陽を一周公転すれば「1年」、地球が一回自転すれば「1日」。

こう思ってはいないでしょうか。

これは少なくても、「1年」や「1日」の定義として正しくありません。

どう正しくないのか示しましょう。

クイズです。「1年間に地球は何回自転するでしょうか」

「365回」と答える人が居るかもしれません。

より正確に「約365と1/4回」と答える人もいるかもしれませんし、少数で「約365.2425回」と答える人もいるかもしれません。

しかし、全員まとめて不正解です。

一日とは

正しくは「約366と1/4回」です。つまり1回分計算から漏れているのですが、この原因は、地球が一回自転すれば「1日」という定義の誤りのためです。

心静かに地動説を忘れれば、「1日」は見かけの太陽が一回りすることと思うはずです。何故、これが自転の周期と一致しないのでしょう。

実際、1日は24時間ですが、地球の自転周期は約23時間56分です。4分のズレがあります。

地球の一日は自転と公転の複合で作られます。地球がきっちり1回自転した時、公転により地球の位置が変わるため、見かけの太陽の位置が変わっており、あと4分自転を続けなければ、見かけの太陽が一周位置に戻らないのです。

一年とは

さて、では何故1年の定義は1公転でないのでしょう。

これも地動説を忘れて考えてみてください。1年とは季節が巡る周期です。見かけの太陽の高さが変わる周期と言っても良いでしょう。

それが公転の周期と一致しないので、地球が「歳差運動」しているからです。

地球の地軸は好転面に対して23.4度傾いており、これが季節を生じさせる元となっているのですが、歳差運動とはこの地軸が傾いている方向が約25800年かけて一周する運動です。25800年もかかるのなら無視してもよいのではと思われそうですが、確かにこれから生じる誤差は日常感じられる大きさではありませんが、無視できるほど小さくはありません。かつてユリウス暦があり、その誤差に耐えられずグレゴリウス暦が導入されましたが、歳差運動による誤差の量はユリウス暦の誤差の2倍ほどあります。

 

時刻の不思議

ここでいう「時刻」とは一日の中の時点を示す「〇時〇分〇秒」の事です。

時刻の2つの系統

この時刻には実は複数の種類があるのですが、大別するなら2つの系統があります。

1つは1日を必ず86400秒(=24×60×60)とする時刻、もう一つは時々そうしない時刻です。

我々が日常使っているのは後者の時刻ですが、何の話をしているか気付いたでしょうか。

閏秒」の事を言っています。

閏秒は稀にニュースになるので知っている人もいるかと思いますが、時々「今日は時刻を正すため、普段より1秒少なく、23時59分59秒までとなります。」などと報道されるものです。

この閏秒のために1日が86400秒とならないことがある時刻の系統を「世界時」等と呼び、閏秒無しで必ず1日が86400秒とする時刻の系統を「地球時」等と呼びます。

当然両者は年月を経るに従って乖離していき、2024年では1分13秒もズレが生じています。

閏秒が必要な理由は、そうやって時刻を補正しなければズレがどんどん蓄積されて、やがては、今日は午後の12時に日の出になります、なんてことになってしまいます。

では、そういう補正をしない地球時は誰が使うのかと言うと、科学者です。「1日」の物理量が年によって違うなんて事では科学者は困ります。地球時は必要なのです。

いやそもそも時計が不正確なだけだから、現代のテクノロジーでもって1日を測る時計の精度を上げれば良いだけでないか、と思った人もいるでしょう。

そうではありません、時計は十分に正確なのです。閏秒を必要とする原因はそこではなく、他にあります。

地球は生卵

卵をテーブルの上でくるくると回転させた時、茹で卵は安定して回り続けるのに対して、生卵だと回るスピードにムラができて安定してしません。

地球は茹で卵か生卵かといえば、生卵の方です。地球の表面こそ地殻がありますが、多くは海の水を満たしており、地殻の下もドロドロに熔けたマントルが対流しています。そのため、地球の自転速度は生卵のように安定せず、とどのつまり、1日の長さが長くなったり短くなったりします。

しかもそれは全くの不規則で、2,3年後に今より早くなっているのか遅くなっているのかさえ現代科学をもってしても予想できません。

予想ができない以上、実際にズレが生じたことが観測されたらズレを正すということをするしかありません。それが閏秒です。

ΔT

閏秒で生じたズレはその度に積算されていくのですが、積算されたズレの事を「ΔT」といいます。上に書いた通り予測困難であり、未来だけではなく過去どうであったかも正確には知りえません。

閏秒がプラスのこともマイナスの事もある、ならば長い年月では平均化されてゼロに近づくのでは、という期待は完全に誤りです。生卵の回転が次ぐに止まってしまうのと同様、地球の自転速度は長期的には減少していきます。にも拘わらずここ数十年は地球の自転速度は速くなり続けています。何故かという理由はありません、予測困難とはそういう事です。

紀元元年くらいに遡ればΔTは3時間にもなり、紀元前3世紀くらいにはなんと20時間にも及びます。

 

ΔTはおそらく、昔の暦あるいは天体現象を計算する上で最も確度の低い情報と言えるでしょう。
地球・月・太陽と言った天体が特定の時刻にどの位置にあるかは紀元前遡っても観測と天体力学の計算で高い精度で算出することができます。それによって紀元前○○年に皆既日食が起こったであろうことを言い当てることもできます。ただし、皆既日食が起っている時に地球がどっちの方向を向いているのか、つまり地球のどの地域で皆既日食が見えているのかが、遥かに精度が下がってしまうのです。

では現代の科学者はどうやって紀元前のΔTを求めているのでしょうか。

それは基本的には上に書いた事の真逆の発想です。つまり地球で日食・月食など観測された記録を繋ぎ合わせる事で統計的にΔTを推測しているのです。

その点で、ΔTは世界時と地球時の差と説明しましたが、別の見方としては特定時刻に地球がどっちを向いているかを示す指標がΔTという事も出来ます。

 

変わったローマの日付表記について

今日我々が使用している暦の起源は古代ローマです。

古代ローマの暦がどのようにできたかは面白い話ですが、解説しているサイトは複数あるので、ここでは古代ローマで日付をどのように表記したかを解説したいと思います。

非常に変わっていますが、ローマ人の独特の感性がよく分かるかと思います。

ローマの日付表記

ローマの暦そのものは特別なものではない、というか今と同じです。ローマの暦が今に至るまで使われているのですから当たり前です。

今と違うのは日付をどう表記するかです。

ローマ人は数は後ろから数えるのが好きなのです。それが端的に表れるのがローマ数字で、「I」、「II」、「III」、ときて次の4は「IV」つまり「5の一つ前」と表記します。9は「IX」、つまり「10の一つ前」です。こんな発想の数の表記が数を数えるほぼ全てにあり、日付も例外ではありません。

例えば「1月17日は」以下のように表記します。

  • a.d. XVI Kalendas. Februarias

「a.d.」って何?「1月」なのに「Februarias」、「17日」なのに「XVI 」、これは如何に・・という第一印象ではないでしょうか。

このラテン語は直訳としては「2月1日の16日前の日」の意味となります。「a.d.」は「ante diem ~日前」を略したもので「A.D.紀元」とは関係ありません。

現代感覚では甚だ奇妙に感じるかと思いますが、ちょっと面白いと思えた人は続きを読んでください。

詳しい説明は順を追ってしていきます。

 

月の名称

ラテン語の月の名称は以下の通りです。

言語による変化をしながらも今日までこの月名が使われ続けている事が分かります。

 

ラテン語 意味
1月 Ianuarius 出入り口の神ヤヌス
2月 Februarius 「浄化」を意味か?
3月 Martius 戦争の神マルス
4月 Aprilis 美の神アプリーレか
5月 Maius 春の神マイア
6月 Iunius ユピテル神の妻ユノー
7月 Quintilis 5番目の月(後にIulius ユリウス)
8月 Sextilis 6番目の月(後にAugustus アウグストゥス)
9月 September 7番目の月
10月 October 8番目の月
11月 November 9番目の月
12月 December 10番目の月

ラテン語の月名は品詞で言えば形容詞です。元々は「memsis 月」を形容していたと考えられていますが、ラテン語は形容詞単独の場合は名詞と見做しますので文法的には問題ありません。

月日の表記

冒頭でローマの日付は逆算で表記すると説明しましたが、常に翌月初から逆算するのではなく、月の中の3か所、カレンダエ Kalendae、ノーナエ Nonae、イードゥス Idusと呼ばれる区切りの良い日から逆算します。それぞれ月の先頭、1/4地点、1/2地点のようなものなのですが、元々は月の新月、半月、満月の日だったのでしょう。

これら3つの日は大の月か小の月かで決まります。と言っても古代と現代では大の月、小の月は違うので、どちらを基準にするか流儀が分かれるようですが、一般にはあくまで古代基準にするようですので、そちらに従うことにします。

月の大小は下記のとおりです。

  • 小の月

1月、2月、4月、6月、8月、9月、11月、12月

  • 大の月

3月、5月、7月、10月

カレンダエ 、ノーナエ、イードゥースは月の大小に応じて以下の日になります。

  大の月 小の月
カレンダエ 第1日 第1日
ノーナエ 第7日 第5日
イードゥス 第15日 第13日

Kalendae、Nonae、Idusは何れもラテン語の女性名詞複数形主格です。実際に文中で使用されると奪格または対格への語尾変化を起こしますが、その説明をしだすとローマの日付の話ではなくラテン語文法の解説になってしまいそうですが、その話はいずれ改めてするかもしれないこととし、以後は語尾を省略して説明します。

Kalendae、Nonae、Idusをそれぞれ「Kal.」、「Non.」、「Id.」と略します。主格も奪格も対格も同じ略ですので、とりあえずは語尾変化のことを考えなくてもよくなります。

話を戻しますが、順を追って説明します。

(1) カレンダエ 、ノーナエ、イードゥスの日の日付は、そのまま表記します。

「1月1日に」 Kal. Ian.

「2月5日に」 Non. Feb.

「3月15日に」 Id. Mar.

(2) カレンダエ 、ノーナエ、イードゥスの前日は「前日に pridie プリディエ」と表し、「prid.」と略します。従って、上記日付の1日前は、

「12月31日に」 prid. Kal. Ian.

「2月4日に」 prid. Non. Feb.

「3月14日に」 prid. Id. Mar.

となります。

(3) カレンダエ 、ノーナエ、イードゥスの前々日は「2日前に」ではなく「3日前に」と表現します。当日を「1」と数え始め、前々日を「3」とするのが古代ローマ流ですので、そういうものだと思うしかありません。「~日前に」は前置詞を用いて「ante diem ~」、略して「a.d.」と表します。従って、

「12月30日に」 a.d. III Kal. Ian.

「2月3日に」 a.d. III Non. Feb.

「3月13日に」 a.d. III Id. Mar.

となります。

(4) 閏年の2月は特別ルールがあります。平年より1日多くなるのは今と同じですが、1日の挿入場所が奇怪です。「2月25日」に相当する日に「第2の2月24日」を挿入します。

なんの事かと思われそうですが、2月22日以降の日付は以下の通りです。「bis」が「第2の」です。

「2月22日に」 a.d.VIII Kal. Mar.
「2月23日に」 a.d.VII Kal. Mar.
「2月24日に」 a.d.VI Kal. Mar.
「2月25日に」 a.d.bis VI Kal. Mar.
「2月26日に」 a.d.V Kal. Mar.
「2月27日に」 a.d.IV Kal. Mar.
「2月28日に」 a.d.III Kal. Mar.
「2月29日に」 prid. Kal. Mar.

なぜこんな事をするのでしょう。

それはローマ人の大切なテルミヌスの祭典の日である「テルミナリア  Terminalia」の日付が閏年も平年同様に「a.d.VII Kal. Mar.」となるようにするためとされています。

ちなみにこの閏年の挿入日「bis VI」は省略なしで書くと「bis sextum」ですが、これが今日英語で閏年の事を「bissextile year」と呼ぶ語源となっています。

月日のルールは以上です。

古代ローマの時代、当然ながらキリスト教発祥である現在の西暦年はありません。年を特定する時は多くの場合、その年にコンスルを務めた2名の名前で示しました。

例えば「MメッサラとMピソが執政官の年 M. Messala, M. Pisone consulibus」(紀元前61年)という具合です。

日常的な会話ではこれが標準だったようですが、数十年レベルの出来事を表すとなると不便です。数字で表す方式もちゃんとあって、「ab urbe condita 都市ができてから」略して「A.U.C」と呼ばれる方式で、紀元前753年とされるローマ建国年を元年とする方法です。

紀元前264年であれば「A.U.C. CDXC(=490)」と表します。

ラテン語

避けてきたラテン語文法の話ですが少しだけ触れておきます、

これまで「Id. Mar 3月15日」「prid. Id. Mar. 3月14日」「a.d. II Id. Mar. 3月13日」とラテン語を略して説明しましたが、略さず表記すると以下のようになります。

  • Idibus Martiis
  • pridie Idus Martios
  • ante diem III Idus Martios

単語の語尾が微妙に違う事に気づいたでしょうか。最初に2つは奪格に変化し、3つ目は対角に変化しています。

「格」というのは日本語の「てにをは」に相当するもので、単語に機能を与えます。時間を示す単語を奪格にした場合は福祉的に「~に」という意味になります。

3つ目が対格となるのは前置詞anteに含まれる後は無条件に対格にする「対格支配」というルールがあるためです。anteは「~前に」の意味です。

 

もう一つ面白い話というべきか分かりませんが、ラテン語は後ろから逆算したがるというのは数に関わるほぼ全てであるのですが、時として

普通の数字も何某かの区切りに近づくと逆算が始まります。例えば「18」は「duodeviginti」で超直訳の意味は「20まで2」と言うところです。

これが日付で使われると、例えば「8月15日」は省略なしで書くと

「ante diem duodevicesimum Kalendas Septembres」(a.d.XVIII Kal. Sept.)

となりますが、超直訳の意味は「7番月の朔日20の2つ前の日前」と、コントのような事になります。無理に超直訳すればなのですが。

フランス共和暦

テーマ

フランス革命期に使われた「共和暦」、「テルミドールのクーデター」「ブリュメールのクーデター」等の事件名で見え隠れするものですが、革命の終焉と共に廃止されたこの暦を現代に蘇らせようというというのが本書のテーマです。
平たく言えば、「今日は共和暦の日付では○○月××日です」と言ってみたいという事です。なぜなら「テルミドールのクーデター」とか格好良いではないですか。

この事についてネットを検索すると、口を揃えて「それはできません」という解説ばかりです。
理由としては「なぜなら共和暦は閏年の定義が未完了だからです」という事ですが、さてそれは本当でしょうか?
それが定説となっているなら、これから説明する事は共和暦の「修復」といって良いでしょう。

修復は可能ですので興味のある人は先を読み進んでください。

なお、共和暦は「フランス革命暦 Calendrier révolutionnaire français」とも呼ばれますが、ここでは「共和暦 Calendrier républicain」で統一します。

革命

共和暦の修復の前に、フランス革命の経緯を簡単に振り返っておきます。

フランス革命は「2階建て」の革命です。
革命当初に革命を主導したのは金持ちの平民すなわち「ブルジョワ」で、彼らブルジョワの革命が1階部分です。このブルジョワ革命の中でさらにジャコバン派極左勢力が台頭して共和制を樹立し独裁的な政治を行ったのが2階部分です。
この2階部分は1794年のテルミドールのクーデターで短命のうちに消失するのですが、1階部分は後のナポレオン帝政以降においても、政体以外の諸制度は、という事になりますが継承されていきます。要するに当時のフランス内部諸勢力のパワーバランスの重心は1階部分にあったのだという事なのでしょう。

さて、共和暦は2階部分の改革の一環で行われています。冒頭で「革命暦」ではなく「共和暦」に統一するとしたのもこの理由からですが、そのため共和暦は2階部分消失後に推進者を無くし、1799年ナポレオンが第一統領として権力を握った時、1805年12月31日をもって共和暦を廃止することをローマ教皇と合意します。
結局共和暦が使われたのは13年間という事になります。

 

我々が日常で使う暦、グレゴリウス暦は大の月と小の月が不規則に並ぶいささか歪な暦です。誰しもそう感じたことがあるのではないでしょうか。それをきれいさっぱりに整理しようという事です。

共和暦は革命の1792年9月22日から実際に使われ、1805年12月31日を最終日として革命の終焉と共に廃止されました。「テルミドール」、「ブリュメール」等、世界史に出てくる単語は共和暦における月の名前です。共和暦の日付の名称がつけられた出来事は、共和暦が使われた期間の出来事であることを示しています。

共和暦の日付

共和暦はグレゴリウス暦の面倒臭さ最大の原因である月の日数の不揃い、不規則を一掃し、全ての月を30日としました。
これで月は見違えるようにすっきりするのですが、そうすると1年は365日か366日なので、30日の月を12回おくと、5~6日の余りができてしまいますが、この余りをどの月にも属さない祝日、名付けて「サンキュロットの祝日 sanculotides」としました。
余りを最後に纏めたため、各月には31日という素数は消えて、30日というキリの良い数で統一されました。
さらに曜日は従来の「七曜」を「十曜」に改めました。とにかく「10の倍数に統一すべし」という事です。
上記から共和暦のカレンダーは以下のようになります。
①~⑩は曜日です。

1月 vendémiaire (葡萄月)
 ①  ②  ③  ④  ⑤  ⑥  ⑦  ⑧  ⑨  ⑩
 1  2  3  4  5  6  7  8  9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30

2月 brumaire (霧月)
 ①  ②  ③  ④  ⑤  ⑥  ⑦  ⑧  ⑨  ⑩
 1  2  3  4  5  6  7  8  9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
            ・
            ・
12月 fructidor (果月)
 ①  ②  ③  ④  ⑤  ⑥  ⑦  ⑧  ⑨  ⑩
 1  2  3  4  5  6  7  8  9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30

サン・キュロットの祝日(sanculotides)
 1  2  3  4  5 (6)

共和暦のカレンダーはグレゴリウス暦のように毎年違うカレンダーになる事はありません。異なる可能性あるのは、最終日の「(6)」、閏日があるか否かのみです。
「5月14日は何曜日だろうか・・・」などと調べることもありません。④曜日に決まっているからです。
今までグレゴリウス暦のためにどれだけしなくていい苦労をしてしまったのか・・と思えてきます。
ところが共和暦は当時のパリ民衆には大不評だったようです。理由は7日に一回の日曜日の休日が、10日に一回になってしまうからです。メートル法は革命後も残り世界に広まりましたが共和暦は革命と共に消えた理由はそういうところにあるのでしょう。

共和暦は日付だけではなく時刻も変更し、「24」とか「60」という数字を排除し、十進数化しています。
すなわち、

  • 1日は10時間
  • 1時間は100分
  • 1分は100秒

です。
1日は10万秒という事になります。

3時78分7秒から4時25分99秒まで何秒かかるか?
答えは、4792秒(=42599-37807)で、それは47分92秒です。
もはや快感です。
実際にこの十進時間の時計も作られましたが、当時のフランスの人はさぞかし時刻で混乱した事でしょう。フランス国内ならまだしも、外国人とどこかで決まった時刻待ち合わせようとすると少なからず行き違いがあったに違いありません。

共和暦は1792年9月22日を元年(=第1年)元日(=1月1日)として始まりましたが、だからと言って翌年以降グレゴリウス暦9月22日が共和暦元日という訳ではありません。
それが成り立つのは、共和暦の閏年のルールをグレゴリウス暦と同じであると定めた場合ですが、共和暦はその選択をしませんでした。
この話は本書の肝の話なので、後で改めて説明する事にします。

月や日の名前

共和暦は確かに簡明で合理的ですが、反面「無機質」と感じられます。そのためかグレゴリウス暦に倣って各月に名前が付けられました。
グレゴリウス暦の月名は古代ローマ時代につけられたもので、ローマの神とカエサルアウグストゥスの名前が月名となりました。

フランス革命の精神としてはこういう宗教や権威を崇めるためのネーミングは不合理な事として排除され、代わりに自然や人々の生活に基づいた名前としたのでしょう。

曜日には名前を付けませんでしたが理由は分かりません。
その代わり、という訳ではないでしょうが、366日全てに名前を付けました。さすがに覚えきれなかったようですが、ゲン担ぎの足しになるかもしれないのでこれは巻末に乗せておきます。

月名の話に戻りますが、自然や人々の生活に基づいたと説明しましたが、共和暦の1月はグレゴリウス暦の9月~10月である事は留意してください。でないと、月名と季節の出来事が合わなくなってしまいます。

フランス革命暦
  • 1月 vendémiaire 葡萄の月
  • 2月 brumaire 霧の月
  • 3月 frimaire 霜の月
  • 4月 nivôse 雪の月
  • 5月 pluviôse 雨の月
  • 6月 ventôse 風月
  • 7月 germinal 芽月
  • 8月 floréal 花月
  • 9月 prairial 牧月
  • 10月 messidor 収穫月
  • 11月 thermidor 熱月
  • 12月 fructidor 実月

元日と閏年

共和暦では毎年の秋分の日が元日と定められました。従って翌年の秋分の日が365日後ならその年は平年、366日後なら閏年という事になります。
ルールは簡潔なようですが、これは悪い選択でした。そんなルールでは一般人にとって閏年は不規則に挿入されるものとなり、天文学者でなければ暦を作れなくなってしまい、折角十進法中心に揃えた日付・時刻の系列に「不規則」が紛れ込んでしまいます。
共和暦は1792年9月21日に初めて国民公会が召集された日王政が廃止され翌日から共和制となったため、9月22日を元日としたのですが、全く偶然にこの日は秋分の日で、革命指導所はこの偶然に革命精神とは相いれないロマンなり天啓なりを感じてしまったのかもしれません。あるいは単に革命指導者には暦の基本的な知識がなかったのかもしれません。
その不合理は布告公布後すぐに天文学者のドランブルから指摘される事となり、閏年グレゴリウス暦にならったルールに変更する事が検討されたようですが、如何せん恐怖政治の混乱の中でうやむやになってしまいました。
結局公式に布告(decrée)された閏年のルールは下記の通り、秋分の日が元日ということです。
「Chaque année commence à minuit, avec le jour où tombe l'équinoxe vrai d'automne pour l'Observatoire de Paris.」
「各年はパリ天文台における真秋分日の真夜に始まる。」

この布告の中で「パリ天文台における真秋分日」というところには注意が必要です。フランスは時差「+1時間」とうっかり考えてしまいそうですが、それは現代の協定時刻の事であり、当時はそういうものはありません。パリ天文台は東経2度20分にあるのでグリニッジとの時差は「+0.16時間」という事になります。
これを間違えると真秋分の日付が変わり、共和暦を計算で求めることができなくなってしまいます。

上記に基づき日付の計算をしたところ、結果は下記の通りです。

秋分の日
(グレゴリウス暦)
共和暦年 共和暦閏年
1792年9月22日 I年  
1793年9月22日 II年  
1794年9月22日 III年 閏年
1795年9月23日 IV年  
1796年9月22日 V年  
1797年9月22日 VI年  
1798年9月22日 VII年 閏年
1799年9月23日 VIII年  
1800年9月23日 IX年  
1801年9月23日 X年  
1802年9月23日 XI年 閏年
1803年9月24日 XII年  
1804年9月23日 XIII年  
1805年9月23日 XIV年  
1806年9月23日 XV年 閏年
1807年9月24日 XVI年  
1808年9月23日 XVII年  
1809年9月23日 XVIII年  
1810年9月23日 XIX年  
1811年9月23日 XX年 閏年
1812年9月23日 XXI年  

上記の通り、秋分の日が特定できればその日は元日ですから他の日も秋分の日から何日後かを調べれば共和暦の日付に置き換える事は簡単にできます。

暦表データ

200年前のパリの秋分をどうやって調べるのかという事についてですが、これについてはNASAジェット推進研究所が公開している暦表データと呼ばれるデータがありますので問題ありません。

その他必要な理論も全てネットや書籍から拾うことができますので、三角関数などの数学が得意ででプログラミングに自信があればトライしてみてください。

JavaとC/C++処理速度比較

ふと、C/C++で作成したプログラムをJavaに移植したいと思ったのですが、C/C++のプログラムとは天体の位置計算をするプログラムで三角関数の塊、ほぼCPUの能力で処理するようなもので、はてさて、この種の所謂科学技術計算ってJavaが使い物になるのか、と疑問を持ちました。

JavaC/C++よりも遅い。これは自明です。なぜならC/C++のプログラムはCPUネイティブ、即ちコンパイルによりCPUが直接実行できる所謂「機械語」のコードが生成されますが、javaコンパイルにより「VM」すなわりJava仮想マシン用のコードを生成し、CPU上でまずJava VMが動作し、このJava VM上でjavaのプログラムが実行されるのですから、C/C++と較べてワンクッション多い分、そのオーバヘッドが処理速度に加わります。

問題はそのオーバヘッドが小さいのか大きいかで、これは処理するプログラムの処理内容に大きく依存します。

ネットワークアクセス、DBアクセスが多いプログラムは相対的にCPU処理の割合が少なくなり、たとえCPU処理が大きく遅くなっても全体の処理時間への影響は許容可能かもしれませんが、三角関数の塊の処理ではCPU処理時間がほぼ全てです。

そういうプログラムはC/C++でしょう、と思っているのが単なる食わず嫌いなのか、確認してみることにしました。

実験内容

double x,y,zをメンバーに持つ方向余弦クラスを与えたオイラー角でZ-X-Z回転させる、これを1000万回実行して処理時間を図ります。

結果

結果を先に書きます。

Javaプログラムの処理時間は、783ミリ秒でした。

一方、C++プログラムの処理時間は、90ミリ秒でした。

C++の方が早いはずとは思っていましたが想定外の結果、レベルが違う大差でした。

Java プログラム

Direction.java は方向余弦と呼ばれる空間上の方向を示すための3つ実数を有するクラスです。しかし幾何学な意味はここでは関係ありません。

Test.javaはメインルーチンで、Directionクラスに格納されたこれら3つ実数をrotateX/rotateZメソッドなどで三角関数を使用した変換を1000万回連続実行して、処理時刻をシステム時計で計測します。

package testtest;
public class Direction {
  public double x = 0;
  public double y = 0;
  public double z = 0;

  public Direction(double x , double y , double z)
  {
    this.x = x;
    this.y = y;
    this.z = z;
  }

  public Direction rotateX(double a)
  {
    double COSA = Math.cos(a);
    double SINA = Math.sin(a);

    double xx = x;
    double yy = y * COSA + z * SINA;
    double zz = y * -SINA + z * COSA;

    x = xx;
    y = yy;
    z = zz;
    return this;
  }

  public Direction rotateY(double a)
  {
    double COSA = Math.cos(a);
    double SINA = Math.sin(a);

    double xx = x * COSA + z * SINA;
    double yy = y;
    double zz = x * -SINA + z * COSA;

    x = xx;
    y = yy;
    z = zz;
    return this;
  }

  public Direction rotateZ(double a)
  {
    double COSA = Math.cos(a);
    double SINA = Math.sin(a);

    double xx = x * COSA + y * SINA;
    double yy = x * -SINA + y * COSA;
    double zz = z;

    x = xx;
    y = yy;
    z = zz;

    return this;
  }
}
package testtest;

public class Test {
  public static void main(String[] args) {
    System.out.println("Start");
    long t0 = System.currentTimeMillis();

    Direction dire = new Direction(1, 0, 0); 
    for(int i=0; i<10000000; i++) {
      dire.rotateZ(1.2).rotateX(1.1).rotateZ(-0.9);
    }

    long t = System.currentTimeMillis() - t0;
    System.out.printf("Direction=(%f, %f, %f)\n", dire.x, dire.y, dire.z);
    System.out.printf("End %d ms\n", t);
  }
}

実行結果

C:\workspace_TCP\seiichis\bin>java testtest.Test
Start
Direction=(-0.016389, 0.764198, -0.644774)
End 783 ms

C++ プログラム

C++のコードはJavaとほぼ同じです。

Direction.h

class Direction
{
public:
  double x = 0;
  double y = 0;
  double z = 0;

public:
  Direction(double x = 0, double y = 0, double z = 0)
  {
    this->x = x;
    this->y = y;
    this->z = z;
  }

  Direction& rotateX(double a);
  Direction& rotateY(double a);
  Direction& rotateZ(double a);
};

Direction.cpp

#include <math.h>
#include "Direction.h" Direction& Direction::rotateX(double a) { double COSA = cos(a); double SINA = sin(a); double xx = x; double yy = y * COSA + z * SINA; double zz = y * -SINA + z * COSA; x = xx; y = yy; z = zz; return *this; } Direction& Direction::rotateY(double a) { double COSA = cos(a); double SINA = sin(a); double xx = x * COSA + z * SINA; double yy = y; double zz = x * -SINA + z * COSA; x = xx; y = yy; z = zz; return *this; } Direction& Direction::rotateZ(double a) { double COSA = cos(a); double SINA = sin(a); double xx = x * COSA + y * SINA; double yy = x * -SINA + y * COSA; double zz = z; x = xx; y = yy; z = zz; return *this; }

Test.cpp

#include <stdio.h>
#include "Direction.h"
int main(int argc, _char* argv[])
{
  printf("Start\n");
  LONGLONG t0 = Get64Time();

  Direction dire(1, 0, 0);
  for (int i = 0; i < 10000000; i++) {
    dire.rotateZ(1.2).rotateX(1.1).rotateZ(-0.9);
  }

  LONGLONG t = Get64Time() - t0;
  printf("Direction=(%lf, %lf, %lf)\n", dire.x, dire.y, dire.z);
  printf("End %d ms\n", (int)t);
}

実行結果

速度もさることながら、三角関数1000万回実行でJavaC++のプログラムの計算結果が同じになるのかも見ものでしたが、見事同じ結果となりました。

C:\Data\project2\AstroNavi2\x64\Release>JpldeTest.exe
Start
Direction=(-0.016389, 0.764198, -0.644774)
End 90 ms