Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Liczby pierwsze
Mlodycompany
post
Post #1





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Witam. Chciałbym zrobić generator liczb pierwszych do miliona. Liczba pierwsza to ta która dzieli się przez siebie i przez 1 czyli w sumie mam dwa dzielniki. Głowie się nad tym już parę godzin i nic dobrego nie wymyśliłem. Oto co zdołałem zrobić:
  1. <?php
  2. print('<pre>');
  3. function znajdzDzielniki($liczba){
  4. $dzielniki = array();
  5. for($i = 1; $i <= $liczba; $i++){
  6. $dziel = $liczba % $i;
  7. if($dziel == 0){
  8. $dzielniki[] = $i;
  9. }
  10. }
  11. print_r($dzielniki);
  12. }
  13. function znajdzPierwsze($liczba){
  14. $pierwsze = array();
  15. for($i = 1; $i <= 1000000; $i++){
  16. $dziel = $liczba % $i;
  17. if($dziel == 0){
  18. echo znajdzDzielniki($i);
  19. }
  20. }
  21. print_r($pierwsze);
  22. }
  23.  
  24.  
  25. echo znajdzPierwsze($_GET['liczba']);
  26. ?>

Czy ktoś mógłby mnie naprowadzić na opracowanie dobrego skryptu?? Proszę o pomoc.
Go to the top of the page
+Quote Post
piotrooo89
post
Post #2


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




do miliona... szok no ale jak chcesz... ja mam cos takiego:

  1. <?php
  2. $limit=1000000;
  3. $test=2;
  4.  
  5. while($test<$limit)
  6. {
  7. $niee=0;
  8. $nie=0;
  9. $podziel=2;
  10. while($podziel<$test)
  11. {
  12. $wynik=$test%$podziel;
  13. if($wynik==0)
  14. $nie++;
  15. $podziel++;
  16. $niee=$niee+$nie;
  17. }
  18. if($niee==0)
  19. echo $test .' </ br>';
  20. $test=$test+1;
  21. }
  22. ?>


--------------------
Go to the top of the page
+Quote Post
ddiceman
post
Post #3





Grupa: Zarejestrowani
Postów: 326
Pomógł: 121
Dołączył: 23.07.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Mozna to uproscic obliczeniowo, bo wystarczy sprawdzac dzielniki od 2 do pierwsiastka z liczby a nie do liczby:
ps. jedynka jak wiadomo liczba pierwsza nie jest (liczba wg definicji to liczba naturalna, ktora ma dokladnie 2 rozne dzielniki naturalne: 1 i siebie)

  1. <?php
  2. define('ZAKRES', 1000000);
  3.  
  4. $liczby_pierwsze = array();
  5. for($liczba = 2; $liczba < ZAKRES; $liczba++){
  6. $liczba_moze_byc_pierwsza = true;
  7. for($dzielnik = 2, $dl = floot(sqrt($liczba)); $dzielnik < $dl; $dzielnik++){
  8. if($liczba % $dzielnik == 0){
  9. $liczba_moze_byc_pierwsza = false;
  10. break;
  11. }
  12. }
  13. if($liczba_moze_byc_pierwsza == true){
  14. $liczby_pierwsze[] = $liczba;
  15. }
  16. }
  17. ?>


Ten post edytował ddiceman 31.07.2008, 10:33:34
Go to the top of the page
+Quote Post
Shili
post
Post #4





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

Ostrzeżenie: (0%)
-----


Prawda jest taka, że sprawdzając warto skakać od cyfry 3 co 2. Przy wyłuskiwaniu liczb pierwszych.
Przy sprawdzaniu kolejnych warto na samym początku dać if liczba % 2 == 0, jeśli nie to w pętli również skaczemy od 3 co 2 elementy

Wiadomo, że 4, 14314, 141412412 nie są pierwsze. Na wstępie więc można je odrzucić. A jeśli coś dzieli się przez parzystą liczbę, to dzieli się również przez cyfrę 2, wystarczy więc sprawdzić tylko ten warunek.
Nie chce mi się modyfikować Waszych algorytmów, ale pozwoli to zaoszczędzić może nie tak dużo, ale zawsze trochę czasu winksmiley.jpg

Ten post edytował Shili 31.07.2008, 11:47:27
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 12:52