연습 - 양자 임의 비트 생성기 만들기

완료됨

이제 몇 가지 기본 사항을 이해했으므로 양자 난수 생성기를 빌드합니다.

양자 컴퓨터를 사용하여 중요한 문제를 해결하기 전에 먼저 해야 할 작업은 임의의 암호를 만들어 현재 보안 프로토콜을 개선하는 것입니다.

난수 생성기(RNG)의 개념은 이미 잘 알고 있을 것입니다. 일반 컴퓨터에서는 난수가 아니라 의사 난수를 생성합니다. 의사 난수 생성기는 시드 라고 하는 일부 초기값을 기준으로 결정적 숫자 시퀀스를 생성합니다. 임의 값을 보다 정확하게 근사하기 위해 이 시드는 CPU 클록의 현재 시간인 경우가 많습니다.

은하계 해커가 암호를 생성하는 데 사용되는 난수 시퀀스를 찾아 우주선의 보안을 위협하지 못하도록 진 난수를 사용하는 것이 좋습니다. 이렇게 하려면 양자 난수 생성기(QRNG)를 만들어야 합니다. 양자 난수 생성기를 사용하면 암호는 진 난수가 되어 더욱 안전합니다.

QRNG는 양자 동작을 예시하고 몇 줄의 코드만 필요하므로 양자 컴퓨팅을 소개하는 데 매우 적합합니다.

먼저 기저 상태(예: 0)의 큐비트로 시작합니다. QRNG의 첫 번째 단계는 H 연산을 사용하여 큐비트를 동일 중첩으로 설정하는 것입니다. 이 상태를 측정하면 0 또는 1이 반환되며, 각 결과의 확률은 50%입니다. 이 비트의 값은 진 난수이며 측정 후에 무엇을 얻을 지 알 수 있는 방법이 없습니다. 그러나 이 동작을 사용하여 더 큰 숫자를 생성해 유효한 암호로 사용하려면 어떻게 해야 할까요?

프로세스를 4번 반복하여 다음과 같은 이진수 시퀀스를 생성한다고 가정하겠습니다.

$${0, 1, 1, 0}$$

이러한 비트를 비트 문자열로 연결하거나 결합하면 더 큰 숫자를 형성할 수 있습니다. 이 예제에서 비트 시퀀스 ${0110}$는 10진수 6과 같습니다.

$${0110_{\ binary} \equiv 6_{\ decimal}}$$

이 프로세스를 여러 번 반복하면 여러 비트를 결합하여 큰 숫자를 구성할 수 있습니다. 이제 우주 해커가 측정 시퀀스의 결과를 알 수 없다는 것이 확실하므로 해당 숫자를 보안 암호로 제공할 수 있습니다.

양자 난수 생성기는 두 단계로 빌드합니다. 이 장에서는 단일 임의 비트를 생성하는 첫 번째 단계를 빌드합니다.

이렇게 하려면 다음을 수행합니다.

  • Q# 프로젝트를 만듭니다.
  • H 작업을 사용하여 큐빗을 중첩으로 설정한 다음 해당 값을 측정하는 코드를 추가합니다.
  • 프로그램을 실행합니다.

다음 섹션에서는 임의 비트를 결합하여 더 큰 값을 형성하는 두 번째 단계를 빌드합니다.

참고

시뮬레이터를 사용하여 Q# 프로그램을 실행하기 때문에 여전히 의사 난수를 얻게 된다는 점에 유의하세요. 그러나 시뮬레이터를 통해 프로그램을 확인한 후에는 양자 컴퓨터에서 동일한 프로그램을 실행하여 기본적인 물리 프로세스를 측정하는 진정한 임의 결과를 얻을 수 있습니다.

Q# 프로젝트 만들기

여기에서 이전에 했던 것처럼 Q# 프로젝트를 만듭니다.

  1. 보기 메뉴에서 명령 팔레트 를 선택합니다.

  2. Q#: Create New Project 를 입력합니다.

  3. 독립 실행형 콘솔 애플리케이션 을 선택합니다.

  4. 프로젝트를 저장할 디렉터리를 선택합니다(예: 사용자의 홈 디렉터리). 프로젝트 이름으로 QuantumRNG 를 입력하고 프로젝트 만들기 를 선택합니다.

  5. 아래쪽에 표시되는 창에서 새 프로젝트 열기 를 선택합니다.

    이전처럼 프로젝트 파일과 시작 코드를 포함하는 Program.qs 라는 두 개의 파일이 표시됩니다.

GenerateRandomBit 작업 정의

QuantumHello 프로그램에서 다음과 같이 HelloQ 작업을 정의한 것을 기억할 것입니다.

operation HelloQ() : Unit {
    Message("Hello quantum world!");
}

이를 아래 작업과 비교합니다. GenerateRandomBit 작업을 정의합니다. 이 작업은 입력을 받지 않으며 Result 형식의 값을 생성합니다. Result 형식은 측정 결과를 나타내며 두 개의 가능한 값 ZeroOne 중 하나를 가질 수 있습니다. 큐비트를 측정하려면 M 작업을 사용합니다.

전체 작업을 정의하려면:

  1. Program.qs 의 내용을 다음 코드로 바꿉니다.

    namespace QuantumRNG {
    
        open Microsoft.Quantum.Canon;
        open Microsoft.Quantum.Intrinsic;
        open Microsoft.Quantum.Measurement;
    
        @EntryPoint()
        operation GenerateRandomBit() : Result {
        }
    }
    

    EntryPoint는 여기에서 프로그램 실행을 시작하도록 Q# 컴파일러에 지시합니다.

  2. GenerateRandomBit 작업에 다음 코드를 추가합니다.

    namespace QuantumRNG {
    
        open Microsoft.Quantum.Canon;
        open Microsoft.Quantum.Intrinsic;
        open Microsoft.Quantum.Measurement;
    
        @EntryPoint()
        operation GenerateRandomBit() : Result {
            // Allocate a qubit.
            use q = Qubit();
            // Put the qubit to superposition.
            H(q);
            // It now has a 50% chance of being measured 0 or 1.
            // Measure the qubit value.
            return M(q);
        }
    }
    

    기억하듯이 use 키워드를 통해 큐빗을 할당합니다.

    H 작업은 큐빗을 중첩으로 설정합니다. M 작업은 큐비트를 측정하고 측정된 값(0 또는 1)을 반환합니다.

프로그램 실행

이제 임의 비트 생성기를 사용해 보겠습니다. 그러려면 다음을 수행합니다.

  1. Visual Studio Code에서 터미널로 이동합니다. 터미널을 닫은 경우 보기 메뉴에서 터미널 또는 통합 터미널 을 선택합니다.

  2. dotnet run을 실행합니다.

    dotnet run
    

    출력에 "Zero" 또는 "One"이 표시됩니다. 예를 들면 다음과 같습니다.

    Zero
    
  3. 프로그램을 다시 실행합니다. 이번에는 --no-build 플래그를 사용하여 빌드 단계를 건너뛸 수 있습니다.

    dotnet run --no-build
    

    역시 출력에 "Zero" 또는 "One"이 표시됩니다.

    One
    

다음에는 여러 개의 임의 비트를 결합하여 더 큰 숫자를 생성하는 양자 난수 생성기의 두 번째 단계를 구현합니다.

다음 부분을 위해 Visual Studio Code에서 프로젝트를 열어 둡니다.