コード例 #1
0
 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)
コード例 #2
0
    def test_16_steps(self):
        """16 Step Circle Walk test"""
        z = Construct((1, 0))
        steps = [
            (0, 1),
            (sqrt(1 / 2), -sqrt(1 / 2)),
            (-sqrt(1 / 2), sqrt(1 / 2)),
            (0, -1),
            (-1, 0),
            (-sqrt(1 / 2), -sqrt(1 / 2)),
            (-sqrt(1 / 2), -sqrt(1 / 2)),
            (-1, 0),
            (0, -1),
            (-sqrt(1 / 2), sqrt(1 / 2)),
            (sqrt(1 / 2), -sqrt(1 / 2)),
            (0, 1),
            (1, 0),
            (sqrt(1 / 2), sqrt(1 / 2)),
            (sqrt(1 / 2), sqrt(1 / 2)),
            (1, 0),
        ]
        starting = Construct((z.flat()))
        for i in range(16):
            if i % 2:
                gate = 'Hadamard'
                z2 = self.hadamard(z)
            else:
                gate = '   XGate'
                z2 = self.xgate(z)

            z = z2
            self.assertEqual(z, Construct(steps[i]))
        self.assertEqual(z, starting)
コード例 #3
0
 def test_quaternion_unit_table(self):
     """quaternion table"""
     x = Construct((1, 0, 0, 0))
     i = Construct((0, 1, 0, 0))
     j = Construct((0, 0, 1, 0))
     k = Construct((0, 0, 0, 1))
     timestable = [
         ['1*1 =  1', x * x, x],
         ['1*i =  i', x * i, i],
         ['i*1 =  i', i * x, i],
         ['i*i = -1', i * i, -x],
         ['1*j =  1', x * j, j],
         ['1*k =  k', x * k, k],
         ['i*j =  k', i * j, k],
         ['i*k = -j', i * k, -j],
         ['j*1 =  j', j * x, j],
         ['j*i = -k', j * i, -k],
         ['j*j = -1', j * j, -x],
         ['j*k =  i', j * k, i],
         ['k*1 =  k', k * x, k],
         ['k*i =  j', k * i, j],
         ['k*j = -i', k * j, -i],
         ['k*k = -1', k * k, -x],
     ]
     for entry in timestable:
         title, calc, expect = entry[::]
         self.assertEqual(calc, expect)
コード例 #4
0
 def test_complex_unit_table(self):
     """complex table"""
     x = Construct((1, 0))
     i = Construct((0, 1))
     timestable = [
         ['1*1 =  1', x * x, x],
         ['1*i =  i', x * i, i],
         ['i*1 =  i', i * x, i],
         ['i*i = -1', i * i, -x],
     ]
     for entry in timestable:
         title, calc, expect = entry[::]
         self.assertEqual(calc, expect)
コード例 #5
0
 def test_identity(self):
     z = Construct((1, 0))
     o = Construct((0, 1))
     control = z.copy()
     target = z.copy()
     self.cnot(control, target)
     self.assertEqual(control, z)
     self.assertEqual(target, z)
     control = o.copy()
     target = z.copy()
     self.cnot(control, target)
     self.assertEqual(control, o)
     self.assertEqual(target, z)
コード例 #6
0
 def test_constant_1(self):
     z = Construct((1, 0))
     o = Construct((0, 1))
     control = z.copy()
     target = z.copy()
     target = self.xgate(target)
     self.assertEqual(control, z)
     self.assertEqual(target, o)
     control = o.copy()
     target = z.copy()
     target = self.xgate(target)
     self.assertEqual(control, o)
     self.assertEqual(target, o)
