Exemple #1
0
def mainGame(movementInfo):
    quantumGateStatus = True  # set dynamically based on a new measurement
    score = playerIndex = loopIter = 0
    playerIndexGen = movementInfo['playerIndexGen']
    playerx, playery = int(SCREENWIDTH * 0.2), movementInfo['playery']

    basex = movementInfo['basex']
    baseShift = IMAGES['base'].get_width() - IMAGES['background'].get_width()

    # get 2 new pipes to add to upperPipes lowerPipes list
    newPipe1 = getRandomPipe(quantumGateStatus)
    newPipe2 = getRandomPipe(quantumGateStatus)

    # list of upper pipes
    upperPipes = [
        {
            'x': SCREENWIDTH + 200,
            'y': newPipe1[0]['y']
        },
        {
            'x': SCREENWIDTH + 200 + (SCREENWIDTH / 2),
            'y': newPipe2[0]['y']
        },
    ]

    # list of lowerpipe
    lowerPipes = [
        {
            'x': SCREENWIDTH + 200,
            'y': newPipe1[1]['y']
        },
        {
            'x': SCREENWIDTH + 200 + (SCREENWIDTH / 2),
            'y': newPipe2[1]['y']
        },
    ]

    pipeVelX = -4

    # player velocity, max velocity, downward accleration, accleration on flap
    playerVelY = -9  # player's velocity along Y, default same as playerFlapped
    playerMaxVelY = 10  # max vel along Y, max descend speed
    playerMinVelY = -8  # min vel along Y, max ascend speed
    playerAccY = 1  # players downward accleration
    playerRot = 45  # player's rotation
    playerVelRot = 3  # angular speed
    playerRotThr = 20  # rotation threshold
    playerFlapAcc = -9  # players speed on flapping
    playerFlapped = False  # True when player flaps

    # LEVEL = 1
    q = QuantumRegister(levels[LEVEL]['qubits'])  # |0>
    c = ClassicalRegister(levels[LEVEL]['qubits'])
    circuit = QuantumCircuit(q, c)

    desired_state = get_desired_state(LEVEL)
    print("Desired state is: " + desired_state)
    # goal_blochs = getGoalBlochs(desired_state)
    # goal_blochs.savefig("desierd_sphere.png")

    # cblochs = getGoalBlochs(''.zfill(levels[LEVEL]['qubits']))
    # cblochs.savefig("current_sphere.png")

    rgates = get_random_gates(LEVEL)

    # define gate labels
    firstGateLabel = rgates[0][0].__name__ + str(rgates[0][1])
    secondGateLabel = rgates[1][0].__name__ + str(rgates[1][1])
    cstate = ''.zfill(levels[LEVEL]['qubits'])
    circuit_str = ''
    while True:
        for event in pygame.event.get():
            if event.type == QUIT or (event.type == KEYDOWN
                                      and event.key == K_ESCAPE):
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN and (event.key == K_SPACE
                                          or event.key == K_UP):
                if playery > -2 * IMAGES['player'][0].get_height():
                    playerVelY = playerFlapAcc
                    playerFlapped = True

        # check for crash here
        crashTest = checkCrash(
            {
                'x': playerx,
                'y': playery,
                'index': playerIndex
            }, upperPipes, lowerPipes)
        if crashTest[0]:
            return {
                'y': playery,
                'groundCrash': crashTest[1],
                'basex': basex,
                'upperPipes': upperPipes,
                'lowerPipes': lowerPipes,
                'score': score,
                'playerVelY': playerVelY,
                'playerRot': playerRot
            }

        # check for score
        playerMidPos = playerx + IMAGES['player'][0].get_width() / 2
        for pipe in upperPipes:
            pipeMidPos = pipe['x'] + IMAGES['pipe'][0].get_width() / 2
            if pipeMidPos <= playerMidPos < pipeMidPos + 4:

                # NOTE: adding a check here for gate choice
                if 'quantum' in pipe.keys() and pipe['quantum'] == True:
                    gateno = checkGateChoice(upperPipes[0], lowerPipes[0],
                                             playery)

                    gate = rgates[gateno][0]
                    target = rgates[gateno][1]
                    gate(circuit, q[target - 1])
                    print("Applying gate: " + gate.__name__ + " on " +
                          str(target))
                    p, cstate = check(desired_state, circuit, q, c)
                    print("Probabilaty for desired state is: " + str(p))
                    print("Current state: |" + cstate + ">")
                    circuit_str += gate.__name__ + str(target) + ' > '

                    # cblochs = getGoalBlochs(cstate)
                    # cblochs.savefig("current_sphere.png")

                    if p > 0.99:
                        return {'score': p}

                    # Get new gates
                    rgates = get_random_gates(LEVEL)
                    firstGateLabel = rgates[0][0].__name__ + str(rgates[0][1])
                    secondGateLabel = rgates[1][0].__name__ + str(rgates[1][1])

                score += 1

        # playerIndex basex change
        if (loopIter + 1) % 3 == 0:
            playerIndex = next(playerIndexGen)
        loopIter = (loopIter + 1) % 30
        basex = -((-basex + 100) % baseShift)

        # rotate the player
        if playerRot > -90:
            playerRot -= playerVelRot

        # player's movement
        if playerVelY < playerMaxVelY and not playerFlapped:
            playerVelY += playerAccY
        if playerFlapped:
            playerFlapped = False

            # more rotation to cover the threshold (calculated in visible rotation)
            playerRot = 45

        playerHeight = IMAGES['player'][playerIndex].get_height()
        playery += min(playerVelY, BASEY - playery - playerHeight)

        # move pipes to left
        for uPipe, lPipe in zip(upperPipes, lowerPipes):
            uPipe['x'] += pipeVelX
            lPipe['x'] += pipeVelX

        # add new pipe when first pipe is about to touch left of screen
        if 0 < upperPipes[0]['x'] < 5:
            newPipe = getRandomPipe(quantumGateStatus)
            upperPipes.append(newPipe[0])
            lowerPipes.append(newPipe[1])

        # remove first pipe if its out of the screen
        if upperPipes[0]['x'] < -IMAGES['pipe'][0].get_width():
            upperPipes.pop(0)
            lowerPipes.pop(0)

        # draw sprites
        SCREEN.blit(IMAGES['background'], (0, 0))

        for uPipe, lPipe in zip(upperPipes, lowerPipes):
            if 'quantum' in uPipe.keys() and uPipe['quantum'] == True:
                SCREEN.blit(IMAGES['quantum_pipe'][0],
                            (uPipe['x'], uPipe['y']))
                SCREEN.blit(IMAGES['quantum_pipe'][1],
                            (lPipe['x'], lPipe['y']))

                # gate label text is written here
                font = pygame.font.Font('freesansbold.ttf', 32)

                upperText = font.render(firstGateLabel, True, white)
                lowerText = font.render(secondGateLabel, True, white)
                if ((uPipe['x'] == upperPipes[0]['x'] and playerx < uPipe['x']) or \
                    ('quantum' in upperPipes[1].keys() and upperPipes[1]['quantum'] == True and \
                    'quantum' in upperPipes[0].keys() and upperPipes[0]['quantum'] == False and \
                    playerx < upperPipes[1]['x'])): # compare against player x pos as well
                    SCREEN.blit(upperText,
                                (uPipe['x'] + 10,
                                 uPipe['y'] + 250))  # upper pipe label
                    SCREEN.blit(
                        lowerText,
                        (lPipe['x'] + 10, lPipe['y'] + 25))  # lower pipe label
                    # boundary line gets drawn here
                    SCREEN.blit(
                        IMAGES['boundary'],
                        (uPipe['x'], uPipe['y'] + 420))  # draw boundary
            else:
                SCREEN.blit(IMAGES['pipe'][0], (uPipe['x'], uPipe['y']))
                SCREEN.blit(IMAGES['pipe'][1], (lPipe['x'], lPipe['y']))

        SCREEN.blit(IMAGES['base'], (basex, BASEY))

        # print score so player overlaps the score
        showScore(score)
        showState(cstate, desired_state, circuit_str)

        # Player rotation has a threshold
        visibleRot = playerRotThr
        if playerRot <= playerRotThr:
            visibleRot = playerRot

        playerSurface = pygame.transform.rotate(IMAGES['player'][playerIndex],
                                                visibleRot)
        SCREEN.blit(playerSurface, (playerx, playery))

        pygame.display.update()
        FPSCLOCK.tick(FPS)
