def test_c_mult_a_mod_n(self):
        from qiskit import QuantumCircuit, QuantumRegister
        for k in range(1, 4):
            for i in range(k):
                for j in range(k):
                    x = QuantumRegister(2)
                    y = QuantumRegister(4)
                    c = QuantumRegister(1)
                    circuit = QuantumCircuit(x, y, c)

                    from tools import initialize_register_to_number
                    initialize_register_to_number(circuit, x, j)
                    initialize_register_to_number(circuit, c, 1)

                    from Arithmetic import c_mult_a_mod_n
                    c_mult_a_mod_n(circuit, x, y, c, i, k)

                    from tools import get_numerical_register_results
                    x_res, y_res, c_res, extra = get_numerical_register_results(
                        circuit, [len(x), len(y), 1])

                    self.assertEqual(j, x_res)
                    self.assertEqual((j * i) % k, y_res)
                    self.assertEqual(1, c_res)
                    self.assertEqual(0, extra)
Пример #2
0
def add_mod_n(circuit: QuantumCircuit, a, b, n: int):
    assert n.bit_length() - 1 <= len(b), f'b register must be at least n.bit_length() - 1 long\n' \
                                         f'Current: {len(b)}, Needed: {n.bit_length() - 1}'

    from qiskit import QuantumRegister
    n_reg = QuantumRegister(len(a), name='adder-mod-n-reg')
    if not circuit.has_register(n_reg):
        circuit.add_register(n_reg)

    t = QuantumRegister(1, name='adder-mod-t')
    if not circuit.has_register(t):
        circuit.add_register(t)

    from tools import initialize_register_to_number
    initialize_register_to_number(circuit, n_reg, n)

    add(circuit, a, b)
    substract(circuit, n_reg, b)

    circuit.x(b[-1])
    circuit.cx(b[-1], t)
    circuit.x(b[-1])

    initialize_register_to_number(circuit, n_reg, n, conditional=t)
    add(circuit, n_reg, b)
    initialize_register_to_number(circuit, n_reg, n, conditional=t)

    substract(circuit, a, b)

    circuit.cx(b[-1], t)
    add(circuit, a, b)

    initialize_register_to_number(circuit, n_reg, n)
    def test_add(self):
        from qiskit import QuantumCircuit, QuantumRegister
        for i in range(8):
            for j in range(8):
                a = QuantumRegister(3)
                b = QuantumRegister(4)
                circuit = QuantumCircuit(a, b)

                from tools import initialize_register_to_number
                initialize_register_to_number(circuit, a, i)
                initialize_register_to_number(circuit, b, j)

                from Arithmetic import add
                add(circuit, a, b)

                from tools import get_numerical_register_results
                a_res, b_res, extra = get_numerical_register_results(
                    circuit, [len(a), len(b)])

                self.assertEqual(i, a_res)
                self.assertEqual(i + j, b_res)
                self.assertEqual(0, extra)
Пример #4
0
def c_mult_a_mod_n(circuit, x, y, c, a, n):
    temp_reg_size = max(((2**len(x)) * a, 1)).bit_length()
    assert len(
        y
    ) >= temp_reg_size + 1, f'y register must be at least {temp_reg_size + 1} long'

    from qiskit import QuantumRegister
    temp = QuantumRegister(max(((2**len(x)) * a, 1)).bit_length(),
                           name='c-mult-mod-temp')
    if not circuit.has_register(temp):
        circuit.add_register(temp)

    for i in range(len(x)):
        from tools import initialize_register_to_number
        initialize_register_to_number(circuit,
                                      temp, (2**i) * a,
                                      conditional=x[i],
                                      conditional2=c)

        add_mod_n(circuit, temp, y, n)

        from tools import initialize_register_to_number
        initialize_register_to_number(circuit,
                                      temp, (2**i) * a,
                                      conditional=x[i],
                                      conditional2=c)

    circuit.x(c)
    for i in range(len(x)):
        from tools import initialize_register_to_number
        initialize_register_to_number(circuit,
                                      y[i:i + 1],
                                      1,
                                      conditional=x[i],
                                      conditional2=c)
    circuit.x(c)