コード例 #7
0
 def test_sixteen_square_identity(self):
     x = random_vector(16)
     y = random_vector(16)
     a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16 = x
     b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16 = y
     # assuming i^2 = -1 ...
     z1 = a1 * b1 - a2 * b2 - a3 * b3 - a4 * b4 - b5 * a5 - b6 * a6 - b7 * a7 - b8 * a8 - b9 * a9 - b10 * a10 - b11 * a11 - b12 * a12 - a13 * b13 - a14 * b14 - a15 * b15 - a16 * b16
     z2 = a1 * b2 + a2 * b1 + a3 * b4 - a4 * b3 - b5 * a6 + b6 * a5 + b7 * a8 - b8 * a7 - b9 * a10 + b10 * a9 + b11 * a12 - b12 * a11 - a13 * b14 + a14 * b13 + a15 * b16 - a16 * b15
     z3 = a1 * b3 - a2 * b4 + a3 * b1 + a4 * b2 - b5 * a7 - b6 * a8 + b7 * a5 + b8 * a6 - b9 * a11 - b10 * a12 + b11 * a9 + b12 * a10 - a13 * b15 - a14 * b16 + a15 * b13 + a16 * b14
     z4 = a1 * b4 + a2 * b3 - a3 * b2 + a4 * b1 - b5 * a8 + b6 * a7 - b7 * a6 + b8 * a5 - b9 * a12 + b10 * a11 - b11 * a10 + b12 * a9 - a13 * b16 + a14 * b15 - a15 * b14 + a16 * b13
     z5 = b5 * a1 - b6 * a2 - b7 * a3 - b8 * a4 + a5 * b1 + a6 * b2 + a7 * b3 + a8 * b4 - a13 * b9 - a14 * b10 - a15 * b11 - a16 * b12 + b13 * a9 + b14 * a10 + b15 * a11 + b16 * a12
     z6 = b5 * a2 + b6 * a1 + b7 * a4 - b8 * a3 - a5 * b2 + a6 * b1 - a7 * b4 + a8 * b3 + a13 * b10 - a14 * b9 + a15 * b12 - a16 * b11 - b13 * a10 + b14 * a9 - b15 * a12 + b16 * a11
     z7 = b5 * a3 - b6 * a4 + b7 * a1 + b8 * a2 - a5 * b3 + a6 * b4 + a7 * b1 - a8 * b2 + a13 * b11 - a14 * b12 - a15 * b9 + a16 * b10 - b13 * a11 + b14 * a12 + b15 * a9 - b16 * a10
     z8 = b5 * a4 + b6 * a3 - b7 * a2 + b8 * a1 - a5 * b4 - a6 * b3 + a7 * b2 + a8 * b1 + a13 * b12 + a14 * b11 - a15 * b10 - a16 * b9 - b13 * a12 - b14 * a11 + b15 * a10 + b16 * a9
     z9 = b9 * a1 - b10 * a2 - b11 * a3 - b12 * a4 - a5 * b13 - a6 * b14 - a7 * b15 - a8 * b16 + a9 * b1 + a10 * b2 + a11 * b3 + a12 * b4 + b5 * a13 + b6 * a14 + b7 * a15 + b8 * a16
     z10 = b9 * a2 + b10 * a1 + b11 * a4 - b12 * a3 - a5 * b14 + a6 * b13 + a7 * b16 - a8 * b15 - a9 * b2 + a10 * b1 - a11 * b4 + a12 * b3 + b5 * a14 - b6 * a13 - b7 * a16 + b8 * a15
     z11 = b9 * a3 - b10 * a4 + b11 * a1 + b12 * a2 - a5 * b15 - a6 * b16 + a7 * b13 + a8 * b14 - a9 * b3 + a10 * b4 + a11 * b1 - a12 * b2 + b5 * a15 + b6 * a16 - b7 * a13 - b8 * a14
     z12 = b9 * a4 + b10 * a3 - b11 * a2 + b12 * a1 - a5 * b16 + a6 * b15 - a7 * b14 + a8 * b13 - a9 * b4 - a10 * b3 + a11 * b2 + a12 * b1 + b5 * a16 - b6 * a15 + b7 * a14 - b8 * a13
     z13 = a5 * b9 - a6 * b10 - a7 * b11 - a8 * b12 + b13 * a1 + b14 * a2 + b15 * a3 + b16 * a4 - b5 * a9 + b6 * a10 + b7 * a11 + b8 * a12 + a13 * b1 - a14 * b2 - a15 * b3 - a16 * b4
     z14 = a5 * b10 + a6 * b9 + a7 * b12 - a8 * b11 - b13 * a2 + b14 * a1 - b15 * a4 + b16 * a3 - b5 * a10 - b6 * a9 - b7 * a12 + b8 * a11 + a13 * b2 + a14 * b1 + a15 * b4 - a16 * b3
     z15 = a5 * b11 - a6 * b12 + a7 * b9 + a8 * b10 - b13 * a3 + b14 * a4 + b15 * a1 - b16 * a2 - b5 * a11 + b6 * a12 - b7 * a9 - b8 * a10 + a13 * b3 - a14 * b4 + a15 * b1 + a16 * b2
     z16 = a5 * b12 + a6 * b11 - a7 * b10 + a8 * b9 - b13 * a4 - b14 * a3 + b15 * a2 + b16 * a1 - b5 * a12 - b6 * a11 + b7 * a10 - b8 * a9 + a13 * b4 + a14 * b3 - a15 * b2 + a16 * b1
     form = Construct((z1, z2, z3, z4, z5, z6, z7, z8, z9, z10, z11, z12,
                       z13, z14, z15, z16))
     self.assertEqual(form, x * y)
