Q# 는 양자 프로그램을 작성하기 위해 Microsoft에서 개발한 고급 오픈 소스 프로그래밍 언어입니다. Q# 는 QDK(Quantum Development Kit)에 포함됩니다. 자세한 내용은 Quantum 개발 키트 설정을 참조 하세요.
양자 프로그래밍 언어는 언어, Q# 컴파일러 및 런타임에 대한 다음 요구 사항을 충족합니다.
- 하드웨어 독립적: 양자 알고리즘의 큐비트는 특정 양자 하드웨어 또는 레이아웃에 연결되지 않습니다. 컴파일러와 런타임은 Q# 프로그램 큐비트에서 실제 큐비트로의 매핑을 처리하여 서로 다른 양자 프로세서에서 동일한 코드를 실행할 수 있도록 합니다.
- 양자 및 클래식 컴퓨팅의 통합:Q# 는 범용 양자 컴퓨팅에 필수적인 양자 및 클래식 계산의 통합을 허용합니다.
- 큐비트 관리:Q# 는 중첩 상태 만들기, 큐비트 얽힘 및 양자 측정 수행을 포함하여 큐비트를 관리하기 위한 기본 제공 작업 및 함수를 제공합니다.
- 물리학의 법칙을 존중합니다Q# . 및 양자 알고리즘은 양자 물리학의 규칙을 따라야 합니다. 예를 들어 Q#에서 큐비트 상태를 직접 복사하거나 액세스할 수 없습니다.
원본Q#에 대한 자세한 내용은 블로그 게시물을 참조하세요. 왜 필요한Q#가요?
Q# 프로그램 구조
프로그램 작성 Q# 을 시작하기 전에 해당 구조와 구성 요소를 이해하는 것이 중요합니다. 다음 Q# 프로그램, 이름이 Superposition인, 중첩 상태를 만듭니다.
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;
}
}
주석(//
) Q# 에 따라 프로그램은 먼저 큐비트를 할당하고, 큐비트를 중첩에 배치하는 작업을 적용하고, 큐비트 상태를 측정하고, 큐비트를 재설정하고, 마지막으로 결과를 반환합니다.
이 Q# 프로그램을 해당 구성 요소로 분해해 보겠습니다.
사용자 네임스페이스
Q# 프로그램은 필요에 따라 다음과 같은 사용자 정의 네임스페이스로 시작할 수 있습니다.
namespace Superposition {
// Your code goes here.
}
네임스페이스는 관련 기능을 구성하는 데 도움이 될 수 있습니다. 네임스페이스는 프로그램에서 선택 사항 Q# 이므로 네임스페이스를 정의하지 않고 프로그램을 작성할 수 있습니다.
예를 들어 예제의 중첩 프로그램은 네임스페이스 없이 다음과 같이 작성할 수도 있습니다.
@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# 프로그램에는 하나 namespace
만 있을 수 있습니다. 네임스페이스를 Q# 지정하지 않으면 컴파일러는 파일 이름을 네임스페이스로 사용합니다.
진입점
모든 Q# 프로그램에는 프로그램의 시작점인 진입점이 있어야 합니다. 기본적으로 Q# 컴파일러는, 사용할 수 있는 경우, 프로그램의 어디에나 위치할 수 있는 Main()
작업에서 프로그램 실행을 시작합니다. 필요에 따라 이 특성을 사용하여 @EntryPoint()
프로그램의 모든 작업을 실행 지점으로 지정할 수 있습니다.
예를 들어, 중첩 프로그램에서는 MeasureOneQubit()
작업이 프로그램의 진입점인데, 이는 작업 정의 앞에 @EntryPoint()
특성이 있기 때문입니다.
@EntryPoint()
operation MeasureOneQubit() : Result {
...
}
그러나 @EntryPoint()
작업을 MeasureOneQubit()
로 이름을 변경하여 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#는 범위, 배열 및 튜플을 정의하는 형식을 Int
포함하여 Double
Bool
String
대부분의 언어에 공통적인 기본 제공 형식을 제공합니다.
Q# 에서는 양자 컴퓨팅과 관련된 형식도 제공합니다. 예를 들어 이 형식은 Result
큐비트 측정 결과를 나타내며 두 개의 값( Zero
또는 One
.)을 가질 수 있습니다.
중첩 프로그램에서 MeasureOneQubit()
연산은 Result
연산의 반환 형식에 해당하는 M
형식을 반환합니다. 측정 결과는 다음 문을 사용하여 정의된 새 변수에 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);
...
}
양자별 형식의 또 다른 예는 Qubit
양자 비트를 나타내는 형식입니다.
Q# 또한 사용자 고유의 사용자 지정 형식을 정의할 수 있습니다. 자세한 내용은 형식 선언을 참조하세요.
큐빗 할당
Q#에서, use
키워드와 Qubit
형식을 사용하여 큐비트를 할당합니다. 큐비트는 항상 $\ket{0}$ 상태로 할당됩니다.
예를 들어 중첩 프로그램은 단일 큐비트를 정의하고 변수 q
에 저장합니다.
// 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.
양자 연산
큐비트를 할당한 후 작업 및 함수에 전달할 수 있습니다. 작업은 프로그램의 기본 구성 요소입니다 Q# . Q# 작업은 양자 서브루틴 또는 큐비트 레지스터의 상태를 변경하는 양자 연산을 포함하는 호출 가능한 루틴입니다.
작업을 정의 Q# 하려면 작업 이름, 해당 입력 및 출력을 지정합니다.
중첩 프로그램에서 작업은 매개 변수를 MeasureOneQubit()
사용하지 않고 형식을 Result
반환합니다.
operation MeasureOneQubit() : Result {
...
}
다음은 매개 변수를 사용하지 않고 반환 값이 필요하지 않은 기본 예제입니다. 값 Unit
은 다른 언어의 NULL
와 동일합니다.
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
표준 라이브러리는 Q# 프로그램에서 사용할 수 있는 Hadamard 연산과 같은 작업을 제공하며, 이는 H
같은 양자 프로그램에서 사용할 수 있습니다. Z-basis에서 큐비트를 지정하면 H
이 큐비트를 Zero
또는 One
로 측정될 수 있는 확률이 각각 50%인 짝수 중첩 상태로 전환합니다.
큐비트 측정
다양한 유형의 양자 측정이 있지만 Pauli Q# 측정이라고도 하는 단일 큐비트의 투사형 측정에 중점을 둡니다.
Q#에서, Measure
작업은 하나 이상의 큐비트를 지정된 Pauli 기준, 즉 PauliX
, PauliY
, 또는 PauliZ
중 하나에서 측정합니다.
Measure
는 Result
형식 중 하나인 Zero
또는 One
을 반환합니다.
계산 기준 $\lbrace\ket{0},\ket{1}\rbrace$로 측정을 구현하는 데에, Pauli Z-basis에서 큐비트를 측정하는 M
연산을 사용할 수도 있습니다. 이 값은 M
.에 해당합니다 Measure([PauliZ], [qubit])
.
예를 들어 중첩 프로그램은 다음 작업을 사용합니다 M
.
// Measure the qubit in the Z-basis.
let result = M(q);
큐비트 다시 설정
퀀톰 하드웨어에서 오류를 방지하려면 큐비트는 릴리스될 때 Q# 상태에 있어야 합니다. 프로그램 끝에 있는 작업을 사용하여 $\ket{0}$ 큐비트를 Reset
상태로 다시 설정할 수 있습니다. 큐비트를 다시 설정하지 못하면 런타임 오류가 발생합니다.
// 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!");
참고
중첩 프로그램에는 전체 네임스페이스가 있는 문이나 호출이 없습니다import
.
Q# 개발 환경에서는 일반적으로 사용되는 함수와 연산을 포함하는 두 네임스페이스인 Microsoft.Quantum.Core
와 Microsoft.Quantum.Intrinsic
를 자동으로 로드하기 때문입니다.
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은 양자 컴퓨팅의 기능을 잠금 해제하는 데 필요한 도구와 리소스를 제공합니다.
다음 다이어그램은 Q# 및 Azure Quantum을 사용하여 양자 프로그램을 개발할 때 거치는 단계들을 보여줍니다. 프로그램은 개발 환경으로 시작하고 실제 양자 하드웨어에 작업을 제출하는 것으로 끝납니다.
다이어그램의 단계를 세어 보겠습니다.
개발 환경 선택
선호하는 개발 환경에서 양자 프로그램을 실행합니다. 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 Notebooks에서 Python과 Q#를 통합할 수 있습니다. 자세한 내용은 Python 통합 Q# 을 참조하세요.
%%qsharp 명령
기본적으로 Q# Jupyter Notebook의 프로그램은 Python 패키지를 사용합니다 ipykernel
. Notebook 셀에 Q# 코드를 추가하려면, %%qsharp
명령어를 사용하고 Python 패키지가 필요합니다. 그 다음, qsharp
코드를 입력하세요.
사용하는 %%qsharp
경우 다음 사항에 유의하세요.
- 먼저
import qsharp
를 실행하여%%qsharp
를 사용하도록 설정해야 합니다. -
%%qsharp
는 나타나는 노트북 셀에 적용되며, 셀 유형을 Python에서 Q#로 변경합니다. - Python 문을
%%qsharp
의 앞뒤에 넣을 수 없습니다. -
Q# 다음 코드는
%%qsharp
구문을 Q# 에서 준수해야 합니다. 예를 들어, 주석을 나타낼 때는//
을 사용하고 코드 줄을 끝낼 때는#
를 사용하며,;
대신 사용하는 것을 권장합니다.
리소스 예측
실제 양자 하드웨어에서 실행하기 전에 기존 하드웨어에서 프로그램을 실행할 수 있는지 여부와 사용할 리소스 수를 파악해야 합니다.
Azure Quantum Resource Estimator를 사용하면 아키텍처 결정을 평가하고, 큐비트 기술을 비교하고, 지정된 양자 알고리즘을 실행하는 데 필요한 리소스를 결정할 수 있습니다. 미리 정의된 내결함성 프로토콜 중에서 선택하고 기본 물리적 큐비트 모델의 가정을 지정할 수 있습니다.
자세한 내용은 첫 번째 리소스 예상 실행을 참조하세요.
참고
Azure Quantum Resources Estimator는 무료이며 Azure 계정이 필요하지 않습니다.
시뮬레이션에서 프로그램 실행
양자 프로그램을 컴파일하고 실행할 때 QDK는 양자 시뮬레이터의 인스턴스를 만들고 코드를 전달합니다 Q# . 시뮬레이터는 Q# 코드를 사용하여 큐비트를 만들고(퀀텀 입자 시뮬레이션), 변환을 적용하여 해당 상태를 수정합니다. 그런 다음 시뮬레이터의 양자 연산 결과가 프로그램에 반환됩니다. Q# 시뮬레이터에서 코드를 격리하면 알고리즘이 양자 물리학의 법칙을 따르고 양자 컴퓨터에서 올바르게 실행되도록 합니다.
실제 양자 하드웨어에 프로그램 제출
시뮬레이션에서 프로그램을 테스트한 후에는 실제 양자 하드웨어에서 실행할 수 있습니다. Azure Quantum에서 양자 프로그램을 실행하는 경우 작업을 만들고 실행합니다. Azure Quantum 공급자에게 작업을 제출하려면 Azure 계정 및 양자 작업 영역이 필요합니다. 양자 작업 영역이 없는 경우 Azure Quantum 작업 영역 만들기를 참조 하세요.
Azure Quantum은 가장 강력하고 다양한 양자 하드웨어를 제공합니다. 지원되는 하드웨어 공급자의 현재 목록은 Quantum 컴퓨팅 공급자를 참조하세요.
작업을 제출하면 Azure Quantum은 작업 예약, 실행 및 모니터링을 포함하여 작업 수명 주기를 관리합니다. 작업의 상태를 추적하고 Azure Quantum 포털에서 결과를 볼 수 있습니다.