出典不明のフェアフィールドの公式を知っていますか？ChatGPTも知らない経過日数を求める謎の公式

## はじめに

フェアフィールドの公式とは西暦1年1月1日から何日目かを計算する日本でしか知られていない謎の公式です。発表は1949年(?)でツェラーの公式の1882年よりも後です。

```math
365 y + \left\lfloor \frac{y}{4} \right\rfloor - \left\lfloor \frac{y}{100} \right\rfloor + \left\lfloor \frac{y}{400} \right\rfloor + \left\lfloor \frac{306 ( m + 1 )}{10} \right\rfloor + d - 428
```

ことの始まりは気まぐれに ChatGPT にフェアフィールドの公式を実装させてみようと思い立ったことです。たいして難しい式でもないので実装できるだろうと思っていたのですが、ChatGPT はフェアフィールドの公式を知らないと答えました。日本語で質問したからダメだったのか？と考え、英語で質問しましたがダメでした。フェアフィールドはよくある名前（地名）なのでコンテキストが足りないのかな？と思いツェラーの公式とフェアフィールドの公式を説明してと質問しました。ツェラーの公式はちゃんと答えましたがフェアフィールドの公式なんてものはないと言われました。さすがにこれはちょっとおかしいのではないか？と疑いを持つに至りました。

## この記事の趣旨と私なりの結論


先にこの記事の趣旨を書いておくと「**世界的に知られていない**フェアフィールドの公式とは一体どこの誰が考えたものなのか誰か知りませんか？」です。また現時点での私の結論を書いておきます。

- フェアフィールドの公式は日本でしか知られていない
- フェアフィールドの公式の出典や考案者は不明
- フェアフィールドの公式が考案されたのはツェラーの公式よりも後
  - ツェラーの公式は1882年、フェアフィールドの公式は「一説によると」1949年
  - 日付よりフェアフィールドの公式を元にツェラーの公式が考案されたわけがない
- フェアフィールドの公式で西暦1年1月1日からの正しい経過日数は計算できない
  - 知られているフェアフィールドの公式は部分的なものか元の公式自体が不完全
- 証明された論文があるかという意味で**フェアフィールドの公式というものはない**
  - （推測）フェアフィールド地方の新聞かなにかに掲載された数学パズルでは？

## いつからネット上にこの公式があるのか？

