1 //---------------------------------------------------------------------------
\r
3 //---------------------------------------------------------------------------
\r
7 //---------------------------------------------------------------------------
\r
11 QC_rot::QC_rot(int _TargetBit,double degree) : QCalcUnit() {
\r
12 TargetBit = _TargetBit;
\r
13 Theta = M_PI * degree / 180.0;
\r
15 //---------------------------------------------------------------------------
\r
20 QC_rot::calc(int target, double theta,
\r
21 double R[], double I[], int NumberOfBits) {
\r
22 const double c = std::cos(theta);
\r
23 const double s = std::sin(theta);
\r
25 unsigned int states = (1 << (NumberOfBits - 1));
\r
26 for (unsigned int i = 0; i < states; i++) {
\r
27 unsigned int ix1 = QCalcUnit::insert1(i, target);
\r
31 R[ix1] = c*r1 - s*i1;
\r
32 I[ix1] = s*r1 + c*i1;
\r
35 //---------------------------------------------------------------------------
\r
36 void QC_rot::Calc(QBits *qBits)
\r
38 int N = qBits->GetNumberOfQBits();
\r
39 double *R = qBits->GetBitsR();//Real Part
\r
40 double *I = qBits->GetBitsI();//Imaginary Part
\r
41 QC_rot::calc(TargetBit, Theta, R, I, N);
\r
43 //---------------------------------------------------------------------------
\r
46 QC_rot::calcmpi(int t1, double theta, double R[], double I[], int N) {
\r
47 const double c = std::cos(theta);
\r
48 const double s = std::sin(theta);
\r
53 unsigned int ix0, ix1;
\r
55 for (int i = 0; i < (1 << (N - 1)); i++) {
\r
56 // Obtain indices of state:
\r
57 ix0 = QCalcUnit::insert0(i, t1);
\r
58 ix1 = QCalcUnit::insert1(i, t1);
\r
60 bool bstore = setup(R, I, ix0, ix1, r0, i0, r1, i1);
\r
65 double nr1 = c*r1 - s*i1;
\r
66 double ni1 = s*r1 + c*i1;
\r
68 store(R, I, ix0, ix1, nr0, ni0, nr1, ni1);
\r
73 //---------------------------------------------------------------------------
\r