Calculations

Calculations and property-getters which do not modify the studied quantum state. More...

Functions

qreal calcDensityInnerProduct (Qureg rho1, Qureg rho2)
 Computes the Hilbert-Schmidt scalar product (which is equivalent to the Frobenius inner product of matrices) of two density matrices rho1 and rho2 of equivalent size. More...
 
qreal calcExpecPauliProd (Qureg qureg, int *targetQubits, enum pauliOpType *pauliCodes, int numTargets, Qureg workspace)
 Computes the expected value of a product of Pauli operators. More...
 
qreal calcExpecPauliSum (Qureg qureg, enum pauliOpType *allPauliCodes, qreal *termCoeffs, int numSumTerms, Qureg workspace)
 Computes the expected value of a sum of products of Pauli operators. More...
 
qreal calcFidelity (Qureg qureg, Qureg pureState)
 Calculates the fidelity of qureg (a statevector or density matrix) against a reference pure state (necessarily a statevector). More...
 
qreal calcHilbertSchmidtDistance (Qureg a, Qureg b)
 Computes the Hilbert Schmidt distance between two density matrices a and b, defined as the Frobenius norm of the difference between them. More...
 
Complex calcInnerProduct (Qureg bra, Qureg ket)
 Computes the inner product $ \langle \text{bra} | \text{ket} \rangle $ of two equal-size state vectors, given by. More...
 
qreal calcProbOfOutcome (Qureg qureg, const int measureQubit, int outcome)
 Gives the probability of a specified qubit being measured in the given outcome (0 or 1). More...
 
qreal calcPurity (Qureg qureg)
 Calculates the purity of a density matrix, by the trace of the density matrix squared. More...
 
qreal calcTotalProb (Qureg qureg)
 A debugging function which calculates the probability of the qubits in qureg being in any state, which should always be 1 for correctly normalised states (hence returning a real number). More...
 
Complex getAmp (Qureg qureg, long long int index)
 Get the complex amplitude at a given index in the state vector. More...
 
Complex getDensityAmp (Qureg qureg, long long int row, long long int col)
 Get an amplitude from a density matrix at a given row and column. More...
 
qreal getImagAmp (Qureg qureg, long long int index)
 Get the imaginary component of the complex probability amplitude at an index in the state vector. More...
 
long long int getNumAmps (Qureg qureg)
 Get the number of probability amplitudes in a qureg object, given by 2^numQubits. More...
 
int getNumQubits (Qureg qureg)
 Get the number of qubits in a qureg object. More...
 
qreal getProbAmp (Qureg qureg, long long int index)
 Get the probability of a state-vector at an index in the full state vector. More...
 
qreal getRealAmp (Qureg qureg, long long int index)
 Get the real component of the complex probability amplitude at an index in the state vector. More...
 

Detailed Description

Calculations and property-getters which do not modify the studied quantum state.

Function Documentation

◆ calcDensityInnerProduct()

qreal calcDensityInnerProduct ( Qureg  rho1,
Qureg  rho2 
)

Computes the Hilbert-Schmidt scalar product (which is equivalent to the Frobenius inner product of matrices) of two density matrices rho1 and rho2 of equivalent size.

That is, we define the Hilbert-Schmidt scalar product

\[ ((\rho_1, \rho_2))_{HS} := \text{Tr}[ \rho_1^\dagger \rho_2 ], \]

which is equivalent to the sum of products of matrix elemets, i.e.,

\[ ((\rho_1, \rho_2))_{HS} = \sum\limits_i \sum\limits_j (\rho_1)_{ij}^* (\rho_2)_{ij} \]

Assuming that both density matrices are Hermitian, the resulting scalar product is real and invariant under reordering its arguments as

\[ ((\rho_1, \rho_2))_{HS} = ((\rho_2, \rho_1))_{HS} = \text{Tr}[\rho_1 \rho_2] \]

If both rho1 and rho2 are density matrices of pure states bra and ket, then the equality holds

\[ ((\rho_1, \rho_2))_{HS} = |\langle \text{bra} | \text{ket} \rangle|^2. \]

If either or both of rho1 and rho2 are non Hermitian (i.e. invalid density matrices), then this function returns the real component of the scalar product, and discards the imaginary component. That is, it returns

\[ \text{Re}\{ \text{Tr}[ \rho_1^\dagger \rho_2 ] \} = \text{Re}\{ \text{Tr}[ \rho_2^\dagger \rho_1 ] \}. \]

