양자 컴퓨터를 프로그래밍하는 방법-2 부

양자 측정 전함

IBM 리서치 https://www.flickr.com/photos/ibm_research_zurich/33072160062/

이 기사의 제목에는 '파트 2'가 있습니다. Part 1은 양자 프로그램 작성 및 실행의 기초를 살펴 보았습니다.

나는 당신이 여기에 오기 전에 적어도 절반을 읽었다 고 가정 할 것입니다.

이 자습서에 필요한 실제 코딩 지식의 대부분은 지난 시간에 다루었습니다. 이 기사는 주로 이러한 명령으로 수행 할 수있는 작업에 중점을 둘 것입니다.

큐빗을 보는 방법

프로그램에는 변수가 있습니다. 어떤 시점에서 우리는 그것들을 살펴볼 필요가 있습니다.

결과가 나오면 프로그램이 끝날 수 있습니다. 조건 문의 일부로 변수를 사용할 때 프로그램 중에도 가능합니다. 어느 쪽이든, 그것은 많이 일어난다. 그리고 비 양자 변수를 프로그래밍 할 때는 상당히 주목할만한 과정입니다.

비 양자 변수는 명확한 값을 가지기 때문입니다. 그것들을 살펴보면 우리 또는 프로그램의 다른 부분에 그 가치가 무엇인지 알려줍니다. 변수 자체에 대해서는 아무것도 바뀌지 않습니다.

이것은 무한 값을 가질 수있는 양자 변수에는 해당되지 않습니다. 그것들은 소위 양자 중첩 (quantum superposition)에있을 수 있으며, 이로 인해 여러 모순 된 값을 한 번에 유지할 수 있습니다.

우리가 그들을 볼 때, 그들은이 모든 이상을 포기해야합니다. 그들은 명확한 가치를 취한 다음 그 가치가 무엇인지 말해 주어야합니다. 이것은 수동적 인 프로세스가 아니기 때문에 신중하게 고려해야합니다. 그리고 이름이 필요합니다. 우리는 그것을 측정이라고 부릅니다.

이 기사에서는 측정 속성 중 일부를 살펴볼 것입니다. 또한 게임 메카니즘의 기초로 사용하고, 양자 컴퓨터에서 그것을 어떻게 프로그래밍하는지 정확하게 볼 것입니다. 결국 우리는 새로운 버전의 전함을 갖게 될 것입니다.

큐 비트 세계 매핑

큐 비트 측정을 시작하기 전에 그들의 세계를 조금 더 이해하려고 노력해야합니다. 큐 비트를 시각화하는 가장 좋은 방법은 구를 사용하는 것입니다. 가능한 큐 비트 상태는이 구체의 표면에있는 점에 해당합니다.

상태 0과 1은 완전히 다르고 완전히 분리되어 있습니다. 그들은 서로 반대입니다. 그러므로 그들은 구체의 반대편에 살 것입니다. 우리는 보통 북극에 0을, 남쪽에 1을 넣습니다.

적도를 따라 어딘가에있는 두 지점 사이의 거리가 같은 점을 선택하겠습니다. 원하는 곳이면 어디든있을 수 있습니다. 우리는 +라고 부릅니다. 왜 +? 왜 안돼?

+ 상태는 0과 다르므로 반대도 있습니다. 이것은 반대편에 있으며 적도를 따라 점이됩니다. 이 상태를-라고 부릅니다.

점 0, 1, + 및-가 정의되었으므로 다른 점 몇 개가 우리의 관심을 끌고 있습니다. 이것들은 0과 1 사이의 등거리이고 +와-사이의 등거리입니다. 이것을 ↻ 및 ↺이라고합니다. 왜? Da Vinci Code를 작성하지 않은 사람을 한 번 보았 기 때문에 좋아했습니다.

우리는 이제 qubit의 세계를 6 점으로 매핑했습니다. 이것들이 우리가 사용할 유일한 것은 아닙니다. 그것들은 단순히 우리가 탐색 할 랜드 마크입니다.

