Cara tercepat untuk menyelesaikan sistem persamaan linear

8

Saya harus memecahkan sistem hingga 10.000 persamaan dengan 10.000 tidak diketahui secepat mungkin (lebih disukai dalam beberapa detik). Saya tahu bahwa eliminasi Gaussian terlalu lambat untuk itu, jadi algoritma apa yang cocok untuk tugas ini?

Semua koefisien dan konstanta adalah bilangan bulat non-negatif modulo p (di mana p adalah bilangan prima). Dijamin hanya ada 1 solusi. Saya perlu solusi modulo p.

tmwilliamlin168
sumber

Jawaban:

10

Sebuah dekomposisi LU darin×n matriks dapat dihitung dalam HAI(M.(n)) waktu di mana M.(n) adalah waktu untuk melipatgandakan dua n×nmatriks. Oleh karena itu, Anda dapat menemukan solusi untuk sistemn persamaan linear dalam n tidak diketahui di HAI(M.(n))waktu. Sebagai contoh, algoritma Strassen mencapaiM.(n)=HAI(n2.8), Yang lebih cepat dari eliminasi Gaussian. Lihat https://en.wikipedia.org/wiki/Invertible_matrix#Blockwise_inversion .

Daripada mencoba mengimplementasikan ini sendiri, saya akan menyarankan menggunakan perpustakaan: misalnya, perpustakaan BLAS.

DW
sumber
Juga kurangi modulo p di akhir perhitungan.
fade2black
2
@ fade2black, sebenarnya, mungkin akan jauh lebih baik untuk menggunakan implementasi yang dirancang untuk digunakan dengan aritmatika mod p (yaitu, mengurangi mod p pada setiap langkah, tidak hanya di akhir).
DW
Jika tautan Wikipedia berubah, referensi yang diberikan di sana untuk HAI(M.(n))hasilnya dapat ditemukan misalnya pada bagian 28.2 dari edisi ke 3 Cormen et al, Pengantar Algoritma . Secara khusus mereka menunjukkan "kesetaraan algoritmik" antara perkalian matriks dan inversi matriks. Tetapi mungkin seseorang kemudian dapat menghubungkan inversi matriks dan dekomposisi LU.
Chill2Macht
4

Ada apa yang ingin Anda capai, dan ada kenyataan, dan kadang-kadang mereka saling bertentangan. Pertama, Anda memeriksa apakah masalah Anda merupakan kasus khusus yang dapat diselesaikan lebih cepat, misalnya matriks jarang. Kemudian Anda mencari algoritma yang lebih cepat; Dekomposisi LU akan berakhir sedikit lebih cepat. Kemudian Anda menyelidiki apa yang dapat dilakukan Strassen untuk Anda (yang tidak terlalu banyak; itu dapat menghemat 1/2 operasi jika Anda mengalikan ukuran masalah dengan 32).

Dan kemudian Anda menggunakan kekerasan. Gunakan sistem multi-prosesor dengan banyak utas. Gunakan unit vektor yang tersedia. Atur data dan operasi Anda agar ramah terhadap cache. Selidiki apa cara tercepat untuk melakukan perhitungan modulo p untuk beberapa p tetap. Dan Anda sering dapat menyimpan operasi dengan tidak melakukan operasi modulo p (menghasilkan rentang 0 ≤ hasil <p) tetapi sedikit lebih santai (misalnya menghasilkan rentang -p <hasil <p).

gnasher729
sumber
2

Cara terbaik untuk memecahkan persamaan linear besar adalah dengan menggunakan parallelisation atau entah bagaimana untuk mendistribusikan komputasi di antara CPU atau lebih.

Lihat CUDA, OpenCL, OpenMP.

Banyak orang menyarankan Strassen's algorithmtetapi memiliki konstanta tersembunyi yang sangat besar yang membuatnya tidak efisien.

Omong-omong: persamaan linear Anda mungkin sangat jarang (banyak nol), ada beberapa optimisasi yang sangat rapi untuk menyelesaikannya secara paralel.

Oleg Kovalov
sumber
Ukuran matriks 10.000 oleh 10.000 jadi saya berasumsi Strassen akan dapat menyimpan sesuatu. Tidak terlalu banyak.
gnasher729
1
@ gnasher729 Saya punya beberapa keraguan, Alex Stapanov dalam salah satu kuliahnya disebutkan bahwa Boing menggunakan algoritma Strassen untuk matriks yang sangat besar (1Mx1M) dan mereka tidak senang dengan kinerja. Tapi saya pikir info ini agak ketinggalan jaman untuk perangkat keras modern.
Oleg Kovalov