python은 ProjectQ를 사용하여 양자 알고리즘 명령 집합을 생성합니다.

출력 알고리즘 조작


먼저 가장 기본적인 사용 방법을 소개한다. 바로 프로젝트 Q를 사용하여 양자 알고리즘에 입력된 양자문 조작을 인쇄하는 것이다. 여기서 프로젝트 Q의 DummyEngine 백엔드에서 조작을 저장하는 데 사용되는 지령을 사용했다.예를 들어 가장 간단한 Bell State의 제조는 다음과 같은 코드를 통해 이루어지고 저장된 기본 조작을 출력할 수 있다.

from projectq import MainEngine
from projectq.cengines import DummyEngine
from projectq.ops import H, CX, All, Measure

backend = DummyEngine(save_commands=True)
eng = MainEngine(backend=backend)

qureg = eng.allocate_qureg(2)
H | qureg[0]
CX | (qureg[0], qureg[1])

All(Measure) | qureg
eng.flush(deallocate_qubits=True)

for cmd in backend.received_commands:
    print (cmd)
실행 결과는 다음과 같습니다.

Allocate | Qureg[0]
H | Qureg[0]
Allocate | Qureg[1]
CX | ( Qureg[0], Qureg[1] )
Measure | Qureg[0]
Measure | Qureg[1]
Deallocate | Qureg[0]
Deallocate | Qureg[1]
여기서 주의해야 할 것은 단일 연산이라면 우리는 Measure에 가면 끝낼 수 있다는 것이다.그러나 같은 라인의 작업이 아직 끝나지 않았다면 Measure 다음에 deallocate_qubits=True 설정 항목을 추가해서 현재 분배된 양자비트가 차지하는 메모리를 해제해야 합니다.

포장 작업


양자 알고리즘의 실현에서 우리는 일부 함수나 클래스로 일부 양자 알고리즘 조작 지령을 봉인할 수 있지만 이것은 문제를 초래할 수 있다. 즉, 프로젝트 Q에서 인쇄된 조작 지령이 봉인된 모듈의 내용을 출력하지 않았다는 것이다. 예를 들어 다음과 같은 사례와 같다.

from projectq import MainEngine
from projectq.cengines import DummyEngine
from projectq.ops import H, CX, All, Measure, TimeEvolution, QubitOperator

backend = DummyEngine(save_commands=True)
eng = MainEngine(backend=backend)

qureg = eng.allocate_qureg(3)
H | qureg[0]
CX | (qureg[0], qureg[1])
TimeEvolution(1, QubitOperator('X2 X1')) | qureg

All(Measure) | qureg
eng.flush()

for cmd in backend.received_commands:
    print (cmd)
실행 결과는 다음과 같습니다.

Allocate | Qureg[0]
H | Qureg[0]
Allocate | Qureg[1]
CX | ( Qureg[0], Qureg[1] )
Measure | Qureg[0]
Allocate | Qureg[2]
exp(-1j * (1.0 X0 X1)) | Qureg[1-2]
Measure | Qureg[1]
Measure | Qureg[2]
우리는 이곳의 시간 진화를 포함하는 조작 산자가 분해되지 않고 직접 출력된 것을 발견했다.그러나 하드웨어 시스템에서 지원하는 지령 조작만 식별할 수 있다면 여기에 포함된 시간 진화 조작은 양자 하드웨어 시스템에서 실현되지 않을 수 있기 때문에 우리는 지령을 양자 하드웨어에 보내기 전에 이를 분해해야 한다.

함시 진화 산자의 분해


여기에서 우리는 프로젝트 Q의 설정 중의restrictedgateset 방법을 직접 호출하여 조작을 분해합니다. 우리는 단비트 게이트 조작의 범위를 모든 조작으로 넓힐 것입니다. 그러나 이중 비트 조작은 CX 조작만 허용하고 이 설정을 engin_로 합니다.list 는 ProjectQ의 MainEngine에 구성됩니다.

from projectq import MainEngine
from projectq.cengines import DummyEngine
from projectq.ops import H, CX, All, Measure, TimeEvolution, QubitOperator
from projectq.setups import restrictedgateset

engine_list = restrictedgateset.get_engine_list(one_qubit_gates="any",two_qubit_gates=(CX,))
backend = DummyEngine(save_commands=True)
eng = MainEngine(backend=backend,engine_list=engine_list)

qureg = eng.allocate_qureg(3)
H | qureg[0]
CX | (qureg[0], qureg[1])
TimeEvolution(1, QubitOperator('X2 X1')) | qureg

All(Measure) | qureg
eng.flush(deallocate_qubits=True)

for cmd in backend.received_commands:
    print (cmd)
출력 결과는 다음과 같습니다.

