from qiskit import QuantumCircuit, Aer, execute
= QuantumCircuit(1)
x_gate 0)
x_gate.x(='mpl') x_gate.draw(output
Bramki jednokubitowe
Bramka X
Bramka X-gate reprezentowana jest przez macierz Pauli-X :
\[ X = \begin{pmatrix} 0 & 1 \\ 1 & 0 \\ \end{pmatrix} \]
Bramka X obraca kubit w kierunku osi na sferze Bloch’a o \(\pi\) radianów. Zmienia \(|0\rangle\) na \(|1\rangle\) oraz \(|1\rangle\) na \(|0\rangle\). Jest często nazywana kwantowym odpowiednikiem bramki NOT lub określana jako bit-flip
.
from qiskit.visualization import plot_bloch_multivector
= Aer.get_backend('statevector_simulator')
backend = execute(x_gate, backend).result().get_statevector()
state 'latex')
state.draw( plot_bloch_multivector(state)
= QuantumCircuit(1)
x_gate2 0)
x_gate2.x(0)
x_gate2.x('mpl') x_gate2.draw(
= Aer.get_backend('statevector_simulator')
backend = execute(x_gate2, backend).result().get_statevector()
state 'latex')
state.draw( plot_bloch_multivector(state)
bramka SX
Bramka SX jest pierwiastkiem kwadratowym bramki X. Dwukrotne zastosowanie powinno reazlizowac bramkę X.
\[ SX = \frac{1}{2}\begin{pmatrix} 1+i & 1-i \\ 1-i & 1+i \\ \end{pmatrix} \]
= QuantumCircuit(1)
sx_gate 0)
sx_gate.sx(='mpl') sx_gate.draw(output
= Aer.get_backend('statevector_simulator')
backend = execute(sx_gate, backend).result().get_statevector()
result plot_bloch_multivector(result)
= QuantumCircuit(1)
sx_gate2 0)
sx_gate2.sx(0)
sx_gate2.sx(='mpl') sx_gate2.draw(output
= Aer.get_backend('statevector_simulator')
backend = execute(sx_gate2, backend).result().get_statevector()
result plot_bloch_multivector(result)
Z gate
\[ Z = \begin{pmatrix} 1 & 0 \\ 0 & -1 \\ \end{pmatrix} \]
= QuantumCircuit(1)
z_gate 0)
z_gate.z(='mpl') z_gate.draw(output
= Aer.get_backend('statevector_simulator')
backend = execute(z_gate, backend).result().get_statevector()
result plot_bloch_multivector(result)
RZ gate
\[ RZ = \begin{pmatrix} 1 & 0 \\ 0 & e ^{i \phi } \\ \end{pmatrix} \]
import numpy as np
= np.pi
pi = QuantumCircuit(1)
rz_gate /2, 0)
rz_gate.rz(pi='mpl') rz_gate.draw(output
= Aer.get_backend('statevector_simulator')
backend = execute(rz_gate, backend).result().get_statevector()
result plot_bloch_multivector(result)
= QuantumCircuit(1)
rz_gate2 0)
rz_gate2.sx(/2, 0)
rz_gate2.rz(pi='mpl') rz_gate2.draw(output
= Aer.get_backend('statevector_simulator')
backend = execute(rz_gate2, backend).result().get_statevector()
result plot_bloch_multivector(result)
Hadamard gate
Bramka Hadamarda przetwarza stan \(|0\rangle\) na kombinacje liniowa (superpozycje) \(\frac{|0\rangle + |1\rangle}{\sqrt{2}}\), co oznacza, że pomiar zwróci z takim samym prawdopodobieństwem stanu 1
lub 0
. Stan ten często oznaczany jest jako: \(|+\rangle\).
\[ H = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \\ 1 & -1 \\ \end{pmatrix} \]
= QuantumCircuit(1)
h_gate 0)
h_gate.h(='mpl') h_gate.draw(output
= Aer.get_backend('statevector_simulator')
backend = execute(h_gate, backend).result().get_statevector()
result plot_bloch_multivector(result)
= QuantumCircuit(1)
h_gate2 0)
h_gate2.h(0)
h_gate2.h('mpl') h_gate2.draw(
= Aer.get_backend('statevector_simulator')
backend = execute(h_gate2, backend).result().get_statevector()
state 'latex'))
display(state.draw( plot_bloch_multivector(state)
\[ |0\rangle\]
Bramka parametryzowana Ry
\[ R(\alpha) = \begin{pmatrix} \cos{\alpha} & -\sin{\alpha}\\ \sin{\alpha} & \cos{\alpha} \\ \end{pmatrix} \]
= QuantumCircuit(1)
ry_gate = np.pi
pi /2,0)
ry_gate.ry(pi='mpl') ry_gate.draw(output
= Aer.get_backend('statevector_simulator')
backend = execute(ry_gate, backend).result().get_statevector()
result plot_bloch_multivector(result)
CX gate (CNOT gate)
The controlled NOT (or CNOT or CX) gate acts on two qubits. It performs the NOT operation (equivalent to applying an X gate) on the second qubit only when the first qubit is \(\ket{1}\) and otherwise leaves it unchanged.
Note: Qiskit numbers the bits in a string from right to left.
\[ CX = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ \end{pmatrix} \]
= QuantumCircuit(2)
cx_gate 0,1)
cx_gate.cx(='mpl') cx_gate.draw(output
Zadanie 1 - Sprawdź działanie bramki - CZ na dwukubitowym układzie. Następnie zbuduj drugi obwód złożony z bramek: H(1) (na drugim kubicie) CX(0,1) i H(1) - co możesz zaobserwować?
Zadanie 2 - zbuduj obwod kwantowy złożony z 10 kubitów, zastosuj bramkę H(0) do kubitu 0 i 9 bramek CNOT gdzie kubitem kontrolnym jest kubit 0 a targety to kubity od 1 do 9. Mozesz uzyć do pętli albo listy.
Zadanie 3 - zbuduj obwod kwantowy złożony z 10 kubitów. Zastosuj bramkę H do całego rejestru kwantowego.Następnie dodaj bramkę CNOT gdzie kubitami kontrolnymi sa kubity 1-9 a target to kubit 0. Następnie dodaj bramkę H do każdego kubitu.
Przydatne definicje dla obwodów
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
= QuantumRegister(10)
q = ClassicalRegister(10)
c = QuantumCircuit(q,c)
ci
ci.h(q)'mpl') ci.draw(
# CCCH gate
from qiskit.circuit.library.standard_gates import HGate
= HGate().control(3)
CCCH
0,1,3,2])
ci.append(CCCH, ['mpl') ci.draw(