¿Es la raíz cúbica entera?

Esto parece ser simple pero no puedo encontrar una manera de hacerlo. Necesito mostrar si la raíz cúbica de un entero es entero o no. is_integer() método flotante is_integer() en Python 3.4 pero no fue exitoso. Como

 x = (3**3)**(1/3.0) is_integer(x) True 

pero

 x = (4**3)**(1/3.0) is_integer(x) False 

Intenté x%1 == 0 , x == int(x) y isinstance(x,int) sin éxito.

Apreciaría cualquier comentario.

Para números pequeños (<~ 10 13 más o menos), puede utilizar el siguiente enfoque:

 def is_perfect_cube(n): c = int(n**(1/3.)) return (c**3 == n) or ((c+1)**3 == n) 

Esto trunca el cuberoot de punto flotante y luego prueba los dos enteros más cercanos.

Para números más grandes, una forma de hacerlo es hacer una búsqueda binaria de la verdadera raíz cúbica utilizando enteros solo para preservar la precisión:

 def find_cube_root(n): lo = 0 hi = n while lo < hi: mid = (lo+hi)//2 if mid**3 < n: lo = mid+1 else: hi = mid return lo def is_perfect_cube(n): return find_cube_root(n)**3 == n 

En SymPy también está la función integer_nthroot , que buscará rápidamente la enésima raíz número entero de un número y le dirá si también fue exacta:

 >>> integer_nthroot(primorial(12)+1,3) (19505, False) 

Entonces tu función podría ser

 def is_perfect_cube(x): return integer_nthroot(x, 3)[1] 

(Y como SymPy es de código abierto, puede consultar la rutina para ver cómo funciona integer_nthroot ).

Si tus números no son grandes, yo haría:

 def is_perfect_cube(number): return number in [x**3 for x in range(15)] 

Por supuesto, el 15 podría ser reemplazado por algo más apropiado.

Si necesita lidiar con grandes números, usaría la biblioteca sympy para obtener resultados más precisos.

 from sympy import S, Rational def is_perfect_cube(number): # change the number into a sympy object num = S(number) return (num**Rational(1,3)).is_Integer 

Creo que deberías usar la función round para obtener la respuesta. Si tuviera que escribir una función sería la siguiente:

 def cube_integer(n): if round(n**(1.0/3.0))**3 == n: return True return False 

Puede usar algo similar a int(n**(1.0/3.0)) == n**(1.0/3.0) , pero en Python debido a algunos problemas con el cálculo del valor de la raíz cúbica, no se calcula exactamente. . Por ejemplo, int(41063625**(1.0/3.0)) le dará 344, pero el valor debe ser 345.

Espero haber respondido a tu pregunta. Si tiene alguna duda, no dude en ponerse en contacto conmigo .

Para elaborar la respuesta de @nneonneo, se podría escribir una función kth-root más general para usar en lugar de cube_root,

 def kth_root(n,k): lb,ub = 0,n #lower bound, upper bound while lb < ub: guess = (lb+ub)//2 if pow(guess,k) < n: lb = guess+1 else: ub = guess return lb def is_perfect_cube(n): return kth_root(n,3) == n 

Este es otro enfoque utilizando el módulo de matemáticas .

 import math num = int(input('Enter a number: ')) root = int(input('Enter a root: ')) nth_root = math.pow(num, (1/root)) nth_root = round(nth_root, 10) print('\nThe {} root of {} is {}.'.format(root, num, nth_root)) decimal, whole = math.modf(nth_root) print('The decimal portion of this cube root is {}.'.format(decimal)) decimal == 0 

Línea 1: Importar módulo matemático.
Línea 2: Ingrese el número del cual desea obtener la raíz.
Línea 3: Ingrese la raíz nth que está buscando.
Línea 4: Usa la función de potencia.
Línea 5: redondeada a 10 cifras significativas para tener en cuenta las aproximaciones de punto flotante .
Línea 6: imprime una vista previa de la raíz nth del número seleccionado.
Línea 7: Utilice la función modf para obtener las partes fraccionarias y enteras.
Línea 8: imprime una vista previa de la parte decimal del valor de la raíz del cubo.
Línea 9: Devuelva True si la raíz cúbica es un entero. Devuelve False si el valor de la raíz cúbica contiene números fraccionarios.