The power operator (**
) has a higher priority than the division one (/
). So you need to set parentheses:
f = lambda x: x ** (1./3)
Still, floating point operations are not exact, so you have to compare with some small uncertainty:
def is_cardano_triplet(a, b, c):
f = lambda x: x ** (1. / 2)
g = lambda x: x ** (1. / 3)
return abs(g(a + b*f(c)) + g(a - b*f(c)) - 1) < 1e-10
Now you get the problem, that negative numbers are only allowed for roots of odd numbers, but floating points aren't exact, so you have to handle negative numbers by hand:
def is_cardano_triplet(a, b, c):
f = lambda x: x ** (1. / 2)
g = lambda x: (-1 if x<0 else 1) * abs(x) ** (1. / 3)
return abs(g(a + b*f(c)) + g(a - b*f(c)) - 1) < 1e-10
Now
print is_cardano_triplet(2,1,5)
results in True
.