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
명령은 표시되는 전체 셀로 범위가 지정됩니다. Notebook 셀 형식을 Python 에서 로 변경합니다 Q#.- 명령을 따르는 Q# 코드는 표준 Q# 코딩 구문을 준수해야 합니다. 예를 들어 셀 내에서
%%qsharp
대신#
를 사용하여//
주석을 나타내고 코드 줄은 세미콜론;
으로 끝나야 합니다. - 해당 셀 내의
%%qsharp
명령 앞뒤에는 Python 문이 올 수 없습니다.
Jupyter Notebook 프로그램을 사용하는 예제는 프로그램 시작 Q# 및 VS Code를 참조하세요.
형식
Q#는 양자 컴퓨팅과 관련된 형식과 함께 , Double
, Bool
및 String
를 비롯한 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);
}
}
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기