今、月と日数の対応を出す多項式が話題になっています。
どういうことかというと、
下の数式に、月(m) の値を代入すると、
その月の日数(10月なら31日等)が得られるというものです。
かなりややこしい数式になってますが、
この数式を作った人はどうやってこの形にたどり着いたのでしょうか。
この記事では、
この数式を導出する手順を見ていきたいと思います。
基本的な考え方
多項式では、代入すると値が0になるようなことがあります。
例えば、 であれば、
なので、で値がゼロとなります。
この時、はのゼロ点であると言います。
このゼロ点を上手く使うと、
特定の入力に対して、
特定の出力を出すような関数を作ることができます。
例えば、とという2つの関数を用意すると、
では、
, で、
では、
,となります。
つまり、はのゼロ点で、はのゼロ点ですね。
この二つの関数を足し合わせた関数は、
,
となり、
当然ですが、ゼロ点でない方の関数の値が得られます。
そこで、
のように、特定の10月だけゼロ点ではない多項式を作れば、
これは、10月の値を返す関数とすることができて、
(1月の関数)+(2月の関数)+・・・+(12月の関数)
という形で、それぞれの関数を足せば、
目標の多項式ができることが分かります。
多項式の構成
それでは具体的に、多項式を作っていきましょう。
ある月の関数
M月の関数をとして、
がM月の日数 となり、
では0となるように関数を作ります。
上でみたようにだけ抜かして、
と積を取れば、
以外で0となります。
後は、の時に、となるように係数を調整すれば良いのです。
これは単純に、上の積にを代入した値で、
積を割ると、の時に値が1となるので、
そこに、をかければオッケーです。
まとめると、M月の日数に対応する関数は次のようになります。
月と日数の対応を出す多項式
後は、を全ての月について足し合わせれば、
目標の関数が完成します。
そのため、目標の関数は、
となります。
式を展開
上のように多項式を構成することで、
月と日数の関係が得られる多項式になっているはずです。
ところが、一番初めに示した多項式では、
綺麗に展開された形になっているので、
ちゃんと同じものを導出できているかがすぐにはわかりませんね。
そこで、構成した多項式を数式処理ソフトMaximaを使って展開させてみましょう。
days:[31,28,31,30,31,30,31,31,30,31,30,31]; f:0; for M:1 step 1 thru 12 do block(g:1, for i:1 step 1 thru 12 do if i # M then g:g*(x-i), h(x):=g, f:f+g*days[M]/ev(g,x=M)); expand(f)
上の構成に従って、関数f
を構成して、
その後expand(f)
で展開しています。
結果は次のようになりました。
一番上の多項式と比べてみるとぴったり一致していることが分かります。
おまけ(うるう年版の多項式)
元の多項式は、うるう年ではない、
つまり、2月の日数が28日となるものでしたが、
構成方法が分かったので、
2月を29日としたうるう年版の多項式も簡単に構成できます。
その結果は、次の通りです。
たった、一日変わるだけですが、
多項式の係数はかなり変わっていますね。
実際この多項式に2を代入すると、
結果は29となり、他の月も正しい日数になることが確認できます。
まとめ
twitter で 話題となっていた月と日数の対応を出す多項式について、
その導出方法をまとめました。
また、その導出方法を利用して、うるう年版の多項式も導出できました。