Open Fermion에서 Bravy-Kitaev 변환

이어 저번, 양자화학계산에서의 양자계산 알고리즘'VQE(양자고유치 변분법 구해기)'를 구현할 때 필요한'브라비키타이브 변환'과 관련, ptyhon 라이브러리'오픈페르미온'을 사용해 계산한 만큼 메모를 남겨달라고 당부했다.
Bravy-Kitaev 변환 정보
「The Bravyi-Kitaev transformation for quantum computation of electronic structure」(J. Chem. Phys 2012)
상세한 이론적 배경과 양자 계산의 구체적인 예(H$2달러 분자의 시스템).
Open 페르미온에 대해서는 공식 GiitHub를 참조하여 설치하고 계산하였다.Open Fermion은 Python 2입니다.대응 7~3.6, 이번에는 파이톤 3.6에 코드 설치를 진행합니다.

할 일


저번 전자 시스템의 Hamiltonian입니다.
\begin{eqnarray}
\mathcal{H}(R) &=& \sum_{p,q} h_{pq} c^{\dagger}_p c_q + \frac{1}{2} \sum_{p,q,r,s} h_{pqrs} c^{\dagger}_p c^{\dagger}_q c_r c_s  + \sum_{i,j>i} \frac{Z_i Z_j}{|R_i - R_j|}
\end{eqnarray}
계수 $h{pq} 달러 및 $h{pqrs}달러를 계산했습니다.여기서 양자컴퓨터에 실제 장착된 양자비트에 대한 작용과 관측을 통해 양자계산을 한다.즉, 현재 Hamiltonian의 전자 궤도 생성 인멸산자 $c^{dagger}, c$c(페르모닉 operator)는 처리할 수 없기 때문에 양자 비트에 작용하는 qubit operator로 전환해야 한다.
Google에서 개발한 Pytohon 프로그램 라이브러리 Open 페르몬에서 이 qubit operator에 대한 mapping을 자동으로 진행할 수 있습니다.자신이 하게 되면 상당히 무거운 일이 될 것이라는 절망에 개발자들에게 감사하다.
이번에는 H$.2달러 분자가 지난번에 계산한 결과
\begin{eqnarray}
\mathcal{H}^{(1)} 
&=& \sum_{pq} h_{pq}c^{\dagger}_{p}c_{q} \\
&=& h_{00}c^{\dagger}_{00} + h_{11}c^{\dagger}_{11} + h_{22}c^{\dagger}_{22} + h_{33}c^{\dagger}_{33} \\

\mathcal{H}^{(2)} 
&=& \frac{1}{2} \sum_{p,q,r,s} h_{pqrs} c^{\dagger}_p c^{\dagger}_q c_r c_s \\
&=& h_{0110} \, c_0^{\dagger} c_1^{\dagger} c_1 c_0 + 
h_{2332} \, c_2^{\dagger} c_3^{\dagger} c_3 c_2 +
h_{0330} \, c_0^{\dagger} c_3^{\dagger} c_3 c_0 +
h_{1221} \, c_1^{\dagger} c_2^{\dagger} c_2 c_1 \\
&+&  
(h_{0220}-h_{0202}) \, c_0^{\dagger} c_2^{\dagger} c_2 c_0 +
(h_{1331}-h_{1313}) \, c_1^{\dagger} c_3^{\dagger} c_3 c_1 \\
&+&
h_{0132} \, (c_0^{\dagger} c_1^{\dagger} c_3 c_2 + c_2^{\dagger} c_3^{\dagger} c_1 c_0) +
h_{0312} \, (c_0^{\dagger} c_3^{\dagger} c_1 c_2 + c_2^{\dagger} c_1^{\dagger} c_3 c_0) \\
\end{eqnarray}
(논문 인용)
Open Fermion에서 Bravy-Kitaev 변환을 통해 논문의 식(79)을 재현하는 것을 목적으로 한다.

Bravy-Kitaev 변환