Exemple #2
0
def make_circuit(n:int,f) -> QuantumCircuit:
    # circuit begin
    input_qubit = QuantumRegister(n,"qc")
    classical = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classical)
    prog.h(input_qubit[0]) # number=3
    prog.h(input_qubit[1]) # number=4
    prog.h(input_qubit[2]) # number=5
    prog.h(input_qubit[3]) # number=6
    prog.h(input_qubit[4])  # number=21
    prog.rx(-0.03141592653589796,input_qubit[1]) # number=37

    Zf = build_oracle(n, f)

    repeat = floor(sqrt(2 ** n) * pi / 4)
    for i in range(1):
        prog.append(Zf.to_gate(), [input_qubit[i] for i in range(n)])
        prog.h(input_qubit[0])  # number=1
        prog.h(input_qubit[1])  # number=2
        prog.h(input_qubit[4]) # number=27
        prog.h(input_qubit[2])  # number=7
        prog.h(input_qubit[3])  # number=8


        prog.cx(input_qubit[1],input_qubit[0])  # number=28
        prog.x(input_qubit[0])  # number=29
        prog.h(input_qubit[0])  # number=38
        prog.cz(input_qubit[1],input_qubit[0])  # number=39
        prog.h(input_qubit[0])  # number=40
        prog.x(input_qubit[1])  # number=10
        prog.h(input_qubit[2])  # number=31
        prog.cz(input_qubit[0],input_qubit[2])  # number=32
        prog.h(input_qubit[2])  # number=33
        prog.x(input_qubit[2])  # number=23
        prog.cx(input_qubit[0],input_qubit[2])  # number=24
        prog.x(input_qubit[3])  # number=12

        if n>=2:
            prog.mcu1(pi,input_qubit[1:],input_qubit[0])

        prog.x(input_qubit[0])  # number=13
        prog.x(input_qubit[1])  # number=14
        prog.cx(input_qubit[0],input_qubit[2])  # number=34
        prog.x(input_qubit[2])  # number=35
        prog.cx(input_qubit[0],input_qubit[2])  # number=36
        prog.y(input_qubit[1]) # number=26
        prog.x(input_qubit[3])  # number=16


        prog.h(input_qubit[0])  # number=17
        prog.cx(input_qubit[4],input_qubit[2]) # number=25
        prog.h(input_qubit[1])  # number=18
        prog.h(input_qubit[2])  # number=19
        prog.h(input_qubit[3])  # number=20

        prog.h(input_qubit[0])  
        prog.h(input_qubit[1])
        prog.h(input_qubit[2])
        prog.h(input_qubit[3])


    # circuit end



    return prog
Exemple #3
0
def make_circuit(n:int,f) -> QuantumCircuit:
    # circuit begin
    input_qubit = QuantumRegister(n,"qc")
    classical = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classical)
    prog.h(input_qubit[0]) # number=3
    prog.rx(-1.3603096190043806,input_qubit[2]) # number=28
    prog.h(input_qubit[1]) # number=4
    prog.h(input_qubit[2]) # number=5
    prog.h(input_qubit[3]) # number=6
    prog.h(input_qubit[4])  # number=21

    Zf = build_oracle(n, f)

    repeat = floor(sqrt(2 ** n) * pi / 4)
    for i in range(repeat):
        prog.append(Zf.to_gate(), [input_qubit[i] for i in range(n)])
        prog.h(input_qubit[0])  # number=1
        prog.h(input_qubit[1])  # number=2
        prog.h(input_qubit[2])  # number=7
        prog.h(input_qubit[3])  # number=8
        prog.h(input_qubit[3]) # number=34
        prog.cz(input_qubit[4],input_qubit[3]) # number=35
        prog.h(input_qubit[3]) # number=36


        prog.h(input_qubit[0])  # number=38
        prog.cz(input_qubit[1],input_qubit[0])  # number=39
        prog.h(input_qubit[0])  # number=40
        prog.x(input_qubit[0])  # number=32
        prog.cx(input_qubit[1],input_qubit[0])  # number=33
        prog.cx(input_qubit[0],input_qubit[1])  # number=24
        prog.x(input_qubit[1])  # number=25
        prog.x(input_qubit[1]) # number=41
        prog.cx(input_qubit[0],input_qubit[1])  # number=26
        prog.x(input_qubit[2])  # number=11
        prog.cx(input_qubit[2],input_qubit[3]) # number=30
        prog.x(input_qubit[3])  # number=12
        prog.h(input_qubit[2]) # number=42

        if n>=2:
            prog.mcu1(pi,input_qubit[1:],input_qubit[0])

        prog.x(input_qubit[0])  # number=13
        prog.x(input_qubit[1])  # number=14
        prog.x(input_qubit[2])  # number=15
        prog.x(input_qubit[4]) # number=46
        prog.x(input_qubit[3])  # number=16


        prog.h(input_qubit[0])  # number=17
        prog.h(input_qubit[1])  # number=18
        prog.cx(input_qubit[0],input_qubit[2]) # number=43
        prog.cx(input_qubit[0],input_qubit[2]) # number=47
        prog.x(input_qubit[2]) # number=48
        prog.cx(input_qubit[0],input_qubit[2]) # number=49
        prog.cx(input_qubit[0],input_qubit[2]) # number=45
        prog.rx(-1.9697785938008003,input_qubit[1]) # number=37
        prog.h(input_qubit[2])  # number=19
        prog.h(input_qubit[3])  # number=20


    prog.x(input_qubit[1]) # number=22
    prog.x(input_qubit[1]) # number=23
    # circuit end

    for i in range(n):
        prog.measure(input_qubit[i], classical[i])


    return prog
Exemple #4
0
def make_circuit(n: int, f) -> QuantumCircuit:
    # circuit begin
    input_qubit = QuantumRegister(n, "qc")
    classical = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classical)
    prog.h(input_qubit[0])  # number=3
    prog.h(input_qubit[1])  # number=4
    prog.h(input_qubit[2])  # number=5
    prog.h(input_qubit[3])  # number=6
    prog.h(input_qubit[0])  # number=38
    prog.cz(input_qubit[1], input_qubit[0])  # number=39
    prog.h(input_qubit[0])  # number=40
    prog.h(input_qubit[0])  # number=49
    prog.cz(input_qubit[1], input_qubit[0])  # number=50
    prog.h(input_qubit[0])  # number=51
    prog.cx(input_qubit[1], input_qubit[0])  # number=52
    prog.z(input_qubit[1])  # number=53
    prog.h(input_qubit[0])  # number=57
    prog.cz(input_qubit[1], input_qubit[0])  # number=58
    prog.h(input_qubit[0])  # number=59
    prog.h(input_qubit[0])  # number=60
    prog.cz(input_qubit[1], input_qubit[0])  # number=61
    prog.h(input_qubit[0])  # number=62
    prog.h(input_qubit[0])  # number=32
    prog.cz(input_qubit[1], input_qubit[0])  # number=33
    prog.h(input_qubit[0])  # number=34
    prog.x(input_qubit[4])  # number=48
    prog.h(input_qubit[4])  # number=21

    Zf = build_oracle(n, f)

    repeat = floor(sqrt(2**n) * pi / 4)
    for i in range(repeat):
        prog.append(Zf.to_gate(), [input_qubit[i] for i in range(n)])
        prog.h(input_qubit[0])  # number=1
        prog.h(input_qubit[1])  # number=2
        prog.h(input_qubit[2])  # number=7
        prog.h(input_qubit[3])  # number=8
        prog.cx(input_qubit[3], input_qubit[0])  # number=41
        prog.z(input_qubit[3])  # number=42
        prog.cx(input_qubit[3], input_qubit[0])  # number=43
        prog.cx(input_qubit[1], input_qubit[3])  # number=44

        prog.x(input_qubit[0])  # number=9
        prog.h(input_qubit[1])  # number=56
        prog.x(input_qubit[1])  # number=10
        prog.x(input_qubit[2])  # number=11
        prog.rx(-2.9845130209103035, input_qubit[4])  # number=55
        prog.cx(input_qubit[0], input_qubit[3])  # number=35
        prog.x(input_qubit[3])  # number=36
        prog.cx(input_qubit[0], input_qubit[3])  # number=37

        if n >= 2:
            prog.mcu1(pi, input_qubit[1:], input_qubit[0])

        prog.cx(input_qubit[1], input_qubit[0])  # number=24
        prog.x(input_qubit[0])  # number=25
        prog.cx(input_qubit[1], input_qubit[0])  # number=26
        prog.x(input_qubit[1])  # number=14
        prog.x(input_qubit[2])  # number=15
        prog.x(input_qubit[3])  # number=16

        prog.h(input_qubit[0])  # number=17
        prog.h(input_qubit[1])  # number=18
        prog.h(input_qubit[2])  # number=19
        prog.h(input_qubit[3])  # number=20

    prog.x(input_qubit[1])  # number=22
    prog.x(input_qubit[1])  # number=23
    # circuit end

    for i in range(n):
        prog.measure(input_qubit[i], classical[i])

    return prog
Exemple #5
0
def make_circuit(n:int,f) -> QuantumCircuit:
    # circuit begin
    input_qubit = QuantumRegister(n,"qc")
    classical = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classical)
    prog.h(input_qubit[0]) # number=3
    prog.h(input_qubit[1]) # number=4
    prog.h(input_qubit[2]) # number=5
    prog.h(input_qubit[3]) # number=6
    prog.h(input_qubit[4])  # number=21

    Zf = build_oracle(n, f)

    repeat = floor(sqrt(2 ** n) * pi / 4)
    for i in range(repeat):
        prog.append(Zf.to_gate(), [input_qubit[i] for i in range(n)])
        prog.h(input_qubit[0])  # number=1
        prog.h(input_qubit[1])  # number=2
        prog.h(input_qubit[2])  # number=7
        prog.h(input_qubit[3])  # number=8


        prog.h(input_qubit[0])  # number=28
        prog.cx(input_qubit[3],input_qubit[0]) # number=49
        prog.z(input_qubit[3]) # number=50
        prog.cx(input_qubit[3],input_qubit[0]) # number=51
        prog.cz(input_qubit[1],input_qubit[0])  # number=29
        prog.h(input_qubit[0])  # number=30
        prog.h(input_qubit[0])  # number=43
        prog.cz(input_qubit[1],input_qubit[0])  # number=44
        prog.h(input_qubit[0])  # number=45
        prog.cx(input_qubit[1],input_qubit[0])  # number=35
        prog.cx(input_qubit[1],input_qubit[0])  # number=38
        prog.x(input_qubit[0])  # number=39
        prog.cx(input_qubit[1],input_qubit[0])  # number=40
        prog.cx(input_qubit[1],input_qubit[0])  # number=37
        prog.h(input_qubit[0])  # number=46
        prog.cz(input_qubit[1],input_qubit[0])  # number=47
        prog.h(input_qubit[0])  # number=48
        prog.cx(input_qubit[1],input_qubit[0])  # number=27
        prog.x(input_qubit[1])  # number=10
        prog.x(input_qubit[2])  # number=11
        prog.x(input_qubit[3])  # number=12

        if n>=2:
            prog.mcu1(pi,input_qubit[1:],input_qubit[0])

        prog.x(input_qubit[0])  # number=13
        prog.cx(input_qubit[0],input_qubit[1])  # number=22
        prog.y(input_qubit[2]) # number=41
        prog.x(input_qubit[1])  # number=23
        prog.cx(input_qubit[0],input_qubit[1])  # number=24
        prog.rx(1.0398671683382215,input_qubit[2]) # number=31
        prog.x(input_qubit[2])  # number=15
        prog.x(input_qubit[3])  # number=16


        prog.h(input_qubit[0])  # number=17
        prog.h(input_qubit[1])  # number=18
        prog.h(input_qubit[2])  # number=19
        prog.h(input_qubit[3])  # number=20


    # circuit end

    for i in range(n):
        prog.measure(input_qubit[i], classical[i])


    return prog
