Il s'agit d'un simple problème d'énumération de symétrie. Je donne ici le contexte complet, mais aucune connaissance de la chimie quantique n'est nécessaire.
L'intégrale de deux particules est: ⟨ i j | k l ⟩ = ∫ ψ * i ( x ) ψ * j ( x ' ) ψ k ( x ) ψ l ( x ' ) Et il a les 4 symétries suivantes: ⟨ i j | k l ⟩ = ⟨ j i | l k ⟩ = ⟨ k l | i j ⟩ = ⟨ l k | j i ⟩ I ont une fonction qui calcule l'intégrale et les stocke dans un tableau 1D, indexées comme suit:
int2
int2(ijkl2intindex2(i, j, k, l))
où la fonction ijkl2intindex2
renvoie un index unique, en tenant compte des symétries ci-dessus. La seule exigence est que si vous bouclez sur toutes les combinaisons de i, j, k, l (de 1 à n chacune), il remplira le int2
tableau consécutivement et attribuera le même index à toutes les combinaisons ijkl qui sont liées par ce qui précède 4 symétries.
Mon implémentation actuelle à Fortran est ici . C'est très lent. Quelqu'un sait-il comment le faire efficacement? (Dans n'importe quelle langue.)
la source
Réponses:
[Edit: la 4ème fois c'est le charme, enfin quelque chose de sensé]
La combinaison des deux donne l'ensemble complet, donc mettre les deux boucles ensemble nous donne l'ensemble complet des indices.
En python, nous pouvons écrire l'itérateur suivant pour nous donner les valeurs idx et i, j, k, l pour chaque scénario différent:
Et puis bouclez-le ainsi:
la source
Voici une idée d'utiliser une simple courbe de remplissage d'espace modifiée pour retourner la même clé pour les cas de symétrie (tous les extraits de code sont en python).
Remarques:
Voici un exemple de test pour n = 2:
Sortie pour n = 2:
Si cela vous intéresse, la fonction inverse de forge_key est:
la source
N'est-ce pas simplement la généralisation du problème d'indexation de matrice symétrique compactée? La solution y est offset (i, j) = i * (i + 1) / 2 + j, n'est-ce pas? Vous ne pouvez pas doubler cela et indexer un tableau 4D doublement symétrique? L'implémentation nécessitant une ramification semble inutile.
la source