fermionic operator에서 qubit operator로의 전환은 현재 두 가지 방법으로 제창되고 있다.Jordan-Wigner 변환 및 Bravy-Kitaev 변환.최근까지 스핀보드 모델 영역에서 발생한 조던 위그너 변환도 양자컴퓨팅 영역에 활용됐지만, 양자컴퓨팅에서는 브라비키타이브 변환을 사용하는 것이 효율적이다.모든 변환에서 실제적으로 양자 계산을 할 때 하드웨어가 요구하는 qubit수와 울타리 수는 $O(n)$vsO(\mathrm{log}\n)$정도의 축소가 유리할 것 같습니다.
이론은 건너뛰고 구체적인 변환 방법에 관해서는 먼저 써라.논문의 식(63)에서 보듯이
\begin{eqnarray}
c^{\dagger}_0 c_0 &=& \frac{1}{2} ({\bf 1} - Z_0) \\
c^{\dagger}_1 c_1 &=& \frac{1}{2} ({\bf 1} - Z_0 Z_1) \\
&・& \\
&・& \\
&・& 
\end{eqnarray}
이러한 느낌으로 각 항목을 qubit operator로 변환합니다.손으로 계산하기는 좀 번거롭지만 규정된 규칙에 따라 변환식을 요구하기 때문에 프로그래밍에서 실현할 수 있다.

OpenFermion


공식 Gitclone에서 보듯이 pip를 통해git clone에서 설치할 수 있습니다.clone 디렉터리 OpenFermion/example/openfermion_demo.ipynb 에는 간단하고 알기 쉬운 강좌가 있습니다.
fermion operator는 다음과 같이 코드에 대해 정의하고 처리할 수 있습니다.
다음 코드는 output1.0 [3^ 1]에서
a^{\dagger}_3 a_1
from openfermion.ops import FermionOperator

my_term = FermionOperator(((3, 1), (1, 0)))
print(my_term)

my_term = FermionOperator('3^ 1')
print(my_term)
Output
1.0 [3^ 1]
1.0 [3^ 1]
복수항을 처리할 때+는 연산자로 하나하나 추가할 수 있다.
from openfermion.ops import FermionOperator

term_1 = FermionOperator('4^ 3^ 9 1', 1. + 2.j)
term_2 = FermionOperator('3^ 1', -1.7)
my_operator = term_1 + term_2
print(my_operator)
Output
(1+2j) [4^ 3^ 9 1] +
-1.7 [3^ 1]
Bravy-Kitaev 변환은 다음과 같이 간단히 수행할 수 있습니다.
from openfermion.ops import FermionOperator
from openfermion.transforms import jordan_wigner, bravyi_kitaev
from openfermion.utils import eigenspectrum, hermitian_conjugated

fermion_operator = FermionOperator('0^ 0', 1.0)
print(fermion_operator)

# Transform to qubits under the Bravyi-Kitaev transformation and print its spectrum.
bk_operator = bravyi_kitaev(fermion_operator)
print("")
print(bk_operator)
Output
1.0 [0^ 0]

(0.5+0j) [] +
(-0.5+0j) [Z0]

H2 분자의 Bravy-Kitaev 변환


실제로 H$2달러 분자에 대해 Bravy-Kitaev 전환을 진행하였다.
from openfermion.ops import FermionOperator
from openfermion.transforms import jordan_wigner, bravyi_kitaev
from openfermion.utils import eigenspectrum, hermitian_conjugated

h_00 = h_11 = -1.252477
h_22 = h_33 = -0.475934
h_0110 = h_1001 = 0.674493
h_2332 = h_3323 = 0.697397
h_0220 = h_0330 = h_1221 = h_1331 = h_2002 = h_3003 = h_2112 = h_3113 = 0.663472
h_0202 = h_1313 = h_2130 = h_2310 = h_0312 = h_0132 = 0.181287

# Initialize an operator.
fermion_operator = FermionOperator('0^ 0', h_00)
fermion_operator += FermionOperator('1^ 1', h_11)
fermion_operator += FermionOperator('2^ 2', h_22)
fermion_operator += FermionOperator('3^ 3', h_33)

fermion_operator += FermionOperator('0^ 1^ 1 0', h_0110)
fermion_operator += FermionOperator('2^ 3^ 3 2', h_2332)
fermion_operator += FermionOperator('0^ 3^ 3 0', h_0330)
fermion_operator += FermionOperator('1^ 2^ 2 1', h_1221)

fermion_operator += FermionOperator('0^ 2^ 2 0', h_0220-h_0202)
fermion_operator += FermionOperator('1^ 3^ 3 1', h_1331-h_1313)

fermion_operator += FermionOperator('0^ 1^ 3 2', h_0132)
fermion_operator += FermionOperator('2^ 3^ 1 0', h_0132)

