양자 컴퓨팅의 핵심 개념인 얽힘을 보여 주는 기본 Q# 프로그램을 작성하는 방법을 알아봅니다.
둘 이상의 큐비트가 얽히면 양자 정보를 공유합니다. 즉, 한 큐비트에 어떤 일이 일어나든 다른 큐비트에도 발생합니다. 이 빠른 시작에서는 벨 쌍이라는 특정 2큐비트 얽힌 상태를 만듭니다. Bell 쌍에서 하나의 큐비트를 $\ket{0}$ 상태로 측정하면, 측정하지 않아도 다른 큐비트가 $\ket{0}$ 상태에 있다는 것을 알 수 있습니다. 자세한 내용은 양자 얽힘을 참조하세요.
이 빠른 시작에서 당신은 다음을 수행합니다.
- Q# 파일을 만듭니다.
- 큐비트 쌍을 할당합니다.
- 큐비트를 얽습니다.
필수 조건
- 최신 버전의 Visual Studio Code
- Azure QDK(Quantum Development Kit) 확장. 설치 세부 정보는 Quantum 개발 키트 설정을 참조 하세요.
Q# 파일을 만듭니다
- Visual Studio Code를 엽니다.
- 새 텍스트 파일 파일을> 선택합니다.
- 파일을
Main.qs
로 저장합니다. .qs 확장은 Q# 프로그램을 나타냅니다.
Q# 코드 작성
Main.qs
파일에서 다음 단계에 따라 큐비트 쌍을 얽고 측정합니다.
양자 라이브러리 가져오기
QDK에는 양자 프로그램에 대한 미리 정의된 함수 및 연산이 포함된 표준 라이브러리가 포함되어 Q# 있습니다. 이를 사용하려면 먼저 관련 라이브러리를 가져와야 합니다.
프로그램에서 import
문을 사용하여 Microsoft.Quantum.Diagnostics
라이브러리를 엽니다. 이렇게 하면 나중에 얽힌 상태를 표시하는 데 사용하는 기능을 비롯한 DumpMachine()
모든 함수 및 작업에 액세스할 수 있습니다.
import Microsoft.Quantum.Diagnostics.*;
작업 정의
관련 라이브러리를 가져온 후 양자 작업과 해당 입력 및 출력 값을 정의합니다. 이 빠른 시작의 경우 작업은 다음과 같습니다 Main
. 여기서는 두 개의 큐비트를 할당, 조작 및 측정하기 위해 나머지 Q# 코드를 작성합니다.
Main
는 매개 변수를 사용하지 않고 큐비트 측정 결과를 나타내는 두 Result
값 중 하나 Zero
또는 One
두 값을 반환합니다.
operation Main() : (Result, Result) {
// Your entanglement code goes here.
}
두 개의 큐비트 할당
현재 Main
연산이 비어 있으므로, 다음 단계는 두 개의 큐비트인 q1
와 q2
를 할당하는 것입니다.
Q#에서 use
키워드를 사용하여 큐비트를 할당합니다.
// Allocate two qubits, q1 and q2, in the 0 state.
use (q1, q2) = (Qubit(), Qubit());
노트
에서 Q#의 큐비트는 항상 $\ket{0}$ 상태로 할당됩니다.
하나의 큐비트를 중첩에 넣습니다.
큐비트 q1
및 q2
은 $\ket{0}$ 상태에 있습니다. 얽힘 상태를 준비하려면 큐비트 중 하나를 각각 $\ket{0}$ 또는 $\ket{1}$로 측정될 확률이 50%인 균등한 중첩 상태로 설정해야 합니다.
Hadamard 연산을 적용하여 큐비트를 중첩 상태로 만듭니다.
// Put q1 into an even superposition.
H(q1);
결과 상태 q1
은/는 $\frac{{1}{\sqrt{2}}\ket{인 ({0}\ket{1}+$) 짝수 중첩 상태로, $\ket{0}$와 $\ket{{1}$의 짝수 중첩 상태입니다.
큐비트를 얽어라
이제 제어된 NOT, CNOT
작업을 사용하여 큐비트를 얽을 준비가 되었습니다.
CNOT
는 두 개의 큐비트를 사용하는 컨트롤 연산으로, 하나는 컨트롤 역할을 하고 다른 하나는 대상으로 사용합니다.
이 퀵스타트에서는 q1
을(를) 컨트롤 큐비트로, q2
을(를) 대상 큐비트로 설정합니다. 즉, CNOT
는 q1
의 상태가 $\ket{1}$일 때 q2
의 상태를 전환합니다.
// Entangle q1 and q2, making q2 depend on q1.
CNOT(q1, q2);
두 큐비트의 결과 상태는 벨 쌍 $\frac{{1}{\sqrt{2}}(\ket{00}+\ket{{11})$입니다.
팁
Hadamard 및 CNOT 연산이 큐비트의 상태를 변환하는 방법을 알아보려면 양자 연산을 사용하여 얽힘 만들기를 참조 하세요.
얽힌 상태 표시
큐비트를 측정하기 전에 이전 코드가 큐비트를 성공적으로 얽는지 확인하는 것이 중요합니다. 라이브러리 Microsoft.Quantum.Diagnostics
의 일부인 DumpMachine
작업을 사용하여 Q# 프로그램의 현재 상태를 출력할 수 있습니다.
// Show the entangled state of the qubits.
DumpMachine();
큐비트 측정
큐비트가 얽혀 있는지 확인했으므로 M
작업을 사용하여 측정할 수 있습니다.
q1
및 q2
을 측정하면, 양자 상태가 동일한 확률로 Zero
또는 One
로 축소됩니다.
Q#에서 let
키워드를 사용하여 새 변수를 선언합니다. 측정 결과를 q1
q2
저장하고 변수를 각각 선언하려면 다음을 수행합니다m1
m2
.
// Measure q1 and q2 and store the results in m1 and m2.
let (m1, m2) = (M(q1), M(q2));
큐비트 다시 설정
각 Q# 프로그램의 끝에 릴리스되기 전에 큐비트는 $\ket{0}$ 상태에 있어야 합니다.
Reset
작업을 사용하여 수행합니다.
// Reset q1 and q2 to the 0 state.
Reset(q1);
Reset(q2);
측정 결과 반환
마지막으로 Main
작업을 완료하고 얽힌 상태를 관찰하려면 m1
및 m2
의 측정 결과를 반환합니다.
// Return the measurement results.
return (m1, m2);
팁
함수 또는 작업에 대해 자세히 알아보려면 마우스로 Q# 가리킵니다.
Q# 코드 실행
축하합니다! 두 개의 큐비트를 묶고 벨 쌍을 만드는 프로그램을 작성 Q# 했습니다.
최종 Q# 프로그램은 다음과 같습니다.
import Microsoft.Quantum.Diagnostics.*;
operation Main() : (Result, Result) {
// Allocate two qubits, q1 and q2, in the 0 state.
use (q1, q2) = (Qubit(), Qubit());
// Put q1 into an even superposition.
// It now has a 50% chance of being measured as 0 or 1.
H(q1);
// Entangle q1 and q2, making q2 depend on q1.
CNOT(q1, q2);
// Show the entangled state of the qubits.
DumpMachine();
// Measure q1 and q2 and store the results in m1 and m2.
let (m1, m2) = (M(q1), M(q2));
// Reset q1 and q2 to the 0 state.
Reset(q1);
Reset(q2);
// Return the measurement results.
return (m1, m2);
}
프로그램을 실행하고 두 큐비트의 결과를 보려면 작업 위에서 실행을Main
하거나 Ctrl+F5를 누릅니다.
디버그 콘솔에서 각각 다른 결과를 가진 프로그램을 여러 번 실행할 수 있습니다. 이는 양자 측정의 확률적 특성과 큐비트의 얽힘을 보여줍니다.
예를 들어 결과가 Zero
라면, 디버그 콘솔은 다음과 같이 표시되어야 합니다.
DumpMachine:
Basis | Amplitude | Probability | Phase
-----------------------------------------------
|00⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000
|11⟩ | 0.7071+0.0000𝑖 | 50.0000% | 0.0000
Result: "(Zero, Zero)"
다음 단계
양자 얽힘Q#에 대해 더 알아보려면 자습서: Q#을 사용하여 양자 얽힘을 탐색하세요. 이 자습서에서는 이 빠른 시작에서 다루는 개념을 확장하고 고급 얽힘 프로그램을 작성하는 데 도움이 됩니다.