자습서: 에서 Quantum Fourier 변환 구현 Q#

참고

Microsoft Quantum Development Kit (클래식 QDK)는 2024년 6월 30일 이후에 더 이상 지원되지 않습니다. 기존 QDK 개발자인 경우 새로운 Azure Quantum Development Kit (최신 QDK) 로 전환하여 양자 솔루션을 계속 개발하는 것이 좋습니다. 자세한 내용은 최신 QDK로 코드 마이그레이션을 참조하세요Q#.

이 자습서에서는 개별 큐비트에서 작동하는 기본 양자 프로그램을 작성하고 시뮬레이션하는 방법을 보여 줍니다.

Q#은 주로 대규모 양자 프로그램을 위한 상위 수준의 프로그래밍 언어로 만들어졌지만, 하위 수준의 양자 프로그램을 탐색하는 데도 사용할 수 있습니다(특정 큐비트를 직접 지정). 특히 이 자습서에서는 많은 대규모 양자 알고리즘에 필수적인 서브루틴인 QFT(Quantum Fourier Transform)를 자세히 살펴봅니다.

이 자습서에서 학습할 방법은 다음과 같습니다.

  • 에서 Q#양자 연산을 정의합니다.
  • Quantum 푸리에 변환 회로 작성
  • 큐비트 할당에서 측정 출력까지 양자 연산을 시뮬레이션합니다.
  • 작업 전체에서 양자 시스템의 시뮬레이션된 파동이 어떻게 진화하는지 관찰합니다.

참고

양자 정보 처리에 대한 이 하위 수준 정보 처리는 시스템의 특정 큐비트에 대한 게이트의 순차적 적용 또는 연산을 나타내는 양자 회로 측면에서 설명하는 경우가 많습니다. 따라서 순차적으로 적용되는 단일 및 다중 큐비트 연산을 회로 다이어그램으로 쉽게 나타낼 수 있습니다. 예를 들어 이 자습서에 사용된 전체 3큐비트 양자 푸리에 변환에는 회로로 표현되는 양자 푸리에 변환 회로 다이어그램이 있습니다.

양자 컴퓨팅 과정을 가속화하려면 Azure Quantum 웹 사이트의 고유한 기능인 Azure Quantum을 사용하여 코드를 검사. 여기서는 기본 제공 샘플 또는 사용자 고유 Q# 의 Q# 프로그램을 실행하고, 프롬프트에서 새 Q# 코드를 생성하고, 한 번의 클릭으로 웹용 VS Code에서 코드를 열고 실행하고, Copilot에게 양자 컴퓨팅에 대한 질문을 할 수 있습니다.

사전 요구 사항

새 Q# 파일 Create

  1. VS Code에서 파일 > 새 텍스트 파일을 선택합니다.
  2. 파일을 QFTcircuit.qs로 저장합니다. 이 파일에는 프로그램에 대한 코드가 Q# 포함됩니다.
  3. QFTcircuit.qs를 엽니다.

에서 QFT 회로 작성 Q#

이 자습서의 첫 번째 부분은 3개 큐비트에 대해 양자 푸리에 변환을 수행하는 Q# 연산 Perform3qubitQFT를 정의하는 과정으로 구성됩니다. DumpMachine 함수를 사용하여 3큐비트 시스템의 시뮬레이트된 파형 함수가 연산 전체에서 어떻게 진화하는지 관찰합니다. 자습서의 두 번째 부분에서는 측정 기능을 추가하고 큐비트의 측정 전 및 측정 후 상태를 비교합니다.

연산을 단계별로 빌드합니다. 다음 섹션의 코드를 복사하여 QFTcircuit.qs 파일에 붙여넣습니다.

이 섹션의 전체 Q# 코드를 참조로 볼 수 있습니다.

다른 Q# 연산에 액세스하기 위한 네임스페이스

Q# 파일 내에서 컴파일러에서 액세스하는 네임스페이스 NamespaceQFT를 정의합니다. 이 연산에서 기존 Q# 연산을 사용할 수 있도록 관련 Microsoft.Quantum.* 네임스페이스를 엽니다.

namespace NamespaceQFT {
    open Microsoft.Quantum.Intrinsic;
    open Microsoft.Quantum.Diagnostics;
    open Microsoft.Quantum.Math;
    open Microsoft.Quantum.Arrays;

    // operations go here
}

인수 및 반환을 사용하여 연산 정의

다음으로, Perform3qubitQFT 연산을 정의합니다.

