다음을 통해 공유


를 사용하여 양자 회로 다이어그램을 시각화하는 방법 Q#

양자 회로 다이어그램은 양자 연산의 시각적 표현입니다. 양자 프로그램을 통해 큐비트의 흐름을 보여 줍니다. 여기에는 게이트 및 적용된 측정값이 포함됩니다.

이 문서에서는 Visual Studio Code 또는 Jupyter Notebook을 사용하여 양자 회로 다이어그램을 사용하여 양자 알고리즘을 시각적으로 나타내는 방법을 알아봅니다.

양자 회로 다이어그램 규칙에 대한 자세한 내용은 양자 회로 규칙을 참조 하세요.

필수 조건

VS Code

Jupyter 노트북

  • 최신 버전의 Visual Studio Code 또는 웹에서 VS Code를 엽니다.

  • Azure Quantum Development Kit, PythonJupyter 확장이 설치된 VS Code

  • 최신 Azure Quantum qsharpqsharp-widgets 패키지 및 ipykernel 패키지.

    python -m pip install --upgrade qsharp qsharp-widgets ipykernel
    

Visual Studio Code를 사용하는 양자 회로

다음 단계에 따라 Visual Studio Code에서 프로그램의 양자 회로 Q# 를 시각화합니다. 양자 회로 다이어그램 규칙에 대한 자세한 내용은 양자 회로 규칙을 참조 하세요.

프로그램의 회로 다이어그램 Q# 보기

  1. Q# Visual Studio Code에서 파일을 열거나 양자 샘플 중 하나를 로드합니다.

  2. 프로그램의 양자 회로 Q# 를 시각화하려면 뷰 -> 명령 팔레트를 선택하고 : 회로 표시 옵션을 표시Q#해야 하는 "회로"를 입력합니다. 앞Main()의 명령 목록에서 회로를 클릭할 수도 있습니다.

    Q# 코드 렌즈 회로 명령을 찾을 위치를 보여 주는 Visual Studio Code의 파일을 스크린샷으로 표시합니다.

  3. 회로가 회로 창에 Q# 표시됩니다. 예를 들어 다음 회로는 큐비트를 중첩에 배치한 다음 측정한 작업에 해당합니다. 회로 다이어그램은 |0⟩ 상태로 초기화된 하나의 큐비트 레지스터를 보여줍니다. 그런 다음, 하다마드 게이트 H가 큐비트에 적용되고 측정 연산이 이어지며 미터 기호로 표현됩니다.

    임의 Q# 비트 작업에 대한 결과 회로 다이어그램을 보여 주는 회로 창 스크린샷

작업에 대한 회로 다이어그램 보기

단일 Q# 작업에 대한 양자 회로를 시각화할 수 있습니다. 이렇게 하려면 작업 선언 위에 표시되는 코드 렌즈에서 회로 단추를 클릭합니다.

프로그램을 디버깅한 후 회로 창에서 Q# 회로를 시각화하는 방법을 보여 주는 Visual Studio Code의 스크린샷

디버깅 시 회로 다이어그램 보기

프로그램을 디버깅할 Q# 때 프로그램의 현재 상태에 따라 양자 회로를 시각화할 수 있습니다.

  1. Main()코드 렌즈 명령 목록에서 디버그 단추를 선택합니다.

  2. 왼쪽의 실행 및 디버그 보기에서 변수 창 아래Quantum 회로 섹션을 확장하여 프로그램을 단계별로 진행하면서 회로를 표시합니다.

    프로그램을 디버깅하는 동안 회로를 시각화하는 방법을 보여 주는 Visual Studio Code의 스크린샷

  3. 코드를 단계별로 실행하고 다양한 지점에서 중단점을 설정하여 프로그램이 실행되면 회로 업데이트를 확인할 수 있습니다.

  4. 현재 양자 회로는 회로 패널Q# 표시됩니다. 이 회로 다이어그램은 시뮬레이터의 현재 상태, 즉 현재 실행 지점까지 적용된 게이트를 나타냅니다.

    단일 Q# 작업에 대한 회로를 시각화하는 방법을 보여 주는 Visual Studio Code의 스크린샷

Jupyter Notebook을 사용하는 양자 회로