큐 비트 측정

모든 측정은 단순히 구의 반대쪽 두 지점 중에서 선택하도록 큐 비트를 요청하는 것입니다.

전형적인 예는 우리가 가장 좋아하는 반대 상태 쌍인 0과 1입니다. 상태 0에 이미있는 경우 0이됩니다. 상태 1의 큐빗도 비슷하게 결과 1을 제공합니다. 다른 상태의 경우 가장 가까운 옵션이 가장 가능성이 높은 결과는 무작위입니다.

적도에서는 50/50의 기회입니다. 따라서 상태가 + 또는-이고 0 또는 1인지 묻는다면 동일한 확률로 하나를 선택해야합니다.

0과 1을 기준으로 한 측정에는 몇 가지 이름이 있습니다. 명백한 이유로 0/1 측정이라고 부를 수 있습니다. 0과 1 상태가 z라는 연산과 특별한 관계를 갖기 때문에 Z 기준 측정이라고도합니다. 그 이야기에 더 많은 시간이 있습니다.

다음으로 가장 인기있는 측정 유형은 + 및-에 대한 측정입니다. 이것을 +/- 측정이라고 부르지 만 X 기저 측정이라고도합니다. 이전과 같은 방식으로 작동하지만 0과 1 대신 +와-에 대해서만 작동합니다. 따라서 상태 +에서 큐 비트로 시작하여이 측정을 수행하면 결과 +가됩니다. 그러나 0으로 시작하고 같은 질문을하면 무작위로 선택됩니다.

또한 이상한 화살표에 대한 측정 값이 있습니다. 이것을 Y 기준 측정이라고합니다. 아무도 Y 기준 측정을 좋아하지 않습니다.

양자 일지라도 조금은 조금입니다

비 양자 물체의 측정은 수동 프로세스입니다. 객체가 무엇을하고 있는지 알려주지 만 어떤 식 으로든 변경하지는 않습니다. 양자를 측정하는 것은 매우 다릅니다. 양자 측정은 변수에 대한 지식을 바꾸지 않습니다. 변수 자체를 변경합니다.

상태 +에 큐빗이 있다고 가정하고 0 또는 1인지 물어보십시오. 임의의 결과를 줄 때, 그것은 단지 당신을 망쳐 놓는 것이 아닙니다. 잘못된 질문을했기 때문에 말도 안되는 말이 아닙니다. 결과가 나오면 그 결과가 계속 나타납니다. 답을 반영하기 위해 가치가 바뀔 것입니다. 그것이 0을 말하면, 그것은 영원히 0이 될 것입니다 (또는 적어도 다시 엉망이 될 때까지). 그것은 항상 + 였다는 것을 잊을 것입니다.

이는 큐빗이 결과를 단일 측정으로 만 확신 할 수 있음을 의미합니다. 그것이 0인지 1인지를 확실히 알고 있다면, 그것이 +인지 –인지 확실하지 않으며, 또한 ↻인지 ↺인지 완전히 확실하지 않습니다. 큐비 트는 헤 이젠 베르크의 불확실성 원칙에 의해 제한 될 정도의 확실한 확신을 가지고 있습니다.

이것은 우리가 큐빗으로부터 정보를 얻는 데 단 한 번의 샷만 얻는다는 것을 의미합니다. 단일 이진 결과를 추출하면 측정하기 전에 qubit가 알고 있던 모든 것을 잊어 버립니다. 그것은 우리에게 준 결과만을 기억합니다. 따라서 가능한 많은 수의 큐 비트 상태에도 불구하고 단일 비트 정보 만 추출 할 수 있습니다. 그래서 우리는 그것을 양자 플로트 또는 양자 3 벡터 등이 아닌 비트의 양자 버전으로 생각합니다.

게임 메카닉

