Archive by Author

Tumbuhan berumah satu dan tumbuhan berumah dua

26 May

Tumbuhan berumah satu adalah tumbuhan yang memiliki 2 jenis kelamin dalam 1 tumbuhan tersebut. Tumbuhan berumah satu pasti sempurna. Contohnya adalah kembang sepatu, bunga mawar, dan bunga melati.

Tumbuhan berumah dua adalah tumbuhan yang hanya memiliki 1 jenis kelamin dalam 1 tumbuhan tersebut. Bisa serbuk sari atau putik saja. Contohnya pakis haji dan salak.

Macam-macam penyerbukan pada bunga

26 May

Penyerbukan adalah peristiwa jatuhnya serbuk sari di kepala putik. Pada kesempatan ini saya akan menjelaskan berbagai macam penyerbukan.

Berdasarkan faktor pengaruh jatuhnya, penyerbukan dibagi menjadi 4, yaitu:

1. Penyerbukan dengan bantuan hewan atau zoidiogami, terjadi pada bunga mawar, melati dan durian. Hewan yang biasa membantu penyerbukan yaitu serangga, siput, burung dan kelelawar. Ciri-ciri bunganya adalah:

  • Warna mahkota bunga mencolok dan besar
  • Bunga berbau khas
  • Bunga memiliki kelenjar madu
  • Serbuk sari bunga lengket
  • Kepala putik agak tersembunyi

2.Penyerbukan dengan bantuan air atau hidrogami, terjadi pada tanaman air seperti hydrilla.

3. Penyerbukan dengan bantuan angin atau anemogami, terjadi pada padi, jagung, gandum, dan rerumputan. Ciri-ciri tanamannya adalah:

  • Mahkota bunga berukuran kecil dan tidak berwarna.
  • Serbuk sari kering, ringan, dan banyak.
  • Tidak berbau dan tidak berkelenjar madu.
  • Kepala putik terjulur keluar.

4. Penyerbukan dengan bantuan manusia atau antropogami, terjadi pada tanaman vanili.

Berdasarkan asal serbuk sari, penyerbukan dibagi menjadi 4 juga, yaitu:

1. Penyerbukan sendiri atau autogami, jika serbuk sari jatuh di kepala putik pada bunga itu sendiri.

2. Penyerbukan tetangga atau serumah atau geitonogami, jika serbuk sari jatuh di kepala putik pada bunga lain, tetapi masih di 1 pohon.

3. Penyerbukan silang atau alogami, jika serbuk sari jatuh di kepala putik pada bunga yang berbeda pohon, tetapi masih 1 jenis tumbuhan.

4. Penyerbukan bastar, jika serbuk sari jatuh di kepala putik pada bunga lain yang berbeda jenis tanamannya, dan hanya dapat dilakukan pada tumbuhan yang masih dekat hubungan kekerabatannya. Misalnya serbuk sari cabai jatuh pada putik tomat atausebaliknya.

Bunga sempurna

26 May

Bunga sempurna disebut juga sebagai bunga berkelamin ganda atau bunga hermafrodit adalah bunga yang memiliki benang sari dan putik sekaligus dalam 1 bunga. Contohnya adalah bunga bungur dan bunga delima.

Ada lagi bunga tidak sempurna, yaitu bunga yang hanya memiliki 1 alat kelamin saja. Contohnhya bunga pakis haji dan bunga jagung.

Contoh-contoh adaptasi morfologi, fisiologi, dan tingkah laku

26 May

Berikut akan saya jelaskan contoh-contoh adaptasi morfologi, fisiologi, dan tingkah laku. Seperti sebelumnya sudah dijelaskan apa itu adaptasi berikut jenis-jenisnya, maka pada saat ini akan dijelaskan contoh-contoh yang lebih lengkap dari ketia jenis adaptasi tersebut.

Adaptasi morfologi:

1. Bentuk mulut serangga yang berbeda-beda sesuai dengan fungsinya.

2. Bentuk tubuh iklan yang stream line sehingga memudahkan dalam berenang.

3. Daun tumbuhan air yang lebih lebar untuk membantu mempercepat penguapan.

4. Burung memiliki sayap untuk terbang di udara.

5. Gigi hewan berbeda-beda sesuai jenis makanannya.

6. Beruang kutub memiliki kulit dan bulu yang tebal untuk menahan dingin.

Adaptasi fisiologi:

1. Ikan memiliki gurat sisi untuk mengetahui tekanan air.

2. Orang yang tinggal di pegunungan memiliki jumlah haemoglobin yang lebih banyak ketimbang orang biasanya.

