Ini adalah masalah enumerasi simetri sederhana. Saya memberikan latar belakang penuh di sini, tetapi tidak ada pengetahuan tentang kimia kuantum diperlukan.
Kedua partikel terpisahkan adalah: ⟨ i j | k l ⟩ = ∫ ψ * i ( x ) ψ * j ( x ' ) ψ k ( x ) ψ l ( x ' ) Dan memiliki berikut 4 simetri: ⟨ i j | k l ⟩ = ⟨ j i | l k ⟩ = ⟨ k l | i j ⟩ = ⟨ l k | j i ⟩ saya fungsi yang menghitung integral dan menyimpannya dalam array 1D, diindeks sebagai berikut:
int2
int2(ijkl2intindex2(i, j, k, l))
di mana fungsi ijkl2intindex2
mengembalikan indeks unik, dengan mempertimbangkan simetri di atas. Satu-satunya persyaratan adalah bahwa jika Anda mengulang semua kombinasi i, j, k, l (masing-masing dari 1 hingga n), ia akan mengisi int2
array secara berurutan dan akan menetapkan indeks yang sama untuk semua kombinasi ijkl yang terkait dengan hal di atas 4 simetri.
Implementasi saya saat ini di Fortran ada di sini . Sangat lambat. Adakah yang tahu cara melakukan ini secara efektif? (Dalam bahasa apa pun.)
sumber
Jawaban:
[Sunting: ke-4 kalinya pesona, akhirnya sesuatu yang masuk akal]
Kombinasi keduanya memberikan set lengkap, jadi menempatkan kedua loop bersama memberi kita set lengkap indeks.
Dalam python kita dapat menulis iterator berikut untuk memberi kita nilai idx dan i, j, k, l untuk setiap skenario yang berbeda:
Dan kemudian lilitkan seperti itu:
sumber
Berikut ini adalah ide untuk menggunakan kurva pengisian ruang sederhana yang dimodifikasi untuk mengembalikan kunci yang sama untuk kasus simetri (semua cuplikan kode menggunakan python).
Catatan:
Ini adalah contoh uji untuk n = 2:
Output untuk n = 2:
Jika menarik, fungsi terbalik dari forge_key adalah:
sumber
Apakah ini bukan hanya generalisasi dari masalah pengindeksan matriks simetris dikemas? Solusinya ada offset (i, j) = i * (i + 1) / 2 + j, bukan? Tidak bisakah Anda menggandakan ini dan mengindeks array 4D ganda simetris? Implementasi yang membutuhkan percabangan tampaknya tidak perlu.
sumber