本文介绍了使用PHP/GMP计算整数的第n个根的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何使用PHP/GMP计算整数的第n个根?
How can I calculate the n-th root of an integer using PHP/GMP?
尽管我在gmp_root(a, nth)的函数nofollow> PHP来源,似乎该功能尚未在任何发行版中发布*: http://3v4l.org/8FjU7
Although I found a function called gmp_root(a, nth)
in the PHP source, it seems that this function has not been published in any release yet*: http://3v4l.org/8FjU7
*)5.6.0alpha2是撰写本文时的最新版本
*) 5.6.0alpha2 being the most recent one at the time of writing
推荐答案
原始来源:在PHP中使用bcmath计算第N个根–感谢和感谢 HamZa !
Original source: Calculating Nth root with bcmath in PHP – thanks and credits to HamZa!
我已经重写了使用GMP而不是BCMath的代码:
I've rewritten the code to use GMP instead of BCMath:
function gmp_nth_root($num, $n) {
if ($n < 1) return 0; // we want positive exponents
if ($num <= 0) return 0; // we want positive numbers
if ($num < 2) return 1; // n-th root of 1 or 2 give 1
// g is our guess number
$g = 2;
// while (g^n < num) g=g*2
while (gmp_cmp(gmp_pow($g, $n), $num) < 0) {
$g = gmp_mul($g, 2);
}
// if (g^n==num) num is a power of 2, we're lucky, end of job
if (gmp_cmp(gmp_pow($g, $n), $num) == 0) {
return $g;
}
// if we're here num wasn't a power of 2 :(
$og = $g; // og means original guess and here is our upper bound
$g = gmp_div($g, 2); // g is set to be our lower bound
$step = gmp_div(gmp_sub($og, $g), 2); // step is the half of upper bound - lower bound
$g = gmp_add($g, $step); // we start at lower bound + step , basically in the middle of our interval
// while step != 1
while (gmp_cmp($step, 1) > 0) {
$guess = gmp_pow($g, $n);
$step = gmp_div($step, 2);
$comp = gmp_cmp($guess, $num); // compare our guess with real number
if ($comp < 0) { // if guess is lower we add the new step
$g = gmp_add($g, $step);
} else if ($comp == 1) { // if guess is higher we sub the new step
$g = gmp_sub($g, $step);
} else { // if guess is exactly the num we're done, we return the value
return $g;
}
}
// whatever happened, g is the closest guess we can make so return it
return $g;
}
这篇关于使用PHP/GMP计算整数的第n个根的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!