具有误差控制的有理求幂根的有理逼近

问题描述 投票:0回答:1

我正在寻找一种有效计算b^e的算法,其中be是有理数,确保近似误差不会超过给定的err(理性)。显然,我正在寻找一个功能:

rational exp(rational base, rational exp, rational err)

这将保留法律|exp(b, e, err) - b^e| < err

有理数表示为大整数对。让我们假设已经定义了所有合理性保持操作,如加法,乘法等。

我找到了几种方法,但它们不允许我足够清楚地控制错误。在这个问题我不关心整数溢出。实现这一目标的最佳方法是什么?

algorithm math exponent approximation rational-number
1个回答
1
投票

这个很复杂,所以我将概述我采取的方法。我不保证没有错误,你还有很多工作要做。

我将把你所说的exp(x, y, err)中的变量改为x^y中的err。如果y不在0 <= y < 1范围内,那么我们可以很容易地乘以适当的x^kk整数来实现它。所以我们只需要担心分数

如果所有分子和分母都很小,那么通过首先获取整数幂,然后使用牛顿方法取一个根来解决这个问题很容易。但是,当你试图估计像(1000001/1000000)^(2000001/1000000)这样的东西时,这种天真的想法会痛苦地崩溃。因此,面临的挑战是如何防止这种情况爆发。

我建议看看计算x^y作为x^y = (x0^y0) * (x0^(y-y0)) * (x/x0)^y = (x0^y0) * e^((y-y0) * log(x0)) * e^(y * log(x/x0))的问题。我们将选择x0y0,以便计算更容易并且误差有限。

为了限制误差,我们可以首先在b上得到一个天真的上界x0^y0 - 类似于“x的下一个最高整数到y的下一个最高整数的幂”。我们将挑选x0y0足够接近xy,后者的条款属于2。然后我们只需要在err/12err/(6*b)err/(6*b)中估计三个术语。 (您可能希望将这些错误缩小一半,然后使最终答案成为附近的理性。)

现在,当我们选择x0y0时,我们将瞄准“小分子/分母的近似理性”。为此,我们开始计算continued fraction。这给出了一系列有理数,可快速收敛到目标实数。如果我们很快就切断序列,我们可以快速找到一个在目标实数的任何所需距离内的有理数,同时保持相对较小的分子和分母。

让我们从第三个学期开始向后工作。

我们想要y * log(x/x0) < log(2)。但是从泰勒系列如果x/2 < x0 < 2x然后log(x/x0) < x/x0 - 1。因此,我们可以搜索连续的分数以找到合适的x0

一旦我们找到它,我们可以使用泰勒系列log(1+z)来计算log(x/x0)err/(12*y*b)。然后是e^z的泰勒系列计算我们想要的误差的项。

第二个任期更复杂。我们需要估计log(x0)。我们所做的是找到一个合适的整数k,使1.1^k <= x0 < 1.1^(k+1)。然后我们可以相当精确地估计k * log(1.1)log(x0 / 1.1^k)。找到一个天真的上限到那个log并使用它找到足够接近的y0,第二项在2以内。然后使用泰勒系列来估计e^((y-y0) * log(x0))到我们想要的精度。

对于第一个术语,我们使用将x0提升为整数的朴素方法,然后使用牛顿方法取根,使x0^y0达到我们所需的精度。

然后将它们相乘,我们得到答案。 (如果你选择了“更严格的错误,更好的答案”,那么现在你要在答案上做一个持续的分数来选择一个更好的理性来回归。)

© www.soinside.com 2019 - 2024. All rights reserved.