Share via


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

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

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

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

사전 요구 사항

Visual Studio Code 사용하여 양자 회로를 시각화하려면 다음이 필요합니다.

Visual Studio Code 있는 양자 회로

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

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

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

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

    Q# 코드 렌즈 회로 명령을 찾을 위치를 보여 주는 Visual Studio Code 파일 스크린샷

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

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

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

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

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

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

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

  1. 아래 @EntryPoint()코드 렌즈 명령 목록에서 디버그 단추를 클릭합니다.

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

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

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

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

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

Jupyter Notebook을 사용하는 양자 회로

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

  1. Visual Studio Code 명령 팔레트 보기를 > 선택하고 Create: 새 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 . 자세한 내용은 양자 회로 규칙을 참조하세요.

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

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

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

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

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

    %%qsharp
    
    open Microsoft.Quantum.Diagnostics;
    open Microsoft.Quantum.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무제한으로 설정된 경우 회로 다이어그램은 프로그램에서 호출되는 양자 연산을 Q# 보여 줍니다. 프로필이 targetQIR 베이스로 설정되면 회로 다이어그램은 프로그램이 이 target 프로필을 사용하여 Azure Quantum에 제출되는 경우 하드웨어에서 실행되는 양자 작업을 보여 줍니다.

참고

  • VS Code에서 프로필을 선택 target 하려면 보기 -> 명령 팔레트로 이동하여 :Q# Azure Quantum QIR target 프로필을 설정합니다. 드롭다운 목록에서 또는 QIR Base Profile 을 선택할 Unrestricted 수 있습니다.

  • Python에서 프로필을 선택 target 하려면 또는 qsharp.init(target_profile=qsharp.TargetProfile.Base)을 작성 qsharp.init(target_profile=qsharp.TargetProfile.Unrestricted) 합니다.

특히 게이트 분해가 적용되어 결과 회로가 하드웨어의 target 기능과 호환됩니다. 이는 코드를 생성하고 Azure Quantum에 제출하는 동안 적용되는 것과 동일한 분해입니다.

  1. 예를 들어 큐비트와 큐비트 배열을 측정하는 다음 Q# 프로그램을 고려해 보세요.

    namespace Sample {
        open Microsoft.Quantum.Measurement;
    
        @EntryPoint()
        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. 프로필이 무제한으로 설정된 경우 target 회로에 표시되는 게이트는 프로그램에서 호출되는 Q# 양자 연산과 정확히 일치합니다.

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

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

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