对数算法

2022-09-01 01:50:04

我需要评估任何基数的对数,这无关紧要,精确到一定程度。有没有一种算法可以做到这一点?我用Java编程,所以我对Java代码很好。

如何非常快速地找到二进制对数?(充其量为 O(1) )也许能够回答我的问题,但我不明白。能否加以澄清?


答案 1

使用此标识:

logb(n) = loge(n) / loge(b)

其中可以是任何基数中的对数函数,是数字并且是基数。例如,在Java中,这将找到256的以2为底的对数:lognb

Math.log(256) / Math.log(2)
=> 8.0

顺便说一句,Math.log() 使用 base。还有Math.log10(),它使用base。e10


答案 2

我知道这是非常晚的,但这可能对某些人来说很有用,因为这里的问题是精确度。一种方法是实现一种根查找算法,该算法从其基础开始使用您可能想要使用的高精度类型,由简单的+-x/操作组成。

我建议实现牛顿的方法,因为它需要相对较少的迭代并且具有很好的收敛性。特别是对于这种类型的应用程序,我相信公平地说,只要实现了良好的输入验证,它将始终提供正确的结果。

考虑一个简单的常量“a”,其中log_b(x) = a

如果 a 被寻求解决,以至于它服从,那么x - b^a = 0

我们可以迭代地使用牛顿方法在任何指定的公差内找到“a”,其中每个a-ith迭代可以由下式计算a_i = a_{i-1} - \frac{x - b^a}{-ab^{a-1}}

分母是

-ab^{a-1} = \frac{\partial}{\partial a},

因为这是函数的第一导数,这是牛顿方法所必需的。一旦解决了这个问题,“a”就是“a = log,b(x)”问题的直接答案,可以通过简单的+-x/操作获得,所以你已经很好了。“等等,但那里有力量吗?是的。如果您可以依靠您的功率函数足够精确,那么继续并在那里使用它就没有问题。否则,您可以使用这些方法将电源运算进一步分解为一系列其他 +-x/ 运算,方法是将幂上的任何十进制数简化为两个整数幂运算,这两个运算可以通过一系列乘法运算轻松计算。这个过程最终将留下第n个要求解的根,你也可以使用牛顿方法找到它。如果你确实走上了这条路,你可以用它来做牛顿方法。

\frac{\partial (\sqrt[b]{x})}{\partial x} = \frac{\sqrt[b]{x}}{bx}

正如你所看到的,它必须递归解决,直到你达到b = 1。

哎呀,但是是的,就是这样。这是通过确保在整个过程中仅使用 +-x/ 操作来解决问题的方法。以下是我在Excel中为解决log,2(3)所做的快速实现,与软件原始功能给出的解决方案相比。如您所见,我可以通过监控优化函数为我提供的内容来不断优化“a”,直到达到我想要的公差。在这里,我使用a = 2作为初始猜测,您可以使用它,并且在大多数情况下应该没问题。

Newton method for the solution of a log operation