5
$\begingroup$

I am trying to make a quantum circuit with one qubit and 2 classical bits for each measurment in the system below: condition on the first measurment

I want to make condition on the first bit: if the first collapse to zero so x operator is act on the circuit, else (one) nothing is acting on the circuit.

I am using qiskit language.

but when I try to create my circuit, there is always an error:

#definitions
q = QuantumRegister(1)
c = ClassicalRegister(2)
qc = QuantumCircuit(q,c)

# building the circuit
qc.h(q)
qc.measure(q[0],c[0])
qc.x(q[0]).c[0]_if(c[0], 0)
qc.measure(q[0],c[1])
circuit_drawer(qc)

and the error is:

  File "<ipython-input-4-66c70285946b>", line 3
    qc.x(q[0]).c[0]_if(c[0], 0)
                     ^
SyntaxError: invalid syntax

how to write it correctly?

When I try to change

qc.x(q[0]).c[0]_if(c[0], 0)

with:

qc.x(q).c_if(c, 0)

I succeed in building my circuit but I get circuit that I don`t want to work with: Unwanted condition on measurment

I wish for help, thanks.

$\endgroup$

2 Answers 2

2
$\begingroup$

The controlled NOT gate does the opposite of what you want, it applies $X$ to the target qubit if the control qubit is 1, and does nothing if the control qubit is 0.

What you want is to apply $X$ when the control qubit is 0 and do nothing when it is 1. This can be accomplished by applying a NOT gate (i.e. an $X$ gate) before doing the CNOT.

In the IBM composer it would look like this:

enter image description here

The code for doing CNOT in quiskit is:

gate cx c,t {
 CX c,t; 
}

Since there is a specific gate for what you want to do, you do not need any "if statements"!

$\endgroup$
7
  • $\begingroup$ Do I need to put this algorithm between 2 measurments? $\endgroup$ Commented Sep 20, 2018 at 11:35
  • 1
    $\begingroup$ That depends on what you want to do. One thing I can say though, is that you second measurement should just read 0. $\endgroup$ Commented Sep 20, 2018 at 11:43
  • 1
    $\begingroup$ If that is all ou want to do, the circuit I gave you in my answer is enough. You don't need anything else. $\endgroup$ Commented Sep 20, 2018 at 12:02
  • 1
    $\begingroup$ It depends what you want to do brother. I have you the circuit for |00> to |01> and |10> to |10>. I don't know what your over goal is. $\endgroup$ Commented Sep 20, 2018 at 12:16
  • 1
    $\begingroup$ @DanielVainshtein: Considering how many follow-up questions you've asked, and the amount of effort put into the answer, it might be a good idea to show some appreciation when people invest their time to helping you :) $\endgroup$ Commented Sep 20, 2018 at 14:28
3
$\begingroup$

See the answer to this question for more on how the classical control works. Basically, your operations are controlled on the integer stored (in binary) across a register rather than on the individual bits themselves.

I also don't quite know the 'best practice' way of controlling on single bits, but I can tell you my workaround. Instead of creating a register with two bits, I create a list of two single qubit registers.

c = [ ClassicalRegister(1) for _ in range(2) ]

These can be added using the add method of a quantum circuit.

q = QuantumRegister(1)
qc = QuantumCircuit(q)
for register in c:
    qc.add_register( register )

Then it is possible to use your 'building the circuit' code can be done with

qc.h(q)
qc.measure(q,c[0])
qc.x(q[0]).c_if(c[0], 0)
qc.measure(q,c[1])
circuit_drawer(qc)

This works because c[0] now refers to a classical register, rather than a single bit from a classical register.

$\endgroup$
1
  • 1
    $\begingroup$ I think at some point the API changed, but in any case the method is now called add_register not just add. $\endgroup$ Commented Jan 2, 2020 at 10:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.