ALGORITMA MATEMATIKA
8.1. Pendahuluan
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.
Sebagai contoh, jika komputer mempunyai 32-bit word maka dapat diambil
m = 100000000, b = 31515821 dan seed = 1234567. Untuk menghindari
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++ )
{
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
χ2 =
0i r
( fi − N / r) 2
N /r
dengan:
- N = banyaknya 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
F(x) = a0 + a1 x + a2 x2 + ... + an xn
Contoh polinomial:
p(x) = 5 + 2 x – 3 x2 ; q(x) = 2 - x
P: 5 2 -3 Q: 2 -1
Indeks: 0 1 2 Indeks: 0 1
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
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:
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.
{
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)
}
}
}
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)
}
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)
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
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
g. G(x) = 19 – 7 x5 + 3 x9 + 16 x35
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.