3. Manusia mengeluarkan keringat sebagai pengatur suhu tubuh dan membuang zat sisa.

4. Cacing teredo mengeluarkan enzim selulase untuk mencerna kayu yang dimakannya.

5. Herbivora menggunakan enzim selulase untuk mencerna rerumputan.

6. Ikan yang hidup di perairan berkadar garam tinggi memiliki urine yang lebih pekat.

7. Cacing tanah mengeluarkan zat kapur untuk menetralkan asam di kerongkongannya.

Adaptasi tingkah laku:

1. Kaki seribu akan menggulung bila disentuh.

2. Bunglon akan melakukan mimikri, mengubah warna tubuhnya sesuai lingkungan bila dalam keadaan bahaya.

3. Ikan pari torpedo akan mengeluarkan muatan listrik untuk melindungi diri dari musuhnya.

4. Tupai dan kumbang akan pura-pura mati bila dalam keadaan bahaya.

5. Kerbau berkubang di lumpur untuk melunakkan kulitnya dan mengurangi keadaan panas.

6. Cumi-cumi menyemprotkan tinta bila dalam keadaan bahaya.

7. Rayap yang baru menetas menjilati dubur rayap dewasa untuk mendapatkan flagela.

Demikianlah contoh-contoh adaptasi yang dapat saya berikan. Jika anda ingin menambahkan, bisa ditulis di komentar di bawah terima kasih.

 

Kriptografi enkripsi-dekripsi algoritma Goldreich-Goldwasser Halevi (GGH) Cryptosystem

24 May

Salah satu aspek penting dalam kriptografi adalah menjamin kerahasiaan (confidentiality) suatu pesan. Untuk menjamin bahwa suatu pesan hanya dibaca oleh pihak-pihak yang berkepentingan saja, perlu dilakukan proses enkripsi-dekripsi terhadap pesan tersebut. Enkripsi merupakan proses mengubah teks pesan menjadi teks pesan baru yang tidak mudah dikenali lagi makna aslinya (ciphertext). Dekripsi adalah proses menerjemahkan ciphertext menjadi teks pesan awal.

Teknik Enkripsi-Dekripsi
Dalam kriptografi, terdapat beberapa jenis teknik enkripsi-dekripsi yang dapat digunakan. Pada tugas ini, teknik enkripsi-dekripsi yang digunakan adalah block cipher. Dalam block cipher, teks pesan akan dipotong menjadi beberapa block sebesar n karakter. Setiap block yang terbentuk akan dienkrip dengan suatu algoritma tertentu menggunakan key yang telah dibuat. Kemudian untuk setiap block yang telah dienkrip, digabungkan secara terurut menjadi sebuah ciphertext.
Tidak jauh berbeda dengan proses enkripsi, proses dekripsi dalam block cipher juga akan memotong ciphertext ke dalam block dengan ukuran yang sama ketika proses enkripsi. Setiap block didekrip dengan suatu algoritma menggunakan sebuah key. Teks pesan awal akan terbentuk setelah hasil dekripsi dari setiap block digabung.

Algoritma Enkripsi-Dekripsi Goldreich-Goldwasser Halevi (GGH) Cryptosystem

Dalam menggunakan algoritma GGH, pesan tidak bisa langsung dienkrip. Pesan yang memiliki tipe string perlu diubah ke dalam nilai ASCII-nya (encoding) dan dienkrip dengan teknik enkripsi block cipher sebesar n, dan  pada kesempatan ini coba dijelaskan untuk n = 20. Begitu juga dengan proses dekripsi, hasil enkripsi didekrip dengan teknik yang sama, block cipher dengan n = 20. Hasil dekripsi merupakan ASCII dari teks pesan awal, sehingga perlu dilakukan proses decoding dari ASCII ke karakter.

Berikut algoritma Goldreich-Goldwasser Halevi (GGH) Cryptosystem dalam Class GGHAlgorithm:


import java.util.Random;

/**

*/
/**
 Class GGHAlgorithm
 Menyediakan method-method untuk menjalankan proses enkripsi-dekripsi
 GGH cryptosystem (yang disederhanakan). Menggunakan bantuan class
 LUDecomposition untuk menyelesaikan sistem persamaan pada proses dekripsi.
 @author Ikhsanul Habibie
*/

public class GGHAlgorithm {
/* ------------------------
 Class variables
 * ------------------------ */

