Anda di halaman 1dari 11

BAB VIII

ALGORITMA MATEMATIKA

8.1. Pendahuluan

Algoritma matematika adalah algoritma yang digunakan untuk


memecahkan masalah yang berhubungan dengan bidang komputasi numerik
seperti algoritma untuk melakukan operasi matriks, algoritma untuk menghitung
diferensial dan integral dan sebagainya. Masalah yang tercakup bidang ini sangat
banyak sekali, tetapi dalam bab ini hanya akan dibahas mengenai algoritma untuk
membangkitkan bilangan acak dan operasi dengan polinomial.

8.2. Bilangan Acak

Pada aplikasi di bidang komputasi, banyak ditemui penggunaan bilangan


acak (random number). Contohnya seperti pada kriptografi, sistem simulasi, sistem
pengambilan keputusan, sampling dan juga pada algoritma sorting dan searching
yang sudah dibahas. Salah satu penggunaan bilangan acak adalah pada tes program
yaitu untuk mengetahui apakah program yang dibuat sudah menghasilkan output
yang sesuai atau tidak. Untuk ini diperlukan data yang cukup banyak. Sebagai
contoh suatu program dapat berjalan dengan baik untuk 10 data input, tetapi
apakah program juga berjalan dengan baik untuk 100, 1000 atau 10000 data input.
Tentunya tidak praktis jika seorang programmer harus mengetikkan 10000 data
input satu persatu. Untuk itu diperlukan suatu rumus yang dapat menghasilkan
bilangan yang acak dalam suatu range tertentu.

Bilangan acak tidak sama dengan bilangan sembarang. Bilangan sembarang


adalah sebuah bilangan yang nilai berapapun, tidak tergantung pada kondisi
apapun. Sedang bilangan acak adalah bilangan yang memenuhi definisi konsep
matematika, yaitu setiap bilangan mempunyai kemungkinan yang sama untuk
muncul. Pada umumnya bilangan acak berupa sekelompok bilangan yang

BAB VIII : ALGORITMA MATEMATIKA - 132


Algoritma dan Pemrograman II

mempunyai range tertentu yang harus didefinisikan ketika seseorang


memerlukannya.

Sebenarnya, tidak mungkin mendapatkan bilangan yang benar-benar acak


karena setiap bilangan yang dihasilkan oleh program komputer selalu dapat
diprediksi. Yang dapat dilakukan adalah menulis program yang dapat
menghasilkan bilangan yang mempunyai karakteristik seperti bilangan acak, atau
disebut sebagai bilangan acak semu (pseudo random number). Dan program yang
dibuat untuk membangkitkan bilangan acak semu, disebut sebagai pembangkit
bilangan acak (random number generator).

8.2.1. Pembangkit Bilangan Acak


Ada beberapa metode untuk membangkitkan bilangan acak semu. Metode
yang paling banyak digunakan adalah linear congruential method. Metode ini
ditemukan oleh D. Lehmer tahun 1951. Jika A[0] berisi bilangan sembarang maka
statement berikut ini digunakan untuk membuat array yang berisi N bilangan acak:
for ( I = 1 ; I <= N ; I++ )
A[I] = (A[I-1] * b + 1) % m

Dengan metode ini, tentukan lebih dulu bilangan awal yang disebut sebagai
seed, lalu untuk mendapatkan bilangan acak yang baru maka kalikan bilangan acak
yang lama dengan suatu konstanta b, lalu ditambah 1, kemudian bagi dengan
konstanta m lalu ambil sisa pembagiannya. Hasilnya adalah bilangan integer yang
berada di antara 0 dan m-1.

Yang menjadi masalah adalah bagaimana menentukan b dan m sehingga


dihasilkan bilangan acak yang “baik”. Seorang ilmuan komputer, D. E. Knuth
menuliskan bahwa, pertama nilai untuk m harus cukup besar, kira-kira sebesar
nilai 1 word komputer. Kedua, nilai dari b lebih kecil 1 digit dari m. Ketiga,
bilangan pada b harus berupa bilangan yang mempunyai pola berupa ….x21
dengan x adalah bilangan genap.

Sebagai contoh, jika komputer mempunyai 32-bit word maka dapat diambil
m = 100000000, b = 31515821 dan seed = 1234567. Untuk menghindari

BAB VIII: ALGORITMA MATEMATIKA - 133