폭탄과 어뢰라는 두 가지 유형의 공격이 가능한 전함 변형을 만들 것입니다. 배를 가라 앉히려면 한 번의 성공적인 공격 만 필요하지만 성공적인 공격을받는 것이 항상 쉬운 것은 아닙니다. 일부 선박은 폭탄이 가까이 다가 가지 않을 정도로 항공기에 대한 방어력이 뛰어납니다. 다른 사람들은 어뢰를 격퇴하는 데 능숙합니다.

일반 컴퓨터에서이를 구현하기 위해 각 선박에 대해 두 개의 부울 변수를 정의 할 수 있습니다. 하나는 우주선이 폭탄에 영향을받지 않는지, 다른 하나는 어뢰에 대한 것인지를 알려줍니다. 그런 다음 공격 중에 선박이 가라 앉는 지 여부를 확인할 수 있습니다.

이것이 우리가 사용하는 구현이라면, 배가 두 유형의 공격 모두에 면역이되는 것이 이론적으로 가능할 것입니다. 한 명의 플레이어가 이길 수 없기 때문에 게임 디자인이 좋지 않습니다. 좋은 구현은 파괴 할 수없는 배가없는 것을 막아야합니다.

이러한 선박을 피하는 한 가지 방법은 몇 가지 간단한 코드 줄을 사용하는 것입니다. 그러나 그것은 실제로 우리 스타일이 아닙니다. 대신 양자 역학으로 고칠 것입니다!

특히,이 두 부울을 하나의 큐 비트로 짜려고합니다. 그것들이 적합하지 않기 때문에, 우리는 흥미로운 양자 행동을 얻게 될 것입니다. 이것은 게임에 흥미로운 게임 플레이를 추가하고 배가 파괴되지 않도록 방지합니다.

폭탄 공격을 0/1 측정 값과 연관시켜이를 구현합니다. 결과 1을 얻으면 배가 가라 앉았다 고합니다. 0의 경우 선박은 폭탄 공격에 면역성이 있다고 추론합니다. 어뢰의 경우 우리는 +/- 측정을 수행합니다.

이 방법을 사용하면 선박이 두 가지 공격 유형 모두에 면역이되지 않습니다. 적의 함대가 폭탄에 영향을받지 않는다는 것을 알게되면 (즉, 상태가 0 임) 어뢰에 대한 불확실성 (+/- 측정 결과)을 알아야합니다. 폭탄 공격은 확실히 실패 할 것이기 때문에 다음 어뢰로 공격해야합니다.

그러면 어뢰 공격이 실패한 것으로 판명 될 수 있습니다 (+/- 측정 후 상태가 +가 됨). 배는 그들에게 확실히 면역 적이라고 판단 할 것이며, 어뢰 공격은 더 이상 실패 할 것입니다. 그러나 모든 희망은 없어지지 않습니다. 어뢰가 확실해지면서 폭탄에 대해 불확실 해졌습니다. 다음에 그들과 함께 공격하면 (0/1 측정) 승리로 이어질 수 있습니다.

폭탄 공격이 성공하지 못하면 어뢰 등으로 돌아갑니다. 가장 좋은 방법은 배가 마침내 가라 앉을 때까지 둘 사이를 계속 전환하는 것입니다.

우리는 두 공격에 대한 면역력에 대해 불확실한 것으로 시작합니다. 이는 Y 기준 상태 중 하나에서 큐 비트를 초기화하여 수행 할 수 있습니다. ↻로 갑시다. 이것은 실제로 우리가 Part 1에서 만난 상태, 즉 u3 (0.5 * pi, 0,0) 0이므로 우리는 이미 그것을 만드는 방법을 알고 있습니다.

수명이 짧은 큐 비트 다루기

양자 프로세서에서 게임을 구현하는 것은 우리가 바라는 것만 큼 쉽지 않을 것입니다. 우리는 방해가 될 모든 문제를 살펴보고 그 문제를 해결하는 방법을 알아볼 것입니다.

배가 폭탄의 공격을 받고 생존한다고 가정 해 봅시다. 다음 라운드에서 어뢰에 맞습니다.

