python — проблема времени и размера факторизации Php

Eсть python код реализации для простые множители. Это о 0.1 второй для возврата ответа. Я реализовал это для php, В больших количествах он работает около 3 секунд (а иногда он никогда не возвращает ответ)

НОТА: Я даже использовал BCMath функции в PHP для обработки очень больших чисел.

НОТА: Все остальные функции внутри этой функции (упомянутые ниже) тестируются отдельно, но есть проблема в одной из них (pollard_brent), которая использует встроенную функцию php 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;

}

Любая идея?

1

Решение

Как указано в комментариях, в руководстве показано, что оба аргумента должны быть объектом GMP или числовой строкой. Это работает:

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

Меньшие числа могут работать, поскольку PHP преобразует целое число в строку внутри функции, однако 10000000000000000000001 длиннее чем PHP_INT_MAX так что это не сработает.

echo 10000000000000000000001;

Урожайность:

1.0E+22
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]