OSDN Git Service

Initial Commit
[qcad/qcad.git] / qclib / qcunitcalc.h
1 /*\r
2  *  qcunitcalc.h\r
3  *  $Date: $\r
4  *  $Revision: $\r
5  */\r
6 \r
7 #ifndef QCUNITCALC_H\r
8 #define QCUNITCALC_H\r
9 \r
10 namespace qc {\r
11 //----------------------------------------------------------------------------\r
12 inline unsigned int insert0(const unsigned int i0, const unsigned int bitnum)\r
13 {\r
14     unsigned int msk = (1 << bitnum) - 1;\r
15     return ((~msk & i0) << 1) | (msk & i0);\r
16 }\r
17 \r
18 inline unsigned int insert1(const unsigned int i0, const unsigned int bitnum)\r
19 {\r
20     unsigned int msk = (1 << bitnum) - 1;\r
21     return ((~msk & i0) << 1) | (1 << bitnum) | (msk & i0);\r
22 }\r
23 \r
24 template <class T>\r
25 inline void swap(T &x, T &y)\r
26 {\r
27     T   tmp = x;\r
28         x   = y;\r
29         y   = tmp;\r
30 }\r
31 \r
32 //----------------------------------------------------------------------------\r
33 //----------------------------------------------------------------------------\r
34 inline void qcuc_ccnot(double &r0, double &i0, double &r1, double &i1)\r
35 {\r
36     swap(r0, r1);\r
37     swap(i0, i1);\r
38 }\r
39 \r
40 //----------------------------------------------------------------------------\r
41 inline void qcuc_cnot(double &r0, double &i0, double &r1, double &i1)\r
42 {\r
43     swap(r0, r1);\r
44     swap(i0, i1);\r
45 }\r
46 \r
47 //----------------------------------------------------------------------------\r
48 inline void qcuc_crot(double &r0, double &i0, double c, double s)\r
49 {\r
50     double r1   = r0;\r
51     double i1   = i0;\r
52     r0 = c * r1 - s * i1;\r
53     i0 = c * i1 + s * r1;\r
54 }\r
55 \r
56 //----------------------------------------------------------------------------\r
57 inline void qcuc_hadamard(double &r0, double &i0, double &r1, double &i1)\r
58 {\r
59     const double isq2 = 0.70710678118654752440084436210485;\r
60     double rr0 = r0;\r
61     double ii0 = i0;\r
62     double rr1 = r1;\r
63     double ii1 = i1;\r
64     r0 = isq2 * (  rr1 + rr0);\r
65     i0 = isq2 * (  ii1 + ii0);\r
66     r1 = isq2 * (- rr1 + rr0);\r
67     i1 = isq2 * (- ii1 + ii0);\r
68 }\r
69 \r
70 //----------------------------------------------------------------------------\r
71 inline void qcuc_not(double &r0, double &i0, double &r1, double &i1)\r
72 {\r
73     swap(r0, r1);\r
74     swap(i0, i1);\r
75 }\r
76 \r
77 //----------------------------------------------------------------------------\r
78 inline void qcuc_pauli_x(double &r0, double &i0, double &r1, double &i1)\r
79 {\r
80     swap(r0, r1);\r
81     swap(i0, i1);\r
82 }\r
83 \r
84 //----------------------------------------------------------------------------\r
85 inline void qcuc_pauli_y(double &r0, double &i0, double &r1, double &i1)\r
86 {\r
87     double rr0 = r0;\r
88     double ii0 = i0;\r
89     r0 =   i1;\r
90     i0 = - r1;\r
91     r1 = - ii0;\r
92     i1 =   rr0;\r
93 }\r
94 \r
95 //----------------------------------------------------------------------------\r
96 inline void qcuc_pauli_z(double &r0, double &i0)\r
97 {\r
98     r0 = - r0;\r
99     i0 = - i0;\r
100 }\r
101 \r
102 //----------------------------------------------------------------------------\r
103 inline void qcuc_swap(double &r0, double &i0, double &r1, double &i1)\r
104 {\r
105     swap(r0, r1);\r
106     swap(i1, i0);\r
107 }\r
108 \r
109 //----------------------------------------------------------------------------\r
110 } //namespace qc\r
111 \r
112 #endif //QCUNITCALC_H\r
113 \r