Quantum++  v0.8.8
C++11 quantum computing library
states.h
Go to the documentation of this file.
1 /*
2  * Quantum++
3  *
4  * Copyright (c) 2013 - 2016 Vlad Gheorghiu (vgheorgh@gmail.com)
5  *
6  * This file is part of Quantum++.
7  *
8  * Quantum++ is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * Quantum++ is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with Quantum++. If not, see <http://www.gnu.org/licenses/>.
20  */
21 
27 #ifndef CLASSES_STATES_H_
28 #define CLASSES_STATES_H_
29 
30 namespace qpp
31 {
32 
37 class States final : public internal::Singleton<const States> // const Singleton
38 {
39  friend class internal::Singleton<const States>;
40 
41 public:
42  // Pauli eigen-states
43  ket x0{ket::Zero(2)};
44  ket x1{ket::Zero(2)};
45  ket y0{ket::Zero(2)};
46  ket y1{ket::Zero(2)};
47  ket z0{ket::Zero(2)};
48  ket z1{ket::Zero(2)};
49 
50  // projectors onto Pauli eigen-states
51  cmat px0{cmat::Zero(2, 2)};
53  cmat px1{cmat::Zero(2, 2)};
55  cmat py0{cmat::Zero(2, 2)};
57  cmat py1{cmat::Zero(2, 2)};
59  cmat pz0{cmat::Zero(2, 2)};
61  cmat pz1{cmat::Zero(2, 2)};
63 
64  // Bell states
65  ket b00{ket::Zero(4)};
67  ket b01{ket::Zero(4)};
69  ket b10{ket::Zero(4)};
71  ket b11{ket::Zero(4)};
73 
74  // projectors onto Bell states
75  cmat pb00{cmat::Zero(4, 4)};
76  cmat pb01{cmat::Zero(4, 4)};
77  cmat pb10{cmat::Zero(4, 4)};
78  cmat pb11{cmat::Zero(4, 4)};
79 
80  // W and GHZ states
81  ket GHZ{ket::Zero(8)};
82  ket W{ket::Zero(8)};
83 
84  // projectors onto GHZ and W
85  cmat pGHZ{cmat::Zero(8, 8)};
86  cmat pW{cmat::Zero(8, 8)};
87 private:
92  {
93  // initialize
94  x0 << 1 / std::sqrt(2.), 1 / std::sqrt(2.);
95  x1 << 1 / std::sqrt(2.), -1 / std::sqrt(2.);
96  y0 << 1 / std::sqrt(2.), 1_i / std::sqrt(2.);
97  y1 << 1 / std::sqrt(2.), -1_i / std::sqrt(2.);
98  z0 << 1, 0;
99  z1 << 0, 1;
100  px0 = x0 * x0.adjoint();
101  px1 = x1 * x1.adjoint();
102  py0 = y0 * y0.adjoint();
103  py1 = y1 * y1.adjoint();
104  pz0 = z0 * z0.adjoint();
105  pz1 = z1 * z1.adjoint();
106 
107  // Bell states, following convention from Nielsen & Chuang
108  // |ij> -> |b_{ij}> by the CNOT*(H x Id) circuit
109 
110  b00 << 1 / std::sqrt(2.), 0, 0, 1 / std::sqrt(2.);
111  // (|00> + |11>) / sqrt(2)
112  b01 << 0, 1 / std::sqrt(2.), 1 / std::sqrt(2.), 0;
113  // (|01> + |10>) / sqrt(2)
114  b10 << 1 / std::sqrt(2.), 0, 0, -1 / std::sqrt(2.);
115  // (|00> - |11>) / sqrt(2)
116  b11 << 0, 1 / std::sqrt(2.), -1 / std::sqrt(2.), 0;
117  // (|01> - |10>) / sqrt(2)
118 
119  pb00 = b00 * b00.adjoint();
120  pb01 = b01 * b01.adjoint();
121  pb10 = b10 * b10.adjoint();
122  pb11 = b11 * b11.adjoint();
123 
124  GHZ << 1, 0, 0, 0, 0, 0, 0, 1;
125  GHZ = GHZ / std::sqrt(2.);
126  W << 0, 1, 1, 0, 1, 0, 0, 0;
127  W = W / std::sqrt(3.);
128 
129  pGHZ = GHZ * GHZ.adjoint();
130  pW = W * W.adjoint();
131  }
132 
136  ~States() = default;
137 }; /* class States */
138 
139 } /* namespace qpp */
140 
141 #endif /* CLASSES_STATES_H_ */
ket W
W state.
Definition: states.h:82
cmat pb01
Projector onto the Bell-01 state.
Definition: states.h:76
ket GHZ
GHZ state.
Definition: states.h:81
cmat pb11
Projector onto the Bell-11 state.
Definition: states.h:78
Singleton policy class, used internally to implement the singleton pattern via CRTP (Curiously recurr...
Definition: singleton.h:77
Eigen::VectorXcd ket
Complex (double precision) dynamic Eigen column vector.
Definition: types.h:56
ket y0
Pauli Sigma-Y 0-eigenstate |y+>
Definition: states.h:45
Quantum++ main namespace.
Definition: codes.h:30
const Singleton class that implements most commonly used states
Definition: states.h:37
cmat pb00
Projector onto the Bell-00 state.
Definition: states.h:75
ket z1
Pauli Sigma-Z 1-eigenstate |1>
Definition: states.h:48
ket b01
Bell-01 state (following the convention in Nielsen and Chuang)
Definition: states.h:67
ket b00
Bell-00 state (following the convention in Nielsen and Chuang)
Definition: states.h:65
cmat pb10
Projector onto the Bell-10 state.
Definition: states.h:77
cmat pW
Projector onto the W state.
Definition: states.h:86
~States()=default
Default destructor.
cmat py0
Projector onto the Pauli Sigma-Y 0-eigenstate |y+>
Definition: states.h:55
cmat px0
Projector onto the Pauli Sigma-X 0-eigenstate |+><+|.
Definition: states.h:51
ket x1
Pauli Sigma-X 1-eigenstate |->
Definition: states.h:44
ket y1
Pauli Sigma-Y 1-eigenstate |y->
Definition: states.h:46
ket z0
Pauli Sigma-Z 0-eigenstate |0>
Definition: states.h:47
ket b11
Bell-11 state (following the convention in Nielsen and Chuang)
Definition: states.h:71
cmat pz0
Projector onto the Pauli Sigma-Z 0-eigenstate |0><0|.
Definition: states.h:59
cmat pGHZ
Projector onto the GHZ state.
Definition: states.h:85
Eigen::MatrixXcd cmat
Complex (double precision) dynamic Eigen matrix.
Definition: types.h:66
ket b10
Bell-10 state (following the convention in Nielsen and Chuang)
Definition: states.h:69
ket x0
Pauli Sigma-X 0-eigenstate |+>
Definition: states.h:43
cmat py1
Projector onto the Pauli Sigma-Y 1-eigenstate |y->
Definition: states.h:57
cmat px1
Projector onto the Pauli Sigma-X 1-eigenstate |-><-|.
Definition: states.h:53
cmat pz1
Projector onto the Pauli Sigma-Z 1-eigenstate |1><1|.
Definition: states.h:61
States()
Definition: states.h:91