Corrigi a idéia básica do ataque? Se estiver errado, ignore o restante da postagem!
Na maioria das vezes. Da maneira como a descreve, você realmente obterá o estado , mas não poderá executar a transformação unitária . Mas na etapa 3, quando você executa o Grover no estado , na verdade você precisa aplicar como parte do algoritmo de Grover. A razão é a seguinte: Normalmente, Grover é apresentado como um algoritmo que procuras um valor que satisfaz um predicado . Nesse caso, o algoritmo de Grover inicializa primeiro o estado para|ϕ⟩I - | & Phi; ⟩ ⟨ & Phi; | | & Phi; ⟩ I - | & Phi; ⟩ ⟨ & Phi; | x ∈ { 0 , 1 } n P | & Phi; ⟩ : = Σ x ∈ { 0 , 1 } n 2 - n / 2 | x ⟩ I - | & Phi; ⟩ ⟨ & Phi; |I−|ϕ⟩⟨ϕ||ϕ⟩I−|ϕ⟩⟨ϕ|x∈{0,1}nP|ϕ⟩:=∑x∈{0,1}n2−n/2|x⟩. E, durante o loop principal, aplica o operador flip . Esse operador é muito fácil de construir se , portanto, normalmente não é mencionado como requisito do algoritmo. No entanto, em vez de procurar , você poderia procurar para algum conjunto . (Afinal, não há nada de especial nas cadeias de bits de comprimento .) Então você precisa alterar a descrição de Grover: O estado inicial será , e precisamos aplicarI−|ϕ⟩⟨ϕ||ϕ⟩=∑x∈{0,1}n2−n/2|x⟩x∈{0,1}nx∈XXn|ϕ⟩=∑x∈X2−|X|/2|x⟩I−|ϕ⟩⟨ϕ|Xdurante o loop principal. Para muitos conjuntos (por exemplo, números módulo ), será bastante fácil construir e . No entanto, no caso geral, pode ser que seja difícil construir qualquer um deles. Na sua descrição do algoritmo, temos uma situação semelhante. Ou seja, para alguns pontos . Mas para esse conjunto , não há como construir ou . É por isso que seu algoritmo não funciona (mas ainda dá a idéia certa). Em vez disso, no artigo que você cita, ambosXN|ϕ⟩I−|ϕ⟩⟨ϕ|X={x:H(x)=c}cX|ϕ⟩I−|ϕ⟩⟨ϕ||ϕ⟩I - | & Phi; ⟩ ⟨ & Phi; | | & Phi; ⟩e são fornecidos por oráculos especiais construídos apenas para esse fim. Usando esses oráculos, você pode executar o algoritmo Grovers no estado .I−|ϕ⟩⟨ϕ||ϕ⟩
Quantos elementos existem na superposição
depois que nos comprometemos com um certo ?|ϕ⟩c
Isso vai depender dos parâmetros que você escolheu. Esperamos aproximadamente se é o tamanho do domínio e o tamanho da gama de . Para que as coisas sejam interessantes, você deve escolher para que exponencialmente haja muitos elementos na superposição (e pelo menos para que todas as mensagens sejam possíveis). No entanto, suponho que a razão pela qual você esteja se perguntando sobre isso seja porque você acha que o número de elementos deve ser pequeno para Grover funcionar, o que não é o caso, veja abaixo:M/NMNHM≫N2|m|
A velocidade da pesquisa de Grover - esse é o principal problema e não tenho certeza de como o truque deles realmente funciona. A complexidade computacional não seria a mesma que tentar adivinhar uma pré-imagem para uma determinada saída da função hash, já que é preciso pesquisar sobre todos os u? Nesse caso, onde está a vantagem?
Aqui parece estar um equívoco. Lembre-se de minhas explicações sobre o algoritmo de Grover no início desta resposta. Pesquisas Grover alguns , satisfazendo algum predicado . No nosso caso, pode ser enorme ( elementos ) porque é o conjunto de todas as pré-imagens de . Mas aquilo não importa. Lembre-se de que o Grover original funciona em que também é enorme, mas funciona rápido, enquanto procuramos por que possua alguma propriedade comum . Por exemplo, se pesquisarmos Grover por que satisfaça esse (o predicadox∈XPXM/Nc{0,1}nx∈{0,1}nPx∈{0,1}n33∣xP), temos que existem muitos que satisfazem , a cada 33. satisfaz! E o tempo de execução será algo como . Portanto, como regra geral, se um predicado for satisfeito para cada ésimo elemento de , o algoritmo de Grover que pesquisa que satisfaz leva cerca de etapas. Aqui, não importa qual é o conjunto ou qual o seu tamanho! (Desde que tenhamos uma maneira de construir e para este conjuntoxPx33−−√PiXx∈XPi√X|ϕ⟩I−|ϕ⟩⟨ϕ|X.) Agora, na configuração que você descreve, . E é o predicado que diz que começa com . Para analisar o tempo de execução do algoritmo de Grover, neste caso, não se preocupam com , mas precisamos saber quantas vezes um satisfaz elemento . Isso é fácil: todo elemento faz. Portanto, o tempo de execução do Grover será . Isso é um problema se for longo, mas se for, por exemplo, apenas um pouco, isso funcionará bem. Por exemplo, se usarmos a função hash para confirmar as mensagens de um bit, podemos abrir o compromisso para qualquer valor deX={x:H(x)=c}Pxm′XP2|m′|O(2|m′|−−−−√)m′m′m′.
Se você quiser um exemplo em que seja maior, precisará variar a construção. Basicamente, você se compromete individualmente e concatena os compromissos. Em seguida, cada compromisso pode ser quebrado usando o método descrito acima, e você precisa executar os do algoritmo .m′|m′|