鴫谷です。

-------- Original Message  --------
Subject: [ruby-dev:34143] Re: rational.rb, complex.rb and mathn.rb
From: Shin-ichiro HARA <sinara / blade.nagaokaut.ac.jp>
To: ruby developers list <ruby-dev / ruby-lang.org>
Date: Wed Mar 26 2008 19:22:56 GMT+0900

> 書きながら表現が悪いなと思っていました、すいません。
> 正確には、「この定義では、3乗根を取ることが、実数から実数への
> 関数 y = x**3 の逆関数ではなくなる」と言うべきでした。

関数をどう定義するかということになります。
シンプルな定義をするなら、以下の a), b) が考えられます。

a) 実数 -> 実数をあらわすものとするなら、x >= 0 のみ定義される
b) 複素数 -> 複素数をあらわすものとするなら、x は全領域で定義される

a) の場合、(-2) ** 3 は定義されていないはずです。

そこで Python などでは、
a') y が整数の場合は、x は全領域で定義される

という定義を追加しています。
ということは、同じように (-8) ** (1/3) を定義するためには、

a") y が Rational で、分母が奇数の場合のみ、x は全領域で定義される

という定義を追加することになるでしょう。
この場合、(-8) ** (1/3) は -2 が返ることになります。

b) なら特に複雑なことをせず、(-8) ** (1/3) は 1 + √3i が返ります
(田中昌宏さんの計算方法が普通でしょうから)

# いずれの場合も、x = 0, Re(y) < 0 なら未定義です