Я довольно озадачен тем, как алгоритм Гровера может быть использован на практике, и я хотел бы попросить помощи в разъяснении на примере.
Давайте предположим, что база данных элементов содержит цвета Красный, Оранжевый, Желтый, Зеленый, Голубой, Синий, Индиго и Фиолетовый, и не обязательно в этом порядке. Моя цель - найти 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)