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

완료됨

양자 컴퓨팅은 원자 및 아원자 물체가 상호 작용하는 방식을 설명하는 양자 역학을 기반으로 합니다.

양자 컴퓨팅의 배경이 되는 이론 및 수학을 학습하는 보다 정석적인 방법이 있지만 여기서는 몇 가지 기본 용어를 정의하고 기본 Q# 프로그램의 구조를 단계별로 소개합니다. 나중에 양자 난수 생성기를 빌드할 때 이러한 개념이 적용됩니다.

양자 컴퓨팅을 탐색할 때 수학적 수준에서 개념을 이해해야 합니다. 이 모듈의 끝부분에서 양자 컴퓨팅 배경 이론을 더 자세히 이해하는 데 도움이 되는 리소스를 찾을 수 있습니다. 이미 양자 컴퓨팅 배경 지식이 있는 경우 여기서는 Q#에서 개념을 적용하는 방법을 알아봅니다.

큐빗과 중첩이란 무엇인가요?

양자 컴퓨팅을 처음 접하는 경우에도 큐빗중첩 이란 용어를 들었을 수 있을 것입니다. 이러한 개념은 양자 컴퓨팅의 기본 개념이지만 무엇을 의미할까요?

큐빗(양자 비트)은 양자 정보의 기본 단위이며, 일반 컴퓨팅의 비트와 유사합니다.

비트(이진수)의 값은 0 또는 1일 수 있지만 큐비트는 0 상태 및 1 상태 모두의 중첩 상태로, 측정할 경우 0이 될 수도 1이 될 수도 있습니다. 큐빗 측정은 큐빗의 상태를 변화시킵니다. 즉, 측정할 경우 큐빗은 중첩 상태에서 고전 상태 중 하나로 이동합니다.

Q# 프로그램이란 무엇인가요?

이전 부분에서 실행한 Q# 프로그램은 다음과 같습니다.

namespace HelloQuantum {

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


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

전체 프로그램에서 각 부분의 역할을 살펴보겠습니다.

네임스페이스

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

namespace HelloQuantum {
    // Your code goes here.
}

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

라이브러리

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

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

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

namespace HelloQuantum {

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

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

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

namespace HelloQuantum {

    open Microsoft.Quantum.Intrinsic;

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

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

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

작업

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

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

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

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

또한 Q# 라이브러리는 프로그램에서 사용할 수 있는 작업을 제공합니다. 나중에 사용할 한 가지 작업은 H 작업입니다. H 작업을 큐빗을 균일 중첩으로 설정하는 한 방법으로 생각하면 됩니다. 중첩 상태에서 큐빗은 0 또는 1로 측정될 확률이 50%입니다.

형식

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

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

큐빗 할당

Q#에서는 큐빗을 얻기 위해 use 키워드를 사용합니다. 한 번에 하나 또는 여러 개의 큐빗을 할당할 수 있습니다.

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

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

// Do something with q here.

use 키워드를 사용하여 할당하는 모든 큐빗은 0 상태로 시작됩니다.

이러한 개념으로 무장하고 난수 생성기 빌드를 시작해 보겠습니다. 먼저 단일 난수 비트를 생성하는 작업부터 정의합니다.