Você está na página 1de 8

Algoritmo de Grover

Resolvendo Sudoku usando o Algoritmo de Grover

Gabriel Krzyzanowski de Almeida

Instituto Latino-Americano de Ciências da Vida e da Natureza - UNILA

2021

Krzyzanowski Algoritmo de Grover


Ideia Geral
Nos oráculos vistos na apresentação passada, tinhamos o conhecimento dos estados
soluções |ω i. Porém como utilizamos o algoritmo de Groover para resolver um
problema em que não conhecemos tal estado? Veremos como utilizando um exemplo
simples, resolveremos uma versão simplicada do jogo Sudoku.
O problema
Temos um sudoku 2 × 2 em binário, com apenas duas regras, nenhuma coluna pode
conter o mesmo valor duas vezes , e nenhuma linha pode conter o mesmo valor duas
vezes. Então temos o seguinte esquema:

Krzyzanowski Algoritmo de Grover


Criando o algoritmo
A m de transformar nosso problema em um circuito precisamos garantir que algumas
condições sejam satisfeitas.
Condições
1 V0 6 = V1 ; Vericar a linha superior
2 V2 6 = V3 ; Vericar a linha inferior
3 V0 6 = V2 ; Vericar a coluna da esquerda
4 V1 6 = V3 ; Vericar a coluna da direita

Podemos levar isso a nossa rotina a partir da seguinte lista


1 clause_list = [[0 ,1] ,
2 [0 ,2] ,
3 [1 ,3] ,
4 [2 ,3]]

Krzyzanowski Algoritmo de Grover


Criando o algoritmo
Agora vamos checar as condições utilizando um XOR-Gate .
1 def XOR ( qc , a , b , output ) :
2 qc . cx (a , output )
3 qc . cx (b , output )

Atuando em um circuito
1 in_qubits = QuantumRegister (2 , name = ' input ')
2 out_qubit = QuantumRegister (1 , name = ' output ')
3 qc = QuantumCircuit ( in_qubits , out_qubit )
4 XOR ( qc , in_qubits [0] , in_qubits [1] , out_qubit )
5 qc . draw ()

Krzyzanowski Algoritmo de Grover


Criando o algoritmo
Agora o equivalente para os 4 estados:
1 # Cria os registros para cada bit
2 var_qubits = QuantumRegister (4 , name = 'v ') # bits com as variaveis
3 clause_qubits = QuantumRegister (4 , name = 'c ') # bits com as " clausulas
"
4 output_qubit = QuantumRegister (1 , name = ' out ') # Nosso qubit de output
5 # Cria a quantum circuit
6 qc = QuantumCircuit ( var_qubits , clause_qubits , output_qubit )
7
8 # Usa o XOR gate para checar cada clausula
9 i = 0
10 for clause in clause_list :
11 XOR ( qc , clause [0] , clause [1] , clause_qubits [ i ])
12 i += 1
13
14 # Flipa o qubit de output se todas as clausulas sao satisfeitas
15 qc . mct ( clause_qubits , output_qubit )
16
17 qc . draw ()
Krzyzanowski Algoritmo de Grover
Criando o algoritmo
Como output temos:

Krzyzanowski Algoritmo de Grover


Criando o algoritmo
Agora vamos transformar o circuito em um oráculo. Temos 3 registros:
Registros
Um registro com as variáveis do jogo (x = v3 , v2 , v1 , v0 );
Um registro com as clausulas do jogo, que inicia no estado |0000i (vamos abreviar
para |0i);
Um qubit de output, que utilizamos como qubit auxiliar: |out0 i

Então nosso oráculo vai atuar nos registros seguindo a seguinte relação:

Uω |x i|0i|out0 i = |x i|0i|out0 ⊕ f (x )i
Se utilizarmos uma Hadamard para colocar o estado |out0 i em |−i, teremos:
1
Uω |x i|0i|−i = |x i|0i ⊗ √ (|0 ⊕ f (x )i − |1 ⊕ f (x )i)
2
Krzyzanowski Algoritmo de Grover
Criando o algoritmo

Então teremos 2 situações:


1 Se f (x ) = 0 =⇒ Uω |x i|0i|−i = |x i|0i|−i

2 Se f (x ) = 1 =⇒ Uω |x i|0i|−i = −|x i|0i|−i

Finalmente, podemos escrever o oráculo como:


Oráculo
(
+|x i|0i|−i, para x 6= ω
Uω |x i|0i|−i =
−|x i|0i|−i, para x = ω

Para transformarmos o circuito de vericação mostrado anteriormente em um oráculo,


precisamos garantir que os qubits de registro das cláusulas estejam no estado |0000i
após a atuação de Uω .

Krzyzanowski Algoritmo de Grover

Você também pode gostar