啟科 QuSaaS 真隨機數解決方案與 Amazon Braket 結合實踐

亞馬遜雲開發者發表於2022-12-22

作者:1.丘秉宜,2.邵偉,3.黃文,4.郭夢傑

1.亞馬遜雲科技 HERO;2.開發者生態負責人;3.DEVOPS 工程師;4.資深研發工程師

1、概述

隨機性(Randomness)是偶然性的一種形式,具有某一機率的事件集合中的各個事件所表現出來的不確定性。對於一個隨機事件可以探討其可能出現的機率,反映該事件發生的可能性的大小。隨機性在自然科學和哲學上有著重要的地位,也吸引大量的學者在這方面的研究,隨機性在實際應用中也是一種極其重要的資源,當前在許多的領域中發揮著重要的作用,例如博弈,統計抽樣,計算機模擬,密碼學等。

那麼,什麼是隨機數呢?通俗地講,隨機數序列是對一個均勻分佈隨機變數的一組抽樣,其結果是不可預測的,序列中的每個數都是獨立的,且服從均勻分佈的。隨機數通常是由隨機數發生器(Random Number Generator 簡稱 RNG)來產生的。隨機數生成是透過隨機數生成器(RNG)生成一系列數字或者符號的過程,這些數字和符號無法比隨機機會獲更好合理預測。這意味著,特定的結果序列將包含一些事後可察覺但無法預見的模式。

2、真隨機數和偽隨機數

在計算中,硬體隨機數生成器(HRNG)或真隨機數生成器是一種從物理過程而不是透過演算法生成隨機數的裝置。這種裝置通常基於微觀現象,這些微觀現象產生低水平的、統計上隨機的“噪聲”訊號,如熱噪聲、光電效應(涉及分束器)和其他量子現象。理論上,這些隨機過程是完全不可預測的,只要控制這種現象的方程是未知的或不可計算的。這與通常在計算機程式中實現的偽隨機數生成的範例形成對比。

偽隨機數生成器(PRNG),也稱為確定性隨機位生成器(DRBG),是一種用於生成其屬性近似於隨機數序列屬性的數字序列的演算法。PRNG生成的序列不是真正隨機的,因為它完全由稱為 PRNG 的種子(可能包括真正隨機的值)的初始值確定。雖然可以使用硬體隨機數生成器生成更接近真實隨機的序列,但偽隨機數生成器在實際中對其生成數字的速度和再現性非常重要。隨機數發生器在模擬(例如,蒙特卡洛方法)、電子遊戲(例如,程式生成)和密碼學等應用中至關重要。密碼應用要求輸出不能從早期輸出中預測,需要更復雜的演算法,這些演算法不繼承簡單 PRNG 的線性。

如何才能生成隨機數?生成隨機數有兩種主要方法:

  • 第一種方法測量一些預期隨機的物理現象,然後補償測量過程中可能的偏差。示例源包括測量大氣噪聲、熱噪聲和其他外部電磁和量子現象。例如,在短時間尺度上測量的宇宙背景輻射或放射性衰變代表了自然熵的來源。從自然來源獲得熵的速度取決於所測量的基本物理現象。因此,自然產生的“真實”熵的來源被稱為是阻塞的——在獲得足夠的熵以滿足需求之前,它們是速率受限的。在一些類 Unix 系統(包括大多數 Linux 發行版)上,偽裝置檔案 /dev/random 將被阻止,直到從環境中獲得足夠的熵。由於這種阻止行為,在使用這種型別的熵源的系統上,從 /dev/random 進行大容量讀取(例如用隨機位填充硬碟驅動器)通常會很慢。
  • 第二種方法使用計算演算法,可以產生長序列的明顯隨機結果,這些結果實際上完全由一個較短的初始值(稱為種子值或金鑰)決定。結果,如果種子值已知,則可以再現整個看似隨機的序列。這種型別的隨機數生成器通常被稱為偽隨機數生成器。這種型別的生成器通常不依賴於自然產生的熵源,儘管它可以由自然源週期性地播種。這種生成器型別是非阻塞的,因此它們不受外部事件的速率限制,因此可以進行大容量讀取。

還有一些系統採用真隨機和偽隨機混合的方法,在可用時提供從自然來源獲取的隨機性,並返回到基於加密安全偽隨機數生成器(CSPRNG)的定期重新播種軟體。當期望的隨機讀取速率超過自然收穫方法跟上需求的能力時,會發生回退。該方法避免了基於較慢和純環境方法的隨機數生成器的速率受限阻塞行為。 雖然僅基於確定性邏輯的偽隨機數生成器永遠不能被視為最純粹意義上的“真實”隨機數源,但實際上,它們通常足以滿足要求嚴格的安全關鍵應用。精心設計和實現的偽隨機數生成器可以被認證用於安全關鍵的加密目的,正如 yarrow 演算法和 fortuna 的情況一樣。前者是 FreeBSD、AIX、OS X、NetBSD 和其他平臺上的 /dev/random 熵源的基礎。OpenBSD 使用一種稱為 arc4random 的偽隨機數演算法。