Allocate | Qureg[0]
H | Qureg[0]
Allocate | Qureg[1]
CX | ( Qureg[0], Qureg[1] )
Measure | Qureg[0]
Allocate | Qureg[2]
H | Qureg[2]
H | Qureg[1]
CX | ( Qureg[1], Qureg[2] )
Rz(2.0) | Qureg[2]
CX | ( Qureg[1], Qureg[2] )
H | Qureg[1]
Measure | Qureg[1]
H | Qureg[2]
Measure | Qureg[2]
Deallocate | Qureg[0]
Deallocate | Qureg[1]
Deallocate | Qureg[2]
함시 진화 산수가 분해되어 출력된 것을 볼 수 있다.이미 알려진 단비트 양자문에 CX를 더하면 완비된 양자문 집합이기 때문에 일반적으로 우리는 이 집합을 직접 사용하여 양자문 조작 지령집의 제한을 할 수 있다.

QFT 분해


QFT는 ProjectQ에서 자체적으로 지원하는 양자 푸리엽 변환 양자문 조작 패키지입니다. 이전 장에서 소개한 시간 진화 산수와 유사합니다. 우리는 restrictedgateset로 QFT 산수를 구체적으로 분해할 수 있습니다.

from projectq import MainEngine
from projectq.cengines import DummyEngine
from projectq.ops import H, CX, All, Measure, TimeEvolution, QubitOperator, QFT
from projectq.setups import restrictedgateset

engine_list = restrictedgateset.get_engine_list(one_qubit_gates="any",two_qubit_gates=(CX,))
backend = DummyEngine(save_commands=True)
eng = MainEngine(backend=backend,engine_list=engine_list)

qureg = eng.allocate_qureg(3)
H | qureg[0]
CX | (qureg[0], qureg[1])
QFT | qureg

All(Measure) | qureg
eng.flush(deallocate_qubits=True)

for cmd in backend.received_commands:
    print (cmd)
결과는 다음과 같습니다.

Allocate | Qureg[2]
Allocate | Qureg[1]
H | Qureg[2]
Rz(0.785398163398) | Qureg[2]
Allocate | Qureg[0]
H | Qureg[0]
CX | ( Qureg[0], Qureg[1] )
R(0.785398163398) | Qureg[1]
CX | ( Qureg[1], Qureg[2] )
Rz(11.780972450962) | Qureg[2]
CX | ( Qureg[1], Qureg[2] )
R(0.392699081698) | Qureg[0]
Rz(0.392699081698) | Qureg[2]
CX | ( Qureg[0], Qureg[2] )
H | Qureg[1]
Rz(12.173671532661) | Qureg[2]
CX | ( Qureg[0], Qureg[2] )
R(0.785398163398) | Qureg[0]
Rz(0.785398163398) | Qureg[1]
CX | ( Qureg[0], Qureg[1] )
Rz(11.780972450962) | Qureg[1]
CX | ( Qureg[0], Qureg[1] )
H | Qureg[0]
Measure | Qureg[0]
Measure | Qureg[1]
Measure | Qureg[2]
Deallocate | Qureg[1]
Deallocate | Qureg[2]
Deallocate | Qureg[0]
2비트 게이트 작업도 제한되지 않으면 ProjectQ에서 가장 쉬운 분해 형식이 자동으로 선택됩니다.

from projectq import MainEngine
from projectq.cengines import DummyEngine
from projectq.ops import H, CX, All, Measure, TimeEvolution, QubitOperator, QFT
from projectq.setups import restrictedgateset

engine_list = restrictedgateset.get_engine_list(one_qubit_gates="any",two_qubit_gates="any")
backend = DummyEngine(save_commands=True)
eng = MainEngine(backend=backend,engine_list=engine_list)

qureg = eng.allocate_qureg(3)
H | qureg[0]
CX | (qureg[0], qureg[1])
QFT | qureg

All(Measure) | qureg
eng.flush(deallocate_qubits=True)

for cmd in backend.received_commands:
    print (cmd)
출력 결과는 다음과 같습니다.

Allocate | Qureg[0]
Allocate | Qureg[1]
H | Qureg[0]
CX | ( Qureg[0], Qureg[1] )
Allocate | Qureg[2]
H | Qureg[2]
CR(1.570796326795) | ( Qureg[1], Qureg[2] )
CR(0.785398163397) | ( Qureg[0], Qureg[2] )
H | Qureg[1]
CR(1.570796326795) | ( Qureg[0], Qureg[1] )
H | Qureg[0]
Measure | Qureg[0]
Measure | Qureg[1]
Measure | Qureg[2]
Deallocate | Qureg[1]
Deallocate | Qureg[2]
Deallocate | Qureg[0]
CX를 대체하기 위해 CR을 사용한 후에 분해된 회선이 더욱 간단하다는 것을 알 수 있다.

요약


본고는 주로 공사 실현의 측면에서 프로젝트 Q 개원 양자계산 시뮬레이터 프레임워크에서 양자문 조작 분해와 출력을 실현하는 방법을 설명한다.이 방법을 통해 양자 지령 집합의 범위를 제한하고 양자 알고리즘에서 지원되지 않는 양자문 조작 등가(또는 근사하게)를 양자 하드웨어 체계가 지원하는 양자 지령 집합으로 변화시킬 수 있다.
이상은python이 ProjectQ를 사용하여 양자 알고리즘 지령집을 생성하는 상세한 내용입니다. 더 많은python이 ProjectQ로 알고리즘 지령집을 생성하는 것에 대한 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기