コード例 #1
0
def test_cleartext_dist32():
    x = 4060000
    y = 7390000
    cx = 4063500
    cy = 7396000
    rsq = 64000000
    answer = 1 if ((x - cx)**2 + (y - cy)**2) < rsq else 0

    inputs = [0 for _ in range(32)]
    x_bits = [int(b) for b in bin(x)[2:]]
    if len(x_bits) < 32:
        x_bits = [0 for _ in range(32 - len(x_bits))] + x_bits
    y_bits = [int(b) for b in bin(y)[2:]]
    if len(y_bits) < 32:
        y_bits = [0 for _ in range(32 - len(y_bits))] + y_bits
    cx_bits = [int(b) for b in bin(cx)[2:]]
    if len(cx_bits) < 32:
        cx_bits = [0 for _ in range(32 - len(cx_bits))] + cx_bits
    cy_bits = [int(b) for b in bin(cy)[2:]]
    if len(cy_bits) < 32:
        cy_bits = [0 for _ in range(32 - len(cy_bits))] + cy_bits
    rsq_bits = [int(b) for b in bin(rsq)[2:]]
    if len(rsq_bits) < 32:
        rsq_bits = [0 for _ in range(32 - len(rsq_bits))] + rsq_bits
    inputs.extend(x_bits[::-1])
    inputs.extend(y_bits[::-1])
    inputs.extend(cx_bits[::-1])
    inputs.extend(cy_bits[::-1])
    inputs.extend(rsq_bits[::-1])
    c = Circuit("bristol_circuits/dist32.txt", ['V' for _ in range(192)])
    out_bit = asyncio.run(c.evaluate(inputs))
    assert out_bit[0] == answer, "computed wrong value"
コード例 #2
0
ファイル: mpc_test.py プロジェクト: shanerai/safetraceapi
def run_circuit_process(t, n, c_path, index, queues, main_queue, inputs,
                        triples):
    print(f"starting node {index}")
    shamir = Shamir(t, n)
    messenger = MockMessenger(t, n, index, queues)
    c = Circuit(c_path)
    outputs = c.evaluate(inputs,
                         shamir=shamir,
                         messenger=messenger,
                         triples=triples)
    main_queue.put(outputs)
    print(f"closing node {index}")
コード例 #3
0
def test_cleartext_unnormalized_subregion_example():
    answer = 300

    inputs = [0 for _ in range(64)] + [1 for _ in range(1200)]

    c = Circuit("bristol_circuits/unnormalized_subregion_100_10.txt",
                ['V' for _ in range(1264)])
    out_bits = asyncio.run(c.evaluate(inputs))
    out_string = ''.join([str(i) for i in list(reversed(out_bits))])
    for i in range(10):
        assert eval('0b' + out_string[i * 64:(i + 1) *
                                      64]) == answer, "computed wrong value"
コード例 #4
0
 def test_evaluation(self):
     c = Circuit(2)
     f = AdditionGate("F")
     g = AdditionGate("G")
     h = ScalarMultGate(2, "H")
     c.add_gate(h, ["INPUT1"])
     c.add_gate(f, ["H","INPUT0"])
     c.add_gate(g, ["F", "H"], True)
     input0, input1 = 1, 100
     result = c.evaluate((input0, input1))
     h_res = input1 * 2
     f_res = h_res + input0
     g_res = h_res + f_res
     self.assertEqual(result, g_res)
