Формула, каб знайсці простыя лікі ў цыкле

Мне трэба знайсці простыя лікі з цыкл або падчас цыкла

Я напісаў гэта, але гэта няправільна

<?php
$i = 1;
while($i<5)
{
    for($j=1; $j<=$i; $j++)
    {
        if ($j != 1 && $j != $i)
        {
            echo $i . "/" . $j . "=" . $i%$j . "
"; if ($i%$j != 0) { echo $i . "
"; } } } echo "
"; $i += 1; } ?>

Ці ёсць спосаб падзяліць лік з масівам, каб знайсці астатнія?

8

19 адказы

Вось невялікая функцыя, якую я знайшоў: ( HTTP://icdif .com/вылічальнае/2011/09/15/чэк-нумар-прайм-нумар/) Здалося працаваць на мяне!

function isPrime($num) {
    //1 is not prime. See: http://en.wikipedia.org/wiki/Prime_number#Primality_of_one
    if($num == 1)
        return false;

    //2 is prime (the only even number that is prime)
    if($num == 2)
        return true;

    /**
     * if the number is divisible by two, then it's not prime and it's no longer
     * needed to check other even numbers
     */
    if($num % 2 == 0) {
        return false;
    }

    /**
     * Checks the odd numbers. If any of them is a factor, then it returns false.
     * The sqrt can be an aproximation, hence just for the sake of
     * security, one rounds it to the next highest integer value.
     */
    $ceil = ceil(sqrt($num));
    for($i = 3; $i <= $ceil; $i = $i + 2) {
        if($num % $i == 0)
            return false;
    }

    return true;
}
33
дададзена
... $ SQRT = CEIL (SQRT ($ Num)); ... калі вылічыць SQRT па-за для цыклу гэта паскорыць рэчы на ​​~ 400%, асабліва пры праверцы шмат вялікая колькасць
дададзена аўтар nimmneun, крыніца
Прывітанне @Farkie, вы далі яму паспрабаваць? <�Код> Neun @ мана: ~ $ PHP test.php паплавок (7,9089679718018) Neun @ мана: ~ $ PHP test2.php паплавок (2,5886662006378) `
дададзена аўтар nimmneun, крыніца
Можа таксама быць запісана ў выглядзе: для ($ I = 3; $ я <= $ CEIL; $ I + = 2) {
дададзена аўтар Oliver Tappin, крыніца
Атрымлівае нумар столі квадратнага кораня патрабуецца або досыць падлогу дастаткова? У мяне паўсталі праблемы, думаючы, лік, якое будзе дзяліцца на столі квадратных караняцца колькасці
дададзена аўтар Curtis W, крыніца
Ці мае сэнс правяраць/9, калі лік ня/3? Я маю на ўвазе, што няма сэнсу $ NUM% $ я , дзе $ я не першасная сама.
дададзена аўтар iXCray, крыніца

You can use this PHP function gmp_nextprime()

11
дададзена
Вы павінны ДНУ Multiple Precision (GMP) Матэматычная Падаўжальнік для ўстаноўкі
дададзена аўтар itsazzad, крыніца
Хоць гэта не заўсёды даступна: /
дададзена аўтар fejese, крыніца

Вось адзін укладыш, я знайшоў некаторы час таму, каб праверыць простыя лікі. Ён выкарыстоўвае уліковыя знакі (унарный матэматыка), каб вызначыць:

function is_prime_via_preg_expanded($number) {
    return !preg_match('/^1?$|^(11+?)\1+$/x', str_repeat('1', $number));
}

Праверце ўсе нумары паслядоўна для простых лікаў:

$i=2;//start here (2 is the first prime)
while (1) {//neverending loop
    if (is_prime_via_preg_expanded($i)) echo $i." 
\n"; $i++; }

Каб праверыць толькі дыяпазон нумароў для простых лікаў, як у паказаным прыкладзе:

$start = 2;//start here (2 is the first prime)
$end = 100;

$i=$start;
while ($i<=$end) {
    if (is_prime_via_preg_expanded($i)) echo $i." 
\n"; $i++; }
7
дададзена
Гэта чортаў Дзіўна Джэф!
дададзена аўтар pimbrouwers, крыніца
Гэта адзін з'яўляецца дзіўным для праверкі адзін раз. Але гэтая функцыя значна больш павольна, чым прадугледжаныя альтэрнатывы з дапамогай завес.
дададзена аўтар Julius Š., крыніца

Гэта базавая рэалізацыя:

function prima($n){

  for($i=1;$i<=$n;$i++){  //numbers to be checked as prime

          $counter = 0; 
          for($j=1;$j<=$i;$j++){ //all divisible factors


                if($i % $j==0){ 

                      $counter++;
                }
          }

        //prime requires 2 rules ( divisible by 1 and divisible by itself)
        if($counter==2){

               print $i." is Prime 
"; } } } prima(20); //find prime numbers from 1-20

Гэты выхад будзе

 2 is Prime 
 3 is Prime 
 5 is Prime 
 7 is Prime 
 11 is Prime 
 13 is Prime 
 17 is Prime 
 19 is Prime 

Complete Logic step-by-step and visual analogy here : Here

6
дададзена

Без матэматычнай функцыі:

function isPrimeNumber($i) {
    $n = 2;
    while ($n < $i) {
        if ($i % $n) {
            $n++;
            continue;
        }

        return false;
    }

    return true;
}
3
дададзена

Усе, хто SQRT() з'яўляецца ілжывым або любым значэннем з якая плавае кропкай з'яўляецца простым лікам

2
дададзена
гэта не правільна дакладна. думаць аб 6, чый SQRT() з'яўляецца паплавок, але само па сабе не з'яўляецца простым лікам. яно павінна быць; SQRT() простага ліку заўсёды паплавок, які вы можаце выкарыстоўваць, каб паскорыць працэс, вырашаючы, калі цыкл праз шмат лікаў.
дададзена аўтар keune, крыніца
@keune Гэта дакладна ў прыкладзе цотнага ліку, але функцыя не ўлічвае тых, хто ў гэтым выпадку. Вы маеце рацыю, хоць; ўсе лікі лічыцца, што заява не стаіць на сваіх уласных.
дададзена аўтар dsimer, крыніца

Гэта, я лічу, з'яўляецца вельмі эфектыўным руціна, у якім пералічаныя ўсе простыя лікі до 1000.

Ён правярае кожны нумар ($ х), каб убачыць, калі ён мае якія-небудзь фактары (акрамя сябе і 1, вядома).

Матэматычна гэта не трэба, каб праверыць усе меншая колькасць як магчымыя фактары, толькі ніжнія простых лікі да квадратнага кораня з $ х. Гэта забяспечваецца за кошт захоўвання простых лікаў, паколькі яны знаходзяцца ў масіве (які я думаю, што гэта стратэгія ФП мела на ўвазе).

Як толькі будзе знойдзены першым прэм'ер-фактар, мы ведаем, што $ й не з'яўляецца простым, і таму далейшымі выпрабаваннямі гэтага значэння $ й не патрабуецца, і мы можам выйсці з цыклу Еогеаспа.

$primes = array();
for ($x = 2; $x <= 1000; $x++) {
    $xIsPrime = TRUE;
    $sqrtX = sqrt($x);
    foreach ($primes as $prime) if ($prime > $sqrtX || ((!($x % $prime)) && (!$xIsPrime = FALSE))) break;
    if ($xIsPrime) echo ($primes[] = $x)  . "
"; }
1
дададзена
<?php

    $n = 11;
    $o = $_POST["maxprime"];
    echo 'The script calculated the next primenumbers:
'; echo '2, 3, 5, 7, '; while (true) { $t = 6; while (true) { if ($n % ($t - 1) == 0) { break; } if ($n % ($t + 1) == 0) { break; } if ($t > sqrt($n)) { echo("$n, "); break; } $t += 6; } if (($n + 1) % 6 == 0) { $n += 2; } else { $n += 4; } if ($n > $o) { break; } } ?>

http://www.primenumbergenerator.com/

1
дададзена

Знайсці простыя лікі ад 1 да 10000, выкарыстоўваючы замыканне ў array_filter ():

$start = 2;
$step = 10000;

$stop = $start + $step;
$candidates = range($start, $stop);    
for($num = 2; $num <= sqrt($stop); ++$num){                        
    $candidates = array_filter($candidates,
        function ($v) use (&$num){
             return ($v % $num) != 0 || $v == $num ;
        }
    );
}
print_r($candidates);

Edit: 1 не з'яўляецца простым лікам

0
дададзена
Проста пачніце з 2, а не 1, дзякуй за паведамленне!
дададзена аўтар user3396065, крыніца
Nice выключэннем таго, што дае 1 як простае лік.
дададзена аўтар DevFox, крыніца
<?php 
$limit=100;

$i=1;


outer:while($i<=$limit){
    $j=2;
    while($j<$i){
        if($i%$j==0){
            $i++;
            goto outer;
        }
        $j++;
    }
    echo $i;
    echo "
"; $i++; } ?>
0
дададзена

Sieve_of_Eratosthenes is simple and faster algorithm to find prime numbers.

function getPrimes($finish)
    {
        $number = 2;
        $range = range($number,$finish);
        $primes = array_combine($range,$range);
        while($number*$number < $finish){
            for($i=$number; $i<=$finish; $i+=$number){
                if($i==$number){
                    continue;
                }
                unset($primes[$i]);
            }
            $number = next($primes);
        }
        return $primes;
    }
0
дададзена
<�Код> getPrimes (25) вяртае 25 як простае лік, аднолькавыя для getPrimes (49) і 49. Толькі, здаецца, адбываецца, калі канчатковая кропка квадратнае лік, хоць і не для Усе яны.
дададзена аўтар DevFox, крыніца
<?php
function prime_number($num){
    for( $j = 2; $j <= $num; $j++ )
    {
        for( $k = 2; $k < $j; $k++ )
        {
            if( $j % $k == 0 )
            {
                break;
            }
        }
        if( $k == $j )
            echo "Prime Number : ".$j."
"; } } prime_number(23); ?>
0
дададзена

Лепшы спосаб праверыць, ці з'яўляецца лік прэм'ер, каб убачыць, калі ён дзеліцца на любы простае лік перад ім. Pi (х) з'яўляецца адзін я працягваю бачыць паўсюль ... Вы можаце ўбачыць трохі больш інфармацыі аб Prime Разлічваючы на ​​ тут , хоць гэта было б так жа лёгка і значна больш эфектыўна, каб знайсці спіс у Інтэрнэце і выкарыстоўваць гэта.

Выкарыстанне вышэйпералічанага было б уздоўж ліній:

$find_to = 1000;
$prime = new prime();
$prime->build_primes_to( $find_to );
print "
";
for ( $i = 1; $i < $find_to; $i++ )
{
    print "$i is " . ( !$prime->is_prime( $i ) ? "not " : "" ) . "prime\n";
}


0
дададзена

Я ведаю, што гэта занадта позна, але я выявіў, што гэта рашэнне значна лепш і лёгка

function isPrime($num)
{
    if ($num < 2) {
        return false;
    }
    for ($i = 2; $i <= $num/2; $i++) {
        if ($num % $i == 0) {
            return false;
        }
    }

    return true;
}
0
дададзена
$n = 7;

if ($n == 1) {
    echo 'Not a Prime or Composite No.';
}

$set = 0;
for ($index = 2; $index <= $n/2; $index++) {

    if ($n % $index === 0) {
        $set = 1;
        break;
    }
}

if ($set) {
    echo 'Composite';
} else {
    echo 'Prime';
}
0
дададзена

Enchanced версія @Farkie адказу зробленая спецыяльна для праверкі простых лікаў у завесах.

function isPrime_v2($num) {
    static $knownPrimes=[3];//array to save known primes

    if($num == 1)
        return false;

    if($num == 2 || $num == 3) //added '3'
        return true;

    if($num % 2 == 0)
        return false;

    $ceil = ceil(sqrt($num)); //same purpose, good point from Farkie

   //Check against known primes to shorten operations
   //There is no sense to check agains numbers in between
    foreach($knownPrimesas $prime){
        if ($prime>$ceil)
            break;
        if($num===$prime)
            return true;
        if($num % $prime == 0)
            return false;
    }


    /**
     * end($knownPrimes) % 2 !==0 - mathematically guaranteed
     * start with latest known prime
     */
    for($i = end($knownPrimes)+2; $i <= $ceil; $i = $i + 2) {
        if($num % $i == 0)
            return false;
    }
    $knownPrimes[]=$num;
    return true;
}

Benchmark з phpfiddle.org. V1 - Farkie адказ, V2 - Enchanced версія

V1 (1 to 5,000,000): divisions=330 929 171; primes=348 513; time=21.243s
V2 (1 to 5,000,000): divisions=114 291 299; primes=348 513; time=10.357s

<�моцны> УВАГА! isPrime_v2 функцыя дастасоўная толькі ў выпадку зацыклення ад 3. У адваротным выпадку захоўваюцца $ knownPrimes масіў будзе мець недастатковую гісторыю.

0
дададзена
Вы будзеце ў канчатковым выніку запусціць з памяці, калі вы запусціце гэта так вялікі, але ён будзе хутчэй (кэшаванне) :)
дададзена аўтар Farkie, крыніца

я ведаю, што гэта прыходзіць даволі позна, але спадзяюся, што гэта дапаможа камусьці.

    function prime_number_finder($range)
    {
        $total_count=0;//intitialize the range keeper

        $i=1;//initialize the numbers to check

        while ($total_count<=$range)
        {
           $count=0;//initialize prime number inner count
           $k=$i;
           while ($k!=0)
           {

             if(($i%$k)==0)
             {
              $count++;
             }
              $k--;
           }
           //condition to check if a number is prime 
          if($count==2 || $count==1)
           {
            echo $i."
";//output the prime number; $total_count++; $i++; } //number is not prime if($count>2) { //$total_count++; $i++; } } }

// прыклад    prime_number_finder (200);

0
дададзена
Добра, вы павінны зрабіць гэта больш ясным ў наступны раз. Сардэчна запрашаем на ТАК!
дададзена аўтар 2rs2ts, крыніца
Майце на ўвазе, што растлумачыць, што апошняя радок ваш адказ? "// Прыклад prime_number_finder (200);"
дададзена аўтар 2rs2ts, крыніца
Значыць, вы спрабуеце выклікаць яго?
дададзена аўтар 2rs2ts, крыніца
prime_number_finder (200) гэта ўсяго толькі прыклад таго, як функцыя працуе, прыклад атрымлівае першыя 200 простых лікаў з натуральных лікаў.
дададзена аўтар lukkystunt, крыніца
да ... для выкліку функцыі
дададзена аўтар lukkystunt, крыніца
спадзяюся, што гэта было карысна
дададзена аўтар lukkystunt, крыніца

Я ведаю, што гэта прыходзіць трохі позна, але вось простая праграма, якая дапаможа вам зрабіць менавіта тое, што вы просіце ...

<?php 
 //Prime Function
 function fn_prime($number) {
    $i = 2; $result = TRUE;
    while($i < $number) {
        if(!($number%$i)) {
            $result = FALSE;
        }
        $i++;
    }
    return $result;
 }

//Declare integer variable...
$k = 0;

//Start Loop up to any number of your choice for e.g. 200
while($k < 200) {
    if(fn_prime($k)) {
        echo "$k is a prime number
"; } else { echo "$k is not a prime number!
"; } $k++; } ?>
0
дададзена

Вось яшчэ адзін вельмі просты, але эфектыўны падыход ціха:

function primes($n){

    $prime = range(2 , $n);

    foreach ($prime as $key => $value) {

        for ($i=2; $i < $value ; $i++) { 

            if (is_int($value/$i)) {

                unset($prime[$key]);
                break;
            }
        }
    }

    foreach ($prime as $value) {
        echo $value.'
'; } } primes(1000);
0
дададзена