对数算法
我需要评估任何基数的对数,这无关紧要,精确到一定程度。有没有一种算法可以做到这一点?我用Java编程,所以我对Java代码很好。
如何非常快速地找到二进制对数?(充其量为 O(1) )也许能够回答我的问题,但我不明白。能否加以澄清?
我需要评估任何基数的对数,这无关紧要,精确到一定程度。有没有一种算法可以做到这一点?我用Java编程,所以我对Java代码很好。
如何非常快速地找到二进制对数?(充其量为 O(1) )也许能够回答我的问题,但我不明白。能否加以澄清?
使用此标识:
logb(n) = loge(n) / loge(b)
其中可以是任何基数中的对数函数,是数字并且是基数。例如,在Java中,这将找到256的以2为底的对数:log
n
b
Math.log(256) / Math.log(2)
=> 8.0
顺便说一句,Math.log()
使用 base。还有Math.log10()
,它使用base。e
10
我知道这是非常晚的,但这可能对某些人来说很有用,因为这里的问题是精确度。一种方法是实现一种根查找算法,该算法从其基础开始使用您可能想要使用的高精度类型,由简单的+-x/操作组成。
我建议实现牛顿的方法,因为它需要相对较少的迭代并且具有很好的收敛性。特别是对于这种类型的应用程序,我相信公平地说,只要实现了良好的输入验证,它将始终提供正确的结果。
考虑一个简单的常量“a”,其中
如果 a 被寻求解决,以至于它服从,那么
我们可以迭代地使用牛顿方法在任何指定的公差内找到“a”,其中每个a-ith迭代可以由下式计算
分母是
,
因为这是函数的第一导数,这是牛顿方法所必需的。一旦解决了这个问题,“a”就是“a = log,b(x)”问题的直接答案,可以通过简单的+-x/操作获得,所以你已经很好了。“等等,但那里有力量吗?是的。如果您可以依靠您的功率函数足够精确,那么继续并在那里使用它就没有问题。否则,您可以使用这些方法将电源运算进一步分解为一系列其他 +-x/ 运算,方法是将幂上的任何十进制数简化为两个整数幂运算,这两个运算可以通过一系列乘法运算轻松计算。这个过程最终将留下第n个要求解的根,你也可以使用牛顿方法找到它。如果你确实走上了这条路,你可以用它来做牛顿方法。
正如你所看到的,它必须递归解决,直到你达到b = 1。
哎呀,但是是的,就是这样。这是通过确保在整个过程中仅使用 +-x/ 操作来解决问题的方法。以下是我在Excel中为解决log,2(3)所做的快速实现,与软件原始功能给出的解决方案相比。如您所见,我可以通过监控优化函数为我提供的内容来不断优化“a”,直到达到我想要的公差。在这里,我使用a = 2作为初始猜测,您可以使用它,并且在大多数情况下应该没问题。