fermion_operator += FermionOperator('0^ 3^ 1 2', h_0312)
fermion_operator += FermionOperator('2^ 1^ 3 0', h_0312)
print(fermion_operator)

# Transform to qubits under the Bravyi-Kitaev transformation and print its spectrum.
bk_operator = bravyi_kitaev(fermion_operator)
print('')
print(bk_operator)
Output
-1.252477 [0^ 0] +
-1.252477 [1^ 1] +
-0.475934 [2^ 2] +
-0.475934 [3^ 3] +
0.674493 [0^ 1^ 1 0] +
0.697397 [2^ 3^ 3 2] +
0.663472 [0^ 3^ 3 0] +
0.663472 [1^ 2^ 2 1] +
0.482185 [0^ 2^ 2 0] +
0.482185 [1^ 3^ 3 1] +
0.181287 [0^ 1^ 3 2] +
0.181287 [2^ 3^ 1 0] +
0.181287 [0^ 3^ 1 2] +
0.181287 [2^ 1^ 3 0]

(-0.8126100000000005+0j) [] +
(0.17120100000000002+0j) [Z0] +
(0.17120100000000002+0j) [Z0 Z1] +
(-0.22279649999999998+0j) [Z2] +
(-0.22279649999999998+0j) [Z1 Z2 Z3] +
(0.16862325+0j) [Z1] +
(0.17434925+0j) [Z1 Z3] +
(0.165868+0j) [Z0 Z1 Z2 Z3] +
(0.165868+0j) [Z0 Z1 Z2] +
(0.12054625+0j) [Z0 Z2] +
(0.12054625+0j) [Z0 Z2 Z3] +
(0.04532175+0j) [Y0 Z1 Y2 Z3] +
(0.04532175+0j) [X0 Z1 X2] +
(0.04532175+0j) [X0 Z1 X2 Z3] +
(0.04532175+0j) [Y0 Z1 Y2]
논문의 공식(79):
\begin{eqnarray}
\mathcal{H}_{BK} 
&=& -0.81261 \, {\bf 1} + 0.171201 \, Z_0 + 0.16862325 \, Z_1 - 0.2227965 \, Z_2 + 0.171201 \, Z_1 Z_0  \\ 
&+& 0.12054625 \, Z_2 Z_0 + 0.17434925 \, Z_3 Z_1 + 0.04532175 \, X_2 Z_1 X_0 + 0.04532175 \, Y_2 Z_1 Y_0 \\
&+& 0.165868 \, Z_2 Z_1 Z_0 + 0.12054625 \, Z_3 Z_2 Z_0 - 0.2227965 \, Z_3 Z_2 Z_1 \\
&+& 0.04532175 \, Z_3 X_2 Z_2 X_0 + 0.04532175 \, Z_3 Y_2 Z_1 Y_0 + 0.165868 \, Z_3 Z_2 Z_1 Z_0
\end{eqnarray}
확실히 일치했어!
(보충)
PRX(2016) 논문 역시 H$2달러 분자를 처리하고 있기 때문에 이 식과 같은 형식의 식(A5) BK가 변환된 후에 나타난다.양자 계산의 시작은 Hartree-Fock state이기 때문에 qubit1과 3은 flip을 사용할 수 없을 것 같습니다. (원인을 잘 모르니까 위인에게 알려주세요.)색인이 1과 3인 연산자를 항등 연산자로 바꾸어 더 간단한 Hamiltonin으로 표시합니다.
\begin{eqnarray}
\mathcal{H}_{BK} 
&=& g_0 \, {\bf 1} + g_1 \, Z_0 + g_2 \, Z_1 + g_3 \, Z_0 Z_1 + g_4 \, X_0 X_1 + g_5 \, Y_0 Y_1 \\
&=& -0.4804 \, {\bf 1} + 0.3435 \, Z_0 + -0.4347 \, Z_1 + 0.5716 \, Z_0 Z_1 + 0.0910 \, X_0 X_1 + 0.0910 \, Y_0 Y_1 \\
\end{eqnarray}
논문의 Table1을 참고하여 R=0.75의 계수 g를 대입하였다.이번 결과에서 같은 간소화를 하면 기본적으로 같은 계수의 공식이다.

좋은 웹페이지 즐겨찾기