Untuk n tetap, pertimbangkan matriks n oleh n Toeplitz dengan entri yang 0 atau 1. Tujuannya adalah untuk menemukan penentu maksimum atas semua matriks Toeplitz tersebut.
Tugas
Untuk masing-masing n
dari 1 ke atas, output penentu maksimum atas semua n oleh n Toeplitz matriks dengan entri yang 0 atau 1. Harus ada satu output per n
yang harus memiliki penentu maksimum dan juga contoh matriks yang mencapainya.
Skor
Skor Anda adalah n
kode Anda yang terbesar dalam 2 menit di komputer saya. Untuk sedikit memperjelas, kode Anda dapat berjalan selama 2 menit total, ini bukan 2 menit per n
.
Tie breaker
Jika dua entri mendapatkan n
skor yang sama maka entri yang menang akan menjadi yang tertinggi n
dalam waktu singkat di komputer saya. Jika dua entri terbaik sama pada kriteria ini juga maka pemenangnya adalah jawaban yang dikirimkan terlebih dahulu.
Bahasa dan perpustakaan
Anda dapat menggunakan bahasa dan perpustakaan yang tersedia secara bebas yang Anda suka. Saya harus dapat menjalankan kode Anda jadi tolong sertakan penjelasan lengkap tentang cara menjalankan / kompilasi kode Anda di linux jika memungkinkan.
Mesin Saya Pengaturan waktu akan dijalankan pada mesin saya. Ini adalah instalasi ubuntu standar pada Prosesor Delapan Core AMD FX-8350. Ini juga berarti saya harus dapat menjalankan kode Anda.
Jawaban kecil
Untuk n = 1..10 output harus 1,1,2,3,5,9,32,56,125,315
Urutan ini tidak ada dalam OEIS dan entri yang menang juga akan mengusulkan entri baru di sana.
Entri sejauh ini
n=10
n=11
oleh Vioz in Pythonn=9
oleh Tyilo di Cn=12
oleh Legendre in Jn=10
oleh Tensibai di Rn=14
oleh SteelRaven di C ++n=14
oleh RetoKoradi di C ++
n = 1..10
: ghostbin.com/paste/axkpaJawaban:
C ++ dengan pthreads
Ini mencapai n = 14 hanya dalam waktu kurang dari 1 menit pada mesin saya. Tetapi karena itu hanya laptop 2-inti, saya berharap bahwa mesin uji 8-inti dapat menyelesaikan n = 15 dalam waktu kurang dari 2 menit. Butuh sekitar 4:20 menit di mesin saya.
Saya benar-benar berharap untuk menghasilkan sesuatu yang lebih efisien. Sudah ada menjadi cara untuk menghitung penentu dari matriks biner lebih efisien. Saya ingin membuat semacam pendekatan pemrograman dinamis yang menghitung istilah +1 dan -1 dalam perhitungan determinan. Tapi sejauh ini belum cukup.
Karena hadiah akan segera kedaluwarsa, saya menerapkan pendekatan brute force standar:
Saya menguji ini di Mac OS, tapi saya menggunakan kode yang sama di Ubuntu sebelumnya, jadi saya harap ini akan dikompilasi dan dijalankan tanpa hambatan:
.cpp
ekstensi, misoptim.cpp
.gcc -Ofast optim.cpp -lpthread -lstdc++
.time ./a.out 14 8
. Argumen pertama adalah maksimumn
. 14 harus selesai dalam waktu kurang dari 2 menit, tetapi akan lebih baik jika Anda bisa mencoba 15 juga. Argumen kedua adalah jumlah utas. Menggunakan nilai yang sama dengan jumlah inti mesin biasanya merupakan awal yang baik, tetapi mencoba beberapa variasi berpotensi meningkatkan waktu.Beri tahu saya jika Anda memiliki masalah dalam membangun atau menjalankan kode.
sumber
J
Pembaruan: Peningkatan kode untuk mencari lebih dari setengah nilai. Sekarang menghitung dengan
n=12
nyaman dalam 120 detik (turun dari 217s ke 60s).Anda akan membutuhkan J versi terbaru yang diinstal.
Jalankan ini dan bunuh ketika dua menit sudah habis. Hasil saya (MBP 2014 - 16GB RAM):
Total waktu berjalan = 61.83d.
Hanya untuk bersenang-senang
Ini membutuhkan waktu sekitar 210 detik sendiri.
sumber
n = 12
membutuhkan sekitar 18 GiB memori.n=13
. Anda dapat mengubah13
di baris kedua hingga terakhir untuk menghitungnya apa pun yang Anda inginkan.)Python 2
Ini adalah solusi yang sangat mudah, dan mungkin tidak akan memenangkan kontes. Tapi hei, itu berhasil!
Saya akan memberikan gambaran singkat tentang apa yang sebenarnya terjadi.
n
. Misalnya, ketikan=2
, ini akan menghasilkan panjang array 2 n + 1 , di mana setiap baris panjang 2n-1. Ini akan terlihat seperti ini:[[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
.n
kali dan memotongn
item pertama untuk menghasilkan matriks yang sesuai, dan gunakanscipy
untuk menghitung determinan, semua sambil melacak nilai maksimum. Pada akhir ini, saya cukup mencetak maksimum, selisihn
1, dan terus berjalan hingga 10 menit berlalu.Untuk menjalankan ini, Anda akan perlu berhemat menginstal .
Sunting 1: Mengubah bagaimana baris awal dibuat dengan menggunakan itertools.produk sebagai gantinya, terima kasih Sp3000!
Sunting 2: Penyimpanan yang dihapus dari baris-baris awal yang mungkin untuk peningkatan kecepatan minimal.
Sunting 3: Diubah
scipy
agar memiliki kontrol lebih besar atas caradet
kerjanya.Berikut ini beberapa contoh output pada mesin rumah saya (i7-4510U, 8GB RAM):
sumber
C ++
Bruteforce dengan penggunaan OpenMP untuk paralelisasi dan optimalisasi sederhana untuk menghindari evaluasi determinan untuk matriks yang ditransformasikan.
sumber
C
Kompilasi dengan:
Jalankan dengan:
Dapat menampilkan penentu maksimum
n = 1..10
dalam ~ 115 detik di komputer saya.Program ini hanya mendapatkan determinan setiap kemungkinan ukuran matriks Toeplitz biner
n
, namun setiap determinan matriks ukuran5x5
atau lebih kecil akan di-cache menggunakan memoisasi.Pada awalnya saya salah berasumsi bahwa setiap submatrix dari sebuah matriks Toeplitz juga akan menjadi sebuah matriks Toeplitz, jadi saya hanya perlu memotret
2^(2n-1)
nilai daripada2^(n^2)
untuk masing-masingn
. Saya membuat program sebelum menyadari kesalahan saya, jadi pengajuan ini hanyalah perbaikan dari program itu.sumber
O(n!)
kompleksitas, jadi Anda mungkin lebih baik menggunakan algoritma yang berbeda.O(n^3)
, saya percaya, meskipun dapat dibuat lebih cepat dengan beberapa algoritma yang menarik. Saya percaya sebagian besar builtin yang digunakan di sini umumnya menggunakan varian dekomposisi untuk melakukan determinan.O(n^2)
algoritma jika saya memperbarui jawaban saya.O(n^2)
. Tapi saya pikir hambatannya adalah mencari di antaraO(4^n)
banyak 0-1n
olehn
matriks.R
Anda harus menginstal R dan paket yang terdaftar
install.packages("package_name")
Tidak mendapatkan kurang dari 2 menit pada komputer saya dengan versi ini (Saya sudah mencoba dengan modifikasi paralel)
Panggilan dan keluaran:
Tolok ukur pada mesin saya:
Untuk informasi, untuk rentang 1:11, dibutuhkan 285 detik.
sumber
PARI / GP, n = 11
Ini adalah kekuatan kasar tetapi memanfaatkan
det(A^T) = det(A)
. Saya hanya mempostingnya untuk menunjukkan betapa mudahnya melewati transpos. Bit terendahb1
memegang sel kiri atas, dan bit lainnya memegang sisa baris atas.b2
memegang sisa kolom kiri. Kami hanya menegakkanb2 <= (b1>>1)
.Mengenai menghitung faktor-faktor penentu Toeplitz dalam
O(n^2)
waktu: Dalam penelitian terbatas saya, saya terus berlari ke persyaratan bahwa semua anak di bawah umur utama harus nol untuk agar algoritma bekerja, yang merupakan hambatan utama untuk tugas ini. Jangan ragu untuk memberi saya petunjuk jika Anda tahu lebih banyak tentang ini daripada saya.sumber
e_{k+1}
memiliki 4 kali jumlah komponene_k
. Ada banyak kelalaian di koran. Matriks yang tidak dapat dibalik memiliki dekomposisi LU jika semua anak di bawah umur utama tidak nol. (Perhatikan penyebutnya, misalnyaa_0
- secara implisit mereka dijamin bukan nol). Keunikan berasal dari L sebagai satuan triangular. Penulis juga tidak menyebutkan stabilitas numerik. Dalam kasus tautan menjadi tidak tersedia, makalahnya adalah "On Calculating the Determermin of Toeplitz Matrices" oleh Hsuan-Chu Li (2011).