This is still sometimes useful, e.g. in calculating the inner product with an anti-commutator, e.g. (for Hermitian $ \sigma $, $ \rho $, $ H $)

\[ ((\sigma, H \rho + \rho H))_{HS} = 2 \; \text{Re} \{ ((\sigma, H \rho))_{HS} \} \]

where $ H \rho $ could be a weighted sum of Pauli products applied to $ \rho $ through applyPauliSum().

Parameters
[in]rho1qureg as a density matrix (to have its values conjugate transposed)
[in]rho2qureg as a density matrix
Returns
the real Hilbert-Schmidt scalar product of density matrices rho1 and rho2 (assuming Hermiticity)
Exceptions
exitWithErrorif rho1 and rho2 are not density matrices or have mismatching dimensions.
Author
Balint Koczor (CPU)
Tyson Jones (GPU)

Definition at line 837 of file QuEST.c.

837  {
838  validateDensityMatrQureg(rho1, __func__);
839  validateDensityMatrQureg(rho2, __func__);
840  validateMatchingQuregDims(rho1, rho2, __func__);
841 
842  return densmatr_calcInnerProduct(rho1, rho2);
843 }

References densmatr_calcInnerProduct(), validateDensityMatrQureg(), and validateMatchingQuregDims().

Referenced by TEST_CASE().

◆ calcExpecPauliProd()

qreal calcExpecPauliProd ( Qureg  qureg,
int *  targetQubits,
enum pauliOpType pauliCodes,
int  numTargets,
Qureg  workspace 
)

Computes the expected value of a product of Pauli operators.

Letting $ \sigma = \otimes_j \hat{\sigma}_j $ be the operators indicated by pauliCodes and acting on qubits targetQubits, this function computes $ \langle \psi | \sigma | \psi \rangle $ if qureg = $ \psi $ is a statevector, and computes $ \text{Trace}(\sigma \rho) $ if qureg = $ \rho $ is a density matrix.

pauliCodes is an array of length numTargets which specifies which Pauli operators to enact on the corresponding qubits in targetQubits, where 0 = PAULI_I, 1 = PAULI_X, 2 = PAULI_Y, 3 = PAULI_Z. The target qubits must be unique, and at most qureg.numQubitsRepresented may be specified. For example, on a 7-qubit statevector,

calcExpecPauliProd(qureg, {4,5,6}, {PAULI_X, PAULI_I, PAULI_Z}, 3, workspace);

will compute $ \langle \psi | I I I I X I Z | \psi \rangle $ (where in this notation, the left-most operator applies to the least-significant qubit, i.e. that with index 0).

workspace must be a register with the same type (statevector vs density matrix) and dimensions (number of represented qubits) as qureg, and is used as working space. When this function returns, qureg will be unchanged and workspace will be set to $ \sigma | \psi \rangle $ (if qureg is a statevector) or $ \sigma \rho $ (if qureg is a density matrix). NOTE that this last quantity is NOT the result of applying the paulis as unitaries, $ \sigma^\dagger \rho \sigma $, but is instead the result of their direct multiplication with the density matrix. It is therefore itself not a valid density matrix.

This function works by cloning the qureg state into workspace, applying the specified Pauli operators to workspace then computing its inner product with qureg (for statevectors) or its trace (for density matrices). It therefore should scale linearly in time with the number of specified non-identity Pauli operators, which is bounded by the number of represented qubits.

Parameters
[in]quregthe register of which to find the expected value, which is unchanged by this function
[in]targetQubitsa list of the indices of the target qubits
[in]pauliCodesa list of the Pauli codes (0=PAULI_I, 1=PAULI_X, 2=PAULI_Y, 3=PAULI_Z) to apply to the corresponding qubits in targetQubits
[in]numTargetsnumber of target qubits, i.e. the length of targetQubits and pauliCodes
[in,out]workspacea working-space qureg with the same dimensions as qureg, which is modified to be the result of multiplying the state with the pauli operators
Exceptions
exitWithErrorif numTargets is outside [1, qureg.numQubitsRepresented]), or if any qubit in targetQubits is outside [0, qureg.numQubitsRepresented)) or if any qubit in targetQubits is repeated, or if any code in pauliCodes is not in {0,1,2,3}, or if workspace is not of the same type and dimensions as qureg
Author
Tyson Jones

Definition at line 871 of file QuEST.c.

