를 사용하여 양자 회로 다이어그램을 시각화하는 방법 Q#
양자 회로 다이어그램은 양자 연산의 시각적 표현입니다. 양자 프로그램을 통해 큐비트의 흐름을 보여 줍니다. 여기에는 게이트 및 적용된 측정값이 포함됩니다.
이 문서에서는 Visual Studio Code 또는 Jupyter Notebook을 사용하여 양자 회로 다이어그램을 사용하여 양자 알고리즘을 시각적으로 나타내는 방법을 알아봅니다.
양자 회로 다이어그램 규칙에 대한 자세한 내용은 양자 회로 규칙을 참조 하세요.
필수 조건
VS Code
최신 버전의 Visual Studio Code 또는 웹에서 VS Code를 엽니다.
최신 버전의 Azure Quantum 개발 키트 확장.
최신 Azure Quantum
qsharp
및azure-quantum
Python 패키지.python -m pip install --upgrade qsharp azure-quantum
Jupyter 노트북
최신 버전의 Visual Studio Code 또는 웹에서 VS Code를 엽니다.
Azure Quantum Development Kit, Python 및 Jupyter 확장이 설치된 VS Code
최신 Azure Quantum
qsharp
및qsharp-widgets
패키지 및ipykernel
패키지.python -m pip install --upgrade qsharp qsharp-widgets ipykernel
Visual Studio Code를 사용하는 양자 회로
다음 단계에 따라 Visual Studio Code에서 프로그램의 양자 회로 Q# 를 시각화합니다. 양자 회로 다이어그램 규칙에 대한 자세한 내용은 양자 회로 규칙을 참조 하세요.
프로그램의 회로 다이어그램 Q# 보기
Q# Visual Studio Code에서 파일을 열거나 양자 샘플 중 하나를 로드합니다.
프로그램의 양자 회로 Q# 를 시각화하려면 뷰 -> 명령 팔레트를 선택하고 : 회로 표시 옵션을 표시Q#해야 하는 "회로"를 입력합니다. 앞
Main()
의 명령 목록에서 회로를 클릭할 수도 있습니다.회로가 회로 창에 Q# 표시됩니다. 예를 들어 다음 회로는 큐비트를 중첩에 배치한 다음 측정한 작업에 해당합니다. 회로 다이어그램은 |0⟩ 상태로 초기화된 하나의 큐비트 레지스터를 보여줍니다. 그런 다음, 하다마드 게이트 H가 큐비트에 적용되고 측정 연산이 이어지며 미터 기호로 표현됩니다.
작업에 대한 회로 다이어그램 보기
단일 Q# 작업에 대한 양자 회로를 시각화할 수 있습니다. 이렇게 하려면 작업 선언 위에 표시되는 코드 렌즈에서 회로 단추를 클릭합니다.
디버깅 시 회로 다이어그램 보기
프로그램을 디버깅할 Q# 때 프로그램의 현재 상태에 따라 양자 회로를 시각화할 수 있습니다.
앞
Main()
의 코드 렌즈 명령 목록에서 디버그 단추를 선택합니다.왼쪽의 실행 및 디버그 보기에서 변수 창 아래의 Quantum 회로 섹션을 확장하여 프로그램을 단계별로 진행하면서 회로를 표시합니다.
코드를 단계별로 실행하고 다양한 지점에서 중단점을 설정하여 프로그램이 실행되면 회로 업데이트를 확인할 수 있습니다.
현재 양자 회로는 회로 패널에 Q# 표시됩니다. 이 회로 다이어그램은 시뮬레이터의 현재 상태, 즉 현재 실행 지점까지 적용된 게이트를 나타냅니다.
Jupyter Notebook을 사용하는 양자 회로
Jupyter Notebooks에서는 패키지를 사용하여 양자 회로를 시각화할 qsharp-widgets
수 있습니다. 이 패키지는 양자 회로 다이어그램을 SVG 이미지로 렌더링하는 위젯을 제공합니다.
Visual Studio Code에서 보기 > 명령 팔레트를 선택하고 만들기: 새로운 Jupyter Notebook을 선택합니다.
Notebook의 첫 번째 셀에서 다음 코드를 실행하여 모듈을 Q# 가져옵니다.
import qsharp
새 셀 을 추가하고 코드를 입력합니다 Q# . 예를 들어 다음 코드는 벨 상태를 준비합니다.
%%qsharp // Prepare a Bell State. use register = Qubit[2]; H(register[0]); CNOT(register[0], register[1]);
이 함수를
dump_circuit()
사용하여 프로그램의 현재 상태에 따라 양자 회로를 표시할 수 있습니다. 예를 들어 회로 다이어그램은 |0⟩ 상태로 초기화된 두 개의 큐비트 레지스터를 보여 줍니다. 그런 다음, Hadamard 게이트 H가 첫 번째 큐비트에 적용됩니다. 그런 다음, 첫 번째 큐비트를 컨트롤로 사용하여 CNOT 게이트를 적용합니다. 이 큐비트는 점으로 표현되고 두 번째 큐비트는 X로 target표시됩니다.qsharp.dump_circuit()
q_0 ── H ──── ● ── q_1 ───────── X ──
패키지를 사용하여 양자 회로를 SVG 이미지 로 시각화할
qsharp-widgets
수 있습니다. 이 경우 CNOT 게이트는 컨트롤 큐비트에 점이 있고 큐비트에서 할례된 크로스 target 가 있는 두 큐비트를 연결하는 선으로 표시됩니다. 자세한 내용은 Quantum 회로 규칙을 참조 하세요.from qsharp_widgets import Circuit Circuit(qsharp.dump_circuit())
항목 식에 대한 회로 다이어그램 보기
항목 식을 호출 qsharp.circuit()
하고 인수로 전달하여 항목 식을 사용하여 모든 프로그램에 대한 회로 다이어그램을 생성할 수 있습니다.
예를 들어 새 셀을 추가하고 다음 코드를 복사하여 GHZ 상태를 준비합니다.
%%qsharp import Std.Diagnostics.*; import Std.Measurement.*; operation GHZSample(n: Int) : Result[] { use qs = Qubit[n]; H(qs[0]); ApplyToEach(CNOT(qs[0], _), qs[1...]); let results = MeasureEachZ(qs); ResetAll(qs); return results; }
새 셀을 추가하고 다음 코드를 실행하여 회로를 시각화합니다. 예를 들어 큐비트가 3개인 GHZ 상태를 준비합니다.
Circuit(qsharp.circuit("GHZSample(3)"))
큐비트를 사용하여 작업에 대한 회로 다이어그램 보기
큐비트 또는 큐비트 배열을 사용하는 모든 작업에 대한 회로 다이어그램을 생성할 수 있습니다. 다이어그램은 입력 큐비트가 있는 만큼의 와이어와 작업 내에 할당된 추가 큐비트를 보여 줍니다. 작업이 큐비트의 (Qubit[])
배열을 사용하는 경우 회로는 배열을 2큐비트의 레지스터로 표시합니다.
새 셀을 추가하고 다음 예제를 복사합니다. 이 코드는 cat 상태를 준비합니다.
%%qsharp operation PrepareCatState(register : Qubit[]) : Unit { H(register[0]); ApplyToEach(CNOT(register[0], _), register[1...]); }
새 셀을 추가하고 다음 코드를 실행하여 작업의 회로를 시각화합니다
PrepareCatState
.Circuit(qsharp.circuit(operation="PrepareCatState"))
회로 다이어그램에 영향을 주는 조건
양자 회로를 시각화할 때 다음 조건은 회로 다이어그램의 시각화에 영향을 줄 수 있습니다.
동적 회로
회로 다이어그램은 프로그램 내에서 모든 클래식 논리를 Q# 실행하고 할당된 큐비트 또는 적용된 게이트를 추적하여 생성됩니다. 루프 및 조건부가 클래식 값만 처리하는 한 지원됩니다.
그러나 큐비트 측정 결과를 사용하는 루프 및 조건식을 포함하는 프로그램은 회로 다이어그램으로 표현하기 더 까다롭습니다. 예를 들어 다음과 같은 식
if (M(q) == One) {
X(q)
}
게이트는 측정 결과에 조건부이므로 간단한 회로 다이어그램으로 나타낼 수 없습니다. 이러한 회로를 동적 회로라고 합니다.
회로 다이어그램은 양자 시뮬레이터에서 프로그램을 실행하고 적용된 게이트를 추적하여 동적 회로에 대해 생성할 수 있습니다. 이는 시뮬레이션이 수행될 때 큐비트와 게이트가 추적되기 때문에 추적 모드라고 합니다.
추적된 회로의 단점은 단일 시뮬레이션을 위해 측정 결과 및 결과 게이트 애플리케이션만 캡처한다는 것입니다. 위의 예제에서 측정 결과가 있으면 Zero
다이어그램에 게이트가 X
표시되지 않습니다. 시뮬레이션의 또 다른 실행은 약간 다른 회로를 표시할 수 있습니다.
Target 윤곽
현재 선택한 target 프로필은 회로 다이어그램이 생성되는 방식에 영향을 줍니다. Target 프로필은 하드웨어의 target 기능 및 양자 프로그램에 적용되는 제한을 지정하는 데 사용됩니다.
프로필이 target 무제한 또는 QIR 적응 RI로 설정된 경우 회로 다이어그램은 프로그램에서 호출되는 양자 연산을 Q# 보여 줍니다. 프로필이 target QIR 베이스로 설정되면 회로 다이어그램은 프로그램이 이 target 프로필을 사용하여 Azure Quantum에 제출되는 경우 하드웨어에서 실행되는 양자 작업을 보여 줍니다.
참고 항목
VS Code에서 프로필을 선택 target 하려면 보기 -> 명령 팔레트를 선택하고 Q#: Azure Quantum QIR target 프로필을 설정합니다. 또는
unrestricted
드롭다운 목록에서 선택할QIR base
QIR Adaptive RI
수 있습니다.Python
qsharp.init(target_profile=qsharp.TargetProfile.Base)
qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RI)
qsharp.init(target_profile=qsharp.TargetProfile.Unrestricted)
에서 프로필을 선택하려면 target
특히 게이트 분해가 적용되어 결과 회로가 하드웨어의 target 기능과 호환됩니다. 이는 코드를 생성하고 Azure Quantum에 제출하는 동안 적용되는 것과 동일한 분해입니다.
예를 들어 큐비트와 큐비트 배열을 측정하는 다음 Q# 프로그램을 고려해 보세요.
import Std.Measurement.*; operation Main() : (Result, Result[]) { // The `M` operation performs a measurement of a single qubit in the // computational basis, also known as the Pauli Z basis. use q = Qubit(); let result = M(q); Reset(q); // The `MeasureEachZ` operation measures each qubit in an array in the // computational basis and returns an array of `Result` values. use qs = Qubit[2]; let results = MeasureEachZ(qs); return (result, results); }
프로필이 무제한 또는 QIR 적응 RI로 설정된 경우 target 회로에 표시되는 게이트는 프로그램에서 호출되는 Q# 양자 작업에 정확히 해당합니다.
프로필이 target QIR 기반이면 회로가 다르게 보입니다. 기본 프로필 targets 은 측정 후 큐비트 재사용을 허용하지 않으므로 이제 얽힌 큐비트에서 측정이 수행됩니다.
Reset
작업은 기본 프로필에서 지원되는 게이트가 아니므로 삭제됩니다. 결과 회로는 이 프로그램이 이 target 프로필을 사용하여 Azure Quantum에 제출되는 경우 하드웨어에서 실행되는 것과 일치합니다.