operation Perform3qubitQFT() : Unit {
    // do stuff
}

현재는 연산에 인수가 없고 Unit 개체를 반환합니다. C#의 void를 반환하거나 또는 Python의 빈 튜플(Tuple[()]) 반환과 유사합니다. 나중에 측정 결과의 배열을 반환하도록 이 연산을 수정하게 됩니다.

큐비트 할당

작업 내에서 Q# 키워드(keyword) 사용하여 3개의 큐비트 레지스터를 use 할당합니다. use를 사용하면 $\ket{0}$ 상태에서 큐비트가 자동으로 할당됩니다.

use qs = Qubit[3]; // allocate three qubits

Message("Initial state |000>:");
DumpMachine();

Q#은 실제 양자 계산과 마찬가지로 큐비트 상태에 직접 액세스하도록 허용하지 않습니다. 그러나 DumpMachine 작업은 컴퓨터의 현재 상태를 인쇄 target 하므로 전체 상태 시뮬레이터와 함께 사용할 때 디버깅 및 학습에 대한 중요한 인사이트를 제공할 수 있습니다.

단일 큐비트 및 제어된 작업 적용

다음으로 작업 자체를 구성하는 Perform3qubitQFT 작업을 적용합니다. Q#에서는 이미 이 연산과 다른 기본 양자 연산이 Microsoft.Quantum.Intrinsic 네임스페이스에 포함되어 있습니다.

적용된 첫 번째 연산은 첫 번째 큐비트에 대한 H(Hadamard) 연산입니다.

첫 번째 Hadamard를 통해 3개의 큐비트 QFT에 대한 회로를 보여 주는 다이어그램

레지스터의 특정 큐비트(예: Qubit[] 배열의 단일 Qubit)에 연산을 적용할 때는 표준 인덱스 표기법을 사용합니다. 따라서 H 연산을 qs 레지스터의 첫 번째 큐비트에 적용할 때는 다음과 같은 형식을 사용합니다.

H(qs[0]);

H 연산을 개별 큐비트에 적용하는 것 외에도 QFT 회로는 주로 제어되는 R1 회전으로 구성됩니다. R1(θ, <qubit>) 일반적으로 작업은 $\ket{0}$ 구성 요소에 $e^{i\theta}$의 회전을 적용하는 동안 큐비트의 $\ket{1}$ 구성 요소를 변경하지 않습니다.

Q#을 사용하면 1개 또는 여러 개의 컨트롤 큐비트에 대한 연산 실행 조건을 쉽게 지정할 수 있습니다. 일반적으로 호출 앞에 Controlled가 오며 연산 인수는 다음과 같이 변경됩니다.

Op(<normal args>) $\to$ Controlled Op([<control qubits>], (<normal args>))

컨트롤 큐비트는 단일 큐비트일 경우에도 배열로 제공되어야 합니다.

QFT R1 에서 제어되는 작업은 첫 번째 큐비트에서 작동하고 두 번째 및 세 번째 큐비트에 의해 제어되는 작업입니다.

첫 번째 큐비트를 통한 3개의 큐비트 Quantum Fourier 변환에 대한 회로를 보여 주는 다이어그램

Q# 파일에서 다음 문을 사용하여 이러한 연산을 호출합니다.

Controlled R1([qs[1]], (PI()/2.0, qs[0]));
Controlled R1([qs[2]], (PI()/4.0, qs[0]));

PI() 함수를 사용하여 pi 라디안을 기준으로 회전을 정의합니다.

SWAP 작업 적용

관련 H 연산 및 제어된 회전을 두 번째 및 세 번째 큐비트에 적용한 후 회로는 다음과 같습니다.

//second qubit:
H(qs[1]);
Controlled R1([qs[2]], (PI()/2.0, qs[1]));

//third qubit:
H(qs[2]);

마지막으로 첫 번째 및 세 번째 큐비트에 연산을 적용 SWAP 하여 회로를 완료합니다. 양자 푸리에 변환의 특성상 큐비트가 역순으로 출력되므로 교환을 통해 서브루틴을 더 큰 알고리즘에 원활하게 통합하려면 이 게이트가 필요합니다.

SWAP(qs[2], qs[0]);

이제 양자 푸리에 변환의 큐비트 수준 연산을 Q# 연산에 작성하는 작업이 완료되었습니다.

세 개의 큐비트 Quantum 푸리에 변환에 대한 회로를 보여 주는 다이어그램