871  {
872  validateMultiTargets(qureg, targetQubits, numTargets, __func__);
873  validatePauliCodes(pauliCodes, numTargets, __func__);
874  validateMatchingQuregTypes(qureg, workspace, __func__);
875  validateMatchingQuregDims(qureg, workspace, __func__);
876 
877  return statevec_calcExpecPauliProd(qureg, targetQubits, pauliCodes, numTargets, workspace);
878 }

References statevec_calcExpecPauliProd(), validateMatchingQuregDims(), validateMatchingQuregTypes(), validateMultiTargets(), and validatePauliCodes().

Referenced by TEST_CASE().

◆ calcExpecPauliSum()

qreal calcExpecPauliSum ( Qureg  qureg,
enum pauliOpType allPauliCodes,
qreal termCoeffs,
int  numSumTerms,
Qureg  workspace 
)

Computes the expected value of a sum of products of Pauli operators.

Let $ H = \sum_i c_i \otimes_j^{N} \hat{\sigma}_{i,j} $ be the operators indicated by allPauliCodes (where $ c_i \in $ termCoeffs and $ N = $ qureg.numQubitsRepresented). This function computes $ \langle \psi | H | \psi \rangle $ if qureg = $ \psi $ is a statevector, and computes $ \text{Trace}(H \rho) =\text{Trace}(\rho H) $ if qureg = $ \rho $ is a density matrix.

allPauliCodes is an array of length numSumTerms*qureg.numQubitsRepresented which specifies which Pauli operators to apply, where 0 = PAULI_I, 1 = PAULI_X, 2 = PAULI_Y, 3 = PAULI_Z. For each sum term, a Pauli operator must be specified for EVERY qubit in qureg; each set of numSumTerms operators will be grouped into a product. termCoeffs is an arrray of length numSumTerms containing the term coefficients. For example, on a 3-qubit statevector,

int paulis[6] = {PAULI_X, PAULI_I, PAULI_I,  PAULI_X, PAULI_Y, PAULI_Z};
qreal coeffs[2] = {1.5, -3.6};
calcExpecPauliSum(qureg, paulis, coeffs, 2, workspace);

will compute $ \langle \psi | (1.5 X I I - 3.6 X Y Z) | \psi \rangle $ (where in this notation, the left-most operator applies to the least-significant qubit, i.e. that with index 0).

workspace must be a register with the same type (statevector vs density matrix) and dimensions (number of represented qubits) as qureg, and is used as working space. When this function returns, qureg will be unchanged and workspace will be set to qureg pre-multiplied with the final Pauli product. NOTE that if qureg is a density matrix, workspace will become $ \hat{\sigma} \rho $ which is itself not a density matrix (it is distinct from $ \hat{\sigma}^\dagger \rho \hat{\sigma} $).

This function works by cloning the qureg state into workspace, applying each of the specified Pauli products to workspace (one Pauli operation at a time), then computing its inner product with qureg (for statevectors) or its trace (for density matrices) multiplied with the corresponding coefficient, and summing these contributions. It therefore should scale linearly in time with the total number of non-identity specified Pauli operators.

Parameters
[in]quregthe register of which to find the expected value, which is unchanged by this function
[in]allPauliCodesa list of the Pauli codes (0=PAULI_I, 1=PAULI_X, 2=PAULI_Y, 3=PAULI_Z) of all Paulis involved in the products of terms. A Pauli must be specified for each qubit in the register, in every term of the sum.
[in]termCoeffsThe coefficients of each term in the sum of Pauli products
[in]numSumTermsThe total number of Pauli products specified
[in,out]workspacea working-space qureg with the same dimensions as qureg, which is modified to be the result of multiplying the state with the final specified Pauli product
Exceptions
exitWithErrorif any code in allPauliCodes is not in {0,1,2,3}, or if numSumTerms <= 0, or if workspace is not of the same type and dimensions as qureg
Author
Tyson Jones

Definition at line 880 of file QuEST.c.

880  {
881  validateNumPauliSumTerms(numSumTerms, __func__);
882  validatePauliCodes(allPauliCodes, numSumTerms*qureg.numQubitsRepresented, __func__);
883  validateMatchingQuregTypes(qureg, workspace, __func__);
884  validateMatchingQuregDims(qureg, workspace, __func__);
885 
886  return statevec_calcExpecPauliSum(qureg, allPauliCodes, termCoeffs, numSumTerms, workspace);
887 }

