The Quantum Exact Simulation Toolkit v4.1.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 1435 of file operations.cpp.

1435 {
1436 validate_quregFields(qureg, __func__);
1437 validate_controlAndPauliStrTargets(qureg, control, str, __func__);
1438
1439 applyMultiStateControlledPauliGadget(qureg, &control, nullptr, 1, str, angle);
1440}
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 1442 of file operations.cpp.

1442 {
1443 validate_quregFields(qureg, __func__);
1444 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1445
1446 applyMultiStateControlledPauliGadget(qureg, controls, nullptr, numControls, str, angle);
1447}

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 1449 of file operations.cpp.

1449 {
1450 validate_quregFields(qureg, __func__);
1451 validate_controlsAndPauliStrTargets(qureg, controls, numControls, str, __func__);
1452 validate_controlStates(states, numControls, __func__); // permits states==nullptr
1453
1454 // a non-controlled str=I effects a global phase change (of -angle/2) which does not
1455 // at all change a density matrix; the subsequent dagger operation would undo it,
1456 // which we avoid to preserve numerical accuracy
1457 if (paulis_isIdentity(str) && numControls == 0 && qureg.isDensityMatrix)
1458 return;
1459
1460 // when numControls >= 1, all amps satisfying the control condition undergo a phase
1461 // change of -angle/2, as if all non-control-qubits were targeted by exp(-angle/2)I,
1462 // which is sufficiently efficient using the existing gadget backend function
1463
1464 qreal phase = util_getPhaseFromGateAngle(angle);
1465 auto ctrlVec = util_getVector(controls, numControls);
1466 auto stateVec = util_getVector(states, numControls); // empty if states==nullptr
1467 localiser_statevec_anyCtrlPauliGadget(qureg, ctrlVec, stateVec, str, phase);
1468
1469 if (!qureg.isDensityMatrix)
1470 return;
1471
1472 // conj(e^iXZ) = e^(-iXZ), but conj(Y)=-Y, so odd-Y undoes phase negation
1473 phase *= paulis_hasOddNumY(str) ? 1 : -1;
1474 ctrlVec = util_getBraQubits(ctrlVec, qureg);
1475 str = paulis_getShiftedPauliStr(str, qureg.numQubits);
1476 localiser_statevec_anyCtrlPauliGadget(qureg, ctrlVec, stateVec, str, phase);
1477}

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:318
    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:306
Qureg createQureg(int numQubits)
Definition qureg.cpp:282
  • Passing angle=0 is equivalent to effecting the identity, leaving the state unchanged.

Definition at line 1428 of file operations.cpp.

1428 {
1429 validate_quregFields(qureg, __func__);
1430 validate_pauliStrTargets(qureg, str, __func__);
1431
1432 applyMultiStateControlledPauliGadget(qureg, nullptr, nullptr, 0, str, angle);
1433}

◆ multiplyPauliGadget()

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

Definition at line 1420 of file operations.cpp.

1420 {
1421 validate_quregFields(qureg, __func__);
1422 validate_pauliStrTargets(qureg, str, __func__);
1423
1424 qreal phase = util_getPhaseFromGateAngle(angle);
1425 localiser_statevec_anyCtrlPauliGadget(qureg, {}, {}, str, phase);
1426}