Wednesday, June 15, 2011

Program Konversi Kalender Masehi-Hijriyah (versi Python)

Update 31 Desember 2012: Program executable diulas dalam artikel ini.
Update 12 Mei 2012: Kode program versi QBasic dan Python di-share di pastebin oleh Cindy Wijaya.

Dalam blognya, prof. Thomas Djamaluddin, seorang staf LAPAN RI, memposting sebuah program kecil untuk menghitung konversi tanggal antara sistem kalender Masehi dengan sistem kalender Hijriyah dan sebaliknya. Berikut ini versi sadurannya dalam bahasa pemrograman Python. Makalah prof. Thomas tentang program konversi ini dapat diunduh di sini.

Semoga bermanfaat.

Monday, May 16, 2011

Perbedaan Hari Raya

Perbedaan Hari Raya seringkali terjadi. Membingungkan. Betulkah membingungkan? Apa sih yang sebetulnya membuat bingung?
sumber: Islamic Crescents' Observation Project (ICOP)

Misalkan saja besok (relatif terhadap saat ketika tulisan ini dibuat) tanggal 17 Mei 2011, bertepatan dengan tanggal 1 Ramadhan 1432. Misal, sekali lagi, misalkan. Ini cuma contoh.

Coba pikirkan baik-baik, apa kenapa kita gunakan kata "bertepatan" pada kalimat di atas? Apa sih yang sebetulnya bertepatan? Apakah ketika tanggal di kalender berganti dari 16 Mei menjadi 17 Mei, kalender Hijriah juga ikut berganti dari tanggal 29 Sya'ban menjadi 1 Ramadhan?

Pikirkan baik-baik. Kapan sebetulnya pergantian hari dalam sistem kalender Hijriah terjadi? Apakah sama dengan pergantian hari dalam sistem kalender Masehi?

Kedua, terkait dengan perbedaan hari. Ketika di Indonesia tanggal 17 Mei 2011, misalkan saja pada saat waktu menunjukkan pukul 08.00 pagi Waktu Indonesia bagian Barat (WIB), kalender Masehi mengatakan hari itu hari Selasa.

Pikirkan baik-baik kenyataan berikut ini: Pada saat yang sama, ketika di Indonesia waktu menunjukkan pukul 08.00 WIB, hari Selasa tanggal 17 Mei 2011, di New York, Amerika Serikat, apakah waktu kalender menunjukkan hari Selasa juga? Kenapa bisa berbeda, nyatanya pada saat yang sama di New York "masih" hari Senin, tanggal 16 Mei 2011.

Padahal saatnya sama, detik itu juga. Jika ada dua orang yang melakukan chatting, pesan yang mereka kirim dan terima bukan berarti mengalami penundaan (delay) selama satu hari bukan? Di saat orang Indonesia mengetik pesan, pesan itu ditulisnya pada hari Selasa, dan diterima oleh rekannya di New York pada hari Senin.

Ketiga. Masih tentang perbedaan hari raya. Jika di Indonesia orang-orang merayakan hari Natal, 25 Desember 2011. Sebagian orang merayakannya dengan menghadiri misa natal pada pukul 00.00 WIB, tanggal 25 Desember 2011. Pikirkan baik-baik: Apakah pada saat yang sama, saudara-saudara mereka di New York, sudah merayakan hari raya Natal?

Kenapa ada perbedaan? Kenapa? Mengapa?

Dan terakhir, jika di New York, Hilal yang menandakan masuknya bulan Ramadhan sudah bisa terlihat pada saat senja, ketika matahari terbenam ketika seruan sholat Maghrib berkumandang di sana. Apakah di Indonesia kemudian harus melangsungkan sholat tarawih? Padahal ada perbedaan waktu 12 jam antara Indonesia bagian Barat (WIB) dengan kota New York.

Dua belas jam sebelumnya, ketika orang-orang di Indonesia mencoba merukyat Hilal, sang Hilal masih malu-malu menampakkan diri, karena jarak yang masih terlalu dekat dengan matahari sehingga sangat mustahil terlihat. Karena belum bisa melihat Hilal, orang-orang di Indonesia masih meneruskan bulan Sya'ban, dan menetapkan bulan Ramadhan belum masuk. Padahal, dari tiga pemikiran sebelumnya di atas, seharusnya Indonesia "lebih dulu" masuk hari Selasa dibandingkan New York yang "masih" hari Senin. Tapi orang-orang di New York sudah mulai melakukan shalat tarawih, pada hari Senin malam. Sementara di Indonesia hari Selasa pagi mereka bangun untuk sholat Subuh, masih belum sempat sahur untuk melaksanakan ibadah shaum Ramadhan.