References Qureg::numQubitsRepresented, statevec_calcExpecPauliSum(), validateMatchingQuregDims(), validateMatchingQuregTypes(), validateNumPauliSumTerms(), and validatePauliCodes().

Referenced by TEST_CASE().

◆ calcFidelity()

qreal calcFidelity ( Qureg  qureg,
Qureg  pureState 
)

Calculates the fidelity of qureg (a statevector or density matrix) against a reference pure state (necessarily a statevector).

If qureg is a state-vector, this function computes

\[ |\langle \text{qureg} | \text{pureState} \rangle|^2 \]

If qureg is a density matrix, this function computes

\[ \langle \text{pureState} | \text{qureg} | \text{pureState} \rangle \]

In either case, the returned fidelity lies in [0, 1] (assuming both input states have valid normalisation). If any of the input Quregs are not normalised, this function will return the real component of the correct linear algebra calculation.

The number of qubits represented in qureg and pureState must match.

Parameters
[in]qurega density matrix or state vector
[in]pureStatea state vector
Returns
the fidelity between the input registers
Exceptions
exitWithErrorif the second argument (pureState) is not a statevector, or if the number of qubits in qureg and pureState do not match
Author
Tyson Jones

Definition at line 861 of file QuEST.c.

861  {
862  validateSecondQuregStateVec(pureState, __func__);
863  validateMatchingQuregDims(qureg, pureState, __func__);
864 
865  if (qureg.isDensityMatrix)
866  return densmatr_calcFidelity(qureg, pureState);
867  else
868  return statevec_calcFidelity(qureg, pureState);
869 }

References densmatr_calcFidelity(), Qureg::isDensityMatrix, statevec_calcFidelity(), validateMatchingQuregDims(), and validateSecondQuregStateVec().

Referenced by TEST_CASE().

◆ calcHilbertSchmidtDistance()

qreal calcHilbertSchmidtDistance ( Qureg  a,
Qureg  b 
)

Computes the Hilbert Schmidt distance between two density matrices a and b, defined as the Frobenius norm of the difference between them.

That is, we define the Hilbert Schmidt distance

\[ D(a, b) = \| a - b \|_F = \sqrt{ \text{Tr}[ (a-b)(a-b)^\dagger ] } \]

This is equivalent to the square-root of the sum of the absolute value squared of the element-differences of the matrices, i.e.

\[ D(a, b) = \sqrt{ \sum\limits_i \sum\limits_j | a_{ij} - b_{ij} |^2 } \]

We caution this may differ by some definitions of the Hilbert Schmidt distance by a square-root.

This function correctly returns the result of the above formulations even when a and b are incorrectly normalised (i.e. are general matrices).

Parameters
[in]aa density matrix
[in]ban equally-sized density matrix
Exceptions
exitWithErrorif either a or b are not density matrices, or if a and have mismatching dimensions.
Author
Balint Koczor
Tyson Jones (refactored, doc)

Definition at line 889 of file QuEST.c.

889  {
890  validateDensityMatrQureg(a, __func__);
891  validateDensityMatrQureg(b, __func__);
892  validateMatchingQuregDims(a, b, __func__);
893 
895 }

References densmatr_calcHilbertSchmidtDistance(), validateDensityMatrQureg(), and validateMatchingQuregDims().

Referenced by TEST_CASE().

◆ calcInnerProduct()

Complex calcInnerProduct ( Qureg  bra,
Qureg  ket 
)

Computes the inner product $ \langle \text{bra} | \text{ket} \rangle $ of two equal-size state vectors, given by.

\[ \langle \text{bra} | \text{ket} \rangle = \sum_i {\text{bra}_i}^* \; \times \; \text{ket}_i \]

The same qureg may be passed as both bra and ket, though we recommend users check state-vector normalisation with calcTotalProb which employs Kahan summation for greater accuracy. Neither state-vector is modified.

This function returns the correct inner product even if bra and ket are not correctly normalised states.

Parameters
[in]braqureg to be the 'bra' (i.e. have its values conjugate transposed) in the inner product
[in]ketqureg to be the 'ket' in the inner product
Returns
the complex inner product of bra and ket
Exceptions
exitWithErrorif either bra or ket are not state-vectors, or if bra and ket do not have equal dimensions.
Author
Tyson Jones

Definition at line 829 of file QuEST.c.

