Calculating the n-th root of an integer using PHP/GMP

 ̄綄美尐妖づ 提交于 2019-12-08 00:07:00

问题


How can I calculate the n-th root of an integer using PHP/GMP?

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 being the most recent one at the time of writing


回答1:


Original source: Calculating Nth root with bcmath in PHP – thanks and credits to HamZa!

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; 
}


来源:https://stackoverflow.com/questions/21953495/calculating-the-n-th-root-of-an-integer-using-php-gmp

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!