2017-01-04 6 views
3

私はPythonを機能の探求に組み込むのが好きですが、私はこれらの評価に期待したり望まなかった振る舞いに遭遇しました。-1 /(-343)^(1/3)を1/7としてPythonで計算するには?

>>> def h(x): 
...  return -1/x**(1/3) 
... 
>>> h(-343) 
(-0.07142857142857145 + 0.12371791482634838j) 

私は次の関数への真逆をしたいと思います:

>>> def h(x): 
...  return -1/inverse_f(x) 
... 
>>> h(-343) 
0.14285714285714285 

この動作を取得するためのPython的な方法があります:それ

>>> def f(x): 
...  return x**3 
... 
>>> f(-7) 
-343 

ような?

+0

Pythonのプログラマは、関数が名前で呼び出されるときに通常は 'lambda'を使用しません。 'def h(x):return -1/x **(1/3)'のような名前付き関数を定義したいとします。 – DyZ

+0

フィードバックいただきありがとうございます。私はそれに応じて定義を変更しました。 – Galen

+0

さて、間違った字下げがあります。あなたが「ラムダ」がこのように通常使用されていないことを知っている限り、私は実際には前もって良かったと言います。 –

答えて

6

小数累乗し、負の数はcomplex numberことができるので、あなたが問題を取得しています。


解決策は、数学的同一性を適用することです。 xが負の場合、x 1/3は - (( - x)1/3と等しいことがわかります。言い換えれば、xを正の数に変換し、立方根をとり、それを再び否定します。ここでこれを行うにはPythonのコードです:あなたが最初の場所で問題を得ている理由

def h(x): 
    if x >= 0: 
     return -1.0/x**(1.0/3.0) 
    else: # x < 0 
     return -h(-x) 

が説明するのは、それがx**y(パワー・オペレーター)の実装を見てするのに役立ちます。重要な数学的同一性は、x y = exp(log(x)* y)です。指数は通常の数として扱われ、分析する必要はありません(これは整数ですか、それは小数ですか、否定的なのでしょうかなど)。

xが正数の場合、log(x)は実数です。 yが実数である限り、exp(log(x)* y)は実数になります。

しかし、xが負の数であるとき、log(x)は複素数です。具体的には、log(-x)+ pi * iに等しい。このような複素数にyを掛けてexp()を適用すると、結果は通常複素数になります。これはあなたが望むものではありません。

1

あなたがの整数で作業したい場合(そしてあなたの関数の複雑な解を無視する)これは方法かもしれません。少なくともタイトルのあなたの例のために、あなたが望むことをします。 (これは、あなたの質問のタイトルに対処し、残りは、それはそれで助けにはなりません、今変更されているよう... Nayuki's answerます)

gmpy2iroot方法があります:あなたはそこから始まる

import gmpy2 
print(gmpy2.iroot(343, 3)) # -> (mpz(7), True) 

をあなたの機能を組み合わせることができるはずです。

import gmpy2 
from fractions import Fraction 

def h(x): 
    sign = 1 if x >= 0 else -1 
    root, is_int = gmpy2.iroot(abs(x), 3) 
    if not is_int: 
     return None # the result is not an integer 
    root = int(root) 
    return -sign * Fraction(1, root) 

print(h(-343)) # -> 1/7 

と逆:

def g(x): 
    return -Fraction(1, x**3) 

print(g(h(-343))) # -> -343 
+0

'iroot'は負の数では機能しません。 – DyZ

+0

@DYZ:正確には、それは '印'と 'abs'のためのものです! (ああ、あなたのコメントはおそらく私が完全な機能を追加する前だった...) –

+0

負の数は3つの立方根を持っています。あなたのコードはそれらのうちの1つだけを計算します。 – DyZ

関連する問題