【问题标题】:Generalizng the Babylonian Square Root Algorithm to nth roots将巴比伦平方根算法推广到 n 次根
【发布时间】:2015-09-19 21:09:25
【问题描述】:

我一直在寻找根算法,偶然发现了巴比伦算法。我真的很喜欢它,因为它简单易懂。但问题是它只取平方根,当我制作一个可以取任意幂的数字的根的函数时。我只是想取正整数。

函数如下:

double functions::rot(double x, double y) {
    double z = x;
    double w = 1;
    double e = 0.000001; 
    while (z - w > e){
        z = (z + w) / 2;
        w = x / z;
    }
    return z;
}

y 是力量。有没有人有办法改变这个算法,所以 y 是根的力量?例如,如果 y = 3,则取立方根。

【问题讨论】:

  • 试试把w = x/z改成w=x/(z*z),你会得到什么?
  • 巴比伦方法的图形解释是调整矩形边的长度直到得到一个正方形,同时保留给定的面积。您可以通过调整立方体、超立方体等边缘之一的长度并(一次)调整其他边缘以使其更接近实际图形,轻松将其抽象到更高的维度。
  • 在 x = 64 时将` w = x/z` 更改为 w = x/(z*z) 给我 3.812388。
  • 抱歉,应该也将z - w > e 更改为std::abs(z-w) > e

标签: c++ algorithm


【解决方案1】:

w = x / z 更改为w = x / z*z 的评论仅是1/3(双关语)正确。您还需要另外两个更改,我认为从这段 Python 代码中很明显:

def rot(x, y): # 
    z = x
    w = 1
    e = 0.000001
    while (z - w > e):
        z = ((y - 1) * z + w) / y
        w = x / (z ** (y - 1)) # a ** b is a to the power of b in Python
                               # you might want to use modular exponentiation in C++
                               # (or not if y is double...)
    return z


print(rot(64, 3)) # prints 4
print(rot(59, 6)) # prints 1.9730678338673044

在此处查看reference。我建议您阅读它,因为它提供了更深入的解释。

【讨论】:

    【解决方案2】:

    牛顿法与巴比伦法相似,可用于提取任何幂的根。我们假设 k(根)和 n(输入)都是正整数; u 赋值中的两个除法都是整数除法(忽略余数):

    function iroot(k, n)
        k1, u, s := k-1, n, n+1
        while u < s
            u := (u * k1 + n / (u ** k1)) / k
            s := u
        return s
    

    警告:未经测试的伪代码。函数iroot返回最大的整数乘以自身k次后不超过n

    【讨论】:

    • 虽然这个算法看起来不错,但我需要它来获取和返回双精度数,因为我不会只使用整数作为输入。根是正数。
    • 你真的需要doubles,就实数而言,还是小数就足够了?然后你可以先(或之后)取数字的相应幂。示例x = n^(2/3) = root(n^2, 3) = root(n,3)^2
    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    相关资源
    最近更新 更多