我想知道如何获取数字的确切第n个根(使用任何编程语言)。当我使用物理计算器时,我可以键入sqrt(12)
(当然格式很好),并得到结果2 sqrt(3)
。如何将数字表示为numerator
和denominator
,我怎样才能实现这一点,不仅可以使用平方根,还可以实现任何类型的根。当然,我将不得不使用另一种表示,但我不知道它是如何工作的。
提前致谢。
答案 0 :(得分:3)
我怀疑这是一种有效的方法,但它会起作用。假设您想要获取某个数字n
的{{1}} th 根:
m
。m = p1a1 * p2a2 * ... * pxax
允许1 <= i <= x
和ki = ai div n
。然后将ri = ai mod n
在根目录下保留的部分&#34;是p1k1 * p2k2 * ... * pxkx
。
第一步是唯一棘手的一步。找到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 + " × " + 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 + " × " + 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)。我不知道细节,但这里是切入点。此外,值在您最终计算的迭代次数上越来越准确。