Rudy Hartadi Webs beta » Tutorial » Algoritma » Cara Cepat Menentukan Bilangan Prima

Download

Visitor Tracker

Total Hits: 47554
Online: 6
Today: 6
Month: 775
Unique: 13079
 

Cara Cepat Menentukan Bilangan Prima

Ditulis pada Rabu, 19 Agustus 2009 00:48:49 | Dibaca sebanyak : 3019 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
Kirim Komentar
Nama :
Website/E-mail :
Komentar :
Sisa Karakter:
 

Recent Comments

juliyati: coba jelaskan apa yang dimaksud dengan: - kode mor...
feri f silaen: tolong pak saya butuh program dari c untuk membuat...
dea nugraha: bos bagaimana cara penghitungan subnet apabila kit...
khys: ...maturnuwun
tersesat: woiiiiiiiiiiiiiii..kq ra dibales,po wes mati kowe....
Phutra: Mas,,, kan aku mau install tema di hp e63 ku,,, ke...
aby: Mas, kalau misal aku ada file trace referer di htt...
Ayik: bagaimana cara buka sandi MMC di Nokia 6300
qorry: Ka, saya mau nanya nii.. aku kan pake Nokia E63 ya...
ullyx: Mas tlg dong knp dihpku 5320 express musik bisa me...