Как я могу вычислить n-й корень целого с помощью PHP / GMP?
Хотя я нашел функцию gmp_root(a, nth)
в источнике PHP , кажется, что эта функция еще не была опубликована в любом выпуске *: http://3v4l.org/8FjU7
*) 5.6.0alpha2 является самым последним во время написания
Исходный источник: вычисление N-го корня с bcmath в PHP – спасибо и кредиты HamZa !
Я переписал код для использования GMP вместо 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; }