コード例 #8
0
 def test_two_square_identity(self):
     x = random_vector(2)
     y = random_vector(2)
     a, b = x
     c, d = y
     form = Construct((a * c - d * b, d * a + b * c))
     self.assertEqual(form, x * y)
コード例 #9
0
 def test_cnot(self):
     """CNOT: second bit flip controlled by the first"""
     z = Construct((1, 0))
     o = Construct((0, 1))
     cnot_tests = [
         ['Verify CNOT |00>| =  |00>',
          self.cnot(z, z), (1, 0, 0, 0)],
         ['Verify CNOT |01>| =  |01>',
          self.cnot(z, o), (0, 1, 0, 0)],
         ['Verify CNOT |10>| =  |11>',
          self.cnot(o, z), (0, 0, 0, 1)],
         ['Verify CNOT |11>| = -|10>',
          self.cnot(o, o), (0, 0, -1, 0)]
     ]
     for test in cnot_tests:
         title, calc, expected = test
         expect = Construct(expected)
         self.assertEqual(calc, expect)
コード例 #10
0
    def test_32ion(self):
        """Check that a number intended to be 32 dimensional knows that it is"""
        for n in range(self.LOOPS):

            z = Construct([random() for _ in range(32)])
            self.assertFalse(z.is_complex())
            self.assertFalse(z.is_quaternion())
            self.assertFalse(z.is_octonion())
            self.assertFalse(z.is_sedenion())
            self.assertEqual(z.dimension(), 32)
コード例 #11
0
    def test_octonion_dimensions(self):
        """Check that a number intended to be a octonion says that it is"""
        for n in range(self.LOOPS):

            z = Construct([random() for _ in range(8)])
            self.assertFalse(z.is_complex())
            self.assertFalse(z.is_quaternion())
            self.assertTrue(z.is_octonion())
            self.assertFalse(z.is_sedenion())
            self.assertNotEqual(z.dimension(), 32)
コード例 #12
0
 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)
コード例 #13
0
 def test_four_square_identity(self):
     x = random_vector(4)
     y = random_vector(4)
     a, b, c, d = x
     e, f, g, h = y
     r = a * e - b * f - c * g - d * h
     s = a * f + b * e + c * h - d * g
     t = a * g - b * h + c * e + d * f
     u = a * h + b * g - c * f + d * e
     form = Construct((r, s, t, u))
     self.assertEqual(form, x * y)
コード例 #14
0
 def test_eight_square_identity(self):
     x = random_vector(8)
     y = random_vector(8)
     a, b, c, d, e, f, g, h = x
     i, j, k, l, m, n, o, p = y
     # assuming i^2 = -1 ...
     z1 = a * i - b * j - c * k - d * l - m * e - n * f - o * g - p * h
     z2 = a * j + b * i + c * l - d * k - m * f + n * e + o * h - p * g
     z3 = a * k - b * l + c * i + d * j - m * g - n * h + o * e + p * f
     z4 = a * l + b * k - c * j + d * i - m * h + n * g - o * f + p * e
     z5 = m * a - n * b - o * c - p * d + e * i + f * j + g * k + h * l
     z6 = m * b + n * a + o * d - p * c - e * j + f * i - g * l + h * k
     z7 = m * c - n * d + o * a + p * b - e * k + f * l + g * i - h * j
     z8 = m * d + n * c - o * b + p * a - e * l - f * k + g * j + h * i
     form = Construct((z1, z2, z3, z4, z5, z6, z7, z8))
     self.assertEqual(form, x * y)
