Simulador quântico esparso

O simulador esparso utiliza uma representação esparsa de vetores de estado quântico. Um estado quântico esparso é um estado em que a maioria dos coeficientes de amplitude é zero. Representações esparsas permitem que o simulador esparso minimize o volume de memória necessário para representar estados quânticos, o que permite simulações em um número maior de qubits. O simulador esparso é eficiente para programas com estados quânticos esparsos na base computacional. O simulador esparso permite que os usuários explorem aplicativos maiores do que um simulador de estado completo porque simuladores de estado completo desperdiçam memória e tempo em um número exponencialmente grande de amplitudes zero.

Para obter mais informações sobre o simulador esparso, consulte Jaques e Häner (arXiv:2105.01533).

Execute o simulador parcimonioso

O simulador esparso é o simulador local padrão na extensão MicrosoftQuantum Development Kit (QDK) para Visual Studio Code (VS Code). Como usar o simulador esparso depende do seu ambiente de desenvolvimento.

Ambiente de desenvolvimento Como chamar o simulador esparso
Em um programa Q# ou OpenQASM em VS Code Execute o arquivo Q# ou o arquivo OpenQASM
Em um programa Python com a biblioteca qdk qsharp.run
ou
openqasm.run
ou
qiskit.QSharpBackend
Em uma célula de %%qsharp notebook Chame a operação de entrada do programa, por exemplo:
Main()

Adicionar Pauli ruído ao simulador esparso em VS Code

O simulador esparso suporta a adição de Pauli ruído a simulações de seus Q# programas com a VS Code extensão. Esse recurso permite que você simule os efeitos do ruído em operações e medidas quânticas. Para especificar um modelo de ruído no programa Q#, use a função ConfigurePauliNoise. A função define probabilidades para que os operadores Pauli, X, Y e Z, bem como o ruído, ocorram. Você também pode definir modelos globais de ruído nas configurações de extensão.

Adicionar Pauli ruído usando as VS Code configurações

Para definir o ruído global para programas em , configure a configuração de simulação de ruído : do usuário para a extensão .

Captura de tela que mostra as configurações globais Q# de ruído para a QDK extensão em VS Code.

As configurações de ruído se aplicam aos resultados do histograma para todas as portas, medições e qubits em todos os Q# programas em VS Code.

Por exemplo, um histograma do seguinte programa de exemplo em GHz, configurado sem ruído, mostra um resultado de $\ket{00000}$ para aproximadamente metade das medições e $\ket{11111}$ para a outra metade.

import Std.Diagnostics.*;
import Std.Measurement.*;

operation Main() : Result []{
    let num = 5;
    return GHzSample(num);
}
operation GHzSample(n: Int) : Result[] {
    use qs = Qubit[n];
    H(qs[0]);
    ApplyCNOTChain(qs);
    let results = MeasureEachZ(qs);
    ResetAll(qs);
    return results;
}

Captura de tela mostrando resultados sem ruído.

Se você adicionar uma taxa de ruído de 1% de bit-flip, os resultados começarão a se dispersar. Com 25% de ruído de bit-flip, o histograma torna-se indistinguível de um ruído puro.

Captura de tela do QDK em VS Code que mostra resultados do histograma para um programa com taxas de ruído de inversão de bits de 1% e 25%.

Adicione ruído individual a programas PauliQ#

Use a ConfigurePauliNoise função para definir ou modificar o modelo de ruído para programas individuais Q# . A ConfigurePauliNoise função fornece controle sobre quando e onde o ruído ocorre em seus Q# programas.

Observação

Se você configurar o ruído nas VS Code configurações, o ruído será aplicado a todos os Q# programas. No entanto, a ConfigurePauliNoise função substitui as VS Code configurações de ruído para o programa que chama a função.

Por exemplo, no programa anterior, você pode adicionar ruído imediatamente após a alocação de qubit.

operation GHzSample(n: Int) : Result[] {
    use qs = Qubit[n];

     // 5% bit-flip noise applies to all operations
    ConfigurePauliNoise(0.05, 0.0, 0.0);

    H(qs[0]);
    ApplyCNOTChain(qs);
    let results = MeasureEachZ(qs);
    ResetAll(qs);
    return results;
}

Captura de tela que mostra os resultados de histogramas com o ruído adicionado após a alocação do qubit.

Ou você pode adicionar ruído apenas à operação de medição.

operation GHzSample(n: Int) : Result[] {
    use qs = Qubit[n];
    H(qs[0]);
    ApplyCNOTChain(qs);

    // Noise applies to only the measurement operation
    ConfigurePauliNoise(0.05, 0.0, 0.0);

    let results = MeasureEachZ(qs);
    ResetAll(qs);
    return results;
}

Captura de tela que mostra os resultados do histograma com o ruído adicionado pouco antes da medição.

Para modificar ou limpar as configurações de ruído em diferentes pontos do programa, chame ConfigurePauliNoise várias vezes. Por exemplo, você pode definir 5% de ruído de inversão de bits para a porta Hadamard e, em seguida, não aplicar ruído para o restante do programa.

operation GHzSample(n: Int) : Result[] {
    use qs = Qubit[n];

    // Noise applies to the H operation
    ConfigurePauliNoise(0.05, 0.0, 0.0);
    
    H(qs[0]);

     // Clear the noise settings
    ConfigurePauliNoise(0.0, 0.0, 0.0);
    
    ApplyCNOTChain(qs);
    let results = MeasureEachZ(qs);
    ResetAll(qs);
    return results;
}

Outras Q# funções de ruído

A ConfigureNoiseFunction função é suficiente para modelar qualquer tipo de Pauli ruído em seu programa, mas Q# tem outras funções de ruído que você também pode usar. Estão disponíveis as seguintes funções na biblioteca Std.Diagnostics para ajustar o ruído em programas Q#:

Função Description Example
ConfigurePauliNoise Configura o Pauli ruído para uma execução de simulador. Os parâmetros representam as probabilidades de ruído nas portas X, Y e Z Pauli. A configuração de ruído se aplica a todas as portas, medições e qubits subsequentes em um programa Q#. Substitui as configurações de ruído da extensão VS Code. Chamadas subsequentes para ConfigurePauliNoise substituem o ruído configurado por chamadas anteriores. ConfigurePauliNoise(0.1, 0.0, 0.5)
ou
ConfigurePauliNoise(BitFlipNoise(0.1))
BitFlipNoise Configura apenas o ruído do portão X com a probabilidade especificada. 10% ruído de inversão de bits
ConfigurePauliNoise(BitFlipNoise(0.1)) $\equiv$ ConfigurePauliNoise(0.1, 0.0, 0.0)
PhaseFlipNoise Configura apenas o ruído do portão Z com a probabilidade especificada. 10% ruído de inversão de fase:
ConfigurePauliNoise(PhaseFlipNoise(0.1)) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.1)
DepolarizingNoise Configura o ruído como porta X, Y ou Z com probabilidades iguais. Ruído despolarizante de 6%
ConfigurePauliNoise(DepolarizingNoise(0.06)) $\equiv$ ConfigurePauliNoise(0.2, 0.2, 0.2)
NoNoise Redefine o modelo de ruído para não ter ruído. ConfigurePauliNoise(NoNoise()) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.0)
ApplyIdleNoise Aplica o ruído configurado a um único qubit durante a simulação. ...
use q = Qubit[2];
ConfigurePauliNoise(0.1, 0.0, 0.0);
ApplyIdleNoise(q[0]);
...