У меня проблема, я пытаюсь вычислить, что самое низкое простое число, но я не понимаю результат, который дает PHP.
Если у меня есть этот номер
$number = 600851475143;
Тогда модуль I:
$primes = array( 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97); foreach($primes as $key=>$value) { if($number % $value == 0 ) {echo $value; break; } }
Почему это $ value = 3? Если $ value = 3, это означает, что 600851475143/3 должно быть целым числом, но его нет. Поэтому я не понимаю, почему if () оценивает значение true?
Используя PHP 5.2.8, он не работает, как описано в вопросе. Похоже, что оператор modulo не работает с большими целыми числами. Вы должны использовать bc_mod
(модуль с произвольной точностью):
<?php $number = 600851475143; $primes = array(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97); foreach($primes as $key=>$value) { if($number % $value == 0 ) {echo $value."<br/>"; } if(bcmod($number, $value) == 0) {echo "bcmod ".$value."<br/>"; } } ?>
Вышеприведенный код печатает:
3
29
bcmod 71
См. Этот список ошибок здесь
% не работает для чисел более 2 ^ 31 (32-разрядный) или 2 ^ 63 (64-разрядный). Вместо этого используйте BCMOD .
Возможно, я ошибаюсь, но modulo дает вам остальную часть деления, так что, например, 600851475143/3 – 200283825047 rest 2, и это то, что он возвращает.