게임이 일반 컴퓨터에서 실행되고 일반 비트를 사용하여 시뮬레이션 된 경우이를 구현하는 것은 매우 간단합니다. 배는 게임이 시작될 때 초기화 된 다음 플레이어가 무엇을할지 결정할 때까지 메모리에서 기다립니다. 플레이어가 폭탄을 보내면 폭탄이 파괴되었는지 확인하기 위해 해당 작업이 적용됩니다. 살아남 으면 다음 공격까지 다시 기다립니다.

이것은 우리에게 효과가 없습니다. 큐빗은 인간의 시간 척도를 기다리는 자리에 앉을 수 없습니다. 최소한 현재 기술을 사용하면 몇 초가 지나서 충돌하거나 화상을 입을 수있는 시간이 충분합니다.

대안은 공격이 이루어질 때마다 새로운 양자 프로세스를 실행하는 것입니다. 첫 번째 작업은 ↻ 상태로 초기화되므로 결과는 0/1 측정 (폭탄 공격) 또는 +/- 측정 (토 페도 공격)에 대해 무작위입니다. 그런 다음 측정 결과가 기록되고 일반 컴퓨터의 메모리에 저장됩니다. 다음 공격이 발생하면 다른 작업이 생성되어 어떤 일이 발생하는지 확인합니다. 마지막 측정 결과로 초기화되므로 계속됩니다.

+/- 측정하기

지금까지 한 줄의 코드가 아니라 많은 단어를 작성했습니다. QASM 코드에서 0/1 측정이 어떻게 구현되는지 상기시켜 봅시다.

측정 q [0]-> c [0];

여기서 c [0]의 역할은 다시 방문하는 데 중요합니다. 측정 프로세스의 출력입니다. 측정 결과가 저장되는 일반 비트입니다. 0/1 측정의 경우 결과는 0 또는 1입니다.

이것은 0/1 측정에서 매우 간단합니다. 그러나 지금 우리가보고있는 +/- 측정입니다. 우리는 그들 중 하나로부터 정보를 어떻게 얻습니까?

우리는 여전히 결과를 일반 비트 c [0]에 저장하려고합니다. 정상적인 비트이므로 이상한 상태 + 및-에 대한 지식이 없습니다. 정상적인 바이너리 만 알고 있습니다. 따라서 결과 +를 c [0] = 0으로,-를 c [0] = 1로보고하도록 선택합니다. 이것들이 0/1 측정 결과와 동일하게 보일 것이라는 사실은 문제가되지 않습니다. 모든 컴퓨터 프로그램에서와 마찬가지로 프로그래밍 한 내용을 알고 있어야하며 결과를 해석하는 방법을 알아야합니다.

이제 +/- 측정 결과를 얻는 방법을 알았습니다. 그러나 아직 실제로 어떻게해야하는지 아직 알지 못했습니다. 우리가 그것에 대해 몰래해야하기 때문입니다. 0/1 측정을 수행하는 프로세스를 해킹하고 대신 +/- 작업을 수행해야합니다.

우리 핵의 열쇠는하다 마드 (Hadamard)라고 불리는 작업입니다. 이것을 QASM 코드의 qubit q [0]에 적용하면 다음과 같습니다.

hq [0];

이 줄을 gridScript라는 QASM 파일에 추가하기 위해 Python에서 사용하는 명령은 다음과 같습니다.

gridScript.h (q [0])

하다 마드의 효과는 Z 기본 상태를 X 기본 상태로 또는 그 반대로 교체하는 것입니다. 구를 회전시켜 큐 비트 상태 0을 +로, +를 +로 0으로 이동하는 것은 구의 회전입니다. 마찬가지로, 1은-로 회전하고 그 반대도 마찬가지입니다.

이것은 우리가 Hadamard 이전에 0과 1의 용어로 qubit에 관해 이야기 할 수 있다는 이야기이며, 그 뒤에 +와-로 말해야합니다. 그리고 +와-의 이야기는 0과 1 중 하나가됩니다.

