Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Czy podana liczba jest liczbą pierwszą?
Forum PHP.pl > Forum > Przedszkole
b_chmura
Panowie jak napisać skrypt który sprawdza czy podana liczba jest liczbą pierwszą?
23kulpamens
ponieważ nie ma skutecznego algorytmu odnajdywania wszystkich liczb pierwszych, najłatwiej chyba będzie jak zrobisz tablicę z pierwszoma kilkunatoma liczbami pierwszymi i sprawdzać czy liczba jest w tej tablicy. Któreś tam z koleii liczby pierwsze są tak duże że nikt ich chyba nie używa, a tych pierwszych pierwszych nie ma tak dużo winksmiley.jpg Poztym obliczanie czy liczba jest pierwsza za każdym razem pożerałoby dużo mocy obliczeniowej
dr_bonzo
A jaka jest definicja libczy pierwszej? Jest to taka liczba ktora jest podzielna tylko przez 1 i przez sama siebie, no i oprocz 1ki.

Czyli sprawdzasz po kolei od 2 do N czy liczba N jest podzielna przez jakas inna liczbe. Oczywiscie mozna to zoptymalizowac.
Ertai
Jezeli masz podany zakres (gorne ograniczenie tych liczb) to mozesz sprawdzac czy dana liczba dzieli sie przez wszystkie od niej nizsze z reszta wieksza niz 0, jezeli dzieli sie tylko przez 1 z reszta rowna 0 to znaczy, ze masz liczbe pierwsza. (dzielenie z reszta to operacja modulo). Nie jest to oczywiscie najodpowiedniejszy algorytm ani najszybszy ale jest bardzo prosty do napisania.
b_chmura
  1. <?php
  2. function liczbapierwsza($int)
  3. {
  4.  
  5. $czy = true;
  6. $i = 2;
  7. while($i < $int)
  8. {
  9. if($int % $i == 0)
  10. {
  11. $czy = false;
  12. }
  13. $i++;
  14. }
  15. return $czy;
  16. }
  17. ?>


nie chciało mi się myśleć
phpion
Weź to zoptymalizuj trochę... Masz niepotrzebne przebiegi pętli. Zrób to tak:
  1. <?php
  2. function liczbapierwsza($int) {
  3. $i = 2;
  4.  
  5. while($i < $int) {
  6. if($int % $i == 0) {
  7. return false;
  8. }
  9.  
  10. $i++;
  11. }
  12.  
  13. return true;
  14. }
  15. ?>
b_chmura
aż tak duże znaczenie ma jak zwracam false lub true?
phpion
Nie jak tylko kiedy. Weźmy np. liczbę 999999. Twój kod wykona 999999 pętli po czym zwróci false. Mój natomiast wykona tylko 2 pętle (dla $i=2 oraz $i=3) i również zwróci false. Dlaczego? Ano dlatego, że Ty zwracasz prawdę/fałsz na końcu, po wykonaniu wszystkich pętli, natomiast u mnie zwracany jest fałsz przy pierwszym przypadku spełniającym dany warunek. Podobny efekt uzyskałbyś dając przy spełnieniu warunku instrukcję break; lub dodając do while'a && $czy === true.
drPayton
Jeszcze prościej:
  1. <?php
  2. function is_prime($number)
  3. {
  4. foreach(range(2, $number-1) AS $test) {
  5. if($number%$test==0) {
  6. return false;
  7. }
  8. }
  9. return true;
  10. }
  11.  
  12.  
  13. echo (is_prime(29)) ? "liczba pierwsza" : "liczba nie jest pierwsza";
  14. ?>
phpion
Prościej ale czy wydajniej? smile.gif foreach + range? smile.gif nie sądzę smile.gif
PS: aczkolwiek różnice wydajnościowe będą mikroskopijne ale jednak tongue.gif
Gonzo44
1. Jeżeli dobrze pamiętam to nie trzeba dzielić przez wszystkie liczby od 2 do N-1, wystarczy do N/2 lub do (N-1)/2, z zaokrągleniem do całkowitych oczywiście.
2. Jeżeli coś nie jest podzielne przez 2 to nie jest też przez jej potęgi, to samo z 3, 5, 7...
cornholio666
Witam,

ja jeszcze dorzucę ciekawy temat:

Sito Eratostenesa

Z powyższego linka:
  1. <?php
  2. /**
  3. * tworzy tablice z liczbami pierwszymi
  4. * @param integer zakres wyszukiwanych liczb pierwszych
  5. */
  6. function pierwsze($zakres){
  7. if(!is_numeric($zakres)) return array();
  8. $tablica=array_fill(0, $zakres, true); #wypelniamy tablice wartosciami true
  9. $tablica[0]=false; # 0 nie jest pierwsza
  10. $tablica[1]=false; # 1 nie jest pierwsza
  11. for($i=2; $i<=floor(sqrt($zakres)); ++$i){
  12. if(!$tablica[$i]) continue;
  13. $w=$i*$i;
  14. while($w<=$zakres){
  15. $tablica[$w]=false;
  16. $w+=$i;
  17. }  
  18. }
  19.  
  20. return array_keys($tablica, true); #zwracamy tablice z kluczami, ktore maja wartosc true
  21.  
  22. }
  23. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.