0. Qiskit 이란?
Qiskit은 IBM에서 개발한 언어로, 클라우드 시스템을 통해 양자 컴퓨터에 접근하고 회로를 설계하기 위해 만들어진 오픈소스 퀀텀 컴퓨팅 프레임워크 이다.
양자컴퓨터의 연구는 개인이 회로를 설계하여 IBM의 서버로 보내면 IBM은 그를 본인들이 가지고 있는 양자컴퓨터에서 실험을 해주고 결과를 다시 개인에게 보내는 방식으로 진행되고 있다. 이러한 과정을 컨트롤 하기 위한 언어가 바로 Qiskit이다.
기본적으로 하드웨어 컨트롤, 오류 정정 등 여러가지 요소가 있지만 이 블로그는 양자컴퓨터 알고리즘의 이론적인 부분에 집중하고 있으므로 회로설계만을 주로 다룰 예정이다.
따라서 본 포스팅에서는 1.Qiskit을 시작하고, 2.회로를 설계하며, 3.실험을 요청하고, 4.결과를 받아보는 4가지에만 집중을 하려고 한다.
Qiskit에서는 한글로 된 매뉴얼을 제공하고 있으니 참고하길 바란다. - 링크(https://qiskit.org/documentation/locale/ko_KR/index.html)
1. Qiskit 시작하기
Qiskit은 아나콘다의 주피터 노트북에 최적화 되어있다. 따라서 링크(https://www.anaconda.com/products/individual)에서 아나콘다를 설치하자. 설치방법은 생략한다.
Qiskit은 qiskit이라는 이름으로 pip서버에 배포 되어있다. 따라서 프롬프트에서 다음과 같은 명령어를 활용하여 qiskit을 쉽게 설치할 수 있다.
pip install qiskit
pip install qiskit[visualization]
이제 주피터 노트북에서 import qiskit 명령어를 이용하여 간단하게 불러올 수 있다.
Qiskit에서 IBM의 양자컴퓨터 소스에 접근하기 위해서는 IBMQ에 가입하여 접근권한을 받을 필요가 있다. 따라서 다음 링크(https://quantum-computing.ibm.com/)에서 IBMQ를 가입하자.
다음으로 아래 이미지의 붉은색 사각형 안에 있는 API 토큰을 복사하자.
이렇게 복사한 코드는 차후에 클라우드에 접근할때 마다 적어줘야 하지만 다음 명령어를 통해 로컬에 저장할수도 있다.
from qiskit import IBMQ
IBMQ.save_account('MY_API_TOKEN')
# MY_API_TOKEN에 복사한 코드가 들어가야함
2. 회로 설계하기
ㄱ. Importing Qiskit
Qiskit을 임폴트 할때 주로 사용하는 명령어는 다음과 같으므로 다음 명령어만 가져오자.
from qiskit import QuantumCircuit, execute, Aer
ㄴ. Making circuit instance
양자컴퓨터의 회로는 그리 복잡하진 않다. 따라서 하나의 회로는 하나의 인스턴스에 저장을 하게 된다.
하나의 회로전용 인스턴스를 만드는 명령어는 다음과 같다.
circ = QuantumCircuit(n_input,n_output)
- n_input의 경우, 인풋으로 사용할 큐빗의 개수를 지정해주고, n_output의 경우 아웃풋이 되는 큐빗의 개수를 지정해준다.
- 하나의 숫자만 인수로 넣을 경우, 자동으로 인풋개수와 아웃풋개수를 똑같이 맞춰준다.
ㄷ. Adding measure
양자회로의 마지막은 항상 측정으로 끝난다. 측정 게이트를 추가해주는 명령어는 다음과 같다.
circ.measure(i,j)
- i의 경우 qubit의 인덱스를 의미한다. 0부터 시작되는 인덱스를 넣어주면 된다.
- j의 경우 i번째 큐빗을 측정 후 저장될 비트의 위치를 의미한다.
ㄹ. Visualizing Circuit
이렇게 만들어진 회로를 시각화 하기위해서는 다음과 같은 명령어를 사용해줄 수 있다.
circ.draw(output='mpl',justify='none')
- circ 인스턴스를 시각화해준다.
- output에 “mpl”을 넣어줄시 matplotlib 패키지를 이용한 좀 더 깔끔한 그림을 보여주며 넣지 않을시 주피터의 문자들을 사용해 시각화 해준다.
ex)
여기까지 명령어를 활용하여 회로를 만들어내면 다음과 같다.
ㅁ. Testing circuit
이렇게 만들어진 회로를 양자컴퓨터를 실제로 이용해 볼 수 도 있고 시뮬레이터를 이용해 볼 수 도 있다. 관련 코드는 아래와 같다.
result =execute(circ,Aer.get_backend('qasm_simulator')).result()
- circ에 설계한 회로 인스턴스를 넣는다.
- Aer.get_backend() 명령어를 이용하여 사용할 양자컴퓨터/시뮬레이터를 지정해준다.
- qasm_simulator,statevectorsimulator 등이 있다.
- imbq.jobs 를 이용하면 ibm의 양자컴퓨터를 실제로 활용할 수 있다.
- 다른설정이 없다면 총 1024번 반복시행한다.
ㅂ. Adding gates
measure를 추가할때와 유사한 방식으로 추가해주면 된다. 회로에 게이트를 추가시, 앞에서 부터 쌓이는 방식으로 추가가 된다.
# 파울리 게이트 : n_q번째 큐빗에 적용
circ.id(n_q)
circ.x(n_q)
circ.y(n_q)
circ.z(n_q)
# 클리포트 게이트 : n_q번째 큐빗에 적용
circ.h(n_q)
circ.s(n_q)
circ.sdg(n_q)
circ.t(n_q)
circ.tdg(n_q)
circ.rx(n_q)
circ.ry(n_q)
circ.rz(n_q)
# 컨트롤 및 스왑게이트 : n_q1,n_q2번째 큐빗에 적용
circ.cx(n_q1,n_q2)
circ.cy(n_q1,n_q2)
circ.cz(n_q1,n_q2)
circ.ch(n_q1,n_q2)
circ.swap(n_q1,n_q2)
# 삼중 게이트 : n_q1,n_q2,n_q3번째 큐빗에 적용
circ.ccx(n_q1,n_q2,n_q3)
circ.cswap(n_q1,n_q2,n_q3)
# 특수 게이트
circ.measure(n_q)
circ.reset(n_q)
circ.x(n_q).c_if(n_c,0)
# 배리어 표시
circ.barrier()
ㅂ. Visualizing
양자알고리즘의 결과물은 1024번 반복시행 한후 결과물을 통계 내려서 보여준다. 따라서 히스토그램이 간단한 알고리즘에는 유효하다.
from qiskit.visualization import plot_histogram
counts = result.get_counts()
plot_histogram(counts)
또한, 다음과 같은 방식으로 두가지 실험을 한꺼번에 그릴수도 있다.
legend = ['First execution', 'Second execution']
plot_histogram([counts, second_counts], legend=legend)
마지막으로 다음과 같이 bloch sphere도 그릴수 있다.
from math import sqrt, pi
from qiskit_textbook.widgets import plot_bloch_vector_spherical
coords = [3*pi/4,3*pi/4,1] # [Theta, Phi, Radius]
plot_bloch_vector_spherical(coords) # Bloch Vector with spherical coordinates
지금까지 qiskit을 이용해서 회로를 만드는 법을 간단하게 살펴봤다. 다음 포스팅에서는 qiskit을 이용하여 간단한 알고리즘들을 직접 실험해 볼것이다.
Sutor, R. (2019). Dancing With Qubits. Birmingham,UK:Packt
Bernhardt, C. (2019). Quantum computing for everyone. Boston, Massachusetts:The MIT Press