의견.png

양자얽힘

위키원
7095sj (토론 | 기여)님의 2020년 8월 14일 (금) 16:30 판
이동: 둘러보기, 검색

양자얽힘(quantum entanglement)이란 하나의 입자를 둘로 쪼개서 아주 먼 거리에 위치시키더라도 한 쪽의 스핀(spin) 방향이 정해지면 동시에 다른 쪽의 스핀 방향이 반대로 정해지는 현상을 말한다. 예를 들어 양자 하나를 지구에 두고, 그와 얽혀 있는 다른 양자 하나를 100만 광년 떨어진 먼 우주에 두더라도, 지구의 양자가 스핀업이 되면 먼 우주의 양자는 동시에 스핀다운이 되는 현상이다. 만약 을 이용해 정보를 주고받을 경우 100만년이나 걸리지만, 양자얽힘 현상을 이용하면 정보를 실시간으로 주고받을 수 있다. 양자얽힘 현상을 이용하여 빛보다 빠른 양자통신을 구현할 수 있다.

개요

양자역학에서 양자얽힘은 두 부분계 사이에서 존재할 수 잇는 일련의 비고전적인 상관관계를 의미한다. 얽힘은 두 부분계가 공간적으로 서로 멀리 떨어져 있어도 존재할 수 있다. 예를 들어, 두 입자를 일정한 양자 상태로 둬서 두 입자의 스핀이 항상 반대가 된다고 가정한다. 양자역학에 의하면 측정하기 전까지는 두 입자의 상태를 알 수 없다. 하지만 측정을 통해 그 순간 한 계의 상태가 결정되고 이는 즉시 그 계와 얽혀 있는 다른 계의 상태까지 결정한다. 마치 정보가 한 계에서 다른 계로 순식간에 이동한 것처럼 보이는 착각이 든다. 이러한 양자 얽힘 개념이 등장한 후, 양자암호, 양자컴퓨터 등의 연구 및 개발, 실험 등은 꾸준히 진행되고 있으며, 이를 통해 양자얽힘 이론의 예측을 실증할 수 있었다. 한편, 한쪽에서는 철학적인 논의도 꾸준히 진행되었는데, 그 중 하나는 양자얽힘 현상이 국소성의 원리를 위배한다는 주제이다. 국소성의 원리는 계의 상태에 관한 정보가 항상 그 계의 주위를 통해서 만 매개될 수 있다는 원리를 말하는데, 만약 양자얽힘 현상에 의해서 정보가 전달된다면 별도로 주위를 통하지 않고도 정보를 전달할 수 있기 때문에 국소성의 원리와 모순된다. 결국 양자 얽힘 과정에서 실제로 정보가 어떤식으로 전달되는지에 대한 논의는 계속 진행되었다.

양자얽힘은 국소성의 원리를 위반하지만, 빛보다 빨리 정보를 전달할 수 없기 때문에 상대성 이론을 위배할 수 없다. 양자얽힘을 통하여 고전적인 정보와 양자역학적인 정보를 함께 보낼 수 있는 방법이 존재하는데, 이것을 바로 양자전송이라고 부른다. 그러나 이 경우에도 역시 정보를 빛보다 빠르게 전송하는 것은 불가능하다.[1]

배경

양자얽힘은 양자역학의 코펜하겐 해석에서 유도되는 결론 중 하나이지만, 비직관성에 의해서 아이슈타인을 비롯한 여러 과학자들에게 환영받지 못했다. 이들은 양자역학의 표준해석방법인 코펜하겐 해석을 받아들이지 않았고, 그 대신 숨은 변수 이론을 만들었다. 이 이론은 아직 알려지지 않은 결정론적 매개변수가 상호작용을 유도한다는 내용인데, 코펜하겐 해석의 확률적인 해석을 반대하는 입장이었다. 1935년, 알베르트 아이슈타인, 보리스 포돌스키, 네이선 로젠은 양자역학의 비국소적이고 비직관적인 현상에 대한 사고 실험인 EPR 역설을 발표했다. 양자역학과 비슷한 물리 현상을 예측하면서 국소성 원리 또한 만족하는 숨은 변수 이론을 찾기 위해 노력했다. 1964년에 존 벨은 모든 숨은 변수 이론이 만족하지만 양자역학은 만족하지 않는 벨 부등식이라는 조건을 유도했다. 실험 결과, 실제 물리 현상은 벨 부등식을 다르지 않는다는 사실이 밝혀져, 자연계는 숨은 변수 이론으로는 기술할 수 없다.

