양자 게이트로 고전 논리 게이트 표현하기
양자 게이트를 이용해 고전 논리 게이트(classical logical gate)를 표현해봅시다.
양자 게이트가 익숙하지 않으신 분들은 이전 포스팅, 양자 게이트를 표현하는 4가지 방법을 참고해주세요.
1. (고전) 논리 게이트
먼저 논리 게이트가 무엇인지 확실히 하고 넘어갑시다.
논리 게이트는 ‘하나 이상’의 논리적 입력값에 대해 논리 연산
을 수행하여 ‘하나’의 논리적 출력값을 얻는 전자회로를 뜻합니다.
(위키백과: 논리 회로)
이때 논리 연산에서는 코딩할 때 아주 익숙하게 사용해온 ‘논리 연산자’들을 이용합니다.
대표적인 예로는 논리합(OR, ∨), 논리곱(AND, ∧), 부정(NOT, ~) 등이 있습니다.
2. 양자 게이트로 논리 게이트 표현하기
이제 Qiskit을 이용해 직접 양자 게이트를 다뤄봅시다.
(1) NOT 게이트
NOT 게이트의 양자 게이트 상의 표현은 매우 간단합니다.
이전 포스팅에서도 등장한 X gate
만 이용하면 구현이 가능합니다.
q = QuantumRegister(1)
c = ClassicalRegister(1)
circuit = QuantumCircuit(q, c)
# Add X gate
circuit.x(q[0])
circuit.measure(q[0], c[0])
circuit.draw(output='mpl')
그림에서도 보이듯이 양자 게이트에서 NOT 게이트는 값이 입력(Input)되는 Qubit과 측정(Output) Qubit이 같습니다.
(2) AND 게이트
AND 게이트는 NOT 게이트와 달리 측정 Qubit q[2]
외 두 개의 입력 Qubit q[0]
q[1]
이 따로 필요합니다.
그래서 총 3개의 Qubit이 필요합니다.
# Change 1 to 3
q = QuantumRegister(3)
c = ClassicalRegister(1)
circuit = QuantumCircuit(q, c)
# Add CCX gate
circuit.ccx(q[0], q[1], q[2])
circuit.measure(q[2], c[0])
circuit.draw(output='mpl')
CCX gate
는 앞의 두 상태의 논리곱 결과가 1일 때만 작동하는 양자 게이트입니다.
(두 상태가 모두 1이어야하므로 AND의 결과와 일치하겠죠?)
이해하기 쉽게 파이썬 코드로 표현하자면 아래와 같습니다.
# CCX gate is like ...
# circuit.ccx(q[0], q[1], q[2])
if (q[0] and q[1]):
circuit.x(q[2])
(3) NAND 게이트
NAND 게이트는 NOT(AND) 게이트와 동일합니다.
따라서 위의 코드에 X gate
하나만 추가하면 끝입니다.
q = QuantumRegister(3)
c = ClassicalRegister(1)
circuit = QuantumCircuit(q, c)
circuit.ccx(q[0], q[1], q[2])
# Add X gate
circuit.x(q[2])
circuit.measure(q[2], c[0])
circuit.draw(output='mpl')
(4) OR 게이트
OR 게이트도 AND 게이트에서 추가해나가는 방식입니다.
단, 이번에는 하나가 아닌, 두 개의 게이트가 추가됩니다.
q = QuantumRegister(3)
c = ClassicalRegister(1)
circuit = QuantumCircuit(q,c)
# Add two CX gates
circuit.cx(q[1], q[2])
circuit.cx(q[0], q[2])
circuit.ccx(q[0], q[1], q[2])
circuit.measure(q[2], c[0])
circuit.draw(output='mpl')
CX gate
는 CCX gate
처럼 앞의 상태에 따라 작동이 정해지는 양자 게이트입니다.
CCX gate
와 달리 하나의 상태만 존재하니까 좀 더 간단하다고는 할 수 있겠네요.
전자의 상태가 1일 때만 작동하는 양자 게이트입니다.
이해하기 쉽게 파이썬 코드로 표현하자면 아래와 같습니다.
# CX gate is like ...
# circuit.cx(q[1], q[2])
if (q[1]):
circuit.x(q[2])
(5) XOR 게이트
XOR 게이트는 OR 게이트보다 간단합니다.
단순히 위의 코드에서 CCX gate
를 빼기만 하면 됩니다.
q = QuantumRegister(3)
c = ClassicalRegister(1)
circuit = QuantumCircuit(q,c)
circuit.cx(q[1], q[2])
circuit.cx(q[0], q[2])
circuit.measure(q[2], c[0])
circuit.draw(output='mpl')
총 5가지의 논리 게이트를 양자 게이트를 통해 표현해보았습니다.
References
- IBM Quantum Challenge 2020 Week 1 Exercise I-A (Eng)
- IBM Quantum Challenge 2020 Week 1 Exercise I-A (Kor)
💬 Any comments and suggestions will be appreciated.
Leave a comment