Существует алгоритм для простой факторизации в python
. Он работает примерно за 10 миллисекунд для большого целого. Я переписал его для php
. Также для очень больших целых чисел я использовал bc
и gmp
функции в php. Результат очень медленный и занимает около 4 секунд для того же входа!PHP vs python, проблема с производительностью в php
Вот мой код:
(Примечание: функции в основной функции тестируются отдельно, и они очень быстро)
public function primefactors($n, $sort = false) {
$smallprimes = $this->primesbelow(10000);
$factors = [];
// NOTE: bc or gmp functions is used for big numbers calculations
$limit = bcadd(bcsqrt($n) , 1);
foreach ($smallprimes as $checker) {
if ($checker > $limit) {
break;
}
// while (gmp_mod($n, $checker) == 0) {
// 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 = bcadd(bcsqrt($n) , 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;
}
Есть ли какие-либо проблемы производительности в моем коде ?? Или у php
есть проблема с производительностью? Почему python так быстро? (примерно в 40 раз быстрее)
Edit: Вот код питона:
smallprimes = primesbelow(10000) # might seem low, but 1000*1000 = 1000000, so this will fully factor every composite < 1000000
def primefactors(n, sort=False):
factors = []
limit = int(n ** .5) + 1
for checker in smallprimes:
if checker > limit: break
while n % checker == 0:
factors.append(checker)
n //= checker
limit = int(n ** .5) + 1
if checker > limit: break
if n < 2: return factors
while n > 1:
if isprime(n):
factors.append(n)
break
factor = pollard_brent(n) # trial division did not fully factor, switch to pollard-brent
factors.extend(primefactors(factor)) # recurse to factor the not necessarily prime factor returned by pollard-brent
n //= factor
if sort: factors.sort()
return factors
без соответствующего кода Python, как мы можем сравнить ваш «перевод»? –
Хорошо, позвольте мне предоставить код python. Благодарю. –
@ Ev.Kounis Пожалуйста, проверьте править часть. –