정의

브라-켓 표기법을 사용한다. 서로 상호작용하지 않는 두 부분계 A와 B로 이루어진 전체 계를 생각해본다. 그렇다면 전체 계의 힐베르트 공간은 A와 B의 힐베르트 공간의 텐서 곱이다.


식이 위와 같다면 전체 계의 상태 가운데 일부는 다음과 같이 쓸 수 있다.

이렇게 두 부분계의 상태의 텐서 곱으로 나타낸 상태는 분리가능한 상태라고 부른다. 반대로 전체 계의 상태 중에서 이와 같이 두 부분계의 상태의 텐서 곱으로 나타낼 수 없는 상태가 얽힌 상태이다. 예를 들어 다음과 같이 와 가 평행하지 않고, 와 가 평행하지 않을 는 일반적으로 얽힌 상태이다.

수학적으로, 양자역학적 상태는 힐베르트 공간 의 반직선으로 이루어진 사영 힐베르트 공간의 원소이다. 두 부분계의 상태의 텐서 곱 을 나타내는 함수는 세그레 매장이라고 한다. 따라서 분리가능한 상태는 세그레 매장의 치역이며, 그 여집합이 얽힌 상태이다.

개념

얽힘이라는 단어 자체는 풀림의 반대말이다. 상관성의 예로 주사위를 던졌을 때의 예를 하나 들어보자. 1번 주사위에서 1이 나오면 2번 주사위에서도 무조건 1이 나와야 하고, 1번 주사위에서 2가 나오면 2번 주사위에서도 무조건 2가 나온다. 이렇게 주사위의 결과가 완전하게 상관관계를 가지고 같은 숫자의 결과로 상관 관계를 가지는 경우, 마치 두 주사위를 던지는 결과 또는 두 주사위의 상태가 서로 얽혀있는 것처럼 보인다. 두 주사위를 던졌는데 하나의 결과만 본다면 다른 주사위의 결과가 뒤따라오기 때문이다. 하지만 이러한 상관성을 가진 상황만을 가지고 전문적인 양자물리학의 얽힘 상태로 보기는 어렵다. 얽힘 상태는 앞의 두 주사위처럼 극단적인 관측결과의 상관성도 물론 포함하지만, 결과의 상관성이 보이게끔 하는 비국소성이라는 특성을 반드시 가지고 있어야 비로소 그 상관관계가 얽힘 상태가 된다.

비국소성과 국소성

비국소성은 양자얽힘 개념에서 핵심적인 특성이자, 결과의 상관성을 보이게끔하는 메커니즘에 해당한다. 이에 대해 설명하기 위해 그 반대인 국소성에 대한 개념부터 설명해야한다. 누가, 언제, 어디서, 어떤 방식으로 던져도 항상 같은 숫자가 나오는 주사위가 두개 있다. 두 주사위는 서로의 형체도 잘 안보일 정도로 멀리 떨어진 전혀 다른 장소로 던져진다. 이 경우, 두 주사위 간의 상관관계와 관련한 설들이 존재한다.

  • 이론 1
사위 내부에 두가지 핵심적인 장치가 들어있다고 가정하는 것이다. 첫째는, 두개의 주사위 각각에 완전히 똑같이 설계된 전자장치가 처음부터 내장되어 있다는 내용이다. 이 장치는 주사위를 던질 때마다 매번 주사위의 1에서 6까지의 임의의 정수중에서 하나를 결과값으로 낸다. 그러나, 두 주사위가 똑같이 설계되어 있기 때문에 같은 회차의 주사위를 던지면 항상 같은 숫자를 결과값으로 낸다. 이러한 장치는 같은 시드를 활용한 난수생성기와 같은 아주 간단한 컴퓨터 프로그램으로 충분히 실현할 수 있다. 두 번째는, 주사위 내부에 만능 센서 및, 모션제어 시스템이 내장되어 있어서 주사위 주변의 환경을 모두 상세하게 측정하여 그 환경에 맞춰서 주사위 내부의 모터를 작동시켜, 어던 환경이든간에 지금 회차에 전자프로그램이 내보낸 출력에 해당하는 숫자가 윗면으로 보이게 한다. 여기서 주사위 주변의 환경은 온도, 습도, 주사위가 놓일 표면의 재질, 바람의 속도와 방향 등을 포함한다. 언뜻보면 불가능할 것처럼 보이나, 결과적으로 윗면에 나오는 면이 여섯면 중 하나이기만 하면 되기 때문에, 내장된 센서와 운동제어장치가 완벽하지 않아도 기능은 할 수 있을 것이다.
  • 이론 2
