Jest to prosty problem z wyliczaniem symetrii. Podaję tutaj pełne tło, ale nie jest wymagana znajomość chemii kwantowej.
Integralną dwóch cząstek jest: ⟨ ja j | K L ⟩ = ∫ ψ * I ( x ) ψ * j ( x ' ) ψ k ( x ) ψ L ( x ' ) I ma następujące 4 symetrie: ⟨ í j | k l ⟩ = ⟨ j I | l k ⟩ = ⟨ k l | I j ⟩ = ⟨ l k | j I ⟩ Mam funkcję, która oblicza całki i zapisuje je w tablicy 1D, indeksowane, co następuje:
int2
int2(ijkl2intindex2(i, j, k, l))
gdzie funkcja ijkl2intindex2
zwraca unikalny indeks, biorąc pod uwagę powyższe symetrie. Jedynym wymaganiem jest to, że jeśli zapętlisz wszystkie kombinacje i, j, k, l (od 1 do n każda), wypełni ona int2
tablicę kolejno i przypisze ten sam indeks do wszystkich kombinacji ijkl, które są powiązane powyższym 4 symetrie.
Moja obecna implementacja w Fortran jest tutaj . To jest bardzo wolne. Czy ktoś wie, jak to zrobić skutecznie? (W dowolnym języku.)
źródło
Odpowiedzi:
[Edytuj: Czwarty raz to urok, w końcu coś sensownego]
Połączenie obu tych elementów daje pełny zestaw, więc połączenie obu pętli daje nam pełny zestaw wskaźników.
W pythonie możemy napisać następujący iterator, aby podać nam wartości idx i i, j, k, l dla każdego innego scenariusza:
A następnie zapętlić go tak:
źródło
Oto pomysł użycia prostej krzywej wypełniania spacji zmodyfikowanej w celu zwrócenia tego samego klucza dla przypadków symetrii (wszystkie fragmenty kodu znajdują się w pythonie).
Uwagi:
Oto przykładowy test dla n = 2:
Dane wyjściowe dla n = 2:
Jeśli jest to interesujące, funkcją odwrotną do forge_key jest:
źródło
Czy to nie tylko uogólnienie problemu upakowanego indeksowania macierzy symetrycznej? Rozwiązaniem jest przesunięcie (i, j) = i * (i + 1) / 2 + j, prawda? Nie możesz podwoić tego i zindeksować podwójnie symetryczną macierz 4D? Implementacja wymagająca rozgałęzień wydaje się niepotrzebna.
źródło