Exemple #6
0
# import all necessary objects and methods for quantum circuits
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit, execute, Aer

all_pairs = ['00', '01', '10', '11']

for pair in all_pairs:

    # create a quantum curcuit with two qubits: Asja's and Balvis' qubits.
    # both are initially set to |0>.
    qreg = QuantumRegister(2)  # quantum register with 2 qubits
    creg = ClassicalRegister(2)  # classical register with 2 bits
    mycircuit = QuantumCircuit(
        qreg, creg)  # quantum circuit with quantum and classical registers

    # apply h-gate (Hadamard) to the first qubit.
    mycircuit.h(qreg[0])

    # apply cx-gate (CNOT) with parameters first-qubit and second-qubit.
    mycircuit.cx(qreg[0], qreg[1])

    # they are separated now.

    # if a is 1, then apply z-gate to the first qubit.
    if pair[0] == '1':
        mycircuit.z(qreg[0])

    # if b is 1, then apply x-gate (NOT) to the first qubit.
    if pair[1] == '1':
        mycircuit.x(qreg[0])

    # Asja sends her qubit to Balvis.
Exemple #7
0
def make_circuit(n: int, f) -> QuantumCircuit:
    # circuit begin
    input_qubit = QuantumRegister(n, "qc")
    classical = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classical)
    prog.h(input_qubit[0])  # number=3
    prog.h(input_qubit[1])  # number=4
    prog.h(input_qubit[2])  # number=5
    prog.h(input_qubit[3])  # number=6
    prog.h(input_qubit[4])  # number=21
    prog.h(input_qubit[0])  # number=43
    prog.cz(input_qubit[4], input_qubit[0])  # number=44
    prog.h(input_qubit[0])  # number=45
    prog.cx(input_qubit[4], input_qubit[0])  # number=46
    prog.cx(input_qubit[4], input_qubit[0])  # number=56
    prog.z(input_qubit[4])  # number=57
    prog.cx(input_qubit[4], input_qubit[0])  # number=58
    prog.cx(input_qubit[4], input_qubit[0])  # number=48
    prog.h(input_qubit[0])  # number=37
    prog.cz(input_qubit[4], input_qubit[0])  # number=38
    prog.h(input_qubit[0])  # number=39

    Zf = build_oracle(n, f)

    repeat = floor(sqrt(2**n) * pi / 4)
    for i in range(repeat):
        prog.append(Zf.to_gate(), [input_qubit[i] for i in range(n)])
        prog.h(input_qubit[0])  # number=1
        prog.rx(-1.0430087609918113, input_qubit[4])  # number=36
        prog.h(input_qubit[1])  # number=2
        prog.h(input_qubit[2])  # number=7
        prog.h(input_qubit[3])  # number=8

        prog.cx(input_qubit[1], input_qubit[0])  # number=40
        prog.cx(input_qubit[1], input_qubit[0])  # number=52
        prog.x(input_qubit[0])  # number=53
        prog.cx(input_qubit[1], input_qubit[0])  # number=54
        prog.h(input_qubit[0])  # number=49
        prog.cz(input_qubit[1], input_qubit[0])  # number=50
        prog.h(input_qubit[0])  # number=51
        prog.x(input_qubit[1])  # number=10
        prog.rx(-0.06597344572538572, input_qubit[3])  # number=27
        prog.cx(input_qubit[0], input_qubit[2])  # number=22
        prog.x(input_qubit[2])  # number=23
        prog.h(input_qubit[2])  # number=28
        prog.cz(input_qubit[0], input_qubit[2])  # number=29
        prog.h(input_qubit[2])  # number=30
        prog.x(input_qubit[3])  # number=12

        if n >= 2:
            prog.mcu1(pi, input_qubit[1:], input_qubit[0])

        prog.x(input_qubit[0])  # number=13
        prog.x(input_qubit[1])  # number=14
        prog.x(input_qubit[2])  # number=15
        prog.x(input_qubit[3])  # number=16
        prog.h(input_qubit[4])  # number=35

        prog.h(input_qubit[0])  # number=17
        prog.rx(2.4912829742967055, input_qubit[2])  # number=26
        prog.h(input_qubit[1])  # number=18
        prog.h(input_qubit[2])  # number=19
        prog.h(input_qubit[2])  # number=55
        prog.h(input_qubit[2])  # number=25
        prog.h(input_qubit[3])  # number=20

    # circuit end

    for i in range(n):
        prog.measure(input_qubit[i], classical[i])

    return prog
Exemple #8
0
    def construct_circuit(self, mode, inreg):
        """Construct the Lookup Rotation circuit.

        Args:
            mode (str): consctruction mode, 'matrix' not supported
            inreg (QuantumRegister): input register, typically output register of Eigenvalues

        Returns:
            QuantumCircuit containing the Lookup Rotation circuit.
        """

        # initialize circuit
        if mode == 'matrix':
            raise NotImplementedError('The matrix mode is not supported.')
        if self._lambda_min:
            self._scale = self._lambda_min / 2 / np.pi * self._evo_time
        if self._scale == 0:
            self._scale = 2**-len(inreg)
        self._ev = inreg
        self._workq = QuantumRegister(1, 'work')
        self._msq = QuantumRegister(1, 'msq')
        self._anc = QuantumRegister(1, 'anc')
        qc = QuantumCircuit(self._ev, self._workq, self._msq, self._anc)
        self._circuit = qc
        self._reg_size = len(inreg)
        if self._pat_length is None:
            if self._reg_size <= 6:
                self._pat_length = self._reg_size - \
                                   (2 if self._negative_evals else 1)
            else:
                self._pat_length = 5
        if self._reg_size <= self._pat_length:
            self._pat_length = self._reg_size - \
                               (2 if self._negative_evals else 1)
        if self._subpat_length is None:
            self._subpat_length = int(np.ceil(self._pat_length / 2))
        m = self._subpat_length
        n = self._pat_length
        k = self._reg_size
        neg_evals = self._negative_evals

        # get classically precomputed eigenvalue binning
        approx_dict = LookupRotation._classic_approx(k,
                                                     n,
                                                     m,
                                                     negative_evals=neg_evals)

        fo = None
        old_fo = None
        # for negative EV, we pass a pseudo register ev[1:] ign. sign bit
        ev = [self._ev[i] for i in range(len(self._ev))]

        for _, fo in enumerate(list(approx_dict.keys())):
            # read m-bit and (n-m) bit patterns for current first-one and
            # correct Lambdas
            pattern_map = approx_dict[fo]
            # set most-significant-qbit register and uncompute previous
            if self._negative_evals:
                if old_fo != fo:
                    if old_fo is not None:
                        self._set_msq(self._msq, ev[1:], int(old_fo - 1))
                    old_fo = fo
                    if fo + n == k:
                        self._set_msq(self._msq,
                                      ev[1:],
                                      int(fo - 1),
                                      last_iteration=True)
                    else:
                        self._set_msq(self._msq,
                                      ev[1:],
                                      int(fo - 1),
                                      last_iteration=False)
            else:
                if old_fo != fo:
                    if old_fo is not None:
                        self._set_msq(self._msq, self._ev, int(old_fo))
                    old_fo = fo
                    if fo + n == k:
                        self._set_msq(self._msq,
                                      self._ev,
                                      int(fo),
                                      last_iteration=True)
                    else:
                        self._set_msq(self._msq,
                                      self._ev,
                                      int(fo),
                                      last_iteration=False)
            # offset = start idx for ncx gate setting and unsetting m-bit
            # long bitstring
            offset_mpat = fo + (n - m) if fo < k - n else fo + n - m - 1
            for mainpat, subpat, lambda_ar in pattern_map:
                # set m-bit pattern in register workq
                self._set_bit_pattern(mainpat, self._workq[0], offset_mpat + 1)
                # iterate of all 2**(n-m) combinations for fixed m-bit
                for subpattern, lambda_ in zip(subpat, lambda_ar):

                    # calculate rotation angle
                    theta = 2 * np.arcsin(min(1, self._scale / lambda_))
                    # offset for ncx gate checking subpattern
                    offset = fo + 1 if fo < k - n else fo

                    # rotation is happening here
                    # 1. rotate by half angle
                    qc.mcu3(theta / 2, 0, 0, [self._workq[0], self._msq[0]],
                            self._anc[0])
                    # 2. mct gate to reverse rotation direction
                    self._set_bit_pattern(subpattern, self._anc[0], offset)
                    # 3. rotate by inverse of halfangle to uncompute / complete
                    qc.mcu3(-theta / 2, 0, 0, [self._workq[0], self._msq[0]],
                            self._anc[0])
                    # 4. mct gate to uncompute first mct gate
                    self._set_bit_pattern(subpattern, self._anc[0], offset)
                # uncompute m-bit pattern
                self._set_bit_pattern(mainpat, self._workq[0], offset_mpat + 1)

        last_fo = fo
        # uncompute msq register
        if self._negative_evals:
            self._set_msq(self._msq,
                          ev[1:],
                          int(last_fo - 1),
                          last_iteration=True)
        else:
            self._set_msq(self._msq,
                          self._ev,
                          int(last_fo),
                          last_iteration=True)

        # rotate by pi to fix sign for negative evals
        if self._negative_evals:
            qc.cu3(2 * np.pi, 0, 0, self._ev[0], self._anc[0])
        self._circuit = qc
        return self._circuit
