觀測對測量結(jié)果的影響
一個宏觀對象嬉探,假設(shè)他有a,b,c 3個屬性擦耀,該屬性在對象生成時就確定,值可以為0或者1涩堤。就如同你生來就是男生/女生 不可修改眷蜓,當(dāng)然現(xiàn)在可以變性,但是實(shí)際上你的基因并不會改變定躏,僅僅是“形似”罷了账磺。
import random
class Object:
def __init__(self):
self.__a = random.randint(0,1)
self.__b = random.randint(0,1)
self.__c = random.randint(0,1)
def get_a(self):
return self.__a
def get_b(self):
return self.__b
def get_c(self):
return self.__b
o = Object()
print("a:"+str(o.get_a())+" b:"+str(o.get_b())+" c:"+str(o.get_c()))
print("b:"+str(o.get_b())+" a:"+str(o.get_a()))
print("c:"+str(o.get_a())+" b:"+str(o.get_b()))
print("a:"+str(o.get_a())+" c:"+str(o.get_b()))
顯而易見芹敌,對象生成后它的屬性便是一個確定的值痊远,該結(jié)果不會因?yàn)槟愕臏y量順序而改變。比如你是一個漢族男性氏捞,不會因?yàn)橄葯z查你的性別還是先檢查你的民族而有所差別碧聪,在人類沒有發(fā)現(xiàn)量子世界的性質(zhì)之前,世間萬物皆為如此液茎〕炎耍可能的運(yùn)行結(jié)果:
a:1 b:0 c:0
b:0 a:1
c:0 b:0
a:1 c:0
量子的觀測不對異性
對量子的不同特征進(jìn)行測量,觀測的順序會影響測量的結(jié)果捆等,這種性質(zhì)被稱為 “量子的觀測不對異性” 滞造。嗯,一個充滿哲♂學(xué)氣息的性質(zhì)栋烤,可見量子是個gay谒养,觀測只對同性。
注意明郭,該結(jié)果不是隨機(jī)的买窟,而是“疊加的”丰泊,因?yàn)楫?dāng)你的測量順序一定時得到的結(jié)果是確定的。在兩個屬性(a,b)的情況下始绍,一個量子的觀測方式有[a,b],[b,a]兩種瞳购,因此其a,b屬性應(yīng)該是兩種狀態(tài)的疊加。以此類推我們用代碼來描述一個擁有a,b,c 3個屬性的“量子對象”亏推。
class TreeNode:
def __init__(self):
self.__children = {}
self.__val = random.randint(0,1)
def set_child(self, name, child):
self.__children[name]=child
return child # 方便連續(xù)調(diào)用簡化代碼
def get_child(self, name):
return self.__children[name]
def get_val(self):
return self.__val
class Quantum:
#關(guān)于疊加態(tài) 我們可以用樹結(jié)構(gòu)來維護(hù)
#一個3個屬性的量子学赛,可表示為,
# root
# / | \
# a b c
# /\ /\ /\
# b c a c a b
# | | | | | |
# c b c a b a
# 測量方式,隊(duì)列径簿,如果新的測量屬性和隊(duì)列中最后一個值不一致則加入隊(duì)列罢屈,
# 如果隊(duì)列長度大于(屬性數(shù)-1)則頭部數(shù)據(jù)出列,篇亭,為了便于理解缠捌,假設(shè)有abc三個屬性
# 測量屬性 隊(duì)列值
# a [a]
# b [a,b]
# c [b,c]
# c [b,c] 和最后一次測量一樣 不發(fā)生改變
# a [c,a]
def __init__(self):
self.route = []
root = TreeNode()
self.root = root
root.set_child('a',TreeNode()).set_child('b',TreeNode()).set_child('c',TreeNode())
root.get_child('a').set_child('c',TreeNode()).set_child('b',TreeNode())
root.set_child('b',TreeNode()).set_child('a',TreeNode()).set_child('c',TreeNode())
root.get_child('b').set_child('c',TreeNode()).set_child('a',TreeNode())
root.set_child('c',TreeNode()).set_child('a',TreeNode()).set_child('b',TreeNode())
root.get_child('c').set_child('b',TreeNode()).set_child('a',TreeNode())
def __get(self, name):
length = len(self.route)
if (length == 0 or self.route[-1]!=name):
self.route.append(name)
if (len(self.route) >2):
self.route.pop(0)
node = self.root
for name in self.route:
node = node.get_child(name)
return node.get_val()
def get_a(self):
return self.__get('a')
def get_b(self):
return self.__get('b')
def get_c(self):
return self.__get('c')
好了,我們已經(jīng)通過代碼實(shí)現(xiàn)了“觀測對測量結(jié)果產(chǎn)生影響”的效果译蒂。每一次get屬性值曼月,就是對對象的一次觀測,不同觀測順序下柔昼,變量會返回不同的值哑芹。
# 創(chuàng)造一個量子并對他的屬性反復(fù)觀測
q = Quantum()
print('a',q.get_a())
print('b',q.get_a())
print('a',q.get_b())
print('c',q.get_c())
print('a',q.get_a())
print('b',q.get_a())
print('a',q.get_a())
可能的運(yùn)行結(jié)果
a 0
b 0
a 1
c 1
a 0
b 0
a 0
量子秘鑰分發(fā)
通過量子的物理性質(zhì),保證了秘鑰分發(fā)時的絕對安全
用代碼來模擬該過程:
from quantum import Quantum
import random
class Observer:
length = 20
def __init__(self, name):
self.name = name
self.q_list = [] # 量子集合
# 初始化量子集合
def init_quantum(self):
for i in range(Observer.length):
self.q_list.append(Quantum())
# 觀測
def observe(self):
def __observe(quantum):
ran = random.randint(0, 2)
#最常見的光量子就有“線偏振”和“圓偏振”兩種屬性
# 只使用a,b兩個屬性 來模擬這種情況
if (ran == 0):
return ('a', q.get_a())
else:
return ('b', q.get_b())
self.path = []
self.result = []
for q in self.q_list:
result = __observe(q)
self.path.append(result[0])
self.result.append(result[1])
print(self.name,'觀測方式:', self.path)
print(self.name,'觀測結(jié)果:', self.result)
# 從另一個觀測者獲取量子序列
def get_quantum(self, another):
self.q_list=another.q_list
# 從另一個觀測者獲取觀測方式
def get_path(self, another):
self.key = []
for i in range(Observer.length):
if (another.path[i] == self.path[i]):
self.key.append(self.result[i])
print(self.name,'秘鑰:', self.key)
觀測和秘鑰傳輸
sender = Observer('發(fā)送者')
sender.init_quantum() # 初始化量子序列
sender.observe() # 對量子序列進(jìn)行觀測
reciver = Observer('接收者')
reciver.get_quantum(sender) # 發(fā)送者把量子傳輸給接收者
reciver.observe() # 接收者對其觀測
# 雙方交換觀察方式
sender.get_path(reciver)
reciver.get_path(sender)
可以得到這樣的運(yùn)行結(jié)果:
發(fā)送者 觀測方式: ['b', 'b', 'a', 'a', 'a', 'b', 'b', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'a', 'b', 'a', 'b', 'b', 'b']
發(fā)送者 觀測結(jié)果: [0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1]
接收者 觀測方式: ['a', 'b', 'a', 'a', 'b', 'b', 'a', 'a', 'b', 'b', 'b', 'b', 'a', 'b', 'b', 'b', 'b', 'b', 'b', 'a']
接收者 觀測結(jié)果: [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0]
發(fā)送者 秘鑰: [0, 0, 1, 1, 0, 1, 0, 0, 1, 1]
接收者 秘鑰: [0, 0, 1, 1, 0, 1, 0, 0, 1, 1]
如何保證安全
在模擬的代碼中捕透,“量子的觀測不對異性” 通過存儲觀測方式 path 在Quantum對象中實(shí)現(xiàn)聪姿。這是我們在宏觀世界來模擬這種現(xiàn)象的一種實(shí)現(xiàn)手段,實(shí)際上這是一種基本物理性質(zhì)乙嘀,觀測者不可能從量子上得到之前對它觀測的方式末购。
量子不可克隆
要保證安全還需要量子的另一個特性“量子不可克隆”。就是說虎谢,世間沒有兩個相同的量子盟榴,你不可能通過一個已得到的量子獲得完全相同的另一個量子。沒有這個原理婴噩,竊聽者完全可以復(fù)制一個量子對它進(jìn)行觀測并把原來的量子傳送給接收者擎场。
竊聽過程
知道上述兩個物理性質(zhì)后,如果有人試圖監(jiān)聽几莽,便是只能中截獲了發(fā)送者傳輸?shù)牧孔友赴欤⒂^測其值,然后再把它發(fā)送給接收者章蚣。然而此時所有人都不知道發(fā)送者的觀測方式站欺。竊聽者也只能按自己的想法隨意觀測其屬性。但沒有關(guān)系,你對量子的觀測便改變了量子的狀態(tài)镊绪,當(dāng)接收者獲取到量子時匀伏,即便和發(fā)送者用同樣的方式觀測,也有可能得到不同的結(jié)果蝴韭,當(dāng)這個序列數(shù)量非常大的時候,這是必然發(fā)生的够颠,結(jié)果就是得到了和發(fā)送者不一樣的秘鑰,這樣竊聽便被發(fā)現(xiàn)了榄鉴。
模擬上述過程:
sender = Observer('發(fā)送者')
sender.init_quantum() # 初始化量子序列
sender.observe() # 對量子序列進(jìn)行觀測
interceptor = Observer('竊聽者')
interceptor.get_quantum(sender) # 截取信息
interceptor.observe() # 觀測
reciver = Observer('接收者')
reciver.get_quantum(interceptor) # 發(fā)送者把量子傳輸給接收者
reciver.observe() # 接收者對其觀測
# 雙方交換觀察方式
sender.get_path(reciver)
reciver.get_path(sender)
運(yùn)行結(jié)果:
發(fā)送者 觀測方式: ['b', 'a', 'b', 'a', 'b', 'b', 'b', 'a', 'b', 'a', 'b', 'b', 'a', 'a', 'b', 'b', 'b', 'a', 'b', 'a']
發(fā)送者 觀測結(jié)果: [1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1]
竊聽者 觀測方式: ['a', 'b', 'a', 'b', 'b', 'b', 'b', 'a', 'b', 'a', 'a', 'b', 'b', 'b', 'a', 'b', 'b', 'b', 'b', 'b']
竊聽者 觀測結(jié)果: [0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0]
接收者 觀測方式: ['a', 'a', 'b', 'b', 'a', 'a', 'a', 'b', 'a', 'b', 'b', 'b', 'b', 'a', 'b', 'b', 'b', 'a', 'b', 'a']
接收者 觀測結(jié)果: [0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0]
發(fā)送者 秘鑰: [1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1]
接收者 秘鑰: [1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0]