Jupyter Notebooks에서는 패키지를 사용하여 양자 회로를 시각화할 qsharp-widgets 수 있습니다. 이 패키지는 양자 회로 다이어그램을 SVG 이미지로 렌더링하는 위젯을 제공합니다.

  1. Visual Studio Code에서 보기 > 명령 팔레트를 선택하고 만들기: 새로운 Jupyter Notebook을 선택합니다.

  2. Notebook의 첫 번째 셀에서 다음 코드를 실행하여 모듈을 Q# 가져옵니다.

    import qsharp
    
  3. 새 셀 을 추가하고 코드를 입력합니다 Q# . 예를 들어 다음 코드는 벨 상태를 준비합니다.

    %%qsharp
    
    // Prepare a Bell State.
    use register = Qubit[2];
    H(register[0]);
    CNOT(register[0], register[1]);
    
  4. 이 함수를 dump_circuit() 사용하여 프로그램의 현재 상태에 따라 양자 회로를 표시할 수 있습니다. 예를 들어 회로 다이어그램은 |0⟩ 상태로 초기화된 두 개의 큐비트 레지스터를 보여 줍니다. 그런 다음, Hadamard 게이트 H가 첫 번째 큐비트에 적용됩니다. 그런 다음, 첫 번째 큐비트를 컨트롤로 사용하여 CNOT 게이트를 적용합니다. 이 큐비트는 점으로 표현되고 두 번째 큐비트는 X로 target표시됩니다.

    qsharp.dump_circuit()
    
    q_0    ── H ──── ● ──
    q_1    ───────── X ──
    
  5. 패키지를 사용하여 양자 회로를 SVG 이미지 로 시각화할 qsharp-widgets 수 있습니다. 이 경우 CNOT 게이트는 컨트롤 큐비트에 점이 있고 큐비트에서 할례된 크로스 target 가 있는 두 큐비트를 연결하는 선으로 표시됩니다. 자세한 내용은 Quantum 회로 규칙을 참조 하세요.

    from qsharp_widgets import Circuit
    
    Circuit(qsharp.dump_circuit())
    

    작업에 대한 Q# 회로를 시각화하는 방법을 보여 주는 Jupyter Notebook의 스크린샷

항목 식에 대한 회로 다이어그램 보기

항목 식을 호출 qsharp.circuit() 하고 인수로 전달하여 항목 식을 사용하여 모든 프로그램에 대한 회로 다이어그램을 생성할 수 있습니다.

  1. 예를 들어 새 셀을 추가하고 다음 코드를 복사하여 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;
    }
    
  2. 새 셀을 추가하고 다음 코드를 실행하여 회로를 시각화합니다. 예를 들어 큐비트가 3개인 GHZ 상태를 준비합니다.

    Circuit(qsharp.circuit("GHZSample(3)"))
    

큐비트를 사용하여 작업에 대한 회로 다이어그램 보기

큐비트 또는 큐비트 배열을 사용하는 모든 작업에 대한 회로 다이어그램을 생성할 수 있습니다. 다이어그램은 입력 큐비트가 있는 만큼의 와이어와 작업 내에 할당된 추가 큐비트를 보여 줍니다. 작업이 큐비트의 (Qubit[])배열을 사용하는 경우 회로는 배열을 2큐비트의 레지스터로 표시합니다.

  1. 새 셀을 추가하고 다음 예제를 복사합니다. 이 코드는 cat 상태를 준비합니다.

    %%qsharp
    
    operation PrepareCatState(register : Qubit[]) : Unit {
        H(register[0]);
        ApplyToEach(CNOT(register[0], _), register[1...]);
    }
    
  2. 새 셀을 추가하고 다음 코드를 실행하여 작업의 회로를 시각화합니다 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 baseQIR Adaptive RI수 있습니다.

  • Pythonqsharp.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에 제출하는 동안 적용되는 것과 동일한 분해입니다.

  1. 예를 들어 큐비트와 큐비트 배열을 측정하는 다음 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);
    }
    
  2. 프로필이 무제한 또는 QIR 적응 RI설정된 경우 target 회로에 표시되는 게이트는 프로그램에서 호출되는 Q# 양자 작업에 정확히 해당합니다.

    프로필이 무제한인 경우 target 양자 회로의 스크린샷.

  3. 프로필이 target QIR 기반이면 회로가 다르게 보입니다. 기본 프로필 targets 은 측정 후 큐비트 재사용을 허용하지 않으므로 이제 얽힌 큐비트에서 측정이 수행됩니다. Reset 작업은 기본 프로필에서 지원되는 게이트가 아니므로 삭제됩니다. 결과 회로는 이 프로그램이 이 target 프로필을 사용하여 Azure Quantum에 제출되는 경우 하드웨어에서 실행되는 것과 일치합니다.

    프로필이 QIR 기반인 경우 target 양자 회로의 스크린샷.