如何在 Python 中写出这个等式?

How do I write this equation in Python?

我真的不知道怎么写才对。我就是这样尝试的:

def is_cardano_triplet(a, b, c):
    f = lambda x: x ** 1. / 2
    g = lambda x: x ** 1. / 3
    return g(a + b*f(c)) + g(a - b*f(c)) == 1

print is_cardano_triplet(2,1,5) # I should get True

我应该 True 获得 2, 1, 5,但我没有。我的功能有什么问题?

幂运算符(**)的优先级高于除法运算符(/)。所以需要设置括号:

f = lambda x: x ** (1./3)

不过,浮点运算并不精确,所以你必须与一些小的不确定性进行比较:

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

现在你明白了,负数只能用于奇数的根,但浮点数不精确,所以你必须手动处理负数:

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

现在

print is_cardano_triplet(2,1,5)

结果为 True

做一些计算,I found out

因此:

现在,由于浮点运算在 known reasons 的基于二进制的系统上不精确,第一个公式很难精确计算。然而,第二个更容易计算,没有浮点精度错误,因为它不涉及无理函数和 abc 是整数。

这是聪明的解决方案:

def is_cardano_triplet(a, b, c):
    return (a + 1)**2 * (8*a - 1) - 27*b**2*c == 0

>>> is_cardano_triplet(2, 1, 5)
True