我有一个依赖于整数输入x和y的算法s。
对于输入检查和引发无效参数的异常,我必须确保存在一个自然数,n以便x*s^n=y
Or 用语言来说:我必须多久进行一次链乘x,s直到到达y。
更重要的是:我y准确地到达了吗?
x这个问题可以通过除以:
x*s^n=y => s^n=y/x => s^n=z
With来进一步抽象z=y/x。z一般而言, 不是整数,但只有当能被 整除时,才能y使用整数乘法得出。所以这个属性可以很容易地首先被测试,然后保证它也是一个整数,现在它是解决。yxzs^n=z
已经有一个与此相关的问题。
有很多解决方案。有些是迭代,有些是使用对数求解方程,然后截断、舍入或与 epsilon 进行比较。我对对数解特别感兴趣。总体思路是:
def check(z,s):
n = log(z)/log(s)
return n == int(n)
Run Code Online (Sandbox Code Playgroud)
不过,比较浮点数的相等性似乎相当粗略。在正常情况下,我不会将其视为问题的一般且精确的解决方案。建议这种方法的答案没有提到精度问题,而使用 epsilon 进行比较的答案只是随机取一个小数字。
我想知道这种方法(具有直接相等性)到底有多强大,因为它似乎工作得很好,而且我无法通过反复试验来打破它。如果它在某个时刻发生故障,epsilon 必须有多小或多大。
所以基本上我的问题是:对数方法在特定情况下能否保证准确?例如有限的整数输入范围。
我想了很长时间,我认为这个解决方案至少在某些情况下可能是准确且稳健的。但我没有证据证明这一点。
我的思路是:
我能否找到一个组合,x,y,s使得链乘几乎没有错过y,这意味着n它将非常接近整数,但又不完全是?
答案是不。因为x、y和s是整数,所以乘法也将是整数。因此,如果结果只是勉强错过y,那么至少也必须错过 …