Selama hidaupnya, orang menjadi kaya karena mengikuti dua peraturan sederhana. Pertama, mereka berhemat, yang berarti membelanjakan lebih sedikit dibanding penghasilannya. Kedua, mereka menggunakan kredit secara bijaksana dan tidak berlebihan dalam utang. (Adam Shaw & Marc Robinson)
Ditulis pada Rabu, 19 Agustus 2009 00:48:49 | Dibaca sebanyak : 5963 kali
Mencari bilangan prima menurutku adalah menu wajib bagi seorang programmer newbie yang ingin mengasah kemampuan algoritmanya. Mengapa? Karena dalam algoritma bilangan prima inilah, aku dulu menyadari betapa pentingnya 'setiap detik' dalam proses eksekusi program. Hehehe. Dalam artikel ini, kita akan membahas beberapa teknik-teknik algoritma untuk menentukan apakah suatu bilangan termasuk dalam bilangan prima atau bukan, beserta optimasi coding yang bisa dilakukan.
Definisi bilangan prima adalah bilangan yang lebih besar dari satu dan hanya mempunyai dua faktor, yaitu angka satu dan dirinya sendiri. Dari definisi ini, kita dapat menentukan apakah suatu bilangan termasuk bilangan prima atau bukan, dengan cara mencari faktor bilangan tersebut selain angka satu dan dirinya sendiri. Bila bilangan tersebut tidak mempunyai faktor selain satu dan dirinya sendiri, maka bilangan itu prima. Mudah ya!?
Sieve of Erathosenes
Sebelum memulai koding, alangkah baiknya kita membahas suatu teknik yang konon lebih cepat dan efisien untuk menentukan bilangan prima. Yaitu dengan menggunakan algoritma Sieve of Erathosenes. Namun, dalam artikel ini, kita tidak akan membahas implementasi kodenya. Mengapa? Karena, implementasi kodenya mau tidak mau harus bersinggungan dengan array, maka tidak cocok untuk programmer gadungan seperti diriku. Xixixi. Tapi tak usah kuatir, aku akan membahas sedikit konsepnya, yah berhubung aku masih seorang pg, maka akan kubahas sebisaku. Maaf kalau ada yang salah.
Misal kita akan mencari bilangan prima antara 1-100, maka langkah pertama adalah kita mencatat angka 1-100, misal kita menggunakan kertas. Karena angka 1 tidak memenuhi definisi bilangan prima, maka kita coret angka tersebut. Kemudian, angka berikutnya, yaitu angka 2, akan dianggap sebagai bilangan prima. Selanjutnya, kita coret semua kelipatan dari angka 2 ini, yaitu 4, 6, 8, 10, hingga angka 100, karena pasti bukan bilangan prima.
Kemudian, bilangan berikutnya setelah angka 2, yang belum tercoret, yaitu angka 3, pasti bilangan prima. Seperti langkah sebelumnya, coret semua kelipatan dari 3. Begitu seterusnya, sehingga pada akhirnya akan terdapat 25 bilangan yang belum tercoret. Dan bilangan-bilangan itulah bilangan prima pada range 1-100.
Kembali ke Laptop
Seperti yang sudah kita bahas sebelumnya, untuk menentukan bilangan prima, maka kita cukup mencari faktor lain dari bilangan tersebut, selain angka satu dan bilangan tersebut. Untuk mencari faktor suatu bilangan x, algoritma yang umum digunakan adalah dengan membrute-force dari 1 hingga x/2. Berikut contoh script dalam javascript untuk menentukan bilangan prima dengan cara mencari faktor-faktor dari suatu bilangan x.
function CekPrima(x){
if(x==1) return false;
if(x==2 || x==3) return true;
else
//brute force sampai x/2
for(var i=2; i <= Math.ceil(x/2); i++)
if(x%i == 0)
return false;
return true;
}
Fungsi dalam javascript di atas adalah algoritma yang sering kutemui di dalam buku-buku pemrograman. Baik itu dalam bahasa C, C++, PHP, Pascal, Delphi, VB, VB.NET, JAVA, dlsb. Padahal coding di atas masih bisa dioptimasi. Entah mengapa para penulis buku pemrograman masih menggunakan algoritma di atas. Mungkin karena konteks bukunya adalah buku pemrograman bagi orang yang ingin belajar pemrograman dari nol, sehingga tidak ingin terlalu njlimet. Kalau buku algoritma mungkin lain ceritanya kali ya? Tau ah gelap.
Nah, sebenarnya, untuk menentukan bilangan prima, kita cukup me-brute force hingga akar dari bilangan tersebut. Kalau mencari faktor, mau tidak mau memang kita harus me-brute force hingga x/2, namun kalau cuman untuk mencari bilangan prima, kita cukup looping hingga akar x. Kok bisa? Seperti yang kukatakan di awal, dalam pemrograman, setiap detik (ehem, bahkan tiap milidetik) begitu berharga. Silakan dicorat-coret di kertas, mengapa kok cukup sampai akar x, hihihi. Berikut fungsi yang lebih baik daripada fungsi sebelumnya.
function CekPrima(x){
if(x==1) return false;
if(x==2 || x==3) return true;
else
//brute force sampai sqrt(x)
for(var i=2; I <= Math.ceil(Math.sqrt(x)); i++)
if(x%i == 0)
return false;
return true;
}
Mungkinkah dioptimasi lagi? Hmm, masih bisa. Misal kita ingin menentukan bilangan pada range 1-100, apakah prima atau bukan, sebenarnya kita cukup melakukan operasi mod sebanyak 4 kali, yaitu x mod 2, x mod 3, x mod 5, dan x mod 7. Misal untuk menentukan bilangan 97, kalau pakai cara sebelumnya, kita harus melakukan looping operasi mod sampai 10 kali. Padahal sebenarnya cuman butuh 4 kali. Berikut contoh implementasinya.
function CekPrima(x){
//untuk x = 1-100
if(x==1) return false;
if(x==2 || x==3 || x==5 || x==7) return true;
if(x%2==0) return false;
if(x%3==0) return false;
if(x%5==0) return false;
if(x%7==0) return false;
if(x<100) return true;
//untuk x lebih dari 100
for(var i=8; I <= Math.ceil(Math.sqrt(x)); i++)
if(x%i == 0)
return false;
return true;
}
Fungsi di atas memerlukan pengecekan operasi mod hingga 4 kali, untuk x <= 100. Untuk x > 100, maka kita akan menggunakan cara sqrt yang telah kita bahas sebelumnya. Kekurangan dari algoritma ini adalah kita harus menentukan batas bilangan prima yang akan digunakan untuk operasi mod untuk range bilangan tertentu. Misal kalau range 1-100, maka batasnya 7, sedang kalau range 1-100000 batasnya adalah 313. Jadi, bisa dibilang cara mix ini merupakan algoritma yang tidak murni lagi. Karena angka-angka prima yang digunakan sebagai batas sudah diketahui. Hehehe.
Namun, dari algoritma inilah, aku mengambil pelajaran berharga dalam dunia pemrograman, bahwa coding yang lebih panjang belum tentu akan menjadi lebih lambat, serta begitu berharganya waktu yang digunakan untuk satu kali looping. Thanks to Mr Rudi Kurniadi, pak dosen Struktur Data di STMIK ProVisi Semarang, yang telah memberikan pencerahan.
Manakah Algoritma yang Lebih Efisien?
Silakan lakukan percobaan berikut. Masukkan angka di dalam textbox, trus klik salah satu tombol yang ada. Group 3 tombol pertama berfungsi untuk menentukan bilangan dalam textbox itu prima atau bukan, sedang group 3 tombol berikutnya untuk mencari jumlah bilangan prima yang terdapat dari range 1-x, di mana x adalah angka di dalam textbox. Tombol dengan label 'Cara mix' mengimplementasikan cara ke-3 (yang kita bahas paling akhir), 'Cara bruteforce sqrt(x)' mengimplementasikan cara ke-2, sedang 'Cara bruteforce x/2' untuk cara ke-1.
Menentukan Bilangan Prima:
Mencari Jumlah Bilangan Prima dalam Range
Untuk lebih memudahkan dalam melakukan percobaan, silakan masukkan angka 99991, 999983, 1234567891, kemudian klik group tombol pertama. Dari hasil percobaanku (semoga hasilnya sama d:), dapat kusimpulkan, bahwa cara mix dan cara sqrt(x) cukup seimbang. Kadang cara mix lebih cepat, kadang cara sqrt(x) lebih unggul. Sedang cara x/2, pasti sudah tahu perbedaannya kan?
Nah, selanjutnya, kita akan mencari jumlah bilangan prima dalam range 1-x. Berdasarkan pengujian yang kulakukan di sahabat sejatiku, yaitu komputer berotak pentium III, dapat kusimpulkan bahwa cara mix jauh lebih unggul dibanding kedua cara lainnya. Silakan masukkan angka 1000-100000. Dan klik tombol-tombol yang ada di group ke-2.
Bagaimana? Apakah hasilnya sama? Bila iya, maka dapat kita simpulkan, jika ingin menentukan suatu bilangan adalah prima atau bukan, lebih efisien bila menggunakan cara sqrt(x), sedang bila ingin mencari jumlah bilangan prima dalam range tertentu, kita dapat menggunakan cara mix. Dalam percobaan ini, batas bilangan prima untuk pengecekan pada cara mix adalah 313, atau sampai range 100000.
Lain waktu, insya Allah kita akan membahas tentang Sieve of Erathosenes, yang jauh lebih murni daripada cara mix ini. Hehe. Mengapa Sieve of Erathosenes? Karena teknik Sieve of Erathosenes ini konon juga lebih optimal untuk mencari jumlah bilangan prima dalam suatu range, namun tidak bijak jika hanya untuk menentukan satu bilangan prima saja.
Semoga bermanfaat. Tetap dalam perdjoeangan!! Happy Coding!!
Komentar untuk artikel ini
almer reyhan pada Senin, 7 September 2009 15:15:57 ini lumayan bagus unyuk saya yg sangat kurang bisa bilangan prima anak anak saya minta diajarkan kebetulan saya menemukan ini akhirnya saya tau terima ksh ya
rudy-pg pada Rabu, 9 September 2009 21:31:56 terima kasih pak almer.
henny pada Kamis, 10 September 2009 08:08:06 Minta tolong dong bil. Prima yg lebih dari 2 faktor disebut...
rudy-pg pada Kamis, 10 September 2009 09:44:09 dari berbagai literatur menyebutkan bahwa bilangan prima hanya mempunyai dua faktor,
mungkin yang dimaksud soal adalah bilangan ganjil? Karena bilangan prima, kecuali angka 2, biasanya ganjil, terima kasih,
fikra pada Kamis, 10 September 2009 23:21:22 hebat juga kamu bang,,,
oya, nek aplikasai ini di upgrade bisa2 jadi crack lho bang. terutama pas searching angka...
FIKRAFAHMAIHDINA FIKRAFAHMAIHDINA
ngejunk sithik yo,,, :)
rudy-pg pada Jum'at, 11 September 2009 19:43:29 ah, masak sih? rak popo, ngejunk-o, puas-puas ke ae rak wes, :))
benny pada Senin, 12 Oktober 2009 16:22:43 misi kang, saya dapet tugas bikiprogram di C . disuruh menentukan suatu bilangan Genap Dan Ganjil. Terimakasih
rudy-pg pada Selasa, 13 Oktober 2009 11:11:00 tinggal dibagi dengan dua dong pak, kalo bisa dibagi 2, berarti genap, kalo tidak, berarti ganjil,
trus ditambah satu kali pengecekan untuk bilangan di atas 0, kalo minus atau 0, berarti bukan.
terima kasih.
rita pada Senin, 26 Oktober 2009 12:35:46 bantuen saya dung..
saya ada tugas mencari 3 cara mencari bilangan prima
rudy-pg pada Kamis, 29 Oktober 2009 13:54:48 bisa pakai looping sampai x/2, looping sampai akar x, dan pakai Sieve of Erathosenes,
terima kasih.
amanda pada Sabtu, 7 Nopember 2009 15:21:20 mana ne contoh membuat program bilangan prima dgn 3 cara...???
penting bgt ne... pleassssss bantuin gue?????????
ranie pada Rabu, 11 Nopember 2009 18:26:20 gimana sey buat program bilangan prima dalam java???
sains pada Minggu, 15 Nopember 2009 04:10:55 bikin ngeheng browser tuh... klo exekusinya kelamaan
rudy-pg pada Selasa, 1 Desember 2009 14:41:21 Iya mas.
suwarso pada Sabtu, 21 Nopember 2009 18:05:31 dalam VB 6.0 ada 2 textbox, dimna setiap text box menentukan batas awal dan batas akhir sebuah bilangan,
yang ingin saya tanyakan bagaimana source code untuk menentukan bilangan yang mana saja yang termasuk dalam bilangan prima dari bilangan yang telah kita inputkan tadi....
trim's
tiar pada Sabtu, 21 Nopember 2009 21:07:05 aku mau susunan angka 1-1000 dgn menandai bilangan prima.
tiar pada Minggu, 29 Nopember 2009 19:08:36 kamu perlu menulis bilangan prima yang tersusun 1-1000.bls
rizki tanaya pada Sabtu, 26 Desember 2009 11:03:34 miqum Pak,
sya mau tny gmn cara'y dg mnggunakan teknik looping while, Do () while dan For apakah bs di kerjakan??
dan dg mnggunakan Algoritma dasar, mhon jwbn'y..
trim's
asep setiawan pada Sabtu, 9 Januari 2010 22:08:44 bagaimana menentukan bil prima dari 0-10, rumus untuk flowchart
m.jefri arif frendianto pada Sabtu, 16 Januari 2010 17:58:35 asalamualaikum wr.wb
saya mau tanya,rumus vb untuk soal seperti ini gimana pak
masukkan 10 data.jumlahkan yang genap saja,misalnya 2 3 12 13 17 18 maka jumlah bilangan genap adalah 32.jadi intinya adalah apa
vha pada Senin, 8 Februari 2010 14:36:15 masukkan contoh angk bil prima
nilam pada Senin, 8 Februari 2010 14:38:50 duh gw bth bgt angka bil prima,dri 1-700,please
Ratih pada Jum'at, 19 Februari 2010 11:13:12 gman program pascal mencari blgn prima 1-1000 dengan array
fitri pada Kamis, 25 Februari 2010 11:28:06 bilagn prma dr 1-1000
gmana???????
tersesat pada Senin, 8 Maret 2010 14:40:17 woiiiiiiiiiiiiiii..kq ra dibales,po wes mati kowe..
aqu btuh bgd ki crane cari bil. prima 1-1000 dgn delphi 7..thx b4 bro
feri f silaen pada Rabu, 10 Maret 2010 14:49:47 tolong pak saya butuh program dari c untuk membuat program yang outputnya :
5,6,7,8...........50
100,95,90,85.........5...
thanks
Kemal pada Jum'at, 19 Maret 2010 23:10:39 mas, ada tugas nh mas
tolong d bales y
Uses WinCRT;
Var
j,n,p : Integer;
Begin
Write(\'Masukkan rentang suatu bilangan: \'); Readln(n);
p:=0;
j:=0;
Repeat
j := j 1;
if (n mod j = 0 ) then p:= p 1;
until ( j = n ) or (p > 2);
if (p = 2) then
Begin
writeln (n, \' merupakan Bilangan Prima\');
readln;
end
else
begin
writeln (n, \' Bukan Bilangan Prima\');
readln;
end;
End.
dari soal yang diatas, dirubah untuk menentukan bilangan-bilangan prima dari 1 s/d 200 tapi hanya dengan cara sedikit
gimana itu ya mas?
tolong balas ya
boleh ke e-mail kok
erli ermawati pada Senin, 12 April 2010 18:38:18 mas tolong gmana cara menjalankan program java dengan deret bilangan prima dari 0-200 dg beda 1,dan source codenya........
di bls ya
vie pada Selasa, 13 April 2010 12:00:54 mas ne lho tugasnya bikin pusing..
bantuin ya..
algoritma:
input n
print n
if n=1 then stop
if n is odd then n ->3n 1
else n->n/2
goto 2
kaudi pada Selasa, 13 April 2010 23:50:01 mas yg mna sih Source Code mencari bil prima kok gak da (untuk java)
apri pada Selasa, 27 April 2010 11:32:19 gimn cara meng input bilangan agar bisa di proses di pemograman php,thank\'s
salamun pada Sabtu, 8 Mei 2010 10:23:01 mas....pertany7aan saya sederhana ja,,,menyeleksi bilangan prima,,kira-kira desain form nya begini,
button1, listbox tempat penyeleksian,only that,,,tanks before,,,
febi saputra pada Senin, 17 Mei 2010 13:20:54 asalamualaikum wr.wb bg gi man caranya program mencari bilangan prima 1-100...
jhon pada Jum'at, 21 Mei 2010 14:20:20 hlouuu tmn-tmn sy tdk mengrti ttng flou cart cra dari mlai smpe end(selesai) dan di setiap program bahasa c maupun c apaka awl untuk mulai harus dengan integer
hans pada Selasa, 8 Juni 2010 22:17:37 mas minta bantuannya buat program c buat bilangan prima dari 0-1000
wahyu pada Rabu, 14 juli 2010 21:18:11 mas ad tugas sulit...bs bantu g??
wahyu wido pada Rabu, 14 juli 2010 21:19:35 mas ad tugas membuat hrf vocal dari pointer am buat bil prima dari program fungsi..
lina pada Selasa, 20 juli 2010 17:55:34 gmna sih cra\" mencari bilangan prima dgn vepat ??
lg bth bgt ne /..
yuliadi pada Selasa, 24 Agustus 2010 08:33:28 kalau bilangan prima 1-50 yang bukan prima yg mana ya dan cara mudah cari bilangan prima gmana
tari pada Rabu, 25 Agustus 2010 22:15:24 saya pengen nanya bagaimana kah flowchart looping/iteration untk bilangan prima?
Terima kasih,tolong dibantu ya.... Saya berharap jawbnya bs dikrm secptnya.....
Hehe
^_^
arifin gani pada Minggu, 29 Agustus 2010 10:05:57 yuliadi
kalau bilangan prima dari1-100 yang mana ya?
Recent Comments
BadBoyz: cara mengubah tipe sis ke jar lewat hp nokia 5130 ... ravika: Kenapa copy game pada MMC tidak terbaca pada nokia... budhi: saya mo cari sms yang dihapus dinokia e63 heri: mas minta tolong solusi utk laptop temen saya,wakt... arifin gani: yuliadi
kalau bilangan prima dari1-100 yang mana y... ridho: maaf mas saya mau tanya donk..
cara menginstal gam... rahmad: ciank bg..
heheh mncul lg ni...
bg bb cina 8900 la... rahmad: bg bantuin dong..
hpq bb cina tipe 8900.
trus lw m... Mochtar: subhanallah walhamdulillah wala ilaha illallahu Al... adetya: kakak, saya mau tanya nih..
mengapa saat saya mem...