일반 비트는 언제나 0 또는 1이고, NOT 연산이 값을 뒤집습니다. 큐비트의 X 게이트도 |0>과 |1>에서는 똑같이 값을 뒤집습니다. 아래 두 줄을 나란히 눌러 보세요 — 항상 같이 움직입니다.
이것만 기억하세요계산 기저에서 X 게이트 = NOT
파란 버튼을 눌러 보세요
두 줄이 항상 같이 0↔1로 뒤집힙니다
일반 비트0 ─ NOT ─ 1
큐비트|0> ─ X ─ |1>
일반 비트0NOT 대기
큐비트|0>P(측정 = 0) = 100% · 확실
지금은 둘 다 0입니다. ‘둘 다 뒤집기’를 눌러 보세요.
이 데모는 잡음이 없는 이상적 1큐비트 시뮬레이션이며 실제 양자 하드웨어의 실행 결과가 아닙니다. |0>·|1>에서는 X가 NOT과 같지만, 다음 편에서 H 게이트를 쓰면 큐비트는 0도 1도 아닌 중첩 상태가 되어 일반 비트와 갈라집니다.
이 데모에 대하여
일반 비트와 큐비트를 같은 버튼으로 뒤집습니다
화면의 두 줄은 서로 다른 방식으로 계산됩니다. 위쪽 일반 비트는 자바스크립트 숫자 0과 1을 그대로 뒤집고, 아래쪽 큐비트는 복소 진폭 두 개로 된 상태에 X 게이트 행렬을 곱해 나온 결과를 확률로 읽어 표시합니다. 계산 경로가 완전히 다른데도 두 값이 언제나 같이 움직인다는 것이 이 화면에서 확인할 내용입니다. 큐비트를 처음 볼 때 가장 오해하기 쉬운 지점이 여기인데, 큐비트라고 해서 모든 연산이 고전 비트와 다르게 동작하는 것이 아니라 계산 기저에 놓인 값에 대해서는 똑같이 동작하는 구간이 분명히 있습니다. 이 화면은 그 구간만 떼어내 보여주고, 갈라지는 지점은 다음 편으로 미룹니다.
처음 상태는 양쪽 다 0입니다. 큐비트 쪽에 P(측정 = 0) = 100%가 붙어 있는지 봅니다.
‘둘 다 뒤집기’를 누릅니다. 두 줄이 동시에 1로 바뀌고 확률 표시도 따라 바뀝니다.
한 번 더 누릅니다. 다시 둘 다 0으로 돌아옵니다. X를 두 번 걸면 원래대로입니다.
몇 번을 눌러도 확률은 100%에서 움직이지 않습니다. 이 단계에는 중첩이 없습니다.
‘처음부터’로 초기화하고, 회로 표기 0 ─ NOT ─ 1과 |0> ─ X ─ |1>을 나란히 비교합니다.
확률 표시가 100% 에서 한 번도 벗어나지 않는지 확인합니다. 이것이 다음 편과의 차이입니다.
화면 뒤에서 실제로 계산하는 것
01
큐비트는 복소수 두 개로 저장합니다.
상태를 |ψ> = a|0> + b|1> 형태로 두고, a 와 b 를 각각 실수부와 허수부를 가진 값으로 보관합니다. 이 편에서 쓰는 X 게이트를 비롯해 미니랩이 다루는 X · H · Z 는 모두 실수 행렬이라, |0>에서 출발하면 허수부가 0 인 채로 끝까지 유지됩니다. 그런데도 처음부터 복소수 구조로 만들어 둔 이유는 네 편의 데모가 같은 엔진을 공유하기 때문입니다. 뒤쪽 편에서 위상을 다룰 때 자료 구조를 바꾸면 앞 편의 계산까지 다시 검증해야 하므로, 실수만 쓰는 구간에서도 일반적인 형태를 유지합니다.
02
X 게이트는 진폭 두 개를 맞바꿉니다.
X 는 행렬 [[0,1],[1,0]] 이고, 구현은 a 와 b 를 서로 바꾸는 것 한 줄입니다. |0>은 a=1, b=0 이므로 바꾸면 a=0, b=1 이 되어 |1>이 되고, 다시 걸면 원래대로 돌아옵니다. 계산 기저에 정확히 놓인 값에 대해서는 이 동작의 결과가 고전 NOT 과 완전히 같습니다. 화면의 두 줄이 한 번도 어긋나지 않는 것은 우연이 아니라, 이 구간에서 두 연산이 같은 함수라는 사실을 그대로 보여주는 것입니다.
03
표시되는 값은 확률에서 거꾸로 읽은 것입니다.
화면은 큐비트에 0 이나 1 을 직접 저장해 두고 그것을 보여주는 것이 아닙니다. 측정에서 1 이 나올 확률 |b|² 를 매번 계산해서, 그 값이 0.5 보다 크면 1, 아니면 0 으로 표시합니다. 이 단계에서는 확률이 항상 0 아니면 1 이라 애매한 경우가 생기지 않지만, 같은 표시 방식을 중첩 상태에 그대로 쓰면 잘못된 화면이 됩니다. 그래서 다음 편부터는 값 하나가 아니라 확률 막대로 표시 방식을 바꿉니다.
04
확률의 합이 1인지가 검산입니다.
|a|² 와 |b|² 를 더하면 언제나 1 이 되어야 합니다. 게이트로 쓰는 행렬은 이 합을 보존하도록 되어 있어서, 어떤 순서로 몇 번을 걸어도 확률의 합은 변하지 않습니다. 계산이 어딘가에서 틀어지면 이 합이 1 에서 벗어나기 때문에, 눈으로 보기 어려운 오류를 잡는 가장 간단한 검사가 됩니다. 화면에 100% 가 아닌 확률이 나온다면 그것은 오류가 아니라 중첩이 생겼다는 뜻이고, 그 일을 하는 것이 다음 편의 H 게이트입니다.
05
엔진은 화면과 분리해 두었습니다.
게이트 계산은 화면 코드 안이 아니라 별도 모듈에 있고, 같은 함수를 네 편의 데모가 함께 씁니다. 버튼을 누르지 않고도 게이트를 직접 걸어 결과를 확인하는 자동 테스트를 붙일 수 있어서, 화면을 고치다가 계산이 조용히 틀어지는 일을 막습니다. 데모를 하나씩 따로 만들었다면 네 편의 계산이 서로 조금씩 달라졌을 텐데, 공유 엔진을 두면 앞 편에서 확인한 결과가 뒤 편에서도 그대로 성립한다고 말할 수 있습니다.
06
이 편에는 무작위가 없습니다.
버튼을 눌러 나오는 결과는 전부 결정론입니다. 같은 순서로 누르면 언제나 같은 화면이 되고, 새로 고쳐도 마찬가지입니다. 큐비트를 다룬다고 하면 곧바로 확률과 무작위를 떠올리기 쉽지만, 무작위가 끼어드는 곳은 게이트 연산이 아니라 측정 한 군데뿐입니다. 이 편은 측정을 반복하지 않기 때문에 흔들릴 여지가 없고, 무작위가 화면에 나타나기 시작하는 것은 다음 편부터입니다.
이상적인 1큐비트이고, 실제 장비가 아닙니다.
이 화면은 잡음도 오류정정도 없는 이상적인 1큐비트 시뮬레이션이며 실제 양자 하드웨어에서 돌린 결과가 아닙니다. 실제 장치에서는 게이트를 걸 때마다 오차가 조금씩 쌓이고 상태가 시간이 지나며 무너지기 때문에, X 를 두 번 걸어도 정확히 처음 상태로 돌아오지 않고 확률이 100% 에서 미세하게 어긋납니다. 또한 큐비트가 하나뿐이라 두 큐비트 이상에서만 나타나는 얽힘은 이 화면의 범위 밖이고, 이 편에서 실제로 쓰는 게이트는 X 하나입니다. 큐비트가 고전 비트와 갈라지는 지점은 여기가 아니라 중첩을 만드는 다음 편이므로, 이 화면만 보고 큐비트가 비트와 같은 것이라고 정리하면 반대쪽으로 잘못 이해한 것이 됩니다. 여기서 보여주려는 것은 둘이 같다는 결론이 아니라, 어디까지가 같고 어디서부터 갈라지는지를 정확히 짚어 두면 다음 단계가 훨씬 덜 헷갈린다는 점입니다.