from qiskit import ClassicalRegister, QuantumRegister
from qiskit import QuantumCircuit, execute
from qiskit.tools.visualization import plot_histogram, circuit_drawer


qr = QuantumRegister(16)
cr = ClassicalRegister(16)
qc = QuantumCircuit(qr,cr)

qc.x(qr[0])
qc.x(qr[3])
qc.x(qr[5])

qc.h(qr[9])
qc.cx(qr[9], qr[8])
qc.x(qr[11])
qc.x(qr[12])
qc.x(qr[13])

for j in range(16):
    qc.measure(qr[j],cr[j])
print("Done\n")

#Sign onto IBM UE

from qiskit import register, available_backends, get_backend
#import Qconfig and set APIToken and API url
try:
    import sys 
    sys.path.append("../") #go to parent directory
    import Qconfig
Exemple #10
0
 def test_circuit_depth_empty(self):
     """Test depth of empty circuity
     """
     q = QuantumRegister(5, 'q')
     qc = QuantumCircuit(q)
     self.assertEqual(qc.depth(), 0)
    def test_evaluate_single_pauli_statevector(self):
        """ evaluate single pauli statevector test """
        # X
        op = WeightedPauliOperator.from_list([Pauli.from_label('X')])
        qr = QuantumRegister(1, name='q')
        wave_function = QuantumCircuit(qr)
        # + 1 eigenstate
        wave_function.h(qr[0])
        circuits = op.construct_evaluation_circuit(wave_function=wave_function,
                                                   statevector_mode=True)
        result = self.quantum_instance_statevector.execute(circuits)
        actual_value = op.evaluate_with_result(result=result,
                                               statevector_mode=True)
        self.assertAlmostEqual(1.0, actual_value[0].real, places=5)
        # - 1 eigenstate
        wave_function = QuantumCircuit(qr)
        wave_function.x(qr[0])
        wave_function.h(qr[0])
        circuits = op.construct_evaluation_circuit(wave_function=wave_function,
                                                   statevector_mode=True)
        result = self.quantum_instance_statevector.execute(circuits)
        actual_value = op.evaluate_with_result(result=result,
                                               statevector_mode=True)
        self.assertAlmostEqual(-1.0, actual_value[0].real, places=5)

        # Y
        op = WeightedPauliOperator.from_list([Pauli.from_label('Y')])
        qr = QuantumRegister(1, name='q')
        wave_function = QuantumCircuit(qr)
        # + 1 eigenstate
        wave_function.h(qr[0])
        wave_function.s(qr[0])
        circuits = op.construct_evaluation_circuit(wave_function=wave_function,
                                                   statevector_mode=True)
        result = self.quantum_instance_statevector.execute(circuits)
        actual_value = op.evaluate_with_result(result=result,
                                               statevector_mode=True)
        self.assertAlmostEqual(1.0, actual_value[0].real, places=5)
        # - 1 eigenstate
        wave_function = QuantumCircuit(qr)
        wave_function.x(qr[0])
        wave_function.h(qr[0])
        wave_function.s(qr[0])
        circuits = op.construct_evaluation_circuit(wave_function=wave_function,
                                                   statevector_mode=True)
        result = self.quantum_instance_statevector.execute(circuits)
        actual_value = op.evaluate_with_result(result=result,
                                               statevector_mode=True)
        self.assertAlmostEqual(-1.0, actual_value[0].real, places=5)

        # Z
        op = WeightedPauliOperator.from_list([Pauli.from_label('Z')])
        qr = QuantumRegister(1, name='q')
        wave_function = QuantumCircuit(qr)
        # + 1 eigenstate
        circuits = op.construct_evaluation_circuit(wave_function=wave_function,
                                                   statevector_mode=True)
        result = self.quantum_instance_statevector.execute(circuits)
        actual_value = op.evaluate_with_result(result=result,
                                               statevector_mode=True)
        self.assertAlmostEqual(1.0, actual_value[0].real, places=5)
        # - 1 eigenstate
        wave_function = QuantumCircuit(qr)
        wave_function.x(qr[0])
        circuits = op.construct_evaluation_circuit(wave_function=wave_function,
                                                   statevector_mode=True)
        result = self.quantum_instance_statevector.execute(circuits)
        actual_value = op.evaluate_with_result(result=result,
                                               statevector_mode=True)
        self.assertAlmostEqual(-1.0, actual_value[0].real, places=5)
    def test_mapping_correction(self):
        """Test mapping works in previous failed case.
        """
        backend = FakeBackend()
        qr = QuantumRegister(name='qr', size=11)
        cr = ClassicalRegister(name='qc', size=11)
        circuit = QuantumCircuit(qr, cr)
        circuit.u3(1.564784764685993, -1.2378965763410095, 2.9746763177861713,
                   qr[3])
        circuit.u3(1.2269835563676523, 1.1932982847014162, -1.5597357740824318,
                   qr[5])
        circuit.cx(qr[5], qr[3])
        circuit.u1(0.856768317675967, qr[3])
        circuit.u3(-3.3911273825190915, 0.0, 0.0, qr[5])
        circuit.cx(qr[3], qr[5])
        circuit.u3(2.159209321625547, 0.0, 0.0, qr[5])
        circuit.cx(qr[5], qr[3])
        circuit.u3(0.30949966910232335, 1.1706201763833217, 1.738408691990081,
                   qr[3])
        circuit.u3(1.9630571407274755, -0.6818742967975088, 1.8336534616728195,
                   qr[5])
        circuit.u3(1.330181833806101, 0.6003162754946363, -3.181264980452862,
                   qr[7])
        circuit.u3(0.4885914820775024, 3.133297443244865, -2.794457469189904,
                   qr[8])
        circuit.cx(qr[8], qr[7])
        circuit.u1(2.2196187596178616, qr[7])
        circuit.u3(-3.152367609631023, 0.0, 0.0, qr[8])
        circuit.cx(qr[7], qr[8])
        circuit.u3(1.2646005789809263, 0.0, 0.0, qr[8])
        circuit.cx(qr[8], qr[7])
        circuit.u3(0.7517780502091939, 1.2828514296564781, 1.6781179605443775,
                   qr[7])
        circuit.u3(0.9267400575390405, 2.0526277839695153, 2.034202361069533,
                   qr[8])
        circuit.u3(2.550304293455634, 3.8250017126569698, -2.1351609599720054,
                   qr[1])
        circuit.u3(0.9566260876600556, -1.1147561503064538, 2.0571590492298797,
                   qr[4])
        circuit.cx(qr[4], qr[1])
        circuit.u1(2.1899329069137394, qr[1])
        circuit.u3(-1.8371715243173294, 0.0, 0.0, qr[4])
        circuit.cx(qr[1], qr[4])
        circuit.u3(0.4717053496327104, 0.0, 0.0, qr[4])
        circuit.cx(qr[4], qr[1])
        circuit.u3(2.3167620677708145, -1.2337330260253256,
                   -0.5671322899563955, qr[1])
        circuit.u3(1.0468499525240678, 0.8680750644809365, -1.4083720073192485,
                   qr[4])
        circuit.u3(2.4204244021892807, -2.211701932616922, 3.8297006565735883,
                   qr[10])
        circuit.u3(0.36660280497727255, 3.273119149343493, -1.8003362351299388,
                   qr[6])
        circuit.cx(qr[6], qr[10])
        circuit.u1(1.067395863586385, qr[10])
        circuit.u3(-0.7044917541291232, 0.0, 0.0, qr[6])
        circuit.cx(qr[10], qr[6])
        circuit.u3(2.1830003849921527, 0.0, 0.0, qr[6])
        circuit.cx(qr[6], qr[10])
        circuit.u3(2.1538343756723917, 2.2653381826084606, -3.550087952059485,
                   qr[10])
        circuit.u3(1.307627685019188, -0.44686656993522567,
                   -2.3238098554327418, qr[6])
        circuit.u3(2.2046797998462906, 0.9732961754855436, 1.8527865921467421,
                   qr[9])
        circuit.u3(2.1665254613904126, -1.281337664694577, -1.2424905413631209,
                   qr[0])
        circuit.cx(qr[0], qr[9])
        circuit.u1(2.6209599970201007, qr[9])
        circuit.u3(0.04680566321901303, 0.0, 0.0, qr[0])
        circuit.cx(qr[9], qr[0])
        circuit.u3(1.7728411151289603, 0.0, 0.0, qr[0])
        circuit.cx(qr[0], qr[9])
        circuit.u3(2.4866395967434443, 0.48684511243566697,
                   -3.0069186877854728, qr[9])
        circuit.u3(1.7369112924273789, -4.239660866163805, 1.0623389015296005,
                   qr[0])
        circuit.barrier(qr)
        circuit.measure(qr, cr)

        try:
            dags = transpiler.transpile(circuit, backend)
        except QISKitError:
            dags = None
        self.assertIsInstance(dags[0], DAGCircuit)
