当前位置: 代码迷 >> python >> Php素数分解时间和大小问题
  详细解决方案

Php素数分解时间和大小问题

热度:107   发布时间:2023-06-13 14:24:36.0

有一个用于素数分解python实现代码。 返回答案需要大约0.1秒。 我为php实现了这个。 大量运行大约3秒(有时它永远不会返回答案)

注意:我甚在php中使用函数来处理非常大的数字。

注意:此函数内部的所有其他函数(如下所述)都是单独测试的,但其中一个函数(pollard_brent)中存在使用内置函数gmp_mod 当我运行这个:

// python handles these big numbers fine, and returns 1 for this:
echo gmp_mod(10000000000000000000001 , 2);

给我这个错误:

Message: gmp_mod(): Unable to convert variable to GMP - wrong type

我的分解代码:

public function primefactors($n, $sort = false) {
    $smallprimes = $this->primesbelow(10000);
    $factors = [];

    $limit = bcadd((bcpow($n, 0.5)) , 1);

    foreach ($smallprimes as $checker) {
        if ($checker > $limit) {
            break;
        }
        // while ($n%$checker == 0) {
        while ( bcmod($n, $checker) == 0 ) {
            array_push($factors, $checker);
            // $n = (int)($n/$checker);
            $n = bcdiv($n, $checker);
            // $limit = (int)(bcpow($n, 0.5)) + 1;
            // $limit = (bcpow($n, 0.5)) + 1;
            $limit = bcadd((bcpow($n, 0.5)) , 1);
            if ($checker > $limit) {
                break;
            }
        }
    }

    if ($n < 2) {
        return $factors;
    }

    while ($n > 1) {
        if ($this->isprime($n)) {
            array_push($factors, $n);
            // var_dump($factors);
            break;
        }
        $factor  = $this->pollard_brent($n);
        $factors = array_merge($factors, $this->primefactors($factor)); 
        $n = (int)($n/$factor);
    }
    if ($sort) {
        sort($factors);
    }

    return $factors;

}

任何想法?

正如评论中指出的那样,手册显示两个参数必须是GMP对象或数字字符串。 这有效:

echo gmp_mod("10000000000000000000001", "2");

较小的数字可能有效,因为PHP会将整数转换为函数中的字符串,但是10000000000000000000001PHP_INT_MAX长,所以它不起作用。

echo 10000000000000000000001;

产量:

1.0E+22
  相关解决方案