Q# 양자 프로그래밍 언어 사용자 가이드

Q# 양자 프로그래밍 언어는 프로그램 시각화 및 분석을 위한 풍부한 IDE 지원 및 도구를 제공하는 Microsoft의 Quantum Development Kit일부입니다. Q# 및 Quantum Development Kit (QDK)를 사용하면 Azure Quantum을 사용하여 양자 프로그램을 작성하고 실제 양자 하드웨어에서 실행할 수 있습니다.

자세한 정보는 양자 개발 환경을 구성하는 방법Azure Quantum에 Q# 작업을 제출하는 방법을 참조하세요.

Q# 사용자 가이드에는 다음과 같은 내용이 포함되어 있습니다.

  • Q# 프로그램 실행 방법: Q# 프로그램은 독립 실행형 애플리케이션으로 실행하거나 Python 또는 .NET 언어로 작성된 추가 호스트 프로그램과 함께 실행할 수 있습니다.

  • Q# 프로그램 테스트 및 디버깅: 기존 프로그래밍과 마찬가지로 양자 프로그램이 의도한 대로 작동하는지 확인하고 잘못된 동작을 진단할 수 있어야 합니다. Quantum Development Kit 양자 프로그램 테스트 및 디버깅을 위한 입니다.

  • Q# 언어 가이드: Q#는 높은 수준의 추상화를 제공하는 독립 실행형 언어입니다. 양자 상태 또는 회로의 개념은 없습니다. 그 대신, Q#은 기존 프로그래밍 언어와 매우 비슷하게 명령문과 식을 사용하여 프로그램을 구현합니다. Q# 언어 가이드는 Q# 양자 프로그래밍 언어의 전체 사양과 설명서를 제공합니다.

  • 양자 시뮬레이터 설명서: 양자 시뮬레이터는 클래식 컴퓨터에서 실행되고 프로그램의 컴퓨터 Q# 역할을 target 하는 소프트웨어 프로그램이므로 클래식 컴퓨터에서 양자 프로그램을 실행하고 테스트할 수 있습니다.

  • Q# 라이브러리 설명서: 는 Quantum Development Kit 프로젝트에 추가할 Q# 수 있는 NuGet 패키지를 통해 추가 도메인 관련 기능을 제공합니다. 설명서에는 표준 Q# 라이브러리를 구성하는 연산, 함수, 사용자 정의 형식, 예 및 개념은 물론 양자 화학, 양자 기계 학습 및 양자 숫자 라이브러리가 포함됩니다.

Q# 프로그램에는 무엇이 있나요?

Q# 프로그램에 맞는 일반적인 부분을 살펴보겠습니다. 다음 Q# 프로그램을 참조하세요.

namespace HelloQuantum {

    open Microsoft.Quantum.Canon;
    open Microsoft.Quantum.Intrinsic;


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

EntryPoint는 프로그램 실행을 시작할 위치를 Q# 컴파일러에 알려줍니다. 프로그램이 다음 메시지를 출력합니다.

    Hello quantum world!

네임스페이스

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

namespace HelloQuantum {
    // Your code goes here.
}

네임스페이스는 관련 기능을 구성하는 데 도움이 됩니다. 프로그램에서 Q# 라이브러리를 사용하고 사용자 고유의 라이브러리를 작성하는 경우에는 그 사용이 중요해집니다.

라이브러리

Q#은 라이브러리를 광범위하게 사용합니다. 라이브러리는 양자 프로그램에서 사용할 수 있는 함수 및 작업을 포함하는 패키지입니다.

예를 들어 Microsoft.Quantum.Chemistry 라이브러리를 사용하여 화학과 관련된 양자 계산을 수행할 수 있습니다. 모든 종류의 기본 작업을 포함하는 몇 가지 표준 라이브러리가 있습니다.

라이브러리에서 함수 또는 작업을 호출할 때 라이브러리의 네임스페이스를 지정합니다. 다음은 콘솔에 메시지를 인쇄하기 위해 Microsoft.Quantum.Intrinsic 라이브러리에서 Message 함수를 호출하는 예입니다.

namespace HelloQuantum {

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

보다 일반적으로는 open 지시문을 사용하여 코드를 더 간결하고 읽기 쉽게 만들 수 있습니다.

이 예제에서는 이전 예제와 동일한 작업을 수행합니다. 단, 이 예제는 open 지시문을 사용하여 Microsoft.Quantum.Intrinsic 네임스페이스를 프로그램으로 가져옵니다.

namespace HelloQuantum {