829  {
830  validateStateVecQureg(bra, __func__);
831  validateStateVecQureg(ket, __func__);
832  validateMatchingQuregDims(bra, ket, __func__);
833 
834  return statevec_calcInnerProduct(bra, ket);
835 }

References statevec_calcInnerProduct(), validateMatchingQuregDims(), and validateStateVecQureg().

Referenced by TEST_CASE().

◆ calcProbOfOutcome()

qreal calcProbOfOutcome ( Qureg  qureg,
const int  measureQubit,
int  outcome 
)

Gives the probability of a specified qubit being measured in the given outcome (0 or 1).

This performs no actual measurement and does not change the state of the qubits.

For state-vectors, this function works by summing the absolute-value-squared of every amplitude in the state-vector for which measureQubit = 0. If outcome = 1, it returns 1 minus this value. Hence for unnormalised state-vectors, this result will differ from the absolute-value-squared of every amplitude where measureQubit = outcome.

For density matrices, this function sums the diagonal values (should be real) corresponding to measureQubit = 0 (returning 1 minus this if outcome = 1).

Parameters
[in]quregobject representing the set of all qubits
[in]measureQubitqubit to study
[in]outcomefor which to find the probability of the qubit being measured in
Returns
probability of qubit measureQubit being measured in the given outcome
Exceptions
exitWithErrorif measureQubit is outside [0, qureg.numQubitsRepresented), or if outcome is not in {0, 1}.
Author
Ania Brown (state-vector)
Tyson Jones (density matrix)

Definition at line 845 of file QuEST.c.

845  {
846  validateTarget(qureg, measureQubit, __func__);
847  validateOutcome(outcome, __func__);
848 
849  if (qureg.isDensityMatrix)
850  return densmatr_calcProbOfOutcome(qureg, measureQubit, outcome);
851  else
852  return statevec_calcProbOfOutcome(qureg, measureQubit, outcome);
853 }

References densmatr_calcProbOfOutcome(), Qureg::isDensityMatrix, statevec_calcProbOfOutcome(), validateOutcome(), and validateTarget().

Referenced by TEST_CASE().

◆ calcPurity()

qreal calcPurity ( Qureg  qureg)

Calculates the purity of a density matrix, by the trace of the density matrix squared.

Returns $\text{Tr}(\rho^2)$. For a pure state, this =1. For a mixed state, the purity is less than 1 and is lower bounded by 1/2^n, where n is the number of qubits. The minimum purity is achieved for the maximally mixed state identity/2^n.

This function does not accept state-vectors, which clearly have purity 1.

Note this function will give incorrect results for non-Hermitian Quregs (i.e. invalid density matrices), which will disagree with $\text{Tr}(\rho^2)$. Instead, this function returns $\sum_{ij} |\rho_{ij}|^2 $.

Parameters
[in]qurega density matrix of which to measure the purity
Returns
the purity
Exceptions
exitWithErrorif either combineQureg or otherQureg are not density matrices, or if the dimensions of combineQureg and otherQureg do not match, or if prob is not in [0, 1]
Author
Tyson Jones

Definition at line 855 of file QuEST.c.

855  {
856  validateDensityMatrQureg(qureg, __func__);
857 
858  return densmatr_calcPurity(qureg);
859 }

References densmatr_calcPurity(), and validateDensityMatrQureg().

Referenced by TEST_CASE().

◆ calcTotalProb()

qreal calcTotalProb ( Qureg  qureg)

A debugging function which calculates the probability of the qubits in qureg being in any state, which should always be 1 for correctly normalised states (hence returning a real number).

For state-vectors $ \psi $, this is the norm of the entire state-vector (the sum of the absolute-value-squared of every amplitude):

\[ \sum\limits_i |\psi_i|^2 \]

and for density matrices $ \rho $, it is the trace:

\[ \text{Trace}(\rho) = \sum\limits_i \rho_{i,i} \; \]

For un-normalised density matrices (those directly modified or initialised by the user), this function returns the real component of the trace.

Note this calculation utilises Kahan summation for greater accuracy, and hence is not parallelised and so will be slower than other functions.

Parameters
[in]quregobject representing a set of qubits
Returns
the total probability of the qubits in qureg being in any state
Author
Ania Brown (state-vector)
Tyson Jones (density matrix, doc)

Definition at line 822 of file QuEST.c.

822  {
823  if (qureg.isDensityMatrix)
824  return densmatr_calcTotalProb(qureg);
825  else
826  return statevec_calcTotalProb(qureg);
827 }

