์์์ปดํจํฐ, ๋ญ๊ฐ ์์ฒญ ๋ฉ์์ด ๋ณด์ด๋๋ฐ ๋ง์ ์์ํ๋ ค๋ ์๋๊ฐ ์ ๋๋ค๊ตฌ์? ๐ฅ ์ต์ฒจ๋จ ๊ธฐ์ ๋์น ๊น ๋ถ์ํ ๋น์ ์ ์ํด ์ค๋นํ์ด์! Cirq๋ง ์๋ค๋ฉด ๋น์ ๋ ์์์ปดํจํ ์ ๋ฌธ๊ฐ๐! ์ง๊ธ ๋ฐ๋ก ๋๋ง์ ์์ ๊ฒ์ดํธ๋ฅผ ๋ง๋ค๊ณ ํ๋ก๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์์๋ด์! ๋ฆ์ผ๋ฉด ํํํ ์ง๋ ๋ชฐ๋ผ์ ๐
โจํต์ฌ ์์ฝ 3๊ฐ์งโจ
- ๋๋ง์ ์์ ๊ฒ์ดํธ ๋ง๋ค๊ธฐ ๐ ๏ธ
- Cirq ์ปดํ์ผ๋ฌ๋ก ์์ ํ๋ก ์ต์ ํ โ๏ธ
- ์์ ํ๋ก ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ ํ๊ตฌ ๐
Cirq, ๋ ๋์ฒด ๋ญ๋? ๐ค
Cirq๋ ๊ตฌ๊ธ์์ ๋ง๋ ์คํ ์์ค ์์ ์ปดํจํ ํ๋ ์์ํฌ์์. ํ์ด์ฌ ๊ธฐ๋ฐ์ด๋ผ ๋ฐฐ์ฐ๊ธฐ ์ฝ๊ณ , ์์ ํ๋ก ์ค๊ณ, ์๋ฎฌ๋ ์ด์ , ์ค์ ์์ ํ๋์จ์ด ์ฐ๋๊น์ง ์ง์ํ๋ ์์ฃผ ๋๋ํ ์น๊ตฌ์ฃ ! ๐ค ๋ณต์กํ ์์ ์๊ณ ๋ฆฌ์ฆ๋ Cirq๋ง ์์ผ๋ฉด ๋ ๊ณ ๋ธ๋ก ์๋ฏ์ด ์ฝ๊ฒ ๊ตฌํํ ์ ์์ด์.
๋๋ง์ ๊ฒ์ดํธ ๋ง๋ค๊ธฐ! ๐ช
์์ ๊ฒ์ดํธ๋ ์์ ํ๋ก์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์์์. ๊ธฐ์กด์ ์ ๊ณต๋๋ ๊ฒ์ดํธ ์ธ์ ํน๋ณํ ์ฐ์ฐ์ ์ํํ๋ ๋๋ง์ ๊ฒ์ดํธ๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๋๊ฐ ์๊ฒ ์ฃ ? Cirq์์๋ ๊ฐ๋จํ๊ฒ ์ฌ์ฉ์ ์ ์ ๊ฒ์ดํธ๋ฅผ ๋ง๋ค ์ ์์ด์!
1๋จ๊ณ: ๊ฒ์ดํธ ํด๋์ค ์ ์
๋จผ์ cirq.Gate
๋ฅผ ์์๋ฐ์ ์๋ก์ด ํด๋์ค๋ฅผ ์ ์ํด์ผ ํด์. ํด๋์ค ์ด๋ฆ์ ์ํ๋ ๋๋ก ์ง์ผ๋ฉด ๋์ง๋ง, ๊ฒ์ดํธ์ ์ญํ ์ ์ ๋ํ๋ด๋ ์ด๋ฆ์ผ๋ก ํ๋ ๊ฒ ์ข๊ฒ ์ฃ ? ๐ก
import cirq
class MyCustomGate(cirq.Gate):
def __init__(self, parameter):
self.parameter = parameter
def _num_qubits_(self):
return 1
def _unitary_(self):
# ๊ฒ์ดํธ์ ์ ๋ํ๋ฆฌ ํ๋ ฌ ์ ์
return ... # ํ๋ ฌ ๊ฐ ์ฑ์ฐ๊ธฐ
def _circuit_diagram_info_(self, args):
return "MyGate"
_num_qubits_
๋ฉ์๋๋ ๊ฒ์ดํธ๊ฐ ๋ช ๊ฐ์ ํ๋นํธ์ ์์ฉํ๋์ง ์ ์ํ๊ณ , _unitary_
๋ฉ์๋๋ ๊ฒ์ดํธ์ ๋์์ ๋ํ๋ด๋ ์ ๋ํ๋ฆฌ ํ๋ ฌ์ ์ ์ํด์. _circuit_diagram_info_
๋ฉ์๋๋ ํ๋ก๋์์ ๊ฒ์ดํธ๋ฅผ ์ด๋ป๊ฒ ํ์ํ ์ง ๊ฒฐ์ ํ์ฃ .
2๋จ๊ณ: ์ ๋ํ๋ฆฌ ํ๋ ฌ ์ ์
์ ๋ํ๋ฆฌ ํ๋ ฌ์ ๊ฒ์ดํธ์ ํต์ฌ! ๐ ๊ฒ์ดํธ๊ฐ ํ๋นํธ์ ์ํ๋ฅผ ์ด๋ป๊ฒ ๋ณํ์ํค๋์ง ์ํ์ ์ผ๋ก ํํํ๋ ๊ฑฐ์์. ๋ณต์กํด ๋ณด์ด์ง๋ง, ๋ํ์ด(NumPy)๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ๋ง๋ค ์ ์์ด์.
import numpy as np
def _unitary_(self):
return np.array([[np.cos(self.parameter), -np.sin(self.parameter)],
[np.sin(self.parameter), np.cos(self.parameter)]])
3๋จ๊ณ: ๊ฒ์ดํธ ์ฌ์ฉ
์ด์ ๋ง๋ ๊ฒ์ดํธ๋ฅผ ํ๋ก์ ์ถ๊ฐํด ๋ณผ๊น์? ํ๋นํธ๋ฅผ ๋ง๋ค๊ณ , ๊ฒ์ดํธ๋ฅผ ์ ์ฉํ๋ฉด ๋! ์ฐธ ์ฝ์ฃ ? ๐
q = cirq.LineQubit(0)
my_gate = MyCustomGate(parameter=0.1)
circuit = cirq.Circuit(my_gate(q))
print(circuit)
์ฃผ์์ฌํญ ๐จ: ์ฌ์ฉ์ ์ ์ ๊ฒ์ดํธ๋ ์์ ํ๋ก ์๋ฎฌ๋ ์ด์ ๋ฐ ์ค์ ์์ ํ๋์จ์ด ๊ตฌํ์ ์ด๋ ค์์ ์ด๋ํ ์ ์์ด์. ์ ๋ํ๋ฆฌ ํ๋ ฌ์ ์ ํํ๊ฒ ์ ์ํ๊ณ , ํ๋์จ์ด ํธํ์ฑ์ ๊ณ ๋ คํด์ผ ํด์!
์ปดํ์ผ๋ฌ, ํ๋ก๋ฅผ ๋๋ํ๊ฒ! ๐ง
์์ ํ๋ก๋ฅผ ์ค์ ์์ ์ปดํจํฐ์์ ์คํํ๋ ค๋ฉด, ํ๋์จ์ด์ ๋ง๊ฒ ์ต์ ํํด์ผ ํด์. ์ด๋ ํ์ํ ๊ฒ ๋ฐ๋ก ์์ ํ๋ก ์ปดํ์ผ๋ฌ! Cirq๋ ๋ค์ํ ์ปดํ์ผ๋ฌ๋ฅผ ์ ๊ณตํด์, ํ๋ก๋ฅผ ์ฒ์ฒ ์์์ ์ต์ ํํด ์ค๋ต๋๋ค. โจ
1๋จ๊ณ: ์ปดํ์ผ๋ฌ ์ ํ
Cirq์๋ ์ฌ๋ฌ ์ข ๋ฅ์ ์ปดํ์ผ๋ฌ๊ฐ ์์ด์. ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์์ผ๋, ์ํฉ์ ๋ง๊ฒ ์ ํํด์ผ๊ฒ ์ฃ ?
์ปดํ์ผ๋ฌ | ํน์ง | ์ฅ์ | ๋จ์ |
---|---|---|---|
cirq.optimize_for_target_gateset | ํน์ ๊ฒ์ดํธ ์ธํธ์ ๋ง์ถฐ ์ต์ ํ | ๋ฒ์ฉ์ , ๋ค์ํ ๊ฒ์ดํธ ์ธํธ ์ง์ | ์ต์ ํ ์์ค์ด ๋์ง ์์ ์ ์์ |
cirq.merge_single_qubit_gates | ๋จ์ผ ํ๋นํธ ๊ฒ์ดํธ๋ค์ ๋ณํฉ | ํ๋ก์ ๊ฒ์ดํธ ์๋ฅผ ์ค์ฌ ์คํ ์๊ฐ ๋จ์ถ | ๋ค์ค ํ๋นํธ ๊ฒ์ดํธ์๋ ์ ์ฉ ๋ถ๊ฐ |
cirq.drop_negligible_operations | ๋ฌด์ํ ์ ์๋ ์์ ๊ฐ๋์ ํ์ ๊ฒ์ดํธ ์ ๊ฑฐ | ํ๋ก ๋จ์ํ, ๋ ธ์ด์ฆ ๊ฐ์ ํจ๊ณผ | ์ ํ๋ ๊ฐ์ ๊ฐ๋ฅ์ฑ |
2๋จ๊ณ: ์ปดํ์ผ๋ฌ ์ ์ฉ
์ ํํ ์ปดํ์ผ๋ฌ๋ฅผ ํ๋ก์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์ฃผ ๊ฐ๋จํด์. cirq.optimize_for_target_gateset
ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ฃ .
import cirq
# ํ๋ก ์์ฑ
q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
cirq.H(q0),
cirq.CNOT(q0, q1),
cirq.T(q0),
cirq.H(q0),
cirq.CNOT(q0, q1)
)
# ์ปดํ์ผ๋ฌ ์ ์ฉ (์: Google 5-qubit gate set)
optimized_circuit = cirq.optimize_for_target_gateset(
circuit,
target_gateset=cirq.google.optimized_for_xmon
)
print("Original circuit:")
print(circuit)
print("nOptimized circuit:")
print(optimized_circuit)
3๋จ๊ณ: ๊ฒฐ๊ณผ ํ์ธ
์ปดํ์ผ๋ฌ๋ฅผ ์ ์ฉํ๊ธฐ ์ ๊ณผ ํ์ ํ๋ก๋ฅผ ๋น๊ตํด ๋ณด์ธ์. ๊ฒ์ดํธ ์๊ฐ ์ค์ด๋ค๊ฑฐ๋, ํ๋์จ์ด์ ๋ ์ ํฉํ ํํ๋ก ๋ฐ๋ ๊ฒ์ ํ์ธํ ์ ์์ ๊ฑฐ์์. ๐
์ฃผ์์ฌํญ ๐จ: ์ปดํ์ผ๋ฌ๋ ํ๋์จ์ด ํน์ฑ์ ๋ฐ๋ผ ์ต์ ํ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์์ด์. ํน์ ํ๋์จ์ด์ ์ต์ ํ๋ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ์ง์ ์ปดํ์ผ๋ฌ๋ฅผ ๊ฐ๋ฐํด์ผ ํ ์๋ ์์ฃ .
๋๋ง์ ์ปดํ์ผ๋ฌ ๋ง๋ค๊ธฐ! ๐ ๏ธ
Cirq๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ๋๋ก๋ ๋๋ง์ ํน๋ณํ ์ต์ ํ ์ ๋ต์ด ํ์ํ ๋๊ฐ ์์ด์. ์ด๋ด ๋ ์ง์ ์ปดํ์ผ๋ฌ๋ฅผ ๋ง๋ค ์๋ ์๋ต๋๋ค!
1๋จ๊ณ: ๋ณํ ๊ท์น ์ ์
์ปดํ์ผ๋ฌ๋ ๊ฒฐ๊ตญ ํ๋ก๋ฅผ ๋ณํํ๋ ๊ท์น๋ค์ ์งํฉ์ด์์. ์ด๋ค ๊ฒ์ดํธ๋ฅผ ์ด๋ค ๊ฒ์ดํธ๋ก ๋ฐ๊ฟ์ง, ์ด๋ค ์์๋ก ์ ์ฉํ ์ง ๋ฑ์ ์ ์ํด์ผ ํ์ฃ .
2๋จ๊ณ: ๋ณํ ์์ง ๊ตฌํ
Cirq๋ ๋ณํ ๊ท์น์ ํ๋ก์ ์ ์ฉํ๋ ์์ง์ ์ ๊ณตํด์. ์ด ์์ง์ ์ฌ์ฉํด์ ๋๋ง์ ์ปดํ์ผ๋ฌ๋ฅผ ๊ตฌํํ ์ ์์ฃ .
3๋จ๊ณ: ํ ์คํธ ๋ฐ ๊ฐ์
๋ง๋ ์ปดํ์ผ๋ฌ๋ฅผ ๋ค์ํ ํ๋ก์ ์ ์ฉํด ๋ณด๊ณ , ์ฑ๋ฅ์ ์ธก์ ํด์ ๊ฐ์ ํด ๋๊ฐ์ผ ํด์. ๋๊ธฐ์ ๋ ธ๋ ฅ์ด ํ์ํ์ง๋ง, ๊ทธ๋งํผ ๋ณด๋๋ ํฌ๊ฒ ์ฃ ? ๐ช
ํ๊ธฐ & ์ฌ๋ก ๐
Cirq๋ฅผ ์ฌ์ฉํด์ ๋๋ง์ ์์ ๊ฒ์ดํธ๋ฅผ ๋ง๋ค๊ณ , ์ปดํ์ผ๋ฌ๋ฅผ ํ์ฉํด์ ํ๋ก๋ฅผ ์ต์ ํํ ์ฌ๋ก๋ ๋ฌด๊ถ๋ฌด์งํด์.
- ์ ์ฝ ๊ฐ๋ฐ: ์๋ก์ด ๋ถ์ ์๋ฎฌ๋ ์ด์ ์ ์ํ ์ฌ์ฉ์ ์ ์ ๊ฒ์ดํธ ๊ฐ๋ฐ ๐
- ๊ธ์ต ๋ชจ๋ธ๋ง: ๋ณต์กํ ๊ธ์ต ํ์์ํ ๊ฐ๊ฒฉ ๊ฒฐ์ ์ ์ํ ์์ ํ๋ก ์ต์ ํ ๐ฐ
- ๋จธ์ ๋ฌ๋: ์์ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ํ์ต ์๋ ํฅ์์ ์ํ ์ปดํ์ผ๋ฌ ๊ฐ๋ฐ ๐ค
๋ ๊น์ด ํ๊ณ ๋ค๊ธฐ! ๐
- ์์ ํ๋ก ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ: ๋์ฑ ํจ์จ์ ์ธ ์ต์ ํ๋ฅผ ์ํ ์๋ก์ด ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ฐ ๐
- ์์ ์ค๋ฅ ์์ : ์์ ์ปดํจํฐ์ ์ค๋ฅ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํ ์ฐ๊ตฌ ๐ก๏ธ
- ์์ ์ด๋๋ง: ์ต์ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๋ก์ด ์ ๊ทผ ๋ฐฉ์ โจ๏ธ
- ์ค์ ์์ ํ๋์จ์ด: Cirq๋ฅผ ์ฌ์ฉํด์ ์ค์ ์์ ์ปดํจํฐ ์ ์ดํ๊ธฐ โ๏ธ
- ์์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด: Cirq๋ฅผ ๋์ด์๋ ์๋ก์ด ์์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ํ๊ตฌ ๐ฃ๏ธ
์ปจํ ์ธ ์ฐ์ฅ โ
์์ ์๋ฎฌ๋ ์ด์ , ํ์ค์ฒ๋ผ! ๐ฅ๏ธ
Cirq๋ ์์ ํ๋ก ์๋ฎฌ๋ ์ด์ ์ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํด์. ๋ ธ์ด์ฆ ๋ชจ๋ธ์ ์ ์ฉํด์ ์ค์ ์์ ํ๋์จ์ด์ ์ ์ฌํ ํ๊ฒฝ์ ๋ง๋ค ์๋ ์์ฃ .
import cirq
# ๋
ธ์ด์ฆ ๋ชจ๋ธ ์ ์ (์: depolarization noise)
noise_model = cirq.depolarize(p=0.01)
# ํ๋ก ์์ฑ
q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
cirq.H(q0),
cirq.CNOT(q0, q1),
cirq.measure(q0, q1, key='result')
)
# ์๋ฎฌ๋ ์ดํฐ ์์ฑ ๋ฐ ๋
ธ์ด์ฆ ๋ชจ๋ธ ์ ์ฉ
simulator = cirq.Simulator(noise=noise_model)
# ์๋ฎฌ๋ ์ด์
์คํ
result = simulator.run(circuit, repetitions=1000)
print(result.histogram(key='result'))
์์-๊ณ ์ ํ์ด๋ธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ ๐ค
์์ ์ปดํจํฐ์ ๊ณ ์ ์ปดํจํฐ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ํ์ด๋ธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ต๊ทผ ๊ฐ๊ด๋ฐ๊ณ ์์ด์. Cirq๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ฃ .
import cirq
import numpy as np
# ์์ ํ๋ก ์ ์ (์: variational quantum eigensolver)
def create_vqe_circuit(qubits, parameters):
circuit = cirq.Circuit()
# ํ๋ผ๋ฏธํฐํ๋ ํ๋ก ๊ตฌ์ฑ
return circuit
# ๋น์ฉ ํจ์ ์ ์
def cost_function(parameters):
# ์์ ํ๋ก ์คํ ๋ฐ ๊ฒฐ๊ณผ ๋ถ์
return cost
# ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ (์: COBYLA)
import scipy.optimize
result = scipy.optimize.minimize(cost_function, initial_parameters, method='COBYLA')
ํ ์ ๋คํธ์ํฌ, ๋ณต์กํ ํ๋ก ์ ๋ณต! ๐ธ๏ธ
ํ ์ ๋คํธ์ํฌ๋ ๋ณต์กํ ์์ ํ๋ก๋ฅผ ํจ์จ์ ์ผ๋ก ํํํ๊ณ ์๋ฎฌ๋ ์ด์ ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์์. Cirq์ ํ ์ ๋คํธ์ํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด, ๋์ฑ ๋ฐฉ๋ํ ๊ท๋ชจ์ ์์ ์์คํ ์ ๋ค๋ฃฐ ์ ์์ฃ .
์์ ๊ธฐ๊ณ ํ์ต, ๊ฟ์ ํ์ค๋ก! โจ
Cirq๋ ์์ ๊ธฐ๊ณ ํ์ต ์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ฐ์ ์ํ ๋ค์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํด์. ์์ ์ ๊ฒฝ๋ง, ์์ ์ํฌํธ ๋ฒกํฐ ๋จธ์ ๋ฑ ์ต์ฒจ๋จ ์๊ณ ๋ฆฌ์ฆ์ Cirq๋ก ๊ตฌํํด ๋ณด์ธ์.
ํด๋ผ์ฐ๋ ์์ ์ปดํจํ , ์ ์์ ์์ ์ปดํจํฐ! โ๏ธ
Cirq๋ ๊ตฌ๊ธ, IBM ๋ฑ ๋ค์ํ ํด๋ผ์ฐ๋ ์์ ์ปดํจํ ํ๋ซํผ๊ณผ ์ฐ๋๋ผ์. Cirq๋ฅผ ์ฌ์ฉํด์ ํด๋ผ์ฐ๋ ์์ ์ค์ ์์ ์ปดํจํฐ๋ฅผ ์ ์ดํ๊ณ , ์์ ์๊ณ ๋ฆฌ์ฆ์ ์คํํด ๋ณด์ธ์.
Cirq ๊ธ์ ๋ง์น๋ฉฐโฆ ๐ฌ
์, ์ด๋ ๊ฒ ํด์ Cirq์ ๊ณ ๊ธ ๊ธฐ๋ฅ, ์ฌ์ฉ์ ์ ์ ์์ ๊ฒ์ดํธ, ์์ ํ๋ก ์ปดํ์ผ๋ฌ์ ๋ํด ์์๋ดค์ด์. ์ด๋์? ์์์ปดํจํ , ์๊ฐ๋ณด๋ค ์ด๋ ต์ง ์์ฃ ? ๐
Cirq๋ ์์์ปดํจํ ์ ์ธ๊ณ๋ก ํฅํ๋ ํ๋ฅญํ ๋๊ตฌ์์. ์ด ๊ธ์ด ์ฌ๋ฌ๋ถ์ ์ฌ์ ์ ์กฐ๊ธ์ด๋๋ง ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋ผ์. ๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ๋๊ธ๋ก ์ง๋ฌธํด์ฃผ์ธ์! ๐
์์์ปดํจํ ์ ๋ฏธ๋๋ ์ฌ๋ฌ๋ถ์ ์์ ๋ฌ๋ ค ์์ด์! Cirq์ ํจ๊ป ๋ฉ์ง ์์ ์ธ์์ ๋ง๋ค์ด ๋๊ฐ๋ด์! ๐๐
Cirq ๊ด๋ จ ๋์์








Cirq ๊ด๋ จ ์ํ๊ฒ์