Cobalah renungkan baik-baik.

Wednesday, May 11, 2011

Sorting by Reversals


Diberikan sebuah barisan, untuk sederhananya, barisan bilangan bulat. Misalnya:
\[ A = 1, 6, 7, 4, 2, 5, 8, 3, 9, 0 \]

Sejatinya barisan bilangan seperti $A$ di atas bisa dikatakan sebagai sebuah permutasi dari barisan bilangan $B$ seperti ini:
\[B = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 \]

Salah satu masalah yang sering diajukan  berkaitan dengan sederetan data seperti ini adalah bagaimana caranya agar deretan data permutasi ini bisa dijadikan sebuah deretan bilangan berurut. Pada contoh di atas, bagaimana caranya mengubah permutasi $A$ menjadi sebuah permutasi berurut $B$. Permutasi berurut seperti yang ditunjukkan oleh barisan $B$ kadang disebut juga sebagai permutasi identitas.

Ada banyak algoritma komputasi yang bisa digunakan untuk memecahkan masalah ini. Beberapa di antaranya misalnya bubble sort, insertion sort, selection sort, quick sort, merge sort. Salah satu teknik yang jarang dibahas namun mudah dipahami adalah dengan menggunakan operasi pembalikan (reversal) terhadap sub-barisan.

Sebelum membahas sub-barisan dan bagaimana membalik sub-barisan pada sebuah permutasi data, kita definisikan dulu posisi dari setiap elemen yang terdapat di dalam permutasi yang diberikan.

Setiap elemen pada sebuah permutasi data dimulai dari posisi paling kiri dengan posisi nomor $1$. Seterusnya ke kanan elemen-elemen berikutnya akan menempati posisi $2$, $3$, dan seterusnya hingga posisi ke-$n$.

Sub-barisan $M_{i,j}$ merujuk pada elemen-elemen pada permutasi data $M$ yang menempati posisi ke-$i$ hingga posisi ke-$j$, inklusif. Sebagai contoh pada barisan $A$ di atas, posisi $A_{1}$ hingga $A_{3}$ adalah sebuah sub-barisan.
\[A_{1,3} = 1, 6, 7 \]

Dengan menggunakan pemahaman akan permutasi, permutasi identitas, posisi, dan sub-barisan, kita bisa mulai membahas bagaimana melakukan pengurutan data dengan pembalikan (Sorting by Reversals).

Perhatikan barisan $A$ di atas (diulang berikut ini agar lebih mudah):
\[ A = 1, 6, 7, 4, 2, 5, 8, 3, 9, 0 \]

Jika kita menginginkan data-data pada barisan $A$ terurut, maka kita harus memindahkan data pada posisi ke-$10$ yaitu $0$, ke posisi pertama. Berdasarkan intuisi ini, maka kita perlu membalik sub-barisan $A_{1,10}$ agar $0$ bisa menempati posisi pertama.
\[ A_{a} = \underline{1, 6, 7, 4, 2, 5, 8, 3, 9, 0} \]
\[ A_{b} = \underline{0, 9, 3, 8, 5, 2, 4, 7, 6, 1} \]

Barisan $A_{b}$ menyisakan $9$ data lain yang masih belum berada pada posisi yang benar. Data berikutnya yang harus dipindahkan agar barisan $A_{b}$ semakin mendekati ke permutasi identitas adalah $1$ yang pada contoh ini kebetulan berada pada posisi ke-$10$. Maka sub-barisan $A_{b}$ dari posisi $1$ hingga posisi $10$ dibalik sehingga mendapatkan permutasi data yang baru:
\[ A_{b} = 0, \underline{9, 3, 8, 5, 2, 4, 7, 6, 1} \]
\[ A_{c} = 0, \underline{1, 6, 7, 4, 2, 5, 8, 3, 9} \]