3、量子隨機數

現在常用的依靠計算機模擬產生的偽隨機數,或者從某些經典物理噪聲(如熱噪聲,電噪聲等)中提取隨機數,實際上並不是正真正的隨機數,因為從理論上講,經典物理過程在考慮到所有變數的情況下是可以被模擬的。那麼是否存在真正的隨機數呢,隨著量子力學的發展,透過量子系統產生隨機數已經成為可能。

量子物理過程所產生的隨機性是完全真隨機的,比如量子態的坍縮過程。考慮處於疊加狀態的一個量子位元:$\ket{\psi}= 1/\sqrt{2}(\ket{0}+\ket{1})$。當使用 Z 基對此位元進行操作然後測量該量子位元時,將以1/2的機率測得 $\ket{0}$,1/2的機率測得 $\ket{1}$。值得注意的是,量子態的測量與拋硬幣情況不同,這裡出現的隨機性是量子系統所固有的,而不是因為對系統的不瞭解而產生的。也就是說,用這樣的測量方式來觀測這樣的態(兩者均明確已知),其觀測結果就是隨機的,這是由量子力學基本原理決定的。使用量子系統的這種內稟隨機性產生的隨機數就是真隨機數。

4、啟科 QuSaaS 量子真隨機數解決方案

針對應用中需要使用真隨機數的場景,啟科推出了自己真隨機數方案。在介紹啟科真隨機數解決方案之前,啟科旗下的幾個軟體平臺需要先和大家簡要介紹一下:

QuSaaS:啟科量子的開發者社群平臺,提供量子計算 API 呼叫,量子應用建立及應用部署呼叫介面。

QuPot:啟科量子私有云平臺,管理啟科的模 擬量子計算、量子計算應用整合與解耦部署,例如Qubox。

QuTrunK:QuTrunk 是啟科量子自主研發的一款免費、開源、跨平臺的量子計算程式設計框架,包括量子程式設計 API、量子命令轉譯、量子計算後端介面等。 Qutrunk 使用 Python 作為宿主語言,利用 Python 的語法特性實現針對量子程式的 DSL (領域專用語言),基於量子邏輯閘、量子線路等概念提供量子程式設計所需各類 API。它也可以作為其他上層量子計算的應用的基礎。

QuSprout:QuSprout 是啟科量子自主研發的一款免費、開源的量子計算模擬後端,使用者在 QuTrunk 量子程式設計框架生成量子線路後, 如果需要更高的執行效率,需要連線到 QuSprout 計算後端來進行模擬計算。QuSprout 使用 C++ 作為宿主語言, 支援多個量子線路的任務管理、MPI 多程式平行計算。

QuBox:預裝 QuSprout 的 PKS 體系硬體,以產品形態 為使用者提供量子模擬資源 使用者使用啟科真量子隨機數解決方案,有兩個使用場景可以採用:

1)使用啟科開源量子程式設計框架 Qutrunk 開發量子計算程式,採用自建模擬量子計算資源。即使用者採購Qubox部署到自己機房,本地開發直接透過訪問本地機房的 qubox 硬體資源,呼叫 qusprout 的 API 訪問 QRNG 產生隨機數。

2)直接使用啟科量子提供的雲上資源,使用者註冊 QuSaaS,根據 QuSaaS 應用部署建立模板要求開發量子應用,註冊應用獲取 AK,SK,調測中透過 API 閘道器呼叫隨機數卡的介面,QuSaaS 進行認證授權透過 Qusprout 呼叫 qubox 隨機數卡生成隨機數。開發完成後透過 QuSaaS 部署應用到 QuPot,此時應用執行在一個 qutrunk 環境中,掉用隨機數過程與本地呼叫流程一致。邏輯圖如下:

5、QuSaaS 真隨機數與 Amazon Braket 結合示例

Amazon Braket 是一項完全託管式量子計算服務,旨在幫助加快量子計算的科學研究和軟體開發。使用者可以透過本地 Jupyter Notebook/IDE 或者 Amazon console 使用 Amazon Braket SDK 開發量子程式,呼叫亞馬遜雲科技提供量子硬體或者模擬資源執行量子計算程式。

此前不久我們針對 Qutrunk,QuSprout 與 Amazon Braket 結合實踐上已經有了一些文章釋出,我們本次在此基礎上進一步擴充到其他服務。本文將針對 QuTrunk 結合 Amazon Barket後端然利用 QuSaaS 的真隨機數接入服務來完成一個小的演示示例。下面我們將分佈進行說明。

如果需要使用 QuSaaS 真隨機數需要按照如下流程操作:

5.1 QuSaaS 真隨機數獲取操作步驟

1、註冊 QuSaaS

登入 QuSasS 網站:http://developer.queco.cn/ 點選右上角註冊按鈕,完成註冊

2、透過 QuSaaS 下載中心下載 QuBranch 和 QuTrunk,並完成本地開發環境部署。詳細的安裝及部署材質指導請參考 QuSaaS 上的學習文件:http://developer.queco.cn/lea...