큐비트 할당 취소

마지막 단계는 연산 후 상태를 확인하고 큐비트의 할당을 취소하기 위해 다시 DumpMachine()을 호출하는 것입니다. 큐비트는 할당했을 때 $\ket{0}$ 상태였으며 ResetAll 연산을 사용하여 초기 상태로 다시 설정해야 합니다.

모든 큐비트를 $\ket$로 명시적으로 다시 설정하도록 요구하는 것은 다른 작업이 동일한 큐비트{0}(부족한 리소스)를 사용하기 시작할 때 상태를 정확하게 알 수 있도록 하기 때문에 의 Q#기본 기능입니다. 또한 이는 시스템의 다른 모든 큐비트와 관계를 맺지 않도록 합니다. 할당 블록의 끝에서 초기화를 수행하지 않으면 use 런타임 오류가 발생할 수 있습니다.

Q# 파일에 다음 줄을 추가합니다.

Message("After:");
DumpMachine();

ResetAll(qs); // deallocate qubits

전체 QFT 작업

Q# 프로그램이 완료되었습니다. 이제 QFTcircuit.qs 파일이 다음과 같이 표시됩니다.

namespace NamespaceQFT {
    open Microsoft.Quantum.Intrinsic;
    open Microsoft.Quantum.Diagnostics;
    open Microsoft.Quantum.Math;
    open Microsoft.Quantum.Arrays;

    operation Perform3qubitQFT() : Unit {

        use qs = Qubit[3]; // allocate three qubits

        Message("Initial state |000>:");
        DumpMachine();

        //QFT:
        //first qubit:
        H(qs[0]);
        Controlled R1([qs[1]], (PI()/2.0, qs[0]));
        Controlled R1([qs[2]], (PI()/4.0, qs[0]));

        //second qubit:
        H(qs[1]);
        Controlled R1([qs[2]], (PI()/2.0, qs[1]));

        //third qubit:
        H(qs[2]);

        SWAP(qs[2], qs[0]);

        Message("After:");
        DumpMachine();

        ResetAll(qs); // deallocate qubits

    }
}

QFT 회로 실행