주사위 간의 상관관계에 대한 한가지 설이 더 있다. 현실적으로 이루어질 수 있는가는 고려하지 않았으며, 이론적으로 추측한다. 두 주사위가 서로 같은 숫자를 내는 방법에서, A 주사위가 윗면에 a라는 숫자가 나오면 상대 주사위인 B에도 윗면이 a가 된다. 즉, 아무리 멀리 떨어져 있어도 한쪽의 결과가 나올 때 거의 동시에 정보가 전달되어 다른쪽도 결과가 동일하게 적용된다. 상대론의 원리인 '어떤 정보도 빛의 속력보다 빠르게 전달될 수 없다'를 위배한다.

국소성의 원리란, 서로 멀리 떨어져 있는 두 물체는 절대로 서로를 직접적으로 간섭할 수도 영향을 줄 수도 없다는 이론이다. 이론 1의 경우에는 원리상 국소성을 위배하지 않는다. 비교적 구체적이고 어느정도 검증될 가능성도 있다. 주사위 내부에 존재하는 장치를 제작하는데 다소 고난이도의 기술력이 동반될 수는 있겠지만, 장치는 상대 주사위에서 어떤 일이 일어나든 전혀 고려할 필요가 없다. 단지 장치가 존재하는 자신의 주사위의 주변 환경만 잘 관리하면 두 주사위 간의 상관관계를 설명할 수 있다. 서로 정보를 주고 받을 수 있더라도, 빛의 속력보다 느리게 통신한다고 하면 이는 국소성의 원리를 위배하는 것이 아니다. 반면에, 이론 2의 경우에는 한쪽 주사위의 숫자가 정해지면 다른 한쪽의 주사위 또한 동시에 숫자가 정해지기 때문에 국소성의 원리를 위배할 수 있다. 이런 상황을 바로 비국소성의 특성을 가진다고 말한다. 상관관계를 설명할 때 국소성의 원리를 만족하는 이론이 적용된다면 이 상관성은 고전적 상관성이며, 비국소성의 특성이 반드시 필요한 상관관계라면 이 상관성은 얽힌 상태, 또는 얽혀있는 상관성이다. 그러나 상관성이 있는 두 물체의 상태는 모두 '국소성의 원리를 따르는 방법으로 설명이 가능한지', 즉, 모든 상관성은 '고전적인 상관관계인지' 묻는다면, 전통적으로 현실세계를 설명하는 물리학 이론들은 국소성의 원리를 따랐다. 아이슈타인을 포함한 많은 사람들은 국소성의 원리를 믿었고, 우리는 관측한 두 물체의 결과가 상관관계가 있다면 당연히 그들 각각의 내부에 무슨 일이 일어났기 때문에 상관관계가 발생하는 것이라고 추측한다. 이론 1과 이론 2처럼 결과가 상관성을 가지는 두 물질이 발견된다면, 실험 물리학자들은 그 물체의 내부부터 철저하게 조사한다. 정말 국소성의 원리를 따른다면 주사위에 어떠한 프로그램이나 내부장치가 있을테니 물질의 내부부터 들여다보는 것이다. 고체를 단계별로 점점 쪼개서 원자 단위까지 살펴보는 실험을 한다거나, 원자를 더 쪼개는 입자 가속기 실험 등, 실험물리의 많은 예시들은 간단히 말해서 이러한 방법론에 입각하여 진행된다. 물체의 내부에서 어떠한 장치가 발견된다면 물체의 상관성은 역시 국소성의 원리에 입각한거라고 결론지을 수 있기 때문이다. 실제 많은 경우의 상관성은 국소성의 이론을 따르고 있기도 하다.

그러나, 바로 위에서 언급한 내부 장치나 제어장치가 발견되지 않았을 때는 이런 검증방법으로는 마땅히 내릴만한 결론이 없다. 실험적인 방법이 정확하지 않았거나 오류가 있어서 발견하지 못한 것일수도 있고, 상관성에 대한 메커니즘이 정말로 비국소성의 특성을 가지고 있을 수도 있고, 또는 지금까지 생각하지 못한 저혀 새로운 방식으로 동작하는 것일 수도 있기 때문이다.

벨 부등식과 벨 테스트

