使用任意精度数学的log()算法示例

chi*_*ash 1 php algorithm math

我正在寻找一种可以在PHP中实现的算法,以使用任意精度数学来获取整数的自然log()。我受到GMP库的PHP覆盖库的限制(有关PHP 中可用的GMP函数,请参见http://php.net/manual/zh/ref.gmp.php。)

如果您知道可以转换为PHP的通用算法,那也将是一个有用的起点。

我知道,PHP支持本机log()函数,但是我希望能够使用任意精度来解决这个问题。

密切相关的是获取exp()函数。如果我的男生数学对我来说是正确的,得到一个可以导致另一个。

Cim*_*ali 5

好吧,您将拥有泰勒级数,可以对其进行重写以实现更好的收敛 ln的改进泰勒级数:2 sum_ {k = 0 .. + inf} 1 /(2k + 1)*((y-1)/(y + 1))^(2k + 1)

要将等式转化为算法,您必须了解收敛级数的工作原理:每个项越来越小。这种下降发生得足够快,因此总和是一个有限值:ln(y)。

由于实数具有很好的属性,因此您可以考虑将序列收敛到ln(y):

  • L(1)= 2/1 *(y-1)/(y + 1)
  • L(2)= 2/1 *(y-1)/(y + 1)+ 2/3 *((y-1)/(y + 1))^ 3
  • L(3)= 2/1 *(y-1)/(y + 1)+ 2/3 *((y-1)/(y + 1))^ 3 + 2/5 *((y-1 )/(y + 1))^ 5

.. 等等。

显然,计算此序列的算法很简单:

x = (y-1)/(y+1);
z = x * x;
L = 0;
k = 0;
for(k=1; x > epsilon; k+=2)
{
    L += 2 * x / k;
    x *= z;
}
Run Code Online (Sandbox Code Playgroud)

在某个时候,您的x会变得如此之小,以至于它不再会影响L的有趣数字,而只会修改更小的数字。如果这些修改对于您的目的而言太微不足道了,您可以停止。

因此,如果要达到1e ^ -20的精度,请将epsilon设置为比该值小得多,那么就可以了。


如果可以的话,请不要忘记在日志中进行分解。例如,如果它是一个理想的正方形,则ln(a²)= 2 ln(a)实际上,当(y-1)/(y + 1)较小时,该级数将收敛得更快,因此,当y较小时(或更确切地说,更近)到1,但是如果您打算使用整数,则该值应该相等。