1 //---------------------------------------------------------------------------
3 //---------------------------------------------------------------------------
5 #include "QC_hadamard.h"
6 //---------------------------------------------------------------------------
10 QC_hadamard::QC_hadamard(int _Target) : QCalcUnit() {
13 //---------------------------------------------------------------------------
17 void QC_hadamard::calc(int target, double R[], double I[], int NumberOfBits) {
19 unsigned int state = 1<< (NumberOfBits - 1);
20 const double sq2 = 1.0 / std::sqrt(2.0);
23 for (unsigned int i=0;i<state;i++) {
24 unsigned int ix0 = insert0(i,target);
25 unsigned int ix1 = insert1(i,target);
36 R[ix1] = sq2*(-r1+r0);
37 I[ix1] = sq2*(-i1+i0);
40 //---------------------------------------------------------------------------
42 QC_hadamard::Calc(QBits *qBits) {
43 int N = qBits->GetNumberOfQBits();
44 double *R = qBits->GetBitsR();//Real Part
45 double *I = qBits->GetBitsI();//Imaginary Part
47 QC_hadamard::calc(Target, R, I, N);
49 //---------------------------------------------------------------------------
52 QC_hadamard::calcmpi(int t1, double R[], double I[], int N) {
57 unsigned int ix0, ix1;
58 const double sq2 = 1.0 / std::sqrt(2.0);
60 for (int i = 0; i < (1 << (N - 1)); i++) {
61 // Obtain indices of state:
62 ix0 = QCalcUnit::insert0(i, t1);
63 ix1 = QCalcUnit::insert1(i, t1);
65 bool bstore = setup(R, I, ix0, ix1, r0, i0, r1, i1);
67 double nr0 = sq2*(r1+r0);
68 double ni0 = sq2*(i1+i0);
69 double nr1 = sq2*(-r1+r0);
70 double ni1 = sq2*(-i1+i0);
72 store(R, I, ix0, ix1, nr0, ni0, nr1, ni1);
77 //---------------------------------------------------------------------------