Operação AssertQubitIsInStateWithinTolerance

Aviso

Esta documentação refere-se ao QDK Clássico, que foi substituído pelo QDK Moderno.

https://aka.ms/qdk.api Veja a documentação da API para o QDK Moderno.

Espaço de nomes: Microsoft.Quantum.Diagnostics

Pacote: Microsoft.Quantum.QSharp.Foundation

Afirma que um qubit no estado esperado.

expected representa um vetor complexo, $\ket{\psi} = \begin{bmatrix}a & b\end{bmatrix}^{\mathrm{T}}$. O primeiro elemento das cadeias de identificação que representa cada uma das $a$, $b$ é a parte real do número complexo, enquanto a segunda é a parte imaginária. O último argumento define a tolerância com que a asserção é feita.

operation AssertQubitIsInStateWithinTolerance (expected : (Microsoft.Quantum.Math.Complex, Microsoft.Quantum.Math.Complex), register : Qubit, tolerance : Double) : Unit is Adj + Ctl

Entrada

esperado: (Complexo,Complexo)

Amplitudes complexas esperadas para $\ket{0}$ e $\ket{1}$, respetivamente.

registar: Qubit

Qubit cujo estado deve ser afirmado. Tenha em atenção que este qubit é considerado separável de outros qubits alocados e não entrelaçado.

tolerância: Duplo

Tolerância a aditivos através da qual as amplitudes reais são autorizadas a desviarem-se do esperado. Veja as observações abaixo para obter detalhes.

Saída: Unidade

Exemplo

using (qubits = Qubit[2]) {
    // Both qubits are initialized as |0〉: a=(1 + 0*i), b=(0 + 0*i)
    AssertQubitIsInStateWithinTolerance((Complex(1., 0.), Complex(0., 0.)), qubits[0], 1e-5);
    AssertQubitIsInStateWithinTolerance((Complex(1., 0.), Complex(0., 0.)), qubits[1], 1e-5);
    Y(qubits[1]);
    // Y |0〉 = i |1〉: a=(0 + 0*i), b=(0 + 1*i)
    AssertQubitIsInStateWithinTolerance((Complex(0., 0.), Complex(0., 1.)), qubits[1], 1e-5);
}

Observações

O seguinte código matemático pode ser utilizado para verificar expressões para mi, mx, my, mz:

{Id, X, Y, Z} = Table[PauliMatrix[k], {k, 0, 3}];
st = {{ reA + I imA }, { reB + I imB} };
M = st . ConjugateTranspose[st];
mx = Tr[M.X] // ComplexExpand;
my = Tr[M.Y] // ComplexExpand;
mz = Tr[M.Z] // ComplexExpand;
mi = Tr[M.Id] // ComplexExpand;
2 m == Id mi + X mx + Z mz + Y my // ComplexExpand // Simplify

A tolerância é a distância $L_{\infty}$ entre o vetor real dimensional (x₂,x₃,x₄) definido por $\langle\psi|\psi\rangle = x_1 I + x_2 X + x_3 Y + x_4 Z$ e vetor real (1y₂,y₃,y₄) definido por ρ = y₁I + y₂X + y₃Y + y₄Z em que ρ é a matriz de densidade correspondente ao estado do registo. Isto só é verdade no pressuposto de que Tr(ρ) e Tr(|ψ⟩⟨ψ|) são ambos 1 (por exemplo, x₁ = 1/2, y₁ = 1/2). Se não for esse o caso, a função afirma que l∞ distância entre (x₂-x₁,x₃-x₁,x₄-x₁,x₄+x₁) e (y₂-y₁,y₃-y₁,y₄-y₁,y₄+y₁) é menor do que o parâmetro de tolerância.

Tenha em atenção que as versões Adjacentes e Controladas desta operação não verificarão a condição.