演算法
振幅放大(amplitude amplification)
把你問題的每一個可能答案,都想像成一台巨型混音台上的一根推桿,每根推桿的高度就是那個答案的振幅。當你最終測量時,你並不是直接讀出推桿的高度;得到某個答案的機率,是它那根推桿高度的平方。一開始,所有推桿都大致停在同樣的低位上,所以每個答案的可能性都差不多(同樣不太可能)。振幅放大,就是一種小心翼翼、反覆進行的輕推:把你想要的那些答案的推桿抬高,把其餘的壓低,這樣到最後一測量,幾乎總能交給你一個正確答案。
每一輪做兩件事:先由一個預言機(oracle)標記出好答案(翻轉它們振幅的符號),接著第二步把所有振幅都對它們的平均值做一次反射。從幾何上看,這兩步合起來,每次都把整個量子態朝被標記的答案稍稍轉近一點,就像讓指南針的指針一點點逼近正北。但你必須在恰當的時刻停手:一旦轉過了頭,振幅又會擺回去往下掉,答案反而變得更不可能。這正是 Grover 搜尋內部的引擎——在 N 個候選項中找出一個被標記的項,大約只需 sqrt(N) 步。這是一個實實在在、很有用的加速,但它是平方級(二次方)的加速,而不是某些結構化問題(例如 Shor 的整數分解)所享有的那種戲劇性的指數級提升。
p_success ~= sin^2((2k+1) * theta), where sin^2(theta) = M/N
經過 k 次迭代後,在總共 N 個答案中測得 M 個被標記答案之一的機率,遵循這條曲線——它先上升,在 k ≈ (pi/4)*sqrt(N/M) 附近達到峰值,若轉過了頭便又回落。
它並不是「一次性試遍所有答案」:那種並行性確實存在,但它之所以能見效,全靠人為設計振幅之間的干涉,在你測量之前就把機率集中到正確答案上。
又稱
另見