Algoritma Tercepat Mencetak Bilangan Prima

Beberapa waktu lalu, salah seorang anggota milis phpug bertanya mengenai bagaimana algoritma untuk mencetak bilangan prima dengan cepat. Bilangan prima yang diminta bukan hanya sampai 100 atau 1000, tapi sampai 100juta.

Sieve of Eratosthenes

Setelah mencari di Google, ternyata saya menemukan salah satu algoritma klasik untuk mencetak bilangan prima. Algoritma tersebut disebut sebagai Sieve of Eratosthenes, saya temukan di Wikipedia. Mungkin ini bukan algoritma yang tercepat, tapi setidaknya sudah cukup cepat dibanding jika menggunakan modulus.

Berikut ini algoritma tersebut yang dikutip dari Wikipedia.

Misalkan kita hendak menemukan semua bilangan prima di antara 1 sampai suatu bilangan bulat n.

  1. Tulis semua bilangan, mulai dari 1 sampai n. Misalkan ini adalah daftar A.
  2. Buat suatu daftar yang masih kosong, sebut saja daftar B.
  3. Coret bilangan 1 dari daftar A.
  4. Lalu tulis 2 pada daftar B. Lalu coret 2 dan semua kelipatannya dari daftar A
  5. Bilangan pertama yang belum tercoret dari daftar A (misalnya 3) adalah bilangan prima. Tulis bilangan ini di daftar B, lalu coret bilangan ini dan semua kelipatannya dari daftar A.
  6. Ulangi langkah 4 sampai semua bilangan di daftar A sudah tercoret.

Setelah selesai, semua bilangan di daftar B adalah bilangan prima.

Dan berikut ini contoh penerapan algoritma di atas dalam bahasa pemrograman PHP. Script ini sudah ditest untuk menampilkan bilangan prima dibawah 1.000.000 dan berhasil menampilkannya dalam waktu 3 detik.

  1. <?php
  2.  
  3. function bilangan_prima($limit) {
  4. $prima = array();
  5. $prima_awal = array(2,3,5,7);
  6.  
  7. for ($i=2; $i<=$limit; $i++)
  8. $prima[$i] = true;
  9.  
  10. foreach ($prima_awal as $awal) {
  11. for ($i=2*$awal; $i<=$limit; $i+=$awal) {
  12. $prima[$i] = false;
  13. }
  14. }
  15.  
  16. foreach ($prima as $bilangan=>$status) {
  17. if ($status) echo "$bilangan ";
  18. }
  19. }
  20. $start=mktime();
  21.  
  22. bilangan_prima(1000000);
  23.  
  24. $finish=mktime();
  25. $result=$finish-$start;
  26. echo "<br>Time: $result seconds";
  27.  
  28. ?>

Semoga bermanfaat

Comments
  1. 1705 days ago
  2. 1704 days ago
  3. 1703 days ago
  4. 1690 days ago
  5. 1142 days ago
  6. 1059 days ago
    • 1058 days ago
  7. 882 days ago
  8. 882 days ago
  9. 253 days ago
    • 242 days ago
  10. 172 days ago

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>