 /**
 private key dengan dimensi 20 dengan range nilai -200 s/d 200
 Hadamard ratio sekitar 0.8
 */
 private double[][] privateKey = {
 {17, -6, 2, -1, -7, -2, -8, -7, 1, -3, 0, 6, -4, -3, 2, 3, -1, -7, -7, 0},
 {0, -21, 21, -7, 12, -1, -1, 10, -5, -5, 0, 7, 11, -12, -2, 7, -19, 8, -8, 2},
 {0, -13, -26, 0, 11, -25, -5, 22, -27, -5, -25, 16, 13, 12, 2, -17, -15, 5, 14, -8},
 {0, -1, -2, -9, 54, 6, 9, 6, -13, -13, -3, 0, -21, 18, -21, 21, -10, -16, 21, 22},
 {0, 9, 18, 8, 9, -54, 23, 16, -15, -32, 2, 9, 8, 22, 1, 9, -22, 11, 7, 35},
 {0, -4, -8, -28, -4, 24, 32, -6, 8, -4, 4, -7, -9, 4, -7, -1, 22, 9, 17, 10},
 {0, 0, 0, 3, 0, 0, 3, 7, -48, 36, 22, 2, -25, 0, 0, -26, 37, -16, 31, -5},
 {0, 0, 0, 17, 0, 0, 17, -3, -22, 7, 18, 52, -23, 7, -12, 31, -15, 6, -16, 11},
 {0, 0, 0, 1, 0, 0, 1, -3, -34, 19, -11, -1, 2, -6, -14, 4, 19, -31, -63, -23},
 {0, 0, 0, 13, 0, 0, 13, -35, 10, -18, -3, -13, 4, -26, -11, -4, 2, 21, 4, 2},
 {0, 0, 0, -12, 0, 0, -12, 8, 21, 1, -49, 12, 28, -4, 20, 2, 6, -8, 19, 13},
 {0, 0, 0, 12, 0, 0, 12, -18, 15, 45, 33, -12, 18, 1, -10, -15, -7, -8, 4, -25},
 {0, 0, 0, 16, 0, 0, 16, 16, 0, 0, -16, -16, 8, 24, -17, 8, 23, 17, 9, 14},
 {0, 0, 0, 12, 0, 0, 12, 12, 0, 0, -12, -12, -33, -40, 22, 23, -21, 4, 19, -1},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, 48, -17, 43, 9, 20, -12, -8},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 48, 4, -12, -6, -30, -12},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 43, -23, 22, 1, -24},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, -15, -40, -16},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, -62, -28},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195}
 };

 /* ------------------------
 Constructor
 * ------------------------ */
 public GGHAlgorithm() {

 }

 /** Mengakses privateKey
 @return private key
 */
 public double[][] getPrivateKey() {
 return this.privateKey;
 }

 /** Memberi nilai pada privateKey
 @param privateKey matriks 20x20 yang ingin dijadikan private key
 */
 public void setPrivateKey(double[][] privateKey){
 this.privateKey = privateKey;
 }

 /** Membuat <a class="zem_slink" title="Public-key cryptography" href="http://en.wikipedia.org/wiki/Public-key_cryptography" target="_blank" rel="wikipedia">public key</a>
 @param g private key
 @param imax range nilai public key (imax, berarti antara -imax s/d imax, inclusive)
 @param hrat batas atas hadamard ratio untuk public key yang ingin dibuat
 @return public key
 */
 public double[][] generatePublicKey(double[][] g, int imax, double hrat)
 {
 LUDecomposition copyarray = new LUDecomposition();
 double[][] b = copyarray.array2DCopy(g);
 int dim = b.length;
 double[][] v = new double[dim][dim];

 //CONSTRUCT StrassensAlgorithm OBJECT
 StrassensAlgorithm multiply = new StrassensAlgorithm();

 //randomunimodmatrix
 double[][] u = this.generateUnimodularMatrix(dim,imax);

 while(this.hadamardRatio(b) > hrat)
 {
 //B = G*U
 //USING STRASSENS
 b = multiply.strassenMatrixMulti(g,u);

//generate randomunimodmatrix, save to V
 v = this.generateUnimodularMatrix(dim,imax);

 //U = U*V
 //USING STRASSENS
 u = multiply.strassenMatrixMulti(u,v);
 }

 return b;
 }

 /** Mendapatkan public key, menggunakan generatePublicKey untuk membuat public key
 @param privateKey private key
 @return public key
 */
 public double[][] getPublicKey(double[][] privateKey){
 //hadamard ratio of 0.5 is already "bad"
 return this.generatePublicKey(privateKey,200,0.5);
 }

 /** Melakukan proses enkripsi sesuai langkah-langkah pada GGH cryptosystem
 @param blockAscii array yang berisi bagian pesan yang ingin di-enkripsi
 @param publicKey public key
 @return array hasil enkripsi
 */
 public double[] encryptGGH(double[] blockAscii, double[][] publicKey){
 double[] cipherMatrix = new double[blockAscii.length];

 double[] perturbationVector, multMatrix;
 perturbationVector = this.generatePerturbationVector(publicKey.length);
 multMatrix = this.matrixVectorMul(publicKey, blockAscii);

 for(int j = 0; j < multMatrix.length; j++){
 cipherMatrix[j] = multMatrix[j] + perturbationVector[j];
 }

 return cipherMatrix;
 }