지금은 Perform3qubitQFT 작업이 값을 반환하지 않습니다. 작업은 값을 반환합니다 Unit . 나중에 측정 결과 배열(Result[])을 반환하도록 작업을 수정합니다.

  1. 프로그램을 실행할 Q# 때 파일에 를 EntryPointQ# 추가해야 합니다. 이 특성은 이 작업이 프로그램의 진입점임을 컴파일러에 알릴 수 있습니다. 작업 전에 Perform3qubitQFT 파일 맨 위에 다음 줄을 추가합니다Q#.

    @EntryPoint()
    operation Perform3qubitQFT() : Unit {
    
  2. 프로그램을 실행하기 전에 프로필을 제한 없음으로 설정 target 해야 합니다. 보기 -> 명령 팔레트를 선택하고, QIR을 검색하고, : Azure Quantum QIR 프로필 설정을 선택한 다음, : 무제한을 선택합니다Q#.targetQ#

  3. 프로그램을 실행하려면 오른쪽 위에 있는 재생 아이콘 드롭다운에서 파일 실행을 Q# 선택하거나 Ctrl+F5를 누릅니다. 프로그램은 기본 시뮬레이터에서 특성으로 @EntryPoint() 표시된 작업 또는 함수를 실행합니다.

  4. MessageDumpMachine 출력은 디버그 콘솔에 표시됩니다.

참고

프로필이 target무제한으로 설정되지 않은 경우 프로그램을 실행할 때 오류가 발생합니다.

QFT 회로의 출력 이해

전체 상태 시뮬레이터에서 호출될 때 DumpMachine()은 양자 상태의 파동 함수에 대한 이러한 다중 표현을 제공합니다. $n$-qubit 시스템의 가능한 상태는 각각 해당하는 복소 계수(진폭 및 위상)와 함께 $2^n$ 계산 기저 상태로 표시될 수 있습니다. 계산 기저 상태는 $n$ 길이의 가능한 모든 이진 문자열, 즉 큐비트 상태 $\ket{0}$ 및 $\ket{1}$의 가능한 모든 조합에 해당합니다. 여기서 각 이진 숫자는 개별 큐비트에 해당합니다.

첫 번째 행은 중요한 순서대로 나열된 해당 큐비트의 ID에 대한 주석을 제공합니다. 큐비트 2가 "가장 중요"할 경우 기저 상태 벡터 $\ket{i}$의 이진 표현에서 큐비트 2의 상태가 맨 왼쪽 숫자에 해당한다는 의미입니다. 예를 들어 $\ket{6} = \ket{110}$은 $\ket{1}$의 큐비트 21과 $\ket{0}$의 큐비트 0으로 구성됩니다.

나머지 행은 카티전 및 극좌표 형식의 기저 상태 벡터 $\ket{i}$를 측정하는 확률 진폭을 설명합니다. 입력 상태 $\ket{000}$의 첫 번째 행을 살펴보면

  • |0>: 이 행은 0 계산 기저 상태에 해당합니다(할당 후 초기 상태가 $\ket{000}$이었다면 이 시점에 확률 진폭을 가진 유일한 상태로 예상됨).
  • 1.000000 + 0.000000 i: 카티전 형식의 확률 진폭입니다.
  • == : equal 부호는 두 동등한 표현을 구분합니다.
  • ********************: 크기의 그래픽 표현입니다. *의 개수는 이 상태 벡터를 측정할 확률에 비례합니다.
  • [ 1.000000 ]: 크기의 숫자 값입니다.
  • --- : 진폭의 위상을 그래픽으로 표현한 것입니다.
  • [ 0.0000 rad ]: 위상의 숫자 값입니다(라디안 단위).

크기와 위상이 모두 그래픽 표현으로 표시됩니다. 크기 표현은 직관적입니다. 즉, * 막대를 표시하며, 확률이 높을수록 막대가 커집니다.

표시된 출력은 프로그래밍된 작업이 상태

$$ \ket{\psi}_{initial} = \ket{000} $$

$$ \begin{align} \ket{\psi}_{final} &= \frac{1}{\sqrt{8}} \left( \ket{000} + \ket + \ket{001}{010} + \ket + \ket{011} + \ket{101}{100} + \ket{110} + \ket{111} \right) \\ &= \frac{1}{\sqrt{2^n}}\sum_{j=0}^{2^n-1} \ket{j}, \end{align} $$

이는 정확히 3큐비트 푸리에 변환의 동작입니다.

다른 입력 상태가 어떤 영향을 받는지 궁금하다면 변형 전에 큐비트 연산을 적용하여 실험해 보는 것이 좋습니다.

QFT 회로에 측정값 추가

DumpMachine 함수는 연산의 결과를 표시하지만 불행히도 양자 역학의 기초에 따르면 실제 양자 시스템에는 그러한 DumpMachine 함수가 있을 수 없습니다. 대신 측정값에서 정보가 추출됩니다. 이는 일반적으로 전체 양자 상태를 제공하지 못할 뿐만 아니라 시스템 자체를 획기적으로 바꿀 수도 있습니다.

다양한 종류의 양자 측정값이 있지만 이 예제에서는 단일 큐비트의 가장 기본적인 투사 측정값을 중점적으로 살펴보겠습니다. 특정 기저(예: 계산 기저 $ { \ket{0}, \ket{1} } $)에서 측정할 때는 기저 상태가 측정된 쪽에 큐비트 상태가 투사되므로 둘 사이의 중첩이 소멸됩니다.

QFT 작업 수정

Q# 프로그램 내에서 측정값을 구현하려면 Result 형식을 반환하는 M 연산을 사용합니다.

먼저 Unit 대신 측정 결과의 배열(Result[])을 반환하도록 Perform3QubitQFT 연산을 수정합니다.

operation Perform3QubitQFT() : Result[] {

Result[] 배열 정의 및 초기화

큐비트를 할당하기 전에 3개 요소 배열(각 큐비트에 하나씩) Result 을 선언하고 바인딩합니다.

mutable resultArray = [Zero, size = 3];

resultArray 앞에 mutable 키워드를 사용하면 나중에 변수를 코드에서 수정할 수 있습니다(예: 측정 결과를 추가할 때).

for 루프에서 측정을 수행하고 배열에 결과 추가

QFT 변환 작업 후에 다음 코드를 삽입합니다.

for i in IndexRange(qs) {
    set resultArray w/= i <- M(qs[i]);
}

배열(예: 큐비트 배열 qs)에서 호출된 IndexRange 함수는 배열의 인덱스에 대한 범위를 반환합니다. 여기서는 for 루프에 이를 사용하여 M(qs[i]) 문으로 각 큐비트를 순차적으로 측정합니다. 그러면 측정된 각 Result 형식(Zero 또는 One)이 update-and-reassign 문을 통해 resultArray의 해당 인덱스 위치에 추가됩니다.

참고

이 명령문의 구문은 Q#에 고유하지만 F# 및 R 같은 다른 언어에서 볼 수 있는 것과 유사한 변수 재할당 resultArray[i] <- M(qs[i])에 해당합니다.

mutable을 사용하여 바인딩된 변수를 다시 할당할 때는 항상 set 키워드가 사용됩니다.

resultArray 반환

3개 큐비트가 모두 측정되고 결과가 resultArray에 추가되면 이전처럼 큐비트를 초기화하고 할당을 취소해도 됩니다. 측정값을 반환하려면 다음을 삽입합니다.

return resultArray;

측정값을 사용하여 QFT 회로 실행

이제 측정 전후의 상태를 출력하도록 DumpMachine 함수의 배치를 변경해 보겠습니다. 최종 Q# 코드는 다음과 유사할 것입니다.

namespace NamespaceQFT {
    open Microsoft.Quantum.Intrinsic;
    open Microsoft.Quantum.Diagnostics;
    open Microsoft.Quantum.Math;
    open Microsoft.Quantum.Arrays;

    operation Perform3QubitQFT() : Result[] {

        mutable resultArray = [Zero, size = 3];

        use qs = Qubit[3];

        //QFT:
        //first qubit:
        H(qs[0]);
        Controlled R1([qs[1]], (PI()/2.0, qs[0]));
        Controlled R1([qs[2]], (PI()/4.0, qs[0]));

        //second qubit:
        H(qs[1]);
        Controlled R1([qs[2]], (PI()/2.0, qs[1]));

        //third qubit:
        H(qs[2]);

        SWAP(qs[2], qs[0]);

        Message("Before measurement: ");
        DumpMachine();

        for i in IndexRange(qs) {
            set resultArray w/= i <- M(qs[i]);
        }

        Message("After measurement: ");
        DumpMachine();

        ResetAll(qs);
        Message("Post-QFT measurement results [qubit0, qubit1, qubit2]: ");
        return resultArray;

    }
}

코드를 다시 실행하기 전에 변경 내용을 적용할 때마다 파일을 저장해야 합니다.

  1. 작업 전에 을 EntryPoint 추가합니다.Perform3qubitQFT

    @EntryPoint()
    operation Perform3qubitQFT() : Unit {
    
  2. target 프로필을 무제한으로 설정합니다. VS Code 창 아래쪽의 QIR: 기본 단추를 클릭하고 드롭다운 메뉴에서 무제한 을 선택합니다. 프로필이 target무제한으로 설정되지 않은 경우 프로그램을 실행할 때 오류가 발생합니다.

  3. 프로그램을 실행하려면 오른쪽 위에 있는 재생 아이콘 드롭다운에서 파일 실행을 Q# 선택하거나 Ctrl+5를 누릅니다. 프로그램은 기본 시뮬레이터에서 특성으로 @EntryPoint() 표시된 작업 또는 함수를 실행합니다.

  4. DumpMachine 출력은 Message 디버그 콘솔에 표시됩니다.

출력은 출력과 유사해야 합니다.

Before measurement: 
# wave function for qubits with ids (least to most significant): 0;1;2
|0>:     0.353553 +  0.000000 i  ==     ***                  [ 0.125000 ]     --- [  0.00000 rad ]
|1>:     0.353553 +  0.000000 i  ==     ***                  [ 0.125000 ]     --- [  0.00000 rad ]
|2>:     0.353553 +  0.000000 i  ==     ***                  [ 0.125000 ]     --- [  0.00000 rad ]
|3>:     0.353553 +  0.000000 i  ==     ***                  [ 0.125000 ]     --- [  0.00000 rad ]
|4>:     0.353553 +  0.000000 i  ==     ***                  [ 0.125000 ]     --- [  0.00000 rad ]
|5>:     0.353553 +  0.000000 i  ==     ***                  [ 0.125000 ]     --- [  0.00000 rad ]
|6>:     0.353553 +  0.000000 i  ==     ***                  [ 0.125000 ]     --- [  0.00000 rad ]
|7>:     0.353553 +  0.000000 i  ==     ***                  [ 0.125000 ]     --- [  0.00000 rad ]
After measurement:
# wave function for qubits with ids (least to most significant): 0;1;2
|0>:     0.000000 +  0.000000 i  ==                          [ 0.000000 ]
|1>:     0.000000 +  0.000000 i  ==                          [ 0.000000 ]
|2>:     0.000000 +  0.000000 i  ==                          [ 0.000000 ]
|3>:     1.000000 +  0.000000 i  ==     ******************** [ 1.000000 ]     --- [  0.00000 rad ]
|4>:     0.000000 +  0.000000 i  ==                          [ 0.000000 ]
|5>:     0.000000 +  0.000000 i  ==                          [ 0.000000 ]
|6>:     0.000000 +  0.000000 i  ==                          [ 0.000000 ]
|7>:     0.000000 +  0.000000 i  ==                          [ 0.000000 ]

Post-QFT measurement results [qubit0, qubit1, qubit2]: 
[One,One,Zero]

이 출력은 몇 가지 다른 항목을 보여 줍니다.

  1. 반환된 결과를 사전 측정값 DumpMachine과 비교하면 기저 상태에 대한 QFT 이후 접합을 명확하게 설명하지 않습니다. 측정값은 시스템의 파형 함수에서 해당 상태의 진폭에 의해 결정되는 확률을 사용하여 단일 기저 상태만 반환합니다.
  2. 사후 측정값 DumpMachine에서는 측정값이 상태 자체를 변경하여 기저 상태에 대한 초기 중첩에서 측정된 값에 해당하는 단일 기저 상태로 투사하는 것을 볼 수 있습니다.

이 연산을 여러 번 반복하는 경우, 결과 통계가 동일한 가중치가 적용된 사후 QFT 상태 중첩을 보여 주기 시작하고, 각 샷의 무작위 결과를 생성한다는 것을 알 수 있습니다. 그러나 이는 비효율적이고 여전히 불완전함에도 불구하고, 기저 상태 간의 상대적 위상이 아닌 상대적 진폭만 재현합니다. 후자는 이 예제에서 문제가 되지 않지만 $\ket{000}$보다 더 복잡한 입력이 QFT에 지정될 경우에는 상대적 위상이 나타나는 것을 볼 수 있습니다.

Q# 작업을 사용하여 QFT 회로 간소화

소개 부분에서 언급했듯이, Q#의 가장 큰 강점은 개별 큐비트 처리에 대해 걱정하지 않아도 된다는 사실입니다. 실제로, 적용 가능한 본격적인 양자 프로그램을 개발하려는 경우 H 연산을 특정 회전의 앞에 넣을지, 아니면 뒤에 넣을지 고민하면 진행속도가 느려지기만 할 뿐입니다.

네임스페이 ApplyQFT 스에 Microsoft.Quantum.Canon 는 Q# 여러 큐비트에 사용하고 적용할 수 있는 작업이 포함되어 있습니다.

  1. 작업에 액세스 ApplyQFT 하려면 파일의 Q# 시작 부분에 네임스페이스에 대한 Microsoft.Quantum.Canon 문을 추가 open 합니다.

    open Microsoft.Quantum.Canon;
    
  2. 첫 번째 H 에서 로 대체된 SWAP 로 모든 항목을 바꿉 있습니다.

    ApplyQFT(qs);
    
  3. Q# 프로그램을 다시 실행하고 출력이 이전과 동일한지 확인합니다.

  4. 연산을 사용할 Q# 때의 실제 이점을 확인하려면 큐비트 수를 가 아닌 3다른 항목으로 변경합니다.

mutable resultArray = [Zero, size = 4];

use qs = Qubit[4];
//...

따라서 각 큐비트에서 혼란스러운 새 H 연산 및 회전에 대해 걱정할 필요 없이 지정된 수의 큐비트에 적절한 QFT를 적용할 수 있습니다.

다음 단계

다른 Q# 자습서 살펴보기:

  • 양자 난수 생성기는 중첩의 큐비트에서 난수를 생성하는 프로그램을 작성하는 Q# 방법을 보여 줍니다.
  • Grover의 검색 알고리즘 은 Grover의 검색 알고리즘을 Q# 사용하는 프로그램을 작성하는 방법을 보여줍니다.
  • 양자 얽힘 은 큐비트를 조작하고 측정하고 중첩 및 얽힘의 효과를 보여 주는 프로그램을 작성하는 Q# 방법을 보여 줍니다.
  • Quantum Katas는 양자 컴퓨팅 및 프로그래밍 요소를 동시에 교육하기 위한 자기 주도적인 자습서 및 Q# 프로그래밍 연습입니다.