Quantum Logic

量子邏輯

  • 建電社員 -> 建資社員

  • 常駐於DC活網人口

  • 音遊好難...大佬教嗎...

  • 競程好難...大佬教嗎...

  • 數學好難...大佬教嗎...

講師 000

  • Python(DC機器人、網頁後端、機器學習、資料分析、爬蟲、競程)

  • JavaScript(前端)

  • C/C++(競程)

  • C#(Unity)

  • Batch

  • Ruby(寒訓學的東東好難用)

  • 架過網頁、Minecraft、DC機器人的伺服器

  • Minecraft Function

  • Scratch

講師 000

  • Quantum

  • Math

  • Qubit

  • Quantum Gate

  • Qiskit

目錄

Quantum

量子

什麼是量子?

「在物理學中,量子(quantum)是參與基本相互作用的任何物理實體(物理性質)的最小量。量子的概念」----維基百科

什麼是量子?

「在物理學中,量子(quantum)是參與基本相互作用的任何物理實體(物理性質)的最小量。量子的概念」----維基百科

而這樣的東東有著許多酷酷的特性

像是量子疊加態、量子糾纏

雙狹縫實驗

在光經過兩個狹縫最終射到螢幕上後

原本以為在螢幕上的圖案應該會是兩個縫

 

雙狹縫實驗

觀察後會發現它以粒子的形式在上面擺出狹縫相間的圖案

也就是說它在實際射到螢幕之前

會具有波的性質,所以之間會如水中的漣漪一般互相干涉

這一系列的實驗證明了光的波粒二像性

雙狹縫實驗

而就算把發射的對象從光換成一次一顆一顆電子射出

會發現得到一樣的結果

其證明了單顆電子甚至會在兩縫之中分別存在並自己干涉自己

代表它在兩縫都是有機率存在的情況

測不準/不確定性原理

由海森堡(Werner Heisenberg)在1927年

發表的論文之中提出的原理

測不準/不確定性原理

由海森堡(Werner Heisenberg)在1927年

發表的論文之中提出的原理

{\displaystyle \Delta x\Delta p\geq \hbar /2}
{\displaystyle \Delta x}是位置標準差 \\ {\displaystyle \Delta p}是動量標準差 \\ {\displaystyle \hbar }是約化普朗克常數 \\

測不準/不確定性原理

由海森堡(Werner Heisenberg)在1927年

發表的論文之中提出的原理

{\displaystyle \Delta x\Delta p\geq \hbar /2}
{\displaystyle \Delta x}是位置標準差 \\ {\displaystyle \Delta p}是動量標準差 \\ {\displaystyle \hbar }是約化普朗克常數 \\

其表示粒子的位置和動量不可能同時被精準測量

其中也論文中也講到原子的電子軌道是無法被觀察的

測不準/不確定性原理

啊至於更詳細的我懶得講

大概就是有個東西叫做波包可以用來描述粒子

它是讓多個波(無法表示位置)透過傅立葉轉換將這些以週期函數表示的波的線性組合逼近出一個讓它具有「位置的特性的東東

但這樣它在原本這些波上的「動量」資訊就會喪失

 

所以也就是說當你得到它的位置資訊越清楚相對地它的動量資訊就不會那麼清楚

 

剩下的詳細解釋我有空補 我想睡覺了好累

量子疊加態

而上面講了這麼多

就是大概描述了量子疊加態的概念

量子力學中不同於古典力學具有決定性

而這樣一個同時具有不同性質的特性

可以讓我們在電腦中用更少的位元表示更多的資訊

量子電腦

由於很昂貴,所以一般不會有

也就是說後面的範例code其實本質上是在

你的傳統電腦模擬量子電腦的運行

但如果在真的量子電腦上面計算速度會比傳統電腦

快超多...甚至可以用來暴力破解一些加密算法

Math

數學

在進入量子之前,要先來講一些量子會用到的數學

首先來講點基礎的矩陣、向量等知識

{\displaystyle \mathbf {b} \otimes \mathbf {a} \rightarrow {\begin{bmatrix}b_{1}\\b_{2}\\b_{3}\\b_{4}\end{bmatrix}}{\begin{bmatrix}a_{1}&a_{2}&a_{3}\end{bmatrix}}={\begin{bmatrix}a_{1}b_{1}&a_{2}b_{1}&a_{3}b_{1}\\a_{1}b_{2}&a_{2}b_{2}&a_{3}b_{2}\\a_{1}b_{3}&a_{2}b_{3}&a_{3}b_{3}\\a_{1}b_{4}&a_{2}b_{4}&a_{3}b_{4}\end{bmatrix}}}

Tensor Production

