Exemplo n.º 1
0
def main():

    input_data = sys.argv[1:]

    # Set node numbers
    min_tel = int(input_data[0])
    max_tel = int(input_data[1])
    number = int(input_data[2])

    # Initialize the connection
    Bob = CQCConnection("Bob")

    for n in range(min_tel, max_tel + 1):

        for _ in range(number):

            # Start teleporting back and fourth

            for _ in range(n):

                # Make an EPR pair with other node
                q = Bob.recvEPR()

                # Receive info about corrections
                data = Bob.recvClassical(timout=3600)
                Bob.closeClassicalServer()
                message = list(data)
                a = message[0]
                b = message[1]

                # Apply corrections
                if b == 1:
                    q.X()
                if a == 1:
                    q.Z()

                    # Make an EPR pair with next node
                qEPR = Bob.recvEPR()

                # Apply the local teleportation operations
                q.cnot(qEPR)
                q.H()

                # Measure the qubits
                a = q.measure()
                b = qEPR.measure()
                to_print = "App {}: Measurement outcomes are: a={}, b={}".format(
                    Bob.name, a, b)
                print("|" + "-" * (len(to_print) + 2) + "|")
                print("| " + to_print + " |")
                print("|" + "-" * (len(to_print) + 2) + "|")

                # Send corrections to other node
                Bob.sendClassical("Alice", [a, b])
                Bob.closeClassicalChannel("Alice")

                # Stop the connection
    Bob.close()
Exemplo n.º 2
0
    def apply_on_target(self, cqc: CQCConnection, control_cqc_name: str,
                        target: qubit):
        # Receive qubit
        q = cqc.recvEPR()
        remote_result = binStrToInt(cqc.recvClassical())
        print("Bob received message: ", remote_result)
        if remote_result == 1:
            q.X()

        q.cnot(target)
        q.H()
        local_result = q.measure(inplace=True)
        q.reset()

        print("Bob sent message: ", local_result)
        cqc.sendClassical(control_cqc_name, msg=local_result)
Exemplo n.º 3
0
def main():

    input_data = sys.argv[1:]

    # Set node numbers
    node_nr = int(input_data[0])
    tot_nr = int(input_data[1])
    next_node_nr = (node_nr + 1) % tot_nr

    # Initialize the connection
    node = CQCConnection("n" + str(node_nr))

    # Create EPR pairs with previous and next node
    if node_nr == 0:

        # start timer
        t1 = timer()

        qNext = node.createEPR("n" + str(next_node_nr))
        qPrev = node.recvEPR()
    else:
        qPrev = node.recvEPR()
        qNext = node.createEPR("n" + str(next_node_nr))

    if node_nr == 0:  # this is the first node so create qubit

        # Create a qubit to teleport
        q = qubit(node)

        # Prepare the qubit to teleport in |+>
        q.H()

        # ------
        # Qubit is created, send it to next node
        # ------

    else:  # we are node in chain so receive classical corrections

        # Receive info about corrections
        data = node.recvClassical()
        message = list(data)
        a = message[0]
        b = message[1]

        # Apply corrections
        if b == 1:
            qPrev.X()
        if a == 1:
            qPrev.Z()

            # ------
            # Qubit is receive, send it to next node
            # ------

            # Apply the local teleportation operations
    qPrev.cnot(qNext)
    qPrev.H()

    # Measure the qubits
    a = qPrev.measure()
    b = qNext.measure()
    to_print = "App {}: Measurement outcomes are: a={}, b={}".format(
        node.name, a, b)
    print("|" + "-" * (len(to_print) + 2) + "|")
    print("| " + to_print + " |")
    print("|" + "-" * (len(to_print) + 2) + "|")

    # Send corrections to next node
    node.sendClassical("n" + str(next_node_nr), [a, b])

    if node_nr == 0:  # this is first node, so receive again after qubit traversed chain

        # Receive info about corrections
        data = node.recvClassical()
        message = list(data)
        a = message[0]
        b = message[1]

        # Apply corrections
        if b == 1:
            qPrev.X()
        if a == 1:
            qPrev.Z()

            # ------
            # Qubit is receive, so measure it
            # ------

            # measure the qubit, print the outcome and record the time it took
        m = q.measure()
        t2 = timer()
        to_print = "App {}: Measurement outcome is: m={}".format(node.name, m)
        print("|" + "-" * (len(to_print) + 2) + "|")
        print("| " + to_print + " |")
        print("|" + "-" * (len(to_print) + 2) + "|")
        to_print = "App {}: Time elapsed: t={}".format(node.name, t2 - t1)
        print("|" + "-" * (len(to_print) + 2) + "|")
        print("| " + to_print + " |")
        print("|" + "-" * (len(to_print) + 2) + "|")

        with open("times_v2.txt", "a") as f:
            f.write("{}, {}\n".format(tot_nr, t2 - t1))

            # Stop the connection
    node.close()