다음을 통해 공유


빠른 시작: 첫 번째 Q# 프로그램 만들기

양자 컴퓨팅의 핵심 개념인 얽힘을 보여 주는 기본 Q# 프로그램을 작성하는 방법을 알아봅니다.

둘 이상의 큐비트가 얽히면 양자 정보를 공유합니다. 즉, 한 큐비트에 어떤 일이 일어나든 다른 큐비트에도 발생합니다. 이 빠른 시작에서는 벨 쌍이라는 특정 2큐비트 얽힌 상태를 만듭니다. Bell 쌍에서 하나의 큐비트를 $\ket{0}$ 상태로 측정하면, 측정하지 않아도 다른 큐비트가 $\ket{0}$ 상태에 있다는 것을 알 수 있습니다. 자세한 내용은 양자 얽힘을 참조하세요.

이 빠른 시작에서 당신은 다음을 수행합니다.

  • Q# 파일을 만듭니다.
  • 큐비트 쌍을 할당합니다.
  • 큐비트를 얽습니다.

필수 조건

Q# 파일을 만듭니다

  1. Visual Studio Code를 엽니다.
  2. 새 텍스트 파일 파일을> 선택합니다.
  3. 파일을 Main.qs로 저장합니다. .qs 확장은 Q# 프로그램을 나타냅니다.

Q# 코드 작성

Main.qs 파일에서 다음 단계에 따라 큐비트 쌍을 얽고 측정합니다.

양자 라이브러리 가져오기

QDK에는 양자 프로그램에 대한 미리 정의된 함수 및 연산이 포함된 표준 라이브러리가 포함되어 Q# 있습니다. 이를 사용하려면 먼저 관련 라이브러리를 가져와야 합니다.

프로그램에서 import 문을 사용하여 Microsoft.Quantum.Diagnostics 라이브러리를 엽니다. 이렇게 하면 나중에 얽힌 상태를 표시하는 데 사용하는 기능을 비롯한 DumpMachine()모든 함수 및 작업에 액세스할 수 있습니다.

    import Microsoft.Quantum.Diagnostics.*;

작업 정의

관련 라이브러리를 가져온 후 양자 작업과 해당 입력 및 출력 값을 정의합니다. 이 빠른 시작의 경우 작업은 다음과 같습니다 Main. 여기서는 두 개의 큐비트를 할당, 조작 및 측정하기 위해 나머지 Q# 코드를 작성합니다.

Main 는 매개 변수를 사용하지 않고 큐비트 측정 결과를 나타내는 두 Result 값 중 하나 Zero 또는 One두 값을 반환합니다.

    operation Main() : (Result, Result) {
        // Your entanglement code goes here.
}

두 개의 큐비트 할당

현재 Main 연산이 비어 있으므로, 다음 단계는 두 개의 큐비트인 q1q2를 할당하는 것입니다. Q#에서 use 키워드를 사용하여 큐비트를 할당합니다.

        // Allocate two qubits, q1 and q2, in the 0 state.
        use (q1, q2) = (Qubit(), Qubit());

노트

에서 Q#의 큐비트는 항상 $\ket{0}$ 상태로 할당됩니다.

하나의 큐비트를 중첩에 넣습니다.

큐비트 q1q2은 $\ket{0}$ 상태에 있습니다. 얽힘 상태를 준비하려면 큐비트 중 하나를 각각 $\ket{0}$ 또는 $\ket{1}$로 측정될 확률이 50%인 균등한 중첩 상태로 설정해야 합니다.

Hadamard 연산을 적용하여 큐비트를 중첩 상태로 만듭니다.

        // Put q1 into an even superposition.
        H(q1);