/** Melakukan proses dekripsi sesuai langkah-langkah pada GGH cryptosystem
 @param privateKey private key
 @param publicKey public key
 @param cipherText array yang berisi cipher text
 @return array hasil dekripsi
 */
 public double[] decryptGGH(double[][] privateKey, double[][] publicKey, double[] cipherText) {

 //CONSTRUCTING OBJECT FROM LUDecomposition
 LUDecomposition priv = new LUDecomposition(privateKey);

 //SOLVE (privateKey)(cipherLinearCombination) = (cipherText)
 double[] cipherLinearCombination = priv.solveLSE(cipherText);

double[] closestVertex = babaiClosestVertexAlgorithm(
 cipherLinearCombination, privateKey);

//CONSTRUCTING OBJECT FROM LUDecomposition
 LUDecomposition pub = new LUDecomposition(publicKey);

 //SOLVE (publicKey)x = (privateKey*closestVertex)
 return pub.solveLSE(matrixVectorMul(privateKey, closestVertex));
 }

/** Membuat matriks dimensi dimxdim yang diisi dengan integer (random)
 @param imax nilai maksimum elemen matriks
 @param dim dimensi matriks persegi
 @return matriks dimxdim
 */
 public double[][] randomMatrix(int imax, int dim)
 {
 double m[][] = new double[dim][dim];
 Random random = new Random();

for(int i = 0; i < dim; i++) {
 for(int j = 0; j < dim; j++) {
 m[i][j] = (double)(random.nextInt(imax - 1) + 1);
 }
 }

//System.out.println("in randomMatrix");
 //this.printMatrix(m);

return m;
 }

 /** Implementasi proses derangement
 @param n ukuran array (jumlah posisi yang ingin dipermutasi)
 @return array hasil derangement
 */
 public int[] derangement(int n)
 {
 int m[] = new int[n];

for(int i = 0; i < n; i++) {
 m[i] = i;
 }

return this.randperm(m);
 }

 /** Membantu proses derangement, permutasi dimana di hasil akhir tidak ada posisi isi array yg sama dengan posisi awal, e.g 1 != 1'
 @param a array yang ingin di-derangement
 @return array hasil dekripsi
 */
 public int[] randperm(int[] a)
 {
 int m[] = new int[a.length];

for(int i = 0; i < a.length; i++) {
 m[i] = a[i];
 }

Random random = new Random();

for(int i = 0; i < m.length; i++) {
 int rand = random.nextInt(a.length - 1) + 1;

while (rand == i) {
 rand = random.nextInt(a.length - 1) + 1;
 }

int temp = m[i];
 m[i] = m[rand];
 m[rand] = temp;
 }

return m;
 }

/** Membuat perturbation vector
 @param dim ukuran vektor
 @return perturbation vector
 */
 public double[] generatePerturbationVector(int dim) {
 double[] v = new double[dim];

for(int i = 0; i < dim; i++) {
 v[i] = Math.round((Math.random() * 10) - 5);
 }

while(vectorNorm(v) == 0) {
 for(int i = 0; i < dim; i++) {
 v[i] = Math.round((Math.random() * 10) - 5);
 }
 }

 /*
 System.out.println();
 System.out.println("perturbation Vector");
 for(int i = 0; i < dim; i++) {
 System.out.println(v[i]);
 }
 */
 //System.out.println("\nPerturbation Vector");
 //this.printVector(v);
 //System.out.println();
 return v;
 }

 /** Membuat matriks unimodular
 @param dim ukuran matriks, dimxdim
 @param intMax nilai maksimum matriks
 @return matriks unimodular
 */
 public double[][] generateUnimodularMatrix(int dim, int intMax)
 {

 double u[][] = new double[dim][dim];

double A[][] = this.randomMatrix(intMax, dim);
 double Atriangular[][] = new double[dim][dim];

for(int i = 0; i < dim; i++) {
 for(int j = 0; j < dim; j++) {
 if (i>j) {
 Atriangular[i][j] = (double)0;
 }
 else if (i == j) {
 Atriangular[i][j] = (double)1;
 }
 else {
 Atriangular[i][j] = (double)A[i][j];
 }
 }
 }

//System.out.println("in generateUnimodularMatrix, Atriangular:");
 //this.printMatrix(Atriangular);
 //System.out.println();

int p[] = this.derangement(dim);

//System.out.println("in generateUnimodularMatrix, derangement:");
 //this.printVector(p);
 //System.out.println();

for(int i = 0; i < dim; i++) {
 for(int j = 0; j < dim; j++) {
 u[j][i] = Atriangular[j][p[i]];
 }
 }

 //System.out.println("in generateUnimodularMatrix, final matrix:");
 //this.printMatrix(u);

return u;
 }