Langkah iterasi berikutnya adalah memindahkan data $2$ ke tempat yang benar. Pada iterasi kali ini, hanya sub-barisan dari posisi $3$ hingga posisi $6$ saja yang perlu dibalik.
\[ A_{c} = 0, 1, \underline{6, 7, 4, 2}, 5, 8, 3, 9 \]
\[ A_{d} = 0, 1, \underline{2, 4, 7, 6}, 5, 8, 3, 9 \]

Demikian seterusnya iterasi dilakukan sehingga didapatkan sebuah permutasi identitas.
\[ A_{d} = 0, 1, 2, \underline{4, 7, 6, 5, 8, 3}, 9 \]
\[ A_{e} = 0, 1, 2, 3, \underline{8, 5, 6, 7, 4}, 9 \]
\[ A_{f} = 0, 1, 2, 3, 4, \underline{7, 6, 5}, 8, 9 \]
\[ A_{g} = 0, 1, 2, 3, 4, \underline{5, 6, 7}, 8, 9 \]

Thursday, April 28, 2011

Algoritma Unifikasi Robinson


Salah satu masalah dalam First Order Logic (FOL), adalah jika diberikan dua buah formula predikat, ingin diketahui apakah kedua  formula tersebut dapat diunifikasi atau tidak. Jika kedua formula dapat diunifikasi, artinya kedua formula yang tampaknya berbeda secara sintaks, sesungguhnya sama satu sama lain. Tambahan lagi, jika kedua formula dapat diunifikasi, maka salah kedua formula dapati diubah menjadi bentuk yang sama secara sintaks melalui most general unifier (mgu).