벨 테스트는 실험 결과 나온 상관성이 과연 국소성의 원리를 따르는지, 비국소성의 특성을 가지는지 판단하는 방법이다. 간단히 말하면 다음과 같다.

  1. 상관성을 가지는 여러 관측 결과를 적당히 곱하고 더하고 뺀 결과가 국소성의 원리를 따른다면 절대 어떤값보다 클 수 없다는 부등식을 제시한다. → 벨 부등식
  2. 실험적으로 정말 그렇게 되는지 검사한다. → 테스트

벨 부등식은 벨의 정리로 잘 알려져 있는데, 영국의 물리학자 존 스튜어트 벨이 처음 제안했다. 국소성의 원리를 따르는 모든 상관성은 바로 이 벨 부등식을 만족해야만 한다. 따라서 만약이라도 실험적으로 벨 부등식이 성립하지 않는다면, 해당 실험 결과는 반드시 비국소성의 특성을 가져야 하며, 이것이 바로 어떤 상관성이 얽힘을 가진다는 실험적인 증명이 된다. 벨 부등식은 존 벨이 처음 제안한 형태 이외에도 물리적인 상황에 따라 여러 종류의 형태로 제시할 수 있다. 간단히 설명하자면 다음과 같다.

왼쪽, 오른쪽에 각각 +1, -1 숫자가 적힌 종이가 존재한다. 그 다음 뒷면에는 +1의 뒷면에 해당하는 위치에 -1, -1의 뒷면에 해당하는 위치에 +1을 쓴다. 그 후, 작성한 종이를 반으로 나눠서 반쪽은 A가 다른 반쪽은 B가 가진다음 서로 멀리 떨어진다.

벨 부등식
A : (앞) +1 (앞) +1 (앞) -1 B : (앞) -1
A : (뒤) -1 (뒤) -1 (뒤) +1 B : (뒤) +1

이제 A와 B는 시간을 정해서 자신의 종이에 적힌 숫자를 동시에 읽는다. 만약 A가 앞명를 봐서 +1이 나온다면 A는 그 즉시 B가 앞을 보면 -1, 뒤를 보면 +1이 적혀있다는 것을 알아챈다. 이 실험에서 A가 B의 결과를 즉시 알 수 있었던 이유는 자신과 B의 종이의 숫자가 서로 반대임을 이미 알고 있었기 때문이다. 따라서 이 실험에서 A와 B가 즉시 서로의 결과를 알아챈다고 해도 국소성의 원리는 위배하지 않으며, 이러한 종류의 상관성은 물론 고전적 상관성이라고 할 수 있다.

