4
$\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$
3
$\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$
  • $\begingroup$ Do I need to put this algorithm between 2 measurments? $\endgroup$ – Daniel Vainshtein Sep 20 '18 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$ – user1271772 Sep 20 '18 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$ – user1271772 Sep 20 '18 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$ – user1271772 Sep 20 '18 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$ – user1271772 Sep 20 '18 at 14:28
1
$\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 )

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$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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