Algoritma dan Pemrograman II

kemungkinan terjadinya overflow pada perkalian a * b + 1 maka bilangan a dan b


diubah menjadi p dan q berikut ini:
p = 104 p1 + p0 ; p1 = a/m1 , p0 = a%m1
q = 104 q1 + q0 ; q1 = b/m1 , q0 = b%m1
dengan m1 = 10000

Dengan demikian perkalian pq menjadi:


p * q = (104 p1 + p0 ) (104 q1 + q0 )
= 108 p1 q1 + 104 ( p1 q0 + p0 q1 ) + p0 q0

Untuk mendapatkan bilangan acak yang terdiri dari 8 digit, maka suku pertama
dapat diabaikan sehingga hanya digunakan suku kedua dan ketiga saja. Dengan
demikian algoritma untuk pembangkit bilang acak adalah:

Function mult(p,q)
Fungsi untuk “mengalikan” 2 bilangan p dan q yang akan
digunakan pada algoritma Generator. m dan m1 adalah
variabel global. m = 100000000 dan m1 = 10000. Semua
variabel berjenis integer.
{
1. p1 = p/m1
2. p0 = p%m1
3. q1 = q/m1
4. q0 = q%m1
5. pq = ((p0 * q1 + p1* q0)* m1 + p0*q0
6. return (pq)
}

Algoritma Generator
Algoritma untuk membangkitkan bilangan acak integer
yang akan disimpan dalam array R[0..N]. Sebagai nilai
pertama dari bilangan acak (seed) ditentukan 1234567.
Nilai berikutnya didapat dengan menggunakan metode
linear congruential. Konstanta b = 31425821. Konstanta
m = 100000000. Konstanta m1 = 10000. Algoritma ini
menggunakan fungsi mult. Semua variabel berjenis
integer.
1. [inisialisasi konstanta dan variabel]
s = 1234567
b = 31425821
m = 100000000
m1 = 10000
R[0] = s
2. [membaca banyaknya bilangan random yang akan
dibangkitkan]
Read (N)
3. [membuat loop untuk membangkitkan bilangan random]
For ( I = 1 ; I <= N ; I++ )

BAB VIII: ALGORITMA MATEMATIKA - 134


Algoritma dan Pemrograman II

{
R[I] = (mult(R[I-1],b) + 1) % m
}
4. [menuliskan isi array R]
For ( I = 0 ; I <= N ; I++ )
{
write (R[I])
}
5. [selesai]
halt

Kumpulan bilangan acak yang dihasilkan disebut mempunyai sifat uniform


distribution yaitu semua bilangan dalam range mempunyai kemungkinan yang
sama untuk muncul. Sebagai contoh, jika membangkitkan 100 bilangan acak
integer antara 1 sampai 999 maka:

(a) bilangan pertama mungkin berada di antara 1… 999

(b) bilangan ke I mungkin berada di antara 1… 999

(c) rata-rata bilangan yang dibangkitkan adalah 500

8.2.2. Menguji bilangan acak


Seperti telah dijelaskan sebelumnya, bilangan acak yang dihasilkan oleh
program komputer bukan bilangan acak yang sebenarnya, tetapi bilangan acak
semu. Ada beberapa metode statistik yang dapat digunakan untuk menguji apakah
bilangan acak yang dibangkitkan memenuhi kriteria bilangan acak atau tidak.
Salah satu di antaranya adalah uji χ2 (chi square). Tujuan dari uji ini adalah untuk
memeriksa apakah sekelompok bilangan tersebar merata dalam suatu range atau
tidak. Jika ada N bilangan dalam suatu range r maka dapat diharapkan bahwa
bilangan itu secara rata-rata bernilai N/r. Secara matematika dirumuskan sebagai:

χ2 =
0i  r
( fi − N / r) 2
N /r

dengan:

- fi = bilangan yang diperiksa

- N = banyaknya bilangan

BAB VIII: ALGORITMA MATEMATIKA - 135


Algoritma dan Pemrograman II

- r = range dari bilangan

Jika hasil perhitungan χ2 mendekati r atau berada diantara r ± (2√r) maka dapat
dikatakan kumpulan bilangan yang diperiksa memenuhi kriteria bilangan acak.
Jika hasilnya jauh dari r maka dikatakan kumpulan bilangan tersebut bukan
bilangan acak.

8.3. Polinomial

Polinomial adalah fungsi matematika yang terdiri dari konstanta, operator


aritmatika dan variabel. Bentuk umum polinomial adalah:

F(x) = a0 + a1 x + a2 x2 + ... + an xn

Contoh polinomial:

p(x) = 5 + 2 x – 3 x2 ; q(x) = 2 - x

P(x) disebut polinomial orde 2 atau polinomial pangkat 2 karena pangkat


yang tertinggi dari variabel x adalah 2. Dan polinomial q(x) disebut polinomial
orde1 atau pangkat 1 karena pangkat tertinggi dari variabel x adalah 1. Pangkat
terendah dari kedua polinomial itu adalah 0.

8.3.1 Menyimpan polinomial


Ada 2 cara untuk menyimpan polinomial agar dapat diolah oleh komputer,
yaitu dengan menggunakan array dan linked list. Untuk polinomial yang disimpan
dengan menggunakan array, tiap suku pada polinomial disimpan dalam satu
komponen array. Penyimpanan dilakukan secara berurutan mulai dari suku dengan
pangkat yang terendah. Indeks array digunakan untuk menyimpan pangkat dari
variabel x sedang komponen array menyimpan konstanta dari variabel x. Dengan
demikian panjang array sama dengan pangkat tertinggi dari polinomial + 1.
Sebagai contoh, array P digunakan untuk menyimpan polinomial p(x) dan array Q
untuk menyimpan polinomial q(x). Ilustrasinya dapat dilihat pada gambar 7.1
berikut ini.

BAB VIII: ALGORITMA MATEMATIKA - 136


Algoritma dan Pemrograman II

P: 5 2 -3 Q: 2 -1
Indeks: 0 1 2 Indeks: 0 1

Gambar 8.1 Polinomial yang disimpan dalam array P dan Q

Penyimpanan polinomial dengan array sangat efisien dan mudah jika


pangkat variabel polinomial berurutan seperti contoh di atas, tetapi sering juga
ditemui polinomial yang pangkatnya besar dan tidak berurutan seperti contoh di
bawah ini.

s(x) = 15 + 3 x10 - 22 x20 ; t(x) = 7 - 3 x20

Untuk polinomial s(x) dan t(x) di atas, penyimpanan dengan array menjadi tidak
efisien karena akan banyak komponen array yang kosong sehingga untuk
polinomial seperti di atas sebaiknya disimpan dengan linked list. Tiap suku pada
polinomial disimpan dalam sebuah node dalam linked list. Tiap node terdiri dari 3
field yaitu masing-masing digunakan untuk menyimpan konstanta, pangkat dari
variabel dan pointer next untuk menunjuk ke suku berikutnya dalam polinomial.
Sebagai contoh, list S digunakan untuk menyimpan polinomial s(x) dan list T
untuk menyimpan polinomial t(x). Ilustrasinya dapat dilihat pada gambar 7.2 di di
bawah ini.

S: 15 0 3 10 -22 20
c j next c j next c j next

T 7 0 -3 20
c j next c j next

Keterangan:
c : field untuk meyimpan konstanta
j : field untuk menyimpan pangkat
next : field untuk menyimpan pointer next

Gambar 8.2 Polinomial yang disimpan dalam linked list S dan T

BAB VIII: ALGORITMA MATEMATIKA - 137


Algoritma dan Pemrograman II

8.3.2 Menjumlahkan polinomial


Menjumlahkan 2 polinomial dilakukan secara suku per suku dari tiap
polinomial. Konstanta dari dua buah suku hanya dapat dijumlahkan jika pangkat
variabelnya sama. Sebagai contoh akan dijumlahkan 2 polinomial p(x) dan q(x)
sebagai berikut:

p(x) + q(x) = ( 5 + 2 x – 3 x2 ) + ( 2 – x )
= 7 + x - 3 x2
Untuk polinomial yang disimpan dalam array, penjumlahan 2 polinomial, p(x) dan
q(x) lebih mudah dilakukan, yaitu dengan menggunakan statement loop berikut:
for ( I = 0; I <= N; I ++ )
{ r[I] = p[I] + q[I]
}

Keterangan:
N : pangkat tertinggi dari polinomial yang dijumlahkan
r[i] : array tempat menyimpan polinomial hasil penjumlahan

Tetapi untuk polinomial yang disimpan dengan linked list perlu dibuat
fungsi tersendiri yaitu fungsi INSERT untuk membuat node baru sebagai tempat
untuk menyimpan suku-suku polinomial hasil penjumlahan dan fungsi ADD untuk
menjumlahkan 2 polinomial. Sebagai contoh, akan dijumlahkan polinomial s(x)
dan t(x) sebagai berkut:

s(x)+ t(x) = (15 + 3 x10 - 22 x20) + (7 - 3 x20)


= 22 + 3 x10 - 25 x20

Dengan demikian, dalam fungsi ADD perlu ditambahkan statement untuk


memeriksa pangkat dari masing-masing suku polinomial yang akan dijumlahkan.
Jika pangkatnya sama maka operasi jumlah dapat dilakukan. Jika pangkatnya tidak
sama, maka suku polinomial tersebut langsung disalin ke list yang menyimpan
hasil jumlah.

Function INSERT(*t, c, j)
Fungsi untuk membuat node baru untuk menyimpan sebuah suku
dari polinomial. t adalah pointer yang menunjuk suku
terakhir dari polinomial. c adalah field untuk menyimpan
konstanta. j adalah field untuk menyimpan pangkat
variabel.

BAB VIII: ALGORITMA MATEMATIKA - 138


Algoritma dan Pemrograman II

{
1. [membuat node baru]
t->next = new node
2. [pointer t menunjuk node yang baru]
t = t->next
3. [menyalin konstanta dan pangkat ke node baru]
t->c = c
t->j = j
4. [kembali ke algoritma utama]
return(t)
}

Function ADD(*p, *q)


Fungsi untuk menjumlahkan 2 polinomial, yang ditunjuk
oleh pointer p dan q. z adalah pointer yang menunjuk
polinomial hasil penjumlahan. a adalah pointer untuk
menelusuri polinomial p dan b adalah pointer untuk
menelusuri polinomial q. t adalah pointer untuk
menelusuri polinomial hasil penjumlahan
{
1. [inisialisasi pointer a, b dan t]
a = p
b = q
z = new node
t = z
2. [membuat loop untuk menelusuri p dan q]
while ( a != NULL && b!= NULL )
{
2.a [memeriksa pangkat tiap node]
if ((a->j == b->j) && ((a->c + b->c) != 0)))
{
[pangkat sama dan hasil jumlah tidak nol,
lakukan penjumlahan]
t = insert(t, (a->c + b->c), a->j)
[lanjutkan dengan node berikutnya]
a = a->next
b = b->next
}
else
{ [pangkat polinomial p < q]
2.b if (a->j < b->j)
[salin polinomial p]
{ t = insert(t, a->c, a->j)
a = a->next
}
else
{ [pangkat polinomial p > q]
2.c if (a->j > b->j)
[salin polinomial q]
{ t = insert(t, b->c, b->j)
b = b->next
}
}

BAB VIII: ALGORITMA MATEMATIKA - 139


Algoritma dan Pemrograman II

}
}
3. [Jika polinomial p belum selesai ditelusuri]
While (a =! NULL)
{ [salin polinomial q]
t = insert(t, a->c , a->j)
[lanjutkan dengan node berikutnya]
a = a->next;
}
4. [Jika polinomial q belum selesai ditelusuri]
While (b =! NULL)
{ [salin polinomial q]
t = insert(t, b->c , b->j)
[lanjutkan dengan node berikutnya]
b = b->next;
}
5. [kembali ke algoritma utama]
return (z)
}

