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

Functions for applying a tensor product of Pauli operators, as a PauliStr. More...

Functions

void applyControlledPauliStr (Qureg qureg, int control, PauliStr str)
 
void applyMultiControlledPauliStr (Qureg qureg, int *controls, int numControls, PauliStr str)
 
void applyMultiControlledPauliStr (Qureg qureg, std::vector< int > controls, PauliStr str)
 
void applyMultiStateControlledPauliStr (Qureg qureg, int *controls, int *states, int numControls, PauliStr str)
 
void applyMultiStateControlledPauliStr (Qureg qureg, std::vector< int > controls, std::vector< int > states, PauliStr str)
 
void applyPauliStr (Qureg qureg, PauliStr str)
 
void multiplyPauliStr (Qureg qureg, PauliStr str)
 

Detailed Description

Functions for applying a tensor product of Pauli operators, as a PauliStr.

Function Documentation

◆ applyControlledPauliStr()

void applyControlledPauliStr ( Qureg qureg,
int control,
PauliStr str )
Note
Documentation for this function or struct is under construction!

Definition at line 1044 of file operations.cpp.

1044 {
1045 validate_quregFields(qureg, __func__);
1046 validate_controlAndPauliStrTargets(qureg, control, str, __func__);
1047
1048 // harmlessly re-validates
1049 applyMultiStateControlledPauliStr(qureg, &control, nullptr, 1, str);
1050}
void applyMultiStateControlledPauliStr(Qureg qureg, int *controls, int *states, int numControls, PauliStr str)

◆ applyMultiControlledPauliStr() [1/2]

void applyMultiControlledPauliStr ( Qureg qureg,
int * controls,
int numControls,
PauliStr str )
Note
Documentation for this function or struct is under construction!

Definition at line 1052 of file operations.cpp.

1052 {
1053 validate_quregFields(qureg, __func__);
1054 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1055
1056 // harmlessly re-validates
1057 applyMultiStateControlledPauliStr(qureg, controls, nullptr, numControls, str);
1058}

Referenced by applyMultiControlledPauliStr().

◆ applyMultiControlledPauliStr() [2/2]

void applyMultiControlledPauliStr ( Qureg qureg,
std::vector< int > controls,
PauliStr str )
Warning
This function has not yet been unit tested and may contain bugs. Please use with caution!
Attention
This function's input validation has not yet been unit tested, so erroneous usage may produce unexpected output. Please use with caution!
Note
Documentation for this function or struct is under construction!
Remarks
This function is only available in C++.

Definition at line 1092 of file operations.cpp.

1092 {
1093
1094 applyMultiControlledPauliStr(qureg, controls.data(), controls.size(), str);
1095}
void applyMultiControlledPauliStr(Qureg qureg, int *controls, int numControls, PauliStr str)

◆ applyMultiStateControlledPauliStr() [1/2]

void applyMultiStateControlledPauliStr ( Qureg qureg,
int * controls,
int * states,
int numControls,
PauliStr str )
Note
Documentation for this function or struct is under construction!

Definition at line 1060 of file operations.cpp.

1060 {
1061 validate_quregFields(qureg, __func__);
1062 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1063 validate_controlStates(states, numControls, __func__); // permits states==nullptr
1064
1065 qcomp factor = 1;
1066 auto ctrlVec = util_getVector(controls, numControls);
1067 auto stateVec = util_getVector(states, numControls); // empty if states==nullptr
1068
1069 // when there are no control qubits, we can merge the density matrix's
1070 // operation sinto a single tensor, i.e. +- (shift(str) (x) str), to
1071 // avoid superfluous re-enumeration of the state
1072 if (qureg.isDensityMatrix && numControls == 0) {
1073 factor = paulis_hasOddNumY(str)? -1 : 1;
1074 ctrlVec = util_getConcatenated(ctrlVec, util_getBraQubits(ctrlVec, qureg));
1075 stateVec = util_getConcatenated(stateVec, stateVec);
1076 str = paulis_getKetAndBraPauliStr(str, qureg);
1077 }
1078
1079 localiser_statevec_anyCtrlPauliTensor(qureg, ctrlVec, stateVec, str, factor);
1080
1081 // but density-matrix control qubits require two distinct operations
1082 if (qureg.isDensityMatrix && numControls > 0) {
1083 factor = paulis_hasOddNumY(str)? -1 : 1;
1084 ctrlVec = util_getBraQubits(ctrlVec, qureg);
1085 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
1086 localiser_statevec_anyCtrlPauliTensor(qureg, ctrlVec, stateVec, str, factor);
1087 }
1088}

Referenced by applyControlledPauliStr(), applyMultiControlledPauliStr(), applyMultiStateControlledMultiQubitNot(), applyMultiStateControlledPauliStr(), applyMultiStateControlledPauliX(), applyMultiStateControlledPauliY(), and applyPauliStr().

◆ applyMultiStateControlledPauliStr() [2/2]

void applyMultiStateControlledPauliStr ( Qureg qureg,
std::vector< int > controls,
std::vector< int > states,
PauliStr str )
Warning
This function has not yet been unit tested and may contain bugs. Please use with caution!
Attention
This function's input validation has not yet been unit tested, so erroneous usage may produce unexpected output. Please use with caution!
Note
Documentation for this function or struct is under construction!
Remarks
This function is only available in C++.

Definition at line 1097 of file operations.cpp.

1097 {
1098 validate_controlsMatchStates(controls.size(), states.size(), __func__);
1099
1100 applyMultiStateControlledPauliStr(qureg, controls.data(), states.data(), controls.size(), str);
1101}

◆ applyPauliStr()

void applyPauliStr ( Qureg qureg,
PauliStr str )
Note
Documentation for this function or struct is under construction!

Definition at line 1036 of file operations.cpp.

1036 {
1037 validate_quregFields(qureg, __func__);
1038 validate_pauliStrTargets(qureg, str, __func__);
1039
1040 // harmlessly re-validates
1041 applyMultiStateControlledPauliStr(qureg, nullptr, nullptr, 0, str);
1042}

◆ multiplyPauliStr()

void multiplyPauliStr ( Qureg qureg,
PauliStr str )
Note
Documentation for this function or struct is under construction!

Definition at line 1029 of file operations.cpp.

1029 {
1030 validate_quregFields(qureg, __func__);
1031 validate_pauliStrTargets(qureg, str, __func__);
1032
1033 localiser_statevec_anyCtrlPauliTensor(qureg, {}, {}, str);
1034}

Referenced by multiplyMultiQubitNot().