コード例 #5
0
def compile_unitary(U):
    """
    Takes a unitary and returns a circuit - i.e. a list of CNOTs and single qubit gates.
    """

    # perform two level decomposition
    two_level_unitaries = two_level_decomp(U)

    assert(np.allclose(mat_mul(two_level_unitaries), U))

    controlled_ops = []

    # decompose each two-level unitary into fully controlled operations
    for t in two_level_unitaries:
        controlled_ops += two_level_to_fully_controlled(t)

    assert(np.allclose(mat_mul(controlled_ops),U))

    gates = []

    # decompose each fully controlled operations into single qubit and CNOT gates
    for c in controlled_ops:
        gates += fully_controlled_to_single_cnot(c)

    circ = Circuit(n)

    circ.add_gates(gates)

    prod = circ.evaluate()

    assert(np.allclose(prod, U))

    print('number of two-level: ' + str(len(two_level_unitaries)))
    print('number of fully controlled ops: ' + str(len(controlled_ops)))
    print('number of CNOT and single qubit gates: ' + str(len(gates)))
    s = [g for g in gates if type(g) is SingleQubitGate]
    c = [g for g in gates if type(g) is CNOTGate]

    print('Single gates: ' + str(len(s)))
    print('CNOT gates: ' + str(len(c)))

    print('approximation error: ' + str(np.linalg.norm(prod-U)))

    for g in gates:
        if np.allclose(g.total_matrix(), np.eye(2**g.num_qubits)):
            print('redundant gate')

    return circ
コード例 #6
0
def test_cleartext_lessthan32():
	for x,y in [(100, 200), (200, 100), (111111, 23456), (2**30, 2**10), (2**10, 2**30), (2**32-1, 2**32-1)]:
		answer = 1 if x<y else 0

		x_bits = [int(c) for c in bin(x)[2:]]
		if len(x_bits)<32:
			x_bits = [0 for _ in range(32 - len(x_bits))]+ x_bits

		y_bits = [int(c) for c in bin(y)[2:]]
		if len(y_bits)<32:
			y_bits = [0 for _ in range(32 - len(y_bits))]+ y_bits
		x_bits = list(reversed(x_bits))
		y_bits = list(reversed(y_bits))
		c = Circuit("bristol_circuits/lessthan32.txt", ['V' for _ in range(64)])
		out_bit = c.evaluate(x_bits+y_bits)
		assert out_bit[0] == answer, "computed wrong value"
コード例 #7
0
def test_cleartext_mul64mod():
	for x,y in [(100, 200), (111111, 23456), (2**30, 2**10), (2**63, 2**63+1), (2**64-1, 2**64-1)]:
		answer = (x*y)%(2**64)

		x_bits = [int(c) for c in bin(x)[2:]]
		if len(x_bits)<64:
			x_bits = [0 for _ in range(64 - len(x_bits))]+ x_bits

		y_bits = [int(c) for c in bin(y)[2:]]
		if len(y_bits)<64:
			y_bits = [0 for _ in range(64 - len(y_bits))]+ y_bits
		x_bits = list(reversed(x_bits))
		y_bits = list(reversed(y_bits))
		c = Circuit("bristol_circuits/mul64mod.txt", ['V' for _ in range(128)])
		out_bits = c.evaluate(x_bits+y_bits)
		out_string = ''.join([str(i) for i in list(reversed(out_bits))])
		assert eval('0b'+out_string) == answer, "computed wrong value"
コード例 #8
0
def test_cleartext_sub64():
    for x, y in [(1000, 2010), (2010, 1000), (2**32 - 1, 2**32 - 1),
                 (2**60, 2**60 + 5), (2**63, 2**63 + 1),
                 (2**64 - 25, 2**64 - 100), (2**64 - 1, 2**64 - 1)]:
        answer = (x - y) % (2**64)

        x_bits = [int(c) for c in bin(x)[2:]]
        if len(x_bits) < 64:
            x_bits = [0 for _ in range(64 - len(x_bits))] + x_bits

        y_bits = [int(c) for c in bin(y)[2:]]
        if len(y_bits) < 64:
            y_bits = [0 for _ in range(64 - len(y_bits))] + y_bits
        x_bits = list(reversed(x_bits))
        y_bits = list(reversed(y_bits))
        c = Circuit("bristol_circuits/sub64.txt", ['V' for _ in range(128)])
        out_bits = asyncio.run(c.evaluate(x_bits + y_bits))
        out_string = ''.join([str(i) for i in list(reversed(out_bits))])
        assert eval('0b' + out_string) == answer, "computed wrong value"
