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. 6 years ago
  2. 6 years ago
  3. 6 years ago
  4. 6 years ago
  5. 4 years ago
  6. 4 years ago
    • 4 years ago
  7. 4 years ago
  8. 4 years ago
  9. 2 years ago
    • 2 years ago
  10. 2 years 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>