Escolar Documentos
Profissional Documentos
Cultura Documentos
Rio de Janeiro
2015
i
Flavio Jesus de Souza
Rio de Janeiro
2015
ii
Dados Internacionais de Catalogação na Publicação
Universidade Estadual do Ceará
Biblioteca Central Prof. Antônio Martins Filho
CDD: 999.99
iii
FLAVIO JESUS DE SOUZA
BANCA EXAMINADORA
iv
RESUMO
v
ABSTRACT
This work aims to use quantum computability to solve difficult decision problems.
Therefore, quantum computing was apply to search problems in order to generate a
knowledge with this type of computing. Moreover, a quantum algorithm was construct in
order to solve a problem of sophisticated mathematical exercise called N-Queens. The
algorithm was implemented in a quantum computing simulator obtaining solutions for
problems with up to 128 (one hundred twenty eight) queens.
vi
Sumário
Capítulo I ......................................................................................................................... 1
1.1 – Tema .................................................................................................................... 1
1.2 – Objetivos.............................................................................................................. 1
1.3 – Justificativa .......................................................................................................... 1
1.4 – Metodologia ......................................................................................................... 2
1.5 – Descrição ............................................................................................................. 3
Capítulo II ....................................................................................................................... 4
2.1 – Complexidade Computacional ............................................................................ 4
2.2 – Indecidibilidade ................................................................................................... 6
2.3 – Mecânica Quântica .............................................................................................. 7
2.4 – Evolução da Máquina de Turing ....................................................................... 11
Capítulo III.................................................................................................................... 14
3.1 – Pré-requisitos Algébricos .................................................................................. 14
3.2 – Algoritmo de Deutsch ........................................................................................ 16
3.3– Algortimo de Shor .............................................................................................. 19
3.4 – Algortimo de Grover ......................................................................................... 21
Capítulo IV .................................................................................................................... 25
4.1 – QCL ................................................................................................................... 25
4.2 – Prova de Conceito .............................................................................................. 27
Capítulo V ..................................................................................................................... 44
5.1 – Definição do Problema ...................................................................................... 44
5.2 – Soluções Clássicas ............................................................................................. 45
5.3 – Solução Híbrida ................................................................................................. 47
Capítulo VI .................................................................................................................... 56
6.1 – Conclusão .......................................................................................................... 56
6.2 – Trabalhos Futuros .............................................................................................. 58
Bibliografia .................................................................................................................... 59
Apêndice A - QCL ........................................................................................................ 62
Apêndice B – Algoritmo de Deutsch ........................................................................... 66
Apêndice C – Busca Quântica N-Queens ................................................................... 67
Apêndice D – Backtraking N-Queens ......................................................................... 70
vii
Capítulo I
Introdução
1.1 – Tema
1.2 – Objetivos
1.3 – Justificativa
1
Se for possível encontrar soluções menos custosas em computadores clássicos
para o referido problema, ter-se-á um ganho no tempo de decisão nas diferentes questões.
Esquemas de armazenamento de memória paralela
Testes de VLSI (Very-large-scale Integration)
Controle de tráfego
Prevenção de deadlocks em Sistemas Operacionais
Processamento de imagem
Portanto os ramos de desenvolvimento de Sistemas Operacionais, a indústria de
vídeos e as empresas que fabricam processadores serão beneficiados caso o objetivo do
trabalho seja alcançado.
1.4 – Metodologia
2
1.5 – Descrição
3
Capítulo II
Complexidade
4
executado num computador quântico. Segundo, a quantidade de qubits deve estar na
mesma ordem de grandeza que necessita a solução. Para um computador clássico, por
exemplo, com o número de cidades maior do que 25, o cálculo do menor percurso entre
as cidades torna-se praticamente impossível. Já para um computador quântico, utilizando
o algoritmo de Shor, basta a criação de uma matriz na ordem de 25 (5 qubits) para
representar o emaranhado que o problema exige. Esse dado é relevante, pois para um
computador quântico, 5 qubits não representam uma alocação de recursos proibitiva.
Entretanto, observe que não há aqui uma defesa de que o algoritmo de Shor tornará
o problema do caixeiro viajante tratável. Apenas é uma evidência do benefício que
algoritmos quânticos podem trazer a essa classe de problema. Ainda que este algoritmo
tenha potencial para reduzir de forma quadrática a complexidade do problema, o resultado
continua sendo exponencial. Mesmo reduzindo a complexidade, a ordem de grandeza
permanece similar. Portanto, há sim um incremento da capacidade de computar soluções
para uma quantidade maior de cidades do que a atual.
A construção de um algoritmo quântico resultará, na maioria das vezes, numa
solução mais rápida com menos complexidade que seu equivalente clássico. Entretanto,
a construção desse tipo de algoritmo não é trivial. E como já foi mencionado antes, é
interessante que um programa quântico seja executado num computador 100% quântico.
Atualmente no mundo existem várias iniciativas e poucos computadores realmente
quânticos no mundo. O Nobel de Física de 2012 (Sciam, 2012) gerou uma grande
expectativa nesse sentido, pois já é possível realizar medições em jaulas de fótons e em
armadilhas de íons aprisionados sem que os mesmos sejam observados. O que permite
que suas propriedades quânticas não sejam perdidas, um ponto nefrálgico na construção
de computadores quânticos. Essas experiências são animadoras, pois devem servir como
base para a construção de novos computadores quânticos (Sciam, 2012).
5
2.2 – Indecidibilidade
A indecidibilidade pode ser conceituada de modo indireto através daquilo que não
é decidível, que por sua vez é o resultado de uma computação que retorna apenas “sim”
ou “não”. Logo, todo problema pode ser encarado como decidível ou indecidível.
Contudo, além da sua decidibilidade, um problema pode ser classificado quanto a
sua tratabilidade. O problema da primacidade, do logaritmo discreto, do caixeiro viajante
e o da busca desordenada num banco de dados são problemas decidíveis, porém também
são considerados problemas decidíveis de difícil solução clássica (Nielsen, 2005) ou
intratáveis.
A matemática clássica assume que quaisquer funções, quando submetidas a uma
entrada, produzem algum resultado, seja ele qual for. Entretanto, a computabilidade não
compartilha esse grau de segurança proposto pela matemática clássica, pois um algoritmo
pode receber uma determinada entrada e nunca encerrar o processamento da mesma
(Mello, 2014). É nesse cenário que surge o problema indecidível mais famoso que se tem
conhecimento, uma situação conhecida como o “Problema da Parada”. O Problema da
Parada postula que existem problemas que não são resolvidos por uma Máquina de
Turing, e ainda que, nem uma segunda Máquina da Turing (Prova de Turing) é capaz de
avaliar se a primeira vai parar ou não, caso esta tente resolver um problema indecidível.
A possibilidade de sistematizar a mente humana através da computabilidade
passou a ser uma incógnita devido a essa limitação mesmo com a demonstração do
Problema através do Teorema da Incompletude de Gödel (Goldstein, 2005). Porém sabe-
se que muitas verdades dentro de sistemas complexos que a ciência tanto procurou
demonstrar, nada mais são do que inferências impostas pelo sistema que o encapsula. Em
parte, essa consequência do Teorema da Incompletude trouxe consigo uma frustração aos
matemáticos e um melhor entendimento sobre essa limitação.
Além disso, como certas verdades possuem demonstração, a automatização de
alguns processos de raciocínio verdadeiros continua sendo perfeitamente cabível (Mello,
2014). Por isso, várias vertentes da ciência vêm utilizando cada vez mais o computador
para ajudar o ser humano em tarefas que a mente levaria muito tempo para calcular; sendo
que, em alguns casos, a solução nos é inviável.
Por conta do exposto acima, as pesquisas sobre computabilidade devem ter em
mente que sempre existirão mais funções a computar do que possíveis programas para
computá-las (Cafezeiro e Heausler, 2007). Logo, contrapondo à Inteligência Artificial,
6
trata-se de uma Estupidez Natural (McDermott, 1976) achar que se pode, somente com a
computabilidade clássica, computar habilidades humanas tais como: entendimento,
desejo, compreensão e intuição (McDermott, 1976). Sabiamente ridicularizou o uso
indiscriminado da computação como solução para todos os problemas, construindo assim
uma maquiagem bem feita em algumas soluções de problemas, de modo que estas
soluções se parecessem inteligentes.
7
Em 1900, Max Plank explicou o espectro de energia do corpo negro pressupondo
que os estados de energia possíveis estão restritos à equação 𝐸 = 𝑛ℎ𝑓, onde 𝑛 é um
número inteiro, 𝑓 a frequência e ℎ = 6,626075 . 10−34 𝐽𝑠.
Em 1905, Einstein reformulou a equação acima dando origem a famosa relação
entre Energia, a constante de Plank e a frequência da luz. Interpretando 𝐸 como a energia
da partícula luz, mais tarde chamada de fóton.
ℎ
𝐸 = ℎ𝑓 = 𝜔
2𝜋
A descoberta acima sugeriu que um elétron limita-se a certos tipos de energia,
entrando em contradição com a mecânica clássica. Com isso, o modelo de Born-
Sommerfeld introduziu a condição quântica, pois o momento dos elétrons em torno do
núcleo atômico passou a ser múltiplos de ℎ. Tal restrição pode ser justificada pela
atribuição de propriedades de onda para o elétron, mas esse tipo de teoria híbrida mostrou-
se insatisfatória.
Esse problema veio a ser resolvido somente em 1923, quando Heisenberg
utilizando um formalismo baseado em matrizes criou o que se chama de Princípio da
Incerteza de Heisenberg. Em 1925, Schrödinger publicou uma solução alternativa
utilizando funções de ondas complexas segundo a evolução temporal da partícula-onda,
determinando assim a dinâmica do sistema de partículas.
𝑑
𝐻𝜓 = 𝑖ħ (𝜓)
𝑑𝑡
Na equação de Schrödinger, 𝐻 é o operador Halmitoniano que representa a energia
total do sistema e ħ = ℎ/2𝜋. Dois anos mais tarde, Dirac uniu os dois formalismos dando
origem à álgebra computacional utilizada na computação quântica.
A combinação de computação e mecânica quântica começou a despontar no início
dos anos da década 1960, com a descoberta de lei de Moore, levando à inevitável
conclusão de que, por volta do ano 2020 cada bit em um computador será codificado em
apenas um átomo. (Nielsen, 2005)
Para os físicos no início da década de 1980, a observação da lei de Moore tornou
clara a noção de que a física traduz-se em computação. Essa nova noção abriu um espaço
intangível para a computação, para a informação e também para a própria mecânica
quântica. Surgiram assim a computação quântica e a informação quântica. Num mesmo
patamar da história científica surgiram um novo paradigma de computação, um imenso
desafio tecnológico e uma fascinante área de pesquisa da física. Desde então o que se vê
8
é a proliferação de resultados teóricos e experimentais, tanto na física quanto na ciência
da computação e na teoria da informação. O emaranhado mudou-se do espaço de Hilbert
para os laboratórios de física, transformando-se em um novo e estranho recurso da
natureza para o processamento da computação, da informação e da comunicação.
A evolução da computabilidade está caminhando para o mundo aleatório e em
consequência disso consegue-se diminuir a complexidade de determinados problemas.
Mas o movimento natural da ciência de se aprofundar no conceito do vetor de estado em
qualquer base com números complexos não impedirá que a computação quântica continue
restrita aos limites de Gödel.
A teoria da Mecânica Quântica utiliza um instrumental matemático baseado em
combinações lineares de vetores de estados com coeficientes complexos tendo sua
probabilidade calculada a partir dos quadrados dos módulos desses números complexos.
O modelo matemático onde reside a Mecânica Quântica em termos formais é o que se
chama de Espaço de Hilbert (Griffiths, 2004).
Neste sentido, um estado quântico |𝜓⟩ qualquer pode ser escrito da seguinte
forma:
|𝜓⟩ = 𝛼|0⟩ + 𝛽|1⟩
Esta fórmula descreve o estado de um sistema fechado composto por dois vetores
de estado |0⟩ 𝑒 |1⟩ ditos em superposição, isto é, que existem simultaneamente até que se
efetue alguma medição, quando então |𝜓⟩ é colapsado sobre algum dos vetores de estado.
Além disto, 𝛼 𝑒 𝛽 ∈ ℂ são as amplitudes de cada vetor sendo |𝛼|2 + |𝛽|2 = 1.
Como:
𝛼 = 𝑎 + 𝑏𝑖, 𝑎, 𝑏 ∈ ℝ
𝛽 = 𝑐 + 𝑑𝑖, 𝑐, 𝑑 ∈ ℝ
Tem-se que:
A probabilidade de |𝜓⟩ = |0⟩ é igual a |𝛼|2 = 𝑎2 + 𝑏 2 .
A probabilidade de |𝜓⟩ = |1⟩ é igual a |𝛽|2 = 𝑐 2 + 𝑑 2 .
9
onda. Contudo, quando são observados, eles comportam-se como matéria. O simples fato
de se observar faz com o que a menor partícula fundamental perca a sua função de onda.
A Mecânica Quântica traz consigo quatro conceitos básicos que são utilizados nos
modelos computacionais existentes, a saber.
Paralelismo.
Superposição.
Interferência.
Emaranhado.
O entendimento do Paralelismo quântico está diretamente relacionado com a
evolução temporal de um estado quântico, sendo seu comportamento regido pela equação
de Schrödinger. Sem que se aprofunde no conceito físico, em computação quântica as
operações são feitas simultaneamente segundo um operador unitário reversível que é
traduzido em forma de função para determinados problemas.
A Superposição acontece no mundo aleatório. Os vetores de estado |0⟩ e
|1⟩ representam superposições dos vetores 0 e 1. O vetor |0⟩ pode se tornar 0 e 1,
enquanto que o vetor |1⟩ pode se tornar 1 e 0 após uma medida. Em computação quântica
os operadores unitários mexem nas probabilidades de se ocorrer 0 e 1 após a medida. Por
exemplo, o operador unitário de Hadamard (H) é responsável por colocar os vetores de
estado |0⟩ e |1⟩ em equiprobabilidade (50% cada uma) de ocorrem medições 0 e 1.
O fenômeno da Interferência tem uma explicação simples, mas um entendimento
difícil, pois como a mente humana está presa à realidade, é complicado para qualquer ser
humano compreender que a simples observação de um sistema faz com que o mesmo
passe a existir por conta dessa medida. Em termos computacionais, podemos determinar
o valor de uma função para dois valores diferentes de um vetor de estado avaliando a
função apenas uma vez. Isso é mais rápido de que qualquer aparato clássico que se possa
imaginar, no qual seriam necessárias duas avaliações. (Sciam, 2012).
Por fim, um estranho fenômeno da natureza quântica das partículas que até hoje
não foi decifrado por completo é o Emaranhado, ou entrelaçamento quântico. Esse estado
do sistema é caracterizado por pertencer somente ao mundo aleatório sem que sejam
geradas representações na realidade. Dois ou mais objetos podem estar ligados de uma
forma tão forte, ao ponto que um não pode ser descrito completamente sem que sua outra
parte não seja mencionada, ainda que estes objetos estejam separados fisicamente.
10
Mas por razões desconhecidas, tais estados não impedem o importantíssimo papel
do emaranhado na computação quântica e na informação quântica (Nielsen, 2005).
A Tese de Alonso Church e Alan Turing nos diz que. ”Se um problema é resolvido
através de uma função computável num dado domínio, então existe uma Máquina de
Turing que pode calcular o valor da função para todos os argumentos desse domínio
(Palazzo, 2007).” Consequentemente, existe um dispositivo abstrato capaz de determinar
a solução de um problema decidível.
Essa descoberta foi concebida pelo matemático inglês chamado Alan Mathieson
Turing em 1936 e desde então a Máquina de Turing é definida como o modelo da
formalização do conceito de procedimento (Palazzo, 2007), isto é, uma sequencia finita
de instruções que pode ser realizada num tempo finito.
Como foi dito, Alan Turing contribuiu com o aparato abstrato da realidade, mas
foi Deutsch (1985) que introduziu a mecânica quântica nesse contexto. A Computação
Quântica surgiu da simbiose entre a Máquina de Turing e a Mecânica Quântica. Essa idéia
foi proclamada por Deutsch em 1985 (Deutsch, 1985) que na ocasião criou o primeiro
algoritmo quântico.
11
A sequência lógica de raciocínio a seguir exprime, em poucas palavras, o
entendimento da Máquina de Turing Quântica:
1. A Máquina de Turing Clássica representa uma máquina abstrata usada para
modelar o efeito de computar.
2. A Máquina de Turing Probabilística representa uma Máquina de Turing não
determinística.
3. A Máquina de Turing Quântica representa uma Máquina de Turing Probabilística,
onde não é possível realizar o monitoramento da fita, pois o simples ato de medir
acabaria por perturbar o sistema.
12
Atualmente existem três importantes algoritmos quânticos, e no total não passam
de dez no mundo inteiro, são eles: Deutsch, Shor e Grover. Estes algoritmos serão
abordados em detalhes no capítulo a seguir.
Sob esta ótica, o avanço dos algoritmos quânticos está na compreensão dos
fenômenos físicos propostos pela mecânica quântica e no domínio da álgebra tensorial
utilizada pela mesma. Se os físicos, matemáticos e cientistas da computação conseguirem
encontrar combinações de operadores unitários que traduzam o comportamento do mundo
pequeno que gera a realidade, consequentemente este entendimento permitirá o
surgimento de mais algoritmos quânticos eficientes.
13
Capítulo III
Algoritmos Quânticos
1 − 3𝑖 1 − 𝑖
Em seguida, seja 𝐴 = [ ]. Neste caso, tem-se que a matriz
−2𝑖 1 + 4𝑖
1 − 3𝑖 −2𝑖
transposta 𝐴𝑇 = [ ]. Calculando-se o conjugado desta matriz, tem-se
1 − 𝑖 1 + 4𝑖
1 + 3𝑖 2𝑖
que(𝐴𝑇 )∗ = [ ] = 𝐴𝑡 . Dessa forma 𝐴 é considerado um operador
1 + 𝑖 1 − 4𝑖
hermitiano e 𝐴𝑡 é o conjugado hermitiano da matriz 𝐴.
Se 𝐴𝑡 𝐴 = 𝐴𝐴𝑡 , diz-se que 𝐴 é normal. Portanto todo operador hermitiano é
normal.
Se 𝐴𝐴𝑡 = 𝐼, diz-se que 𝐴 é unitário e que o operador hermitiano é unitário.
14
Além disso é importante observar que o complemento ortogonal de 𝐴 é definido
como 𝑄 = 𝐼 − 𝐴.
0 1
Nesse sentido, considere também uma das Matrizes de Pauli 𝑋 = [ ]. Temos
1 0
0 1 𝛼
que 𝑋|𝜓⟩ = [ ] [ ] = [𝛽𝛼]. Sob esta ótica, nota-se facilmente que esse operador 𝑋
1 0 𝛽
inverte os coeficientes do vetor de estado.
𝑎𝑐
Por fim, seja 𝐴 = [𝑎𝑏] 𝑒 𝐵 = [𝑑𝑐 ]. Definimos 𝐴 ⊗ 𝐵 = [𝑎𝑑
𝑏𝑐 ] como sendo o produto
𝑏𝑑
tensorial entre A e B, onde segundo (Nielsen, 2005) esse produto é a forma de se expandir
espaços vetoriais.
Há que se fazer aqui uma ressalva notacional sobre a questão do produto tensorial.
A representação matemática deste tipo de operação é de fato dada por 𝐴 ⊗ 𝐵. Contudo,
a Física adota outra notação para denotar a mesma operação, isto é |𝐴⟩|𝐵⟩. Nesta
dissertação será adotada a notação oriunda da Física uma vez que na literatura relacionada
com Computação Quântica há o predomínio desta última em detrimento da notação
matemática.
Por exemplo, o estado quântico |01⟩ pode ser expandido da seguinte forma.
0
|01⟩ = |0⟩|1⟩ = [10] ⊗ [01]=[10]
0
1 1 1
O operador hermitiano 𝐻 = [ ] coloca os estados |0⟩ e |1⟩ em eqüiprobabilidade
√2 1 −1
de ser 0 ou 1. Deste modo, a aplicação deste operador sobre |0⟩ e |1⟩ é calculada da
seguinte forma:
1 1 1 1 1 1 1 1 0 (|0⟩ + |1⟩)
𝐻|0⟩ = [ ][ ] = [ ]= ([ ] + [ ]) = = |+⟩
√2 1 −1 0 √2 1 √2 0 1 √2
1 1 1 0 1 1 1 1 0 (|0⟩ − |1⟩)
𝐻|1⟩ = [ ][ ] = [ ]= ([ ] + [ ]) = = |−⟩
√2 1 −1 1 √2 −1 √2 0 −1 √2
onde 𝐻 é chamado de operador de Hadamard.
15
3.2 – Algoritmo de Deutsch
16
{0, 1}. Desta forma, |𝑥, 𝑦⟩ → |𝑥, 𝑦⨁𝑓(𝑥)⟩, onde 𝑦⨁𝑓(𝑥) representa o (𝑦 +
𝑓(𝑥))𝑚𝑜𝑑2=resto da divisão de (𝑦 + 𝑓(𝑥)) por 2, representado pelo o esquema a seguir.
𝑦, 𝑐𝑜𝑛𝑠𝑡𝑎𝑛𝑡𝑒 0, 𝑐𝑜𝑛𝑠𝑡𝑎𝑛𝑡𝑒
Como 𝑓(𝑥) = { , tem-se 𝑦⨁𝑓(𝑥) = { ou seja,
𝑦̅, 𝑏𝑎𝑙𝑎𝑛𝑐𝑒𝑎𝑑𝑎 1, 𝑏𝑎𝑙𝑎𝑛𝑐𝑒𝑎𝑑𝑎
somando os elementos da coluna 𝑦 mais os da coluna 𝑓(𝑥) e dividindo por 2, o resto
representa todas as possibilidades da outra face da moeda após o lançamento.
Dado que |0⟩|1⟩ = |01⟩ e partindo-se do estado inicial |𝜓⟩ = |0⟩|1⟩ = |01⟩,
aplicando o operador de Hadamard no vetor de estado inicial |𝜓⟩, tem-se:
1 1 1 1 1 1 1 0 (|0⟩ + |1⟩) (|0⟩ − |1⟩)
|𝜓1 ⟩ = 𝐻|0⟩𝐻|1⟩ = ( )( ) ( )( ) =
√2 1 −1 0 √2 1 −1 1 √2 √2
1
= [ |0⟩|0⟩ − |0⟩|1⟩ + |1⟩|0⟩ − |1⟩|1⟩ ]
2
1 1
= [|0⟩(|0⟩ − |1⟩) + |1⟩(|0⟩ − |1⟩)] = |𝑥⟩(|0⟩ − |1⟩)
2 √2
17
A operação utilizando o operador de Hadamard coloca o emaranhado em
equiprobabilidade e definindo.
|𝜓2 ⟩ = 𝑈𝑓 |𝜓1 ⟩
0, 𝑐𝑜𝑛𝑠𝑡𝑎𝑛𝑡𝑒
Como 𝑦⨁𝑓(𝑥) = {
1, 𝑏𝑎𝑙𝑎𝑛𝑐𝑒𝑎𝑑𝑎
Logo
1
|𝜓2 ⟩ = 𝑈𝑓 |𝑥⟩(|0 ⊕ 𝑓(𝑥)⟩ − |1 ⊕ 𝑓(𝑥)⟩)
√2
Como os valores possíveis de 𝑓(𝑥) = {0,1}, dessa forma pode-se substituir |𝜓2 ⟩
pela forma homomórfica a seguir:
1
|𝜓2 ⟩ = (−1) 𝑓(𝑥) |𝑥⟩[|0⟩ − |1⟩]
√2
1
|𝜓2 ⟩ = [(−1)𝑓(0) |0⟩(|0⟩ − |1⟩) + (−1) 𝑓(1) |1⟩(|0⟩ − |1⟩)]
√2
1
± [(|0⟩ + |1⟩)(|0⟩ − |1⟩)] 𝑠𝑒 𝑓(0) = 𝑓(1)
|𝜓2 ⟩ = { 2
1
± [(|0⟩ − |1⟩)(|0⟩ − |1⟩)] 𝑠𝑒 𝑓(0) ≠ 𝑓(1)
2
18
3.3– Algortimo de Shor
19
Para 𝑥 ∈ {0,1,2,3,4,5,6,7,8,9,10,11,12, … } 𝑒 𝑟 = 21, com a mesma função de
cálculo 2𝑥 𝑚𝑜𝑑 𝑟, tem-se:
[1, 2, 4, 8, 16, 11, 1, 2, 4, 8, 16, 11, … ]
Nesse caso o período da função é 6.
20
3. Escolher um número aleatório x (1 ≤ x ≤ N) e se 𝑀𝐷𝐶(𝑥, 𝑁) > 1 retornar
𝑀𝐷𝐶(𝑥, 𝑁).
4. Encontrar a ordem r de x, onde 𝑥 𝑟 = 1 𝑚𝑜𝑑 𝑁
𝑟 𝑟 𝑟
5. Se r for par e 𝑥 2 ≠ 1𝑚𝑜𝑑 𝑁, calcule 𝑀𝐷𝐶(𝑥 2 −1,N) e 𝑀𝐷𝐶(𝑥 2 + 1, 𝑁)
6. Se são soluções não triviais, retorne-as.
O cálculo da ordem de forma quântica é realizado colocando o emaranhado em
equiprobabilidade através da aplicação do operador de Hadamard.
Depois aplica-se o operador 𝑈 controlado pelo primeiro qubit no estado |1⟩
chegando no estado abaixo.
2𝑡 −1
1
|𝜓2 ⟩ = ∑ |𝑘⟩|𝑥 𝑘 𝑚𝑜𝑑 𝑁⟩
√2𝑡 𝑘=0
21
inicial seguido do complemento normal do resultado, conforme será melhor detalhado a
seguir. Grover demonstra em seu trabalho (Portugal, 2012), através de uma análise de
grafos, que a complexidade dessa solução quântica é pelo menos quadraticamente menor
do que a aleatória clássica equivalente (Portugal, 2012). Portanto pode-se afirmar que
Grover acelerou, de forma quadrática, a procura da solução |𝑖0 ⟩.
Aplicando o operador de Hadamard nos dois registradores, tem-se.
𝑁−1
1
𝐻|𝜓⟩ = ∑ |𝑖⟩
√𝑁 𝑖=0
e
1
𝐻|1⟩ = (|0⟩ − |1⟩) = |−⟩
√2
Partindo da premissa de que existe um operador unitário 𝑈𝑓 com a seguinte
característica
|𝑖⟩|1⟩, 𝑠𝑒 𝑖 = 𝑖0
𝑈𝑓 (|𝑖⟩|0⟩) = {
|𝑖⟩|0⟩, 𝑠𝑒 𝑖 ≠ 𝑖0
Ou seja, ele altera o estado do registrador para encontrar o valor procurado e de
forma análogo, quando isso não ocorre.
|𝑖⟩|0⟩, 𝑠𝑒 𝑖 ≠ 𝑖0
𝑈𝑓 (|𝑖⟩|1⟩) = {
|𝑖⟩|1⟩, 𝑠𝑒 𝑖 = 𝑖0
22
Logo
𝑁−1
1 1
𝑈𝑓 (|𝜓⟩|−⟩) = ∑ (|𝑖⟩|𝑓(𝑖)⟩ − |𝑖⟩|1⨁𝑓(𝑖)⟩)
√𝑁 𝑖=0
√2
𝑁−1
1 1
= ∑ |𝑖⟩(|𝑓(𝑖)⟩ − |1⨁𝑓(𝑖)⟩)
√𝑁 𝑖=0
√2
𝑁−1
1
𝑈𝑓 (|𝜓⟩|−⟩) = (( ∑ |𝑖⟩|−⟩) − |𝑖0 ⟩|−⟩)
√𝑁 𝑖=0,𝑖≠𝑖0
𝑁−1
1
𝑈𝑓 (|𝜓⟩|−⟩) = (∑(−1) 𝑓(𝑖) |𝑖⟩|−⟩)
√𝑁 𝑖=0
𝑁−1
1
|𝜓1 ⟩ = (∑(−1) 𝑓(𝑖) |𝑖⟩) |−⟩
√𝑁 𝑖=0
23
E resultado do segundo registrador permanece inalterado mesmo depois da
aplicação do operador.
Com o resultado do segundo não se altera e, de forma análoga, o resultado do
primeiro operador, Grover utilizou um segundo operador que fosse uma nova reflexão,
mas usou como base o próprio estado inicial.
Esse operador corresponde ao complemento normal, que é dado por |𝜓1 ⟩ = 𝐼 −
|𝜓⟩ (ver sessão 3.1), mostrada na Figura 3.2.
Tal como descrito na estratégia adotada por Grover, estes procedimentos são
𝜋√𝑁
realizados sucessivamente até encontrar a solução, ou até 8
iterações.
24
Capítulo IV
Experimentos Iniciais
4.1 – QCL
25
estado comum de vários qubits. Essa representação pode ser realizada através do spin de
uma partícula, da polarização de um fóton ou do estado de excitação de um íon (Ömer,
1998).
Por se tratar de uma estrutura híbrida, para o desenvolvedor, o programa funciona
exatamente como qualquer outro programa clássico, pois ele receberá entradas clássicas
e produzirá saídas clássicas também, mas seu processamento será quantizado.
A QCL será utiliza nessa dissertação para a confecção de um algoritmo quântico
baseado no algoritmo de Grover. Como um número complexo pode ser representado na
forma ortogonal e na geométrica, recomenda-se que a funcionalidade deum programa
quântico seja interpretada através da visualização gráfica dos vetores de estado em bases
ortogonais.
Na figura 3.1 tem-se a representação de um vetor de estado qualquer através da
esfera de Bloch.
26
Mas as bases ortogonais em espaços vetoriais complexos de duas dimensões é o
quadro matemático e conceitual mais utilizado para representar um estado quântico de
um vetor de estado qualquer.
Sendo,
1
|0⟩ = ( )
0
0
|1⟩ = ( )
1
Logo,
Para que haja uma análise entre as vantagens e desvantagens quanto à utilização
das duas formas de computação, será proposto um problema básico que pode ser resolvido
pelos dois métodos computacionais: o clássico e o quântico. O problema abordado será a
busca de um elemento numa base de dados desordenada. Serão apresentadas quatro
soluções para o problema, sendo as três primeiras clássicas e a quarta quântica. As
clássicas são de fácil compreensão, mas a quântica exigirá do leitor o conhecimento
prévio do algoritmo quântico de Grover, descrito na seção 3.4.
A primeira solução desta prova de conceito consiste numa busca sequencial numa
massa de dados aleatórios com complexidade 𝑂(𝑁), 𝑐𝑜𝑚 𝑁 > 0. Trata-se apenas de um
27
experimento de controle no qual se implementa uma busca segundo as técnicas
tradicionais.
A segunda solução, por sua vez, consiste numa busca sequencial numa massa de
dados aleatórios com uma procura aleatória também. Nesse tipo de solução deve-se
respeitar os elementos procurados para que os mesmos não se repitam, evitando assim o
problema da parada. Neste caso, a solução também é clássica, porém começa a utilizar
um fator de aleatoriedade no processo de localização do elemento a ser encontrado.
A terceira mostrará a mesma solução, porém realizada através de uma amostra
previamente ordenada para futura pesquisa binária.
Por fim, a solução quântica é calcada no algoritmo de Grover.
Neste sentido, foi criado um cenário composto por quatro programas em Linux
Centos 6.3, cada um contendo uma solução. Depois de uma bateria de execuções, as
interações foram coletadas para futura análise.
A primeira solução clássica, confeccionada em gcc, faz uma busca sequencial
simples nos dados aleatórios com complexidade 𝑂(𝑁), 𝑐𝑜𝑚 𝑁 > 0. A seguir é
apresentada a solução codificada em “C” desenvolvida para esse trabalho.
classical_search.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
while (j < n) {
x=rand()%n;
i=0;
found = false;
for(i=0; (i<n); i++)
if (!found && q[i]==x) {found = true;}
if (!found) { q[j]=x; j++; }
}
if (argc != 3) {
fprintf(stderr, "Use: %s <numero de procura><quantidade de numeros>\n",
argv[0]);
exit(EXIT_FAILURE);
}
int No = atoi(argv[1]);
int N = atoi(argv[2]);
system("clear");
printf("N = %i\n\n", N);
find(No, N);
exit(EXIT_SUCCESS);
}
29
A segunda solução clássica faz a mesma procura nos dados, mas de forma mais
otimizada, pois além de ser randômica, ela sempre procura em itens que ainda não foram
procurados, a fim de evitar o problema da parada. O código implementado encontra-se
descrito a seguir.
random_search.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
while (j < n) {
x=random()%n;
i=0;
found = false;
for(i=0; (i<n); i++)
if (!found && v[i]==x) {found = true;}
if (!found) { v[j]=x; j++; }
}
}
int no = atoi(argv[1]);
int n = atoi(argv[2]);
int q[n], r[n];
bool found;
srand(time(NULL));
system("clear");
printf("N = %i\n\n", n);
printf("Range into 0 and %i\n", (n-1));
printf("\n");
30
random_vector(q, n);
random_vector(r, n);
exit(i);
}
31
A terceira solução foi implementada numa lista ordenada com pesquisa binária.
De forma clássica, com complexidade 𝑂(𝑙𝑜𝑔2 𝑁), não existe nada mais rápido do que
esse mecanismo de procura. Segue a implementação construída para esse trabalho.
bin_search.sh
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
for(i=0;i<n;i++) q[i]= i;
32
void main(int argc, const char* argv[]) {
if (argc != 3) {
fprintf(stderr, "Use: %s <numero de procura><quantidade de numeros>\n",
argv[0]);
exit(EXIT_FAILURE);
}
int No = atoi(argv[1]);
int N = atoi(argv[2]);
system("clear");
printf("N = %i\n\n", N);
find(No, N);
exit(EXIT_SUCCESS);
}
33
A quarta solução é um programa quântico desenvolvido em QCL. Como foi dito
anteriormente o mesmo foi baseado no algoritmo de Grover. Conforme descrito na sessão
3.4 a proposta do algoritmo de Grove é aplicar o operador no emaranhado que encapsula
o espaço das soluções até o limite de interações possíveis (m) para aumentar a
probabilidade de efetuar a medida correta no elemento a ser encontrado. Como trata-se
de um algoritmo quântico esse procedimento é realizado até encontrar a solução
propriamente dita. Segue seu fonte.
qufunct query(qureg x,quvoid f,int n) {
int i;
for i=0 to #x-1 { // x -> NOT (x XOR n)
if not bit(n,i) { Not(x[i]); }
}
CNot(f,x); // flip f if x=1111..
for i=0 to #x-1 { // x <- NOT (x XOR n)
if not bit(n,i) { !Not(x[i]); }
}
}
operator diffuse(qureg q) {
H(q); // Hadamard Transform
Not(q); // Invert q
CPhase(pi,q); // Rotate if q=1111..
!Not(q); // undo inversion
!H(q); // undo Hadamard Transform
}
reset;
H(q);
34
{
for i=1 to m {
reset;
H(q);
query(q,f,no);
CPhase(pi,f);
!query(q,f,no);
diffuse(q);
}
j= j+1;
measure q,x;
print j,"a interacao encontrado ",x;
} until (x==no);
find(No, N);
1º Passo.
Colocar o registrador quântico em superposição.
𝑁
1
|𝜓⟩ = ∑ |𝑖⟩
√𝑁 𝑖=0
Logo,
2º Passo.
Aplicar a primeira etapa do operador de Grover.
|𝜓1 ⟩ = 𝑈𝑓 |𝜓⟩
35
𝑁
1
|𝜓1 ⟩ = 𝑈𝑓 ∑ |𝑖⟩
√𝑁 𝑖=0
𝑁
1
|𝜓1 ⟩ = ∑ 𝑈𝑓 |𝑖⟩
√𝑁 𝑖=0
Como
1, 𝑠𝑒 𝑖 = 𝑖0
𝑓(𝑖) = { , logo 𝑈𝑓 = −1𝑓(𝑖)
0, 𝑠𝑒 𝑖 ≠ 𝑖0
Então
𝑁
1
|𝜓1 ⟩ = ∑ −1𝑓(𝑖) |𝑖⟩
√𝑁 𝑖=0
Portanto,
|000⟩ + |001⟩ + |010⟩ + |011⟩ + |100⟩ − |101⟩ + |110⟩ + |111⟩
|𝜓1 ⟩ =
√8
3º Passo.
Aplicar a segunda etapa do operador de Grover.
|𝜓2 ⟩ = 𝑅|𝜓1 ⟩
Como,
𝑅 = 2|𝜓⟩⟨𝜓| − 𝐼
Então,
𝑅|𝜓1 ⟩ = (2|𝜓⟩⟨𝜓| − 𝐼)|𝜓1 ⟩
36
Logo,
2
|𝜓2 ⟩ = 𝑅|𝜓1 ⟩ = (2|𝜓⟩⟨𝜓| − 𝐼)|𝜓1 ⟩ = (2|𝜓⟩⟨𝜓| − 𝐼)(|𝜓⟩ − |𝑖0 ⟩)
√𝑁
4 2
|𝜓2 ⟩ = 2⟨𝜓|𝜓⟩|𝜓⟩ − ( ⟨𝜓|𝑖0 ⟩) − |𝜓⟩ + |𝑖0 ⟩
√𝑁 √𝑁
𝑁−4 2
|𝜓2 ⟩ = ( ) |𝜓⟩ + |𝑖0 ⟩
𝑁 √𝑁
37
O benchmark dos dados coletados foi criado para 𝑁0 igual ao número procurado
e 𝑁 a quantidade de números desordenados. Os dados foram obtidos através de scripts
executados em paralelo numa máquina Virtual Linux 64x com 4GB de RAM. Nos casos
em QCL foi necessário um tempo alongado de processamento (~ 6 horas) por falta de
uma estrutura quântica apropriada para executá-lo.
Todo o processamento foi executado realizando 10 repetições para cada uma das
três listas de tamanho variável definido por 𝑁0 . Além disso em cada uma das listas
também são realizadas buscas de 10 𝑁 distintos. Segue o script que efetua todo esse
processamento.
benchmark.sh
rm -rf *.log
for i in 0 1 2 3 4 5 6 7 8 9
do
./benchmark_40.sh
./benchmark_400.sh
./benchmark_4000.sh
done
benchmark_40.sh
N=40
for i in 2 4 6 7 9 19 22 27 33 37
do
./bench.sh $i $N
done
benchmark_400.sh
N=400
for i in 55 58 70 82 90 111 123 288 342 399
do
./bench.sh $i $N
done
benchmark_4000.sh
N=4000
for i in 567 589 685 698 759 900 1976 2086 3096 3985
do
./bench.sh $i $N
done
38
Onde,
bench.sh
I=`echo $1 | tr -d '\r'`
N=`echo $2 | tr -d '\r'`
iC=`./classical_search $I $N | grep interacao | wc -l `
C=`echo $iC | tr -d '\r'`
iR=`./random_search $I $N | grep interacao | wc -l`
Para 𝑁 = $iR
R=`echo 50 tem-se
| tr -d a'\r'`
seguinte distribuição de médias para as interações.
iB=`./bin_search $I $N | grep interacao | wc -l`
B=`echo $iB | tr -d '\r'`
iQ=`./quantum_search.sh $I $N | grep interacao | wc -l`
Q=`echo $iQ | tr -d '\r'`
39
Para a quantidade de números desordenados 𝑁 = 40 chegou-se a seguinte
distribuição de médias.
30
25
de Interações
20
Média
15
10
5
0
2 4 6 7 9 19 22 27 33 37
Sequencial 20 26,5 18 15,9 22,7 18 18 22,1 26,3 23,1
Randômica 18 15,4 26 25,3 16 21,3 20 13,8 11,4 19,2
Binária 4 2 3 4 1 0 4 4 5 3
Quântica 9,1 7,4 11 7 5,5 7,9 6,3 6,9 7,4 5,6
Fig 4.2 –Média de Interações para N=40 com 10 repetições para cada 𝑁0
200
Média
150
100
50
0
55 58 70 82 90 111 123 288 342 399
Sequencial 192,6 200,5 211,1 216,4 177,9 177,5 199,7 159,5 207,1 172,2
Randômica 181,8 183,9 171,2 242,9 196,2 240,7 203,4 178,9 238,3 222,7
Binária 5 6 6 8 7 4 8 8 5 8
Quântica 62,2 83,9 74,3 45,4 55,8 83,8 47,3 84,5 29,4 55,1
Fig 4.3 –Média de Interações para N=400 com 10 repetições para cada 𝑁0
40
Para a quantidade de números desordenados 𝑁 = 4000, tem-se.
3000
de Interações 2500
2000
Média
1500
1000
500
0
567 589 685 698 759 900 1976 2086 3096 3985
Sequencial 1802,4 2555,9 1731,9 1713 1806,9 1294 2273 2197,1 2135,6 2437
Randômica 2092 2285 1924,6 2000,9 1780,9 2446,5 2116,6 1558,2 2443 1954,7
Binária 11 11 11 11 11 11 11 10 9 11
Quântica 343,3 520,5 423 444,3 460,7 450,8 746,4 483 397 505,5
Fig 4.4 –Média de Interações para N=4000 com 10 repetições para cada 𝑁0
Média da quantidade de interações das 100 buscas realizadas para cada valor de N.
Tabela 4.1 – Média das Interações
Sequencial Sequencial
N Simples Randômico Binário Grover
40 21,19 18,77 3,00 7,41
400 191,45 206,00 6,50 62,17
4000 1994,75 2060,33 10,70 477,45
Desvio padrão da quantidade de interações das 100 buscas realizadas para cada valor.
Tabela 4.2– Desvio Padrão das Interações
Sequencial Sequencial
N Simples Randômico Binário Grover
40 10,64 11,71 1,49 6,21
400 114,80 103,93 1,44 57,79
4000 1181,89 1221,86 0,64 440,30
41
De uma forma geral, as pesquisas binárias levaram vantagem por se tratar de
pesquisas realizadas em dados previamente ordenados, algo que contribui
significativamente para um resultado mais favorável. O algoritmo quântico mostra uma
resposta bastante eficiente quando se utiliza um emaranhado de 8 qubits se comparado
aos equivalentes clássicos. Muito embora 𝑂(√𝑁) < 𝑂(𝑁), com o acréscimo de apenas 1
qubit, o algoritmo quântico perde em eficiência. Por conta disso, se 𝑁 crescer demais, o
problema se torna intratável para o simulador quântico.
Também é interessante notar que o algoritmo randômico clássico, se comparado
à pesquisa sequencial simples, mostra-se mais eficiente somente quando a quantidade de
elementos ultrapassa de 400.
Na figura 4.5 e na tabela 4.3 vemos um comparativo entre as quantidades máximas
de buscas envolvidas. Analisando as pesquisas sob esse ponto de vista, nota-se que a
busca puramente quântica não será pior do que a desordenada e nunca melhor do que a
binária. Vale ressaltar que, no cálculo da complexidade binária, o custo do balanceamento
contínuo da árvore não foi levado em consideração. Caso fosse, esse acréscimo de custo
faria com que a complexidade quântica se aproximasse ainda mais da binária.
Tabela 4.3 – Quantidades máximas de buscas
Desordenada - O(N)
Binária - O(logN)
Quântica - O(√N)
42
Nesse capítulo foi realizado uma comparação entre métodos de buscas tradicionais
e uma busca quântica. Foi observado que em listas desordenadas o algoritmo quântico é
melhor que o desordenado clássico equivalente. Entretanto esse mesmo algoritmo é mais
lento que uma busca binária clássica que está ordenada. Contudo existe um engano na
comparação ingênua e direta desses dois algoritmos. O algoritmo de busca binário
clássica leva uma vantagem significativa por encontrar um conjunto de dados
previamente ordenados e o tempo de busca não leva em consideração o tempo para
ordenar os dados. O algoritmo quântico por sua vez não necessita dessa ordenação.
A complexidade do algoritmo mais rápido de ordenação de dados (quick sort) é
𝑂(𝑁𝑙𝑜𝑔2𝑁 ).
A complexidade da busca binária é 𝑂(𝑙𝑜𝑔2𝑁 ).
A complexidade de Grover é 𝑂(√𝑁).
Logo o ganho real entre a busca quântica e a mais rápida clássica será dado pelo
custo da solução (ordenação + pesquisa binária – busca quântica), isto é, 𝑂(𝑁𝑙𝑜𝑔2𝑁 ) +
𝑂(𝑙𝑜𝑔2𝑁 ) − 𝑂(√𝑁) e está representado em números na tabela 4.4. Uma informação
interessante desses dados é que na medida que 𝑁 aumenta o ganho também aumenta e
esse fenômeno não ocorre no cenário clássico.
Sob essa ótica, surge o questionamento sobre o comportamento de outros
algoritmos quânticos em problemas de decisão mais sofisticados. O capitulo a seguir trata
de uma implementação quântica para um problema dessa natureza.
43
Capítulo V
Fig 5.4
É fácil notar que, em relação a figura 5.4, existe outra solução simétrica invertendo
as posições a partir da segunda coluna. Ou seja, para 𝑁 = 4 tem-se duas soluções 𝑁 =
{3,1,4,2} 𝑒 {2,4,1,3}, onde cada elemento i do conjunto representa a posição de cima para
baixo da rainha na i-ésima coluna do tabuleiro.
44
Desde sua concepção foram criados inúmeros trabalhos relacionados ao problema.
Existe uma coletânea bastante densa com relação ao mesmo que pode ser pesquisada em
(Kosters, 2013). Nela constam 335 referências sobre o problema, onde o paper ”A Survey
of Known Results and Research Areas for n-Queens" é considerado a síntese teórica mais
importante (Kosters, 2013) do N-Queens. Nele encontramos a explicação pormenorizada
sobre os mais relevantes Teoremas e Conjecturas acerca da questão.
Os Teoremas e conjecturas tentam de alguma maneira amenizar o processo de
cálculo das soluções, validá-la e prever a quantidade de soluções para um determinado
valor de 𝑁. Esse movimento se faz necessário, pois para 𝑁 = 24 obtem-se
227514171973736 soluções. E para 𝑁 = 25 chega-se a espantosas
2207893435808352 soluções (Bell e Stevens, 2009). Sendo que, só é possível chegar
nessas soluções utilizando-se computação em grade com algoritmos em paralelo.
A solução do problema das rainhas é relevante, pois sua aplicação pode ser
encontrada em sistemas de armazenamento de memória em paralelo, testes de VLSI
(Very Large Scale Integration), controle de tráfego de redes de computadores e prevenção
de deadlock em Sistemas Operacionais.
45
haja ataque por coluna) e verifica se ocorre algum ataque em diagonal. Caso não ocorra
ataque, o algoritmo é executado de forma recursiva para a próxima linha. Caso já não
existam posições seguras, volta-se a rainha para a linha anterior e procura-se uma nova
coluna. Se não for possível encontrar uma coluna segura para essa linha e a quantidade
de linhas é menor ou igual a 𝑁 e algoritmo descarta essa combinação de linha e coluna.
Se a rainha estiver segura, o processo continua para a próxima linha com outra coluna
ainda não escolhida (Fernandes e Alho 2004).
Na prática, a abordagem por backtracking produz uma classe muito limitada de
soluções à medida que 𝑁 cresce. Além disso, devido a complexidade 𝑂(𝑁!) dessa
solução, é extremamente custoso para computadores clássicos montar todas as busca que
o problema exige. Desse modo, vários autores veem propondo outras técnicas de busca
eficientes para superar essa limitação. Estes métodos incluem métodos de busca heurística
(Pothumani, 2009), técnicas de minimização de busca e conflitos locais (Pothumani,
2009). Recentemente, os avanços da pesquisa na área de redes neurais têm gerado vários
artigos propondo soluções para o problema. O uso das redes de Hopfield (Pothumani,
2009) tem sido aplicado para o problema de N–Queens, pois trata-se de uma rede neural
simples que é capaz de armazenar certos padrões de modo semelhante ao cérebro, onde o
padrão completo para um determinado problema pode ser recuperado desde que a rede
seja apresentada com dados parciais.
Para valores de 𝑁 > 100 (Sosic, 1993) é interessante que se utilize paralelismo
clássico. O algoritmo sequencial de tempo linear é exemplo simples de solução e mostra-
se bastante eficiente.
Essa técnica pode ser dividida em dois passos: o inicial e o final. Durante o passo
inicial as rainhas são colocadas em sucessivas colunas da esquerda para a direita. Em cada
coluna a posição é escolhida randomicamente. Se ocorrer algum conflito com a coluna
escolhida, a posição da mesma passa para a próxima posição à direita. Esse processo é
repetido até preencher todas as linhas com alguma rainha. No passo final ocorre a
verificação de possíveis conflitos levando em consideração as diagonais de todas as
rainhas colocadas. É absolutamente óbvio que se ocorrer algum conflito, é escolhida outra
posição para a rainha de tal forma que a mesma não sofra nenhum ataque.
Esse algoritmo encontra uma solução num tempo proporcional segundo a fórmula
abaixo.
𝑇(𝑁) = 3,18𝑁 + 72𝐶𝑁
46
Onde 𝐶𝑁 é uma constante dependente de 𝑁, denotanto o número de rainhas com
conflito depois do passo incial. Por exemplo, para 𝑁 = 1000000 tem-se 999950 rainhas
sem conflito no primeiro passo com 50 rainhas, em média, relativas aos conflitos do
segundo passo (Sosic, 1993). Todo esse cálculo sequencial é paralelizado para cada
coluna e o ideal é colocar um processador para cada linha, ou seja, a quantidade de cores
deve ser igual à quantidade de rainhas.
O algoritmo de busca de Grover foi utilizado para encontrar uma possível posição
numa determinada linha a partir de um algoritmo similar ao de backtraking. Entretanto,
essa solução mostrou ser “ingênua”, pois uma simples busca por posições válidas numa
determinada linha, além de não trazer o caráter quântico desejado à solução, trazia perda
de eficiência no momento da execução. Isso aconteceu devido à necessidade de realizar
pesquisas baseadas no algoritmo de Grove para cada linha do tabuleiro, isto é, realizar
classicamente sucessivas chamadas do algoritmo quântico e assumindo o ônus da
preparação dos disparos dos mesmos. Na verdade, introduzir o caráter quântico desta
forma não explora todo o potencial de uma possível solução quântica para esse problema,
portanto esse caminho foi desconsiderado.
47
A segunda etapa foi concebida devido ao aumento da quantidade de soluções à
medida que 𝑁 cresce. Isso gerou uma suspeita de um possível comportamento funcional
num determinado vetor solução, por exemplo.
Com ajuda do programa confeccionado em “C” utilizando o algoritmo de
backtraking que consta no Apêndice D, para 𝑁 = 4 (4 linhas e 4 colunas) pode-se criar
uma série cujos elementos são pares ordenados <linha, coluna> que representa as
posições das rainhas no tabuleiro par uma determinada solução. Por exemplo a série 1 da
figura 5.5 representa a seguinte solução {<1,2>, <2,4>, <3,1>, <4,3>}.
5
3
Série1
2 Série2
1
0
1 2 3 4
48
Para 𝑁 = 5 as séries comportam-se da forma descrita na figura 5.6.
6
Série1
5 Série2
Série3
4
Série4
3 Série5
Série6
2
Série7
1 Série8
Série9
0
Série10
1 2 3 4 5
0
1 2 3 4 5 6 7 8
49
As soluções para 𝑁 = 4 são {2, 4, 1, 3} 𝑒 {3, 1, 4, 2}. Mas como uma pode ser
obtida a partir da outra invertendo o tabuleiro em 180º. É possível expressá-las da seguinte
forma.
{−3 − 𝑖, −1 + 3𝑖, 1 − 3𝑖, 3 + 𝑖}
Para se obter o resultado desejado a leitura dos números complexos deve ser
realizada da seguinte forma para cada metade da solução acima.
Para a primeira metade deve-se:
1. Multiplicar por 𝑖.
2. Remover a parte imaginária
3. Multiplicar por −1.
Para a segunda metade deve-se:
1. Multiplicar por 𝑖.
2. Obter o conjugado complexo do resulto e descartar a parte real
3. Multiplicar por 𝑖.
Ou seja, aplicando o método acima respectivamente e sucessivamente tem-se:
50
posições válidas para as damas é obtida através da aplicação de um operador unitário que
ajusta as possibilidades válidas. Esse operador é obtido da forma descrita a seguir.
Para cada linha ocorrerá uma busca na lista 𝑁 = {0, 1, 2, … , 𝑁 − 1}, onde 𝑛 =
𝑙𝑜𝑔2 (𝑁) é a quantidade de q-bits do registrador mais um q-bit para armazernar o resultado
da função
𝑓: = {0, 1, 2, … , 𝑁 − 1}, → {0,1}.
Definida da seguinte forma:
1, 𝑠𝑒 𝑖 = 𝑖0
𝑓(𝑖) = {
0, 𝑠𝑒 𝑖 ≠ 𝑖0
onde, para todo 𝑓(𝑖) = 1 tem-se a probabilidade confirmada de se encontrar uma
posição inválida e 𝑓(𝑖) = 0 representa o conjunto de possibilidades válidas.
O conjunto de possibilidades inválidas é facilmente calculado a partir dos valores
das damas escolhidas em cada linha levando em consideração as colunas e as diagonais.
Desse modo, um estado qualquer pode ser definido como
𝑁−1
1
|𝜑⟩ = ∑ |𝑖⟩
√𝑁 𝑖=0
51
O pseudo-código da estratégia adotada pode ser encarado da seguinte forma.
Repita
1.1 Se for a ultima linha busca sequencial
1.2 Senão reset de todos os qubits para |0⟩
2.Superposição do emaranhado f(0)
3.Negação do vetor
4.Complemento normal
5.Medida
5.Valida e guarda o valor
Até encontrar a solução
𝜋√𝑁
ou até no máximo vezes.
8
52
Tabela 5.1 – Output de execução do algoritmo híbrido
qcl>NQueens(4) qcl>NQueens(8) qcl>NQueens(16) qcl>NQueens(32)
: N-Queens N = 4 : N-Queens N = 8 : N-Queens N = 16 com : N-Queens N = 32 com
com 2 qubits com 3 qubits 4 qubits 5 qubits
1 Ciclo 5 Ciclos 4 Ciclos 7 Ciclos
: Alcancei a linha : Alcancei o : Alcancei a linha 13 : Alcancei a linha 27
3 com o primero 1 ultimo com o primero 1 com o primero 14
: Alcancei a linha : Tentando linha 7 : Alcancei o ultimo : Alcancei o ultimo
3 com o primero 2 Coluna 3
: Alcancei o : Mostra a solucao : Tentando linha 15 : Tentando linha 31
ultimo Coluna 8 Coluna 0
: Tentando linha 3 : 1 : Mostra a solucao : Mostra a solucao
Coluna 1
: Mostra a solucao : 5 : 2 : 15
: 3 : 8 : 14 : 4
: 1 : 6 : 5 : 19
: 4 : 3 : 7 : 22
: 2 : 7 : 10 : 25
: 2 : 4 : 17
: 4 : 11 : 10
: 15 : 23
: 3 : 32
: 16 : 8
: 8 : 16
: 12 : 9
: 1 : 2
: 13 : 31
: 6 : 27
: 9 : 24
: 7
: 18
: 13
: 5
: 14
: 6
: 30
: 20
: 12
: 3
: 28
: 11
: 21
: 29
: 26
: 1
53
Na tabela 5.2 tem-se o intervalo médio de execuções para uma bateria de testes
com 100 repetições, onde cada repetição é composta pela busca de um caminho possível
de distribuição das rainhas sendo 𝑁 a quantidade de linhas e colunas do tabuleiro.
54
55
Capítulo VI
Conclusão
6.1 – Conclusão
Quando Gödel mostrou que a matemática não seria capaz de demonstrar todos os
teoremas, ele introduziu o conceito de indecidibilidade especialmente na computação. A
partir desse fato histórico, ficou claro que sempre existirão problemas indeterminados e
determinados. Além disso, dentre os problemas que possuem solução, os mesmos podem
ser subdivididos em tratáveis e intratatáveis.
O poder de abstração da realidade promovido pela Máquina de Turing e unido
com a mecânica quântica deu origem à computação quântica. Essa, por sua vez, produziu
um avanço nas soluções dos problemas determinados e intratáveis do mundo clássico
fazendo com que os NP-Completos (o caixeiro viajante, a busca em grafos, a fatoração
de inteiros etc) ganhassem soluções com maior eficiência. Este fato deve-se ao conceito
dos qubits através do mundo aleatório introduzido pelo vetor de estado numa base
ortonormal de números complexos. Por isso que alguns autores costumam dizer que a
equação FÍSICA ∪ MATEMÁTICA ≡ COMPUTAÇÃO passa a ter sentido quando se
tenta contextualizar os fundamentos da computabilidade.
Os números levantados na prova de conceito do trabalho ilustraram que o
algoritmo quântico de busca terá um ganho quadrático de eficiência se for possível
simulá-lo numa Máquina de Turing Quântica. Entretanto, tais máquinas quânticas ainda
não estão disponíveis, tornando-se necessário simulá-las em computadores clássicos. Sob
esta ótica, a capacidade de lidar com emaranhados em computadores clássicos mostrou-
se ineficiente à medida que se aumenta a quantidade de qubits.
Este trabalho permitiu uma melhor compreensão da relação entre os conceitos de
complexidade, indecidibilidade e mecânica quântica. Desta compreensão, foi possível
entender as Máquinas de Turing clássica e quântica. Em seguida foi realizado um estudo
mais detalhado dos algoritmos de Deutsch, Grover e Shor. Este estudo dos algoritmos
forneceu explicações significativamente mais detalhadas, e assim se espera, didáticas, do
56
que aquelas encontradas na literatura. Logo após, foram feitos experimentos com a
Quantum Computing Language com o objetivo de exercitar uma prática de programação
permeada de conceitos da mecânica quântica. Neste sentido, foi implementada a busca de
um número em uma lista não ordenada, cujos resultados foram comparados com soluções
clássicas.
Com o aprendizado adquirido no algoritmo de Grover e encorajado pelos
resultados satisfatórios obtidos na prova de conceito foi possível a implementação de um
algoritmo híbrido que conseguiu, mesmo que, utilizando o simulador clássico, obter
soluções para o problema das N-Rainhas com número de casas acima de 9. Fato esse que,
somente algoritmos clássicos mais sofisticados tais como: busca heurísticas, técnicas de
minimização de busca e redes neurais conseguem fazê-lo. Ainda assim estes mesmos
algoritmos fazem uso de vários recursos computacionais providos pelo paralelismo com
inúmeros processadores e máquinas, o que não foi preciso na solução mostrada no
trabalho. Desta forma, os resultados sugerem que a computação quântica é uma evolução
em relação aos métodos tradicionais da computabilidade.
57
6.2 – Trabalhos Futuros
58
Bibliografia
Bernstein , Ethan; Vazirani, Umesh. “Quantum complexity theory”, In: Proc. 25th
Annual ACM Symposium on Theory of Computing, ACM, pp.11-20, 1993.
Bernstein , Ethan; Vazirani, Umesh. “Quantum complexity theory”, In: SIAM Journal
on Computing archive, Volume 26 Issue 5, Oct, pp.1411-1473, 1997.
Damásio, Antonio. “O Erro de Descartes”, Cia das Letras SP, 2ª ed., 1994.
Del Nero, Henrique Schützer, “O Sítio da Mente”, c.11, São Paulo, Collegium Cognitio,
1997.
Deutsch, D. “Quantum Theory, the Church-Turing Principle and the Universal Quantum
Computer”, Procceedings of the Royal Society A, Mathematical, Physical &
Engineering Sciences, 400, pp.97-117, 1985.
Goldstein, Rebecca. “The Proof and Paradox”, Atlas Books, 2ª ed., 2005.
59
Mello, Flávio Luis de. “Teoria da Computação”, Notas de aula do curso de Engenharia
Eletrônica e de Computação, Escola Politécnica, Universidade Federal do Rio de
Janeiro, 2014.
Nunes, Maria das Graças Volpe; Dosualdo, Daniel Gomes , “Tese de Church”, Notas de
Aula do curso de Teoria da Computação, Instituto de Ciências Matemáticas e de
Computação, Universidade Estadual de São Paulo,
<http://www.icmc.usp.br/~gracan/teoria/SubItem32Teoria.html>, Acessado em 13 de
maio de 2012.
Penrose, Roger. “O Pequeno o Grande e a Mente Humana”, MIT Press, EUA, 1ª ed.,
1996.
Pinker, Steven. “Como a Mente Funciona”. Cia das Letras, SP, 2ª ed., 1998.
60
Toscani, L.V., Veloso, P.A., “Complexidade de Algoritmos: análise, projetos em
métodos”, Sagra-Luzzato, Porto Alegre, Instituto de Informática da UFRGS, 2001.
Bell , J. and Stevens, B. “A Survey of Known Results and Research Areas for n-
Queens”, Discrete Mathematics, vol. 309, pp. 1-31, 2009.
Fernandes, Marco e Alho, Miguel. "Solução eficiente para a resolução do Problema das
N-Rainhas", REVISTA DO DETUA, vol. 4, Nº 2, Janeiro de 2004
Sosic, Rok. “A Parallel Search Algorithm for the N-Queens Problem”, School of
Computing and Information Technology, Technical Report CIT-94-3, Agosto de 1993.
61
Apêndice A - QCL
QCL (Quantum Computation Language) é uma linguagem de programação
quântica (QPL) de alto nível que possui as principais características.
62
Exemplo: Transformada de Fourier Discreta
dft.qcl
operator dft(qureg q)
{ // main operator
const n=#q; // set n to length of input
int i; int j; // declare loop counters
for i=0 to n-1 {
for j=0 to i-1 { // apply conditional phase gates
CPhase(2*pi/2^(i-j+1),q[n-i-1] & q[n-j-1]);
}
Mix(q[n-i-1]); // qubit rotation
}
flip(q); // swap bit order of the output
}
63
O interpretador em QCL simula um computador quântico dentro de um número
arbitrário de qubits e é chamado com a seguinte sintaxe.
Startup Options:
-h, --help display this message
-V, --version display version information
-i, --interactive force interactive mode
-n, --no-default-include don't read default.qcl on startup
-o, --logfile specify a logfile
-b, --bits=n: set number of qubits (32)
64
Em síntese, qualquer programa quântico deve ser a composição de inicializações,
operadores unitários e medições. Um típico algoritmo quântico probabilístico geralmente
é executado num ciclo de avaliação.
A demonstração abaixo pode ser encarada como um exemplo mínimo de um
algoritmo quântico.
single.qcl
{
reset; // R: |Psi> -> |0>
myoperator(q); // U: |0> -> |Psi'>
measure q,m; // M: |Psi'> -> |m>
} until ok(m); // picked the right m ?
65
Apêndice B – Algoritmo de Deutsch
const QCL (Quantum Computation
coin1=(random()>=0.5) Language) é uma linguagem de programação
const coin2=(random()>=0.5)
quântica (QPL) de alto nível que possui as principais características.
boolean f(boolean x) {
if coin1 { // coin1=true -> g is constant
return
Linguagem
coin2;
de controles clássicos com funções de controle de fluxo e interações
} else
com{ // coin1=false
vários tipos de dados clássicos -> gboolean,
(int, string, is balanced
real, complex)
return x xor coin2;
2 tipos
} de operadores quânticos unitários gerais (operator) e portas pseudo-
}
Operador F(quconst x,quvoid y) {
if f(false) xor f(true) { CNot(y,x); }
if f(false) { Not(y); }
}
procedure deutsch() {
qureg x[1];
qureg y[1];
int m;
{
reset; Incializa a máquina
U(x,y); Executa o operador
measure y,m; É realizada a medida do Segundo registrador
} until m==1; Repete-se o loop até encontrar 𝑓(𝑥) = 1
measure x,m; Lê-se o valor de 𝑥
print "f(0) xor f(1) =",m; Imprime o resultado
}
66
Apêndice C – Busca Quântica N-Queens
nqueens.qcl
include "grover.qcl";
if (x2>x1) {
if ((x2-x1 == y2-y1) or (x2-x1 == y1-y2)) {return true;}
}
return false;
}
H(q);
query(q,f,n);
}
67
procedure NQueens(int N) {
int n=floor(log(N,2));
int L;
int i;
int j;
int k;
int x;
int ciclo;
int vector queens[N];
int vector index[N];
qureg q[n];
reset;
k = -1;
L = 0;
ciclo = 0;
while (queens[N-1] == -1) {
//Primeiro elemento do vetor, qualquer posicao funciona
if (L == 0) {
ciclo = ciclo+1;
k = k+1;
if (k == N) {
k = 0;
}
queens[L] = k;
//print "Forcei o primeiro",k;
}
else {
if (L == N-1) {
print "Alcancei o ultimo";
i = -1;
{
i = i+1;
} until (i < N) and (index[i] == -1);
68
queens[L] = ValidandoPosicao(queens, queens[j], L);
if (queens[L] == -1) {
//Excluo a diagonal à esquerda
if (queens[j] - (L-j) > -1) {
exclude(q, queens[j] - (L-j));
measure q,x;
queens[L] = x;
//print "Tentando validar a coluna
",queens[L],"na linha",L,"excluindo a coluna",(queens[j]-(L-j));
queens[L] = ValidandoPosicao(queens,
(queens[j]-(L-j)), L);
if (queens[L] == -1) {
//Excluo a diagonal à direita
if (queens[j] + (L-j) < N) {
exclude(q, queens[j] +
(L-j));
measure q,x;
queens[L] = x;
//print "Tentando validar a
coluna ",queens[L],"na linha",L,"excluindo a coluna",(queens[j]+(L-j));
queens[L] =
ValidandoPosicao(queens, (queens[j]+(L-j)), L);
}
}
}
}
j = j+1;
}
}
}
// print "Linha",L,"Coluna",queens[L];
if (queens[L] == -1) {
print "Alcancei a linha",(L+1),"com o primero",(k+1);
for i=0 to N-1 {
queens[i] = -1;
}
L = 0;
reset;
}
else {
index[queens[L]] = L;
//print "Achei Linha",i,"Coluna",queens[i];
L = L+1;
}
}
//Mostra a solucao
if (queens[N-1] != -1) {
print "Mostra a solucao";
for i=0 to N-1 {
if (queens[i] != -1) {
print queens[i]+1;
}
}
//exit;
}
}
69
Apêndice D – Backtraking N-Queens
nqueens.cpp
#define EXIT_SUCCESS 1;
#include <iostream>
#include <cstdlib>
#include <stdio.h>
class Rainhas{
public:
int contador;
bool imprimeTabuleiros;
int rainha[25];
int N;
//Construtor Padrao
Rainhas(){
contador = 0;
imprimeTabuleiros = false;
}
N = n;
rainha[0] = 0;
for (int i = 1; i<N;i++){
rainha[i] = N;
}
}
void start(){
busca (rainha,0);
cout << "Numero total de solucoes: " << contador << endl;
}
}
70
private:
if (rainha[k]>(N-1))
{
}
cout << endl;
}
}
71
bool ataca(int x1, int y1, int x2, int y2)
{
if ((x1==x2)||(y1==y2)) return true;//mesma linha ou mesma coluna
return false;
}
};
72