lucasw
大佬教麻
建電社員 -> 建資社員
常駐於DC活網人口
音遊好難...大佬教嗎...
競程好難...大佬教嗎...
數學好難...大佬教嗎...
Python(DC機器人、網頁後端、機器學習、資料分析、爬蟲、競程)
JavaScript(前端)
C/C++(競程)
C#(Unity)
Batch
Ruby(寒訓學的東東好難用)
架過網頁、Minecraft、DC機器人的伺服器
Minecraft Function
Scratch
「在物理學中,量子(quantum)是參與基本相互作用的任何物理實體(物理性質)的最小量。量子的概念」----維基百科
「在物理學中,量子(quantum)是參與基本相互作用的任何物理實體(物理性質)的最小量。量子的概念」----維基百科
而這樣的東東有著許多酷酷的特性
像是量子疊加態、量子糾纏
在光經過兩個狹縫最終射到螢幕上後
原本以為在螢幕上的圖案應該會是兩個縫
觀察後會發現它以粒子的形式在上面擺出狹縫相間的圖案
也就是說它在實際射到螢幕之前
會具有波的性質,所以之間會如水中的漣漪一般互相干涉
這一系列的實驗證明了光的波粒二像性
而就算把發射的對象從光換成一次一顆一顆電子射出
會發現得到一樣的結果
其證明了單顆電子甚至會在兩縫之中分別存在並自己干涉自己
代表它在兩縫都是有機率存在的情況
由海森堡(Werner Heisenberg)在1927年
發表的論文之中提出的原理
由海森堡(Werner Heisenberg)在1927年
發表的論文之中提出的原理
由海森堡(Werner Heisenberg)在1927年
發表的論文之中提出的原理
其表示粒子的位置和動量不可能同時被精準測量
其中也論文中也講到原子的電子軌道是無法被觀察的
啊至於更詳細的我懶得講
大概就是有個東西叫做波包可以用來描述粒子
它是讓多個波(無法表示位置)透過傅立葉轉換將這些以週期函數表示的波的線性組合逼近出一個讓它具有「位置」的特性的東東
但這樣它在原本這些波上的「動量」資訊就會喪失
所以也就是說當你得到它的位置資訊越清楚相對地它的動量資訊就不會那麼清楚
剩下的詳細解釋我有空補 我想睡覺了好累
而上面講了這麼多
就是大概描述了量子疊加態的概念
量子力學中不同於古典力學具有決定性
而這樣一個同時具有不同性質的特性
可以讓我們在電腦中用更少的位元表示更多的資訊
由於很昂貴,所以一般不會有
也就是說後面的範例code其實本質上是在
你的傳統電腦模擬量子電腦的運行
但如果在真的量子電腦上面計算速度會比傳統電腦
快超多...甚至可以用來暴力破解一些加密算法
在進入量子之前,要先來講一些量子會用到的數學
首先來講點基礎的矩陣、向量等知識
簡單補充一下,待會可能會稍微用到
將複數虛部變號,以星號或是上方直線表示
以〈、〉、|表示量子態向量的一種方式
以〈、〉、|表示量子態向量的一種方式
用 表示A與B的內積
以 表示,若是i等於j則為1,反之為0
「┼」表示共軛轉置
若是一個矩陣符合以上性質
則稱為么正矩陣
一般的電腦位元以0/1去做訊號的表示
那如果是量子電腦呢?
一般的電腦位元以0/1去做訊號的表示
那如果是量子電腦呢?
在量子電腦中取代位元的便是「量子位元」
量子位元以 表示
他不代表準確的0/1
而是以向量的形式表示該位元不同性質的機率
且其為各種性質的機率合計需為1
這就是量子的歸一性
且量子位元也與一般位元一樣不一定只有一位
此時依然抱持歸一性
順帶一提,多個位元的值其實就是把更底下的位元作張量積的結果
一種用以表示量子位元的球體
最上/下方為
能以 表示一個量子疊加態的情況
在想怎麼明天要怎麼講這東西時
意外發現得不錯的教學資源
在布洛赫球面上以X軸旋轉 度
其效果相當於一般電腦的NOT閘
在布洛赫球面上以Y軸旋轉 度
在布洛赫球面上以Z軸旋轉 度
※這東西是么正矩陣
它可以讓一個量子位元變成疊加態
其實原生的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]]
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)
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
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(量子電路)的物件
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()
#-#%$@^$&#%&^*$*^&
幫電路放上各種閘
閘後面的數字是放在電路中的第幾位
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()
#-#%$@^$&#%&^*$*^&
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()
#-#%$@^$&#%&^*$*^&
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()
#-#%$@^$&#%&^*$*^&
喔順帶一提
每行的起點都是
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()
#-#%$@^$&#%&^*$*^&
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()
#-#%$@^$&#%&^*$*^&
#-#%$@^$&#%&^*$*^&
我好累要去睡覺了ㄅㄅ
By lucasw