Algoritma Strassen: Perbedaan antara revisi

Dari testwiki
Loncat ke navigasi Loncat ke pencarian
imported>Nur Sifatullah
 
(Tidak ada perbedaan)

Revisi terkini sejak 28 Februari 2025 12.44

Algoritme Strassen dalam matematika, khususnya aljabar linear adalah sebuah algoritme yang dinamakan oleh Volker Strassen yang merupakan sebuah algoritme yang digunakan untuk perkalian matriks yang secara asimtot lebih cepat daripada algoritme perkalian matriks standar dan sangat berguna dalam penggunaanya untuk matriks yang berukuran besar.

Sejarah

Volker Strassen mempublikasikan algoritme Strassen tahun 1969. Meskipun algoritme ini hanya sedikit lebih cepat daripada algoritme standar untuk perkalian matriks, dialah yang pertama menjelaskan bahwa eliminasi Gauss adalah tidak optimal. Dalam tulisannya, dia memulai penelitian untuk melengkapi algoritme-algoritme yang lebih cepat seperti algoritme Winograd dari Shmuel Winograd pada 1980, dan yang lebih kompleks algoritme Coppersmith-Winograd dipublikasikan pada 1987.

Algoritme

ilustrasi dari algoritmastrassen

Misalkan A, B dua matriks persegi pada ring R. Kita ingin menghitung produk matriks C sebagai

𝐂=𝐀𝐁𝐀,𝐁,𝐂R2n×2n

Jika matriks A, B bukan bertipe 2n x 2n kita isi baris-baris dan kolom-kolom yang kosong dengan nol.

Kita partisi A, B dan C kedalam matriks blok yang berukuran sama.

𝐀=[𝐀1,1𝐀1,2𝐀2,1𝐀2,2]𝐁=[𝐁1,1𝐁1,2𝐁2,1𝐁2,2]𝐂=[𝐂1,1𝐂1,2𝐂2,1𝐂2,2]

dengan

𝐀i,j,𝐁i,j,𝐂i,jR2n1×2n1

lalu

𝐂1,1=𝐀1,1𝐁1,1+𝐀1,2𝐁2,1
𝐂1,2=𝐀1,1𝐁1,2+𝐀1,2𝐁2,2
𝐂2,1=𝐀2,1𝐁1,1+𝐀2,2𝐁2,1
𝐂2,2=𝐀2,1𝐁1,2+𝐀2,2𝐁2,2

Dengan konstruksi ini kita tidak mengurangi jumlah dari perkalian-perkalian. Kita masih memerlukan 8 perkalian-perkalian untuk menghitung matriks-matriks Ci,j, dengan jumlah perkalian yang sama kita perlukan ketika menggunakan matriks perkalian standar.

Sekarang sampai pada bagian terpenting. Kita tetapkan matriks baru

𝐌1:=(𝐀1,1+𝐀2,2)(𝐁1,1+𝐁2,2)
𝐌2:=(𝐀2,1+𝐀2,2)𝐁1,1
𝐌3:=𝐀1,1(𝐁1,2𝐁2,2)
𝐌4:=𝐀2,2(𝐁2,1𝐁1,1)
𝐌5:=(𝐀1,1+𝐀1,2)𝐁2,2
𝐌6:=(𝐀2,1𝐀1,1)(𝐁1,1+𝐁1,2)
𝐌7:=(𝐀1,2𝐀2,2)(𝐁2,1+𝐁2,2)

Yang kemudian digunakan untuk mengekspresikan Ci,j dalam bentuk Mk. Karena kita telah mendefenisikan Mk kita bisa mengeliminasi satu perkalian matriks dan mengurangi jumlah perkalian-perkalian menjadi 7 (satu perkalian matriks untuk tiap Mk) dan ekspresi Ci,j sebagai

𝐂1,1=𝐌1+𝐌4𝐌5+𝐌7
𝐂1,2=𝐌3+𝐌5
𝐂2,1=𝐌2+𝐌4
𝐂2,2=𝐌1𝐌2+𝐌3+𝐌6

Kita iterasikan bagian diatas ke-n kali proses sampai submatriks-submatriks menjadi angka-angka.

Algoritme Strassen pada penerapannya mengubah metode standar dari perkalian matriks agar submatriks-submatriks yang cukup kecil menjadi lebih efisien. Fakta-fakta agar algoritme Strassen lebih efisien bergantung pada implementasi khusus dan hardware.

Analisi Numerik

Perkalian matriks standar melakukan

n3=nlog28

perkalian-perkalian dari elemen-elemen dalam ring R. Kita anggap penjumlahan-penjumlahan diperlukan karena bergantung pada R, yang bisa jauh lebih cepat daripada perkalian-perkalian dalam implementasi pada komputer terutama jika ukuran dari entri matriks melebihi ukuran kata dari mesin.

Dengan algoritme Strassen kita bisa mengurangi jumlah perkalian-perkalian

nlog27n2.807.

Pengurangan dalam jumlah perkalian bagaimanapun akan sampai saat pilihan dari sedikit pengurangan kestabilan numerik.

Contoh program sederhana pada Matlab

function c = strass(a,b)
nmin = 2;
%misalkan matriks a dan b berukuran 2 x 2
[n,n] = size(a);
if n <= nmin;
   c = a*b;
else
   %entri matriks a dan b berukuran n x n; n=2^k; k=2,3,...
   %misalkan entri matriks a dan b berukuran n=2^2 atau 4 x 4
   a11=a(1:2,1:2); a12=a(1:2,3:4); a21=a(3:4,1:2); a22=a(3:4,3:4);
   b11=b(1:2,1:2); b12=b(1:2,3:4); b21=b(3:4,1:2); b22=b(3:4,3:4);
   p1 = (a11+a22)*(b11+b22);
   p2 = (a21+a22)*b11;
   p3 = a11*(b12-b22);
   p4 = a22*(b21-b11);
   p5 = (a11+a12)*b22;
   p6 = (a21-a11)*(b11+b12);
   p7 = (a12-a22)*(b21+b22);
   c = [p1+p4-p5+p7 p3+p5; p2+p4 p1-p2+p3+p6];
end

Catatan: program diatas hanya untuk matriks berukuran 1x1, 2x2, 4x4. Untuk matriks yang berukuran lebih besar, masih diperlukan penyempurnaan. Agar programnya bisa berjalan.

Referensi

Templat:Reflist

Pranala luar

Templat:Authority control