양자 프로그래밍 언어 소개 Q#
Q# 는 양자 알고리즘을 개발하고 실행하기 위한 고급 오픈 소스 프로그래밍 언어입니다. Q# 는 QDK(Quantum Development Kit)에 포함됩니다. 자세한 내용은 Quantum 개발 키트 설정을 참조 하세요.
양자 프로그래밍 언어는 다음 언어, Q# 컴파일러 및 런타임 요구 사항을 충족합니다.
- 하드웨어 독립적: 양자 알고리즘의 큐비트는 특정 양자 하드웨어 또는 레이아웃에 연결되지 않습니다. 컴파일러 및 런타임은 Q# 프로그램 큐비트에서 실제 큐비트로의 매핑을 처리합니다.
- 양자 및 클래식 컴퓨팅 통합: 범용 양자 컴퓨터에서 클래식 및 양자 계산을 수행하는 기능은 필수적입니다.
- 물리학의 법칙을 존중합니다.Q# 양자 알고리즘은 양자 물리학의 규칙을 따릅니다. 예를 들어 .에서 큐비트 상태를 Q#직접 복사하거나 액세스할 수 없습니다.
Q# 프로그램 구조
양자 프로그램 작성을 시작하기 전에 해당 구조와 구성 요소를 이해하는 것이 중요합니다. 중첩 상태를 만드는 다음 Q# 프로그램을 고려합니다.
namespace Superposition {
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit. By default, it's in the 0 state.
use q = Qubit();
// Apply the Hadamard operation, H, to the state.
// It now has a 50% chance of being measured as 0 or 1.
H(q);
// Measure the qubit in the Z-basis.
let result = M(q);
// Reset the qubit before releasing it.
Reset(q);
// Return the result of the measurement.
return result;
}
}
주석(//
) Superposition
에 따라 프로그램은 먼저 큐비트를 할당하고, 큐비트를 중첩에 배치하는 작업을 적용하고, 큐비트 상태를 측정하고, 큐비트를 재설정하고, 마지막으로 결과를 반환합니다. 이 프로그램을 해당 구성 요소로 분해해 보겠습니다.
사용자 네임스페이스
Q# 프로그램은 필요에 따라 다음과 같은 사용자 정의 네임스페이스로 시작할 수 있습니다.
namespace Superposition {
// Your code goes here.
}
네임스페이스는 관련 기능을 구성하는 데 도움이 될 수 있습니다. 각 Q# 프로그램에는 하나 namespace
만 있을 수 있습니다. 네임스페이스를 지정 Q# 하지 않으면 컴파일러는 파일 이름을 네임스페이스로 사용합니다. 예를 들어 Superposition
프로그램을 다음과 같이 작성할 수 있습니다.
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit. By default, it's in the 0 state.
use q = Qubit();
// Apply the Hadamard operation, H, to the state.
// It now has a 50% chance of being measured as 0 or 1.
H(q);
// Measure the qubit in the Z-basis.
let result = M(q);
// Reset the qubit before releasing it.
Reset(q);
// Return the result of the measurement.
return result;
}
Q# 표준 라이브러리에는 양자 프로그램에서 사용할 수 있는 함수와 연산이 포함된 미리 정의된 네임스페이스가 있습니다. 자세한 내용은 기본 제공 네임스페이스를 참조 하세요.
진입점
기본적으로 Q# 컴파일러는 사용 가능한 경우 프로그램에서 프로그램 어디에서나 배치할 수 있는 작업에서 Main()
프로그램 실행을 시작합니다. 필요에 따라 이 특성을 사용하여 @EntryPoint()
프로그램의 모든 작업을 실행 지점으로 지정할 수 있습니다.
Superposition
프로그램에서 더 설명적인 MeasureOneQubit()
작업은 프로그램의 진입점입니다.
@EntryPoint()
operation MeasureOneQubit() : Result {
...
그러나 작업의 이름을 MeasureOneQubit()
다음과 같이 변경하여 특성 없이 @EntryPoint()
프로그램을 작성할 Main()
수도 있습니다.
// The Q# compiler automatically detects the Main() operation as the entry point.
operation Main() : Result {
// Allocate a qubit. By default, it's in the 0 state.
use q = Qubit();
// Apply the Hadamard operation, H, to the state.
// It now has a 50% chance of being measured as 0 or 1.
H(q);
// Measure the qubit in the Z-basis.
let result = M(q);
// Reset the qubit before releasing it.
Reset(q);
// Return the result of the measurement.
return result;
}
유형
Q#는 양자 컴퓨팅과 관련된 형식을 포함하여 Double
String
Int
Bool
대부분의 언어에 공통적인 기본 제공 형식을 제공합니다. 예를 들어 이 형식은 Result
큐비트 측정 결과를 나타내며 두 값 Zero
중 하나 또는 One
둘 중 하나를 가질 수 있습니다.
Superposition
프로그램에서 MeasureOneQubit()
작업은 작업의 반환 형식에 해당하는 형식을 M
반환 Result
합니다. 측정 결과는 다음 문을 사용하여 정의된 새 변수에 let
저장됩니다.
// The operation definition returns a Result type.
operation MeasureOneQubit() : Result {
...
// Measure the qubit in the Z-basis, returning a Result type.
let result = M(q);
...
Q#도 범위, 배열 및 튜플을 정의하는 형식을 제공합니다. 사용자가 사용자 지정 형식을 정의할 수도 있습니다.
큐빗 할당
에서 Q#키워드를 사용하여 큐비트를 할당합니다 use
. 큐비트는 항상 상태에서 할당됩니다 $\ket{0}$ .
프로그램은 Superposition
단일 큐비트를 정의합니다.
// Allocate a qubit.
use q = Qubit();
여러 큐비트를 할당하고 인덱스를 통해 각 큐비트에 액세스할 수도 있습니다.
use qubits = Qubit[2]; // Allocate two qubits.
H(qubits[0]); // Apply H to the first qubit.
X(qubits[1]); // Apply X to the second qubit.
자세한 내용은 Use 문을 참조 하세요.
양자 연산
큐비트를 할당한 후 호출 가능이라고도 하는 작업 및 함수에 전달할 수 있습니다. 연산은 Q# 프로그램의 기본 빌딩 블록입니다. Q# 작업은 양자 서브루틴 또는 큐비트 레지스터의 상태를 변경하는 양자 연산을 포함하는 호출 가능한 루틴입니다.
작업을 정의 Q# 하려면 작업 이름, 해당 입력 및 출력을 지정합니다. Superposition
프로그램에서 MeasureOneQubit()
작업은 기본적으로 전체 프로그램입니다. 매개 변수를 사용하지 않고 형식을 Result
반환합니다.
operation MeasureOneQubit() : Result {
...
}
다음은 매개 변수를 사용하지 않고 반환 값이 필요하지 않은 기본 예제입니다. 값은 Unit
다른 언어와 동일합니다 NULL
.
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
표준 라이브러리는 Q# 또한 프로그램에서 Hadamard 작업과 같은 양자 프로그램에서 사용할 수 있는 Superposition
작업을 H
제공합니다. Z-basis H
에서 큐비트를 지정하면 큐비트를 짝수 중첩으로 전환합니다. 여기서 큐비트는 측정 Zero
될 확률이 50%입니다 One
.
큐비트 측정
다양한 유형의 양자 측정이 있지만 Pauli Q# 측정이라고도 하는 단일 큐비트의 투사형 측정에 중점을 둡니다.
에서 Q#작업은 지정된 Pauli 기준으로 PauliX
PauliY
PauliZ
하나 이상의 큐비트를 측정합니다.Measure
Measure
는 형식 Zero
을 Result
반환합니다One
.
계산 기준 $\lbrace\ket{0},\ket{1}\rbrace$로 측정을 구현하려면 Pauli Z-basis에서 큐비트를 측정하는 연산을 사용할 M
수도 있습니다. 이 값은 M
.에 해당합니다 Measure([PauliZ], [qubit])
.
프로그램은 다음 Superposition
작업을 사용합니다 M
.
// Measure the qubit in the Z-basis.
let result = M(q);
큐비트 다시 설정
에서 Q#큐비트는 해제될 때 상태에 있어야 $\ket{0}$ 합니다. Reset
이 작업을 사용하여 각 큐비트를 $\ket{0}$ 상태로 다시 설정한 후 프로그램 끝에 해제합니다. 큐비트를 다시 설정하지 못하면 런타임 오류가 발생합니다.
// Reset a qubit.
Reset(q);
기본 제공 네임스페이스
Q# 표준 라이브러리에는 양자 프로그램에서 사용할 수 있는 함수 및 작업이 포함된 기본 제공 네임스페이스가 있습니다. 예를 들어 네임스페이 Microsoft.Quantum.Intrinsic
스에는 결과를 측정하고 프로그램 어디에서나 사용자 메시지를 표시하는 것과 같이 M
일반적으로 사용되는 작업 및 Message
함수가 포함됩니다.
함수 또는 작업을 호출하려면 전체 네임스페이스를 지정하거나 문을 사용하여 import
해당 네임스페이스에 대한 모든 함수와 작업을 사용할 수 있게 하고 코드를 더 읽기 쉽게 만들 수 있습니다. 다음 예제에서는 동일한 작업을 호출합니다.
Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
// imports all functions and operations from the Microsoft.Quantum.Intrinsic namespace.
import Microsoft.Quantum.Intrinsic.*;
Message("Hello quantum world!");
// imports just the `Message` function from the Microsoft.Quantum.Intrinsic namespace.
import Microsoft.Quantum.Intrinsic.Message;
Message("Hello quantum world!");
// namespaces in the standard library may be imported using `Std` instead of `Microsoft.Quantum`.
import Std.Intrinsic.*;
Message("Hello quantum world!");
프로그램에는 Superposition
전체 네임스페이스가 있는 문이나 호출이 없습니다 import
. Q# 개발 환경에서는 일반적으로 사용되는 함수와 연산을 포함하는 두 네임스페이스 및 Microsoft.Quantum.Intrinsic
네임스페 Microsoft.Quantum.Core
이스를 자동으로 로드하기 때문입니다.
작업을 사용하여 네임스페이 Microsoft.Quantum.Measurement
스를 활용하여 MResetZ
프로그램을 최적화 Superposition
할 수 있습니다. MResetZ
는 다음 예제와 같이 측정 및 다시 설정 작업을 한 단계로 결합합니다.
// Import the namespace for the MResetZ operation.
import Microsoft.Quantum.Measurement.*;
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit. By default, it's in the 0 state.
use q = Qubit();
// Apply the Hadamard operation, H, to the state.
// It now has a 50% chance of being measured as 0 or 1.
H(q);
// Measure and reset the qubit, and then return the result value.
return MResetZ(q);
}
Azure Quantum을 사용하여 Q# 양자 프로그램 개발
Q# Azure Quantum은 양자 프로그램을 개발하고 실행하기 위한 강력한 조합입니다. Azure Quantum을 Q# 사용하여 양자 프로그램을 작성하고, 해당 동작을 시뮬레이션하고, 리소스 요구 사항을 예측하고, 실제 양자 하드웨어에서 실행할 수 있습니다. 이러한 통합을 통해 양자 컴퓨팅의 잠재력을 살펴보고 복잡한 문제에 대한 혁신적인 솔루션을 개발할 수 있습니다. 초보자든 숙련된 양자 개발자 Q# 이든 Azure Quantum은 양자 컴퓨팅의 기능을 잠금 해제하는 데 필요한 도구와 리소스를 제공합니다.
다음 다이어그램은 양자 프로그램이 개발 시 통과되는 단계와 Azure Quantum을 Q# 보여 줍니다. 프로그램은 개발 환경으로 시작하고 실제 양자 하드웨어에 작업을 제출하는 것으로 끝납니다.
다이어그램의 단계를 세어 보겠습니다.
개발 환경 선택
선호하는 개발 환경에서 양자 프로그램을 실행합니다. Azure Quantum 웹 사이트의 온라인 코드 편집기, Azure Portal의 Azure Quantum 작업 영역에서 호스트된 Jupyter Notebooks 또는 Visual Studio Code를 사용하는 로컬 개발 환경을 사용할 수 있습니다. 자세한 내용은 프로그램을 실행하는 Q# 다양한 방법을 참조하세요.
양자 코드 작성
QDK(Quantum Development Kit)를 사용하여 양자 프로그램을 Q# 작성할 수 있습니다. 시작하려면 빠른 시작: 첫 번째 Q# 프로그램 만들기를 참조하세요.
Q#또한 QDK는 Qiskit 및 Cirq와 같은 양자 컴퓨팅을 위한 다른 언어를 지원합니다.
Python과 통합
단독으로 또는 다양한 IDE에서 Python과 함께 사용할 Q# 수 있습니다. 예를 들어 Python 호스트 프로그램과 함께 프로젝트를 사용하여 Q# 작업을 호출 Q# 할 수 있습니다. Jupyter Notebook에서 Python과 통합 Q# 할 수도 있습니다. 자세한 내용은 프로그램을 실행하는 Q# 다양한 방법을 참조하세요.
%%qsharp 명령
기본적으로 Q# Jupyter Notebook의 프로그램은 Python 패키지를 사용합니다 ipykernel
. Notebook 셀에 코드를 추가 Q# 하려면 Python 패키지와 함께 qsharp
사용하도록 설정된 명령과 다음 Q# 코드를 사용합니다%%qsharp
.
사용하는 %%qsharp
경우 다음 사항에 유의하세요.
- 를 사용하도록 설정
%%qsharp
하려면 먼저 실행import qsharp
해야 합니다. %%qsharp
범위가 나타나는 Notebook 셀로 범위를 지정하고, 셀 형식을 Python에서 .로 Q#변경합니다.- Python 문을 앞이나 후에
%%qsharp
넣을 수 없습니다. - Q# 다음 코드는
%%qsharp
구문을 준수 Q# 해야 합니다. 예를 들어 주석을 나타내고;
코드 줄을 끝내는 대신#
사용합니다//
.
참고 항목
Azure Portal의 Azure Notebook에는 최신 버전의 qsharp
Python 패키지가 azure-quantum
포함되어 있으므로 아무것도 설치할 필요가 없습니다. 자세한 내용은 시작 Q# 및 Azure Quantum Notebook을 참조하세요.
리소스 예측
실제 양자 하드웨어에서 실행하기 전에 기존 하드웨어에서 프로그램을 실행할 수 있는지 여부와 사용할 리소스 수를 파악해야 합니다.
Azure Quantum Resource Estimator를 사용하면 아키텍처 결정을 평가하고, 큐비트 기술을 비교하고, 지정된 양자 알고리즘을 실행하는 데 필요한 리소스를 결정할 수 있습니다. 미리 정의된 내결함성 프로토콜 중에서 선택하고 기본 물리적 큐비트 모델의 가정을 지정할 수 있습니다.
자세한 내용은 첫 번째 리소스 예상 실행을 참조하세요.
참고 항목
Azure Quantum Resources Estimator는 무료이며 Azure 계정이 필요하지 않습니다.
시뮬레이션에서 프로그램 실행
양자 프로그램을 컴파일하고 실행할 때 QDK는 양자 시뮬레이터의 인스턴스를 만들고 코드를 전달합니다 Q# . 시뮬레이터는 Q# 코드를 사용하여 큐비트를 만들고(퀀텀 입자 시뮬레이션), 변환을 적용하여 해당 상태를 수정합니다. 그런 다음 시뮬레이터의 양자 연산 결과가 프로그램에 반환됩니다. Q# 시뮬레이터에서 코드를 격리하면 알고리즘이 양자 물리학의 법칙을 따르고 양자 컴퓨터에서 올바르게 실행되도록 합니다.
실제 양자 하드웨어에 프로그램 제출
로컬 및 온라인에서 선호하는 개발 환경을 통해 프로그램(작업이라고도 함)을 Azure Quantum에 제출할 Q# 수 있습니다. 자세한 정보는 Q# 작업 제출 방법을 참조하세요. Qiskit 및 Cirq 언어로 작성된 양자 회로를 실행하고 제출할 수도 있습니다.
Azure Quantum은 업계 리더가 제공하는 가장 강력하고 다양한 양자 하드웨어를 제공합니다. 지원되는 하드웨어 공급자의 현재 목록은 Quantum 컴퓨팅 공급자를 참조하세요.
참고 항목
클라우드 기반 Quantinuum H 시리즈 에뮬레이터 대상은 Azure 계정 없이 사용할 수 있습니다. Azure Quantum 공급자의 나머지 부분에 작업을 제출하려면 Azure 계정 및 양자 작업 영역이 필요합니다. 양자 작업 영역이 없는 경우 Azure Quantum 작업 영역 만들기를 참조 하세요.
다음 다이어그램에서는 작업을 제출한 후의 기본 워크플로를 보여 줍니다.