Q# 프로그램은 어떻게 구성되나요?

완료됨

Q# 양자 프로그래밍 언어에는 잘 정의된 구조가 있습니다. 이 단원에서는 Q# 프로그램의 기본 구성 요소를 검토합니다.

네임스페이스

모든 Q# 파일은 네임스페이스로 시작합니다. 예를 들면 다음과 같습니다.

namespace HelloQuantum {
    // Your code goes here.
}

namespace 키워드(keyword) 네임스페이스를 정의하는 데 사용됩니다. 네임스페이스는 Q# 코드를 논리 단위로 구성하는 데 사용됩니다. 프로그램에서 Q# 라이브러리를 사용하고 사용자 고유의 라이브러리를 작성하는 경우에는 그 사용이 중요해집니다.

라이브러리

Q# 라이브러리에는 양자 프로그램에서 사용할 수 있는 함수와 연산이 포함되어 있습니다. 라이브러리에서 함수 또는 작업을 호출할 때 지시문을 사용하고 open 라이브러리의 네임스페이스를 지정합니다. 예시:

namespace HelloQuantum {

    open Microsoft.Quantum.Intrinsic;

    @EntryPoint()
    operation HelloQ() : Unit {
        Message("Hello quantum world!");
    }
}

이 예제에서 지시문은 open Q# 컴파일러에 네임스페이 Message 스에서 Microsoft.Quantum.Intrinsic 작업을 찾도록 지시합니다.

진입점

EntryPoint 는 Q# 컴파일러에 프로그램 실행을 시작할 위치를 알려줍니다. 모든 Q# 프로그램에는 하나 이상의 진입점과 연산이 있어야 합니다.

큐빗 할당

Q#에서는 큐빗을 얻기 위해 use 키워드를 사용합니다. 키워드(keyword) 할당하는 use 모든 큐비트는 |0> 상태에서 시작됩니다.

한 번에 하나 또는 여러 개의 큐빗을 할당할 수 있습니다. 다음은 1개와 5개의 큐비트를 할당하는 예제입니다.

use q1 = Qubit(); // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits

양자 연산

작업은 Q# 프로그램의 기본 구성 요소입니다. Q# 작업은 양자 서브루틴입니다. 즉, 큐빗 레지스터의 상태를 수정하는 양자 작업을 포함하는 호출 가능 루틴입니다.

Q# 작업을 정의하려면 해당 입력 및 해당 출력과 함께 작업 이름을 지정합니다. 기본 예제는 다음과 같습니다.

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

여기에서 SayHelloQ가 작업의 이름입니다. 이 작업은 입력으로 0개의 인수를 사용하고 Unit 형식을 반환합니다. 즉, 정보를 반환하지 않습니다.

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

형식

Q#에서는 Int, Double, Bool, String 등 이미 친숙한 여러 가지 기본 제공 형식을 양자 컴퓨팅 고유 형식과 함께 제공합니다. Q#도 범위, 배열 및 튜플을 정의하는 형식을 제공합니다. 사용자가 사용자 지정 형식을 정의할 수도 있습니다.

이 모듈에서는 Result 형식으로 작업합니다. Result는 큐빗 측정 결과를 나타내며 두 개의 가능한 값 OneZero 중 하나를 가질 수 있습니다.

큐비트 측정

Q#에서 Pauli 측정은 지정된 Pauli 베이스에서 하나 이상의 큐비트의 공동 측정을 수행하는 작업을 적용하여 Measure 수행됩니다. 작업에서 Measure 형식을 반환 Result 합니다. 즉, 형식입니다 OneZero.

참고 항목

기준 배열과 큐비트 배열의 길이가 다른 경우 Measure 연산이 실패합니다.

계산 기준 {|0} ,|1}}으로 측정을 구현하려면 Pauli Z 기준으로 단일 큐비트의 측정을 수행하는 연산을 사용할 M 수도 있습니다. 따라서 작업은 M 적용하는 것과 Measure([PauliZ], [qubit])같습니다.

간단한 예는 |0> 상태에서 하나의 큐비트를 할당한 다음 Hadamard 작업을 H 적용하고 결과를 PauliZ 기준으로 측정하는 다음 프로그램입니다.

@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);

    // Reset the qubit so it can be safely released.
    Reset(qubit);
    return result;
}

참고 항목

Reset 작업은 큐비트를 |0> 상태로 다시 설정하는 데 사용됩니다. Q#에서 큐비트는 해제될 때까지 |0> 상태여야 합니다.