Codes for Quantum Computing Tutorial Note: If you choose to download anything from this tutorial, it is at your own risk. You are free to read the codes if you do not want to download or use the IBM platform. # (indents need to be converted to tabs if you cut and paste) # (Check the " or ' come out in the Python format) #Code 1 conda create --name QCTutorial conda activate QCTutorial conda install ipykernel python -m ipykernel install --user --name QCTutorial --display-name "QCTutorial" conda install jupyter conda install numpy conda install scipy jupyter notebook #Code 2 #Explicit Euler Simulation: import numpy as np psi1 = np.array([1, 0, 0, 0]) Hp = np.array([[2,0,0,0], [0,3,0,0],[0,0,5,0],[0,0,0,10]]) Hd = np.array([[3,0,0,0], [0,1,0,0],[0,0,2,0],[0,0,0,6]]) beta = 1.5 hbar = 1.054571817e-34 timeOp = 10e-10 sizeStep = 1e-10 numSteps = int(np.floor(timeOp/sizeStep +0.5)) timeMatrix = np.empty(numSteps + 1) stateVecMatrix = np.empty((numSteps + 1,4),dtype=complex) time = 0 timeMatrix[0] = time stateVecMatrix[0] = psi1 for i in range(numSteps): psi1 = psi1 + sizeStep*(-1j/hbar*Hp@psi1 - 1j/hbar*beta*Hd@psi1) stateVecMatrix[i+1] = psi1 time = time+sizeStep timeMatrix[i+1] = time print(psi1) #Code 3 #Quantum State Simulation Using Matrix Exponentials from [1, 0, 0, 0]: import numpy as np from scipy.linalg import expm psi1 = np.array([1, 0, 0, 0]) Hp = np.array([[2,0,0,0], [0,3,0,0],[0,0,5,0],[0,0,0,10]]) Hd = np.array([[3,0,0,0], [0,1,0,0],[0,0,2,0],[0,0,0,6]]) beta = 1.5 hbar = 1.054571817e-34 timeOp = 10e-10 sizeStep = 1e-10 HCombo = -1j/hbar*(Hp + beta*Hd) statev = expm(HCombo*timeOp)@psi1 print(statev) #Code 4 #Quantum State Simulation Using Matrix Exponentials from an Equal Superposition State and With Measurements Added: import numpy as np from scipy.linalg import expm psi1 = np.array([0.5, 0.5, 0.5, 0.5]) Hp = np.array([[2,0,0,0], [0,3,0,0],[0,0,5,0],[0,0,0,10]]) Hd = np.array([[3,0,0,0], [0,1,0,0],[0,0,2,0],[0,0,0,6]]) beta = 1.5 hbar = 1.054571817e-34 timeOp = 10e-10 sizeStep = 1e-10 HCombo = -1j/hbar*(Hp + beta*Hd) statev = expm(HCombo*timeOp)@psi1 print(statev) probBfSquare = np.abs(statev) print(probBfSquare) probs = probBfSquare**2 print(probs) items = ['00','01','10','11'] measurement = np.random.choice(items, p=probs) print(measurement) #Code 5 #State Vector Simulation of a Hadamard Applied to a Qubit in the |0> State: H = 1/np.sqrt(2)*np.array([[1, 1],[1,-1]]) print(H) qubitState = np.array([1,0]) qubitSuperpos = H@qubitState print(qubitSuperpos) #Code 6 #Some Extra Conda Stuff to Get Ready to Run Qiskit: conda install qiskit conda install matplotlib conda install qiskit-ibm-runtime conda install pylatexenc conda install qiskit-aer #Code 7 #Example of a Hadamard Gate Applied to 1 Qubit and Measured, Using IBM's Aer Simulator (Note: A Simulator is Not a Quantum Computer): from qiskit import QuantumCircuit from qiskit_aer import AerSimulator qc = QuantumCircuit(1,1) qc.h(0) qc.measure(0,0) sim=AerSimulator() result=sim.run(qc,shots=1000).result() print(result.get_counts()) qc.draw('mpl') #Code 8 #One-Time Set-Up to Use QPUs on IBM Quantum Platform with a Given API Token (check all '' are in the right way in Python and also you will need to replace the places "copy and past your API key or token" and "type your instance name"): from qiskit_ibm_runtime import QiskitRuntimeService QiskitRuntimeService.save_account(channel="ibm_quantum_platform",token=“copy and paste your API key or token",instance=“type your instance name") #Code 9 #Running the Hadamard Gate and Measure Example on QPUs (After the API Token is Set Up - also you need to replace "PUT YOUR JOB HERE"): from qiskit import QuantumCircuit, transpile from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 qc = QuantumCircuit(1,1) qc.h(0) qc.measure(0,0) qc.draw(output='mpl') service = QiskitRuntimeService() qpus = service.backends(simulator=False, operational=True) print(qpus) back_lb = service.least_busy(operational=True) back_lb.num_qubits sampler_lb = SamplerV2(back_lb) qc_lb_t=transpile(qc,backend=back_lb) qc_lb_t.draw(output='mpl',idle_wires=False) no_shots = 1024 lb_job=sampler_lb.run([(qc_lb_t,None,no_shots)]) retrieve=QiskitRuntimeService().job('PUT YOUR JOB HERE’) result = retrieve.result() pub_result = result[0] counts = pub_result.data.c.get_counts() print(counts) #Code 10 #2 X's and 2 CNOT's on the Aer Simulator: from qiskit import QuantumCircuit from qiskit_aer import AerSimulator qc = QuantumCircuit(3) qc.x(0) qc.x(1) qc.cx(1,2) qc.cx(0,1) qc.measure_all() sim=AerSimulator() result=sim.run(qc,shots=1000).result() print(result.get_counts()) qc.draw('mpl') #Code 11 #2 X's and 2 CNOT's on a QPU (replace "PUT YOUR JOB HERE" and be sure your '' is right in Python): from qiskit import QuantumCircuit, transpile from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 qc = QuantumCircuit(3) qc.x(0) qc.x(1) qc.cx(1,2) qc.cx(0,1) qc.measure_all() service = QiskitRuntimeService() qpus = service.backends(simulator=False, operational=True) print(qpus) back_lb = service.least_busy(operational=True) back_lb.num_qubits sampler_lb = SamplerV2(back_lb) qc_lb_t=transpile(qc,backend=back_lb) qc_lb_t.draw(output='mpl',idle_wires=False) no_shots = 1024 lb_job=sampler_lb.run([(qc_lb_t,None,no_shots)]) retrieve=QiskitRuntimeService().job('PUT YOUR JOB HERE’) result = retrieve.result() pub_result = result[0] counts = pub_result.data.meas.get_counts() print(counts) #Code 12 #Grover's Algorithm Simulation with Matrices as Operators (Not Gates) Using numpy: import numpy as np H = np.array([[1/np.sqrt(2),1/np.sqrt(2)],[1/np.sqrt(2),-1/np.sqrt(2)]]) HOTimes = np.kron(H,np.kron(H,H)) initState = np.array([1,0,0,0,0,0,0,0]) psi1 = HOTimes@initState print(psi1) Up = np.array([[1,0,0,0,0,0,0,0],[0,1,0,0,0,0,0,0],[0,0,1,0,0,0,0,0],[0,0,0,1,0,0,0,0],[0,0,0,0,-1,0,0,0],[0,0,0,0,0,1,0,0],[0,0,0,0,0,0,1,0],[0,0,0,0,0,0,0,1]]) print(Up) psi2 = Up@psi1 print(psi2) Us=np.array([[-1+2/8,2/8,2/8,2/8,2/8,2/8,2/8,2/8], [2/8,-1+2/8,2/8,2/8,2/8,2/8,2/8,2/8], [2/8,2/8,-1+2/8,2/8,2/8,2/8,2/8,2/8], [2/8,2/8,2/8,-1+2/8,2/8,2/8,2/8,2/8], [2/8,2/8,2/8,2/8,-1+2/8,2/8,2/8,2/8], [2/8,2/8,2/8,2/8,2/8,-1+2/8,2/8,2/8], [2/8,2/8,2/8,2/8,2/8,2/8,-1+2/8,2/8], [2/8,2/8,2/8,2/8,2/8,2/8,2/8,-1+2/8], ]) print(Us) psi3 = Us@psi2 print(psi3) psi4 = Up@psi3 print(psi4) psi5 = Us@psi4 print(psi5)