1 //---------------------------------------------------------------------------
3 //---------------------------------------------------------------------------
5 //---------------------------------------------------------------------------
9 QC_cnot::QC_cnot(int _TargetBit,int _ControlBit) : QCalcUnit() {
10 TargetBit = _TargetBit;
11 ControlBit = _ControlBit;
13 //---------------------------------------------------------------------------
17 void QC_cnot::calc(int Target, int Control,
18 double BitsR[], double BitsI[], int NumberOfBits) {
19 unsigned int states = (1 << (NumberOfBits - 2));
21 // Sort BitsNumber to regular order
28 for (unsigned int i = 0; i < states; i++) {
29 unsigned int ix1 = QCalcUnit::insert1(i, Bit0);
30 ix1 = QCalcUnit::insert1(ix1, Bit1);
31 unsigned int ix0 = ix1 & ~(1 << Target);
33 swap(BitsR[ix0], BitsR[ix1]);
34 swap(BitsI[ix0], BitsI[ix1]);
37 //---------------------------------------------------------------------------
39 QC_cnot::Calc(QBits *qBits) {
40 int N = qBits->GetNumberOfQBits();
41 double *R = qBits->GetBitsR();//Real Part
42 double *I = qBits->GetBitsI();//Imaginary Part
44 QC_cnot::calc(TargetBit, ControlBit, R, I, N);
46 //---------------------------------------------------------------------------
49 QC_cnot::calcmpi(int t1, int c1, double R[], double I[], int N) {
54 unsigned int ix0, ix1;
56 // Sort BitsNumber to regular order
63 for (int i = 0; i < (1 << (N - 2)); i++) {
64 // Obtain indices of state:
65 unsigned int ix1 = QCalcUnit::insert1(i, Bit0);
66 ix1 = QCalcUnit::insert1(ix1, Bit1);
67 unsigned int ix0 = ix1 & ~(1 << t1);
69 bool bstore = setup(R, I, ix0, ix1, r0, i0, r1, i1);
74 store(R, I, ix0, ix1, r0, i0, r1, i1);
79 //---------------------------------------------------------------------------