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.
Bilangan acak adalah bilangan yang memenuhi definisi konsep matematika, yaitu setiap
bilangan mempunyai kemungkinan yang sama untuk muncul. Sebenarnya, tidak mungkin
mendapatkan bilangan yang benar-benar acak karena setiap bilangan yang dihasilkan oleh
program komputer selalu dapat diprediksi. Program yang dibuat untuk membangkitkan
bilangan acak semu, disebut sebagai pembangkit bilangan acak (random number generator)
dan bilangan acak yang dihasilkannya disebut sebagai bilangan acak semu (pseudo random
number).
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.
66
Praktikum C++ Lanjut – Modul 8
Sebagai contoh, jika komputer mempunyai 32-bit word maka dapat diambil m =
100000000, b = 31515821 dan seed = 1234567. Untuk menghindari 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
Untuk mendapatkan bilangan acak yang terdiri dari 8 digit, maka suku pertama dapat diabaikan
sehingga hanya digunakan suku kedua dan ketiga saja.
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:
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:
67
Praktikum C++ Lanjut – Modul 8
χ2 =
0 i 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.
#include <iostream>
#include <math.h>
r = terbesar(data,n);
R = static_cast<double>(r);
t = (R+1.0)/2.0;
sum = 0;
for (int i = 0 ; i < n ; i++)
{ D = static_cast<double>(data[i]);
sum = sum + ((D - t)*(D - t))/t;
}
r1 = R - 2.0*sqrt(R);
r2 = R + 2.0*sqrt(R);
if ((sum < r1) || sum > r2)
cout<< " Tidak uniform" << endl;
return sum;
}
void main()
{ int N;
long R[1000];
long s = 12345;
long b = 425821;
68
Praktikum C++ Lanjut – Modul 8
long m = 1000000;
int m1 = 1000;
double uji;
R[0] = s;
cout <<"Ketikkan banyaknya bilangan yang akan dibangkitkan: ";
cout << endl;
cin >> N;
// membuat loop untuk membangkitkan bilangan random
for (int I = 1 ; I <= N ; I++)
{
R[I]=(mult(R[I-1],b, m1) + 1) % m;
}
// menuliskan isi array R
for (I = 0 ; I <= N ; I++ )
{
cout <<R[I]<<", ";
}
cout << endl,
//menguji bilangan yang dibangkitkan
uji = chisq(R,N);
cout << "uji = " <<uji << endl;
}
8.3. Polinomial
Polinomial adalah fungsi matematika yang terdiri dari konstanta, operator aritmatika
dan variabel. Bentuk umum polinomial adalah:
P(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 orde 1 atau pangkat 1 karena
pangkat tertinggi dari variabel x adalah 1. Pangkat terendah dari kedua polinomial tersebut
adalah 0.
69
Praktikum C++ Lanjut – Modul 8
contoh, array P digunakan untuk menyimpan polinomial p(x) dan array Q untuk menyimpan
polinomial q(x). Ilustrasinya dapat dilihat pada gambar 8.1 berikut ini.
P: 5 2 3 Q: 2 -1
Indeks: 0 1 2 Indeks: 0 1
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.
Untuk polinomial s(x) dan t(x) 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 8.2 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
70
Praktikum C++ Lanjut – Modul 8
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. Sebagai contoh, akan dijumlahkan polinomial s(x) dan t(x)
sebagai berkut:
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
71
Praktikum C++ Lanjut – Modul 8
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:
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]
72
Praktikum C++ Lanjut – Modul 8
#include <iostream>
using namespace std;
//penjumlahan dan perkalian polinomial dengan array
void main()
{
int p[20], q[20], r[20], s[40];
int n, m, i,j;
#include <iostream>
using namespace std;
void main()
{
int n, m, x, y;
Node *P1, *P2, *P3;
P1 = NULL;
P2 = NULL;
P3 = NULL;
cout<<" Ketikkan banyaknya suku dalam polinomial 1: ";
cin>> n;
cout<< endl;
cout<<" Ketikkan konstanta dan pangkat polinomial secara berurutan ";
cout <<endl;
for (int i = 0 ; i < n ; i++)
{ cout<<" Konstanta untuk suku polinomial ke "<< i+1 <<" = ";
cin>> x;
cout<<" Pangkat untuk suku polinomial ke "<< i+1 <<" = ";
cin>> y;
InsertN(&P1, x, y);
}
cout<<endl;
cout<<" Ketikkan banyaknya suku dalam polinomial 2: ";
cin>> m;
cout<< endl;
cout<<" Ketikkan konstanta dan pangkat polinomial secara berurutan ";
cout <<endl;
for (i = 0 ; i < m ; i++)
{ cout<<" Konstanta untuk suku polinomial ke "<< i+1 <<" = ";
cin>> x;
cout<<" Pangkat untuk suku polinomial ke "<< i+1 <<" = ";
cin>> y;
InsertN(&P2, x, y);
}
cout<<endl;
74
Praktikum C++ Lanjut – Modul 8
cout<<"Polinomial 1: "<<endl;
Tampil(P1);
cout<<"Polinomial 2: "<<endl;
Tampil(P2);
Node *a, *b ;
a = P1;
b = P2;
75