Este é um problema simples de enumeração de simetria. Eu dou o histórico completo aqui, mas nenhum conhecimento de química quântica é necessário.
O integrante dois partícula é: ⟨ i j | k l ⟩ = ∫ ψ * i ( x ) ψ * j ( x ' ) ψ k ( x ) ψ l ( x ' ) E tem os seguintes 4 simetrias: ⟨ i j | k l ⟩ = ⟨ j i | l k ⟩ = ⟨ k l | i j ⟩ = ⟨ l k | j i ⟩ I têm uma função que calcula o integral e armazena-os em uma matriz 1D, indexado como se segue:
int2
int2(ijkl2intindex2(i, j, k, l))
onde a função ijkl2intindex2
retorna um índice exclusivo, levando em consideração as simetrias acima. O único requisito é que, se você percorrer todas as combinações de i, j, k, l (de 1 a n cada), ele preencherá a int2
matriz consecutivamente e atribuirá o mesmo índice a todas as combinações de ijkl relacionadas pelas opções acima. 4 simetrias.
Minha implementação atual no Fortran está aqui . Está muito lento. Alguém sabe como fazer isso de forma eficaz? (Em qualquer idioma.)
fonte
Respostas:
[Editar: a quarta vez é o charme, finalmente algo sensato]
A combinação de ambos fornece o conjunto completo; portanto, juntar os dois loops nos fornece o conjunto completo de índices.
Em python, podemos escrever o seguinte iterador para fornecer os valores idx e i, j, k, l para cada cenário diferente:
E então faça um loop sobre ele assim:
fonte
Aqui está uma idéia do uso de uma curva simples de preenchimento de espaço modificada para retornar a mesma chave para os casos de simetria (todos os trechos de código estão em python).
Notas:
Aqui está um exemplo de teste para n = 2:
Saída para n = 2:
Se for de interesse, a função inversa de forge_key é:
fonte
Isso não é apenas a generalização do problema de indexação de matriz simétrica compactada? A solução aí é offset (i, j) = i * (i + 1) / 2 + j, não é? Você não pode dobrar isso e indexar uma matriz 4D duplamente simétrica? A implementação que requer ramificação parece desnecessária.
fonte