อัลกอริทึม Deutsch-Jozsa
อัลกอริทึมของ Deutsch มีประสิทธิภาพเหนือกว่าอัลกอริทึมคลาสสิกทั้งหมดสำหรับปัญหา query แต่ข้อได้เปรียบยังค่อนข้างน้อย: หนึ่ง query แทนที่จะสอง อัลกอริทึม Deutsch-Jozsa ขยายข้อได้เปรียบนี้ออกไป และจริง ๆ แล้ว สามารถใช้แก้ปัญหา query ได้สองปัญหา
นี่คือคำอธิบายวงจรควอนตัมของอัลกอริทึม Deutsch-Jozsa ขั้นตอนการประมวลผลหลังคลาสสิกเพิ่มเติม ที่ไม่ได้แสดงในภาพ อาจจำเป็นด้วยขึ้นอยู่กับปัญหาเฉพาะที่ต้องการแก้
แน่นอน เรายังไม่ได้พูดถึงว่าอัลกอริทึมนี้แก้ปัญหาอะไร ซึ่งจะอธิบายในสองส่วนถัดไป
ปัญหา Deutsch-Jozsa
เราจะเริ่มจากปัญหา query ที่อัลกอริทึม Deutsch-Jozsa ถูกออกแบบมาเพื่อแก้โดยตรง ซึ่งเรียกว่า ปัญหา Deutsch-Jozsa
ฟังก์ชันอินพุตของปัญหานี้อยู่ในรูปแบบ สำหรับจำนวนเต็มบวก ที่กำหนดใด ๆ เหมือนกับปัญหาของ Deutsch งานคือการแสดงผล ถ้า เป็น constant และ ถ้า เป็น balanced ซึ่งหมายความอีกครั้งว่าจำนวนสตริงอินพุตที่ฟังก์ชันให้ค่า เท่ากับจำนวนสตริงอินพุตที่ฟังก์ชันให้ค่า
สังเกตว่า เมื่อ มีค่ามากกว่า มีฟังก์ชันรูปแบบ ที่ไม่เป็นทั้ง constant และ balanced ตัวอย่างเช่น ฟังก์ชัน ที่นิยามโดย
ไม่อยู่ในหมวดหมู่ใดหมวดหมู่หนึ่ง สำหรับปัญหา Deutsch-Jozsa เราไม่ต้องกังวลเกี่ยวกับฟังก์ชันแบบนี้ — พวกมันถือเป็นอินพุต "don't care" นั่นคือ สำหรับปัญหานี้เรามี promise ว่า เป็นทั้ง constant หรือ balanced
อัลกอริทึม Deutsch-Jozsa ด้วย query เดียว แก้ปัญหานี้ในความหมายต่อไปนี้: ถ้าทุกผลการวัด ตัวเป็น แล้วฟังก์ชัน เป็น constant และในทางกลับกัน ถ้าผลการวัดอย่างน้อยหนึ่งตัวเป็น แล้วฟังก์ชัน เป็น balanced อีกวิธีหนึ่งในการพูดคือวงจรที่อธิบายข้างต้นตามด้วยขั้นตอนการประมวลผลหลังคลาสสิกที่คำนวณ OR ของผลการวัดเพื่อสร้างเอาต์พุต
การวิเคราะห์อัลกอริทึม
เพื่อวิเคราะห์ประสิทธิภาพของอัลกอริทึม Deutsch-Jozsa สำหรับปัญหา Deutsch-Jozsa เป็นประโยชน์ที่จะเริ่มด้วยการคิดถึงการกระทำของ Hadamard Gate ชั้นเดียว การดำเนินการ Hadamard สามารถแสดงเป็นเมทริกซ์ตามปกติ
แต่เราสามารถแสดงการดำเนินการนี้ในแง่ของการกระทำบนสถานะฐานมาตรฐานได้ด้วย:
สองสมการนี้สามารถรวมเป็นสูตรเดียวได้
ซึ่งเป็นจริงสำหรับทั้งสองค่าของ
ทีนี้สมมติว่าแทนที่จะมี Qubit เดี่ยว เรามี Qubit และดำเนินการ Hadamard บนแต่ละตัว การดำเนินการรวมบน Qubit อธิบายด้วย tensor product ( ครั้ง) ซึ่งเราเขียนสั้น ๆ ว่า โดยใช้สูตรข้างต้น ตามด้วยการขยายแล้วลดรูป เราสามารถแสดงการกระทำของการดำเนินการรวมนี้บนสถานะฐานมาตรฐานของ Qubit ได้ดังนี้:
ที่นี่ เราเขียนสตริงไบนารีความยาว เป็น และ ตามข้อตกลงการจัดดัชนีของ Qiskit
สูตรนี้เป็นเครื่องมือที่มีประโยชน์สำหรับการวิเคราะห์วงจรควอนตัมข้างต้น หลังจากดำเนินการ Hadamard Gate ชั้นแรกแล้ว สถานะของ Qubit (รวมถึง Qubit ซ้ายสุด/ล่าง ซึ่งได้รับการจัดการแยกจากส่วนที่เหลือ) คือ
เมื่อดำเนินการ สถานะนี้จะถูกแปลงเป็น
ผ่านปรากฏการณ์ phase kick-back เดิมที่เราเห็นในการวิเคราะห์อัลกอริทึมของ Deutsch
จากนั้นดำเนินการ Hadamard Gate ชั้นที่สอง ซึ่ง (ตามสูตรข้างต้น) แปลงสถานะนี้เป็น
นิพจน์นี้ดูซับซ้อนพอสมควร และไม่สามารถสรุปอะไรมากนักเกี่ยวกับความน่าจะเป็นในการได้ผลการวัดต่าง ๆ โดยไม่รู้ข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชัน
โชคดีที่สิ่งที่เราต้องรู้คือความน่าจะเป็นที่ผลการวัดทุกตัวเป็น — เพราะนั่นคือความน่าจะเป็นที่อัลกอริทึมตัดสินว่า เป็น constant ความน่าจะเป็นนี้มีสูตรที่เรียบง่าย
อธิบายอย่างละเอียด ถ้า เป็น constant ดังนั้นไม่ว่า สำหรับทุกสตริง ซึ่งในกรณีนี้ค่าของผลรวมคือ หรือ สำหรับทุกสตริง ซึ่งในกรณีนี้ค่าของผลรวมคือ หารด้วย แล้วหาค่ากำลังสองของค่าสัมบูรณ์จะได้
ถ้าในทางกลับกัน เป็น balanced ดังนั้น ให้ค่า ในครึ่งหนึ่งของสตริง และค่า ในอีกครึ่งหนึ่ง ดังนั้นพจน์ และ ในผลรวมหักล้างกันและเราได้ค่า
เราสรุปได้ว่าอัลกอริทึมทำงานถูกต้องตราบใดที่ promise ถูกปฏิบัติตาม
ความยากของคลาสสิก
อัลกอริทึม Deutsch-Jozsa ทำงานได้ทุกครั้ง ให้คำตอบที่ถูกต้องเสมอเมื่อ promise ถูกปฏิบัติตาม และต้องใช้ query เดียวเท่านั้น ซึ่งเปรียบเทียบกับอัลกอริทึมคลาสสิกสำหรับปัญหา Deutsch-Jozsa ได้อย่างไร?
ก่อนอื่น อัลกอริทึมคลาสสิก deterministic ใด ๆ ที่แก้ปัญหา Deutsch-Jozsa ได้อย่างถูกต้องต้องทำ query จำนวนมากในลำดับเลขชี้กำลัง: ต้องการ query ครั้งในกรณีที่แย่ที่สุด เหตุผลคือ ถ้าอัลกอริทึม deterministic ทำ query บนสตริงที่แตกต่างกันไม่เกิน ตัวและได้ค่าฟังก์ชันเดิมทุกครั้ง ทั้งสองคำตอบยังเป็นไปได้อยู่ ฟังก์ชันอาจเป็น constant หรืออาจเป็น balanced แต่โชคร้ายที่ query ทั้งหมดบังเอิญให้ค่าฟังก์ชันเดิม
ความเป็นไปได้ที่สองอาจดูไม่น่าเป็นไปได้ — แต่สำหรับอัลกอริทึม deterministic ไม่มีความสุ่มหรือความไม่แน่นอน ดังนั้นพวกมันจะล้มเหลวอย่างเป็นระบบสำหรับฟังก์ชันบางตัว ดังนั้นเราจึงมีข้อได้เปรียบที่สำคัญของควอนตัมเหนือคลาสสิกในแง่นี้
อย่างไรก็ตาม มีข้อจำกัด นั่นคืออัลกอริทึมคลาสสิก probabilistic สามารถแก้ปัญหา Deutsch-Jozsa ด้วยความน่าจะเป็นสูงมากโดยใช้เพียงไม่กี่ query โดยเฉพาะอย่างยิ่ง ถ้าเราแค่เลือกสตริงความยาว สองสามตัวแบบสุ่ม แล้วทำ query บนสตริงเหล่านั้น ไม่น่าจะเป็นไปได้ที่เราจะได้ค่าฟังก์ชันเดิมทั้งหมดเมื่อ เป็น balanced
พูดอย่างเฉพาะเจาะจง ถ้าเราเลือกสตริงอินพุต ตัว แบบ uniform random ประเมิน แล้วตอบ ถ้าค่าฟังก์ชันเหมือนกันทั้งหมด และ ถ้าไม่ เราจะถูกต้องเสมอเมื่อ เป็น constant และผิดพลาดในกรณีที่ เป็น balanced ด้วยความน่าจะเป็นแค่ ถ้าเราใช้ เช่น อัลกอริทึมนี้จะตอบถูกต้องด้วยความน่าจะเป็นมากกว่า %
ด้วยเหตุนี้ เรายังคงมีข้อได้เปรียบที่ค่อนข้างน้อยของควอนตัมเหนือคลาสสิก — แต่ก็ยังเป็นข้อได้เปรียบที่วัดได้และแสดงถึงการปรับปรุงเหนืออัลกอริทึมของ Deutsch
Deutsch-Jozsa ด้วย Qiskit
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
import numpy as np
เพื่อนำอัลกอริทึม Deutsch-Jozsa ไปใช้งานใน Qiskit เราจะเริ่มด้วยการนิยามฟังก์ชัน dj_query ที่สร้างวงจรควอนตัมที่นำ query gate ไปใช้งาน สำหรับฟังก์ชันที่เลือกแบบสุ่มที่ปฏิบัติตาม promise ของปัญหา Deutsch-Jozsa
ด้วยความน่าจะเป็น 50% ฟังก์ชันเป็น constant และด้วยความน่าจะเป็น 50% ฟังก์ชันเป็น balanced
สำหรับทั้งสองความเป็นไปได้นั้น ฟังก์ชันถูกเลือกแบบ uniform จากฟังก์ชันประเภทนั้น
อาร์กิวเมนต์คือจำนวนบิตอินพุตของฟังก์ชัน
def dj_query(num_qubits):
# Create a circuit implementing for a query gate for a random function
# satisfying the promise for the Deutsch-Jozsa problem.
qc = QuantumCircuit(num_qubits + 1)
if np.random.randint(0, 2):
# Flip output qubit with 50% chance
qc.x(num_qubits)
if np.random.randint(0, 2):
# return constant circuit with 50% chance
return qc
# Choose half the possible input strings
on_states = np.random.choice(
range(2**num_qubits), # numbers to sample from
2**num_qubits // 2, # number of samples
replace=False, # makes sure states are only sampled once
)
def add_cx(qc, bit_string):
for qubit, bit in enumerate(reversed(bit_string)):
if bit == "1":
qc.x(qubit)
return qc
for state in on_states:
qc.barrier() # Barriers are added to help visualize how the functions are created.
qc = add_cx(qc, f"{state:0b}")
qc.mcx(list(range(num_qubits)), num_qubits)
qc = add_cx(qc, f"{state:0b}")
qc.barrier()
return qc
เราสามารถแสดงการนำ query gate ไปใช้งานด้วยวงจรควอนตัมโดยใช้เมธอด draw ตามปกติ
display(dj_query(3).draw(output="mpl"))
ต่อมาเราจะนิยามฟังก์ชันที่สร้างวงจร Deutsch-Jozsa โดยรับการนำ Circuit ของ query gate ไปใช้งานเป็นอาร์กิวเมนต์
def compile_circuit(function: QuantumCircuit):
# Compiles a circuit for use in the Deutsch-Jozsa algorithm.
n = function.num_qubits - 1
qc = QuantumCircuit(n + 1, n)
qc.x(n)
qc.h(range(n + 1))
qc.compose(function, inplace=True)
qc.h(range(n))
qc.measure(range(n), range(n))
return qc
สุดท้าย นิยามฟังก์ชันที่รันวงจร Deutsch-Jozsa หนึ่งครั้ง
def dj_algorithm(function: QuantumCircuit):
# Determine if a function is constant or balanced.
qc = compile_circuit(function)
result = AerSimulator().run(qc, shots=1, memory=True).result()
measurements = result.get_memory()
if "1" in measurements[0]:
return "balanced"
return "constant"
เราสามารถทดสอบการนำไปใช้งานโดยเลือกฟังก์ชันแบบสุ่ม แสดงการนำ Circuit ของ query gate ไปใช้งานสำหรับฟังก์ชันนั้น แล้วรันอัลกอริทึม Deutsch-Jozsa บนฟังก์ชันนั้น
f = dj_query(3)
display(f.draw("mpl"))
display(dj_algorithm(f))