Exemple #13
0
    a = get_value_a(N)

    """ If user wants to force some values, he can do that here, please make sure to update the print and that N and a are coprime"""
    print('Forcing N=15 and a=4 because its the fastest case, please read top of source file for more info')
    N = 15
    a = 4

    """ Get n value used in Shor's algorithm, to know how many qubits are used """
    n = math.ceil(math.log(N, 2))

    print('Total number of qubits used: {0}\n'.format(4 * n + 2))

    """ Create quantum and classical registers """

    """auxilliary quantum register used in addition and multiplication"""
    aux = QuantumRegister(n + 2)
    """quantum register where the sequential QFT is performed"""
    up_reg = QuantumRegister(2 * n)
    """quantum register where the multiplications are made"""
    down_reg = QuantumRegister(n)
    """classical register where the measured values of the QFT are stored"""
    up_classic = ClassicalRegister(2 * n)

    """ Create Quantum Circuit """
    circuit = QuantumCircuit(down_reg, up_reg, aux, up_classic)

    """ Initialize down register to 1 and create maximal superposition in top register """
    circuit.h(up_reg)
    circuit.x(down_reg[0])

    """ Apply the multiplication gates as showed in the report in order to create the exponentiation """
Exemple #14
0
    def compute_circuit(self):
        qr = QuantumRegister(self.max_wires, 'q')
        qc = QuantumCircuit(qr)

        for column_num in range(self.max_columns):
            for wire_num in range(self.max_wires):
                node = self.nodes[wire_num][column_num]
                if node:
                    if node.node_type == node_types.IDEN:
                        # Identity gate
                        qc.id(qr[wire_num])
                    elif node.node_type == node_types.X:
                        if node.radians == 0:
                            if node.ctrl_a != -1:
                                if node.ctrl_b != -1:
                                    # Toffoli gate
                                    qc.ccx(qr[node.ctrl_a], qr[node.ctrl_b],
                                           qr[wire_num])
                                else:
                                    # Controlled X gate
                                    qc.cx(qr[node.ctrl_a], qr[wire_num])
                            else:
                                # Pauli-X gate
                                qc.x(qr[wire_num])
                        else:
                            # Rotation around X axis
                            qc.rx(node.radians, qr[wire_num])
                    elif node.node_type == node_types.Y:
                        if node.radians == 0:
                            if node.ctrl_a != -1:
                                # Controlled Y gate
                                qc.cy(qr[node.ctrl_a], qr[wire_num])
                            else:
                                # Pauli-Y gate
                                qc.y(qr[wire_num])
                        else:
                            # Rotation around Y axis
                            qc.ry(node.radians, qr[wire_num])
                    elif node.node_type == node_types.Z:
                        if node.radians == 0:
                            if node.ctrl_a != -1:
                                # Controlled Z gate
                                qc.cz(qr[node.ctrl_a], qr[wire_num])
                            else:
                                # Pauli-Z gate
                                qc.z(qr[wire_num])
                        else:
                            if node.ctrl_a != -1:
                                # Controlled rotation around the Z axis
                                qc.crz(node.radians, qr[node.ctrl_a],
                                       qr[wire_num])
                            else:
                                # Rotation around Z axis
                                qc.rz(node.radians, qr[wire_num])
                    elif node.node_type == node_types.S:
                        # S gate
                        qc.s(qr[wire_num])
                    elif node.node_type == node_types.SDG:
                        # S dagger gate
                        qc.sdg(qr[wire_num])
                    elif node.node_type == node_types.T:
                        # T gate
                        qc.t(qr[wire_num])
                    elif node.node_type == node_types.TDG:
                        # T dagger gate
                        qc.tdg(qr[wire_num])
                    elif node.node_type == node_types.H:
                        if node.ctrl_a != -1:
                            # Controlled Hadamard
                            qc.ch(qr[node.ctrl_a], qr[wire_num])
                        else:
                            # Hadamard gate
                            qc.h(qr[wire_num])
                    elif node.node_type == node_types.SWAP:
                        if node.ctrl_a != -1:
                            # Controlled Swap
                            qc.cswap(qr[node.ctrl_a], qr[wire_num],
                                     qr[node.swap])
                        else:
                            # Swap gate
                            qc.swap(qr[wire_num], qr[node.swap])

        return qc
Exemple #15
0
def conditional_circuits_2bit(final_measure=True, conditional_type='gate'):
    """Conditional test circuits on 2-bit classical register."""
    circuits = []
    qr = QuantumRegister(1)
    cond = ClassicalRegister(2, 'cond')
    if final_measure:
        cr = ClassicalRegister(1, 'meas')
        regs = (qr, cr, cond)
    else:
        regs = (qr, cond)

    # Conditional on 00 (cr = 00)
    circuit = QuantumCircuit(*regs)
    circuit.barrier(qr)
    add_conditional_x(circuit, qr[0], cond, 0, conditional_type)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # Conditional on 00 (cr = 01)
    circuit = QuantumCircuit(*regs)
    circuit.x(qr)
    circuit.measure(qr[0], cond[0])
    circuit.x(qr)
    circuit.barrier(qr)
    add_conditional_x(circuit, qr[0], cond, 0, conditional_type)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # Conditional on 00 (cr = 10)
    circuit = QuantumCircuit(*regs)
    circuit.x(qr)
    circuit.measure(qr[0], cond[1])
    circuit.x(qr)
    circuit.barrier(qr)
    add_conditional_x(circuit, qr[0], cond, 0, conditional_type)
    circuits.append(circuit)

    # Conditional on 00 (cr = 11)
    circuit = QuantumCircuit(*regs)
    circuit.x(qr)
    circuit.measure(qr[0], cond[0])
    circuit.measure(qr[0], cond[1])
    circuit.x(qr)
    circuit.barrier(qr)
    add_conditional_x(circuit, qr[0], cond, 0, conditional_type)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # Conditional on 01 (cr = 00)
    circuit = QuantumCircuit(*regs)
    add_conditional_x(circuit, qr[0], cond, 1, conditional_type)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # Conditional on 01 (cr = 01)
    circuit = QuantumCircuit(*regs)
    circuit.x(qr)
    circuit.measure(qr[0], cond[0])
    circuit.x(qr)
    circuit.barrier(qr)
    add_conditional_x(circuit, qr[0], cond, 1, conditional_type)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # Conditional on 01 (cr = 10)
    circuit = QuantumCircuit(*regs)
    circuit.x(qr)
    circuit.measure(qr[0], cond[1])
    circuit.x(qr)
    circuit.barrier(qr)
    add_conditional_x(circuit, qr[0], cond, 1, conditional_type)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # Conditional on 01 (cr = 11)
    circuit = QuantumCircuit(*regs)
    circuit.x(qr)
    circuit.measure(qr[0], cond[0])
    circuit.measure(qr[0], cond[1])
    circuit.x(qr)
    circuit.barrier(qr)
    add_conditional_x(circuit, qr[0], cond, 1, conditional_type)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # Conditional on 10 (cr = 00)
    circuit = QuantumCircuit(*regs)
    circuit.x(qr).c_if(cond, 2)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # Conditional on 10 (cr = 01)
    circuit = QuantumCircuit(*regs)
    circuit.x(qr)
    circuit.measure(qr[0], cond[0])
    circuit.x(qr)
    circuit.barrier(qr)
    add_conditional_x(circuit, qr[0], cond, 2, conditional_type)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # Conditional on 10 (cr = 10)
    circuit = QuantumCircuit(*regs)
    circuit.x(qr)
    circuit.measure(qr[0], cond[1])
    circuit.x(qr)
    circuit.barrier(qr)
    add_conditional_x(circuit, qr[0], cond, 2, conditional_type)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # Conditional on 10 (cr = 11)
    circuit = QuantumCircuit(*regs)
    circuit.x(qr)
    circuit.measure(qr[0], cond[0])
    circuit.measure(qr[0], cond[1])
    circuit.x(qr)
    circuit.barrier(qr)
    add_conditional_x(circuit, qr[0], cond, 2, conditional_type)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # Conditional on 11 (cr = 00)
    circuit = QuantumCircuit(*regs)
    circuit.barrier(qr)
    add_conditional_x(circuit, qr[0], cond, 3, conditional_type)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # Conditional on 11 (cr = 01)
    circuit = QuantumCircuit(*regs)
    circuit.x(qr)
    circuit.measure(qr[0], cond[0])
    circuit.x(qr)
    circuit.barrier(qr)
    add_conditional_x(circuit, qr[0], cond, 3, conditional_type)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # Conditional on 11 (cr = 10)
    circuit = QuantumCircuit(*regs)
    circuit.x(qr)
    circuit.measure(qr[0], cond[1])
    circuit.x(qr)
    circuit.barrier(qr)
    add_conditional_x(circuit, qr[0], cond, 3, conditional_type)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    # Conditional on 11 (cr = 11)
    circuit = QuantumCircuit(*regs)
    circuit.x(qr)
    circuit.measure(qr[0], cond[0])
    circuit.measure(qr[0], cond[1])
    circuit.x(qr)
    circuit.barrier(qr)
    add_conditional_x(circuit, qr[0], cond, 3, conditional_type)
    if final_measure:
        circuit.barrier(qr)
        circuit.measure(qr, cr)
    circuits.append(circuit)

    return circuits
