Proste użycie De Moivre's formula, wystarcza, aby pokazać, że pierwiastek kostki wartości, niezależnie od znaku, jest funkcją wielowartościową. Oznacza to, że dla dowolnej wartości wejściowej będą trzy rozwiązania. Większość przedstawionych rozwiązań zwraca jedynie zasadę główną. Poniżej przedstawiono rozwiązanie, które zwraca wszystkie prawidłowe korzenie i jawne testy dla nieskomplikowanych przypadków specjalnych.
import numpy
import math
def cuberoot(z):
z = complex(z)
x = z.real
y = z.imag
mag = abs(z)
arg = math.atan2(y,x)
return [ mag**(1./3) * numpy.exp(1j*(arg+2*n*math.pi)/3) for n in range(1,4) ]
Edit: Zgodnie z wnioskiem, w przypadkach, gdy jest to nieodpowiednie mieć zależność numpy poniższy kod robi to samo.
def cuberoot(z):
z = complex(z)
x = z.real
y = z.imag
mag = abs(z)
arg = math.atan2(y,x)
resMag = mag**(1./3)
resArg = [ (arg+2*math.pi*n)/3. for n in range(1,4) ]
return [ resMag*(math.cos(a) + math.sin(a)*1j) for a in resArg ]
Na marginesie: "float (1)" jest wygodniej napisane jako "1.". Lub możesz użyć 'from __future__ import division' i przestań się martwić o dzielenie liczby całkowitej (1/3 zwraca 0.3333 ...). – EOL
Jeśli potrzebujesz tylko prawdziwego pierwiastka kostki i zignorujesz złożone korzenie sześcianu, powiedz to w swoim pytaniu. –
Należy pamiętać, że nie ma liczby zmiennoprzecinkowej, która reprezentuje dokładnie 1/3, więc używając funkcji matematycznych takich jak 'math.pow()' nie ma możliwości określenia korzenia kostki. –