키스킷 시작하기

키스킷을 이용하는 작업흐름은 다음의 세가지 높은 수준의 단계로 이루어져있다:

  • 빌드: 고려중인 문제를 나타내는 양자 회로의 설계.

  • 실행: 다양한 후위 처리 장치를 통해 실험 실행하기 (여기에는 시스템과 시뮬레이터가 포함된다).

  • 분석: 요약한 통계를 계산하고 실험 결과를 가시화.

다음 항목에서 자세한 설명과 함께 각각의 단계와 전체 작업 흐름을 보여주는 예제가 있다:

import numpy as np
from qiskit import(
  QuantumCircuit,
  execute,
  Aer)
from qiskit.visualization import plot_histogram

# Use Aer's qasm_simulator
simulator = Aer.get_backend('qasm_simulator')

# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(2, 2)

# Add a H gate on qubit 0
circuit.h(0)

# Add a CX (CNOT) gate on control qubit 0 and target qubit 1
circuit.cx(0, 1)

# Map the quantum measurement to the classical bits
circuit.measure([0,1], [0,1])

# Execute the circuit on the qasm simulator
job = execute(circuit, simulator, shots=1000)

# Grab results from the job
result = job.result()

# Returns counts
counts = result.get_counts(circuit)
print("\nTotal count for 00 and 11 are:",counts)

# Draw the circuit
circuit.draw()

Total count for 00 and 11 are: {'00': 502, '11': 498}
     ┌───┐     ┌─┐   
q_0: ┤ H ├──■──┤M├───
     └───┘┌─┴─┐└╥┘┌─┐
q_1: ─────┤ X ├─╫─┤M├
          └───┘ ║ └╥┘
c: 2/═══════════╩══╩═
                0  1 
# Plot a histogram
plot_histogram(counts)
_images/getting_started_1_0.png

순차적 작업 흐름

위의 프로그램은 다음의 여섯 단계로 나누어 질 수 있다:

  1. 패키지 가져오기

  2. 변수 초기화

  3. 게이트 추가하기

  4. 회로 가시화하기

  5. 실험 시뮬레이션 하기

  6. 결과를 가시화하기

1단계: 패키지 가져오기

프로그램에 필요한 기본적인 요소들은 다음과 같이 가져올 수 있다:

import numpy as np
from qiskit import(
  QuantumCircuit,
  execute,
  Aer)
from qiskit.visualization import plot_histogram

좀 더 자세하게, 가져올 패키지는

  • QuantumCircuit: 양자 시스템의 설명서로 생각할 수 있다. 여기에는 모든 양자 연산을 포함된다.

  • execute: 회로를 실행하고, 실험을 실행한다.

  • 아르(Aer): 시뮬레이터 후위 처리장치를 다룬다.

  • plot_histogram: 히스토그램을 생성한다.

2단계: 변수 초기화하기

다음 코드를 살펴보자

circuit = QuantumCircuit(2, 2)

여기 2개의 큐비트를 0으로 초기화하고, 2개의 고전적인 비트를 0으로 초기화 하는 경우를 생각해 보자. ``circuit``은 양자 회로를 말한다.

문법:

  • QuantumCircuit(int, int)

3단계: 게이트를 추가하기

회로의 레지스터를 조작하기 위한 게이트 (연산) 을 추가할 수 있다.

다음 세 줄의 코드를 보자:

circuit.h(0)
circuit.cx(0, 1)
circuit.measure([0,1], [0,1])

게이트들은 벨 상태를 형성하기 위해 하나씩 회로에 추가될 수 있다

\[|\psi\rangle = \left(|00\rangle+|11\rangle\right)/\sqrt{2}.\]

위의 코드는 다음의 게이트들에 적용된다:

  • QuantumCircuit.h(0): 하다마드 게이트 \(H\) 큐비트 0에 작용해서 그것을 **중첩 상태**로 만든다.

  • QuantumCircuit.cx(0, 1): 제어된 부정 연산 (\(C_{X}\)) 제어 큐비트 0, 목적 큐비트 1, 결과적으로 큐비트들을 **얽힘 상태**로 만든다.

  • QuantumCircuit.measure([0,1], [0,1]): 만약 전체 양자 및 고전 레지스터를 ``측정``한다면, i 번째 큐비트의 측정 결과는 i 번째 고전 비트에 저장될 것이다.

4단계: 회로 시각화하기