コード例 #15
0
 def test_constant_0(self):
     z = Construct((1, 0))
     o = Construct((0, 1))
     control = Construct(z.flat())
     target = Construct(z.flat())
     self.assertEqual(control, z)
     self.assertEqual(target, z)
     control = Construct(o.flat())
     target = Construct(z.flat())
     self.assertEqual(control, o)
     self.assertEqual(target, z)
コード例 #16
0
def random_vector(dimension=2):
    """generate a random complex number"""
    return Construct([random() for _ in range(dimension)])
コード例 #17
0
class TestBlackBox(unittest.TestCase):
    """Black box: constant 0, constant 1, identity and negate"""
    gate_cnot = Construct((sqrt(1 / 2), sqrt(1 / 2), 0, 0))
    gate_x = Construct((0, 1))
    gate_hadamard = Construct((sqrt(1 / 2), sqrt(1 / 2)))

    def cnot(self, z1, z2):
        c = z1.tensor(z2)
        return self.gate_cnot * c * ~self.gate_cnot

    def xgate(self, z):
        return self.gate_x / z

    def hadamard(self, z):
        return self.gate_hadamard / z

    def test_constant_0(self):
        z = Construct((1, 0))
        o = Construct((0, 1))
        control = Construct(z.flat())
        target = Construct(z.flat())
        self.assertEqual(control, z)
        self.assertEqual(target, z)
        control = Construct(o.flat())
        target = Construct(z.flat())
        self.assertEqual(control, o)
        self.assertEqual(target, z)

    def test_constant_1(self):
        z = Construct((1, 0))
        o = Construct((0, 1))
        control = z.copy()
        target = z.copy()
        target = self.xgate(target)
        self.assertEqual(control, z)
        self.assertEqual(target, o)
        control = o.copy()
        target = z.copy()
        target = self.xgate(target)
        self.assertEqual(control, o)
        self.assertEqual(target, o)

    def test_identity(self):
        z = Construct((1, 0))
        o = Construct((0, 1))
        control = z.copy()
        target = z.copy()
        self.cnot(control, target)
        self.assertEqual(control, z)
        self.assertEqual(target, z)
        control = o.copy()
        target = z.copy()
        self.cnot(control, target)
        self.assertEqual(control, o)
        self.assertEqual(target, z)

    def test_negate(self):
        z = Construct((1, 0))
        o = Construct((0, 1))
        control = z.copy()
        target = z.copy()
        self.cnot(control, target)
        target = self.xgate(target)
        self.assertEqual(control, z)
        self.assertEqual(target, o)
        control = o.copy()
        target = z.copy()
        self.cnot(control, target)
        target = self.xgate(target)
        self.assertEqual(control, o)
        self.assertEqual(target, o)
コード例 #18
0
 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)
コード例 #19
0
class TestQuantumEmulator(unittest.TestCase):
    """Quatum Tests"""

    gate_cnot = Construct((sqrt(1 / 2), sqrt(1 / 2), 0, 0))
    gate_x = Construct((0, 1))
    gate_hadamard = Construct((sqrt(1 / 2), sqrt(1 / 2)))

    def cnot(self, z1, z2):
        c = z1.tensor(z2)
        return self.gate_cnot * c * ~self.gate_cnot

    def xgate(self, z):
        return self.gate_x / z

    def hadamard(self, z):
        return self.gate_hadamard / z

    def test_instantiate(self):
        for t in [(1, 2), (3, 4), (-1, 2)]:
            self.assertEqual(RootFraction(t).flat(), t)

    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)

    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_cnot(self):
        """CNOT: second bit flip controlled by the first"""
        z = Construct((1, 0))
        o = Construct((0, 1))
        cnot_tests = [
            ['Verify CNOT |00>| =  |00>',
             self.cnot(z, z), (1, 0, 0, 0)],
            ['Verify CNOT |01>| =  |01>',
             self.cnot(z, o), (0, 1, 0, 0)],
            ['Verify CNOT |10>| =  |11>',
             self.cnot(o, z), (0, 0, 0, 1)],
            ['Verify CNOT |11>| = -|10>',
             self.cnot(o, o), (0, 0, -1, 0)]
        ]
        for test in cnot_tests:
            title, calc, expected = test
            expect = Construct(expected)
            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_16_steps(self):
        """16 Step Circle Walk test"""
        z = Construct((1, 0))
        steps = [
            (0, 1),
            (sqrt(1 / 2), -sqrt(1 / 2)),
            (-sqrt(1 / 2), sqrt(1 / 2)),
            (0, -1),
            (-1, 0),
            (-sqrt(1 / 2), -sqrt(1 / 2)),
            (-sqrt(1 / 2), -sqrt(1 / 2)),
            (-1, 0),
            (0, -1),
            (-sqrt(1 / 2), sqrt(1 / 2)),
            (sqrt(1 / 2), -sqrt(1 / 2)),
            (0, 1),
            (1, 0),
            (sqrt(1 / 2), sqrt(1 / 2)),
            (sqrt(1 / 2), sqrt(1 / 2)),
            (1, 0),
        ]
        starting = Construct((z.flat()))
        for i in range(16):
            if i % 2:
                gate = 'Hadamard'
                z2 = self.hadamard(z)
            else:
                gate = '   XGate'
                z2 = self.xgate(z)

            z = z2
            self.assertEqual(z, Construct(steps[i]))
        self.assertEqual(z, starting)
