Лучший способ проверить, является ли число простым, - это увидеть, если он делится на любое простое число перед ним. Pi (x) - это тот, который я вижу повсюду ... Вы можете увидеть немного больше информации о Prime Counting on wikipedia.
Таким образом, наиболее эффективным способом я могу думать на данный момент выглядит следующим образом:
class prime
{
public $primes = [ 2, 3, 5, 7 ];
public $not_prime = [ 1, 4, 6, 8, 9 ];
public function is_prime(int $n)
{
if ($n <= 1) return false;
if (in_array($n, $this->primes)) return true;
if (in_array($n, $this->not_prime)) return false;
for($i = 0; $i < count(array_slice($this->primes, 0, $this->prime_count($n))) || $i == $n; $i++)
{
if ($n % $this->primes[ $i ] == 0) return false;
}
return true;
}
public function build_primes_to(int $n)
{
for ($i = end($this->primes) + 1; $i <= $n; $i++)
{
if ($this->is_prime($i))
{
$this->primes[] = $i;
}
else
{
$this->not_prime[] = $i;
}
}
}
public function prime_count($n)
{
$ln = log($n);
if ($ln == 0) return 1;
return intval(ceil($n/$ln));
}
}
Что на самом деле не очень эффективным, а не тогда, когда речь идет о создании списка простых чисел .. Я работал над лучшим способом построения списка here, хотя было бы легко и гораздо эффективнее найти список в Интернете и использовать его.
Использование выше будет вдоль линий:
$find_to = 1000;
$prime = new prime();
$prime->build_primes_to($find_to);
print "<pre>";
for ($i = 1; $i < $find_to; $i++)
{
print "$i is " . (!$prime->is_prime($i) ? "not " : "") . "prime\n";
}
ли получить номер потолка требуется квадратный корень или достаточно пола? У меня возникли проблемы с мыслью о числе, которое будет делиться потолком квадратного корневого номера –
... '$ sqrt = ceil (sqrt ($ num)); ... , если вы вычисляете sqrt за пределами цикла for, это ускорит работу на ~ 400%, особенно при проверке большого количества больших чисел. – nimmneun
Привет @Farkie, вы попробовали? 'Neun @ моно: ~ $ PHP test.php поплавок (+7,9089679718018) Neun @ моно: ~ $ PHP test2.php поплавок (+2,5886662006378)' ' – nimmneun