Q# 프로그램 구조

이 문서에서는 프로그램을 구성하는 Q# 일반적인 구성 요소를 살펴봅니다. Q# Jupyter Notebook으로 작성된 프로그램은 이러한 구성 요소 중 일부를 사용하지 않습니다. 이러한 차이점은 각 섹션에 설명되어 있습니다.

다음 Q# 프로그램을 참조하세요.

namespace Superposition {

    @EntryPoint()
    operation MeasureOneQubit() : Result {
        // Allocate a qubit, by default it is in zero state      
        use q = Qubit();  
        // We apply a Hadamard operation H to the state
        // It now has a 50% chance of being measured 0 or 1  
        H(q);      
        // Now we measure the qubit in Z-basis.
        let result = M(q);
        // We reset the qubit before releasing it.
        Reset(q);
        // Finally, we return the result of the measurement.
        return result;
    }
}

주석(//)을 읽는 것만으로 이 프로그램이 큐비트를 할당하고, 작업을 적용하여 중첩에 배치하고, 큐비트의 상태를 측정한 다음, 다시 설정한 다음 결과를 반환한다는 것을 알 수 있습니다.

Visual Studio Code 이 프로그램을 실행하려면 프로그램 및 VS Code 시작을 Q# 참조하세요.

사용자 네임스페이스

Q# 프로그램은 일반적으로 사용자 이름 네임스페이스(예: )로 시작합니다.

namespace Superposition {
    // Your code goes here.
}

네임스페이스는 관련 기능을 구성하는 데 도움이 됩니다. 네임스페이스는 사용자 이름이고 qsharp(*.qs) 파일당 하나 namespace 만 있을 수 있습니다.

Q# 표준 라이브러리에는 양자 프로그램에서 사용할 수 있는 함수 및 연산이 포함된 미리 정의된 네임스페이스가 있습니다. 자세한 내용은 기본 제공 네임스페이스를 참조하세요.

Jupyter Notebook은 사용자 네임스페이스를 사용하지 않습니다.

EntryPoint()

특성은 @EntryPoint() 컴파일러에 Q# 프로그램 실행을 시작할 위치를 알려줍니다. 여러 함수 및 작업 정의 @EntryPoint() 가 있는 프로그램에서 함수 또는 작업 및 프로그램 흐름이 시작되고 순차적으로 계속되기 전에 을 배치할 수 있습니다.

    ...
    @EntryPoint()
    operation MeasureOneQubit() : Result {
        ...

Jupyter Notebook은 진입점을 사용하지 않습니다.

%%qsharp 명령

기본적으로 Q# Jupyter Notebook의 프로그램은 ipykernel Python 커널을 사용합니다. Notebook 셀에 코드를 추가 Q# 하려면 Python 패키지에서 qsharp 사용하도록 설정된 명령을 사용해야 %%qsharp 합니다. 예를 들어 Jupyter Notebook 이전 샘플 코드는 다음과 같습니다.

import qsharp
%%qsharp

    operation MeasureOneQubit() : Result {
        // Allocate a qubit, by default it is in zero state      
        use q = Qubit();  
        // We apply a Hadamard operation H to the state
        // It now has a 50% chance of being measured 0 or 1  
        H(q);      
        // Now we measure the qubit in Z-basis.
        let result = M(q);
        // We reset the qubit before releasing it.
        Reset(q);
        // Display the result
        Message($"Result is {result}");
        // Finally, we return the result of the measurement.
        return result;
    
    }
    MeasureOneQubit();

Jupyter Notebook에 필요하지 않은 사용자 네임스페이스 또는 @EntryPoint()이 없습니다. 진입점 대신 마지막 줄에서 작업을 직접 호출합니다. Message 또한 결과를 표시하기 위해 문을 Jupyter Notebook 코드에 추가했습니다. VS Code에서 이전 Q# 프로그램을 실행하는 경우 기본 제공 시뮬레이터는 기본적으로 결과를 표시합니다.

명령을 사용하는 %%qsharp 경우:

  • %%qsharp 명령을 사용하도록 설정하려면 먼저 import qsharp를 실행해야 합니다.
  • %%qsharp 명령은 표시되는 전체 셀로 범위가 지정됩니다.
  • 명령을 따르는 Q# 코드는 표준 Q# 코딩 구문을 준수해야 합니다. 예를 들어 셀 내에서 %%qsharp 대신 # 를 사용하여 // 주석을 나타내고 코드 줄은 세미콜론 ;으로 끝나야 합니다.
  • 해당 셀 내의 %%qsharp 명령 앞뒤에는 Python 문이 올 수 없습니다.

Jupyter Notebook 프로그램을 사용하는 예제는 프로그램 시작 Q# 및 VS Code를 참조하세요.

형식

Q#는 양자 컴퓨팅과 관련된 형식과 함께 , Double, BoolString를 비롯한 Int대부분의 언어에 공통적인 많은 기본 제공 형식을 제공합니다. 예를 들어 형식은 Result 모든 큐비트 측정의 결과를 나타내며, 두 가지 가능한 정의 값 One 중 하나인 및 Zero중 하나를 가질 수 있습니다. 예제 프로그램에서 작업은 MeasureOneQubit()Result 반환 형식을 예상하며 연산은 M 큐비트를 측정하고 를 반환합니다 Result.

...
// operation definition expecting a return type of Result
operation MeasureOneQubit() : Result {
    ...
    // Now we measure the qubit in Z-basis, returning a Result type
    let result = M(q);
    ...
}

Q#도 범위, 배열 및 튜플을 정의하는 형식을 제공합니다. 사용자가 사용자 지정 형식을 정의할 수도 있습니다.

큐빗 할당

Q#에서 큐비트가 use 키워드를 통해 할당됩니다.

이 예제는 단일 큐비트를 정의합니다.

// Allocate a qubit.
use q = Qubit();
...

하지만 여러 큐비트를 할당하고 인덱스를 통해 각 큐비트에 액세스할 수도 있습니다.

...
use qubits = Qubit[2];
X(qubits[1]);
H(qubits[0]);
...

기본적으로 use 키워드로 할당하는 모든 큐비트는 제로 상태에서 시작합니다. 각 큐비트는 프로그램이 끝날 때 해제되기 전에 0 상태를 다시 설정 해야 합니다 . 큐비트를 다시 설정하지 못하면 런타임 오류가 트리거됩니다.

// Reset a qubit.
Reset(q);
...

양자 연산

할당된 후 큐비트는 호출 가능 항목이라고도 하는 연산 및 함수에 전달될 수 있습니다. 연산은 Q# 프로그램의 기본 빌딩 블록입니다. Q# 연산은 양자 서브루틴입니다. 즉, 큐빗 레지스터의 상태를 수정하는 양자 작업을 포함하는 호출 가능 루틴입니다.

Q# 작업을 정의하려면 해당 입력 및 해당 출력과 함께 작업 이름을 지정합니다. 이 예제에서 단일 작업은 기본적으로 전체 프로그램입니다. 매개 변수를 사용하지 않으며 의 Result반환 형식이 필요합니다.

operation MeasureOneQubit() : Result {
    ...
}

다음은 매개 변수를 사용하지 않고 반환 값이 필요하지 않은 기본 예제입니다. 값은 Unit 다른 언어와 동일합니다 NULL .

operation SayHelloQ() : Unit {
    Message("Hello quantum world!");
}

또한 표준 라이브러리는 Q# 프로그램에서 사용할 수 있는 작업(예: Hadamard 또는 H 예제 프로그램에 사용되는 작업)을 제공합니다. Z축 기준 큐비트라면 H 연산에서는 이 큐비트를 짝수 중첩으로 만듭니다. 중첩 상태에서 이 큐비트가 0 또는 1로 측정될 확률이 50%입니다.

큐비트 측정

다양한 유형의 양자 측정이 있지만 Q# Pauli 측정이라고도 하는 단일 큐비트에 대한 투사 측정에 중점을 둡니다. 특정 기저(예: 계산 기저 $\ket{0},\ket{1}$)에서 측정할 때는 기저 상태가 측정된 쪽에 큐비트 상태가 투사되므로 둘 사이의 중첩이 소멸됩니다.

예제 프로그램은 Pauli Z 기준으로 단일 큐비트의 측정을 수행하고 형식을 반환하는 연산을 Result 사용합니다M.

기본 제공 네임스페이스

표준 Q# 라이브러리는 양자 프로그램에서 사용할 수 있는 함수 및 연산이 포함된 기본 제공 네임스페이스를 사용합니다. 예를 들어 네임스페이스에 Microsoft.Quantum.Intrinsic 는 일반적으로 사용되는 작업 및 와 같은 M함수가 포함되어 결과 및 Message를 측정하여 프로그램의 아무 곳에나 사용자 메시지를 표시합니다.

전체 네임스페이스를 지정하여 함수 또는 연산을 호출하거나 문을 사용하여 open 해당 네임스페이스에 대한 모든 함수와 작업을 사용할 수 있도록 하고 코드를 더 쉽게 읽을 수 있도록 할 수 있습니다. 다음 두 예제는 동일한 작업을 호출합니다.

 Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
open Microsoft.Quantum.Intrinsic;
Message("Hello quantum world!");

예제 프로그램에는 전체 네임스페이스가 있는 문이나 호출이 없습니다 open . Q# 개발 환경에서는 일반적으로 사용되는 함수와 Microsoft.Quantum.Intrinsic 작업을 포함하는 및 네임스페이스를 기본적으로 Microsoft.Quantum.Core 자동으로 로드하기 때문입니다.

네임스페이 Microsoft.Quantum.Measurement 스를 활용하고 작업을 사용하여 MResetZ 예제 프로그램의 코드를 최적화할 수 있습니다. MResetZ 는 다음 예제와 같이 측정 및 다시 설정 작업을 한 단계로 결합합니다.

namespace Superposition {

    // open the namespace for the MResetZ operation
    open Microsoft.Quantum.Measurement;

    @EntryPoint()
    operation MeasureOneQubit() : Result {
        // Allocate a qubit, by default it is in zero state      
        use q = Qubit();  
        // We apply a Hadamard operation H to the state
        // It now has a 50% chance of being measured 0 or 1  
        H(q);   
        // Measure and reset the qubit, and return the result value   
        return MResetZ(q);
    }
    
}