Exemple #16
0
def make_circuit(n:int,f) -> QuantumCircuit:
    # circuit begin
    input_qubit = QuantumRegister(n,"qc")
    classical = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classical)
    prog.h(input_qubit[0]) # number=3
    prog.h(input_qubit[1]) # number=4
    prog.h(input_qubit[2]) # number=5
    prog.h(input_qubit[3]) # number=6
    prog.h(input_qubit[0]) # number=41
    prog.cz(input_qubit[1],input_qubit[0]) # number=42
    prog.h(input_qubit[0]) # number=43
    prog.z(input_qubit[1]) # number=37
    prog.h(input_qubit[0]) # number=51
    prog.cz(input_qubit[1],input_qubit[0]) # number=52
    prog.h(input_qubit[0]) # number=53
    prog.h(input_qubit[4])  # number=21
    prog.x(input_qubit[2]) # number=39

    Zf = build_oracle(n, f)

    repeat = floor(sqrt(2 ** n) * pi / 4)
    for i in range(repeat):
        prog.append(Zf.to_gate(), [input_qubit[i] for i in range(n)])
        prog.h(input_qubit[0])  # number=1
        prog.h(input_qubit[1])  # number=2
        prog.h(input_qubit[2])  # number=7
        prog.h(input_qubit[3])  # number=8
        prog.h(input_qubit[0]) # number=56
        prog.cz(input_qubit[3],input_qubit[0]) # number=57
        prog.h(input_qubit[0]) # number=58
        prog.h(input_qubit[0]) # number=48
        prog.cz(input_qubit[3],input_qubit[0]) # number=49
        prog.h(input_qubit[0]) # number=50
        prog.z(input_qubit[3]) # number=46
        prog.cx(input_qubit[3],input_qubit[0]) # number=47
        prog.x(input_qubit[4]) # number=40
        prog.cx(input_qubit[3],input_qubit[0]) # number=35


        prog.x(input_qubit[0])  # number=9
        prog.cx(input_qubit[0],input_qubit[1])  # number=29
        prog.x(input_qubit[1])  # number=30
        prog.cx(input_qubit[0],input_qubit[1])  # number=31
        prog.x(input_qubit[2])  # number=11
        prog.x(input_qubit[1]) # number=44
        prog.x(input_qubit[3])  # number=12

        if n>=2:
            prog.mcu1(pi,input_qubit[1:],input_qubit[0])

        prog.cx(input_qubit[1],input_qubit[0])  # number=24
        prog.x(input_qubit[0])  # number=25
        prog.cx(input_qubit[1],input_qubit[0])  # number=26
        prog.x(input_qubit[1])  # number=14
        prog.x(input_qubit[2])  # number=15
        prog.x(input_qubit[3])  # number=16


        prog.h(input_qubit[0])  # number=17
        prog.h(input_qubit[1])  # number=18
        prog.cx(input_qubit[4],input_qubit[3]) # number=54
        prog.h(input_qubit[2])  # number=19
        prog.h(input_qubit[3])  # number=20


    prog.x(input_qubit[1]) # number=22
    prog.y(input_qubit[1]) # number=32
    prog.x(input_qubit[1]) # number=23
    prog.cx(input_qubit[4],input_qubit[3]) # number=55
    # circuit end



    return prog
def evolution_instruction(pauli_list, evo_time, num_time_slices,
                          controlled=False, power=1,
                          use_basis_gates=True, shallow_slicing=False,
                          barrier=False):
    """
    Construct the evolution circuit according to the supplied specification.

    Args:
        pauli_list (list([[complex, Pauli]])): The list of pauli terms corresponding
                                               to a single time slice to be evolved
        evo_time (Union(complex, float, Parameter, ParameterExpression)): The evolution time
        num_time_slices (int): The number of time slices for the expansion
        controlled (bool, optional): Controlled circuit or not
        power (int, optional): The power to which the unitary operator is to be raised
        use_basis_gates (bool, optional): boolean flag for indicating only using basis
                                          gates when building circuit.
        shallow_slicing (bool, optional): boolean flag for indicating using shallow
                                          qc.data reference repetition for slicing
        barrier (bool, optional): whether or not add barrier for every slice

    Returns:
        Instruction: The Instruction corresponding to specified evolution.

    Raises:
        AquaError: power must be an integer and greater or equal to 1
        ValueError: Unrecognized pauli
    """

    if not isinstance(power, (int, np.int)) or power < 1:
        raise AquaError("power must be an integer and greater or equal to 1.")

    state_registers = QuantumRegister(pauli_list[0][1].num_qubits)
    if controlled:
        inst_name = 'Controlled-Evolution^{}'.format(power)
        ancillary_registers = QuantumRegister(1)
        qc_slice = QuantumCircuit(state_registers, ancillary_registers, name=inst_name)
    else:
        inst_name = 'Evolution^{}'.format(power)
        qc_slice = QuantumCircuit(state_registers, name=inst_name)

    # for each pauli [IXYZ]+, record the list of qubit pairs needing CX's
    cnot_qubit_pairs = [None] * len(pauli_list)
    # for each pauli [IXYZ]+, record the highest index of the nontrivial pauli gate (X,Y, or Z)
    top_xyz_pauli_indices = [-1] * len(pauli_list)

    for pauli_idx, pauli in enumerate(reversed(pauli_list)):
        n_qubits = pauli[1].num_qubits
        # changes bases if necessary
        nontrivial_pauli_indices = []
        for qubit_idx in range(n_qubits):
            # pauli I
            if not pauli[1].z[qubit_idx] and not pauli[1].x[qubit_idx]:
                continue

            if cnot_qubit_pairs[pauli_idx] is None:
                nontrivial_pauli_indices.append(qubit_idx)

            if pauli[1].x[qubit_idx]:
                # pauli X
                if not pauli[1].z[qubit_idx]:
                    if use_basis_gates:
                        qc_slice.u2(0.0, pi, state_registers[qubit_idx])
                    else:
                        qc_slice.h(state_registers[qubit_idx])
                # pauli Y
                elif pauli[1].z[qubit_idx]:
                    if use_basis_gates:
                        qc_slice.u3(pi / 2, -pi / 2, pi / 2, state_registers[qubit_idx])
                    else:
                        qc_slice.rx(pi / 2, state_registers[qubit_idx])
            # pauli Z
            elif pauli[1].z[qubit_idx] and not pauli[1].x[qubit_idx]:
                pass
            else:
                raise ValueError('Unrecognized pauli: {}'.format(pauli[1]))

        if nontrivial_pauli_indices:
            top_xyz_pauli_indices[pauli_idx] = nontrivial_pauli_indices[-1]

        # insert lhs cnot gates
        if cnot_qubit_pairs[pauli_idx] is None:
            cnot_qubit_pairs[pauli_idx] = list(zip(
                sorted(nontrivial_pauli_indices)[:-1],
                sorted(nontrivial_pauli_indices)[1:]
            ))

        for pair in cnot_qubit_pairs[pauli_idx]:
            qc_slice.cx(state_registers[pair[0]], state_registers[pair[1]])

        # insert Rz gate
        if top_xyz_pauli_indices[pauli_idx] >= 0:

            # Because Parameter does not support complexity number operation; thus, we do
            # the following tricks to generate parameterized instruction.
            # We assume the coefficient in the pauli is always real. and can not do imaginary time
            # evolution
            if isinstance(evo_time, (Parameter, ParameterExpression)):
                lam = 2.0 * pauli[0] / num_time_slices
                lam = lam.real if lam.imag == 0 else lam
                lam = lam * evo_time
            else:
                lam = (2.0 * pauli[0] * evo_time / num_time_slices).real

            if not controlled:
                if use_basis_gates:
                    qc_slice.u1(lam, state_registers[top_xyz_pauli_indices[pauli_idx]])
                else:
                    qc_slice.rz(lam, state_registers[top_xyz_pauli_indices[pauli_idx]])
            else:
                if use_basis_gates:
                    qc_slice.u1(lam / 2, state_registers[top_xyz_pauli_indices[pauli_idx]])
                    qc_slice.cx(ancillary_registers[0],
                                state_registers[top_xyz_pauli_indices[pauli_idx]])
                    qc_slice.u1(-lam / 2, state_registers[top_xyz_pauli_indices[pauli_idx]])
                    qc_slice.cx(ancillary_registers[0],
                                state_registers[top_xyz_pauli_indices[pauli_idx]])
                else:
                    qc_slice.crz(lam, ancillary_registers[0],
                                 state_registers[top_xyz_pauli_indices[pauli_idx]])

        # insert rhs cnot gates
        for pair in reversed(cnot_qubit_pairs[pauli_idx]):
            qc_slice.cx(state_registers[pair[0]], state_registers[pair[1]])

        # revert bases if necessary
        for qubit_idx in range(n_qubits):
            if pauli[1].x[qubit_idx]:
                # pauli X
                if not pauli[1].z[qubit_idx]:
                    if use_basis_gates:
                        qc_slice.u2(0.0, pi, state_registers[qubit_idx])
                    else:
                        qc_slice.h(state_registers[qubit_idx])
                # pauli Y
                elif pauli[1].z[qubit_idx]:
                    if use_basis_gates:
                        qc_slice.u3(-pi / 2, -pi / 2, pi / 2, state_registers[qubit_idx])
                    else:
                        qc_slice.rx(-pi / 2, state_registers[qubit_idx])
    # repeat the slice
    if shallow_slicing:
        logger.info('Under shallow slicing mode, the qc.data reference is repeated shallowly. '
                    'Thus, changing gates of one slice of the output circuit might affect '
                    'other slices.')
        if barrier:
            qc_slice.barrier(state_registers)
        qc_slice.data *= (num_time_slices * power)
        qc = qc_slice
    else:
        qc = QuantumCircuit(name=inst_name)
        for _ in range(num_time_slices * power):
            qc += qc_slice
            if barrier:
                qc.barrier(state_registers)
    return qc.to_instruction()