Salah satu metode untuk memeriksa apakah sepasang formula predikat dapat diunifikasi adalah Algoritma Unifikasi Robinson (Robinson's Unification Algorithm). Algoritma unifikasi Robinson bekerja dengan membaca kedua formula dari kiri ke kanan sampai habis. Jika proses pembacaan menemukan disagreement set yang tidak dapat diunifikasi, maka kedua formula awal yang diberikan tidak dapat diunifikasi, atau dikatakan fail to unify. Jika proses pembacaan berhasil membaca kedua formula hingga selesai, maka artinya kedua formula awal yang diberikan dapat diunifikasi. Jika kedua formula dapat diunifikasi, maka algoritma unifikasi Robinson juga akan menghasilkan mgu.

Dalam setiap langkah mencari unifikasi dari kedua formula predikat, algoritma unifikasi Robinson membangun disagreement set, yang menampung simbol-simbol yang ditemukan berbeda dari kedua formula tersebut. Berikut ini diberikan dua buah contoh sederhana yang dapat digunakan untuk menggambarkan proses yang terjadi ketika algoritma unifikasi Robinson diterapkan. Sebelum membahas kedua contoh, perlu diketahui bahwa algoritma unifikasi ini diusulkan oleh John Alan Robinson pada tahun 1965.

Contoh 1

Diberikan dua formula predikat:

\[A_{0}: p(a; x; f(g(y)))\] dan \[B_{0}: p(y; f(z); f(z))\]

Baca kedua formula tersebut mulai dari kiri ke kanan. Ketika membaca simbol predikat $p$, proses pembacaan tidak mengalami masalah, demikian juga ketika membaca tanda kurung buka. Perbedaan muncul
ketika pada formula pertama dibaca simbol konstanta $a$ sedangkan dari formula kedua dibaca simbol variabel $y$. Dari perbedaan ini dibentuk sebuah disagreement set

\[\{a, y\}\]

Dari disagreement set ini, bangun sebuah unifikator

\[\sigma_{1}: [y \leftarrow a]\]

Ketika sebuah unifikator dibentuk dari disagreement set, unifikator tersebut langsung diterapkan kepada kedua formula predikat. Jika unifikator $\sigma_{1}$ ini langsung diterapkan kepada kedua formula predikat, semua kemunculan variabel $y$ diganti dengan konstanta $a$, sehingga didapatkan sebuah pasangan formula predikat yang baru setelah dilakukan unifikasi:

\[A_{1}: p(a; x; f(g(a)))\] dan \[B_{1}: p(a; f(z); f(z))\]

Perhatikan bahwa variabel $y$ pada kedua formula diubah menjadi konstanta $a$.

Dari pasangan formula predikat yang baru didapatkan dalam iterasi kedua ini, proses pembacaan dilanjutkan. Proses pembacaan kedua formula predikat langsung mendapatkan sebuah disagreement set yang lain yaitu:

\[\{x, f(z)\}\]

Dari diasgreement set ini dibentuk sebuah unifikator baru:

\[\sigma_{2}: [x \leftarrow f(z)]\]

dan unifikator ini pun langsung diterapkan kepada kedua formula predikat dari iterasi ini sehingga didapatkan sebuah pasangan formula predikat ketiga:

\[A_{2}: p(a; f(z); f(g(a)))\] dan \[B_{2}: p(a; f(z); f(z))\]

Dalam iterasi berikutnya, proses pembacaan dilanjutkan kepada kedua formula predikat sehingga didapatkan sebuah disagreement set ketiga yaitu:

\[\{g(a), z\}\]

yang membentuk unifikator ketiga:

\[\sigma_{3}: [z \leftarrow g(a)]\]

untuk digunakan membentuk pasangan formula:

\[A_{3}: p(a; f(g(a)); f(g(a)))\] dan \[B_{3}: p(a; f(g(a)); f(g(a)))\]

Perhatikan bahwa variabel $z$ pada kedua formula juga ikut diubah.

Pada akhir iterasi ketiga ini didapatkan bahwa kedua formula tersebut ternyata serupa. Artinya, pasangan formula yang diberikan di awal dapat diunifikasi, dengan menggunakan mgu yang dibentuk dari unifikator $\sigma_{1}$, $\sigma_{2}$, dan $\sigma_{3}$:

\[\sigma = \sigma_{1} \sigma_{2} \sigma_{3} = [y \leftarrow a, x \leftarrow f(z), z \leftarrow g(a)]\]

Contoh 2
Diberikan dua formula predikat:

\[A_{0}: p(x; g(f(a)); f(x))\] dan \[B_{0}: p(f(y); z; y)\]

Seperti pada contoh sebelumnya, proses pembacaan diterapkan kepada kedua formula. Disagreement set pertama yang didapatkan adalah

\[\{x, f(y)\}\]

untuk membentuk unifikator:

\[\sigma_{1}: [x \leftarrow f(y)]\]

Pada iterasi kedua, proses pembacaan dilanjutkan kpeada pasangan formula yang baru:

\[A_{1}: p(f(y); g(f(a)); f(f(y)))\] dan \[B_{1}: p(f(y); z; y)\]

Disagreement set kedua adalah

\[\{g(f(a)), z\}\]

yang membentuk unifikator kedua:

\[\sigma_{2}: [z \leftarrow g(f(a))]\]

Unifikator ini digunakan untuk membentuk pasangan formula berikutnya:

\[A_{2}: p(f(y); g(f(a)); f(f(y)))\] dan \[B_{2}: p(f(y); g(f(a)); y)\]

Pasangan formula ini membentuk disagreement set

\[\{f(f(y)), y\}\]

Jika dibentuk sebuah unifikator, akan didapatkan

\[\sigma_{3}: [y \leftarrow f(f(y))]\]

Unifikator ini tidak dapat digunakan untuk me-unifikasi kedua formula yang diberikan, karena secara rekursif setiap kemunculan variabel $y$ akan berulang digantikan oleh simbol fungsi $f$. Artinya, pada contoh ini, unifikator $\sigma_{3}$ bukanlah unifikator, dan ini berarti bahwa pasangan formula awal yang diberikan tidak dapat diunifikasi.

Proses unifikasi pada contoh ini gagal, atau fail.

Wednesday, April 27, 2011

Membuat User baru di Cygwin

Buat referensi, gimana caranya menambahkan user baru di Cygwin.

Karena Cygwin sejatinya adalah lingkungan *nix yang di-porting ke lingkungan Windows, maka native user-nya harus ada dulu di Windows. Karena itu, di Cygwin tidak ada command 'useradd' maupun 'adduser'.

Informasi ini didapat dari milis Cygwin.


$ net user UserBaru password /add /yes
$ net localgroup  UserBaru /add
$ mkpassd -l -u UserBaru >> /etc/passwd

Semoga berguna.

Math Test

This is a test $\frac{\sqrt{b^2-4ac}}{2a}$

Thursday, December 23, 2010