1. 程式人生 > >因數分解演算法、週期查詢演算法(簡化)

因數分解演算法、週期查詢演算法(簡化)

質因數分解的複雜是公認,這也是我們將他作為 RSA (一種廣泛使用的公鑰加密演算法)的數學難題的原因。

\(N=P*Q\) (P、Q是質數),n = length of N in bit

對於這麼一個N,我們因數分解得到結果的時間複雜度是 \(2^n\) ,因為這個複雜,所以也有一堆的數學家在努力降低這個的時間複雜度,目前的優化結果的時間複雜度是 \(2^{ \sqrt[3]{n}}\) 。

那麼量子是否能夠有更好的結果呢?

在講因數分解之前,需要先提週期查詢演算法。

週期查詢 Period Finding

週期查詢的基礎是 量子傅立葉變換 。

Input :

\(f:(0,1,2,…,M-1) \rightarrow S\) for all x \(f(x)=f(x+r)\)

challenge :

find r

condition:

1) f is 1-1 on period 在週期內,f是一個一一對應的函式

2)\(M>>r\) \(M>2r^2\)

3)M能夠被r整除 (這是一個簡化條件,稍後會有不簡化的怎麼辦)

這個電路,我的輸入是 $ \frac{1}{\sqrt M} \sum_{x=0}^{M-1} |x\rangle |0\rangle$

經過f(x)後,我的量子疊加態是 $ \frac{1}{\sqrt M} \sum_{x=0}^{M-1} |x\rangle |f(x)\rangle$

此時,如果測量了下面的 f(x),那麼上面的量子態會坍縮,會變成只有f(x)等於測量結果的x,顯而易見,這是一個周期函式。

在 量子傅立葉變換 中,我們提到過傅立葉變換的第一個特點,當輸入shift了,結果是不會變的。

如果我們輸入的量子態的概率幅為 \(\alpha_0 , \alpha_1, \alpha_2, \alpha_3,…, \alpha_{N-1}\) ,輸出的量子態的概率幅為 \(\beta_0 , \beta_1, \beta_2, \beta_3,…, \beta_{N-1}\)

則,當我們將輸入的概率幅變為:\(\alpha_{N-},\alpha_0 , \alpha_1, \alpha_2, …, \alpha_{N-2}\) 輸出的概率不變。(這裡寫得是概率,不是概率幅,概率是概率幅的平方)

也就是說,我測量的隨機結果可能是這個週期當中的i個值,我也能shift成在第一個位置。

即,把 [0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 ……] (每個週期五個,第三個為1,其餘為0) 變成 [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 …… ] (每個週期五個,第三個為1,其餘為0) 。

他們經過傅立葉變換後的結果是一樣的。

其實到這裡,我們發現,我們測不測量f(x)其實都沒有關係,因為在這前面所有測量結果對應的x,都是同一個週期的周期函式,因為shift的原因,他們傅立葉變換後的結果都是一樣的。

那麼,這麼做的意義是?

量子傅立葉變換還有第二個特點:傅立葉變換可以改變周期函式的週期。

他可以把週期為r的函式,變成周期為 \(\frac{M}{r}\) 的函式。

對最後的這個函式測量,得到的結果是 \(\frac{M}{r}\) 的倍數,多測量幾次就知道了 \(\frac{M}{r}\) 的值。知道了這個值,很容易反推出r的值,週期查詢完成。

如果沒有簡化條件呢?

即,M不是r的倍數。

那,假設測量結果為L,則找到一個最接近 \(\frac{L}{M}\) 的分數 \(\frac{t}{r}\) ,唯一的要求是 \(M>2r^2\) 最後通過一種叫做continued fraction的方法找到r。

因數分解

一個例子:

問題:找N=21的因數。

解法:

step 1:

\(2^0=1 (\mod 21)\) 除以21後餘數為1

\(2^1=2 (\mod 21)\)

\(2^2=4 (\mod 21)\)

\(2^3=8 (\mod 21)\)

\(2^4=16 (\mod 21)\)

\(2^5=11 (\mod 21)\)

\(2^6=1 (\mod 21)\)

step 2:

\(2^6-2^0=0 (\mod 21)\)

\(2^6-1=0 (\mod 21)\)

\((2^3-1)(2^3+1)=0 (\mod 21)\)

到這一步,我們發現了什麼?

\((2^3-1)(2^3+1)\)是21的倍數,那麼他的兩個因數 \((2^3-1)\) 和 \((2^3+1)\) 一定和21有公約數。

gcd(21,7)=7

gcd(21,9)=3

gcd求最大公約數大家還熟悉嗎?

比如說,我們相找21和15的最大公約數。

\(21=15*1+6\)

\(15=6*2+3\)

\(6=3*2+0\)

最大公約數就是最後一個不為0的餘數,這裡就是3。求最大公約數的演算法很快,大概是在 \(log N\) 的級別。

那麼現在的問題其實就是step1 ,找到函式 \(f(a)=x^a \mod N\) 的週期,在上述例子中 \(2^0\) 和 \(2^6\) 取餘相等,這就是一個週期,週期為6.

現在因數分解問題就全部轉化為了週期查詢問題。

而週期查詢問題恰好,有量子加速的方法,前文已經提過了,不再累述,我們知道週期查詢有一個前提條件是 \(M> 2r^2\) ,在這個例子中,我們不知道r是多少,這個是我們要求的,但是我們知道,r<N,所以直接讓 \(M > 2N^2\) 就好。

變成電路圖就是:

得到週期,然後經過 step 2 就是我們想要的因數分解。

參考資料:
Quantume Mechanics & Quantume Computation Lecture