Un uso simple de De Moivre's formula, es suficiente para mostrar que la raíz cúbica de un valor, independientemente del signo, es una función con múltiples valores. Eso significa que, para cualquier valor de entrada, habrá tres soluciones. La mayoría de las soluciones presentadas hasta ahora solo devuelven la raíz principal. A continuación, se muestra una solución que devuelve todas las raíces válidas y pruebas explícitas para casos especiales no complejos.
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) ]
Editar: a lo solicitado, en los casos en que no es apropiado tener dependencia de numpy, el código siguiente hace lo mismo.
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 ]
Como nota al margen: 'float (1)' se escribe más convenientemente como "1.". O puede usar 'desde __future__ división de importación 'y dejar de preocuparse por la división de enteros (1/3 devuelve 0.3333 ...). – EOL
Si solo quiere la raíz real del cubo e ignora las complejas raíces del cubo, dígalo en su pregunta. –
Tenga en cuenta que no hay un número de coma flotante que represente exactamente 1/3, por lo que al usar funciones matemáticas como 'math.pow()' no hay forma de especificar la raíz del cubo. –