/** Operasi inner product antara dua vektor
 @param u vektor
 @param v vektor
 @return hasil inner product
 */
 public double innerProduct(double[] u, double[] v) {
 double w = 0;
 for(int i = 0; i < u.length; i++) {
 w += u[i] * v[i];
 }

return w;
 }

/** Perkalian skalar dengan vektor
 @param scalar skalar
 @param v vektor
 @return hasil perkalian skalar dengan vektor
 */
 public double[] scalarVectorMul(double scalar, double[] v) {
 for(int i = 0; i < v.length; i++) {
 v[i] += scalar * v[i];
 }

return v;
 }

/** Penjumlahan antara dua vektor
 @param u vektor
 @param v vektor
 @return vektor hasil penjumlahan
 */
 public double[] vectorAddition(double[] u, double[] v) {
 double[] newVector = new double[u.length];
 for(int i = 0; i < u.length; i++) {
 newVector[i] = u[i] + v[i];
 }

return newVector;
 }

/** Perkalian antara matriks dengan vektor (matriks * vektor = vektor)
 @param a matriks
 @param b vektor
 @return hasil perkalian (vektor)
 */
 public double[] matrixVectorMul(double a[][], double b[]) {
 double c[] = new double[a.length];

for(int i = 0; i < a.length; i++) {
 for(int j = 0; j < b.length; j++) {
 c[i] += a[i][j] * b[j];
 }
 }

return c;
 }

/** Menghitung norm-2 sebuah vektor
 @param v vektor
 @return norm-2 vektor
 */
 public double vectorNorm(double[] v) {
 double norm = 0;

for(int i = 0; i < v.length; i++) {
 norm += Math.pow(v[i], 2);
 }

return Math.sqrt(norm);
 }

/** Meyelesaikan closest vertex problem (CVP) dengan algoritma Babai
 @param w vektor (jadi, solusi CVP adalah vektor terdekat dengan w)
 @param baseVectors matriks yang berisi basis
 @return solusi CVP
 */
 public double[] babaiClosestVertexAlgorithm(double[] w, double[][] baseVectors) {
 double wLinearCombination[] = new double[w.length];
 System.arraycopy(w, 0, wLinearCombination, 0, w.length);

for(int i = 0; i < w.length; i++) {
 wLinearCombination[i] = Math.round(wLinearCombination[i]);
 }

return wLinearCombination;
 }

/** Menghitung hadamard ratio dari key
 @param m matriks/key yang ingin dicari hadamard ratio-nya
 @return hadamard ratio
 */
 public double hadamardRatio(double m[][]) {
 LUDecomposition lu = new LUDecomposition(m);

double detL = Math.abs(lu.computeDeterminant());
 double[] firstVector = new double[m.length];

for(int i = 0; i < firstVector.length; i++) {
 firstVector[i] = m[i][0];
 }

double norms = vectorNorm(firstVector);

for(int i = 1; i < m.length; i++) {
 double baseVector[] = new double[m.length];

for(int j = 0; j < m.length; j++) {
 baseVector[j] = m[j][i];
 }

norms *= vectorNorm(baseVector);
 }
 return Math.pow(detL/norms, (double)1.0/m.length);
 }

/** Mencetak matriks ke output
 @param m matriks
 */
 public static void printMatrix(double m[][]) {
 for(int i = 0; i < m.length; i++) {
 for(int j = 0; j < m[0].length; j++) {
 System.out.print(m[i][j] + " |");
 }
 System.out.println();
 }
 }

 /** Mencetak vektor ke output (dengan isi elemen adalah integer)
 @param m vektor
 */
 public static void printVector(int[] m) {
 for(int i = 0; i < m.length; i++) {
 System.out.print(m[i] + " ");
 System.out.println();
 }
 }

 /** Mencetak vektor ke output (dengan isi elemen adalah double)
 @param m vektor
 */
 public static void printVector(double[] m) {
 for(int i = 0; i < m.length; i++) {
 System.out.print(m[i] + " ");
 System.out.println();
 }
 }
}