'balanced'
ปัญหา Bernstein-Vazirani
ต่อมา เราจะพูดถึงปัญหาที่เรียกว่า ปัญหา Bernstein-Vazirani มันยังถูกเรียกว่า ปัญหา Fourier sampling แม้ว่าจะมีการกำหนดสูตรของปัญหานี้ที่ทั่วไปกว่าซึ่งก็ใช้ชื่อนี้เช่นกัน
ก่อนอื่น มาแนะนำสัญลักษณ์บางอย่าง สำหรับสตริงไบนารีสองตัว และ ความยาว ใด ๆ เรานิยาม
เราจะเรียกการดำเนินการนี้ว่า binary dot product อีกวิธีหนึ่งในการนิยามมีดังนี้
สังเกตว่านี่เป็นการดำเนินการแบบสมมาตร หมายความว่าผลลัพธ์ไม่เปลี่ยนแปลงถ้าเราสลับ และ ดังนั้นเราสามารถทำได้เมื่อสะดวก บางครั้งมีประโยชน์ในการคิดถึง binary dot product ว่าเป็น parity ของบิตของ ในตำแหน่งที่สตริง มี หรือเทียบเท่าคือ parity ของบิตของ ในตำแหน่งที่สตริง มี
ด้วยสัญลักษณ์นี้ เราสามารถนิยามปัญหา Bernstein-Vazirani ได้แล้ว
เราไม่จำเป็นต้องมีอัลกอริทึมควอนตัมใหม่สำหรับปัญหานี้ อัลกอริทึม Deutsch-Jozsa แก้ปัญหานั้น เพื่อความชัดเจน มาเรียกวงจรควอนตัมจากข้างต้น ซึ่งไม่รวมขั้นตอนการประมวลผลหลังคลาสสิกของการคำนวณ OR ว่า วงจร Deutsch-Jozsa
การวิเคราะห์อัลกอริทึม
เพื่อวิเคราะห์ว่าวงจร Deutsch-Jozsa ทำงานอย่างไรสำหรับฟังก์ชันที่ปฏิบัติตาม promise ของปัญหา Bernstein-Vazirani เราจะเริ่มด้วยการสังเกตอย่างรวดเร็ว โดยใช้ binary dot product เราสามารถอธิบายการกระทำของ Hadamard Gate ตัวบนสถานะฐานมาตรฐานของ Qubit ในทางเลือกอื่นได้ดังนี้
คล้ายกับที่เราเห็นเมื่อวิเคราะห์อัลกอริทึมของ Deutsch เพราะค่า สำหรับจำนวนเต็ม ใด ๆ ขึ้นอยู่กับว่า เป็นคู่หรือคี่เท่านั้น
กลับมาที่วงจร Deutsch-Jozsa หลังจากดำเนินการ Hadamard Gate ชั้นแรกแล้ว สถานะของ Qubit คือ
จากนั้นดำเนินการ query gate ซึ่ง (ผ่านปรากฏการณ์ phase kickback) แปลงสถานะเป็น
โดยใช้สูตรของเราสำหรับการกระทำของ Hadamard Gate ชั้นหนึ่ง เราเห็นว่า Hadamard Gate ชั้นที่สองแปลงสถานะนี้เป็น
ตอนนี้เราสามารถทำการลดรูปบางอย่างในเลขชี้กำลังของ ภายในผลรวม เราได้รับ promise ว่า สำหรับสตริงบางตัว ดังนั้นเราสามารถแสดงสถานะได้ว่า
เนื่องจาก และ เป็นค่าไบนารี เราสามารถแทนที่การบวกด้วย exclusive-OR ได้ — อีกครั้งเพราะสิ่งเดียวที่สำคัญสำหรับจำนวนเต็มในเลขชี้กำลังของ คือว่ามันเป็นคู่หรือคี่ โดยใช้สมมาตรของ binary dot product เราได้นิพจน์ของสถานะดังนี้:
(ได้เพิ่มวงเล็บเพื่อความชัดเจน แม้ว่าจะไม่จำเป็นจริง ๆ เพราะเป็นธรรมเนียมที่จะให้ binary dot product มีความสำคัญสูงกว่า exclusive-OR)
ณ จุดนี้เราจะใช้สูตรต่อไปนี้
เราสามารถได้สูตรนี้ผ่านสูตรที่คล้ายกันสำหรับบิต
ร่วมกับการขยาย binary dot product และ bitwise exclusive-OR:
ซึ่งช่วยให้เราแสดงสถานะของวงจรก่อนการวัดได้ดังนี้:
ขั้นตอนสุดท้ายคือการใช้สูตรอีกสูตรหนึ่ง ซึ่งใช้ได้กับทุกสตริงไบนารี
ที่นี่เราใช้สัญลักษณ์ง่าย ๆ สำหรับสตริงที่เราจะใช้อีกหลายครั้งในบทเรียน: คือสตริงที่มีแต่ศูนย์ความยาว
วิธีง่าย ๆ ในการแสดงว่าสูตรนี้ใช้ได้คือพิจารณาสองกรณีแยกกัน ถ้า ดังนั้น สำหรับทุกสตริง ดังนั้นค่าของแต่ละพจน์ในผลรวมคือ และเราได้ โดยการรวมและหารด้วย ในทางกลับกัน ถ้าบิตใดบิตหนึ่งของ เท่ากับ ดังนั้น binary dot product เท่ากับ สำหรับครึ่งหนึ่งของทางเลือกที่เป็นไปได้ทั้งหมดสำหรับ และ สำหรับอีกครึ่งหนึ่ง — เพราะค่าของ binary dot product สลับ (จาก เป็น หรือจาก เป็น ) ถ้าเราสลับบิตใด ๆ ของ ในตำแหน่งที่ มี
ถ้าเราใช้สูตรนี้เพื่อลดรูปสถานะของวงจรก่อนการวัด เราจะได้
เนื่องจากข้อเท็จจริงที่ว่า ก็ต่อเมื่อ ดังนั้น การวัดจะเปิดเผยสตริง ที่เราต้องการอย่างแม่นยำ
ความยากของคลาสสิก
ในขณะที่วงจร Deutsch-Jozsa แก้ปัญหา Bernstein-Vazirani ด้วย query เดียว อัลกอริทึม query คลาสสิกใด ๆ ต้องทำ query อย่างน้อย ครั้งเพื่อแก้ปัญหานี้
ซึ่งสามารถให้เหตุผลได้ผ่านอาร์กิวเมนต์ที่เรียกว่า information theoretic ซึ่งในกรณีนี้ง่ายมาก การ query คลาสสิกแต่ละครั้งเปิดเผยข้อมูลหนึ่งบิตเกี่ยวกับคำตอบ และมีข้อมูล บิตที่ต้องค้นพบ — ดังนั้นจึงต้องใช้ query อย่างน้อย ครั้ง
จริง ๆ แล้ว เป็นไปได้ที่จะแก้ปัญหา Bernstein-Vazirani แบบคลาสสิกโดยทำ query ฟังก์ชันบนสตริง ตัวที่แต่ละตัวมี เดี่ยว ๆ ในแต่ละตำแหน่งที่เป็นไปได้ และ สำหรับบิตอื่นทั้งหมด ซึ่งเปิดเผยบิตของ ทีละตัว ดังนั้น ข้อได้เปรียบของควอนตัมเหนือคลาสสิกสำหรับปัญหานี้คือ query แทน query
Bernstein-Vazirani ด้วย Qiskit
เราได้นำวงจร Deutsch-Jozsa ไปใช้งานแล้วข้างต้น และที่นี่เราจะใช้มันเพื่อแก้ปัญหา Bernstein-Vazirani ก่อนอื่นเราจะนิยามฟังก์ชันที่นำ query gate ไปใช้งานสำหรับปัญหา Bernstein-Vazirani ด้วยสตริงไบนารี ใด ๆ
def bv_query(s):
# Create a quantum circuit implementing a query gate for the
# Bernstein-Vazirani problem.
qc = QuantumCircuit(len(s) + 1)
for index, bit in enumerate(reversed(s)):
if bit == "1":
qc.cx(index, len(s))
return qc
display(bv_query("1011").draw(output="mpl"))
ตอนนี้เราสามารถสร้างฟังก์ชันที่รันวงจร Deutsch-Jozsa บนฟังก์ชันโดยใช้ฟังก์ชัน compile_circuit ที่นิยามไว้ก่อนหน้า
def bv_algorithm(function: QuantumCircuit):
qc = compile_circuit(function)
result = AerSimulator().run(qc, shots=1, memory=True).result()
return result.get_memory()[0]
display(bv_algorithm(bv_query("1011")))
'1011'
หมายเหตุเกี่ยวกับการตั้งชื่อ
ในบริบทของปัญหา Bernstein-Vazirani เป็นเรื่องปกติที่อัลกอริทึม Deutsch-Jozsa จะถูกเรียกว่า "อัลกอริทึม Bernstein-Vazirani" ซึ่งทำให้เข้าใจผิดได้เล็กน้อย เพราะอัลกอริทึม คือ อัลกอริทึม Deutsch-Jozsa อย่างที่ Bernstein และ Vazirani ระบุไว้ชัดเจนในงานของพวกเขา
สิ่งที่ Bernstein และ Vazirani ทำหลังจากแสดงให้เห็นว่าอัลกอริทึม Deutsch-Jozsa แก้ปัญหา Bernstein-Vazirani (ตามที่ระบุไว้ข้างต้น) คือการนิยามปัญหาที่ซับซ้อนมากขึ้น ซึ่งเรียกว่า ปัญหา recursive Fourier sampling นี่เป็นปัญหาที่ถูกสร้างขึ้นอย่างประดิษฐ์ โดยคำตอบของอินสแตนซ์ต่าง ๆ ของปัญหาในทางปฏิบัติปลดล็อกระดับใหม่ของปัญหาที่จัดเรียงในโครงสร้างคล้ายต้นไม้ ปัญหา Bernstein-Vazirani เป็นกรณีพื้นฐานของปัญหาที่ซับซ้อนกว่านี้
ปัญหา recursive Fourier sampling เป็นตัวอย่างแรกที่รู้จักของปัญหา query ที่อัลกอริทึมควอนตัมมีข้อได้เปรียบแบบ super-polynomial เหนืออัลกอริทึม probabilistic ซึ่งเกินข้อได้เปรียบของควอนตัมเหนือคลาสสิกที่เสนอโดยอัลกอริทึม Deutsch-Jozsa พูดอย่างสัญชาตญาณ เวอร์ชัน recursive ของปัญหาขยายข้อได้เปรียบ ต่อ ของอัลกอริทึมควอนตัมให้ใหญ่โตมากขึ้น
ด้านที่ท้าทายที่สุดของการวิเคราะห์คณิตศาสตร์ที่ยืนยันข้อได้เปรียบนี้คือการแสดงให้เห็นว่าอัลกอริทึม query คลาสสิกไม่สามารถแก้ปัญหาได้โดยไม่ทำ query จำนวนมาก สิ่งนี้เป็นเรื่องปกติมาก สำหรับหลาย ๆ ปัญหา อาจเป็นเรื่องยากมากที่จะตัดความเป็นไปได้ของวิธีคลาสสิกที่สร้างสรรค์ซึ่งแก้ปัญหาได้อย่างมีประสิทธิภาพ
ปัญหาของ Simon และอัลกอริทึมสำหรับมันที่อธิบายในส่วนถัดไป ให้ตัวอย่างที่ง่ายกว่ามากของข้อได้เปรียบแบบ super-polynomial (และจริง ๆ แล้วคือ exponential) ของควอนตัมเหนือคลาสสิก และด้วยเหตุนี้ปัญหา recursive Fourier sampling จึงถูกพูดถึงน้อยกว่า อย่างไรก็ตาม มันยังคงเป็นปัญหาการคำนวณที่น่าสนใจในแบบของตัวเอง