コード例 #20
0
 def test_octonion_unit_table(self):
     """octonion table"""
     x = Construct((1, 0, 0, 0, 0, 0, 0, 0))
     i = Construct((0, 1, 0, 0, 0, 0, 0, 0))
     j = Construct((0, 0, 1, 0, 0, 0, 0, 0))
     k = Construct((0, 0, 0, 1, 0, 0, 0, 0))
     l = Construct((0, 0, 0, 0, 1, 0, 0, 0))
     m = Construct((0, 0, 0, 0, 0, 1, 0, 0))
     n = Construct((0, 0, 0, 0, 0, 0, 1, 0))
     o = Construct((0, 0, 0, 0, 0, 0, 0, 1))
     timestable = [
         ['1*1 =  1', x * x, x],
         ['1*i =  i', x * i, i],
         ['i*1 =  i', i * x, i],
         ['i*i = -1', i * i, -x],
         ['1*j =  1', x * j, j],
         ['1*k =  k', x * k, k],
         ['i*j =  k', i * j, k],
         ['i*k = -j', i * k, -j],
         ['j*1 =  j', j * x, j],
         ['j*i = -k', j * i, -k],
         ['j*j = -1', j * j, -x],
         ['j*k =  i', j * k, i],
         ['k*1 =  k', k * x, k],
         ['k*i =  j', k * i, j],
         ['k*j = -i', k * j, -i],
         ['k*k = -1', k * k, -x],
         ['1*l =  1', x * l, l],
         ['1*m =  m', x * m, m],
         ['1*n =  n', x * n, n],
         ['1*o =  o', x * o, o],
         ['i*l =  m', i * l, m],
         ['i*m = -l', i * m, -l],
         ['i*n = -o', i * n, -o],
         ['i*o =  n', i * o, n],
         ['j*l =  n', j * l, n],
         ['j*m =  o', j * m, o],
         ['j*n = -l', j * n, -l],
         ['j*o = -m', j * o, -m],
         ['k*l =  o', k * l, o],
         ['k*m = -n', k * m, -n],
         ['k*n =  m', k * n, m],
         ['k*o = -l', k * o, -l],
         ['l*1 =  1', l * x, l],
         ['l*i = -m', l * i, -m],
         ['l*j = -n', l * j, -n],
         ['l*k = -o', l * k, -o],
         ['l*l = -1', l * l, -x],
         ['l*m =  i', l * m, i],
         ['l*n =  j', l * n, j],
         ['1*o =  k', l * o, k],
         ['m*1 =  m', m * x, m],
         ['m*i =  l', m * i, l],
         ['m*j = -o', m * j, -o],
         ['m*k =  n', m * k, n],
         ['m*l = -i', m * l, -i],
         ['m*m = -1', m * m, -x],
         ['m*n = -k', m * n, -k],
         ['m*o =  j', m * o, j],
         ['n*1 =  n', n * x, n],
         ['n*i =  o', n * i, o],
         ['n*j =  l', n * j, l],
         ['n*k = -m', n * k, -m],
         ['n*l = -j', n * l, -j],
         ['n*m =  k', n * m, k],
         ['n*n = -1', n * n, -x],
         ['n*o = -i', n * o, -i],
         ['o*1 =  o', o * x, o],
         ['o*i = -n', o * i, -n],
         ['o*j =  m', o * j, m],
         ['o*k =  l', o * k, l],
         ['o*l = -k', o * l, -k],
         ['o*m = -j', o * m, -j],
         ['o*n =  i', o * n, i],
         ['o*o = -1', o * o, -x],
     ]
     for entry in timestable:
         title, calc, expect = entry[::]
         self.assertEqual(calc, expect)