8.3.3 Mengalikan polinomial


Sama seperti pada operasi penjumlahan, perkalian antara 2 polinomial
dilakukan secara suku per suku. Sebagai contoh akan dikalikan 2 polinomial p(x)
dan q(x) sebagai berikut:
p(x) * q(x) = ( 5 + 2 x – 3 x2 ) * ( 2 – x )
= 10 + 4 x - 6 x2 – 5 x - 2 x2 + 3 x3
= 10 – x – 8 x2 + 3 x3

Untuk polinomial yang disimpan dengan array, operasi perkalian dilakukan


dengan statement loop bertingkat. Yang perlu diperhatikan adalah banyaknya
komponen array yang diperlukan untuk menyimpan polinomial hasil perkalian
yaitu hasil jumlah dari pangkat kedua polinomial yang tertinggi ditambah 1. Untuk
contoh di atas, pangkat tertinggi dari polinomial p(x) adalah 2 dan pangkat
tertinggi dari polinomial q(x) adalah 1. Dengan demikian, array yang digunakan
untuk menyimpan hasil perkalian polinomial p(x) dan q(x) mempunyai 4
komponen dengan indeks mulai dari 0 sampai 3.

Statement untuk mengalikan 2 polinomial p dan q yang disimpan dalam


array adalah seperti berikut:

