Fertilisasi pada tumbuhan

26 May

Fertilisasi adalah proses pembuahan atau peleburan gamet jantan dan gamet betina, dibagi 2 yaitu:

  1. Fertilisasi internal, yaitu pembuahan yang terjadi di dalam tubuh induk betina.
  2. Fertilisasi eksternal, yaitu pembuahan yang terjadi di luar tubuh induk betina/air.

Proses fertilisasi pada tumbuhan

Setelah terjadi penyerbukan pada bunga, maka serbuk sari di kepala putik akan membentuk saluran-saluran menuju ke bakal biji yang disebut buluh serbuk atau buluh sari.

Pada saat itu, inti vegetatif berjalan di muka dan diikuti inti generatif. Fungsi dari inti generatif adalah mengatur pertumbuhan buluh serbuk sari menuju ke ruang bakal biji.

Inti generatif dibagi 2, yaitu:

  1. Inti generarif 1, untuk membuahi inti sel telur dan membentuk zigot.
  2. Inti generarif 2, untuk membuahi inti kandung lembaga sekunder dam membentuk endosperm atau putik lembaga.

Menjelang mencapai bakal buah, inti generatif membela menjadi 2. Setelah sampai di pintu bakal biji, inti vegetatif melebur, kemudian inti sperma masuk ke dalam bakal biji melalui mikrofil.

Fertilisasi pada tumbuhan biji terbuka (gymnospermae)

Pada tumbuhan, inti spermatozoid yang dihasilkan oleh serbuk sari akan membuahi sel telur sehingga dihasilkan  zigot saja sehingga akan disebut pembuahan tunggal.

Fertilisasi pada tumbuhan biji tertutup (angiospermae)

Di dalam bakal biji ada 2 buah inti, yaitu inti sel telur dan inti kandung kenbaga sekunder. Inti sperma 1 membuahi sel telur dan menghasilkan zigot yang akan tumbuh menjadi keping lembaga, sedangkan inti sperma 2 akan membuahi inti kandung lembaga sekunder dan menghasilkan putik lembaga. Jadi pada bakal biji terjadi 2 kali pembuahan sehingga disebut pembuahan ganda.

Keterangan:

  1. Inti vegetatif berguna untuk mengatur pertumbuhan buluh serbuk sari menuju bakal biji.
  2. Inti sperma 1 berguna untuk membuahi inti sel telur dan membetuk zigot.
  3. Inti sperma 2 berguna untuk membuahi kandung lembaga sekunder dan membentuk endosperm atau putik lembaga.

Pembentukan gamet pada tumbuhan tingkat tinggi

26 May

Pada kesempatan ini, saya akan menjelaskan bagaimana pembentukan gamet pada tumbuhan tingkat tinggi. Berikut penjelasannya:

1. Pembentukan gamet jantan,

Gametogenesis (pembentukan gamet) pada bunga jantan atau kepala sari yang menghasilkan serbuk sari disebut mikrosporogenesis. Mikrosiposit yang bersifat diploid pada kepala sari mengalami meosis 1, meosis 2, dan menghasilkan inti vegetatif fan inti generatif.

Inti generatif yang dihasilkan mengalami pembelahan mitosis dan membentuk 2 inti sperma sehingga serbuk sari yang masak memiliki 1 inti vegetatif dan 2 inti sperma.

2. Pembentukan gambet betina,

Gametogenesis (pembentukan gamet) pada bakal buah yang menghasilkan kandung bunga disebut megasporogenesis. Megasporosit yang diploid mengalami pembelahan meosis 1 dan 2 sehingga menghasilkan 4 megaspora. Dari 4 megaspora, 3 megaspora mati karena degenerasi dan 1 megaspora lain akan hidup dan membelah secara meosis 3 kali dan menghasilkan 8 inti yang haploid pada kandung lembaga muda. Kandung lembaga itu dilingkupi kulit yang ujungnya ada lubang kecil yang disebut mikrofil yang berguna sebagai jalan masuknya saluran serbuk sari ke kandung lembaga.

Demikianlah penjelasan singkat mengenai pembentukan gamet pada tumbuhan tingkat tinggi, semoga bermanfaat!

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.

 