이것이 바로 우리에게 필요한 것입니다. 이는 다음 QASM 코드를 통해 qubit q [0]에서 a +/- 측정을 수행 할 수 있음을 의미합니다.

hq [0]; 측정 q [0]-> c [0]; hq [0];

이것이 왜 효과가 있는지 알아보기 위해 몇 가지 예를 살펴 보겠습니다. 큐 비트 q [0]은 각각 새로 선언 된 상태로 시작되므로 기본 초기 값은 0입니다.

제로 예 :

측정 q [0]-> c [0];

큐비 트는 상태 0에서 시작합니다. 큐 비트가 0인지 1인지 묻고 c [0]에게 답을 알려줍니다. 결과는 항상 c [0] = 0입니다.

예 1 :

xq [0];
측정 q [0]-> c [0];

큐비 트는 상태 0에서 시작하여 1로 회전됩니다. 그런 다음 큐 비트가 0인지 1인지 묻습니다. 항상 1로 응답합니다.

예 + :

hq [0];
측정 q [0]-> c [0];

큐비 트는 상태 0에서 시작하여 즉시 +로 회전합니다. 그런 다음 상태가 0인지 1인지 묻습니다. 무작위로 하나를 선택하면 상태가 답변으로 업데이트됩니다.

이제 몇 가지 사소한 예를 들었습니다. 좀 더 복잡한 것을하겠습니다.

예 ++ :

hq [0];
hq [0]; 측정 q [0]-> c [0]; hq [0];

큐비 트는 상태 0에서 시작한 다음 +로 회전합니다. 그 후에 이야기를 계속할 수있는 두 가지 방법이 있습니다.

하나는 세 개의 최종 선이 집합 적으로 +/- 측정을 수행한다는 것입니다. 그들은 큐 비트가 +인지-인지 묻습니다. +의 경우 결과 c [0] = 0을 반환하고-의 경우 c [0] = 1을 반환합니다. 이 예제에서 큐비 트는 상태 +를 사용하여 측정을 수행하므로 항상 +로 측정됩니다. 따라서 여전히이 상태의 측정에서 나옵니다.

다른 이야기에서는 선의 효과를 하나씩 살펴 봅니다. 두 번째 Hadamard는 첫 번째 효과를 취소하고 큐 비트를 다시 상태 0으로 회전시킵니다. 그런 다음 상태가 0인지 1인지 묻는 메시지가 표시되고 항상 0으로 응답합니다. 추가 Hadamard는 다시 +로 회전합니다.

두 이야기 모두 관찰 가능한 효과에 동의합니다. 그들은 출력 c [0]이 항상 0이라는 것에 동의하고, 마지막 큐 비트 상태는 +가된다는 것에 동의합니다. 그들은 어떻게 된 일에 동의하지 않습니다. 두 해석 모두 똑같이 유효합니다.

일부 전문 용어가 Wikipedia에서 물건을 찾게하려면 양자 역학의 Schrödinger 및 Heisenberg 그림의 예입니다.

예 +1 :

xq [0];
hq [0]; 측정 q [0]-> c [0]; hq [0];

여기에 두 개의 동등한 이야기가있는 또 다른 예가 있습니다. 우리는 q [0]이 0으로 시작해서 1로 회전한다고 말할 수 있습니다. 이것은 0/1 측정을하기 전에 t0으로 회전됩니다. 무작위로 하나를 결정하고 출력 c [0] = 0 또는 c [0] = 1을 제공하고 그에 따라 상태를 업데이트합니다. 0으로 결정되면 최종 Hadamard는이를 +로 회전시킵니다. 그렇지 않으면-로 끝납니다.

또는 1로 회전 한 후 큐비 트는 +/- 측정을 거칩니다. 이 두 옵션 중에서 무작위로 결정하여 +에 대해 c [0] = 0을,-에 대해 c [0] = 0을 제공합니다. 상태는 그에 따라 업데이트되어 상태 + 또는-로 끝납니다.

다시,이 두 이야기는 똑같이 유효하며 모든 관측 가능한 효과에 동의합니다. 우리가 세 줄을 생각하고 싶다면

