Я довольно озадачен тем, как алгоритм Гровера может быть использован на практике, и я хотел бы попросить помощи в разъяснении на примере.
Давайте предположим, что база данных элементов содержит цвета Красный, Оранжевый, Желтый, Зеленый, Голубой, Синий, Индиго и Фиолетовый, и не обязательно в этом порядке. Моя цель - найти Red в базе данных.
Входными данными для алгоритма Гровера является кубита, где 3 кубита кодируют индексы набора данных. Мое замешательство возникает здесь (может быть, путаница в отношении посылок, а точнее, заблуждений здесь), что, как я понимаю, оракул фактически ищет один из индексов набора данных (представленный суперпозицией 3 кубитов), и, кроме того, оракул «жестко закодирован», по какому индексу он должен искать.
Мои вопросы:
- Что я тут не так делаю?
- Если оракул действительно ищет один из индексов базы данных, это означает, что мы уже знаем, какой индекс мы ищем, так зачем искать?
- Учитывая вышеприведенные условия с цветами, кто-то может указать на это, если это возможно с помощью Гровера искать красный в неструктурированном наборе данных?
Существуют реализации для алгоритма Гровера с оракулом для ищет | 111>, например (или см. Реализацию R того же оракула R ниже): /quantum//a/2205
Опять же, моя путаница заключается в том, что, поскольку я не знаю положение элементов в наборе данных, алгоритм требует от меня поиска строки, которая кодирует положение N элементов. Как мне узнать, какую позицию мне следует искать, если набор данных неструктурирован?
Код R:
#START
a = TensorProd(TensorProd(Hadamard(I2),Hadamard(I2)),Hadamard(I2))
# 1st CNOT
a1= CNOT3_12(a)
# 2nd composite
# I x I x T1Gate
b = TensorProd(TensorProd(I2,I2),T1Gate(I2))
b1 = DotProduct(b,a1)
c = CNOT3_02(b1)
# 3rd composite
# I x I x TGate
d = TensorProd(TensorProd(I2,I2),TGate(I2))
d1 = DotProduct(d,c)
e = CNOT3_12(d1)
# 4th composite
# I x I x T1Gate
f = TensorProd(TensorProd(I2,I2),T1Gate(I2))
f1 = DotProduct(f,e)
g = CNOT3_02(f1)
#5th composite
# I x T x T
h = TensorProd(TensorProd(I2,TGate(I2)),TGate(I2))
h1 = DotProduct(h,g)
i = CNOT3_01(h1)
#6th composite
j = TensorProd(TensorProd(I2,T1Gate(I2)),I2)
j1 = DotProduct(j,i)
k = CNOT3_01(j1)
#7th composite
l = TensorProd(TensorProd(TGate(I2),I2),I2)
l1 = DotProduct(l,k)
#8th composite
n = TensorProd(TensorProd(Hadamard(I2),Hadamard(I2)),Hadamard(I2))
n1 = DotProduct(n,l1)
n2 = TensorProd(TensorProd(PauliX(I2),PauliX(I2)),PauliX(I2))
a = DotProduct(n2,n1)
#repeat the same from 2st not gate
a1= CNOT3_12(a)
# 2nd composite
# I x I x T1Gate
b = TensorProd(TensorProd(I2,I2),T1Gate(I2))
b1 = DotProduct(b,a1)
c = CNOT3_02(b1)
# 3rd composite
# I x I x TGate
d = TensorProd(TensorProd(I2,I2),TGate(I2))
d1 = DotProduct(d,c)
e = CNOT3_12(d1)
# 4th composite
# I x I x T1Gate
f = TensorProd(TensorProd(I2,I2),T1Gate(I2))
f1 = DotProduct(f,e)
g = CNOT3_02(f1)
#5th composite
# I x T x T
h = TensorProd(TensorProd(I2,TGate(I2)),TGate(I2))
h1 = DotProduct(h,g)
i = CNOT3_01(h1)
#6th composite
j = TensorProd(TensorProd(I2,T1Gate(I2)),I2)
j1 = DotProduct(j,i)
k = CNOT3_01(j1)
#7th composite
l = TensorProd(TensorProd(TGate(I2),I2),I2)
l1 = DotProduct(l,k)
#8th composite
n = TensorProd(TensorProd(PauliX(I2),PauliX(I2)),PauliX(I2))
n1 = DotProduct(n,l1)
n2 = TensorProd(TensorProd(Hadamard(I2),Hadamard(I2)),Hadamard(I2))
n3 = DotProduct(n2,n1)
result=measurement(n3)
plotMeasurement(result)
источник
Ответы:
Возможно, основная проблема у вас в понимании базы данных, а не алгоритма Гровера. Более подробное объяснение вы можете найти в главе 6.5 Nielsen & Chuang.
Я также думаю, что наиболее полезным применением алгоритма Гровера является не приложение базы данных, а его обобщения как амплитуда амплитуды (см. Https://arxiv.org/abs/quant-ph/0005055 ) для любого квантового алгоритма.
источник
Это уже частично обсуждается в этом связанном вопросе , но я постараюсь здесь более конкретно рассмотреть некоторые из вопросов, которые вы поднимаете.
В таком случае алгоритм действительно не особенно полезен, так как ответ должен быть жестко закодирован в оракуле, но в общем случае это не обязательно.
источник