コード例 #9
0
def test_cleartext_addsub_example():
    x = 1000
    y = 2000
    answer1 = (x + y) % (2**64)
    answer2 = (x - y) % (2**64)

    x_bits = [int(c) for c in bin(x)[2:]]
    if len(x_bits) < 64:
        x_bits = [0 for _ in range(64 - len(x_bits))] + x_bits

    y_bits = [int(c) for c in bin(y)[2:]]
    if len(y_bits) < 64:
        y_bits = [0 for _ in range(64 - len(y_bits))] + y_bits
    x_bits = list(reversed(x_bits))
    y_bits = list(reversed(y_bits))
    c = Circuit("bristol_circuits/example.txt", ['V' for _ in range(128)])
    out_bits = asyncio.run(c.evaluate(x_bits + y_bits))
    out_string = ''.join([str(i) for i in list(reversed(out_bits))])
    assert eval('0b' + out_string[:64]) == answer2, "computed wrong value"
    assert eval('0b' + out_string[64:]) == answer1, "computed wrong value"
コード例 #10
0
def test_circuit_add64():
    for x, y in [(1000, 2010), (100, 200), (111111, 23456),
                 (2**32 - 1, 2**32 - 1), (2**60, 2**60 + 5),
                 (2**63, 2**63 + 1), (2**64 - 25, 2**64 - 100),
                 (2**64 - 1, 2**64 - 1)]:
        answer = (x + y) % (2**64)

        x_bits = [int(c) for c in bin(x)[2:]]
        if len(x_bits) < 64:
            x_bits = [0 for _ in range(64 - len(x_bits))] + x_bits

        y_bits = [int(c) for c in bin(y)[2:]]
        if len(y_bits) < 64:
            y_bits = [0 for _ in range(64 - len(y_bits))] + y_bits
        x_bits = list(reversed(x_bits))
        y_bits = list(reversed(y_bits))
        c = Circuit("bristol_circuits/add64.txt")
        out_bits = c.evaluate(x_bits + y_bits)
        out_string = ''.join([str(i) for i in list(reversed(out_bits))])
        assert eval('0b' + out_string) == answer, "computed wrong value"
コード例 #11
0
    c.add_gate("snap", n_params=1, fn=snap_zz)

    # arbitrary one-qubit rotations
    c.add_gate("rotation")
    c.add_gate("displacement", n_params=1, fn=cav_xrot)
    c.add_gate("displacement", n_params=1, fn=cav_yrot)
    c.add_gate("displacement", n_params=1, fn=cav_xrot)


    np.set_printoptions(precision=3)
    np.set_printoptions(suppress=True)

    c.assemble()
    print()
    print("num free params: {}".format(c.n_params))
    print()

    rng = np.random.default_rng()
    params = rng.uniform(high=2*np.pi, size=c.n_params)
    print("param vector:\n{}".format(params))
    print()

    u = c.evaluate(params)
    print("resulting unitary:\n{}".format(u))
    print()

    tensor = c.get_tensor(params)
    print("resulting tensor:\n{}".format(tensor))
    print()
    print("tensor shape:\n{}".format(tensor.shape))
コード例 #12
0
def run_circuit_process(t, n, c_path, index, queues, main_queue, inputs, triples):
    shamir = Shamir(t, n)
    messenger = MockMessenger(t, n, index, queues)
    c = Circuit(c_path, ['S' for _ in range(len(inputs))])
    outputs = c.evaluate(inputs, shamir=shamir, messenger=messenger, triples=triples)
    main_queue.put(outputs)
コード例 #13
0
ファイル: circuit_test.py プロジェクト: shanerai/safetraceapi
from circuit import Circuit

test_cleartext_circuit():
	x = 20000
	y = 200
	answer = x*y

	x_bits = [int(c) for c in bin(x)[2:]]
	if len(x_bits)<32:
		x_bits = [0 for _ in range(32 - len(x_bits))]+ x_bits

	y_bits = [int(c) for c in bin(y)[2:]]
	if len(y_bits)<32:
		y_bits = [0 for _ in range(32 - len(y_bits))]+ y_bits

	c = Circuit("circuits/mul32_circuit.txt")
	out_bits = c.evaluate(x_bits+y_bits)
	out_string = ''.join([str(i) for i in out_bits])
	print(eval('0b'+out_string) == answer)

if __name__ == "__main__":
	test_cleartext_citcuit()
	print("PASS")