准确的价值根源

时间:2015-10-22 17:28:18

标签: algorithm math language-agnostic pseudocode

我想知道如何获取数字的确切第n个根(使用任何编程语言)。当我使用物理计算器时,我可以键入sqrt(12)(当然格式很好),并得到结果2 sqrt(3)。如何将数字表示为numeratordenominator,我怎样才能实现这一点,不仅可以使用平方根,还可以实现任何类型的根。当然,我将不得不使用另一种表示,但我不知道它是如何工作的。

提前致谢。

3 个答案:

答案 0 :(得分:3)

我怀疑这是一种有效的方法,但它会起作用。假设您想要获取某个数字n的{​​{1}} th 根:

  1. 计算素数因子化 m
  2. 每个m = p1a1 * p2a2 * ... * pxax允许1 <= i <= xki = ai div n
  3. 然后将ri = ai mod n

    分解出来

    在根目录下保留的部分&#34;是p1k1 * p2k2 * ... * pxkx

  4. 第一步是唯一棘手的一步。找到p1r1 * p2r2 * ... * pxrx的所有素数因子后,只需要循环这些因素并将m的倍数除去。

答案 1 :(得分:0)

为了简化数字的第n个根,算法不应该进行素数因子分解,而应该进行“第n次幂分解”,即查找根中最大的n次幂,然后你可以移出根外。例如:250的第3个根等于2 x 125的第3个根;因为125是5的第三个幂,你可以将它移出根并获得:2的第三个根的5倍。

算法:取数字的浮点第n个根,并将其向下舍入,然后检查这个和所有较小的整数,直到找到第n个幂除以数字的最大整数;然后将数字除以第n次幂,并将整数移出根。

这个javascript示例显示了一个基本实现;您可以通过将1 1 / root 打印为1来进一步清理它;毫无疑问,进一步优化是可能的。

function integerRoot(number, root) {
    var base = number, factor = 1;
    var max = Math.floor(Math.pow(base, 1/root));
    for (var i = max; i > 1; i--) {
        var power = Math.pow(i, root);
        if (base % power == 0) {
            base /= power;
            factor *= i;
            break;
        }
    }
    document.write(number + "<SUP>1/" + root + "</SUP> = " + 
                   factor + " &times; " + base + "<SUP>1/" + root + "</SUP><BR>");
}

integerRoot(25, 3);
integerRoot(27, 3);
integerRoot(81, 3);
integerRoot(135, 3);
integerRoot(375, 3);
integerRoot(8*27*64*17, 3);

更新:这是一个更高效的版本;不过,我还没有考虑到负数,因此肯定有进一步改进的空间。

function simplifyRoot(radicand, degree) {
    var factor = 1, base = 1, power;
    while ((power = Math.pow(++base, degree)) <= radicand) {
        while (radicand % power == 0) {
            factor *= base;
            radicand /= power;
        }
    }
    return {factor: factor, radicand: radicand, degree: degree};
}

var radicand = 8*27*36*64*125*216, degree = 3;
var simplified = simplifyRoot(radicand, degree);

document.write(radicand + "<SUP>1/" + degree + "</SUP> = " + 
    simplified.factor + " &times; " + simplified.radicand + "<SUP>1/" + simplified.degree + "</SUP><BR>");

答案 2 :(得分:-1)

https://en.wikipedia.org/wiki/Newton%27s_method 牛顿的方法可以扩展到找出你正在寻找的根源。将f(x)设置为所需的函数,如(x ^ 1/3)或(x ^ 1/2)。我不知道细节,但这里是切入点。此外,值在您最终计算的迭代次数上越来越准确。