なぜ双対数(二重数)で微分を求められるのか・・・?

前回記事の冒頭でサラッと流した部分の補完。
[C++]constexprに双対数(二重数)を実装する - 地面を見下ろす少年の足蹴にされる私

 \epsilon^2 = 0を導入するだけで、なぜに2項目に微分が計算されるのでしょうか。純に数学的には微分環との関連が云々・・・、と日本語でおkな感じになるので、数学弱めな自分なりに考えてみました。

双対数の四則演算

後で使うので、双対数の四則演算をここにまとめておきます。二つの双対数 d1 = a+b\epsilon d2 = c+d\epsilonについて

\begin{eqnarray}
d1+d2&=& (a+b\epsilon) + (c+d\epsilon)\\
&=&(a+c) + (b+d)\epsilon
\end{eqnarray}

\begin{eqnarray}
d1 - d2 &=& (a+b\epsilon) - (c+d\epsilon)\\
&=&(a-c) + (b-d)\epsilon
\end{eqnarray}

\begin{eqnarray}
d1 \times d2 &=& (a+b\epsilon) \times (c+d\epsilon)\\
&=&ac+ad\epsilon+bc\epsilon+bd\epsilon^2\\
&=&ac+(ad+bc)\epsilon
\end{eqnarray}

\begin{eqnarray}
d1 \div d2 &=&\frac{(a+b\epsilon)}{(c+d\epsilon)}\\
&=&\frac{(a+b\epsilon)}{(c+d\epsilon)} \times \frac{(c-d\epsilon)}{(c-d\epsilon)} \\
&=&\frac{ac-ad\epsilon+bc\epsilon-bd\epsilon^2}{c^2-cd\epsilon+cd\epsilon-(d\epsilon)^2}\\
&=&\frac{ac+(-ad+bc)\epsilon}{c^2}\\
&=&\frac{a}{c}+\frac{-ad+bc}{c^2}\epsilon
\end{eqnarray}

双対数の虚部

虚部と呼ぶのも変ですが、双対数の2項目( a+b\epsilon b\epsilon)をそう呼ぶことにします。
双対数で微分を求めていくためには、この2項目の係数bをまず1にしておく必要があります。なぜでしょうか?計算していけば分かるのですが、1にしておかないと微分が正しく求まりません。
では、これは何を示しているのでしょうか?双対数の一般形(d = a+b\epsilon)を少し書き換えてみます、
\begin{eqnarray}
d = x+1\epsilon
\end{eqnarray}
aには任意の実数を入れられるので、そこを変数xと見ます。
つまり、実部を任意の変数xと置いたときの微分値が虚部です。実際に使う時はaに具体的な値を入れるためにイメージしにくいですが、\frac{d}{dx}x = 1なのでb=1を入れておくわけです。
この様に見れば、任意の実数aは双対数で
a = a+0\epsilon
と表わされることも違和感がないでしょう(\frac{d}{dx}a = 0なので)。

加減算

次に足し算をやってみましょう。
\begin{eqnarray}
(x + 1\epsilon) + (x + 1\epsilon)&=&(x+x) + (1+1)\epsilon\\
&=&2x + 2\epsilon
\end{eqnarray}
当たり前のように、虚部は2になります。\frac{d}{dx}2x = 2であるので、足し算しても虚部は実部に対して微分を表し続けます。引き算をしても
\begin{eqnarray}
(2x + 2\epsilon) - (x + 1\epsilon)&=&(2x-x) + (2-1)\epsilon\\
&=&x + 1\epsilon
\end{eqnarray}
のように、引き算に対しても虚部は実部に対して微分となります。

また実数aとの計算でも
\begin{eqnarray}
(a + 0\epsilon) - (x + 1\epsilon)&=&(a-x) + (0-1)\epsilon\\
&=&(a-x) - 1\epsilon
\end{eqnarray}
同じように虚部は実部の関数に対して微分を示し続けます(\frac{d}{dx}(a-x) = -1)。

乗除算

次は掛け算をやってみます。
\begin{eqnarray}
(x + 1\epsilon) \times (x + 1\epsilon)&=&(x\times x) + (x\times 1+1\times x)\epsilon\\
&=&x^2 + (x+x)\epsilon\\
&=&x^2 + 2x\epsilon
\end{eqnarray}

\frac{d}{dx}(x2) = 2xなので、積に関しても虚部は微分を示しています。
ここで、今までは双対数の実部を変数と置いてきましたが、一歩進んで関数と見てそれをf,gとおき、その微分(虚部)をf',g'とおいて双対数の積を考えると

\begin{eqnarray}
(f + f'\epsilon) \times (g + g'\epsilon)&=&(f\times g) + (f\times g'+g\times f')\epsilon\\
&=&fg + (fg'+gf')\epsilon
\end{eqnarray}

実部はそのまま関数の積になります。
そして虚部は、積の微分法則(ライプニッツ則)となっています。