그렇다면 이러한 국소성을 따르는 상관성이 존재하는 경우, 다음의 값을 계산해본다.구문 분석 실패 (구문 오류): {\displaystyle 김도헌, 〈[http://crossroads.apctp.org/myboard/read.php?Board=n9998&id=1225&s_para4=0022 양자얽힘]〉, 《크로스로드》, 2017-07 }

예제

다음 예시에서는 A와 B가 각각 두 개의 상태 와 을 가질 수 있는 계라고 가정한다. 대표적으로 전자의 스핀 등이 있다. 이때 다음과 같은 상태는 얽혀 있다.

이런 상태에서 A의 스핀을 측정할 시, 다음의 두 결과 중 하나가 50% 확률로 일어날 수 있다.

  1. A의 스핀을 0으로 측정한다. 이에 따라 계의 상태는 로 바뀐다.
  2. A의 스핀을 1로 측정한다. 이에 따라 계의 상태는 로 바뀐다.

만약 A의 스핀을 0으로 측정한다면, 뒤 따라 B의 스핀을 측정했을 때 100% 확률로 매번 1을 얻을 것이다. 반대로, A의 스핀을 1로 측정한다면, 뒤 이어 B의 스핀을 측정했을 때 매번 0을 얻는다. 그러나 A의 스핀을 먼저 측정하지 않고 B의 스핀을 측정한다면, B는 50% 확률로 0이나 1을 얻는다. 이에 따라, A의 스핀의 측정이 B의 스핀의 측정에 일종의 영향을 줄 수 있다. 이는 A와 B가 공간적으로 매우 멀리 떨어져 있어도 가능하다. 이것은 EPR 역설의 한 형태이다. 하지만 얽힘 현상으로 먼 거리를 거쳐 정보를 전송하는 건 불가능하다. A를 측정하여 어떤 결과를 얻을지 알 수 없기 때문이다.

만약 스핀의 상태를 복제할 수 있다면 다음과 같이 정보를 전달하는 방법을 생각해 볼 수 있다. A계에서 한 비트를 전송하고 싶다고 한다면, 0을 전송하려면 아무것도 하지 않고, 1을 전송하려면 A의 스핀을 측정한다. 그렇다면, B에서 전송한 결과를 다음과 같이 받을 수 있다. 우선, B의 스핀 상태를 여러번 복제하고, 복제한 상태들의 스핀을 각각 측정한다. 만약 A의 스핀을 측정하지 않았고, A가 0을 전송했으면, B의 복제본들의 측정 결과는 제각각일것이나, 만약 A의 스핀을 측정하고 A가 1을 전송했다면, B의 복제본들의 스핀은 모두 0이거나 모두 1이어야 한다. 그러나 양자역학적 상태는 복제 불가는 정리에 의해서 정확히 복제하는 것이 불가능하고, 이러한 정보 전달 방법은 불가능하다.

스핀 단일 상태의 상관 관계

위와 같은 상관관계는 고전적으로 설명할 수있다. 예를 들어, A의 스핀과 B의 스핀이 항상 반대이지만, 어느 스핀이 0이고 어느 스핀이 1인지는 알 수 없을 수도 있다. 그러나 얽힘은 다음과 같은 예시처럼 고전적으로 설명하기 힘든 상관관계를 가질 수도 있다. 두 개의 전자로 이루어진 계를 생각해봤을 때, 전자는 스핀이 인 페르미온이므로, 페르미-디랙 통계로 인하여 계의 파동 함수는 반대칭적이다. 그 중 총 스핀이 0인 스핀 단일 상태는 다음과 같다.

위의 식은 명시적으로 스핀이 양자화된 방향을 표시했다. 위의 식과 같은 상태의 두 입자로 이루어진 계에서 하나의 스핀을 측정하는 경우, +나 -가 나올 확률은 반반일 것이다. 이 경우도 위와 마찬가지로 다음과 같다.

  1. A를 측정해서 +가 나왔다면, 계 B를 측정하면 반드시 -가 나와야 한다. 즉, A를 +로 측정하면 계의 상태는 로 바뀐다.
  2. A를 측정해서 -가 나왔다면, 계 B를 측정하면 반드시 +가 나와야 한다. 즉, A를 -로 측정하면 계의 상태는 로 바뀐다.

이러한 사고 실험은 실제로 수행하려면 총스핀이 0인 입자가 붕괴하는 과정을 사용해야만 한다. 각 운동량 보존에 의해 붕괴된 두 입자의 스핀합도 0이어야 하며, 따라서 동일한 입자가 생성될 경우에는 스핀 단일 상태로 생성되게 된다. 이 같은 예로는 에타 중간자가 뮤온 쌍으로 붕괴하는 현상이 있다.

하지만 이러한 현상은 일어날 확률이 로 매우 작기 때문에 실험에는 부적합하다. 다른 예로는, 작은 운동 에너지를 갖는 두 양성자가 출동해서 다시 튀어나가는 현상으로 들 수 있다.

파울리 배타 원리때문에 상호작용한 양성자들은 상태에 있고, 산란된 양성자들의 스핀 상태는 양성자들이 멀리 떨어지 상태에서도 위와 같이 얽혀 있다. 다시 측정 결과로 돌아와서 보면 위의 순수한 계의 예시와 별 다른 것이 없어 보인다. 만약 흰 공과 검정색 공이 든 항아리에서 공 하나를 꺼내 확인해본다고 한다면, 흰 공이 앨리스에게로 갔다면, 밥은 검은색 공을 꺼내게 된다. 그렇다면 위에서처럼 측정 전에는 알지 못했을 뿐, 항아리 속의 흰공과 검은공을 측정하는 것처럼 똑같이 설명할 수 있지 않을까싶지만, 위의 문제는 항아리처럼 쉬운 문제는 아니다. 스핀이 방향성을 갖기 때문이다. 스핀 단일 상태를 x나 y방향의 스핀 고유 상태로 표시하면, x방향의 고유상태와 y방향의 고유상태는

와 같은 관계를 가지고 있다. 따라서 스핀 단일 상태는


와 같이 표현될 수 있다. x방향의 스핀을 측정한 뒤 B의 z방향 스핀을 측정한다면, A의 x방향 스핀 측정 결과에 상관없이 B의 z방향 스핀은 +와 -가 반반씩 측정될 것이다. A의 x방향 스핀 정보를 측정하면 계의 상태가 또는 로 붕괴할 것이기 때문에 B의 z방향 성분은 무작위로 측정된다.

결과
  • A와 B가 서로 수직한 다른 방향의 스핀 성분을 측정할 때, 두 측정 사이의 상관 관계는 없다.
  • A와 B가 같은 방향을 측정할 때, 두 측정은 100% 상관관계를 갖는다.
  • A의 스핀을 측정하지 않는다면, B는 측정 방향에 상관없이 무작위한 결과를 내놓는다.
A의 측정 결과 B의 측정 결과

따라서, B의 측정 결과는 A에 행새진 측정 방법에 따라 달라지는 것처럼 보인다. 이는 양자역학적으로 측정이 단순히 기존에 있는 상태를 건드리지 않고 기록하는 과정이 아니라, 계의 상태를 바꾸기 때문이다. A의 z방향 스핀 성분을 +로 관찰하면, 계의 상태는 로 바뀐다. 즉, 계의 일부분을 측정해도 계 전체 상태가 바뀐다.

코드

Q#

다음은 양자얽힘을 보여주는 벨이라는 프로그램의 코드로, 마이크로소프트에서 제공하고 있다. 벨의 이름은 가장 간단한 중첩과 양자 얽힘의 예를 표현하는 데 사용되는 두 큐비트의 특정 양자 상태를 의미하는 벨 상태에서 따온 이름이다. 코드를 작성하기에 앞서, 우선 원하는 언어나 개발 환경을 사용하여 양자 개발 키트를 설치하고, 해당 키트가 이미 설치되어 있는 경우에는 키트가 최신 버전인지 확인하고 업데이트 과정을 진행한다. 키트를 설치하지 않고도 Q# 프로그래밍 언어의 개요와 양자 컴퓨팅 개념을 확인할 수 있다.

양자 개발 키트의 동작

고전적 비트는 0이나 1같은 단일 이진 값을 보유하는 반면, 큐비트는 0과 1의 중첩이 가능하다. 개념적으로 추상공간의 방향, 즉 벡터로 간주할 수 있고, 이 경우 가능한 모든 방향이 있을 수 있다. 두 고전적인 상태는 두 방향이다. 즉, 0을 측정할 확률은 100%이며, 1을 측정할 확률도 100%이다. 측정 작업은 이진 결과를 생성하고 큐비트 상태를 변경한다. 측정은 0이나 1의 이진 값을 생성하는데, 큐비트는 중첩에서 고전적 상태 중 하나로 변경된다. 그 후, 개입 작업 없이 동일한 측정을 반복하며 동일한 이진 결과를 생성한다. 여러 큐비트가 서로 얽힐 수도 있는데, 얽힌 큐비트 하나를 측정하면 다른 큐비트의 상태 정보도 변화한다.

Q# 프로젝트 생성

다음 프로젝트는 마이크로소프트의 비주얼 스튜디오 코드 응용 프로그램을 기반으로 한다. 새 Q# 프로젝트를 생성하고, 프로젝트를 호출한다.

  • program.qs
01 namespace Bell {
02
03     open Microsoft.Quantum.Canon;
04     open Microsoft.Quantum.Intrinsic;
05
06     @EntryPoint()
07     operation HelloQ() : Unit {
08         Message("Hello quantum world!");
09     }
10 }
Q# 응용 프로그램 작성

아래의 첫 번째 코드는 원하는 비트를 사용하는 방법이다. SetQubitState 연산은 큐비트를 매개 변수로 사용하고 또 다른 매개 변수 desired를 사용해서 우리가 원하는 큐비트 상태를 나타낸다. SetQubitState 연산은 M 연산을 통해 큐비트를 측정한다.

  • program.qs
01    namespace Bell {
02       open Microsoft.Quantum.Intrinsic;
03       open Microsoft.Quantum.Canon;
04
05       operation SetQubitState(desired : Result, q1 : Qubit) : Unit {
06           if (desired != M(q1)) {
07               X(q1);
08           }
09       }
10   }

이 연산을 호출해서 큐비트를 고전적인 상태로 설정하면 항상 zero를 반환하거나 one을 반환할 수 있다. 여기서 zero와 one은 큐비트 측정해서 가능한 두 가지 결과를 나타내는 상수이다. SetQubitState 연산은 큐비트를 측정한다. 큐비트가 우리가 원하는 상태이면 SetQubitState는 큐비트를 그대로 두고, 그렇지 않다면 x 연산을 실행해서 큐비트를 원하는 상태로 변경한다.

측정 결과 계산

SetQubitState 연산 효과를 보여주기 위해 TestBellState 연산를 추가한다. 이 연산은 zero 나 one을 입력으로 취하며, 이 입력을 사용하여 SetQubitState 연산을 수 차례 호출하고, 큐비트 측정에서 zero가 반환된 횟수와 one이 반환된 횟수를 집계한다. 물론 TestBellState 연산의 첫 번째 시뮬레이션 출력에서는 zero를 사용하여 매개 변수 입력으로 설정된 모든 큐비트 측정에서 zero를 반환하고, one을 사용하여 매개 변수 입력으로 설정된 모든 큐비트 측정에서 one을 반환한다. SetQubitState 연산이 끝난 후에 다음 연산을 Bell.qs 파일에 추가한다.

01 operation TestBellState(count : Int, initial : Result) : (Int, Int) {
02
03       mutable numOnes = 0;
04       using (qubit = Qubit()) {
05
06           for (test in 1..count) {
07               SetQubitState(initial, qubit);
08               let res = M(qubit);
09
10               // Count the number of ones we saw:
11               if (res == One) {
12                   set numOnes += 1;
13               }
14           }
15            
16           SetQubitState(Zero, qubit);
17       }
18
19       // Return number of times we saw a |0> and number of times we saw a |1>
20       Message("Test results (# of 0s, # of 1s): ");
21       return (count - numOnes, numOnes);
22   }

return() 함수를 사용하여 콘솔에 설명 메시지를 인쇄하기 위해 앞에 줄을 추가했다. TestBellState 연산은 count 반복문을 실행하고, 큐비트에 지정된 initial 값을 설정한 후, 결과를 측정한다. 측정한 0과 1의 개수에 대한 통계를 수집하여 호출자에게 반환하고, 다른 필요한 연산을 수행한다. 다른 사용자가 알려진 상태에서 이 큐비트를 할당할 수 있도록 반환하기 전에 해당 큐비트를 zero로 다시 설정한다.

기본적으로 변수 Q#은 변경할 수 없고, 바인딩된 후에는 해당 값이 변경되지 않을 수 있다. let 키워드는 변경할 수 없는 변수의 바인딩을 나타내느 데 사용되며, 연산 인수는 항상 변경할 수 없다. 예제의 numones와 같이 값이 변경될 수 있는 변수가 필요한 경우에는 mutable 키워드를 사용하여 해당 변수를 선언할 수 있다. 변경할 수 있는 변수의 값은 setQubitState 문을 사용해서 변경할 수 있다. 두 경우 모두 변수 형식은 컴파일러를 통해 유추된다.

프로그램 실행

코드를 실행하기 위해 명령을 제공할 때 실행할 수 있는 컴파일러를 지정한다.

01 namespace Bell {
02    open Microsoft.Quantum.Canon;
03    open Microsoft.Quantum.Intrinsic;
04
05    operation SetQubitState(desired : Result, target : Qubit) : Unit {
06        if (desired != M(target)) {
07            X(target);
08        }
09    }
10
11    @EntryPoint()
12    operation TestBellState(count : Int, initial : Result) : (Int, Int) {
13
14        mutable numOnes = 0;
15        using (qubit = Qubit()) {
16
17            for (test in 1..count) {
18                SetQubitState(initial, qubit);
19                let res = M(qubit);
20
21                // Count the number of ones we saw:
22                if (res == One) {
23                    set numOnes += 1;
24                }
25            }
26
27            SetQubitState(Zero, qubit);
28        }
29
30    // Return number of times we saw a |0> and number of times we saw a |1>
31    Message("Test results (# of 0s, # of 1s): ");
32    return (count - numOnes, numOnes);
33    }
34 }

프로그램을 실행하려면 count 명령줄에서 인수를 지정해야 initial한다. 예를 들어,

//.NET Core CLI
dotnet run --count 1000 --initial One

출력은

//출력
Test results (# of 0s, # of 1s):
(0, 1000)

initial = Zero인 경우에는 다음 사항을 확인한다.

//.NET Core CLI
dotnet run --count 1000 --initial Zero
//출력
Test results (# of 0s, # of 1s):
(1000, 0)
얽힘 준비

먼저 첫 번째 큐비트를 초기 상태로 설정한다. H 연산을 사용하여 중첩 상태로 전환하고, 첫 번째 비트를 측정하기 전에 제어되지 않았음을 나타내는 연산을 한다. 두 큐비트에 대해서 이 연산을 실행할 시 그 결과로 첫 번째 큐비트가 one 인 경우에는 두 번째 큐비트가 대칭 이동한다. 이제 두 큐비트가 서로 얽혔다. 첫 번째 큐비트에 대한 확률은 변한게 없지만, 이제 두 번째 큐비트의 측정 결과는 첫 번째 큐비트의 측정 결과와 항상 동일하다. CNOT 작업은 두 큐비트를 얽어서 두 큐비트 중 한 큐비트에서 일어나는 모든 것이 다른 큐비트에서 발생하도록 했다. 반대로 측정한 경우에도 동일한 상황이 발생한다.

가장 먼저 해야할 할일은 TestBellState에서 두 비트를 할당하는 것이다.

//Q#
using ((q0, q1) = (Qubit(), Qubit())) {

이렇게 하면 TestBellState에서 측정하기 전에 새 연산은 CNOT를 추가할 수 있다.

01 //Q#
02 SetQubitState(initial, q0);
03 SetQubitState(Zero, q1);
04
05 H(q0);
06 CNOT(q0, q1);
07 let res = M(q0);

시작할 때 항상 zero 상태에 있도록 첫 번째 큐비트를 초기화하는 다른 SetQubitState 연산을 추가한다. 또한 두 번째 큐비트를 해제하기 전에 다시 설정해야 한다.

//Q#
SetQubitState(Zero, q0);
SetQubitState(Zero, q1);
//Q#
01 operation TestBellState(count : Int, initial : Result) : (Int, Int) {
02
03        mutable numOnes = 0;
04        using ((q0, q1) = (Qubit(), Qubit())) {
05            for (test in 1..count) {
06                SetQubitState(initial, q0);
07                SetQubitState(Zero, q1);
08
09                H(q0);
10                CNOT(q0,q1);
11                let res = M(q0);
12
13                // Count the number of ones we saw:
14                if (res == One) {
15                    set numOnes += 1;
16                }
17            }
18
19            SetQubitState(Zero, q0);
20            SetQubitState(Zero, q1);
21        }
22
23        // Return number of times we saw a |0> and number of times we saw a |1>
24        return (count-numOnes, numOnes);
25    } 

위 코드를 실행하면 이전과 정확히 동일한 50-50 결과를 얻을 수 있다. 다음은 두 번째 큐비트가 측정되는 첫 번째 큐비트에 반응하는 방법이다. 새로운 TestBellState 연산을 사용한다.

//Q#
01 operation TestBellState(count : Int, initial : Result) : (Int, Int, Int) {
02        mutable numOnes = 0;
03        mutable agree = 0;
04        using ((q0, q1) = (Qubit(), Qubit())) {
05            for (test in 1..count) {
06                SetQubitState(initial, q0);
07                SetQubitState(Zero, q1);
08
09                H(q0);
10                CNOT(q0, q1);
11                let res = M(q0);
12
13                if (M(q1) == res) {
14                    set agree += 1;
15                }
16
17                // Count the number of ones we saw:
18                if (res == One) {
19                    set numOnes += 1;
20                }
21            }
22            
23            SetQubitState(Zero, q0);
24            SetQubitState(Zero, q1);
25        }
26
27        // Return times we saw |0>, times we saw |1>, and times measurements agreed
28        Message("Test results (# of 0s, # of 1s, # of agreements)");
29        return (count-numOnes, numOnes, agree);
30    }
//.NET Core CLI
dotnet run --count 1000 --initial One
//출력
(505, 495, 1000)
//.NET Core CLI
dotnet run --count 1000 --initial Zero
//출력
Test results (# of 0s, # of 1s, # of agreements)
(507, 493, 1000)

첫 번째 큐비트에 대한 확률은 변경되지 않았지만 두 큐비트가 서로 얽혀있으므로 두 번째 큐비트의 측정 결과는 첫 번째 큐비트의 측정 결과와 항상 동일하다.[2]

각주

  1. 양자 얽힘 위키백과 - https://ko.wikipedia.org/wiki/%EC%96%91%EC%9E%90_%EC%96%BD%ED%9E%98
  2. 마이크로소프트, 〈자습서: Q#을 사용한 얽힘 살펴보기〉, 《마이크로소프트》, 2020-05-29

참고자료

같이 보기


  의견.png 이 양자얽힘 문서는 암호 알고리즘에 관한 토막글입니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 이 문서의 내용을 채워주세요.