Estou bastante confuso sobre como o algoritmo de Grover poderia ser usado na prática e gostaria de pedir ajuda no esclarecimento através de um exemplo.
Vamos supor que um banco de dados de elementos contenha as cores Vermelho, Laranja, Amarelo, Verde, Ciano, Azul, Índigo e Violeta, e não necessariamente nessa ordem. Meu objetivo é encontrar vermelho no banco de dados.
A entrada para o algoritmo de Grover é qubits, em que os 3 qubits codificam os índices do conjunto de dados. Minha confusão chega aqui (pode ser confuso sobre as premissas, então digamos que ocorram confusão aqui) que, como eu entendo, o oráculo realmente procura por um dos índices do conjunto de dados (representado pela superposição dos 3 qubits) e, além disso, o oráculo é "codificado" para qual índice ele deve procurar.
Minhas perguntas são:
- O que eu entendi errado aqui?
- Se o oracle está realmente procurando por um dos índices do banco de dados, isso significa que já sabemos qual índice estamos procurando, então por que pesquisar?
- Dadas as condições acima com as cores, alguém poderia apontar se é possível com o Grover procurar por vermelho em um conjunto de dados não estruturado?
Existem implementações para o algoritmo de Grover com um oráculo para procurando por | 111>, por exemplo (ou veja uma implementação R do mesmo oráculo abaixo): /quantum//a/2205
Novamente, minha confusão é que, como não conheço a posição de elementos em um conjunto de dados, o algoritmo exige que eu procure uma string que codifique a posição de N elementos. Como sei qual posição devo procurar quando o conjunto de dados não está estruturado?
Código 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)