&nbsp;

Ada dua jenis key yang akan digunakan Class GGHAlgorithm melakukan proses enkripsi-dekripsi dengan implementasi algoritma GGH. Class ini juga berisi method-method yang dibutuhkan untuk melakukan proses enkripsi-dekripsi, terutama membuat private key dan public key. Berikut, yaitu private key (kunci rahasia) dan public key (kunci publik).

Ukuran dari private key (kunci rahasia) dan public key (kunci publik) adalah salah satu komponen penting dalam sistem kriptografi karena kedua key tersebut mendukung aspek kerahasiaan (confidentiality) dari suatu pesan yang ingin dikirim. Menurut teori, semakin besar ukuran key yang digunakan, maka keamanan sistem semakin meningkat.
Pembentukan public key dalam Goldreich-Goldwasser Halevi (GGH) cryptosystem menggunakan private key sebagai titik awal pembuatannya. Private key dikalikan dengan jenis matriks tertentu sedemikian sehingga terbentuklah public key yang sesuai dengan standar kriteria GGH cryptosystem. Seperti yang sudah dijelaskan sebelumnya, untuk menjamin kualitas keamanan sistem, key yang digunakan harus cukup besar. Berdasarkan sumber [1], ukuran key setidaknya mencapai ratusan. Bayangkan jika Anda menggunakan teknik perkalian matriks standar yang mempunyai kompleksitas Θ(n^3) untuk key yang mempunyai ukuran 400 ke atas, maka teknik perkalian matriks tersebut tidak layak digunakan pada implementasi GGH cryptosystem. Oleh karena itu, perlu adanya metode alternatif untuk mengalikan matriks, salah satunya adalah Strassen’s Algorithm.

Contoh Skema Relational Diagram dan Relational Algebra pada basis data

24 May

Kasus relational diagram:
Avia Corp adalah maskapai yang fokus pada penyewaan pesawat untuk individu/perusahaan. Avia Corp mencatat keterangan mengenai semua penerbangan yang pernah dilakukannya pada tabel CHARTER. Pada tabel CHARTER ini, terdapat keterangan mengenai setiap penerbangan, seperti: Char_Trip(ID penerbangan), tanggal penerbangan, nomor pesawat (Aircraft number/Ac_Num), tujuan, jarak, lama penerbangan (char_hours_flown), jumlah bahan bakar yang dihabiskan (Char_Fuel_Gallons), dan kode customer yang menyewanya.

Setiap penerbangan dicatat id pilot (emp_num) yang menerbangkannya pada tabel TRIP. Tabel AIRCRAFT menyimpan data tentang nomor pesawat (Ac_Num), dan Kode Model (Mod_Code).

Tabel Model mencatat data mengenai model pesawat, yaitu: Kode Model (Mod_Code), Pembuat Model (Mod_Manufacturer), Nama Model (Mod_Name), Jumlah kursi pada model tersebut (Mod_Seat), dan biaya yang dikeluarkan untuk penggunaan model tersebut per mil (Mod_Charge Per Mile). Untuk setiap model pesawat bisa terdapat lebih dari 1 nomor pesawat, misalnya Avia Corp memiliki pesawat model Boeing747 sebanyak 2 buah dengan nomor AV256 dan AV239.

Data tentang pelanggan terdapat di tabel CUSTOMER yang mencakup informasi mengenai kode pelanggan, nama, inisial, dan telepon.

Data karyawan disimpan pada tabel EMPLOYEE, yang mencakup atribut: nomor/id karyawan, nama, dan inisial. Pilot merupakan bagian dari Employee. Data mengenai Pilot terdapat pada tabel PILOT mencakup id employee (emp_num), dan kode ijin terbang(pil_license). Karyawan bisa memiliki rating yang memiliki kode, nama rating dan tanggal dikeluarkan. Informasi ini terdapat pada tabel EARNEDRATING dan RATING.

Berikut adalah skema relational dari basis data maskapai penerbangan Avia Corp.

relational diagram 1 relational diagram 2

Relational algebra yang bisa kita cari:

1. Tampilkan daftar initial dari karyawan yang memiliki rating bernama “Certified Flight Instructor”?

relational algebra 1

2. Tampilkan lastname dari pilot yang memiliki license “ATP” dan Kode Rating “CFII”?

relational algebra 2

3. Tampilkan nomor telepon dari customer yang sudah pernah menyewa pesawat yang memiliki model dengan nama “King Air”.

