The Quantum Exact Simulation Toolkit v4.2.0
Loading...
Searching...
No Matches

Functions for pre- or post-multiplying weighted sums of Pauli tensors upon a density matrix. More...

Functions

void leftapplyPauliStrSum (Qureg qureg, PauliStrSum sum, Qureg workspace)
 
void rightapplyPauliStrSum (Qureg qureg, PauliStrSum sum, Qureg workspace)
 

Detailed Description

Functions for pre- or post-multiplying weighted sums of Pauli tensors upon a density matrix.

Function Documentation

◆ leftapplyPauliStrSum()

void leftapplyPauliStrSum ( Qureg qureg,
PauliStrSum sum,
Qureg workspace )
Note
Documentation for this function or struct is under construction!
Attention
This function's input validation has not yet been unit tested, so erroneous usage may produce unexpected output. Please use with caution!
See also
leftapplyCompMatr1()

Definition at line 639 of file multiplication.cpp.

639 {
640 validate_quregFields(qureg, __func__);
641 validate_quregFields(workspace, __func__);
642 validate_quregCanBeWorkspace(qureg, workspace, __func__);
643 validate_pauliStrSumFields(sum, __func__);
644 validate_pauliStrSumTargets(sum, qureg, __func__);
645
646 // clone qureg to workspace, set qureg to blank
647 localiser_statevec_setQuregToClone(workspace, qureg);
648 localiser_statevec_initUniformState(qureg, 0);
649
650 // left-multiply each term in-turn, mixing into output qureg, then undo using idempotency
651 for (qindex i=0; i<sum.numTerms; i++) {
652 localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, sum.strings[i]);
653 localiser_statevec_setQuregToWeightedSum(qureg, {1, sum.coeffs[i]}, {qureg, workspace});
654 localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, sum.strings[i]);
655 }
656
657 // workspace -> qureg, and qureg -> sum * qureg
658}

Referenced by TEST_CASE().

◆ rightapplyPauliStrSum()

void rightapplyPauliStrSum ( Qureg qureg,
PauliStrSum sum,
Qureg workspace )
Note
Documentation for this function or struct is under construction!
Attention
This function's input validation has not yet been unit tested, so erroneous usage may produce unexpected output. Please use with caution!
See also
leftapplyCompMatr1()

Definition at line 660 of file multiplication.cpp.

660 {
661 validate_quregFields(qureg, __func__);
662 validate_quregFields(workspace, __func__);
663 validate_quregIsDensityMatrix(qureg, __func__);
664 validate_quregCanBeWorkspace(qureg, workspace, __func__);
665 validate_pauliStrSumFields(sum, __func__);
666 validate_pauliStrSumTargets(sum, qureg, __func__);
667
668 // clone qureg to workspace, set qureg to blank
669 localiser_statevec_setQuregToClone(workspace, qureg);
670 localiser_statevec_initUniformState(qureg, 0);
671
672 // post-multiply each term in-turn, mixing into output qureg, then undo using idempotency
673 for (qindex i=0; i<sum.numTerms; i++) {
674 PauliStr str = paulis_getShiftedPauliStr(sum.strings[i], qureg.numQubits);
675 qcomp factor = paulis_getSignOfPauliStrConj(str); // undoes transpose
676
677 localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, str, factor);
678 localiser_statevec_setQuregToWeightedSum(qureg, {1, sum.coeffs[i]}, {qureg, workspace});
679 localiser_statevec_anyCtrlPauliTensor(workspace, {}, {}, str, factor);
680 }
681
682 // workspace -> qureg, and qureg -> sum * qureg
683}

Referenced by TEST_CASE().