Qiskit.aqua로 증폭 연산자 Q 쉽게 만들기

Qiskit.aqua로 증폭 연산자 Q 쉽게 만들기


이전의 QAE(양자진폭 추정)에 관한 글
Qiskit을 이용한 양자 진폭 추정(QAE)
그럼, 나는 스스로 증폭 연산자를 만들려고 노력했다.
근데 매번 하면 귀찮아요.
저기 있다.나는 아쿠아로 노동력을 줄이고 재료를 줄여서 만들고 싶다.1

qiskit.aqua의 코드


연산자 Q 작성

from qiskit import QuantumCircuit
from qiskit.aqua.algorithms import Grover
nqubit = 3

# initial state preparation 
state_preparation = QuantumCircuit(nqubit, name='State preparation')
state_preparation.h([1,2])
state_preparation.x(2)
state_preparation.ccx(2,1,0)
state_preparation.x(2)

# specify the oracle that marks the state '011' as a good solution
oracle = QuantumCircuit(nqubit)
oracle.z(0)

# define Grover's algorithm
grover = Grover(oracle=oracle, good_state=good_state, state_preparation=state_preparation)

이렇게 하면 회로가 된다.
전체 회로 또는 일부(예: $Q$)를 가져오려면 다음과 같이 하십시오.
또 전 세계 상위 $\pi달러를 마음대로 가입할 수 있기 때문에 교과서의 기호폭에 따라 확대 계산하면 $Q$이다.grover.construct_circuit() #回路全体G=QA grover.grover_operator.state_preparation #初期状態準備A grover.grover_operator.oracle #オラクル部分の回路Sf grover.grover_operator #増幅演算子Q따라서 $Q$의 행렬 표시로 특징값을 고전적으로 제시하고자 할 때
from qiskit.quantum_info.operators import Operator
circ_Q = grover.grover_operator
Unitary = Operator(circ_Q).data
a_eig = np.linalg.eig(+1*Unitary)
print("固有値\n {}\n".format(a_eig[0]))
됐어요.

이렇게 된 느낌.

QPE에게 전화를 걸다


QPE로 고유값을 산출하려면 다음과 같은 방법으로 회로를 얻을 수 있다.
from qiskit.circuit.library import PhaseEstimation
circ_QPE = PhaseEstimation(num_evaluation_qubits=3,unitary=circ_Q)

다만, 어디를 측정하는지, 측정 결과에서 어떻게 위상을 빼내는지 이해하지 못하면 사용할 수 없다.
응.
계속해.
QPE를 수행하려면 회로에 고유 상태 또는 중첩 상태를 넣어야 합니다.
상기 회로에는 $|000rangele 달러가 포함되어 있습니다.
지정한 상태로 들어가려면circ-QPE.initialize처럼 하면 돼요.
예를 들어 다음 회로라면 고전적으로 계산된 고유 벡터를 입력으로 사용한다.(해당 피쳐 값의 표준 위상은 1/6)

from qiskit.circuit.library import PhaseEstimation
num_evaluation_qubits = 3
circ_QPE = QuantumCircuit(num_evaluation_qubits+nqubit, num_evaluation_qubits)
circ_QPE.initialize(a_eig[1][:,1],range(num_evaluation_qubits,num_evaluation_qubits+nqubit))
circ_QPE.append(PhaseEstimation(num_evaluation_qubits=num_evaluation_qubits,unitary=circ_Q),range(nqubit+num_evaluation_qubits))
circ_QPE.measure(range(num_evaluation_qubits),range(num_evaluation_qubits-1,-1,-1))
circ_QPE.draw('mpl')



001=1/8로 기대했던 1/6과 큰 차이가 없다.양자 비트수를 늘리면 1/6에 가까워진다.
나는 또 다른 고유 벡터를 시험해 보겠다.initialize 때.eigh만 넘기면 돼.대응하는 고유치는 5/6이다.

111=1/2+1/4+1/8=0.875.5/6 = 0.833... 뭐, 가까워요.
일반적으로 고유 벡터는 미지의 것이다.QAE에서는 state preparation에서 사용되는 것 같습니다.
(사실 이것은 앞의 두 고유 벡터의 선형 조합이다)
from qiskit.circuit.library import PhaseEstimation
num_evaluation_qubits = 3
circ_QPE = QuantumCircuit(num_evaluation_qubits+nqubit, num_evaluation_qubits)
circ_QPE.append(state_preparation,range(num_evaluation_qubits,num_evaluation_qubits+nqubit))
circ_QPE.append(PhaseEstimation(num_evaluation_qubits=num_evaluation_qubits,unitary=circ_Q),range(nqubit+num_evaluation_qubits))
circ_QPE.measure(range(num_evaluation_qubits),range(num_evaluation_qubits-1,-1,-1))
circ_QPE.draw('mpl')


네, 물론 고체치도 중첩되어 있습니다.
그리고 $Q$의 고유치의 위상 (QPE로 구한 것) 이 $2\theta/(2\pi) 달러라는 것을 알았습니다. 원하는 폭을 $a=\sin^{2}\theta 달러로 계산하면 QAE가 완성됩니다.두 피쳐 값 중 어느 하나라도 가능합니다.... 때문에
$a=\sin^{2}\theta = (\sin(\pi/6))^{2} = (\sin(5\pi/6))^{2} = 1/4 = 0.25 $
실제로 QPE에 넣어서 (비슷하게) 구한 것들.
$a~(\sin(\pi/8))^{2} = 0.146$
또는
$a~(\sin(0.875\pi))^{2} = 0.146$
네.

결론


qiskit.아쿠아는 편리해요.2
사실 이전 문장QAA, Grover, QAE를 배우세요.에서 이 방법을 잘 사용했다. 
아쿠아도 QPE 라이브러리가 있어요.하지만 엘미 매트릭스 $H$만 받아들인 것 같습니다내 생각에는 H$U=e^{iH} $U의 QPE에서 꺼내는 절차를 QPE로 정의했기 때문인 것 같다.다만, 폭의 예측처럼 H$U달러를 주지 못하는 경우도 많기 때문에 왜요? 

좋은 웹페이지 즐겨찾기