relational algebra 3

4. Tampilkan firstname, lastname, dan nomor telepon dari customer yang belum pernah menyewa pesawat dari maskapai Avia Corp ini.

relational algebra 4

5. Tampilkan firstname dan lastname dari pilot yang sudah pernah menerbangkan semua model pesawat.

relational algebra 5

6. Tampilkan lastname dan firstname pilot yang jam terbangnya sudah lebih dari 100 jam

relational algebra 6

7. Dapatkan lastname dan firstname dari karyawan yang juga merupakan customer/sudah pernah menyewa pesawat.

relational algebra 7

8. Tampilkan lastname dari customer yang sudah pernah menyewa pesawat ke semua tujuan yang pernah disinggahi pesawat milik Avia Corp.

relational algebra 8

9. Berapakah total jarak tempuh yang telah ditempuh setiap pilot?

relational algebra 9

10. Berapakah jumlah penumpang yang telah diangkut oleh setiap pesawat (asumsi semua kursi pesawat terisi untuk setiap penerbangan)?

relational algebra 10

 

Demikianlah pembahasan skema relational dan penggunaan relational algebra dalam struktur data. Semoga bermanfaat!

Contoh solusi penggunaan Master Theorem atau Metode Master untuk rekurensi

23 May

Teorema 1 (Metode Master) Diberikan suatu rekurensi T (n) = aT (n/b) + f (n) , jika n ≥ n0, untuk suatu n0 elemen N dan T (n) konstan untuk 0 ≤  n < n0. Apabila a ≥ 1, b > 1 keduanya adalah nilai yang konstan dan f (n) adalah fungsi yang asimtotik positif, maka:

master theorem

Gunakan Teorema 1 untuk mencari solusi dari setiap rekurensi berikut dalam notasi . Jika metode master tidak dapat diterapkan, gunakan metode lain yang Anda ketahui. Asumsikan bahwa T (n) konstan untuk n yang cukup kecil.

(a).  T (n) = 3T (n/2) + n.

Solusi T (n) = 3T (n/2) + n menggunakan master theorem kasus 1.

solusi master theorem 1

(b). T (n) = 2T (n/2) + n^3.

Solusi T (n) = 2T (n/2) + n^3 menggunakan master theorem kasus 3.

solusi master theorem 2

(c). T (n) = 7T (n/3) + n^2.

Solusi T (n) =  7T (n/3) + n^2 menggunakan master theorem kasus 3.solusi master theorem 3

(d).  T (n) = 2T (n/2) + n lg n.

Solusi T (n) =  2T (n/2) + n lg n menggunakan master theorem kasus 2.

solusi master theorem 4

(e). T (n) = 4T (n/2) + n^2 √n.

Solusi T (n) = 4T (n/2) + n^2 √n menggunakan master theorem kasus 3.

solusi master theorem 5

(f). T (n) = T (√n) + 1 (petunjuk: substitusikan n = 2^m).

Solusi T (n) = T (√n) + 1 menggunakan master theorem kasus 2.

solusi master theorem 6

 

(g). T (n) = 2T (n – 1) + 1 (asumsikan T (1) = 1).

Kita tidak dapat menggunakan master theorem untuk kasus ini. Dengan evaluasi iteratif, kita memiliki

solusi master theorem 7

 

(h). T (n) = T (n – 1) + lg n (asumsikan T (1) = 1).

Dengan evaluasi iteratif, kita memiliki

solusi master theorem 8-1

Dengan sifat logaritma lg a + lg b = lg ab, diperoleh

solusi master theorem 8-2

Dengan aproksimasi Stirling,  lg (n!) = Θ(n lg n). Akibatnya T (n) = 1 +Θ (n lg n) = Θ(n lg n)

(i). T (n) = T (n – 2) + 2 lg n (asumsikan T (0) = 2).

Karena paritas (genap-ganjil) dari n tidak berpengaruh pada nilai T (n) secara asimtotik, kita boleh mengasumsikan n genap. Dengan evaluasi iteratif, kita memiliki

solusi master theorem 9-1 solusi master theorem 9-2

(j). T (n) = √n T (√n) + 2013 n (petunjuk: misalkan T (n) = nS (n) dengan S (n) adalah fungsi yang asimtotik positif).

Misalkan T (n) = nS (n), maka T (√n) = √n S (√n). Akibatnya rekurensi pada soal setara dengan

solusi master theorem 10-1 solusi master theorem 10-2Demikianlah contoh penggunaan master theorem dalam masalah rekurensi, semoga bermanfaat!

 

Growth function question and solution

23 May