BAB VIII: ALGORITMA MATEMATIKA - 140


Algoritma dan Pemrograman II

for ( I = 0; I < N ; I ++ )
{ for ( J = 0 ; J < M ; J++ )
{ r[I+J] = r[I+J] + p[I] * q[J]
}
}
Keterangan:
I, J : counter
N : pangkat tertinggi dari polinomial p
M : pangkat terendah dari polinomial q
r : array hasil perkalian, r[N+M]

Perkalian 2 polinomial yang disimpan dalam linked list lebih sulit karena
banyaknya suku dan pangkat dari tiap polinomial tidak diketahui sehingga perlu
dibuat statement untuk memeriksa suku satu persatu. Untuk memudahkan,
diperlukan array yang komponennya adalah linked list untuk menyimpan secara
sementara hasil perkalian antara sebuah suku polinomial dengan polinomial yang
lain. Secara umum algoritma untuk mengalikan 2 buah polinomial yang disimpan
dalam linked list S dan T adalah sebagai berikut.

Fungsi Kali(S,T)
S dan T adalah linked list yang berisi polinomial. A
adalah array yang komponennya linked list yang berasal
dari hasil kali dari sebuah node dari list S dengan
list T. Banyaknya komponen array A sama dengan
banyaknya node pada list S.
1. Hitung banyaknya node (suku) dalam polinomial S.
2. Untuk tiap node pada list S:
Lakukan perkalian antara sebuah node dari list S
dengan seluruh node dalam list T
Simpan hasilnya dalam array
Lanjutkan dengan node berikutnya dari list S
3. Jumlahkan seluruh komponen array lalu simpan hasilnya
dalam komponen array yang pertama. Gunakan fungsi ADD
yang sudah dibahas.
4. Return (A)