コード例 #21
0
 def test_sedenion_unit_table(self):
     """sedenion table"""
     x = Construct((1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
     i = Construct((0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
     j = Construct((0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
     k = Construct((0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
     l = Construct((0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
     m = Construct((0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
     n = Construct((0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0))
     o = Construct((0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0))
     p = Construct((0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0))
     q = Construct((0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0))
     r = Construct((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0))
     s = Construct((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0))
     t = Construct((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0))
     u = Construct((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0))
     v = Construct((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0))
     w = Construct((0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1))
     timestable = [
         ['1*1 =  1', x * x, x],
         ['1*i =  i', x * i, i],
         ['i*1 =  i', i * x, i],
         ['i*i = -1', i * i, -x],
         ['1*j =  1', x * j, j],
         ['1*k =  k', x * k, k],
         ['i*j =  k', i * j, k],
         ['i*k = -j', i * k, -j],
         ['j*1 =  j', j * x, j],
         ['j*i = -k', j * i, -k],
         ['j*j = -1', j * j, -x],
         ['j*k =  i', j * k, i],
         ['k*1 =  k', k * x, k],
         ['k*i =  j', k * i, j],
         ['k*j = -i', k * j, -i],
         ['k*k = -1', k * k, -x],
         ['1*l =  1', x * l, l],
         ['1*m =  m', x * m, m],
         ['1*n =  n', x * n, n],
         ['1*o =  o', x * o, o],
         ['i*l =  m', i * l, m],
         ['i*m = -l', i * m, -l],
         ['i*n = -o', i * n, -o],
         ['i*o =  n', i * o, n],
         ['j*l =  n', j * l, n],
         ['j*m =  o', j * m, o],
         ['j*n = -l', j * n, -l],
         ['j*o = -m', j * o, -m],
         ['k*l =  o', k * l, o],
         ['k*m = -n', k * m, -n],
         ['k*n =  m', k * n, m],
         ['k*o = -l', k * o, -l],
         ['l*1 =  1', l * x, l],
         ['l*i = -m', l * i, -m],
         ['l*j = -n', l * j, -n],
         ['l*k = -o', l * k, -o],
         ['l*l = -1', l * l, -x],
         ['l*m =  i', l * m, i],
         ['l*n =  j', l * n, j],
         ['1*o =  k', l * o, k],
         ['m*1 =  m', m * x, m],
         ['m*i =  l', m * i, l],
         ['m*j = -o', m * j, -o],
         ['m*k =  n', m * k, n],
         ['m*l = -i', m * l, -i],
         ['m*m = -1', m * m, -x],
         ['m*n = -k', m * n, -k],
         ['m*o =  j', m * o, j],
         ['n*1 =  n', n * x, n],
         ['n*i =  o', n * i, o],
         ['n*j =  l', n * j, l],
         ['n*k = -m', n * k, -m],
         ['n*l = -j', n * l, -j],
         ['n*m =  k', n * m, k],
         ['n*n = -1', n * n, -x],
         ['n*o = -i', n * o, -i],
         ['o*1 =  o', o * x, o],
         ['o*i = -n', o * i, -n],
         ['o*j =  m', o * j, m],
         ['o*k =  l', o * k, l],
         ['o*l = -k', o * l, -k],
         ['o*m = -j', o * m, -j],
         ['o*n =  i', o * n, i],
         ['o*o = -1', o * o, -x],
         ['1*p =  p', x * p, p],
         ['1*q =  q', x * q, q],
         ['1*r =  r', x * r, r],
         ['1*s =  s', x * s, s],
         ['1*t =  t', x * t, t],
         ['1*u =  u', x * u, u],
         ['1*v =  v', x * v, v],
         ['1*w =  w', x * w, w],
         ['i*p =  i', i * p, q],
         ['i*q = -x', i * q, -p],
         ['i*r =  k', i * r, -s],
         ['i*s = -j', i * s, r],
         ['i*t =  m', i * t, -u],
         ['i*u = -l', i * u, t],
         ['i*v = -o', i * v, w],
         ['i*w =  n', i * w, -v],
         ['j*p =  1', j * p, r],
         ['j*q =  i', j * q, s],
         ['j*r =  1', j * r, -p],
         ['j*s =  k', j * s, -q],
         ['j*t =  1', j * t, -v],
         ['j*u =  i', j * u, -w],
         ['j*v =  1', j * v, t],
         ['j*w =  k', j * w, u],
         ['k*p =  1', k * p, s],
         ['k*q =  i', k * q, -r],
         ['k*r =  1', k * r, q],
         ['k*s =  k', k * s, -p],
         ['k*t =  1', k * t, -w],
         ['k*u =  i', k * u, v],
         ['k*v =  1', k * v, -u],
         ['k*w =  k', k * w, t],
         ['l*p =  1', l * p, t],
         ['l*q =  i', l * q, u],
         ['l*r =  1', l * r, v],
         ['l*s =  k', l * s, w],
         ['l*t =  1', l * t, -p],
         ['l*u =  i', l * u, -q],
         ['l*v =  1', l * v, -r],
         ['1*w =  k', l * w, -s],
         ['m*p =  1', m * p, u],
         ['m*q =  i', m * q, -t],
         ['m*r =  1', m * r, w],
         ['m*s =  k', m * s, -v],
         ['m*t =  1', m * t, q],
         ['m*u =  i', m * u, -p],
         ['m*v =  1', m * v, s],
         ['m*w =  k', m * w, -r],
         ['n*p =  1', n * p, v],
         ['n*q =  i', n * q, -w],
         ['n*r =  1', n * r, -t],
         ['n*s =  k', n * s, u],
         ['n*t =  1', n * t, r],
         ['n*u =  i', n * u, -s],
         ['n*v =  1', n * v, -p],
         ['n*w =  k', n * w, q],
         ['o*p =  1', o * p, w],
         ['o*q =  i', o * q, v],
         ['o*r =  1', o * r, -u],
         ['o*s =  k', o * s, -t],
         ['o*t =  1', o * t, s],
         ['o*u =  i', o * u, r],
         ['o*v =  1', o * v, -q],
         ['o*w =  k', o * w, -p],
         ['p*1 =  p', p * x, p],
         ['p*i = -q', p * i, -q],
         ['p*j = -r', p * j, -r],
         ['p*k = -s', p * k, -s],
         ['p*l = -t', p * l, -t],
         ['p*m = -u', p * m, -u],
         ['p*n = -v', p * n, -v],
         ['p*o = -w', p * o, -w],
         ['p*p = -1', p * p, -x],
         ['p*q =  i', p * q, i],
         ['p*r =  j', p * r, j],
         ['p*s =  k', p * s, k],
         ['p*t =  l', p * t, l],
         ['p*u =  m', p * u, m],
         ['p*v =  n', p * v, n],
         ['p*w =  o', p * w, o],
         ['q*1 =  q', q * x, q],
         ['q*i =  p', q * i, p],
         ['q*j = -s', q * j, -s],
         ['q*k =  r', q * k, r],
         ['q*l = -u', q * l, -u],
         ['q*m =  t', q * m, t],
         ['q*n =  w', q * n, w],
         ['q*o = -v', q * o, -v],
         ['q*p = -i', q * p, -i],
         ['q*q = -1', q * q, -x],
         ['q*r = -k', q * r, -k],
         ['q*s =  j', q * s, j],
         ['q*t = -m', q * t, -m],
         ['q*u =  l', q * u, l],
         ['q*v =  o', q * v, o],
         ['q*w = -n', q * w, -n],
         ['r*1 =  r', r * x, r],
         ['r*i =  s', r * i, s],
         ['r*j =  p', r * j, p],
         ['r*k = -q', r * k, -q],
         ['r*l = -v', r * l, -v],
         ['r*m = -w', r * m, -w],
         ['r*n =  t', r * n, t],
         ['r*o =  u', r * o, u],
         ['r*p = -j', r * p, -j],
         ['r*q =  k', r * q, k],
         ['r*r = -1', r * r, -x],
         ['r*s = -i', r * s, -i],
         ['r*t = -n', r * t, -n],
         ['r*u = -o', r * u, -o],
         ['r*v =  l', r * v, l],
         ['r*w =  m', r * w, m],
         ['s*1 =  s', s * x, s],
         ['s*i = -r', s * i, -r],
         ['s*j =  q', s * j, q],
         ['s*k =  p', s * k, p],
         ['s*l = -w', s * l, -w],
         ['s*m =  v', s * m, v],
         ['s*n = -u', s * n, -u],
         ['s*o =  t', s * o, t],
         ['s*p = -k', s * p, -k],
         ['s*q = -j', s * q, -j],
         ['s*r =  i', s * r, i],
         ['s*s = -1', s * s, -x],
         ['s*t = -o', s * t, -o],
         ['s*u =  n', s * u, n],
         ['s*v = -m', s * v, -m],
         ['s*w =  l', s * w, l],
         ['t*1 =  t', t * x, t],
         ['t*i =  u', t * i, u],
         ['t*j =  v', t * j, v],
         ['t*k =  w', t * k, w],
         ['t*l =  p', t * l, p],
         ['t*m = -q', t * m, -q],
         ['t*n = -r', t * n, -r],
         ['t*o = -s', t * o, -s],
         ['t*p = -l', t * p, -l],
         ['t*q =  m', t * q, m],
         ['t*r =  n', t * r, n],
         ['t*s =  o', t * s, o],
         ['t*t = -1', t * t, -x],
         ['t*u = -i', t * u, -i],
         ['t*v = -j', t * v, -j],
         ['t*w = -k', t * w, -k],
         ['u*1 =  u', u * x, u],
         ['u*i = -t', u * i, -t],
         ['u*j =  w', u * j, w],
         ['u*k = -v', u * k, -v],
         ['u*l =  q', u * l, q],
         ['u*m =  p', u * m, p],
         ['u*n =  s', u * n, s],
         ['u*o = -r', u * o, -r],
         ['u*p = -m', u * p, -m],
         ['u*q = -l', u * q, -l],
         ['u*r =  o', u * r, o],
         ['u*s = -n', u * s, -n],
         ['u*t =  i', u * t, i],
         ['u*u = -1', u * u, -x],
         ['u*v =  k', u * v, k],
         ['u*w = -j', u * w, -j],
         ['v*1 =  v', v * x, v],
         ['v*i = -w', v * i, -w],
         ['v*j = -t', v * j, -t],
         ['v*k =  u', v * k, u],
         ['v*l =  r', v * l, r],
         ['v*m = -s', v * m, -s],
         ['v*n =  p', v * n, p],
         ['v*o =  q', v * o, q],
         ['v*p = -n', v * p, -n],
         ['v*q = -o', v * q, -o],
         ['v*r = -l', v * r, -l],
         ['v*s =  m', v * s, m],
         ['v*t =  j', v * t, j],
         ['v*u = -k', v * u, -k],
         ['v*v = -1', v * v, -x],
         ['v*w =  i', v * w, i],
         ['w*1 =  w', w * x, w],
         ['w*i =  v', w * i, v],
         ['w*j = -u', w * j, -u],
         ['w*k = -t', w * k, -t],
         ['w*l =  s', w * l, s],
         ['w*m =  r', w * m, r],
         ['w*n = -q', w * n, -q],
         ['w*o =  p', w * o, p],
         ['w*p = -o', w * p, -o],
         ['w*q =  n', w * q, n],
         ['w*r = -m', w * r, -m],
         ['w*s = -l', w * s, -l],
         ['w*t =  k', w * t, k],
         ['w*u =  j', w * u, j],
         ['w*v = -i', w * v, -i],
         ['w*w = -1', w * w, -x],
     ]
     for entry in timestable:
         title, calc, expect = entry[::]
         self.assertEqual(calc, expect)