hq [0]; 측정 q [0]-> c [0]; hq [0];

+/- 측정으로서 우리는 자유롭게 할 수 있습니다. 우리는 그것을 Hadamard, 0/1 측정, Hadamard로 생각하고 싶다면 괜찮습니다.

계속 진행하기 전에 유의해야 할 중요한 사항이 있습니다. IBM의 API는 현재 측정 후 큐 비트에 대한 작업을 허용하지 않습니다. 이것은 양자 컴퓨터의 일반적인 규칙이 아닙니다. 일반적으로 우리는 원하는만큼 큐 비트를 계속 측정하고 조작 할 수있을 것으로 기대합니다. 그러나 지금은 할 수 없습니다.

이것은 우리에게 아무런 문제가되지 않습니다. 플레이어가 선택을하는 동안 큐빗이 앉을 수 없기 때문에, 우리는 이미 각 측정 라운드 후에 상태를 완전히 재현해야합니다. 두 번째 Hadamard는 다음 작업에서 효과적으로 나타나서 재건 된 버전의 주에 행동합니다.

다른 모든 가능한 측정은 비슷한 핵으로 달성 할 수 있습니다. 대체 측정을 ​​준비하기 위해 미리 몇 가지 작업을 수행 한 다음 (API가 허용하는 경우) 직후에 반대 작업을 수행해야합니다.

오류 다루기

현재 양자 기술은 완벽하지 않습니다. 큐빗이 항상해야 할 일을하는 것은 아닙니다. 큐 비트가 0이고 0/1 측정을하면 결과는 항상 0이어야합니다. 항상. 그러나 현재 양자 장치의 경우 1이 될 가능성이 있습니다. 우리가 보지 않는 동안 x 연산이 방해를 받았기 때문일 수 있습니다. 측정이 우리에게 놓여 있기 때문일 수 있습니다. 이와 같은 이벤트는 드물지만 발생합니다.

오류를 처리 할 수있는 두 가지 방법이 있습니다. 하나는 그것들을 무시하는 것입니다. 우리는 그것들을 게임의 이야기에 쓸 수 있습니다. 바다에는 큰 폭풍이 있습니다. 면역력이 있어도 공격으로 배가 파괴되는 경우가 있습니다. 또는 그것을 파괴해야 할 공격을 생존.

오류를 처리하는 두 번째 방법은 효과를 제거하는 것입니다. 사용 가능한 큐 비트가 많으면 양자 오류 수정으로이를 수행 할 수 있습니다. 불행히도, 여전히 몇 년이 걸립니다.

대신 우리는 몇 가지 통계를 할 것입니다. 이를 위해 우리는 각 작업을 여러 번 실행하고 각 결과가 얼마나 자주 나타나는지 확인하여 확률이 필요합니다.

무소음의 경우 확률은 모두 0 %, 100 % 또는 50 %입니다. 결과는 불가능합니다 (상태가 0 인 경우 1을 얻는 것과 같음), 특정 (상태가 + 인 경우 +를 얻는 것과 같음) 또는 완전히 무작위입니다 (상태가 + 일 때 0을 얻는 것).

소음이 조금 엉망이 될 것입니다. 0/1의 0을 측정하면 결과 0은 시간의 98 % 만 발생하고 2 %는 1이됩니다. 이를 수정하기 위해 우리는 상당히 임의적 인 것을 할 것입니다. 5 % 미만의 확률로 어떤 일도 일어나지 않아야한다고 결정합니다. 확률이 95 % 이상인 것은 확실합니다.

함께 모아서

이 기사에서는이 버전의 전함에 대한 게임 메카닉의 광범위한 스트로크와 양자 컴퓨터로이를 구현하는 방법에 대해 설명했습니다. 여기서는 모든 세부 사항을 다루지 않고 실제 소스 코드에 주석을 남겨 두겠습니다.

더 자세한 설명이 필요하다고 생각되면 언제든지 알려주십시오.