Latihan Soal Bab 8


1. Buat program C++ untuk membangkitkan bilangan integer acak dengan
menggunakan metode linear congruential dengan range: 1000000 dan 500000.

BAB VIII: ALGORITMA MATEMATIKA - 141


Algoritma dan Pemrograman II

2. Buat program untuk menguji bilangan acak dengan metode chi-square. Lalu
lakukan pengujian apakah bilangan acak yang anda bangkitkan pada no. 1
sudah termasuk bilangan acak atau belum

3. Diketahui polinomial sebagai berikut:

a. A(x) = 10 – x – 8 x2 + 3 x3

b. B(x) = 5 + 3 x + 6 x2 + 4 x3

c. C(x) = 15 – 7 x + 2 x2 + 12 x3

d. D(x) = 18 – 6 x + 3 x2 + 9 x3

e. E(x) = 5 – 3 x12 + 23 x17 + 9 x25

f. F(x) = 11 – 2 x + 8 x15 + 12 x32

g. G(x) = 19 – 7 x5 + 3 x9 + 16 x35

h. H(x) = 17 – 9 x8 + 5 x16 + 2 x24

3.a. Buatlah program dalam bahasa C++ untuk menjumlahkan 2 polinomial yang
disimpan dalam array

3.b. Buatlah program dalam bahasa C++ untuk mengalikan 2 polinomial yang
disimpan dalam array

3.c. Simpan polinomial (a sampai d) di atas dalam arrray lalu jalankan program
yang sudah anda buat dan tampilkan hasilnya.

4.a. Buatlah program dalam bahasa C++ untuk menjumlahkan 2 polinomial yang
disimpan dalam linked list

4.b. Buatlah program dalam bahasa C++ untuk mengalikan 2 polinomial yang
disimpan dalam linked list

4.c. Simpan polinomial (e sampai h) pada no. 3 di atas dalam linked list lalu
jalankan program yang sudah anda buat dan tampilkan hasilnya.

BAB VIII: ALGORITMA MATEMATIKA - 142

Anda mungkin juga menyukai