Cara Install Php5-mssql di Ubuntu

26 May

Secara default driver php untuk Microsoft SQL Server pada linux tidak terpasang, untuk melakukan instalasinya pun
tidak semudah instalasi mysql yang hanya menggunakan perintah ‘apt-get install php5-mysql’.

Tahapan melakukan instalasinya yang pertama adalah lakukan instalasi modul sybase menggunakan perintah

apt-get install php5-sybase
bebrapa fungsi mssql tidak ada pada paket tersebut sehingga untuk melengkapinya gunakan perintah berikut (pastikan pear sudah terpasang)
pear install --nodeps MDB2_Driver_mssql

proses installasi sudah selesai, kemudian restart service web server dan periksa dengan menggunakan phpinfo
apakah modul sudah terpasang, jika belum maka lakukan ‘apt-update‘ dan ulangi tahap awal. jika sudah terinstall,
maka aplikasi php sudah siap koneksi ke Miscrosoft SQL Server

$db = new PDO("dblib:host=192.168.0.66;dbname=sciencebooth", "sciencebooth", "sciencebooth");

Membuat Kalkulator sederhana menggunakan Python

26 May

Bahasa Python, siapa yang tau? Oke, sebelum masuk ke coding, saya akan memberikan penjelasan apa itu Python.

Python adalah bahasa pemrograman interpretatif multiguna dengan filosofi perancangan yang berfokus pada tingkat keterbacaan kode. Python diklaim sebagai bahasa yang menggabungkan kapabilitas, kemampuan, dengan sintaksis kode yang sangat jelas, dan dilengkapi dengan fungsionalitas pustaka standar yang besar serta komprehensif.

Sekarang udah lumayan tau kan, nah langsung aja masuk ke codingnya.

berikut ini merupakan coding untuk membuat kalkulator menggunakan bahasa Python


def kalkulator () :
 def tambah () :
 print ‘1.Penjumlahan’
 a = input (‘Masukkan nilai x = ’)
 b = input (‘Masukkan nilai y = ’)
 c = a+b
 print ‘x + y = ’,c
 print (‘ ‘)
 tanya ()


def kurang () :
 print ‘2.Pengurangan’
 a = input (‘Masukkan nilai x = ’)
 b = input (‘Masukkan nilai y = ’)
 c = a-b
 print ‘x - y = ’,c
 print (‘ ‘)
 tanya ()
def kali () :
 print ‘3.Perkalian’
 a = input (‘Masukkan nilai x = ’)
 b = input (‘Masukkan nilai y = ’)
 c = a*b
 print ‘x . y = ’,c
 print (‘ ‘)
 tanya ()
def bagi () :
 print ‘4.Pembagian’
 a = input (‘Masukkan nilai x = ’)
 b = input (‘Masukkan nilai y = ’)
 c = a+b
 print ‘x /y = ’,c
 print (‘ ‘)
 tanya ()
 def tanya () :
 choose = raw_input (‘Apakah Anda ingin mengulang (Y/T)? ’)
 if choose == ‘Y’ or choose == ‘y’:
 kalkulator ()
 elif choose == ‘T’ or choose ‘t’:
 print ‘Terima kasih sudah menggunakan program ini ^_^’
 else :
 print ‘Maaf,input yang Anda masukkan salah’
print ‘Silahkan masukkan Y atau T’
 tanya ()
print (‘Program Kalkulator Sederhana’)
print (‘################’)
print (‘1. Penjumlahan’)
print (‘2. Pengurangan’)
print (‘3. Perkalian’)
print (‘4. Pembagian’)
print (‘################’)
print (‘silahkan pilih 1-4’)
print (‘ ‘)

pil = raw_input (‘Masukkan pilihan : ’)
if pil == ‘1’:
 tambah ()
elif pil == ‘2’:
 kurang ()
elif pil == ‘3’:
 kali ()
elif pil == ‘4’:
 bagi ()
else :
 print (‘Maaf, input yang Anda masukkan salah’)
 print (‘coba ulangi lagi’)
 tanya ()
kalkulator()

Jangan lupa, save dengan akhiran .pyt

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!