Misalkan f (n) dan g (n) keduanya adalah fungsi bernilai real yang asimtotik positif dengan domain N. Buktikan atau sangkal pernyataan-pernyataan berikut:

1). Jika f (n) = O(g (n)) maka 2^f(n) = O(2^g(n))

Solusi: Karena f (n) dan g (n) keduanya asimtotik positif, maka f (n), g (n) ≥ 0

Pernyataan salah. Karena jika kita pilih f (n) = 2n dan g (n) = n. Jelas bahwa 2n = O(n).
Akan tetapi tinjau bahwa

2^(2n) =(2^2)^n = 4^n ≠ O(2^n) .

Andaikan 4^n = O(2^n), maka kita memiliki

growth function

2). f (n) = θ(f (n/2))

Solusi: Karena f (n) dan g (n) keduanya asimtotik positif, maka f (n), g (n) ≥ 0

Pernyataan salah. Jika f (n) = θ(f (n/2)) maka haruslah f (n) = O(f (n/2)).  Jika kita pilih f (n) = 2^n. Akan dibuktikan bahwa 2^n ≠ O (2^(n/2))


Andaikan 2^n = O (2^(n/2)), maka kita memiliki

growth function2

 

Fungsi untuk menghitung bilangan faktorial di C

21 May

Pada kesempatan kali ini, saya mau sharing bagaimana cara kita membuat sebuah fungsi di bahasa pemrograman C yang berguna untuk mendapatkan hasil dari faktorial suatu bilangan. Tahukah kamu bilangan faktorial? Jadi bilangan faktorial itu seperti ini,contohnya jika kita nyatakan 5! itu sama dengan 5x4x3x2x1 = 120, untuk 4! = 4x3x2x1 = 24, dan lain sebagainya. Oke langsung saja:


#include <stdio.h>

int Faktorial (int N)
{
 if ( N==0){
 return 1;
 } else {
 return N * Faktorial (N-1);
 }
}

int main ()
{
 int bilangan;
 printf ("Masukkan bilangan yang akan dihitung : ");
 scanf ("%d", &bilangan);
 printf ("%d! = %d\n\n\n", bilangan, Faktorial (bilangan));
 return main ();
}

 

Fungsi di atas adalah fungsi rekursif yang berguna untuk mendapatkan hasil faktorial dari suatu bilangan. Selamat mencoba juga!

Animasi Kincir Angin dengan Expression Blend 2

19 May

Saat ini orang sudah mulai bosan dengan sesuatu yang bersifat statis. Contoh hal yang bersifat statis adalah gambar. Nah, untuk itulah dibuat animasi yang akan menjadi solusi hal tersebut karena animasi bersifat dinamis.

Pada kesempatan kali ini kita akan mencoba membuat suatu aplikasi animasi dengan menggunakan tools bernama Expression Blend 2. Silakan menyiapkan secangkir teh dan sepiring biscuit untuk menemani Anda dalam membuat animasi.

Pertama buka aplikasi Expression Blend 2, kemudian klik file pada menu bar dan pilih new project (Ctrl + Shift + N). Kemudian pilih WPF Application (.exe).

expression blend animasi kincir angin

Beri nama project sesuka Anda. Klik OK dan Anda akan dihadapkan pada workspace project Anda. Add canvas pada workspace dengan cara klik kanan pada toolbox dan pilih canvas, set ukuran canvas pada properties dengan Widht 400 dan Heigth 400.

expression blend animasi kincir angin 2

 

Rename layer canvas menjadi standcanvas

expression blend animasi kincir angin 3

Buat vertical stand dan horizontal stand (Width 210 dan Height 10) menggunakan rectangle. Kemudian beri warna stand tersebut dengan menggunakan brush resources –> ControlDarkDarkBrushKey.

expression blend animasi kincir angin 4

Buat canvas lagi untuk menggambar baling-baling dengan Width 300 dan Height 250. Ubah nama layer menjadi wingscanvas.Kemudian buat baling-baling menggunakan ellipse. Atur Width menjadi 15 dan Height menjadi 100. Beri warna sesukan Anda dan duplikasikan menjadi 3 baling-baling. Kemudian buat satu lingkarang yang menyatukan ketiga baling-baling tersebut. Atur ketiga baling-baling tersebut sedemikian rupa sehingga berbentuk baling-baling kincir seperti yang terlihat pada gambar.

expression blend animasi kincir angin 5

expression blend animasi kincir angin 6 expression blend animasi kincir angin 7 expression blend animasi kincir angin 8

Demikianlah pembuatan animasi kincir angin dengan Expression Blend. Semoga bermanfaat!