다음 명령어 ``QuantumCircuit.draw()``를 통해 당신이 디자인한 양자 회로들을 많은 교과서나 연구 논문에서 인용된 `다양한 포맷 <api/qiskit.circuit.QuantumCircuit.html#qiskit.circuit.QuantumCircuit.draw>`으로 볼 수 있다.

circuit.draw()
     ┌───┐     ┌─┐   
q_0: ┤ H ├──■──┤M├───
     └───┘┌─┴─┐└╥┘┌─┐
q_1: ─────┤ X ├─╫─┤M├
          └───┘ ║ └╥┘
c: 2/═══════════╩══╩═
                0  1 

이 회로에서는 큐비트들이 0 큐비트은 위쪽에 1 큐비트은 아래쪽에 놓이도록 순서가 정해져 있다. 회로는 왼쪽에서 오른쪽으로 읽혀지는데, 이것은 가장 왼쪽의 게이트들이 회로에서 먼저 적용된다는 것을 의미한다.

QuantumCircuit.draw() 이나 qiskit.visualization.circuit_drawer() 에 사용되는 기본 후위 처리 장치는 문자 후위 처리 장치이다. 그러나 사용되어지는 지역 환경에 따라서, 당신은 필요에 맞는 좀 더 적절한 후위 처리 장치를 기본으로 설정할 수 있다. 이러한 설정은 사용자 환경 파일에서 변경될 수 있는데, 기본으로 사용자 설정 파일은 ~/.qiskit/settings.conf 디렉토리에 저장되어 있고 .ini 를 확장자로 가진 파일들이다.

예를 들어 settings.conf 파일은 Matplotlib를 설정:

[default]
circuit_drawer = mpl

이 설정의 값으로 유효한 회로 그리기 후위 처리 장치를 사용할 수 있고, 여기서 값은 text, mpl, latex, latex_source를 포함한다.

5단계: 실험을 시뮬레이션 하기

키스킷 아르는 양자 회로를 위한 고성능 시뮬레이터 프레임워크이다. 이는 여러 다양한 시뮬레이션 목적을 이루기 위해서 `여러 후위 처리 장치 <apidoc/providers/aer/aer_backends.html>`를 제공한다.

만약 아르를 설치하는데 문제가 발생한다면, `BasicAer`를 `Aer`로 교체함으로서 기본 아르를 사용해 볼 수 있다. 기본 아르는 키스킷 테라에 포함되어 있다.

import numpy as np
from qiskit import(
  QuantumCircuit,
  execute,
  BasicAer)
...

이 회로를 시뮬레이션 하기 위해 qasm_simulator 명령어를 사용해 볼 수 있다. 각각의 회로 시뮬레이션 결과는 00 혹은 11의 비트 문자열을 보여줄 것이다.

simulator = Aer.get_backend('qasm_simulator')
job = execute(circuit, simulator, shots=1000)
result = job.result()
counts = result.get_counts(circuit)
print("\nTotal count for 00 and 11 are:",counts)

Total count for 00 and 11 are: {'00': 505, '11': 495}

예상할 수 있듯이 출력 비트 문자열은 대략 50 퍼센트의 확율로 00일 것이다. 회로가 몇 번 실행될 것인가는 execute 함수에 shots 전달인자를 어떻게 정하느냐에 따라 달라진다. 시뮬레이션을 몇 번 실행할 것인지는 1000번으로 설정되었다 (기본값은 1024번이다).

result 객체를 얻은 후에는 이러한 시뮬레이션 횟수를 get_counts(circuit) 함수를 통해 접근할 수 있다. 이를 통해서 지금까지 실행했던 시뮬레이션의 결과들을 모두 합친 값을 제공한다.

6단계: 결과 시각화하기

키스킷은 많은 `시각화 방법<apidoc/visualization.html>`__을 제공한다.

이는 결과를 보여주기 위한 plot_histogram 함수를 포함한다.

plot_histogram(counts)
_images/getting_started_4_0.png

관찰 확률 \(Pr(00)\)\(Pr(11)\) 은 상대적으로 나타난 각각의 경우의 수를 전체 시뮬레이션 횟수로 나누어 계산된다.

참고

execute 함수의 shots 전달 인자를 바꿔서 입력해 보고 각각의 경우에 따라 예상되는 확률이 어떻게 변하는 지를 확인해 보라.

다음 단계들

이제 여러분은 기본적인 것들을 다 배웠습니다. 다음의 학습 자료를 참고하세요.