Simulador quântico esparso

O simulador esparso utiliza uma representação esparsa dos 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 a área de memória necessária para representar estados quânticos, o que possibilita simulações sobre um número maior de qubits. O simulador esparso é eficiente para programas com estados quânticos que são escassos na base computacional. O simulador esparso permite aos utilizadores explorar aplicações maiores do que um simulador de estado completo porque os simuladores de estado completo desperdiçam memória e tempo num número exponencialmente grande de amplitudes zero.

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

Chame o simulador esparso

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

Ambiente de desenvolvimento Como chamar o simulador esparso
Num programa Q# ou OpenQASM em VS Code Execute o ficheiro Q# ou OpenQASM
Num programa Python com a biblioteca qdk qsharp.run
ou
openqasm.run
ou
qiskit.QSharpBackend
Numa %%qsharp célula de 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 às simulações dos seus Q# programas com a VS Code extensão. Este recurso permite simular os efeitos do ruído em operações e medições quânticas. Para especificar um modelo de ruído no seu programa Q#, use a função ConfigurePauliNoise. A função define probabilidades para que ocorram os operadores Pauli, X, e Y, e o ruído Z. Também pode configurar modelos globais de ruído nas definições da extensão.

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

Para definir o ruído geral para programas em , configure a definição de utilizador Simulation: Noise para a extensão .

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

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

Por exemplo, um histograma para o seguinte programa de amostragem em GHz sem ruído configurado mostra um resultado de $\ket{00000}$ para cerca de 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 adicionares mesmo uma taxa de ruído de 1% bit-flip, os resultados começam a dispersar-se. Com 25% de ruído de inversão de bits, o histograma torna-se indistinguível de um ruído puro.

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

Adicionar Pauli ruído a programas individuais Q#

Use a ConfigurePauliNoise função para definir ou modificar o modelo de ruído para programas individuais Q# . A ConfigurePauliNoise função dá-lhe controlo sobre quando e onde ocorre ruído nos seus Q# programas.

Observação

Se configurares o ruído nas VS Code definições, o ruído é aplicado a todos os Q# programas. No entanto, a ConfigurePauliNoise função sobrepõe-se às VS Code definições de ruído do programa que chama a função.

Por exemplo, no programa anterior podes adicionar ruído imediatamente após a atribuição dos qubits.

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 ecrã que mostra os resultados dos histogramas com ruído adicionado após a alocação de qubits.

Ou 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 ecrã que mostra os resultados do histograma com ruído adicionado mesmo antes da medição.

Para modificar ou eliminar configurações de ruído em diferentes pontos do seu programa, ligue ConfigurePauliNoise várias vezes. Por exemplo, podes definir 5% de ruído de inversão de bit para a porta de Hadamard e depois definir ausência de ruído para o resto 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 no seu programa, mas Q# tem outras funções de ruído que também pode usar. As seguintes funções estão disponíveis na biblioteca Std.Diagnostics para configurar ruído em programas Q#.

Função Description Example
ConfigurePauliNoise Configura Pauli o ruído para uma execução no simulador. Os parâmetros representam as probabilidades do ruído das portas Pauli X, Y e Z. A configuração de ruído aplica-se a todas as portas, medições e qubits subsequentes de um programa Q#. Anula as definições de ruído da VS Code extensão. Chamadas subsequentes para ConfigurePauliNoise anulam o ruído definido por chamadas anteriores. ConfigurePauliNoise(0.1, 0.0, 0.5)
ou
ConfigurePauliNoise(BitFlipNoise(0.1))
BitFlipNoise Configura apenas o ruído da porta X com a probabilidade especificada. 10% de 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 da porta 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 para funcionar como a porta X, Y ou Z com probabilidades iguais. 6% ruído despolarizante:
ConfigurePauliNoise(DepolarizingNoise(0.06)) $\equiv$ ConfigurePauliNoise(0.2, 0.2, 0.2)
NoNoise Redefine o modelo de ruído para que não haja ruído. ConfigurePauliNoise(NoNoise()) $\equiv$ ConfigurePauliNoise(0.0, 0.0, 0.0)
ApplyIdleNoise Aplica 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]);
...