Quantum Computing - Part 2
16 August 2022
eigenvectorlinear algebraquantum computingqubitဤဆောင်းပါးတွင် linear algebra သဘောတရားများပါဝင်သောကြောင့် linear vector space များအကြောင်းကို ကြိုတင်ဖတ်ရှုရန် အကြံပြုသည်။
Visualizing qubits
Qubit ကိုပုံနဲ့ဘယ်လိုပြမလဲ။ ရှေ့အပိုင်းမှာ qubit တခုကို 2D complex vector အနေနဲ့ပြလို့ရတယ်လို့ပြောခဲ့ပါတယ်။ vector ကို ပုံဆွဲပြလို့ရပေမယ့် vector ကိုဘယ်လိုဆွဲနိုင်မလဲ။ Complex number တခုမှာ real part နဲ့ imaginary part အတွက် ကိန်းနှစ်ခုပါဝင်တာကြောင့် vector တခုမှာ ကိန်းလေးခုပါဝင်ပါတယ်။
Global phase
Complex number တွေဖြစ်တဲ့ နဲ့ ကို polar form နဲ့လည်းရေးလို့ရပါတယ်။
က amplitude ဖြစ်ပြီး က phase ဖြစ်ပါတယ်။ ဒီနေရာမှာ qubit ရဲ့ global phase ဆိုတာကိုပြောဖို့လိုပါတယ်။ Qubit vector တခုဟာ normalize လုပ်ထားတဲ့အတွက် magnitude တယူနစ်ရှိတယ်ဆိုတာ သိပြီးဖြစ်ပါတယ်။ ဒီတော့ ကို amplitude တယူနစ်ရှိတဲ့ complex number နဲ့မြှောက်လိုက်ရင် ရဲ့ probability တန်ဖိုးတွေက ပြောင်းသွားမှာမဟုတ်ပါဘူး။ အောက်က ညီမျှခြင်းမှာကြည့်ပါ။
Statevector တခုလုံးရဲ့ တယူနစ်ရှိတဲ့မြှောက်ဖော်ကိန်း ကို global phase လို့ခေါ်ပြီး သူနဲ့မြှောက်ခြင်းဟာ measurable quantities တွေဖြစ်တဲ့ probability တန်ဖိုးတွေကို မပြောင်းလဲစေတဲ့အတွက် နဲ့ တို့ဟာ physically equivalent ဖြစ်တယ်လို့ယူရပါမယ်။
Bloch sphere
အခု ကို global phase တခုဖြစ်တဲ့ နဲ့မြှောက်လိုက်ပါမယ်။
အခု မှာ real number သုံးခုပဲရှိပါတော့တယ်။ ဒါပေမယ့် normalization rule အရ complex amplitude တွေက ဆက်နွယ်ချက်ရှိပါတယ်။
ဒုတိယညီမျှခြင်းဟာ unit circle ညီမျှခြင်းဖြစ်ပါတယ်။ ဒီတော့ ကလည်း unit circle ရဲ့အစိတ်အပိုင်းဖြစ်တဲ့အတွက် သူတို့နှစ်ခုအစား angle တစ်ခုနဲ့အစားထိုးလို့ရပါတယ်။
ပြန်ချုပ်လိုက်ရင်−
ဒီပုံစံမှာ real ကိန်းဖြစ်တဲ့ angle နှစ်ခု နဲ့ ပဲရှိပါတော့တယ်။ ဒီ angle နှစ်ခုကို 3D sphere ပေါ်မှာဆွဲပြီး qubit state vector ကိုဆွဲပြလို့ရပါတယ်။ ဒီ sphere ကိုတော့ တီထွင်သူ Felix Bloch ကိုအစွဲပြုပြီး Bloch sphere လို့ခေါ်ပါတယ်။ ဒီ sphere ပေါ်က angle နှစ်ခုကို အောက်ကပုံမှာကြည့်ပါ။
Bloch sphere မှာ +z ဝင်ရိုးက နဲ့ -z က တို့ဖြစ်ပါတယ်။ +x နဲ့ -x က နဲ့ လို့ခေါ်တဲ့ superposition state တွေဖြစ်ပါတယ် (နောက်ပိုင်းမှာဖော်ပြပါမယ်)။ ဒီတော့ ဆိုရင် state ဖြစ်တာကို ညီမျှခြင်းကနေတွေ့နိုင်ပါတယ်။ ဒီလိုမျိုး ထောင့်တွေကိုစမ်းထည့်ကြည့်ရင်−
Binary | Decimal |
---|---|
0 | 0 |
1 | 1 |
10 | 2 |
11 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
Bloch sphere on Qiskit
Qiskit ကိုသုံးပြီး qubit state ကို Bloch sphere ပေါ်မှာဆွဲကြည့်ရအောင်။ သုံးရမယ့် function က plot_bloch_multivector
ဖြစ်ပါတယ်။
# import required packagesfrom qiskit.visualization import plot_bloch_multivectorfrom math import pi, sqrtimport warningswarnings.filterwarnings('ignore')qubit_state = [1, 0]# draw the qubit state on Bloch sphereplot_bloch_multivector(qubit_state)
qubit_state
တန်ဖိုးကိုပြောင်းကြည့်ပြီး Bloch vector ဘယ်လိုပြောင်းသလဲဆိုတာ စမ်းကြည့်ပါ။ ဥပမာ [0, 1], [0, -1] နဲ့ [1/sqrt(2), 1/sqrt(2)] တို့ကိုထည့်ကြည့်ပါ။
Single qubit gates
Qubit တစ်ခုကို ဘ ယ်လိုဖော်ပြလဲသိပြီဆိုရင် qubit ကိုပြောင်းလဲစေတဲ့ operation တွေကိုလေ့လာလို့ရပါပြီ။ Classical computing မှာ gate တွေကိုအသုံးပြုပြီး တွက်ချက်သလိုပဲ quantum computing မှာ qubit gate (quantum gate) တွေကို အသုံးပြုပြီး တွက်ချက်ပါတယ်။ Single qubit gate ဆိုတာ qubit တစ်ခုတည်းကို သက်ရောက်တဲ့ gate အမျိုးအစားတွေဖြစ်ပါတယ်။ ဥပမာ X gate လို့ခေါ်တဲ့ gate ဟာ classical က NOT gate နဲ့ဆင်တူပါတယ်။ သူက qubit state ကို ကိုပြောင်းလဲပေးပြီး ဆိုရင် ကိုပြောင်းလဲပေးပါတယ်။
Qubit က vector တစ်ခုပဲဖြစ်တာကြောင့် qubit gate တွေက linear algebra မှာ vector တွေကိုသက်ရောက်တဲ့ operator (linear transformation matrix) တွေနဲ့အတူတူပါပဲ။ Single qubit က 2D vector ဖြစ်တာကြောင့် single qubit gate က 2x2 matrix ဖြစ်ပါတယ်။ ဥပ မာ X gate ဆိုရင်−
ပုံစံရှိပါတယ်။ X gate က qubit ကို operate လုပ်တဲ့ output ကိုရဖို့ matrix နဲ့ vector နဲ့မြှောက်လိုက်ရုံပါပဲ။
ဒီတော့ X gate matrix က ကို ဖြစ်စေတယ် (တနည်းပြောရရင် နဲ့ တို့ရဲ့မြှောက်ဖော်ကိန်းတွေကို နေရာလဲပေးတယ်) ဆိုတာ အလွယ်တကူတွေ့နိုင်ပါတယ်။
Qiskit မှာ X gate ကိုထည့်ဖို့ quantum circuit qc
ကိုကြေညာပြီးရင် qc.x(qubit_index)
လို့ရေးနိုင်ပါတယ်။ Qubit index ကို 0 ကနေစရေတွက်ပါတယ်။
# import required packagesfrom qiskit import QuantumCircuit, Aer, transpile, execute, assemblefrom qiskit.visualization import plot_histogram, plot_bloch_multivector# create the quantum circuit with 1 qubitqc = QuantumCircuit(1)# initialize the 0th qubitqc.initialize([1,0], 0)# apply X gate to 0th qubitqc.x(0)# draw quantum circuitqc.draw('mpl')
Qubit ကို နဲ့ initialize လုပ်ထားတဲ့အတွက် ဒီ circuit ကို simulator မှာ run လိုက်ရင် output ရပါမယ်။
# set up statevector simulatorsvsim = Aer.get_backend('statevector_simulator')qc = transpile(qc, svsim)# run and get the final statestate = svsim.run(qc).result().get_statevector()print('After applying X gate, the state is', state)plot_bloch_multivector(state)
Gates as rotation operators
Quantum gate တစ်ခုက qubit vector ကို transformation လုပ်ပေးတဲ့ linear transformation operator ဖြစ်ကြောင်း ရှေ့မှာပြောခဲ့ပါတယ်။ ဒီ operator တွေရဲ့ဂုဏ်သတ္တိတခုကတော့ qubit ရဲ့ magnitude ကိုပြောင်းလဲစေခြင်းမရှိတာပါပဲ (magnitude ကိုသာပြောင်းစေမယ်ဆိုရင် output qubit က normalization rule ကိုလိုက်နာစေမှာမဟုတ်တာကို တွေ့နိုင်ပါတယ်)။ ဒီတော့ quantum gate တခုရဲ့ transformation ကို Bloch sphere ပေါ်မှာကြည့်မယ်ဆိုရင် gate ရဲ့သက်ရောက်မှုက Bloch sphere ရဲ့ axis တခုကို ပတ်ပြီး angle တခုလှည့်ပေးတဲ့ rotation operator အနေနဲ့လည်း မှတ်ယူလို့ရပါတယ်။ ဥပမာ X gate ဆိုရင် Bloch sphere ရဲ့ X ဝင်ရိုးကိုတည်ပြီး ၁၈၀ ဒီဂရီ လှည့်လိုက်တာနဲ့ညီမျှတာကို တွေ့ရပါလိမ့်မယ်။
ဒီအတိုင်းပဲ Y နဲ့ Z gate တို့ကလည်း သူတို့ဝင်ရိုးအသီးသီးပေါ်တည်ပြီး လှည့်လိုက်တာဖြစ်ပါတယ်။
Y နဲ့ Z တို့ရဲ့သက်ရောက်မှုကို အောက်က simulator code နဲ့စမ်းကြည့်နိုင်ပါတယ်။ Qubit ကို နဲ့ initialize လုပ်ထားတယ်ဆိုတာသတိရပါ။
# create a new quantum circuitqc = QuantumCircuit(1)# put Y gate to qubit 0qc.y(0)# setup and run simulatorsvsim = Aer.get_backend('statevector_simulator')qc = transpile(qc, svsim)state = svsim.run(qc).result().get_statevector()plot_bloch_multivector(state)
Quantum gate တွေကrotation axis မှာရှိတဲ့ vector တွေကိုပြောင်းလဲစေမှာမဟုတ်တဲ့အတွက် rotation axis ကို gate matrix ရဲ့ eigenvector တွေကိုတွက်ထုတ်ပြီး ရှာလို့ရပါတယ်။ ဥပမာ X gate ဆိုရင် X axis မှာရှိတဲ့ vector တွေက eigen vector တွေဖြစ်တဲ့အတွက် rotation axis က X axis ဖြစ်ပါတယ်။
from numpy.linalg import eigimport numpy as npX = np.array([[0., 1.], [1., 0.]])w,v = eig(X)# print('Eigenvalues are {} and {}'.format(w[0], w[1]))print('Eigenvectors are {} and {}'.format(v[:,0], v[:,1]))plot_bloch_multivector(v[:,0])
Hadamard gate
နောက်ထပ် gate တစ်ခုကတော့ နည်းနည်းထူးခြားပါတယ်။ Hadamard gate လို့ခေါ်ပြီး သူက နဲ့ ကို equal superposition state ကိုပြောင်းလဲပေးပါတယ်။
အောက်ပုံက Bloch sphere ကိုကြည့်ရင် က +Z axis ကို +X axis ဆီပြောင်းပေးပြီး -Z ကို -X ဆီပြောင်းပေးတာကိုတွေ့ရပါတယ်။ ဒီတော့ H gate က Bloch sphere မှာ X နဲ့ Z axis ကိုကူးပြောင်းပေးတာလို့ ပြောလို့ရပါတယ်။ Rotation လုပ်တဲ့ axis ကတော့ X နဲ့ Z ကြားက ၄၅ ဒီဂရီမျဉ်းပဲဖြစ်ပါတယ်။
Bloch sphere ရဲ့ X axis က equal superposition state ဖြစ်တဲ့ တို့ကို ကိုယ်စားပြုတာကို ဒီနေရာမှာတွေ့နိုင်ပါတယ်။
X,Y,Z gate တွေက superposition state ကို ဖန်တီးပေးနိုင်ခြင်းမရှိပေမယ့် Hadamard gate ကိုသုံးပြီး superposition ဖြစ်အောင်လုပ်လို့ရတဲ့အတွက် အလွန်အသုံးဝင်တဲ့ gate တစ်ခုဖြစ်ပါတယ်။
Hadamard gate ရဲ့ matrix ပုံစံကိုကြည့်ရင် ရှေ့မှာမြှောက်ဖော်ကိန်း ပါနေတာကိုတွေ့ရပါတယ်။ ဒီမြှောက်ဖော်ကိန်းရဲ့တာဝန်က H gate ရဲ့ output state တွေရဲ့ magnitude ကို 1 ဖြစ်အောင် (unit vector ဖြစ်အောင်) လုပ်ဆောင်ပေးတာပါပဲ။ ဆိုလိုတာက ဒီမြှောက်ဖော်ကိန်းသာမပါရင် superposition state တွေက unit vector တွေဖြစ်မှာမဟုတ်တော့ပါဘူး။ ဒီတော့ quantum gate တွေအားလုံးက vector magnitude (norm) ကိုမပြောင်းလဲစေတဲ့ unitary matrix တွေဖြစ်ကြပါတယ်။ Unitary matrix တွေရဲ့ နောက်ထပ်အရေးကြီးတဲ့ဂုဏ်သတ္တိနှစ်ခုက inner product တွေကိုမပြောင်းလဲစေတာနဲ့ eigen vector တွေက orthogonal ဖြစ်တာပဲဖြစ်ပါတယ်။
Change of basis
Vector တွေသုံးပြီး တွက်ချက်တဲ့အခါ basis က အရေးပါတာကိုသိပြီးဖြစ်ပါတယ်။ Basis ကိုသတ်မှတ်ထားမှသာ vector ရဲ့ component တွေကို ထုတ်ရေးလို့ရပါမယ်။ ဒါပေမယ့် basis စနစ်ကို ပြောင်းလဲလိုက်ရင်လည်း linear vector သဘောတရားအရ vector တစ်ခုနဲ့တစ်ခုကြားက ဆက်သွယ်ချက်တွေက မှန်နေသေးတဲ့အတွက် special basis ဆိုတာမရှိပါဘူး။ Qubit အတွက်လည်း ဒီအတိုင်းပါပဲ။ Qubit vector, measurement နဲ့ gate ရဲ့ matrix ပုံစံတို့ကို computational basis လို့ခေါ်တဲ့ ကိုသုံးပြီး ဖော်ပြခဲ့ပေမယ့် တခြား basis တွေမှာလည်း တန်းတူအသုံးချလို့ရပါတယ်။ ဥပမာ equal superposition state−
ကို measure လုပ်ရင် 0: 50% နဲ့ 1: 50% ရမယ်ဆိုတာ သိသာပါတယ်။ ဒီ state ကိုပဲ Hadamard basis/X basis လို့ခေါ်တဲ့ basis မှာရေးမယ်ဆိုရင်−
ဖြစ်ပါလိမ့်မယ် (basis transformation လုပ်ရင် dot product ယူရတာသတိရပါ)။ ဒီတော့ state ကို X basis မှာ တိုင်းတာမယ်ဆိုရင် : 100% နဲ့ : 0% ရပါလိမ့်မယ်။ Amplitude တွေက basis ပေါ်မီခိုပြီး probability တွေက amplitude squared ပေါ်ကိုမီခိုနေတာကြောင့် တိုင်းတာတဲ့ basis ပေါ်မူတည်ပြီး probability တန်ဖိုးတွေပြောင်းသွားရတာဖြစ်ပါတယ်။
ဒါပေမယ့် လက်ရှိ Qiskit မှာ measurement လုပ်တဲ့အခါ probability တန်ဖိုးတွေက Z basis ကိုအခြေခံထားတဲ့အတွက် တခြား basis မှာတိုင်းချင်ရင် transformation လုပ်ရပါမယ်။ ဒီအတွက် သင့်တော်တဲ့ quantum gate တွေကိုသုံးရပါမယ်။ ဥပမာ X basis မှာတိုင်းချင်တယ်ဆိုရင် X ကနေ Z basis ကိုပြောင်းလဲပေးတဲ့ operator က H gate ဖြစ်တဲ့အတွက် measurement မလုပ်ခင် H gate ကိုခံပေးရပါမယ်။
from numpy import sqrtqc = QuantumCircuit(1,1)# initialize qubit to |+> stateqc.initialize([1/sqrt(2), 1/sqrt(2)], 0)# change basis from X to Z (uncommment the line below to enable)# qc.h(0)# measure in Z basisqc.measure(0,0)counts = execute(qc,Aer.get_backend('qasm_simulator')).result().get_counts()plot_histogram(counts)
ဒီ circuit မှာ H gate ထည့်တာနဲ့ မထည့်တဲ့အဖြေကိုနှိုင်းယှဉ်ကြည့်ပါ။ နောက်တစ်ခုထူးခြားတာက state မှာရှိနေတဲ့ qubit ကို Z basis မှာတိုင်းရင် 50-50 probability ပဲရမှာဖြစ်တဲ့အတွက် နဲ့ state ကို probability အရခွဲခြားလို့ရမှာမဟုတ်ပါဘူး (ပုံမှာကြည့်ပါ)ျ။ ဒါပေမယ့် X ကနေ Z ပြောင်းပြီးတိုင်းမယ်ဆိုရင်တော့ ဒီ state နှစ်ခုကို အတိအကျခွဲခြားလို့ရမှာဖြစ်ပါတယ်။ ပြောင်းပြန် ပြန်ပြောရရင်တော့ (သို့) state ကို X basis မှာတိုင်းမယ်ဆိုရင် နဲ့ ရဖို့ 50-50 ဖြစ်ပါလိမ့်မယ်။ ဒီတော့ လိုချင်တဲ့အဖြေကိုမူတည်ပြီး ဘယ် basis မှာတိုင်းတာမလဲဆိုတာကို ဆုံးဖြတ်ရမှာဖြစ်ပါတယ်။
Parametric gates
X, Y, Z gate တွေက Bloch sphere ရဲ့ဝင်ရိုးတွေပေါ်မှာ radian (၁၈၀ ဒီဂရီ) လှည့်တဲ့ gate တွေဆိုတာ တွေ့ခဲ့ပါတယ်။ radian မဟုတ်ပဲ လိုချင်တဲ့ ထောင့်ပမာဏလှည့်လို့ရတဲ့ gate အမျိုးအစားတွေကိုတော့ parametric gate လို့ခေါ်ပါတယ်။ Parametric gate လို့ခေါ်ရတာက gate ကိုအသုံးပြုဖို့ parameter ကိန်းတစ်ခု၊ ဒါမှမဟုတ် တစ်ခုထက်ပိုတဲ့ကိန်းတွေလိုအပ်လို့ဖြစ်ပါတယ်။ ပထမဆုံး gate ကိုတော့ gate လို့ခေါ်ပါတယ်။ သူက Z axis မှာ radian လှည့်ပေးတဲ့ gate ဖြစ်ပြီး matrix ပုံစံကတော့ အောက်ပါအတိုင်းဖြစ်ပါတယ်။
qc = QuantumCircuit(1)# apply H gate and Rz(pi/2) gateqc.h(0)qc.rz(pi/2,0)svsim = Aer.get_backend('statevector_simulator')qobj = assemble(qc)state = svsim.run(qobj).result().get_statevector()print('Final state is', state)plot_bloch_multivector(state)
နဲ့ဆင်တဲ့ gate တခုကတော့ phase gate လို့ခေါ်တဲ့ P gate ဖြစ်ပါတယ်။ သူ့ matrix ပုံစံက−