Why won't Qiskit ccx gate accept registers?
$begingroup$
In Qiskit, they have the concept of a Toffoli gate (ccx
). However, the following code throws an error:
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
from qiskit import execute, Aer
q1 = QuantumRegister(2)
qctrl = QuantumRegister(1)
c = ClassicalRegister(2)
qc = QuantumCircuit(q1, qctrl, c)
qc.x(q1)
qc.ccx(q1[0], q1[1], qctrl)
qc.measure(q1, c)
backend_sim = Aer.get_backend('qasm_simulator')
job_sim = execute(qc, backend_sim)
result_sim = job_sim.result()
print(result_sim.get_counts(qc))
According to my knowledge and research, this should produce the output 111
but instead I get an error message:
qiskit.qiskiterror.QiskitError: "QuantumRegister(1, 'q0') is not a tuple. A qubit should be formated as a tuple."
This seems like a bug with Qiskit to me. Am I wrong? And if so, how can I fix my code?
programming qiskit
$endgroup$
add a comment |
$begingroup$
In Qiskit, they have the concept of a Toffoli gate (ccx
). However, the following code throws an error:
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
from qiskit import execute, Aer
q1 = QuantumRegister(2)
qctrl = QuantumRegister(1)
c = ClassicalRegister(2)
qc = QuantumCircuit(q1, qctrl, c)
qc.x(q1)
qc.ccx(q1[0], q1[1], qctrl)
qc.measure(q1, c)
backend_sim = Aer.get_backend('qasm_simulator')
job_sim = execute(qc, backend_sim)
result_sim = job_sim.result()
print(result_sim.get_counts(qc))
According to my knowledge and research, this should produce the output 111
but instead I get an error message:
qiskit.qiskiterror.QiskitError: "QuantumRegister(1, 'q0') is not a tuple. A qubit should be formated as a tuple."
This seems like a bug with Qiskit to me. Am I wrong? And if so, how can I fix my code?
programming qiskit
$endgroup$
add a comment |
$begingroup$
In Qiskit, they have the concept of a Toffoli gate (ccx
). However, the following code throws an error:
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
from qiskit import execute, Aer
q1 = QuantumRegister(2)
qctrl = QuantumRegister(1)
c = ClassicalRegister(2)
qc = QuantumCircuit(q1, qctrl, c)
qc.x(q1)
qc.ccx(q1[0], q1[1], qctrl)
qc.measure(q1, c)
backend_sim = Aer.get_backend('qasm_simulator')
job_sim = execute(qc, backend_sim)
result_sim = job_sim.result()
print(result_sim.get_counts(qc))
According to my knowledge and research, this should produce the output 111
but instead I get an error message:
qiskit.qiskiterror.QiskitError: "QuantumRegister(1, 'q0') is not a tuple. A qubit should be formated as a tuple."
This seems like a bug with Qiskit to me. Am I wrong? And if so, how can I fix my code?
programming qiskit
$endgroup$
In Qiskit, they have the concept of a Toffoli gate (ccx
). However, the following code throws an error:
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
from qiskit import execute, Aer
q1 = QuantumRegister(2)
qctrl = QuantumRegister(1)
c = ClassicalRegister(2)
qc = QuantumCircuit(q1, qctrl, c)
qc.x(q1)
qc.ccx(q1[0], q1[1], qctrl)
qc.measure(q1, c)
backend_sim = Aer.get_backend('qasm_simulator')
job_sim = execute(qc, backend_sim)
result_sim = job_sim.result()
print(result_sim.get_counts(qc))
According to my knowledge and research, this should produce the output 111
but instead I get an error message:
qiskit.qiskiterror.QiskitError: "QuantumRegister(1, 'q0') is not a tuple. A qubit should be formated as a tuple."
This seems like a bug with Qiskit to me. Am I wrong? And if so, how can I fix my code?
programming qiskit
programming qiskit
edited Jan 14 at 15:30
Blue♦
5,72921354
5,72921354
asked Jan 14 at 7:44
Woody1193Woody1193
1184
1184
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
$begingroup$
It is not a bug. Qiskit makes the difference between quantum registers and quantum bits. In your case, qctrl
is a QuantumRegister (as shown in your error) whereas the ccx
gate expect a qubit.
For Qiskit, a qubit is defined as a Tuple of a QuantumRegister and an index. You can get a qubit from a QuantumRegister by using the indexing notation: qtrl[0]
represents the first qubit (and the only one) of the QuantumRegister qctrl
.
In summary, replace
qc.ccx(q1[0], q1[1], qctrl)
by
qc.ccx(q1[0], q1[1], qctrl[0])
and your issue should be fixed.
$endgroup$
add a comment |
$begingroup$
Nelimee has provided the answer, but there's another point to note that is too big for a comment.
In Qiskit, it is possible to pass registers to gates instead of qubits. You do this in your example with
qc.x(q1)
This applied x
to both qubits in the register q1
, and so is equivalent to
for q in range(2):
qc.x(q1[n])
This should be regarded as a kind of shortcut notation. Providing single qubits is the 'proper way' to do it, and using registers is something that can be done to make your code a bit more elegant.
Like any shortcut, it should be used with care. Specifically, you have to remain consistent. So the problem in your case was supplying a single qubit for two arguments, and a single qubit register for the last. If you'd used single qubits for all, as in Nelimee's answer, then it would work. Using single qubit registers for all would also work. But mixing and matching does not.
$endgroup$
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
});
});
}, "mathjax-editing");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "694"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
noCode: true, onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fquantumcomputing.stackexchange.com%2fquestions%2f5197%2fwhy-wont-qiskit-ccx-gate-accept-registers%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
It is not a bug. Qiskit makes the difference between quantum registers and quantum bits. In your case, qctrl
is a QuantumRegister (as shown in your error) whereas the ccx
gate expect a qubit.
For Qiskit, a qubit is defined as a Tuple of a QuantumRegister and an index. You can get a qubit from a QuantumRegister by using the indexing notation: qtrl[0]
represents the first qubit (and the only one) of the QuantumRegister qctrl
.
In summary, replace
qc.ccx(q1[0], q1[1], qctrl)
by
qc.ccx(q1[0], q1[1], qctrl[0])
and your issue should be fixed.
$endgroup$
add a comment |
$begingroup$
It is not a bug. Qiskit makes the difference between quantum registers and quantum bits. In your case, qctrl
is a QuantumRegister (as shown in your error) whereas the ccx
gate expect a qubit.
For Qiskit, a qubit is defined as a Tuple of a QuantumRegister and an index. You can get a qubit from a QuantumRegister by using the indexing notation: qtrl[0]
represents the first qubit (and the only one) of the QuantumRegister qctrl
.
In summary, replace
qc.ccx(q1[0], q1[1], qctrl)
by
qc.ccx(q1[0], q1[1], qctrl[0])
and your issue should be fixed.
$endgroup$
add a comment |
$begingroup$
It is not a bug. Qiskit makes the difference between quantum registers and quantum bits. In your case, qctrl
is a QuantumRegister (as shown in your error) whereas the ccx
gate expect a qubit.
For Qiskit, a qubit is defined as a Tuple of a QuantumRegister and an index. You can get a qubit from a QuantumRegister by using the indexing notation: qtrl[0]
represents the first qubit (and the only one) of the QuantumRegister qctrl
.
In summary, replace
qc.ccx(q1[0], q1[1], qctrl)
by
qc.ccx(q1[0], q1[1], qctrl[0])
and your issue should be fixed.
$endgroup$
It is not a bug. Qiskit makes the difference between quantum registers and quantum bits. In your case, qctrl
is a QuantumRegister (as shown in your error) whereas the ccx
gate expect a qubit.
For Qiskit, a qubit is defined as a Tuple of a QuantumRegister and an index. You can get a qubit from a QuantumRegister by using the indexing notation: qtrl[0]
represents the first qubit (and the only one) of the QuantumRegister qctrl
.
In summary, replace
qc.ccx(q1[0], q1[1], qctrl)
by
qc.ccx(q1[0], q1[1], qctrl[0])
and your issue should be fixed.
answered Jan 14 at 8:32
NelimeeNelimee
1,452226
1,452226
add a comment |
add a comment |
$begingroup$
Nelimee has provided the answer, but there's another point to note that is too big for a comment.
In Qiskit, it is possible to pass registers to gates instead of qubits. You do this in your example with
qc.x(q1)
This applied x
to both qubits in the register q1
, and so is equivalent to
for q in range(2):
qc.x(q1[n])
This should be regarded as a kind of shortcut notation. Providing single qubits is the 'proper way' to do it, and using registers is something that can be done to make your code a bit more elegant.
Like any shortcut, it should be used with care. Specifically, you have to remain consistent. So the problem in your case was supplying a single qubit for two arguments, and a single qubit register for the last. If you'd used single qubits for all, as in Nelimee's answer, then it would work. Using single qubit registers for all would also work. But mixing and matching does not.
$endgroup$
add a comment |
$begingroup$
Nelimee has provided the answer, but there's another point to note that is too big for a comment.
In Qiskit, it is possible to pass registers to gates instead of qubits. You do this in your example with
qc.x(q1)
This applied x
to both qubits in the register q1
, and so is equivalent to
for q in range(2):
qc.x(q1[n])
This should be regarded as a kind of shortcut notation. Providing single qubits is the 'proper way' to do it, and using registers is something that can be done to make your code a bit more elegant.
Like any shortcut, it should be used with care. Specifically, you have to remain consistent. So the problem in your case was supplying a single qubit for two arguments, and a single qubit register for the last. If you'd used single qubits for all, as in Nelimee's answer, then it would work. Using single qubit registers for all would also work. But mixing and matching does not.
$endgroup$
add a comment |
$begingroup$
Nelimee has provided the answer, but there's another point to note that is too big for a comment.
In Qiskit, it is possible to pass registers to gates instead of qubits. You do this in your example with
qc.x(q1)
This applied x
to both qubits in the register q1
, and so is equivalent to
for q in range(2):
qc.x(q1[n])
This should be regarded as a kind of shortcut notation. Providing single qubits is the 'proper way' to do it, and using registers is something that can be done to make your code a bit more elegant.
Like any shortcut, it should be used with care. Specifically, you have to remain consistent. So the problem in your case was supplying a single qubit for two arguments, and a single qubit register for the last. If you'd used single qubits for all, as in Nelimee's answer, then it would work. Using single qubit registers for all would also work. But mixing and matching does not.
$endgroup$
Nelimee has provided the answer, but there's another point to note that is too big for a comment.
In Qiskit, it is possible to pass registers to gates instead of qubits. You do this in your example with
qc.x(q1)
This applied x
to both qubits in the register q1
, and so is equivalent to
for q in range(2):
qc.x(q1[n])
This should be regarded as a kind of shortcut notation. Providing single qubits is the 'proper way' to do it, and using registers is something that can be done to make your code a bit more elegant.
Like any shortcut, it should be used with care. Specifically, you have to remain consistent. So the problem in your case was supplying a single qubit for two arguments, and a single qubit register for the last. If you'd used single qubits for all, as in Nelimee's answer, then it would work. Using single qubit registers for all would also work. But mixing and matching does not.
answered Jan 14 at 9:15
James WoottonJames Wootton
6,3771943
6,3771943
add a comment |
add a comment |
Thanks for contributing an answer to Quantum Computing Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fquantumcomputing.stackexchange.com%2fquestions%2f5197%2fwhy-wont-qiskit-ccx-gate-accept-registers%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown