def test_xgate(self): """XGATE: Flip along √i axis. 1 => 0, 0 => 1""" z = Construct((1, 0)) o = Construct((0, 1)) zz = z.tensor(z) zo = z.tensor(o) oz = o.tensor(z) oo = o.tensor(o) rz = self.hadamard(z) ro = self.hadamard(o) cnot_tests = [ ['Verify XGATE +|0>| = +|1>', self.xgate(z), o], ['Verify XGATE +|1>| = +|0>', self.xgate(o), z], ['Verify XGATE -|0>| = -|1>', self.xgate(-z), -o], ['Verify XGATE -|1>| = -|0>', self.xgate(-o), -z], ['Verify XGATE |00>| = |10>', self.xgate(zz), oz], ['Verify XGATE |01>| =-|11>', self.xgate(zo), -oo], ['Verify XGATE |10>| = |10>', self.xgate(oz), zz], ['Verify XGATE |11>| = |01>', self.xgate(oo), zo], ] for test in cnot_tests: title, calc, expect = test self.assertEqual(calc, expect)
def test_hadamard(self): """Hadamard gate test""" z = Construct((1, 0)) o = Construct((0, 1)) zz = z.tensor(z) zo = z.tensor(o) oz = o.tensor(z) oo = o.tensor(o) rz = self.hadamard(z) ro = self.hadamard(o) hadamard_tests = [ ['Verify HADAMARD +| 0>| = + | +>', self.hadamard(z), rz], ['Verify HADAMARD +| 1>| = + | ->', self.hadamard(o), ro], ['Verify HADAMARD -| 0>| = - | +>', self.hadamard(-z), -rz], ['Verify HADAMARD -| 1>| = - | ->', self.hadamard(-o), -ro], [ 'Verify HADAMARD +|00>| = + |1+>', self.hadamard(zz), rz.tensor(z) ], [ 'Verify HADAMARD +|01>| = - |11>', self.hadamard(zo), -rz.tensor(o) ], [ 'Verify HADAMARD +|10>| = + |00>', self.hadamard(oz), ro.tensor(z) ], [ 'Verify HADAMARD +|11>| = + |01>', self.hadamard(oo), ro.tensor(o) ], ] for test in hadamard_tests: title, calc, expected = test self.assertEqual(calc, expected)
def test_tensor(self): z1 = Construct((1, 2)) z2 = Construct((3, 4)) z = Construct((1, 0)) o = Construct((0, 1)) brakets = [ [z1.tensor(z2), (3, 4, 6, 8)], [o.tensor(z.tensor(z)), (0, 0, 0, 0, 1, 0, 0, 0)], [o.tensor(z.tensor(o)), (0, 0, 0, 0, 0, 1, 0, 0)], [o.tensor(o.tensor(z)), (0, 0, 0, 0, 0, 0, 1, 0)], [o.tensor(o.tensor(o)), (0, 0, 0, 0, 0, 0, 0, 1)], [ o.tensor(z.tensor(z.tensor(z))), (0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0) ], [ o.tensor(z.tensor(z.tensor(o))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0) ], [ o.tensor(z.tensor(o.tensor(z))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0) ], [ o.tensor(z.tensor(o.tensor(o))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0) ], [ o.tensor(o.tensor(z.tensor(z))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0) ], [ o.tensor(o.tensor(z.tensor(o))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0) ], [ o.tensor(o.tensor(o.tensor(z))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0) ], [ o.tensor(o.tensor(o.tensor(o))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1) ], [ o.tensor(z.tensor(z.tensor(z.tensor(z)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) ], [ o.tensor(z.tensor(z.tensor(z.tensor(o)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) ], [ o.tensor(z.tensor(z.tensor(o.tensor(z)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) ], [ o.tensor(z.tensor(z.tensor(o.tensor(o)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) ], [ o.tensor(z.tensor(o.tensor(z.tensor(z)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) ], [ o.tensor(z.tensor(o.tensor(z.tensor(o)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) ], [ o.tensor(z.tensor(o.tensor(o.tensor(z)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0) ], [ o.tensor(z.tensor(o.tensor(o.tensor(o)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0) ], [ o.tensor(o.tensor(z.tensor(z.tensor(z)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0) ], [ o.tensor(o.tensor(z.tensor(z.tensor(o)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0) ], [ o.tensor(o.tensor(z.tensor(o.tensor(z)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0) ], [ o.tensor(o.tensor(z.tensor(o.tensor(o)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0) ], [ o.tensor(o.tensor(o.tensor(z.tensor(z)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0) ], [ o.tensor(o.tensor(o.tensor(z.tensor(o)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0) ], [ o.tensor(o.tensor(o.tensor(o.tensor(z)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0) ], [ o.tensor(o.tensor(o.tensor(o.tensor(o)))), (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1) ], ] for item in brakets: calc, expected = item expect = Construct(expected) self.assertEqual(calc, expect)