@@ -244,6 +244,55 @@ TEST_F(ZXFunctionalityTest, CRZ) {
244244 EXPECT_TRUE (d.connected (d.getInput (0 ), d.getOutput (0 )));
245245}
246246
247+ TEST_F (ZXFunctionalityTest, MultiCZ) {
248+ using namespace qc ::literals;
249+ qc = qc::QuantumComputation (3 );
250+ qc.mcz ({1 , 2 }, 0 );
251+
252+ auto qcPrime = qc::QuantumComputation (3 );
253+ qcPrime.h (0 );
254+ qcPrime.mcx ({1 , 2 }, 0 );
255+ qcPrime.h (0 );
256+
257+ auto d = FunctionalityConstruction::buildFunctionality (&qc);
258+
259+ auto dPrime = FunctionalityConstruction::buildFunctionality (&qcPrime);
260+
261+ d.concat (dPrime.invert ());
262+
263+ fullReduce (d);
264+
265+ EXPECT_TRUE (d.isIdentity ());
266+ EXPECT_TRUE (d.globalPhaseIsZero ());
267+ EXPECT_TRUE (d.connected (d.getInput (0 ), d.getOutput (0 )));
268+ }
269+ ` TEST_F(ZXFunctionalityTest, CCZ) {
270+ using namespace qc ::literals;
271+ const std::string testfile = " OPENQASM 2.0;"
272+ " include \" qelib1.inc\" ;"
273+ " qreg q[3];"
274+ " ccz q[0],q[1],q[2];\n " ;
275+
276+ qc = qasm3::Importer::imports (testfile);
277+ ZXDiagram diag = FunctionalityConstruction::buildFunctionality (&qc);
278+ auto qcPrime = qc::QuantumComputation (3 );
279+ qcPrime.h (0 );
280+ qcPrime.mcx ({1 , 2 }, 0 );
281+ qcPrime.h (0 );
282+
283+ auto d = FunctionalityConstruction::buildFunctionality (&qc);
284+
285+ auto dPrime = FunctionalityConstruction::buildFunctionality (&qcPrime);
286+
287+ d.concat (dPrime.invert ());
288+
289+ fullReduce (d);
290+
291+ EXPECT_TRUE (d.isIdentity ());
292+ EXPECT_TRUE (d.globalPhaseIsZero ());
293+ EXPECT_TRUE (d.connected (d.getInput (0 ), d.getOutput (0 )));
294+ }
295+
247296TEST_F (ZXFunctionalityTest, MultiControlX) {
248297 using namespace qc ::literals;
249298 qc = qc::QuantumComputation (4 );
0 commit comments