Why won't Qiskit ccx gate accept registers?












3












$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?










share|improve this question









New contributor




Woody1193 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$endgroup$

















    3












    $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?










    share|improve this question









    New contributor




    Woody1193 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.







    $endgroup$















      3












      3








      3





      $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?










      share|improve this question









      New contributor




      Woody1193 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.







      $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






      share|improve this question









      New contributor




      Woody1193 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question









      New contributor




      Woody1193 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question








      edited 12 hours ago









      Blue

      5,68221354




      5,68221354






      New contributor




      Woody1193 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 20 hours ago









      Woody1193Woody1193

      1184




      1184




      New contributor




      Woody1193 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      Woody1193 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      Woody1193 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






















          2 Answers
          2






          active

          oldest

          votes


















          4












          $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.






          share|improve this answer









          $endgroup$





















            3












            $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.






            share|improve this answer









            $endgroup$













              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
              });


              }
              });






              Woody1193 is a new contributor. Be nice, and check out our Code of Conduct.










              draft saved

              draft discarded


















              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









              4












              $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.






              share|improve this answer









              $endgroup$


















                4












                $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.






                share|improve this answer









                $endgroup$
















                  4












                  4








                  4





                  $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.






                  share|improve this answer









                  $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.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered 19 hours ago









                  NelimeeNelimee

                  1,452226




                  1,452226

























                      3












                      $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.






                      share|improve this answer









                      $endgroup$


















                        3












                        $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.






                        share|improve this answer









                        $endgroup$
















                          3












                          3








                          3





                          $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.






                          share|improve this answer









                          $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.







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered 18 hours ago









                          James WoottonJames Wootton

                          6,2821943




                          6,2821943






















                              Woody1193 is a new contributor. Be nice, and check out our Code of Conduct.










                              draft saved

                              draft discarded


















                              Woody1193 is a new contributor. Be nice, and check out our Code of Conduct.













                              Woody1193 is a new contributor. Be nice, and check out our Code of Conduct.












                              Woody1193 is a new contributor. Be nice, and check out our Code of Conduct.
















                              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.




                              draft saved


                              draft discarded














                              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





















































                              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







                              Popular posts from this blog

                              Список кардиналов, возведённых папой римским Каликстом III

                              Deduzione

                              Mysql.sock missing - “Can't connect to local MySQL server through socket”