Wikipedia では[ツェラーの公式](https://ja.wikipedia.org/wiki/%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F)の一部としてフェアフィールドの公式が紹介されています。ツェラーの公式とは、西暦の年・月・日からその日が何曜日であるかを求める計算式です。

> ツェラーの公式の導出
> ツェラーの公式はフェアフィールド (Fairfield) の公式の変形である。以下に、グレゴリオ暦を例に、その変形過程を記載する。

フェアフィールドの公式が Wikipedia に追加されたのは [2011年1月6日](https://ja.wikipedia.org/w/index.php?title=%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F&oldid=35750237) のようです。最初に追加されたときには「Zeller の公式は、Fairfield（フェアフィールド）の公式の変形に過ぎない。」と書かれています。すぐに同一人物によって「変形に過ぎない」から「変形である」に書き直されています。たしかにフェアフィールドの公式を変形するとツェラーの公式になるとは思いますが、フェアフィールドの公式の方がツェラーの公式を変形して作られたか、後から独立してフェアフィールドの公式ができたというのが現在の私の考えです。

ちなみに英語版 Wikipedia の [Zeller's congruence](https://en.wikipedia.org/wiki/Zeller%27s_congruence) にはフェアフィールドの公式の項目はなく日本独自の文章です。ツェラーの公式はドイツの数学者 [Christian Zeller](https://en.wikipedia.org/wiki/Christian_Zeller)によって1882年に考案されました。その[論文のスキャン](https://web.archive.org/web/20150111014825/http://www.merlyn.demon.co.uk/zel-82px.htm)もあります。

2011 年より後に書かれたページは、直接的または間接的に Wikipedia を参照しているだろうとして、Wikipedia よりも前の日付でネットで公開された記事を探した所以下のページが見つかりました。

- [ツェラーの公式で曜日を求める(備忘録)](https://nmtysh.hatenablog.com/entry/2009/03/11/191500) (2009-03-11)
  - [ツェラーの公式の証明 - はじめに](https://web.archive.org/web/20061126184340/http://7.useyan.jp/mixi/html/262578605.html) (2006/11/07) を参照したと書かれている
- [自力でUNIX TIMEを計算してみよう](https://unoh.github.io/2010/11/12/unix_time.html) (2010/11/12)

いずれもどこを参照したのかは書かれていませんでした。

## フェアフィールドの公式を説明している本

しつこく調べてみると以下のページを見つけました。奈良先端科学技術大学院大学のページです。

- [NAIST Computing Architecture Lab](http://archlab.naist.jp/Lectures/)
  - [日付/曜日計算(Fairfield公式)](http://archlab.naist.jp/Lectures/UNIX2/lect02/lect02.pdf) (PDF)
  - 経過日数から年月日を求める逆変換に相当するコードも記載あり

日付は直接書かれていませんでしたが、PDF の情報より 2007/11/23 PDF 作成（tiff2pdf で変換した日？20050704）ですが、例題の日付が 2000/08/19 なので、その頃に書かれた文章だと思われます。それよりも重要な情報として[「C言語でやりたいことをできるにかえる基本の12章」](https://www.amazon.co.jp/dp/4896271076)（メディアテック）で出版した内容のようです。この本は 2001/2/1 発売なので、やはり 2000 年中頃に書いて次の年に出版したのでしょう。中古が安かったので公式の引用元が書いていないか期待して購入してみたのですが、残念ながら書いてありませんでした。

> 以下の式が**Fairfield公式**と呼ばれるものである．

という文章から何かを参照して書いたことが推測できます（後で気づきましたが[こちら](http://archlab.naist.jp/Lectures/UNIX1/lect00/lect00.pdf) (PDF) の「講義資料の表示」に以下の本を参照していることを示す画像がありました）。

さらに引き続き調べてみると次の本を見つけました。こちらの本は 1994/03 発売なので大幅に時を遡ることができました。

- [文系のためのＣ基礎実習―算法とプログラミング](https://www.kinokuniya.co.jp/f/dsg-01-9784274129643)
  - ５章　日数・曜日計算―ツェラー公式、フェアフィールド公式
  - １０章　日付計算―逆フェアフィールド公式

こちらも中古で安かった（私が買って値上がりしました）ので購入してみた所、具体的な引用元は書かれていませんでしたが、

> フェアフィールド（Fairfield，1949）公式をもちいて日数を計算する．

という記述がありました。1949 というのはおそらく公式が発表された年のことでしょう。ツェラー公式が考案されたのが 1882年だということを思い出してください。1949 がフェアフィールドの公式の発表年であるならば、ツェラー公式の 67 年後に発表されたことになり、ツェラーの公式がフェアフィールドの公式を変形して作られたはずがありません。

なお「逆フェアフィールド公式」については

> 　日数計算にはフェアフィールド公式があり，簡単に日数を計算することができるが，日付計算には公式がない．
> 　そこで，フェアフィールド公式の逆関数（逆フェアフィールド公式と呼ぶこととする）を求めて，日付を計算することにしよう．

と書いてあるため、この本独自の計算関数であることが明確に記されています。ちなみに「C言語でやりたいことをできるにかえる基本の12章」に記載されているものとは別のコードです。

1949 年というのは世界最初のプログラム内蔵式コンピュータ EDSAC が開発された年です。最初のコンピュータとして有名な ENIAC は 1946 年です。私は最初フェアフィールドの公式はコンピュータで計算するアルゴリズムとして誰かが考案したものではないかと推測していましたがどうやらそれは違うようです。もしフェアフィールドの公式に言及している本が他にあるならば、数学（パズル）関連の本ではないかと思います。

## フェアフィールド公式に感じる違和感

フェアフィールド公式は西暦1年1月1日からの経過日数を求める公式です。しかしこの公式では西暦1年1月1日からの正しい経過日数を求めることはできません。なぜならユリウス暦からグレゴリオ暦への変更における日数調整が計算に含まれていないからです。`cal` コマンドで 1752 年 9 月のカレンダーを出力してみましょう。1752 年 9 月 3 日から日付が飛んでいるはずです。これが（イギリスで）ユリウス暦からグレゴリオ暦へ変更になった日付です。

```console
$ cal 9 1752
      9月 1752
日 月 火 水 木 金 土
       1  2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
```

ユリウス暦からグレゴリオ暦への変更を計算に入れなければ正しい経過日数は得られません。西暦1年1月1日からの経過日数を求める公式であるはずのフェアフィールドの公式にこの説明が抜けているのはおかしな話です。フェアフィールドの公式が 1949 年に発表されたのが事実であるならば、その頃にはほぼすべての国で[グレゴリオ暦への変更](https://en.wikipedia.org/wiki/List_of_adoption_dates_of_the_Gregorian_calendar_by_country)が終わって数十年経過しているので、この話を見落としているというのは十分考えられます。ただし公式を名乗るにはあまりも不完全です。ちなみにツェラーの公式はグレゴリオ暦とユリウス暦の両方の公式があります。

元々のフェアフィールドの公式にはこの話がちゃんと書かれていて「文系のためのＣ基礎実習」が引用したときに抜け落ちてしまっただけなのかもしれませんが違和感があります。元のフェアフィールドの公式の論文を読めばなにかわかるのでしょうが、その肝心の論文が見つかりません。

## フリーゲルの公式

日数計算の公式には他にもフリーゲルの公式と言われているものがあります。論文については「[a machine algorithm for processing calendar dates](https://www.semanticscholar.org/paper/Letters-to-the-editor%3A-a-machine-algorithm-for-Fliegel-Flandern/1b99ad1428eb8a0d7398dbecfc504ed7b325ac5f)」([PDF](https://dl.acm.org/doi/pdf/10.1145/364096.364097)) で読むことができます。発表は 1968 年で論文のタイトルよりコンピュータでの日付計算のアルゴリズムとして発表されたものであることがわかります。

フリーゲルの公式は「ユリウス日」または「修正ユリウス日」を求める計算式でフェアフィールドの公式と同等のものです。2つの日付の差が経過日数となります。フェアフィールドの公式と関係があるのかどうかはわかりませんが、フェアフィールドの公式が 1949 年で正しいならば、フリーゲルの公式よりも前にフェアフィールドの公式が存在したことになります。

## まとめ

フェアフィールドの公式の評価を下げる意図はありません。私も UNIX タイムを計算で求めるときに使いましたし便利だと思います。

- [シェルスクリプトでUNIX時間⇔日付の相互変換を行う関数（POSIX準拠）](https://qiita.com/ko1nksm/items/e61728f863c1b2bc829d)
- [awkでUNIX時間⇔日付の相互変換を行う関数（POSIX準拠）](https://qiita.com/ko1nksm/items/e42d9af00212090e910f)


ただ考案者不明のまま「フェアフィールドの公式」というものが**日本だけで広まっている**という現状はおかしいと思います。フェアフィールドの公式を説明しているページによっては「ツェラーの公式はフェアフィールドの公式を元に式を変形しただけ」のような書き方がされていて、すごいのは（後から作られたはずの）フェアフィールドの公式でツェラーの公式はそれをちょっと変更しただけというおかしな話にしたいのかな？というような印象を受けてしまいました。

フェアフィールドの公式が 1949 年に発表したというのも「文系のためのＣ基礎実習―算法とプログラミング」に参照元なしで記載されていただけなので、もしかしたらそれも間違いでツェラーの公式よりも前に、あまり知られていない誰かによって数学関係の本で発表されていた可能性もゼロではないと思いますが、詳細不明のまま日本でフェアフィールドの公式の存在が既成事実化しつつある気がするので、ここらで一旦ブレーキをかけて「フェアフィールドの公式に関する論文はありますか？」「フェアフィールドさん（？）が行った証明はどのようなものですか？」と疑問を投げかけておこうと思います。