我最近一直在玩Python和数学,然后我遇到了一些我还没弄清楚的东西。也就是说,给定一个任意的lambda,是否有可能返回该lambda的逆数进行数学运算?也就是说,invertLambda使得invertLambda(lambda x:(x + 2))(2)= 0. lambdas仅限于表达式的事实给了我希望,但到目前为止我还没有能够使它工作。我知道任何结果都会导致丢失信息的功能出现问题,但是如果必须的话,我愿意将用户和我自己限制在无损功能上。
答案 0 :(得分:6)
当然不是:如果lambda不是injective function,则无法将其反转。示例:您无法将lambda映射x
反转为x*x
,因为原始x
的符号将丢失。
抛开注入性,有些函数在计算上非常复杂。例如,考虑从其md5哈希中恢复原始值。 (对于lambda计算md5哈希,反向函数必须在密码意义上破坏md5!)
编辑:
事实上,如果我们限制可以在那里使用的表达式,理论上我们可以使lambdas可逆。例如,如果lambda是1参数的线性函数,我们可以很容易地将其反转。如果它是度数的多项式> 4,我们有代数精确解的问题。
当然,我们可以避免使用精确解决方案,只需将函数以数字方式反转即可。这是可能的,使用等式lambda(x) = value
numerical solving的任何方法都可以做到(最简单的二元搜索)。
答案 1 :(得分:1)
我有点迟了,但我刚刚发布了一个python包,它可以准确地完成这个任务。你可能想借用它的一些想法: https://pypi.python.org/pypi/pynverse
它基本上遵循这一策略:
Brent
方法找到bounded_f(x)-y0的根,确保最小化的算法从原始内部的某个点开始通过将ref1,ref2设置为括号来设置间隔。只要超出允许的间隔,bounded_f就会返回无限,迫使算法返回到间隔内搜索。当然,正如弗拉德指出的那样,该函数必须是可逆的,因为逆存在,并且在域中也是连续的,以便工作。