次に割り算です。
\begin{eqnarray}
(x^2 + 2x\epsilon) \div (x + 1\epsilon)&=&\frac{x^2}{x} + \left( \frac{-x^2\times1 + 2x\times x }{x\times x} \right)\epsilon\\
&=&x + \left( \frac{-x^2 + 2x^2 }{x^2} \right)\epsilon\\
&=&x +  \left( \frac{x^2}{x^2} \right)\epsilon\\
&=&x +  1\epsilon
\end{eqnarray}

割り算に関しても、虚部は実部の微分になる関係を維持しています。
もうお気づきかもしれませんが、先ほどと同じように関数に置き換えて計算してみると

\begin{eqnarray}
(f + f'\epsilon) \div (g + g'\epsilon)&=&\frac{f}{g} + \left( \frac{-f\times g' + g\times f' }{g\times g} \right)\epsilon\\
&=&\frac{f}{g} + \left( \frac{gf'-fg'}{g^2} \right)\epsilon
\end{eqnarray}

この様に、虚部は商の微分法則を構成しています。

関数係数双対数の四則演算

任意の関数を係数とした双対数の加減算についても求めて、まとめておきます。二つの双対数 d1 = f+f'\epsilon d2 = g+g'\epsilonについて

\begin{eqnarray}
d1+d2&=& (f+f'\epsilon) + (g+g'\epsilon)\\
&=&(f+g) + (f'+g')\epsilon
\end{eqnarray}

\begin{eqnarray}
d1 - d2 &=& (f+f'\epsilon) - (g+g'\epsilon)\\
&=&(f-g) + (f'-g')\epsilon
\end{eqnarray}

\begin{eqnarray}
d1 \times d2 &=& (f + f'\epsilon) \times (g + g'\epsilon)\\
&=&fg + (fg'+gf')\epsilon
\end{eqnarray}

\begin{eqnarray}
d1 \div d2 &=&(f + f'\epsilon) \div (g + g'\epsilon)\\
&=&\frac{f}{g} + \left( \frac{gf'-fg'}{g^2} \right)\epsilon
\end{eqnarray}

 \epsilon^2 = 0

ここまで見てきたように、双対数の虚部は常に実部の関数に対しての導関数となっています。少なくとも四則演算の範囲ではその関係は崩れません。
双対数の加減算は複素数と同じ形になっているので、加減算が虚部と実部の微分についての関係を保存する性質は複素数でも成り立ちます。しかし、乗除算についてはどうでしょうか?
複素数では i^2 = -1となるため i^2の項は再び実数に戻ります。そのため、積に関しては実部が、商に関しては両方が、虚部と実部の微分についての関係を保存しません。
実数に付け加える任意の数を\chiと置いて乗除を計算してみると(\chiを付け加えて実数を拡大した数をd1とd2とします)
\begin{eqnarray}
d1 \times d2 &=& (a+b\chi) \times (c+d\chi)\\
&=&ac+ad\chi+bc\chi+bd\chi^2\\
&=&ac+(ad+bc)\chi+bd\chi^2
\end{eqnarray}

\begin{eqnarray}
d1 \div d2 &=&\frac{(a+b\chi)}{(c+d\chi)}\\
&=&\frac{(a+b\chi)}{(c+d\chi)} \times \frac{(c-d\chi)}{(c-d\chi)} \\
&=&\frac{ac-ad\chi+bc\chi-bd\chi^2}{c^2-cd\chi+cd\chi-(d\chi)^2}\\
&=&\frac{ac-(ad+bc)\chi-bd\chi^2}{c^2-(d\chi)^2}
\end{eqnarray}

ここで、\chi^2 = -1とすれば複素数となり、\chi^2 = 0とすると双対数になります。積と商の微分法則を虚部で成り立たせつつ実部では素のままの計算となるようにするためには\chi^2 = \epsilon^2 = 0が必要で、そうでなければいけない事が分かるでしょう。

複素数 i^2 = -1の導入によって二次元ベクトル空間の元と同値になるように、双対数は \epsilon^2 = 0の導入によって実部と虚部の微分についての関係を四則演算で保存するようになります。その結果、実部と虚部が関数と導関数の関係を保持する双対数同士の計算において実部に計算結果が、虚部にその微分値が、自動で計算されます。
双対数で微分を計算するためには \epsilon^2 = 0だけでは不十分で、入力となる双対数が実部と虚部で微分関係を維持している(例:実部aに対して虚部b=1)ことも必要になります。虚部係数bに1か0以外の値を入れる場合、実部がその値に対応した値でないと微分は正しく求まらず、実部も虚部もでたらめな値が計算されます。

つまりは、双対数は微分が自動計算できる魔法の数というわけではなく、双対数の性質によって入力双対数の実部と虚部の微分関係が保持されたまま四則演算を実行可能で、結果として微分を得ることが出来るわけです。