References densmatr_calcTotalProb(), Qureg::isDensityMatrix, and statevec_calcTotalProb().

Referenced by TEST_CASE().

◆ getAmp()

Complex getAmp ( Qureg  qureg,
long long int  index 
)

Get the complex amplitude at a given index in the state vector.

Parameters
[in]quregobject representing a set of qubits
[in]indexindex in state vector of probability amplitudes
Returns
amplitude at index, returned as a Complex struct (with .real and .imag attributes)
Exceptions
exitWithErrorif qureg is a density matrix, or if index is outside [0, $2^{N}$) where $N = $ qureg.numQubitsRepresented
Author
Tyson Jones

Definition at line 697 of file QuEST.c.

697  {
698  validateStateVecQureg(qureg, __func__);
699  validateAmpIndex(qureg, index, __func__);
700 
701  Complex amp;
702  amp.real = statevec_getRealAmp(qureg, index);
703  amp.imag = statevec_getImagAmp(qureg, index);
704  return amp;
705 }

References Complex::imag, Complex::real, statevec_getImagAmp(), statevec_getRealAmp(), validateAmpIndex(), and validateStateVecQureg().

Referenced by TEST_CASE().

◆ getDensityAmp()

Complex getDensityAmp ( Qureg  qureg,
long long int  row,
long long int  col 
)

Get an amplitude from a density matrix at a given row and column.

Parameters
[in]quregobject representing a density matrix
[in]rowrow of the desired amplitude in the density matrix
[in]colcolumn of the desired amplitude in the density matrix
Returns
a Complex scalar representing the desired amplitude
Exceptions
exitWithErrorif qureg is a statevector, or if row or col are outside [0, $2^{N}$) where $N = $ qureg.numQubitsRepresented
Author
Tyson Jones

Definition at line 707 of file QuEST.c.

707  {
708  validateDensityMatrQureg(qureg, __func__);
709  validateAmpIndex(qureg, row, __func__);
710  validateAmpIndex(qureg, col, __func__);
711 
712  long long ind = row + col*(1LL << qureg.numQubitsRepresented);
713  Complex amp;
714  amp.real = statevec_getRealAmp(qureg, ind);
715  amp.imag = statevec_getImagAmp(qureg, ind);
716  return amp;
717 }

References Qureg::numQubitsRepresented, Complex::real, statevec_getImagAmp(), statevec_getRealAmp(), validateAmpIndex(), and validateDensityMatrQureg().

Referenced by TEST_CASE().

◆ getImagAmp()

qreal getImagAmp ( Qureg  qureg,
long long int  index 
)

Get the imaginary component of the complex probability amplitude at an index in the state vector.

Parameters
[in]quregobject representing a set of qubits
[in]indexindex in state vector of probability amplitudes
Returns
imaginary component at that index
Exceptions
exitWithErrorif qureg is a density matrix, or if index is outside [0, $2^{N}$) where $N = $ qureg.numQubitsRepresented
Author
Ania Brown

Definition at line 683 of file QuEST.c.

683  {
684  validateStateVecQureg(qureg, __func__);
685  validateAmpIndex(qureg, index, __func__);
686 
687  return statevec_getImagAmp(qureg, index);
688 }

References statevec_getImagAmp(), validateAmpIndex(), and validateStateVecQureg().

Referenced by TEST_CASE().

◆ getNumAmps()

long long int getNumAmps ( Qureg  qureg)

Get the number of probability amplitudes in a qureg object, given by 2^numQubits.

Author
Tyson Jones

Definition at line 670 of file QuEST.c.

670  {
671  validateStateVecQureg(qureg, __func__);
672 
673  return qureg.numAmpsTotal;
674 }

References Qureg::numAmpsTotal, and validateStateVecQureg().

Referenced by TEST_CASE().

◆ getNumQubits()

int getNumQubits ( Qureg  qureg)

Get the number of qubits in a qureg object.

Author
Tyson Jones

Definition at line 666 of file QuEST.c.

666  {
667  return qureg.numQubitsRepresented;
668 }

References Qureg::numQubitsRepresented.

Referenced by TEST_CASE().

◆ getProbAmp()

qreal getProbAmp ( Qureg  qureg,
long long int  index 
)

Get the probability of a state-vector at an index in the full state vector.