    open Microsoft.Quantum.Intrinsic;

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

여기서는 Message를 지정하기만 하면 컴파일러가 속해 있는 네임스페이스를 이해할 수 있습니다.

Q# 설명서는 각 기본 제공 라이브러리에 대한 완전한 참조 설명서를 제공합니다. 자세한 내용은 Q# 라이브러리 설명서를 참조하세요.

형식

Q#에서는 Int, Double, BoolString 등 이미 친숙한 여러 가지 기본 제공 형식을 양자 컴퓨팅 고유 형식과 함께 제공합니다. 예를 들어, Result 형식은 큐비트 측정 결과를 나타내며 두 가지 가능한 값(OneZero) 중 하나를 가질 수 있습니다. Q#도 범위, 배열 및 튜플을 정의하는 형식을 제공합니다. 사용자가 사용자 지정 형식을 정의할 수도 있습니다.

대체로 Q# 형식 시스템은 C# 또는 Java와 같은 클래식 언어에서 사용되는 클래스나 인터페이스에 대한 명시적인 개념이 없다는 점에서 상당히 최소화되어 있습니다.

큐빗 할당

Q#에서 큐비트가 use 키워드를 통해 할당됩니다. 한 번에 하나 또는 여러 개의 큐빗을 할당할 수 있습니다.

다음은 하나의 큐빗을 할당하는 예제입니다.

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

// Do something with q here.

기본적으로 use 키워드로 할당하는 모든 큐비트는 제로 상태에서 시작합니다.

양자 연산

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

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

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

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

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

큐비트 상태에 대한 모든 직접 작업은 모두 및 H 와 같은 X기본 호출 가능 개체로 정의됩니다. 즉, 구현이 내에서 Q# 정의되지 않고 대신 머신에서 정의 target 되는 호출 가능 개체입니다. 이러한 작업이 실제로 수행하는 작업은 특정 Q# 프로그램을 실행하도록 선택한 컴퓨터에 의해 target 서만 구체적입니다. 자세한 내용은 Q#프로그램 구현을 참조하세요.

예를 들어 전체 상태 시뮬레이터에서 프로그램을 실행하는 경우 해당 시뮬레이터는 시뮬레이션된 양자 시스템에 해당하는 수학 연산을 수행합니다. 그러나 미래를 내다보면 컴퓨터가 실제 양자 컴퓨터인 경우 target 에서 Q# 이러한 작업을 호출하면 양자 컴퓨터가 실제 양자 하드웨어에서 해당 실제 작업을 수행하도록 지시합니다. 예를 들어, 트랩 이온 양자 컴퓨터에서 양자 연산은 정확한 시간에 맞춰진 레이저 펄스에 의해 실현됩니다.

프로그램은 Q# 컴퓨터에서 정의한 대로 이러한 연산을 다시 조합하여 양자 계산을 target 표현하는 새로운 상위 수준 연산을 만듭니다. 이러한 방식으로 Q# 을 사용하면 논리 기본 양자 및 하이브리드 양자-클래식 알고리즘을 쉽게 표현할 수 있는 동시에 컴퓨터 또는 시뮬레이터의 target 구조와 관련하여 일반적입니다.

큐비트 측정

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

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

참고

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

계산 기준 $\ket{0},\ket{1}$로 측정을 구현하기 위해 M 연산을 사용할 수도 있습니다. 이 연산은 Pauli Z 기준으로 단일 큐비트의 측정을 수행합니다. 따라서 M 연산은 Measure([PauliZ], [qubit]) 적용과 같습니다.

간단한 예는 $\ket{0}$ 상태에 1개의 큐비트를 할당하고, 여기에 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(qubit);
    // We reset the qubit before releasing it.
    if result == One { X(qubit); }
    // Finally, we return the result of the measurement.
    return result;
    
}

단일 조인트 측정 이외의 측정을 수행하기 위해 Microsoft.Quantum.Measurement 네임스페이스에는 보다 구체적인 작업이 포함됩니다. 예를 들어 MultiM 연산은 큐비트 배열을 사용하고 측정 결과 배열을 계산 기준으로 반환합니다.

다음 단계