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

Functions for applying many-qubit rotations around arbitrary PauliStr. More...

Functions

void applyControlledPauliGadget (Qureg qureg, int control, PauliStr str, qreal angle)
 
void applyMultiControlledPauliGadget (Qureg qureg, int *controls, int numControls, PauliStr str, qreal angle)
 
void applyMultiStateControlledPauliGadget (Qureg qureg, int *controls, int *states, int numControls, PauliStr str, qreal angle)
 
void applyPauliGadget (Qureg qureg, PauliStr str, qreal angle)
 
void multiplyPauliGadget (Qureg qureg, PauliStr str, qreal angle)
 

Detailed Description

Functions for applying many-qubit rotations around arbitrary PauliStr.

Function Documentation

◆ applyControlledPauliGadget()

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

Definition at line 1423 of file operations.cpp.

1423 {
1424 validate_quregFields(qureg, __func__);
1425 validate_controlAndPauliStrTargets(qureg, control, str, __func__);
1426
1427 applyMultiStateControlledPauliGadget(qureg, &control, nullptr, 1, str, angle);
1428}
void applyMultiStateControlledPauliGadget(Qureg qureg, int *controls, int *states, int numControls, PauliStr str, qreal angle)

◆ applyMultiControlledPauliGadget()

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

Definition at line 1430 of file operations.cpp.

1430 {
1431 validate_quregFields(qureg, __func__);
1432 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1433
1434 applyMultiStateControlledPauliGadget(qureg, controls, nullptr, numControls, str, angle);
1435}

Referenced by applyMultiControlledPauliGadget().

◆ applyMultiStateControlledPauliGadget()

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

Definition at line 1437 of file operations.cpp.

1437 {
1438 validate_quregFields(qureg, __func__);
1439 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1440 validate_controlStates(states, numControls, __func__); // permits states==nullptr
1441
1442 /// @todo
1443 /// CRUCIAL NOTE:
1444 /// exp(theta I..I) might be algorithmically ok (I'm not sure), but it WILL NOT
1445 /// effect a global phase change of theta (I think). Should validate against this
1446 /// sitaution just in case, or make the doc extremely explicit
1447
1448 qreal phase = util_getPhaseFromGateAngle(angle);
1449 auto ctrlVec = util_getVector(controls, numControls);
1450 auto stateVec = util_getVector(states, numControls); // empty if states==nullptr
1451 localiser_statevec_anyCtrlPauliGadget(qureg, ctrlVec, stateVec, str, phase);
1452
1453 if (!qureg.isDensityMatrix)
1454 return;
1455
1456 // conj(e^iXZ) = e^(-iXZ), but conj(Y)=-Y, so odd-Y undoes phase negation
1457 phase *= paulis_hasOddNumY(str) ? 1 : -1;
1458 ctrlVec = util_getBraQubits(ctrlVec, qureg);
1459 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
1460 localiser_statevec_anyCtrlPauliGadget(qureg, ctrlVec, stateVec, str, phase);
1461}

Referenced by applyControlledPauliGadget(), applyMultiControlledPauliGadget(), applyMultiStateControlledPauliGadget(), applyMultiStateControlledRotateX(), applyMultiStateControlledRotateY(), applyMultiStateControlledRotateZ(), and applyPauliGadget().

◆ applyPauliGadget()

void applyPauliGadget ( Qureg qureg,
PauliStr str,
qreal angle )
Note
Documentation for this function or struct is under construction!
Formulae
Let \( \hat{\sigma} = \) str and \( \theta = \) angle.

This function effects unitary

\[ R_{\hat{\sigma}}(\theta) = \exp \left( - \iu \, \frac{\theta}{2} \, \hat{\sigma} \right), \]

which affects only the qubits for which \( \hat{\sigma} \) is not the identity Pauli. As such, this effects a multi-qubit rotation around an arbitrary Pauli string.

Equivalences
  • Because \( R_{\hat{\sigma}}(\theta) \) satisfies

    \[ R_{\hat{\sigma}}(\theta) \equiv \cos\left( \frac{\theta}{2} \right) \, \id - \iu \sin\left( \frac{\theta}{2} \right) \, \hat{\sigma}, \]

    this function is equivalent to (but much faster than) effecting \( \hat{\sigma} \) upon a clone which is subsequently superposed.
    // prepare |temp> = str |qureg>
    Qureg temp = createCloneQureg(qureg);
    applyPauliStr(temp, str);
    // set |qureg> = cos(theta/2) |qureg> - i sin(theta/2) str |qureg>
    setQuregToSuperposition(cos(theta/2), qureg, - 1.0i * sin(theta/2), temp, 0, temp);
    void setQuregToSuperposition(qcomp facOut, Qureg out, qcomp fac1, Qureg qureg1, qcomp fac2, Qureg qureg2)
    void applyPauliStr(Qureg qureg, PauliStr str)
    Qureg createCloneQureg(Qureg qureg)
    Definition qureg.cpp:315
    Definition qureg.h:49
  • When str contains only \( \hat{Z} \) or \( \id \) Paulis, this function will automatically invoke applyPhaseGadget() which leverages an optimised implementation.
  • When str contains only \( \id \) Paulis, this function merely effects a change of global phase upon statevectors of \( -\theta/2 \), leaving density matrices unchanged.
    qcomp factor = cexp(- theta / 2 * 1.i);
    setQuregToSuperposition(factor, qureg, 0,qureg,0,qureg);
Example
Qureg qureg = createQureg(10);
qreal theta = 3.14;
// verbosely
int numPaulis = 4;
char* paulis = "XYIZ";
int targets[] = {0,1,5,7};
PauliStr str = getPauliStr(paulis, targets, numPaulis);
applyPauliGadget(qureg, str, angle);
// concisely
applyPauliGadget(qureg, getInlinePauliStr("XYZ",{0,1,7}), theta);
void applyPauliGadget(Qureg qureg, PauliStr str, qreal angle)
PauliStr getInlinePauliStr(const char *paulis, { list })
PauliStr getPauliStr(const char *paulis, int *indices, int numPaulis)
Definition paulis.cpp:296
Qureg createQureg(int numQubits)
Definition qureg.cpp:279
  • Passing angle=0 is equivalent to effecting the identity, leaving the state unchanged.

Definition at line 1416 of file operations.cpp.

1416 {
1417 validate_quregFields(qureg, __func__);
1418 validate_pauliStrTargets(qureg, str, __func__);
1419
1420 applyMultiStateControlledPauliGadget(qureg, nullptr, nullptr, 0, str, angle);
1421}

◆ multiplyPauliGadget()

void multiplyPauliGadget ( Qureg qureg,
PauliStr str,
qreal angle )
Note
Documentation for this function or struct is under construction!
See also

Definition at line 1408 of file operations.cpp.

1408 {
1409 validate_quregFields(qureg, __func__);
1410 validate_pauliStrTargets(qureg, str, __func__);
1411
1412 qreal phase = util_getPhaseFromGateAngle(angle);
1413 localiser_statevec_anyCtrlPauliGadget(qureg, {}, {}, str, phase);
1414}