Exemple #18
0
def make_circuit(n: int, f) -> QuantumCircuit:
    # circuit begin
    input_qubit = QuantumRegister(n, "qc")
    classical = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classical)
    prog.h(input_qubit[0])  # number=3
    prog.h(input_qubit[1])  # number=4
    prog.h(input_qubit[2])  # number=5
    prog.h(input_qubit[1])  # number=29
    prog.cz(input_qubit[3], input_qubit[1])  # number=30
    prog.h(input_qubit[1])  # number=31
    prog.h(input_qubit[3])  # number=6
    prog.h(input_qubit[4])  # number=21

    Zf = build_oracle(n, f)

    repeat = floor(sqrt(2**n) * pi / 4)
    for i in range(repeat):
        prog.append(Zf.to_gate(), [input_qubit[i] for i in range(n)])
        prog.h(input_qubit[0])  # number=1
        prog.h(input_qubit[1])  # number=2
        prog.h(input_qubit[2])  # number=7
        prog.h(input_qubit[3])  # number=8

        prog.h(input_qubit[0])  # number=38
        prog.cz(input_qubit[1], input_qubit[0])  # number=39
        prog.h(input_qubit[0])  # number=40
        prog.h(input_qubit[0])  # number=51
        prog.cz(input_qubit[1], input_qubit[0])  # number=52
        prog.h(input_qubit[0])  # number=53
        prog.h(input_qubit[0])  # number=64
        prog.cz(input_qubit[1], input_qubit[0])  # number=65
        prog.h(input_qubit[0])  # number=66
        prog.x(input_qubit[0])  # number=49
        prog.h(input_qubit[0])  # number=57
        prog.cz(input_qubit[1], input_qubit[0])  # number=58
        prog.h(input_qubit[0])  # number=59
        prog.h(input_qubit[0])  # number=54
        prog.cz(input_qubit[1], input_qubit[0])  # number=55
        prog.h(input_qubit[0])  # number=56
        prog.h(input_qubit[4])  # number=41
        prog.h(input_qubit[0])  # number=61
        prog.cz(input_qubit[1], input_qubit[0])  # number=62
        prog.h(input_qubit[0])  # number=63
        prog.x(input_qubit[1])  # number=10
        prog.h(input_qubit[2])  # number=25
        prog.cz(input_qubit[0], input_qubit[2])  # number=26
        prog.h(input_qubit[2])  # number=27
        prog.x(input_qubit[2])  # number=23
        prog.cx(input_qubit[0], input_qubit[2])  # number=24
        prog.h(input_qubit[3])  # number=67
        prog.cz(input_qubit[0], input_qubit[3])  # number=68
        prog.h(input_qubit[3])  # number=69
        prog.x(input_qubit[3])  # number=33
        prog.h(input_qubit[3])  # number=42
        prog.cz(input_qubit[0], input_qubit[3])  # number=43
        prog.h(input_qubit[3])  # number=44

        if n >= 2:
            prog.mcu1(pi, input_qubit[1:], input_qubit[0])

        prog.x(input_qubit[0])  # number=13
        prog.rx(0.6157521601035993, input_qubit[1])  # number=60
        prog.x(input_qubit[1])  # number=14
        prog.x(input_qubit[2])  # number=15
        prog.x(input_qubit[3])  # number=16

        prog.h(input_qubit[0])  # number=17
        prog.h(input_qubit[1])  # number=18
        prog.h(input_qubit[2])  # number=19
        prog.h(input_qubit[3])  # number=20

    # circuit end

    return prog
Exemple #19
0
def make_circuit(n:int,f) -> QuantumCircuit:
    # circuit begin
    input_qubit = QuantumRegister(n,"qc")
    classical = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classical)
    prog.h(input_qubit[0]) # number=3
    prog.h(input_qubit[1]) # number=4
    prog.h(input_qubit[2]) # number=5
    prog.h(input_qubit[3]) # number=6
    prog.h(input_qubit[4])  # number=21

    Zf = build_oracle(n, f)

    repeat = floor(sqrt(2 ** n) * pi / 4)
    for i in range(1):
        prog.append(Zf.to_gate(), [input_qubit[i] for i in range(n)])
        prog.h(input_qubit[0])  # number=1
        prog.h(input_qubit[1])  # number=2
        prog.h(input_qubit[2])  # number=7
        prog.h(input_qubit[3])  # number=8


        prog.h(input_qubit[0])  # number=33
        prog.cz(input_qubit[1],input_qubit[0])  # number=34
        prog.h(input_qubit[0])  # number=35
        prog.rx(-0.7822565707438585,input_qubit[2]) # number=31
        prog.cx(input_qubit[1],input_qubit[0])  # number=40
        prog.x(input_qubit[0])  # number=41
        prog.cx(input_qubit[1],input_qubit[0])  # number=42
        prog.cx(input_qubit[1],input_qubit[0])  # number=30
        prog.cx(input_qubit[0],input_qubit[1])  # number=25
        prog.x(input_qubit[1])  # number=26
        prog.cx(input_qubit[0],input_qubit[1])  # number=27
        prog.cx(input_qubit[0],input_qubit[2])  # number=22
        prog.x(input_qubit[2])  # number=23
        prog.cx(input_qubit[0],input_qubit[2])  # number=24
        prog.x(input_qubit[3])  # number=12

        if n>=2:
            prog.mcu1(pi,input_qubit[1:],input_qubit[0])

        prog.x(input_qubit[0])  # number=13
        prog.x(input_qubit[1])  # number=14
        prog.x(input_qubit[2])  # number=15
        prog.x(input_qubit[3])  # number=16


        prog.h(input_qubit[0])  # number=17
        prog.h(input_qubit[3]) # number=37
        prog.cz(input_qubit[2],input_qubit[3]) # number=38
        prog.h(input_qubit[3]) # number=39
        prog.h(input_qubit[1])  # number=18
        prog.h(input_qubit[2])  # number=19
        prog.rx(2.5761059759436304,input_qubit[3]) # number=32
        prog.h(input_qubit[3])  # number=20

        prog.h(input_qubit[0])  
        prog.h(input_qubit[1])
        prog.h(input_qubit[2])
        prog.h(input_qubit[3])


    # circuit end

    for i in range(n):
        prog.measure(input_qubit[i], classical[i])


    return prog
    circuit.cx(register[0], register[1])
    circuit.h(register[1])
    circuit.x(register)
    circuit.h(register)


def calculate_cost(qc):
    pass_ = Unroller(['u3', 'cx'])
    pm = PassManager(pass_)
    new_circuit = pm.run(qc)
    structure = new_circuit.count_ops()
    print(structure)
    print('Cost: ' + str(structure['u3'] + structure['cx'] * 10))


qr = QuantumRegister(2)
cr = ClassicalRegister(2)

groverCircuit = QuantumCircuit(qr, cr)
groverCircuit.h(qr)

phase_oracle(groverCircuit, qr)
inversion_about_average(groverCircuit, qr)

groverCircuit.measure(qr, cr)