張量積

簡單補充一下,待會可能會稍微用到

共軛

Conjugate

將複數虛部變號,以星號或是上方直線表示

(a + bi)^* = a - bi
\overline{a + bi} = a - bi

狄拉克標記

Dirac Notation

{\displaystyle |\psi \rangle ={\begin{pmatrix}\psi _{1}\\\psi _{2}\\\psi _{3}\\\psi _{4}\\\vdots \\\psi _{N}\\\end{pmatrix}}}
{\displaystyle \langle \psi |={\begin{pmatrix}\psi _{1}^{*},&\psi _{2}^{*},&\psi _{3}^{*},&\psi _{4}^{*},&\cdots ,&\psi _{N}^{*}\end{pmatrix}}}

以〈、〉、|表示量子態向量的一種方式

狄拉克標記

Dirac Notation

\displaystyle \langle \psi_a | \psi_b \rangle = \sum_{i} \psi_{ai}^* \psi_{bi}

以〈、〉、|表示量子態向量的一種方式

用             表示A與B的內積

\displaystyle \langle \psi_a | \psi_b \rangle

克羅內克函數

Kronecker Delta

\delta_{ij}
{\displaystyle \delta _{ij}=\left\{{\begin{matrix}1&(i=j)\\0&(i\neq j)\end{matrix}}\right.\,\!}

以    表示,若是i等於j則為1,反之為0

么正矩陣

Unitary Matrix

{\displaystyle U^{┼}U=UU^{┼}=I_{n}}

「┼」表示共軛轉置

若是一個矩陣符合以上性質

則稱為么正矩陣

么正矩陣

Unitary Matrix

{\displaystyle U^{┼}U=UU^{┼}=I_{n}}
{\displaystyle U^{┼}U={\begin{bmatrix}{\frac {i}{\sqrt {2}}}&-{\frac {i}{\sqrt {2}}}\\{\frac {1}{\sqrt {2}}}&{\frac {1}{\sqrt {2}}}\\\end{bmatrix}}{\begin{bmatrix}-{\frac {i}{\sqrt {2}}}&{\frac {1}{\sqrt {2}}}\\{\frac {i}{\sqrt {2}}}&{\frac {1}{\sqrt {2}}}\\\end{bmatrix}}={\begin{bmatrix}1&0\\0&1\\\end{bmatrix}}}
{\displaystyle UU^{┼}={\begin{bmatrix}-{\frac {i}{\sqrt {2}}}&{\frac {1}{\sqrt {2}}}\\{\frac {i}{\sqrt {2}}}&{\frac {1}{\sqrt {2}}}\\\end{bmatrix}}{\begin{bmatrix}{\frac {i}{\sqrt {2}}}&-{\frac {i}{\sqrt {2}}}\\{\frac {1}{\sqrt {2}}}&{\frac {1}{\sqrt {2}}}\\\end{bmatrix}}={\begin{bmatrix}1&0\\0&1\\\end{bmatrix}}}

Qubit

量子位元

一般的電腦位元以0/1去做訊號的表示

那如果是量子電腦呢?

Qubit

量子位元

一般的電腦位元以0/1去做訊號的表示

那如果是量子電腦呢?

Qubit

量子位元

在量子電腦中取代位元的便是「量子位元」

Qubit

量子位元

\ket{\psi} = a_0\ket{0} + a_1\ket{1} = \begin{pmatrix} a_0 \\ a_1 \\ \end{pmatrix}
\vert a_0 \vert^2 + \vert a_1 \vert^2 = 1

量子位元以    表示

他不代表準確的0/1

而是以向量的形式表示該位元不同性質的機率

且其為各種性質的機率合計需為1

這就是量子的歸一性

\psi

Qubit

量子位元

\ket{\psi} = a_0\ket{0} + a_1\ket{1} = \begin{pmatrix} a_0 \\ a_1 \\ \end{pmatrix}
\vert a_0 \vert^2 + \vert a_1 \vert^2 = 1
\ket{0} = \begin{pmatrix} 1 \\ 0 \\ \end{pmatrix}
\ket{1} = \begin{pmatrix} 0 \\ 1 \\ \end{pmatrix}

Qubit

量子位元

\ket{\psi} = a_0\ket{0} + a_1\ket{1} = \begin{pmatrix} a_0 \\ a_1 \\ \end{pmatrix}
\vert a_0 \vert^2 + \vert a_1 \vert^2 = 1
{\displaystyle \langle \psi |\psi \rangle =\sum _{i}|\psi _{i}|^{2}}。

Qubit

量子位元

{\displaystyle \langle \psi |\psi \rangle =\sum _{i}|\psi _{i}|^{2}}。

且量子位元也與一般位元一樣不一定只有一位

此時依然抱持歸一性

\ket{\psi} = a_0\ket{00} + a_1\ket{01} + a_2\ket{10} + a_3\ket{11}= \begin{pmatrix} a_0 \\ a_1 \\ a_2 \\ a_3 \\ \end{pmatrix}
\vert a_0 \vert^2 + \vert a_1 \vert^2 + \vert a_2 \vert^2 + \vert a_3 \vert^2 = 1

Qubit

量子位元

\ket{\psi} = a_0\ket{00} + a_1\ket{01} + a_2\ket{10} + a_3\ket{11}= \begin{pmatrix} a_0 \\ a_1 \\ a_2 \\ a_3 \\ \end{pmatrix}
\vert a_0 \vert^2 + \vert a_1 \vert^2 + \vert a_2 \vert^2 + \vert a_3 \vert^2 = 1
\ket{01} = \ket{0} \otimes \ket{1} = \begin{pmatrix} 1 \\ 0 \\ \end{pmatrix} \otimes \begin{pmatrix} 0 \\ 1 \\ \end{pmatrix} = \begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \\ \end{pmatrix}

順帶一提,多個位元的值其實就是把更底下的位元作張量積的結果

布洛赫球面

Bloch Sphere

一種用以表示量子位元的球體

最上/下方為              

\ket{0} / \ket{1}
\ket{\psi} = \cos{\frac{\theta}{2}} \ket{0} + e^{i\phi} \sin{\frac{\theta}{2}} \ket{1}
\theta 、\phi

能以           表示一個量子疊加態的情況

0\leq \theta \leq \pi
{\displaystyle 0\leq \phi <2\pi }

布洛赫球面

Bloch Sphere

在想怎麼明天要怎麼講這東西時

意外發現得不錯的教學資源

Quantum Gate

量子閘

泡利-X閘

Pauli-X Gate

{\displaystyle X={\begin{bmatrix}0&1\\1&0\end{bmatrix}}}

在布洛赫球面上以X軸旋轉   度

\pi

其效果相當於一般電腦的NOT閘

\ket{0} \cdot \begin{pmatrix} 0&1 \\ 1&0 \\ \end{pmatrix} = \begin{pmatrix} 1 \\ 0 \\ \end{pmatrix} \cdot \begin{pmatrix} 0&1 \\ 1&0 \\ \end{pmatrix} = \begin{pmatrix} 0 \\ 1 \\ \end{pmatrix}
\ket{1} \cdot \begin{pmatrix} 0&1 \\ 1&0 \\ \end{pmatrix} = \begin{pmatrix} 0 \\ 1 \\ \end{pmatrix} \cdot \begin{pmatrix} 0&1 \\ 1&0 \\ \end{pmatrix} = \begin{pmatrix} 1 \\ 0 \\ \end{pmatrix}

泡利-Y閘

Pauli-Y Gate

{\displaystyle Y={\begin{bmatrix}0&-i\\i&0\end{bmatrix}}}
\ket{0} \cdot \begin{pmatrix} 0&-i \\ i&0 \\ \end{pmatrix} = \begin{pmatrix} 1 \\ 0 \\ \end{pmatrix} \cdot \begin{pmatrix} 0&-i \\ i&0 \\ \end{pmatrix} = \begin{pmatrix} 0 \\ i \\ \end{pmatrix}
\ket{1} \cdot \begin{pmatrix} 0&-i \\ i&0 \\ \end{pmatrix} = \begin{pmatrix} 0 \\ 1 \\ \end{pmatrix} \cdot \begin{pmatrix} 0&-i \\ i&0 \\ \end{pmatrix} = \begin{pmatrix} -i \\ 0 \\ \end{pmatrix}

在布洛赫球面上以Y軸旋轉   度

\pi

泡利-Z閘

Pauli-Z Gate

{\displaystyle Z={\begin{bmatrix}1&0\\0&-1\end{bmatrix}}}
\ket{0} \cdot \begin{pmatrix} 1&0\\0&-1 \end{pmatrix} = \begin{pmatrix} 1 \\ 0 \\ \end{pmatrix} \cdot \begin{pmatrix} 1&0\\0&-1 \end{pmatrix} = \begin{pmatrix} 1 \\ 0 \\ \end{pmatrix}
\ket{1} \cdot \begin{pmatrix} 1&0\\0&-1 \end{pmatrix} = \begin{pmatrix} 0 \\ 1 \\ \end{pmatrix} \cdot \begin{pmatrix} 1&0\\0&-1 \end{pmatrix} = \begin{pmatrix} 0 \\ -1 \\ \end{pmatrix}

在布洛赫球面上以Z軸旋轉   度

\pi
X^2 = Y^2 = Z^2
{\displaystyle X={\begin{bmatrix}0&1\\1&0\end{bmatrix}}}
{\displaystyle Y={\begin{bmatrix}0&-i\\i&0\end{bmatrix}}}
{\displaystyle Z={\begin{bmatrix}1&0\\0&-1\end{bmatrix}}}

阿達馬閘

Hadamard Gate

{\displaystyle H={\frac {1}{\sqrt {2}}}{\begin{bmatrix}1&1\\1&-1\end{bmatrix}}}

※這東西是么正矩陣

它可以讓一個量子位元變成疊加態

\ket{0} \cdot H = \frac{\ket{0} + \ket{1}} {\sqrt{2}}
\ket{1} \cdot H = \frac{\ket{0} - \ket{1}} {\sqrt{2}}

Qiskit

一個量子計算的Python函式庫

qiskit是一個由IBM公司研發的函式庫

主要適用於python

而其中包含了各種對量子邏輯控制的操作功能

想深入研究的可以看它的官方文件

介紹

先備冷知識

其實原生的python是支援虛數的喔

a = 1 + 2j
b = 3 + 4j

print(a + b)
>>> (4+6j)
a = 1 + 2j
b = 3 + 4j

print(a * b)
>>> (-5+10j)
a = 1 + 2j
b = 3 + 4j

print(a > b)
>>> TypeError

以 j 進行表示

類別為complex(複數)

也跟數學中的虛數一樣不能進行數字大小的比較

print(type(1 + 2j))
>>> <class 'complex'>
import numpy as np


a = np.array([1, 0])
b = np.array([0, 1])

x = np.array([[0, 1], [1, 0]])
y = np.array([[0, -1j], [1j, 0]])
z = np.array([[1, 0], [0, -1]])

for gate in [x, y, z]:
    for k in [a, b]:
        print(
            f"{k} * {gate} = {np.dot(k, gate)}"
              .replace("j", "i")
              .replace(".", "")
              .replace("\n", "")
            )
    print("\n")

先備冷知識

其實原生的python是支援虛數的喔

from qiskit.circuit.library import \
XGate, YGate, ZGate, HGate

print("H:")
print(HGate().to_matrix())

print("X:")
print(XGate().to_matrix())

print("Y:")
print(YGate().to_matrix())

print("Z:")
print(ZGate().to_matrix())
#-#%$@^$&#%&^*$*^&
>>> H:
[[ 0.70710678+0.j  0.70710678+0.j]
 [ 0.70710678+0.j -0.70710678+0.j]]
X:
[[0.+0.j 1.+0.j]
 [1.+0.j 0.+0.j]]
Y:
[[ 0.+0.j -0.-1.j]
 [ 0.+1.j  0.+0.j]]
Z:
[[ 1.+0.j  0.+0.j]
 [ 0.+0.j -1.+0.j]]

各個閘的輸出就如前面教學一樣

而qiskit內包含的閘還有超多

詳細可以去這裡

在qiskit中的量子閘

from qiskit.circuit.library import \
CXGate, CYGate, CZGate, CHGate

print("CH:")
print(CHGate().to_matrix())

print("CX:")
print(CXGate().to_matrix())

print("CY:")
print(CYGate().to_matrix())

print("CZ:")
print(CZGate().to_matrix())
#-#%$@^$&#%&^*$*^&
>>> CH:
[[ 1.        +0.j  0.        +0.j  0.        +0.j  0.        +0.j]
 [ 0.        +0.j  0.70710678+0.j  0.        +0.j  0.70710678+0.j]
 [ 0.        +0.j  0.        +0.j  1.        +0.j  0.        +0.j]
 [ 0.        +0.j  0.70710678+0.j  0.        +0.j -0.70710678+0.j]]
CX:
[[1.+0.j 0.+0.j 0.+0.j 0.+0.j]
 [0.+0.j 0.+0.j 0.+0.j 1.+0.j]
 [0.+0.j 0.+0.j 1.+0.j 0.+0.j]
 [0.+0.j 1.+0.j 0.+0.j 0.+0.j]]
CY:
[[1.+0.j 0.+0.j 0.+0.j 0.+0.j]
 [0.+0.j 0.+0.j 0.+0.j 0.-1.j]
 [0.+0.j 0.+0.j 1.+0.j 0.+0.j]
 [0.+0.j 0.+1.j 0.+0.j 0.+0.j]]
CZ:
[[ 1.+0.j  0.+0.j  0.+0.j  0.+0.j]
 [ 0.+0.j  1.+0.j  0.+0.j  0.+0.j]
 [ 0.+0.j  0.+0.j  1.+0.j  0.+0.j]
 [ 0.+0.j  0.+0.j  0.+0.j -1.+0.j]]

也包含對多個qubit做運算的量子閘

(上面這些的輸入為2位數的qubit)

在qiskit中的量子閘

import matplotlib.pyplot as plt
from qiskit import QuantumCircuit

qc = QuantumCircuit(3)
qc.h(0)
qc.cx(0, 1)
qc.y(1)
qc.cz(1, 2)

qc.draw("mpl")
plt.show()
#-#%$@^$&#%&^*$*^&

Output

來逐行解釋٩(´ᗜ`*)୨

Build

import matplotlib.pyplot as plt
from qiskit import QuantumCircuit

qc = QuantumCircuit(3)
qc.h(0)
qc.cx(0, 1)
qc.y(1)
qc.cz(1, 2)

qc.draw("mpl")
plt.show()
#-#%$@^$&#%&^*$*^&

建立一個3行的QuantumCircuit(量子電路)的物件

Build

import matplotlib.pyplot as plt
from qiskit import QuantumCircuit

qc = QuantumCircuit(3)
qc.h(0)
qc.cx(0, 1)
qc.y(1)
qc.cz(1, 2)

qc.draw("mpl")
plt.show()
#-#%$@^$&#%&^*$*^&

Build

幫電路放上各種閘

閘後面的數字是放在電路中的第幾位

import matplotlib.pyplot as plt
from qiskit import QuantumCircuit

qc = QuantumCircuit(3)
qc.h(0)
qc.cx(0, 1)
qc.y(1)
qc.cz(1, 2)

qc.draw("mpl")
plt.show()
#-#%$@^$&#%&^*$*^&

Build

draw函數可以將電路繪製出來

繪製的類型包含

文字(text)、matplotlib圖(mpl)、latex(latex)

這邊要注意不管用哪種類型生成都是生成物件

還是需要後續的呈現(e.g. print(), plt.show())

import matplotlib.pyplot as plt
from qiskit import QuantumCircuit

qc = QuantumCircuit(3)
qc.h(0)
qc.cx(0, 1)
qc.y(1)
qc.cz(1, 2)

qc.draw("mpl")
plt.show()
#-#%$@^$&#%&^*$*^&

Build

print(qc.draw("text"))
>>>
     ┌───┐
q_0: ┤ H ├──■──────────
     └───┘┌─┴─┐┌───┐
q_1: ─────┤ X ├┤ Y ├─■─
          └───┘└───┘ │
q_2: ────────────────■─

latex由於只能生成於pdf等檔案

或是用jupyter notebook(ipython)顯示

所以就不示範了

import matplotlib.pyplot as plt
from qiskit import QuantumCircuit

qc = QuantumCircuit(3)
qc.h(0)
qc.cx(0, 1)
qc.y(1)
qc.cz(1, 2)

qc.draw("mpl")
plt.show()
#-#%$@^$&#%&^*$*^&

Build

喔順帶一提

每行的起點都是

\ket{0}
import matplotlib.pyplot as plt
from qiskit import QuantumCircuit

qc = QuantumCircuit(3)
qc.h(0)
qc.cx(0, 1)
qc.y(1)
qc.cz(1, 2)

qc.draw("mpl")
plt.show()
#-#%$@^$&#%&^*$*^&

Build

print(qc.draw("text"))
>>>
     ┌───┐
q_0: ┤ H ├──■──────────
     └───┘┌─┴─┐┌───┐
q_1: ─────┤ X ├┤ Y ├─■─
          └───┘└───┘ │
q_2: ────────────────■─

latex由於只能生成於pdf等檔案

或是用jupyter notebook(ipython)顯示

所以就不示範了

import numpy as np
import matplotlib.pyplot as plt
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit, transpile
from qiskit.quantum_info import SparsePauliOp
from qiskit.visualization import plot_histogram
from qiskit_aer import AerSimulator
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler

simulator = AerSimulator()
qc = QuantumCircuit(2, 2)
qc.x(0)
qc.measure([0,1], [0,1])

qc.draw('mpl')
plt.show()

tc = transpile(qc, simulator)
job = simulator.run(tc, shots=1000)
result = job.result()

counts = result.get_counts(qc)
print(counts)

plot_histogram(counts)
plt.show()
#-#%$@^$&#%&^*$*^&

Transpile

#-#%$@^$&#%&^*$*^&

有空補

我好累要去睡覺了ㄅㄅ

量子邏輯

By lucasw

量子邏輯

  • 210