Lab 02 — Quantum gates से मिलिए
Lab 01 में एक qubit ने वह किया जो कोई classical bit नहीं कर सकता। इस lab में आप उन tools से मिलेंगे जिनसे यह होता है: quantum gates। आप ऐसे phases को flip करेंगे जो counts में दिखते ही नहीं, qubit को अपनी मर्ज़ी के angle पर rotate करेंगे, और आखिर में 2 qubits को इतना entangle करेंगे कि वे हमेशा एक-दूसरे से agree करें।
अपनी lab जगाएँ
Lab 01 की हर चीज़ आपकी machine पर अभी भी है। Environment दोबारा activate करें और confirm करें कि quantum stack अभी भी जवाब देता है:
conda activate qc-lab # prompt में (qc-lab) दिखना चाहिए
import qiskit print(qiskit.__version__)
2.x जैसा version print हो। आज कोई reinstall नहीं — सीधे gates पर चलते हैं।conda न मिले, तो Lab 01 के steps 1–4 छूट गए थे — पहले उन्हें पूरा करें।State खुद देखें: Statevector
Measurement counts बताते हैं कि qubit measure क्या हुआ। Statevector बताता है कि qubit असल में है क्या — वह भी जो measurement देख नहीं सकता। इसके लिए बिना measurement वाला circuit चाहिए:
from qiskit import QuantumCircuit from qiskit.quantum_info import Statevector from qiskit_aer import AerSimulator sim = AerSimulator() qc = QuantumCircuit(1) qc.x(0) sv = Statevector(qc) print(sv.to_dict())
{'1': (1+0j)} — qubit है ही |1⟩, इसीलिए वह हमेशा measure 1 होता है। एक ही सच्चाई के 2 नज़रिए: counts outcomes दिखाते हैं, statevector state दिखाता है।Z gate: अदृश्य flip
Z gate |1⟩ का phase flip करता है: |1⟩ बन जाता है −|1⟩, और |0⟩ को छूता तक नहीं। देखें दोनों नज़रिए क्या कहते हैं:
qc = QuantumCircuit(1) qc.x(0) qc.z(0) # |1> का phase flip करें print(Statevector(qc).to_dict())
qc2 = QuantumCircuit(1, 1) qc2.x(0) qc2.z(0) qc2.measure(0, 0) print(sim.run(qc2, shots=1000).result().get_counts())
{'1': (-1+0j)} — minus sign सच में है — फिर भी counts {'1': 1000} ही दिखाते हैं। Measurement phase के प्रति अंधा है। Phase तभी दिखता है जब states interfere करें — और अगले steps में हम इसी का फायदा उठाएँगे।Y gate: twist के साथ flip
Y gate दोनों काम एक साथ करता है — |0⟩ को |1⟩ में flip करता है और phase भी जोड़ता है:
qc = QuantumCircuit(1) qc.y(0) print(Statevector(qc).to_dict())
{'1': 1j} — qubit flip भी हुआ (यह |1⟩ है) और imaginary phase भी मिला। Counts फिर भी boring {'1': 1000} ही होंगे, क्योंकि — मेरे साथ बोलें — measurement phase नहीं देख सकता।S और T: flip के fractions
Phases fractions में भी आते हैं। S, Z का square root है — 2 बार लगाएँ तो Z मिलता है। T, S का square root है:
qc = QuantumCircuit(1) qc.x(0) qc.s(0) qc.s(0) # S 2 बार = Z print(Statevector(qc).to_dict())
qc2 = QuantumCircuit(1) qc2.x(0) qc2.t(0) qc2.t(0) # T 2 बार = S print(Statevector(qc2).to_dict())
{'1': (-1+0j)} print करता है (यह Z है), दूसरा {'1': 1j} (यह S है)। Gates के square roots होते हैं — quantum control सिर्फ on/off से कहीं बारीक है।आपकी बारी: HZH = X
यह एक मशहूर identity है: 2 Hadamards के बीच लगा Z gate बिल्कुल X gate जैसा behave करता है। चलाने से पहले — ज़ोर से predict करें कि counts क्या आएँगे:
qc = QuantumCircuit(1, 1) qc.h(0) qc.z(0) qc.h(0) qc.measure(0, 0) print(sim.run(qc, shots=1000).result().get_counts())
{'1': 1000} — HZH ने |0⟩ को |1⟩ में flip किया, बिल्कुल X जैसा। क्यों काम करता है: Hadamards basis बदल देते हैं, जिससे phase-flip bit-flip बन जाता है। आपने अभी जानबूझकर interference use किया — वह चीज़ जो measurement देख नहीं सकता था, अब visible काम कर रही है।Rotation gates: जो angle चाहें
Gates सिर्फ fixed flips तक सीमित नहीं। RY(θ) qubit को आपकी मर्ज़ी के angle θ पर rotate करता है — switch नहीं, dial है। Half-turn का आधा H जैसा behave करता है:
import math qc = QuantumCircuit(1, 1) qc.ry(math.pi/2, 0) # 90-degree rotation qc.measure(0, 0) print(sim.run(qc, shots=1000).result().get_counts())
अब इसे 45 degrees पर लाएँ और bias को खुद देखें:
qc2 = QuantumCircuit(1, 1) qc2.ry(math.pi/4, 0) # 45-degree rotation qc2.measure(0, 0) print(sim.run(qc2, shots=1000).result().get_counts())
{'0': 853, '1': 147}। आपने अभी probability चुनी है। कोई classical bit यह नहीं कर सकता — यह continuous control ही quantum algorithms का असली engine है।2 qubits: CNOT
CNOT (controlled-NOT) पहला gate है जिसे 2 qubits चाहिए: यह target को तभी flip करता है जब control |1⟩ हो। Qubit 0 पर control, qubit 1 पर target:
qc = QuantumCircuit(2, 2) qc.x(0) # control qubit -> |1> qc.cx(0, 1) # target flip करें, क्योंकि control |1> है qc.measure(0, 0) qc.measure(1, 1) print(qc.draw()) print(sim.run(qc, shots=1000).result().get_counts())
{'11': 1000} — bitstring को (qubit 1, qubit 0) के क्रम में पढ़ें: दोनों 1 हैं। अब qc.x(0) वाली line हटाकर दोबारा चलाएँ: {'00': 1000}। Control |0⟩ → target को छुआ तक नहीं। यह gate दूसरे qubit पर condition लगाता है — यही conditional power multi-qubit circuits को दिलचस्प बनाती है।आपकी बारी: Bell pair
Control qubit को पहले superposition में डालें, फिर CNOT। चलाने से पहले predict करें: 4 outcomes — 00, 01, 10, 11 — में से कौन से दिखेंगे?
bell = QuantumCircuit(2, 2) bell.h(0) # control -> superposition bell.cx(0, 1) # target को इससे entangle करें bell.measure(0, 0) bell.measure(1, 1) counts = sim.run(bell, shots=1000).result().get_counts() print(counts)
{'00': ~500, '11': ~500} — कभी 01 नहीं, कभी 10 नहीं। दोनों qubits entangled हैं: एक को measure करें और दूसरे का पता तुरंत चल जाता है, चाहे वे कितनी भी दूर हों। Einstein ने इसे "spooky action at a distance" कहा था। आपने इसे अपने laptop पर 4 lines में बना लिया।01 या 10 दिख रहा है? Gate order check करें — H, CNOT से पहले आना चाहिए, और CNOT का control qubit 0 होना चाहिए: cx(0, 1), न कि cx(1, 0)।Debrief — आपने क्या साबित किया?
Gates quantum computing के verbs हैं। आपने verify किया कि phase असली है पर measurement को दिखता नहीं (Z, Y, S, T), कि rotation gates probability पर continuous control देते हैं (RY), और कि एक controlled gate 2 qubits को एक ही entangled fate में बाँध सकता है (CNOT → Bell pair)। 10 gates, एक simulator, zero hardware।
अगले labs में इन्हीं gates को जोड़कर असली protocols बनाएँगे — key distribution, teleportation। और H gate superposition क्यों बनाता है, यह समझने के लिए qubit वाला पाठ देखें।