backend = BasicAer.get_backend('qasm_simulator')
shots = 1024
results = execute(groverCircuit, backend=backend, shots=shots).result()
answer = results.get_counts()
print(answer)
Exemple #21
0
def build_circuit(n: int, f: Callable[[str], str]) -> QuantumCircuit:
    # implement the Bernstein-Vazirani circuit
    zero = np.binary_repr(0, n)
    b = f(zero)

    # initial n + 1 bits
    input_qubit = QuantumRegister(n+1, "qc")
    classicals = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classicals)

    # inverse last one (can be omitted if using O_f^\pm)
    prog.x(input_qubit[n])
    # circuit begin
    prog.h(input_qubit[1])  # number=1
    prog.h(input_qubit[2]) # number=38
    prog.cz(input_qubit[0],input_qubit[2]) # number=39
    prog.h(input_qubit[2]) # number=40
    prog.h(input_qubit[2]) # number=59
    prog.cz(input_qubit[0],input_qubit[2]) # number=60
    prog.h(input_qubit[2]) # number=61
    prog.h(input_qubit[2]) # number=42
    prog.cz(input_qubit[0],input_qubit[2]) # number=43
    prog.h(input_qubit[2]) # number=44
    prog.h(input_qubit[2]) # number=48
    prog.cz(input_qubit[0],input_qubit[2]) # number=49
    prog.h(input_qubit[2]) # number=50
    prog.cx(input_qubit[0],input_qubit[2]) # number=54
    prog.x(input_qubit[2]) # number=55
    prog.h(input_qubit[2]) # number=67
    prog.cz(input_qubit[0],input_qubit[2]) # number=68
    prog.h(input_qubit[2]) # number=69
    prog.h(input_qubit[2]) # number=64
    prog.cz(input_qubit[0],input_qubit[2]) # number=65
    prog.h(input_qubit[2]) # number=66
    prog.cx(input_qubit[0],input_qubit[2]) # number=37
    prog.h(input_qubit[2]) # number=51
    prog.cz(input_qubit[0],input_qubit[2]) # number=52
    prog.h(input_qubit[2]) # number=53
    prog.h(input_qubit[2]) # number=25
    prog.cz(input_qubit[0],input_qubit[2]) # number=26
    prog.h(input_qubit[2]) # number=27
    prog.h(input_qubit[1]) # number=7
    prog.cz(input_qubit[2],input_qubit[1]) # number=8
    prog.rx(0.17592918860102857,input_qubit[2]) # number=34
    prog.rx(-0.3989822670059037,input_qubit[1]) # number=30
    prog.h(input_qubit[1]) # number=9
    prog.h(input_qubit[1]) # number=18
    prog.rx(2.3310617489636263,input_qubit[2]) # number=58
    prog.cz(input_qubit[2],input_qubit[1]) # number=19
    prog.h(input_qubit[1]) # number=20
    prog.x(input_qubit[1]) # number=62
    prog.y(input_qubit[1]) # number=14
    prog.h(input_qubit[1]) # number=22
    prog.cz(input_qubit[2],input_qubit[1]) # number=23
    prog.rx(-0.9173450548482197,input_qubit[1]) # number=57
    prog.cx(input_qubit[2],input_qubit[1]) # number=63
    prog.h(input_qubit[1]) # number=24
    prog.z(input_qubit[2]) # number=3
    prog.cx(input_qubit[2],input_qubit[1]) # number=70
    prog.cx(input_qubit[1],input_qubit[0]) # number=71
    prog.z(input_qubit[1]) # number=72
    prog.cx(input_qubit[1],input_qubit[0]) # number=73
    prog.x(input_qubit[1]) # number=17
    prog.y(input_qubit[2]) # number=5
    prog.x(input_qubit[2]) # number=21

    # apply H to get superposition
    for i in range(n):
        prog.h(input_qubit[i])
    prog.h(input_qubit[n])
    prog.barrier()

    # apply oracle O_f
    oracle = build_oracle(n, f)
    prog.append(
        oracle.to_gate(),
        [input_qubit[i] for i in range(n)] + [input_qubit[n]])

    # apply H back (QFT on Z_2^n)
    for i in range(n):
        prog.h(input_qubit[i])
    prog.barrier()

    # measure

    return prog
Exemple #22
0
# QISKITのクラス、関数をインポート
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
from qiskit import register, execute
#from qiskit.tools.visualization import plot_histogram
# 量子オラクル
from bernstein_vazirani_oracle import *

# 回路の作成
q = QuantumRegister(3)
# q = QuantumRegister(4)
c = ClassicalRegister(2)
# c = ClassicalRegister(3)
qc = QuantumCircuit(q, c)

qc.x(q[2])
#qc.x(q[3])
qc.h(q[0])
qc.h(q[1])
qc.h(q[2])
#qc.h(q[3])

Uf_2(qc, q, c)
# Uf_3(qc, q, c)

qc.h(q[0])
qc.h(q[1])
qc.h(q[2])
# qc.h(q[3])
qc.measure(q[0], c[0])
qc.measure(q[1], c[1])
# qc.measure(q[2], c[2])
# Batch size
batch_size = 100

 # Initialize qGAN
qgan = QGAN(real_data, bounds, num_qubits, batch_size, num_epochs, snapshot_dir=None)
qgan.seed = 1
# Set quantum instance to run the quantum generator
quantum_instance = QuantumInstance(backend=Aer.get_backend('statevector_simulator'))

# Set entangler map
entangler_map = [[0, 1]]

# Set an initial state for the generator circuit
init_dist = UniformDistribution(sum(num_qubits), low=bounds[0], high=bounds[1])
print(init_dist.probabilities)
q = QuantumRegister(sum(num_qubits), name='q')
qc = QuantumCircuit(q)
init_dist.build(qc, q)
init_distribution = Custom(num_qubits=sum(num_qubits), circuit=qc)
var_form = RY(int(np.sum(num_qubits)), depth=1, initial_state = init_distribution, 
              entangler_map=entangler_map, entanglement_gate='cz')
# Set generator's initial parameters
init_params = aqua_globals.random.rand(var_form._num_parameters) * 2 * np.pi
# Set generator circuit
g_circuit = UnivariateVariationalDistribution(int(sum(num_qubits)), var_form, init_params,
                                              low=bounds[0], high=bounds[1])
# Set quantum generator
qgan.set_generator(generator_circuit=g_circuit)
# Set classical discriminator neural network
discriminator = NumpyDiscriminator(len(num_qubits))
qgan.set_discriminator(discriminator)
Exemple #24
0
def make_circuit(n: int, f) -> QuantumCircuit:
    # circuit begin
    input_qubit = QuantumRegister(n, "qc")
    classical = ClassicalRegister(n, "qm")
    prog = QuantumCircuit(input_qubit, classical)
    prog.h(input_qubit[0])  # number=3
    prog.h(input_qubit[1])  # number=4
    prog.h(input_qubit[2])  # number=5
    prog.h(input_qubit[3])  # number=6
    prog.h(input_qubit[4])  # number=21
    prog.h(input_qubit[0])  # number=44
    prog.cz(input_qubit[3], input_qubit[0])  # number=45
    prog.h(input_qubit[0])  # number=46
    prog.cx(input_qubit[3], input_qubit[0])  # number=48
    prog.z(input_qubit[3])  # number=49
    prog.cx(input_qubit[3], input_qubit[0])  # number=50
    prog.h(input_qubit[0])  # number=51
    prog.cz(input_qubit[3], input_qubit[0])  # number=52
    prog.h(input_qubit[0])  # number=53
    prog.rx(0.11938052083641225, input_qubit[1])  # number=36
    prog.cx(input_qubit[1], input_qubit[2])  # number=47

    Zf = build_oracle(n, f)

    repeat = floor(sqrt(2**n) * pi / 4)
    for i in range(repeat):
        prog.append(Zf.to_gate(), [input_qubit[i] for i in range(n)])
        prog.h(input_qubit[0])  # number=1
        prog.rx(1.4765485471872026, input_qubit[2])  # number=35
        prog.h(input_qubit[1])  # number=2
        prog.h(input_qubit[2])  # number=7
        prog.h(input_qubit[3])  # number=8

        prog.cx(input_qubit[1], input_qubit[0])  # number=41
        prog.x(input_qubit[0])  # number=42
        prog.cx(input_qubit[1], input_qubit[0])  # number=43
        prog.x(input_qubit[4])  # number=30
        prog.x(input_qubit[1])  # number=10
        prog.x(input_qubit[2])  # number=11
        prog.rx(0.45238934211692994, input_qubit[3])  # number=38
        prog.y(input_qubit[1])  # number=39
        prog.rx(-2.5258404934861938, input_qubit[1])  # number=25
        prog.h(input_qubit[3])  # number=29
        prog.cx(input_qubit[0], input_qubit[3])  # number=22
        prog.x(input_qubit[3])  # number=23
        prog.cx(input_qubit[0], input_qubit[3])  # number=24

        if n >= 2:
            prog.mcu1(pi, input_qubit[1:], input_qubit[0])

        prog.x(input_qubit[0])  # number=13
        prog.rx(-0.0722566310325653, input_qubit[4])  # number=37
        prog.x(input_qubit[1])  # number=14
        prog.cx(input_qubit[0], input_qubit[2])  # number=26
        prog.x(input_qubit[2])  # number=27
        prog.h(input_qubit[4])  # number=40
        prog.cx(input_qubit[0], input_qubit[2])  # number=28
        prog.x(input_qubit[3])  # number=16

        prog.h(input_qubit[0])  # number=17
        prog.h(input_qubit[1])  # number=18
        prog.h(input_qubit[2])  # number=19
        prog.h(input_qubit[3])  # number=20

    # circuit end

    for i in range(n):
        prog.measure(input_qubit[i], classical[i])

    return prog
Exemple #25
0
# import all necessary objects and methods for quantum circuits
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit, execute, Aer
from math import acos, pi
# after Hadamard operators
u = [(63/64)**0.5,(1/64)**0.5]

def angle_between_two_states(u1,u2):
    dot_product = u1[0]*u2[0]+u1[1]*u2[1]
    return acos(dot_product)

theta = angle_between_two_states(u,[1,0])

all_visited_quantum_states =[]


qreg3 = QuantumRegister(1) # quantum register with 1 qubit
creg3 = ClassicalRegister(1) # classical register with 1 bit
mycircuit3 = QuantumCircuit(qreg3,creg3) # quantum circuit with quantum and classical registers


# set the qubit to |u> by rotating it by theta
mycircuit3.ry(2*theta,qreg3[0])

# read and store the current quantum state
current_state = execute(mycircuit3,Aer.get_backend('statevector_simulator')).result().get_statevector(mycircuit3)
[x,y] = [current_state[0].real,current_state[1].real]
all_visited_quantum_states.append([x,y,'u'])


# three iterations
for i in range(3): # 4,5,6,7,8,9,10