নোট
এই পৃষ্ঠাটি tutorials/circuits/01_circuit_basics.ipynb -থেকে বানানো হয়েছে।
বর্তনীর (সার্কিট) প্রাথমিক ধারণা¶
এখানে, আমরা Qiskit এর সাথে কাজ করার একটি সাধারণ ধারণা পাবো। কোয়ান্টাম কম্পিউটারের প্রোগ্রাম করার জন্য প্রয়োজনীয় বিল্ডিং ব্লক Qiskit সরবরাহ করে। Qiskit এর মৌলিক এককটি হ’ল quantum circuit। Qiskit -এর প্রাথমিক কর্মপ্রবাহ দুটি ধাপ নিয়ে গঠিত: Build এবং Run। আপনি যে সমস্যার সমাধান করছেন তা প্রতিনিধিত্ব করার জন্য Build আপনাকে বিভিন্ন কোয়ান্টাম সার্কিট তৈরি করতে দেয় এবং Run আপনাকে বিভিন্ন ব্যাক-এন্ডে এগুলোকে চালানোর অনুমতি দেয়। কাজ সম্পাদনের পর, ডেটা সংগ্রহ করা হয় এবং পছন্দমত ফলাফলের উপর নির্ভর করে পরবর্তী গণনা করা হয়।
[1]:
import numpy as np
from qiskit import QuantumCircuit
বর্তনী (সার্কিট) নির্মাণ¶
প্রথম প্রোগ্রামের জন্য প্রয়োজনীয় মৌলিক উপাদানটি হল QuantumCircuit। আমরা তিনটি কিউবিট সমন্বিত একটি QuantumCircuit
তৈরির মাধ্যমে শুরু করব।
[2]:
# Create a Quantum Circuit acting on a quantum register of three qubits
circ = QuantumCircuit(3)
After you create the circuit with its registers, you can add gates ("operations") to manipulate the registers. As you proceed through the tutorials you will find more gates and circuits; below is an example of a quantum circuit that makes a three-qubit GHZ state
To create such a state, we start with a three-qubit quantum register. By default, each qubit in the register is initialized to \(|0\rangle\). To make the GHZ state, we apply the following gates: - A Hadamard gate \(H\) on qubit 0, which puts it into the superposition state \(\left(|0\rangle+|1\rangle\right)/\sqrt{2}\). - A Controlled-NOT operation (\(C_{X}\)) between qubit 0 and qubit 1. - A Controlled-NOT operation between qubit 0 and qubit 2.
একটি আদর্শ কোয়ান্টাম কম্পিউটারে, এই সার্কিটটি চালিয়ে প্রাপ্ত মান বা স্টেটটি উপরের GHZ মান বা অবস্থা হবে।
Qiskit এ ক্রিয়াকলাপগুলি সার্কিটের সাথে এক এক করে নিম্নলিখিতভাবে যুক্ত করা যেতে পারে।
[3]:
# Add a H gate on qubit 0, putting this qubit in superposition.
circ.h(0)
# Add a CX (CNOT) gate on control qubit 0 and target qubit 1, putting
# the qubits in a Bell state.
circ.cx(0, 1)
# Add a CX (CNOT) gate on control qubit 0 and target qubit 2, putting
# the qubits in a GHZ state.
circ.cx(0, 2)
[3]:
<qiskit.circuit.instructionset.InstructionSet at 0x7f7c92288310>
বর্তনী (সার্কিট) চিত্রায়ন করা¶
আপনি Qiskit QuantumCircuit.draw()
ব্যবহার করে সার্কিট চিত্রায়িত করতে পারেন যেরূপ বহুসংখ্যক পাঠ্যপুস্তকের মধ্যে সার্কিট থাকে।
[4]:
circ.draw('mpl')
[4]:
এই সার্কিটটিতে, কিউবিট-গুলি একটি ক্রমে রাখা হয়েছে যেখানে শূন্য কিউবিট একদম শীর্ষে এবং দ্বিতীয় কিউবিট একদম নিচে রয়েছে। সার্কিটটি বামদিক থেকে ডানদিকে পড়া হয় (যার অর্থ হল যেই গেটস গুলো সার্কিটে আগে প্রয়োগ করা হয়েছে সেই গুলো আরও বামদিকে প্রদর্শিত হবে)।
মাল্টি-কিউবিট (বহু কিউবিট) গঠনতন্ত্রের স্থিতি উপস্থাপন করার সময়, টেনসর যেই ক্রমে Qiskit এ ব্যবহৃত হয় সেটা বেশিরভাগ পদার্থবিজ্ঞান পাঠ্যপুস্তকের থেকে ভিন্ন। ধরে নেয়া যাক এখানে \(n\) qubits (কিউবিট) আছে এবং qubit (কিউবিট) \(j\) কে \(Q_{j}\) হিসাবে আখ্যায়িত আছে। Qiskit একটি ক্রম ব্যবহার করে যেটায় \(n^{\mathrm{th}}\) qubit (কিউবিট) টেনসর গুণফলের বামদিকে অবস্থান করে, যাতে বেসিস ভেক্টর (ভিত্তি দিকরাশি) গুলি কে \(Q_{n-1}\otimes \cdots \otimes Q_1\otimes Q_0\) ভাবে আখ্যায়িত হয়।
উদাহরণ স্বরূপ, যদি শূন্য কিউবিটটি 0 স্টেটে থাকে, প্রথম কিউবিটটি 0 স্টেটে থাকে, এবং দ্বিতীয় কিউবিটটি ১ স্টেটে থাকে, তাহলে Qiskit ওই স্টেটটাকে \(|100\rangle\) ভাবে উপস্থাপন করবে, যদিও বেশিরভাগ পদার্থবিজ্ঞানের পাঠ্যপুস্তকে ওটাকে \(|001\rangle\) ভাবে উপস্থাপন করা হয়।
আখ্যা দেত্তয়ার এই পার্থক্যটি প্রভাবিত করে যেভাবে মাল্টি-কিউবিট (বহু কিউবিট ) অপারেশনগুলি কে ম্যাট্রিক্স হিসাবে উপস্থাপন করে | উদাহরণস্বরূপ, Qiskit একটি কন্ট্রোল্ড-এক্স (\(C_{X}\)) অপারেশনে, কিউবিট 0 টি কন্ট্রল এবং কিউবিট ১ টা টার্গেট হিসাবে উপস্থাপন করে
বর্তনীর (সার্কিট) মহড়া (সিমুলেশন) করা¶
একটি সার্কিট অনুকরণ করার জন্য আমরা Qiskit এর quant_info মডিউল ব্যবহার করি। এই সিমুলেটরটি কোয়ান্টামের স্থিতি কে প্রত্যাবর্তন করে, যা \(2^n\) মাত্রাসম্পন্ন একটি জটিল দিকরাশি, যেখানে \(n\) হল কিউবিট-এর সংখ্যা (তাই এটি ব্যবহারের সময় সতর্কতা অবলম্বন করুন কারণ এটি আপনার মেশিনে চালানোর সময় দ্রুত খুব বড় হয়ে যাবে)।
মহড়াকারির (সিমুলেটর) দুটি পর্যায় আছে। প্রথমটি ইনপুট মান (স্টেট) সেট করা এবং দ্বিতীয়টি কোয়ান্টাম সার্কিটের মাধ্যমে স্টেট বিবর্তিত করা।
[5]:
from qiskit.quantum_info import Statevector
# Set the intial state of the simulator to the ground state using from_int
state = Statevector.from_int(0, 2**3)
# Evolve the state by the quantum circuit
state = state.evolve(circ)
#draw using latex
state.draw('latex')
[5]:
[6]:
from qiskit.visualization import array_to_latex
#Alternative way of representing in latex
array_to_latex(state)
[6]:
Qiskit আপনাকে এই অবস্থা (স্টেট) পরিদর্শনের জন্য একটি দৃশ্যায়ন সরঞ্জাম-বক্স (visualization toolbox) ও সরবরাহ করে।
নিচে, আমরা ভিজ্যুয়ালাইজেশন ফাংশনটি ব্যবহার করে qsphere এবং একটি হিন্টন প্লট করি, যা স্টেট ঘনত্ব ম্যাট্রিক্সের \(\rho\) বাস্তব এবং কাল্পনিক উপাদানগুলির প্রতিনিধিত্ব করে।
[7]:
state.draw('qsphere')
[7]:
[8]:
state.draw('hinton')
[8]:
বর্তনী (সার্কিট)-র ঐকিক (ইউনিটারি) উপস্থাপনা¶
Qiskit’s quant_info module also has an operator method which can be used to make a unitary operator for the circuit. This calculates the \(2^n \times 2^n\) matrix representing the quantum circuit.
[9]:
from qiskit.quantum_info import Operator
U = Operator(circ)
# Show the results
U.data
[9]:
array([[ 0.70710678+0.j, 0.70710678+0.j, 0. +0.j,
0. +0.j, 0. +0.j, 0. +0.j,
0. +0.j, 0. +0.j],
[ 0. +0.j, 0. +0.j, 0. +0.j,
0. +0.j, 0. +0.j, 0. +0.j,
0.70710678+0.j, -0.70710678+0.j],
[ 0. +0.j, 0. +0.j, 0.70710678+0.j,
0.70710678+0.j, 0. +0.j, 0. +0.j,
0. +0.j, 0. +0.j],
[ 0. +0.j, 0. +0.j, 0. +0.j,
0. +0.j, 0.70710678+0.j, -0.70710678+0.j,
0. +0.j, 0. +0.j],
[ 0. +0.j, 0. +0.j, 0. +0.j,
0. +0.j, 0.70710678+0.j, 0.70710678+0.j,
0. +0.j, 0. +0.j],
[ 0. +0.j, 0. +0.j, 0.70710678+0.j,
-0.70710678+0.j, 0. +0.j, 0. +0.j,
0. +0.j, 0. +0.j],
[ 0. +0.j, 0. +0.j, 0. +0.j,
0. +0.j, 0. +0.j, 0. +0.j,
0.70710678+0.j, 0.70710678+0.j],
[ 0.70710678+0.j, -0.70710678+0.j, 0. +0.j,
0. +0.j, 0. +0.j, 0. +0.j,
0. +0.j, 0. +0.j]])
OpenQASM ব্যাকএন্ড¶
উপরের সিমুলেটরগুলি দরকারী, কারণ তারা আদর্শ বর্তনী এবং বর্তনীর ম্যাট্রিক্স উপস্থাপনার দ্বারা দশার ফলাফল সম্পর্কে তথ্য সরবরাহ করে। যদিও একটি বাস্তব গবেষণা প্রতিটি কিউবিট measuring করে শেষ হয় (সাধারণত গণনা \(|0\rangle, |1\rangle\) ভিত্তিতে)। পরিমাপ ছাড়া আমরা দশা সম্পর্কে তথ্য অর্জন করতে পারি না। পরিমাপের কারণে কোয়ান্টাম সিস্টেমটি ধ্রুপদী বিটের মধ্যে পতিত হচ্ছে ।
উদাহরণস্বরূপ, ধরুন আমরা তিন-কিউবিট GHZ স্টেটের প্রতিটি কিউবিটে স্বাধীনভাবে পরিমাপ করি
এবং এটি ধরা যায় \(xyz\) ফলাফল বিটস্ট্রিংকে চিহ্নিত করে। স্মরণ করুন, Qiskit দ্বারা ব্যবহৃত কিউবিট নামাঙ্কনে, \(x\), কিউবিট ২ এর ফলাফলের সাথে, \(y\) কিউবিট ১ এ ফলাফলের সাথে, এবং \(z\) কিউবিট ০ এ ফলাফলের সাথে মিলিত হবে।
টীকা: বিটস্ট্রিংয়ের এই উপস্থাপনাটি বামদিকে সবচেয়ে উল্লেখযোগ্য বিট (MSB) এবং ডানদিকে অন্তত উল্লেখযোগ্য বিট (LSB) রাখে। এটি বাইনারি বিটস্ট্রিংয়ের প্রামাণ্য ক্রম। কিউবিট গুলি একই ক্রমানুসারে স্থাপন করা হয় (এম এস বি প্রতিনিধিত্বকারী কিউবিট গুলির সূচক ০ থাকে), তাই Qiskit প্রামাণ্য টেনসর টেনসর গুণন (প্রোডাক্ট) ব্যবহার করে না।
স্মরণ করুন, \(xyz\) ফলাফল পাওয়ার সম্ভাব্যতা হল
এবং যেমন GHZ স্টেটের ক্ষেত্রে 000 বা 111 পাওয়ার সম্ভাবনা উভয় ক্ষেত্রেই 1/2।
পরিমাপ অন্তর্ভুক্ত এমন একটি সার্কিট অনুকরণ করতে, আমাদের উপরের মূল সার্কিটটিতে পরিমাপ যুক্ত করতে হবে এবং একটি ভিন্ন Aer ব্যাকএন্ড ব্যবহার করতে হবে।
[10]:
# Create a Quantum Circuit
meas = QuantumCircuit(3, 3)
meas.barrier(range(3))
# map the quantum measurement to the classical bits
meas.measure(range(3), range(3))
# The Qiskit circuit object supports composition.
# Here the meas has to be first and front=True (putting it before)
# as compose must put a smaller circuit into a larger one.
qc = meas.compose(circ, range(3), front=True)
#drawing the circuit
qc.draw('mpl')
[10]:
এই বর্তনী (সার্কিট) একটি ধ্রুপদী (ক্লাসিক্যাল) রেজিস্টার এবং তিনটি পরিমাপ এর দ্বারা সার্কিট যোগ করে, যেগুলো কিউবিটের ফলাফল, ধ্রুপদী (ক্লাসিক্যাল) বিট গুলিতে সঞ্চয় করে।
বর্তনীটি(সার্কিট) সিমুলেট করার জন্য আপনি Qiskit এয়ার -এর qasm_simulator
ব্যবহার করতে পারেন। প্রত্যেকবার ফলাফল হিসাবে বিটস্ট্রিং ০০০ অথবা ১১১ পাওয়া যাবে। বিটস্ট্রিংগুলির বিতরণ সম্পর্কে পরিসংখ্যান তৈরি করতে (উদাহরণ: অনুমান \(\mathrm{Pr}(000)\)), আপনাদের বর্তনীটির (সার্কিট) পুনরাবৃত্তি করতে হবে। পুনরাবৃত্তির সংখ্যা execute
ফাংশনের shots
কীওয়ার্ড এর মাধ্যমে নির্ধারণ করা যায়।
[11]:
# Adding the transpiler to reduce the circuit to QASM instructions
# supported by the backend
from qiskit import transpile
# Use AerSimulator
from qiskit_aer import AerSimulator
backend = AerSimulator()
# First we have to transpile the quantum circuit
# to the low-level QASM instructions used by the
# backend
qc_compiled = transpile(qc, backend)
# Execute the circuit on the qasm simulator.
# We've set the number of repeats of the circuit
# to be 1024, which is the default.
job_sim = backend.run(qc_compiled, shots=1024)
# Grab the results from the job.
result_sim = job_sim.result()
আপনার কোনও ফলাফলের অবজেক্ট তৈরী হয়ে গেলে আপনি `` get_counts (circuit) `` ফাংশনটির মাধ্যমে পরিসংখ্যান গুলি পর্যবেক্ষণ করতে পারেন. এটি আপনাকে উপস্থাপিত সার্কিটের * একত্রিত (aggregated) * বাইনারি ফলাফল দেয়।
[12]:
counts = result_sim.get_counts(qc_compiled)
print(counts)
{'111': 522, '000': 502}
প্রায় 50 শতাংশ সময়, আউটপুট বিটস্ট্রিংটি 000। Qiskit plot_histogram
নামে একটি ফাংশনও সরবরাহ করে, যা আপনাকে ফলাফলগুলি দেখতে দেয়।
[13]:
from qiskit.visualization import plot_histogram
plot_histogram(counts)
[13]:
\(\mathrm{Pr}(000)\)mathrm{Pr}(111)` আনুমানিক সম্ভাবনার মান, সমস্ত পরিসংখ্যাকে শট সংখ্যা (বর্তনীটির পুনর্ব্যবহার সংখ্যা) দিয়ে ভাগ করে গণনা করা হয় । execute
ফাংশনের ``shots``কীওয়ার্ডের মান পরিবর্তন করে অনুমানযোগ্য সম্ভাবনাগুলির কিরূপ পরিবর্তন হয় তা দেখুন।
[14]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright
Version Information
Qiskit Software | Version |
---|---|
Qiskit | 0.26.2 |
Terra | 0.17.4 |
Aer | 0.8.2 |
Ignis | 0.6.0 |
Aqua | 0.9.1 |
IBM Q Provider | 0.13.1 |
System information | |
Python | 3.8.5 (default, Sep 4 2020, 07:30:14) [GCC 7.3.0] |
OS | Linux |
CPUs | 2 |
Memory (Gb) | 7.523967742919922 |
Fri Jun 04 17:48:05 2021 IST |
This code is a part of Qiskit
© Copyright IBM 2017, 2021.
This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.