login  Naam:   Wachtwoord: 
Registreer je!
 Scripts:

Scripts > PHP > Wiskunde > Priemgetallen zoeken (eratosthenes zeef)

Priemgetallen zoeken (eratosthenes zeef)

Auteur: Thomas - 27 augustus 2004 - 14:48 - Gekeurd door: Dennisvb - Hits: 10279 - Aantal punten: 4.19 (8 stemmen)



Met behulp van eratosthenes zeef worden alle priemgetallen uit een interval [2..n] 'gezeefd'. Dit werkt als volgt:

Gegeven een getal n (>1), de lijst L [2, ..., n], de lege lijst P
doe, zolang L niet leeg is
g is het kleinste getal in de lijst L
voeg dit getal toe aan P
verwijder alle veelvouden van g uit L
einde doe

Na afloop is dus L leeg, en bevat P alle priemgetallen uit het interval [2..n]

Bij onderstaande implementatie is gebruik gemaakt van het feit dat elk getal is opgebouwd uit priemgetallen.

Mogelijke optimalisatie:
Je zou alleen priemgetallen hoeven te controleren die kleiner zijn dan of
gelijk zijn aan de wortel van het te controleren getal, immers als je geen
getal a hebt zodat
g = a*b en a <= wortel(g)
dan is er ook geen getal b zodat
g = a*b en b >= wortel(g)

Mogelijke uitbreiding:
Als je wat grotere priemgetallen wilt gaan berekenen zal je een mechanisme
moeten bedenken waarbij eerder berekende priemgetallen worden opgeslagen, en
weer worden opgehaald op het moment dat je wilt bepalen of een bepaald getal
een priemgetal is.

Code:
eratosthenes zeef:
  1. <?php
  2. function erathostenes($end) {
  3. // maakt gebruik van het feit dat elk getal opgebouwd is uit priemgetallen
  4.  
  5. // pre: $end is een positief geheel getal (>0)
  6. // ret: een array met alle priemgetallen tussen [2..$end]
  7.  
  8. $primes = array(); // array van priemgetallen (wordt geretourneerd)
  9. $current = 2; // start nummer voor het zoeken naar priemgetallen (niet veranderen)
  10.  
  11. while($current <= $end) {
  12. // is het huidige getal een veelvoud van een priemgetal ?
  13. $i = 0;
  14. while($i < sizeof($primes) && ($current % $primes[$i]) > 0) {
  15. $i++;
  16. }
  17. if($i == sizeof($primes)) {
  18. // het huidige getal is een priemgetal
  19. $primes[] = $current;
  20. }
  21. $current++;
  22. }
  23. // retourneer het resultaat
  24. return $primes;
  25. }
  26. ?>


tabel voor het afdrukken:
  1. <?php
  2. $getal = ...; // zelf in te vullen
  3. $results = erathostenes($getal);
  4.  
  5. $cols = 20;
  6. $rows = ceil($getal/$cols);
  7. ?>
  8. <table border="1">
  9. <?php
  10. for($j=0; $j<$rows;$j++) {
  11. ?><tr><?php
  12. for($i=0; $i<$cols;$i++) {
  13. $nr = $cols*$j+$i+1;
  14. ?><td><?= ($nr <= $getal ? (in_array($nr, $results) ? "<b>".$nr."</b>" : $nr) : "<br />") ?></td><?php
  15. }
  16. ?></tr><?php
  17. }
  18. ?>
  19. </table>
Download code! Download code (.txt)

 Bekijk een voorbeeld van dit script!
 Stemmen
Niet ingelogd.

 Reacties
Post een reactie
Lees de reacties (2)
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.032s