3、點選 API 商城採購 Qutrunk 雲介面,新註冊使用者提供一定配額的免費額度。

4、點選右上角個人使用者名稱,選擇我的應用,開啟應用註冊頁面。

然後點選建立應用,完成應用建立,並可以獲取到 API 的 AK 和 SK 資訊。

5、使用 QuTrunk 開發程式呼叫隨機數

1)首先匯入 qutrunk 使用的後端模組,使用 QuSaaS 作為後端。

2)從 QuSaaS 上獲取的 AK 和 SK 資訊,指定呼叫的 ak 和 sk 引數的值

3)呼叫 QuSaaS 後端獲取真隨機數

4)列印獲取的隨機數的值

程式碼如下:

from qutrunk.backends import BackendQuSaas, BackendQuSprout

ak = "BNwHKbBIkVT8DSfDlWnZl4rosB7Ie7hhvDvRehyz"
sk = "V2ZfqQJPiaCQhrzAeIIZjNilBrTdqQEujkqXrUP3MtYt1vPCbBo47e8gwRjJcJlaXNJSParPOudhaX8WesvfXSAeb1yYfvC6gbElHoNoH7ali4jLvuxI87v3NCjPMCmu"
# use BackendQuSaas
be = BackendQuSaas(ak, sk)

# generate random number
rands = be.get_rand(20, 2)
print(rands)

列印結果如下:

[b"V\xf1\xcf\x1c\xd2p?\xa3Z`d\xdc'6\x8c2\xbfj\xee\x90", b"su\x073'&\xce\xfe\xfbF%\xf3\xb3\x93\x13\xc5\x83\x8a\xa3s"]

5.2 Amazon Braket 使用 QuSaaS 真隨機數

我們展示一個使用 Amazon Braket 後端執行貝爾電路的例子。使用模擬量子計算的時候需要用到隨機數,我們這裡透過 QuSaaS 獲取的真隨機數作為隨機數種子來產生隨機數,以執行貝爾電路。

1、首先準備環境,匯入需要用到的模組

import numpy as np

from qutrunk.backends import BackendQuSaas
from qutrunk.backends.braket import BackendAWSLocal
from qutrunk.circuit import QCircuit
from qutrunk.circuit.gates import H, CNOT, All, Measure

2、呼叫 SaaS 後端獲取真隨機數

設定獲取真隨機數的長度為4,指定 ak 和 sk 為我們賬號下注冊應用的 AK 和 SK,然後指定使用 QuSaaS 後端,透過 get_rand() 函式獲得隨機數。

BYTE_LEN4INT = 4
ak = "BNwHKbBIkVT8DSfDlWnZl4rosB7Ie7hhvDvRehyz"
sk = "V2ZfqQJPiaCQhrzAeIIZjNilBrTdqQEujkqXrUP3MtYt1vPCbBo47e8gwRjJcJlaXNJSParPOudhaX8WesvfXSAeb1yYfvC6gbElHoNoH7ali4jLvuxI87v3NCjPMCmu"
saas_be = BackendQuSaas(ak, sk)
rand_bytes = saas_be.get_rand(BYTE_LEN4INT, 1)
print(rand_bytes)

輸出的隨機數:

b'v\x1b\xd6\xaf'

3、隨機數轉換

我們生成的隨機數預設是16進位制數,需要轉換成10進位制整數。

rand_int = int.from_bytes(rand_bytes[0], byteorder='big')
print(rand_int)
1981535919

4、亞馬遜雲科技後端使用真隨機數,執行貝爾電路

亞馬遜雲科技本地模擬是使用 numpy 實現,我們將生成的隨機數用於亞馬遜雲科技本地後端的模擬,使用真隨機數作為 numpy 隨機數生成的種子。然後透過亞馬遜雲科技後端執行貝爾電路。

np.random.seed(rand_int)
qc = QCircuit(backend=BackendAWSLocal())
qr = qc.allocate(2)

# Apply quantum gate
H * qr[0]
CNOT * (qr[0], qr[1])

# Measure all quantum qubits
All(Measure) * qr

# Print quantum circuit as operqasm grammar
qc.print(format="openqasm")

# Run quantum circuit
res = qc.run(1024)
print(res.get_counts())
執行結果如下:
OPENQASM 2.0;
include "qulib1.inc";
qreg q[2];
creg c[2];
h q[0];
cx q[0],q[1];
measure q[0] -> c[0];
measure q[1] -> c[1];
[{"00": 493}, {"11": 531}]

作者:

Keith Yan(丘秉宜)中國首位亞馬遜雲科技 Community Hero。

Bertran Shao(邵偉),啟科量子開發者關係負責人,國內首個開源量子計算社群發起者。

黃文,啟科量子 DEVOPS 工程師

Marz Kuo(郭夢傑),啟科量子資深研發工程師,量子計算開源框架維護人

閱讀原文:https://dev.amazoncloud.cn/co...

相關文章