Parameters
[in]quregobject representing a set of qubits
[in]indexindex in state vector of probability amplitudes
Returns
realEl*realEl + imagEl*imagEl
Exceptions
exitWithErrorif qureg is a density matrix, or if index is outside [0, $2^{N}$) where $N = $ qureg.numQubitsRepresented
Author
Ania Brown

Definition at line 690 of file QuEST.c.

690  {
691  validateStateVecQureg(qureg, __func__);
692  validateAmpIndex(qureg, index, __func__);
693 
694  return statevec_getProbAmp(qureg, index);
695 }

References statevec_getProbAmp(), validateAmpIndex(), and validateStateVecQureg().

Referenced by TEST_CASE().

◆ getRealAmp()

qreal getRealAmp ( Qureg  qureg,
long long int  index 
)

Get the real component of the complex probability amplitude at an index in the state vector.

Parameters
[in]quregobject representing a set of qubits
[in]indexindex in state vector of probability amplitudes
Returns
real component at that index
Exceptions
exitWithErrorif qureg is a density matrix, or if index is outside [0, $2^{N}$) where $N = $ qureg.numQubitsRepresented
Author
Ania Brown

Definition at line 676 of file QuEST.c.

676  {
677  validateStateVecQureg(qureg, __func__);
678  validateAmpIndex(qureg, index, __func__);
679 
680  return statevec_getRealAmp(qureg, index);
681 }

References statevec_getRealAmp(), validateAmpIndex(), and validateStateVecQureg().

Referenced by TEST_CASE().

void validateDensityMatrQureg(Qureg qureg, const char *caller)
void validateTarget(Qureg qureg, int targetQubit, const char *caller)
void validateOutcome(int outcome, const char *caller)
qreal densmatr_calcInnerProduct(Qureg a, Qureg b)
qreal statevec_calcExpecPauliProd(Qureg qureg, int *targetQubits, enum pauliOpType *pauliCodes, int numTargets, Qureg workspace)
Definition: QuEST_common.c:464
void validateStateVecQureg(Qureg qureg, const char *caller)
qreal statevec_calcExpecPauliSum(Qureg qureg, enum pauliOpType *allCodes, qreal *termCoeffs, int numSumTerms, Qureg workspace)
Definition: QuEST_common.c:479
qreal densmatr_calcPurity(Qureg qureg)
Computes the trace of the density matrix squared.
void validateMultiTargets(Qureg qureg, int *targetQubits, const int numTargetQubits, const char *caller)
void validateNumPauliSumTerms(int numTerms, const char *caller)
qreal statevec_calcFidelity(Qureg qureg, Qureg pureState)
Definition: QuEST_common.c:376
qreal statevec_getProbAmp(Qureg qureg, long long int index)
Definition: QuEST_common.c:244
qreal densmatr_calcTotalProb(Qureg qureg)
void validateMatchingQuregDims(Qureg qureg1, Qureg qureg2, const char *caller)
Complex statevec_calcInnerProduct(Qureg bra, Qureg ket)
Terrible code which unnecessarily individually computes and sums the real and imaginary components of...
qreal statevec_calcProbOfOutcome(Qureg qureg, const int measureQubit, int outcome)
qreal statevec_getImagAmp(Qureg qureg, long long int index)
qreal densmatr_calcProbOfOutcome(Qureg qureg, const int measureQubit, int outcome)
qreal densmatr_calcFidelity(Qureg qureg, Qureg pureState)
int isDensityMatrix
Whether this instance is a density-state representation.
Definition: QuEST.h:163
void validateMatchingQuregTypes(Qureg qureg1, Qureg qureg2, const char *caller)
void validateAmpIndex(Qureg qureg, long long int ampInd, const char *caller)
void validateSecondQuregStateVec(Qureg qureg2, const char *caller)
int numQubitsRepresented
The number of qubits represented in either the state-vector or density matrix.
Definition: QuEST.h:165
long long int numAmpsTotal
Total number of amplitudes, which are possibly distributed among machines.
Definition: QuEST.h:172
qreal real
Definition: QuEST.h:105
qreal imag
Definition: QuEST.h:106
qreal densmatr_calcHilbertSchmidtDistance(Qureg a, Qureg b)
Represents one complex number.
Definition: QuEST.h:103
void validatePauliCodes(enum pauliOpType *pauliCodes, int numPauliCodes, const char *caller)
qreal statevec_getRealAmp(Qureg qureg, long long int index)
qreal statevec_calcTotalProb(Qureg qureg)