결과 상태 q1은/는 $\frac{{1}{\sqrt{2}}\ket{인 ({0}\ket{1}+$) 짝수 중첩 상태로, $\ket{0}$와 $\ket{{1}$의 짝수 중첩 상태입니다.

큐비트를 얽어라

이제 제어된 NOT, CNOT작업을 사용하여 큐비트를 얽을 준비가 되었습니다. CNOT 는 두 개의 큐비트를 사용하는 컨트롤 연산으로, 하나는 컨트롤 역할을 하고 다른 하나는 대상으로 사용합니다.

이 퀵스타트에서는 q1을(를) 컨트롤 큐비트로, q2을(를) 대상 큐비트로 설정합니다. 즉, CNOTq1의 상태가 $\ket{1}$일 때 q2의 상태를 전환합니다.

        // Entangle q1 and q2, making q2 depend on q1.
        CNOT(q1, q2);

두 큐비트의 결과 상태는 벨 쌍 $\frac{{1}{\sqrt{2}}(\ket{00}+\ket{{11})$입니다.

Hadamard 및 CNOT 연산이 큐비트의 상태를 변환하는 방법을 알아보려면 양자 연산을 사용하여 얽힘 만들기를 참조 하세요.

얽힌 상태 표시

큐비트를 측정하기 전에 이전 코드가 큐비트를 성공적으로 얽는지 확인하는 것이 중요합니다. 라이브러리 Microsoft.Quantum.Diagnostics의 일부인 DumpMachine 작업을 사용하여 Q# 프로그램의 현재 상태를 출력할 수 있습니다.

        // Show the entangled state of the qubits.
        DumpMachine();

큐비트 측정

큐비트가 얽혀 있는지 확인했으므로 M 작업을 사용하여 측정할 수 있습니다. q1q2을 측정하면, 양자 상태가 동일한 확률로 Zero 또는 One로 축소됩니다.

Q#에서 let 키워드를 사용하여 새 변수를 선언합니다. 측정 결과를 q1q2저장하고 변수를 각각 선언하려면 다음을 수행합니다m1m2.

        // Measure q1 and q2 and store the results in m1 and m2.
        let (m1, m2) = (M(q1), M(q2));

큐비트 다시 설정

각 Q# 프로그램의 끝에 릴리스되기 전에 큐비트는 $\ket{0}$ 상태에 있어야 합니다. Reset 작업을 사용하여 수행합니다.

        // Reset q1 and q2 to the 0 state.
        Reset(q1);
        Reset(q2);

측정 결과 반환

마지막으로 Main 작업을 완료하고 얽힌 상태를 관찰하려면 m1m2의 측정 결과를 반환합니다.

        // Return the measurement results.
        return (m1, m2);

함수 또는 작업에 대해 자세히 알아보려면 마우스로 Q# 가리킵니다.

Visual Studio Code에서 'H' 작업을 마우스로 가리킬 때 나타나는 세부 정보의 스크린샷

Q# 코드 실행

축하합니다! 두 개의 큐비트를 묶고 벨 쌍을 만드는 프로그램을 작성 Q# 했습니다.

최종 Q# 프로그램은 다음과 같습니다.

import Microsoft.Quantum.Diagnostics.*;

operation Main() : (Result, Result) {  
    // Allocate two qubits, q1 and q2, in the 0 state.
    use (q1, q2) = (Qubit(), Qubit());
    
    // Put q1 into an even superposition.
    // It now has a 50% chance of being measured as 0 or 1.
    H(q1);
    
    // Entangle q1 and q2, making q2 depend on q1.
    CNOT(q1, q2);
    
    // Show the entangled state of the qubits.
    DumpMachine();
    
    // Measure q1 and q2 and store the results in m1 and m2.
    let (m1, m2) = (M(q1), M(q2));
    
    // Reset q1 and q2 to the 0 state.
    Reset(q1);
    Reset(q2);
    
    // Return the measurement results.
    return (m1, m2);
}

프로그램을 실행하고 두 큐비트의 결과를 보려면 작업 위에서 실행을Main하거나 Ctrl+F5를 누릅니다.

Q#'실행' 명령을 찾을 위치를 보여 주는 Visual Studio Code 파일의 스크린샷.

디버그 콘솔에서 각각 다른 결과를 가진 프로그램을 여러 번 실행할 수 있습니다. 이는 양자 측정의 확률적 특성과 큐비트의 얽힘을 보여줍니다.

예를 들어 결과가 Zero라면, 디버그 콘솔은 다음과 같이 표시되어야 합니다.

DumpMachine:

 Basis | Amplitude      | Probability | Phase
 -----------------------------------------------
  |00⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000
  |11⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000

Result: "(Zero, Zero)"

다음 단계

양자 얽힘Q#에 대해 더 알아보려면 자습서: Q#을 사용하여 양자 얽힘을 탐색하세요. 이 자습서에서는 이 빠른 시작에서 다루는 개념을 확장하고 고급 얽힘 프로그램을 작성하는 데 도움이 됩니다.