@@ -83,6 +83,106 @@ namespace dd {
8383 complex_zero,
8484 {std::cos (lambda / 2 .), std::sin (lambda / 2 .)}}};
8585 }
86+
87+ using TwoQubitGateMatrix = std::array<std::array<ComplexValue, NEDGE>, NEDGE>;
88+ constexpr TwoQubitGateMatrix CXmat{{{complex_one, complex_zero, complex_zero, complex_zero},
89+ {complex_zero, complex_one, complex_zero, complex_zero},
90+ {complex_zero, complex_zero, complex_zero, complex_one},
91+ {complex_zero, complex_zero, complex_one, complex_zero}}};
92+
93+ constexpr TwoQubitGateMatrix CZmat{{{complex_one, complex_zero, complex_zero, complex_zero},
94+ {complex_zero, complex_one, complex_zero, complex_zero},
95+ {complex_zero, complex_zero, complex_one, complex_zero},
96+ {complex_zero, complex_zero, complex_zero, complex_mone}}};
97+
98+ constexpr TwoQubitGateMatrix SWAPmat{{{complex_one, complex_zero, complex_zero, complex_zero},
99+ {complex_zero, complex_zero, complex_one, complex_zero},
100+ {complex_zero, complex_one, complex_zero, complex_zero},
101+ {complex_zero, complex_zero, complex_zero, complex_one}}};
102+
103+ constexpr TwoQubitGateMatrix iSWAPmat{{{complex_one, complex_zero, complex_zero, complex_zero},
104+ {complex_zero, complex_zero, complex_i, complex_zero},
105+ {complex_zero, complex_i, complex_zero, complex_zero},
106+ {complex_zero, complex_zero, complex_zero, complex_one}}};
107+
108+ constexpr TwoQubitGateMatrix iSWAPinvmat{{{complex_one, complex_zero, complex_zero, complex_zero},
109+ {complex_zero, complex_zero, complex_mi, complex_zero},
110+ {complex_zero, complex_mi, complex_zero, complex_zero},
111+ {complex_zero, complex_zero, complex_zero, complex_one}}};
112+
113+ constexpr TwoQubitGateMatrix ECRmat{{{complex_zero, complex_zero, complex_SQRT2_2, complex_iSQRT2_2},
114+ {complex_zero, complex_zero, complex_iSQRT2_2, complex_SQRT2_2},
115+ {complex_SQRT2_2, complex_miSQRT2_2, complex_zero, complex_zero},
116+ {complex_miSQRT2_2, complex_SQRT2_2, complex_zero, complex_zero}}};
117+
118+ constexpr TwoQubitGateMatrix DCXmat{{{complex_one, complex_zero, complex_zero, complex_zero},
119+ {complex_zero, complex_zero, complex_zero, complex_one},
120+ {complex_zero, complex_one, complex_zero, complex_zero},
121+ {complex_zero, complex_zero, complex_one, complex_zero}}};
122+
123+ inline TwoQubitGateMatrix RXXmat (const fp theta) {
124+ const auto cosTheta = std::cos (theta / 2 .);
125+ const auto sinTheta = std::sin (theta / 2 .);
126+
127+ return TwoQubitGateMatrix{{{ComplexValue{cosTheta, 0 .}, complex_zero, complex_zero, ComplexValue{0 ., -sinTheta}},
128+ {complex_zero, ComplexValue{cosTheta, 0 .}, ComplexValue{0 ., -sinTheta}, complex_zero},
129+ {complex_zero, ComplexValue{0 ., -sinTheta}, ComplexValue{cosTheta, 0 .}, complex_zero},
130+ {ComplexValue{0 ., -sinTheta}, complex_zero, complex_zero, ComplexValue{cosTheta, 0 .}}}};
131+ }
132+
133+ inline TwoQubitGateMatrix RYYmat (const fp theta) {
134+ const auto cosTheta = std::cos (theta / 2 .);
135+ const auto sinTheta = std::sin (theta / 2 .);
136+
137+ return TwoQubitGateMatrix{{{ComplexValue{cosTheta, 0 .}, complex_zero, complex_zero, ComplexValue{0 ., sinTheta}},
138+ {complex_zero, ComplexValue{cosTheta, 0 .}, ComplexValue{0 ., -sinTheta}, complex_zero},
139+ {complex_zero, ComplexValue{0 ., -sinTheta}, ComplexValue{cosTheta, 0 .}, complex_zero},
140+ {ComplexValue{0 ., sinTheta}, complex_zero, complex_zero, ComplexValue{cosTheta, 0 .}}}};
141+ }
142+
143+ inline TwoQubitGateMatrix RZZmat (const fp theta) {
144+ const auto cosTheta = std::cos (theta / 2 .);
145+ const auto sinTheta = std::sin (theta / 2 .);
146+
147+ return TwoQubitGateMatrix{{{ComplexValue{cosTheta, -sinTheta}, complex_zero, complex_zero, complex_zero},
148+ {complex_zero, ComplexValue{cosTheta, sinTheta}, complex_zero, complex_zero},
149+ {complex_zero, complex_zero, ComplexValue{cosTheta, sinTheta}, complex_zero},
150+ {complex_zero, complex_zero, complex_zero, ComplexValue{cosTheta, -sinTheta}}}};
151+ }
152+
153+ inline TwoQubitGateMatrix RZXmat (const fp theta) {
154+ const auto cosTheta = std::cos (theta / 2 .);
155+ const auto sinTheta = std::sin (theta / 2 .);
156+
157+ return TwoQubitGateMatrix{{{ComplexValue{cosTheta, 0 .}, ComplexValue{0 ., -sinTheta}, complex_zero, complex_zero},
158+ {ComplexValue{0 ., -sinTheta}, ComplexValue{cosTheta, 0 .}, complex_zero, complex_zero},
159+ {complex_zero, complex_zero, ComplexValue{cosTheta, 0 .}, ComplexValue{0 ., sinTheta}},
160+ {complex_zero, complex_zero, ComplexValue{0 ., sinTheta}, ComplexValue{cosTheta, 0 .}}}};
161+ }
162+
163+ inline TwoQubitGateMatrix XXMinusYYmat (const fp theta, const fp beta = 0 .) {
164+ const auto cosTheta = std::cos (theta / 2 .);
165+ const auto sinTheta = std::sin (theta / 2 .);
166+ const auto cosBeta = std::cos (beta);
167+ const auto sinBeta = std::sin (beta);
168+
169+ return TwoQubitGateMatrix{{{ComplexValue{cosTheta, 0 .}, complex_zero, complex_zero, ComplexValue{sinBeta * sinTheta, -cosBeta * sinTheta}},
170+ {complex_zero, complex_one, complex_zero, complex_zero},
171+ {complex_zero, complex_zero, complex_one, complex_zero},
172+ {ComplexValue{-sinBeta * sinTheta, -cosBeta * sinTheta}, complex_zero, complex_zero, ComplexValue{cosTheta, 0 .}}}};
173+ }
174+
175+ inline TwoQubitGateMatrix XXPlusYYmat (const fp theta, const fp beta = 0 .) {
176+ const auto cosTheta = std::cos (theta / 2 .);
177+ const auto sinTheta = std::sin (theta / 2 .);
178+ const auto cosBeta = std::cos (beta);
179+ const auto sinBeta = std::sin (beta);
180+
181+ return TwoQubitGateMatrix{{{complex_one, complex_zero, complex_zero, complex_zero},
182+ {complex_zero, ComplexValue{cosTheta, 0 .}, ComplexValue{sinBeta * sinTheta, -cosBeta * sinTheta}, complex_zero},
183+ {complex_zero, ComplexValue{-sinBeta * sinTheta, -cosBeta * sinTheta}, ComplexValue{cosTheta, 0 .}, complex_zero},
184+ {complex_zero, complex_zero, complex_zero, complex_one}}};
185+ }
86186 // NOLINTEND(readability-identifier-naming)
87187} // namespace dd
88188#endif // DD_PACKAGE_GATEMATRIXDEFINITIONS_H
0 commit comments