diff --git a/README.md b/README.md index 5394630..c2888ce 100644 --- a/README.md +++ b/README.md @@ -5,16 +5,16 @@ ```mermaid graph LR -Old("External") --> New("CT4106") -1o(Lecture 1) --> 1n(Lecture 1) -2o(Lecture 2) --> 2n(Lecture 2) -3o(Lecture 3) --> 3n(Lecture 3) -new1("New") --> 4n(Lecture 4) -new2("Guest 1") --> 5n(Lecture 5) -4o(Lecture 4) --> 6n(Lecture 6) -new3("Guest 2") --> 7n(Lecture 7) -5o(Lecture 5) & 6o(Lecture 6) --> 8n(Lecture 8) -new4("Guest 3") --> 9n(Lecture 9) -7o(Lecture 7) --> 10n(Lecture 10) & 11n(Lecture 11) -new5("ICHEC") --> 12n(Lecture 12) +Old("External") ==> New(["CT4106"]) +1o(Lecture 1) ==> 1n(Lecture 1) +2o(Lecture 2) ==> 2n(Lecture 2) +3o(Lecture 3) ==> 3n(Lecture 3) +new1("New") ==> 4n(Lecture 4) +new2("Guest 1") ==> 5n(Lecture 5) +4o(Lecture 4) ==> 6n(Lecture 6) +new3("Guest 2") ==> 7n(Lecture 7) +5o(Lecture 5) & 6o(Lecture 6) ==> 8n(Lecture 8) +new4("Guest 3") ==> 9n(Lecture 9) +7o(Lecture 7) ==> 10n(Lecture 10) & 11n(Lecture 11) +new5("ICHEC") ==> 12n(Lecture 12) ``` diff --git a/_toc.yml b/_toc.yml index a8d3f99..0e1f795 100644 --- a/_toc.yml +++ b/_toc.yml @@ -5,16 +5,16 @@ format: jb-book root: index chapters: -- file: lecture-01/demystifying-quantum-computing.md -- file: lecture-02/integrating-classical-and-quantum-computing.md -- file: lecture-03/from-bits-to-qubits.md -- file: lecture-04/mathematical-framework-for-qc.md -- file: lecture-05/intro-to-quantum-info.md -- file: lecture-06/realizing-quantum-computing-systems.md -- file: lecture-07/quantum-computing-hardwares.md -- file: lecture-08/accessing-quantum-computing-systems.md -- file: lecture-08/landscape-of-sdks-tools.md -- file: lecture-09/heterogeneous-quantum-computing.md -- file: lecture-10/quantum-algorithms-1.md -- file: lecture-11/quantum-algorithms-2.md -- file: lecture-12/quantum-activity-in-ichec.md + - file: lecture-01/demystifying-qc.md + - file: lecture-02/integrating-cc-and-qc.md + - file: lecture-03/from-bits-to-qubits.md + - file: lecture-04/math-for-qc.md + - file: lecture-05/intro-to-quantum-info.md + - file: lecture-06/realizing-qc-systems.md + - file: lecture-07/qc-hardwares.md + - file: lecture-08/accessing-qc-systems.md + - file: lecture-08/landscape-of-sdks-tools.md + - file: lecture-09/cloud-qc.md + - file: lecture-10/quantum-algorithms-1.md + - file: lecture-11/quantum-algorithms-2.md + - file: lecture-12/quantum-computing-ireland.md \ No newline at end of file diff --git a/index.md b/index.md index a435bb7..0f92c48 100644 --- a/index.md +++ b/index.md @@ -1,10 +1,10 @@ --- -title: Quantum Programming Certification Course (QPCC) +title: Quantum Programming Foundations Course CT4106 layout: home --- -# QPCC Lectures Overview +# CT4106 Lectures Overview -The Quantum Programming Certification Course (QPCC) is offered from ICHEC aimed at providing exposure into quantum computing with minimal technical prerequisits. It is evolving, and we are added more modules with time to make it more comprehensive and inclusive of the skills and knowledge of the quantum computing ecosystem. Below are the list of modules currently offered. +The Quantum Programming Foundations Course (CT4106) is offered from ICHEC aimed at providing exposure into quantum computing with minimal technical prerequisits. It is evolving, and we intend to add more modules with time to make it more comprehensive and inclusive of the skills and knowledge of the quantum computing ecosystem. Below are the list of modules currently offered. This page serves as the landing page for the lecture notes for each of the vidoe lectures in CT4106. ```{mermaid} @@ -46,28 +46,31 @@ mindmap ``` ## List of Lectures -- [Lecture 1 - Demystifying Quantum Computing](lecture-1/demystifying-quantum-computing.md) -- [Lecture 2 - Integrating Classical and Quantum Computing](lecture-2/integrating-classical-and-quantum-computing.md) -- [Lecture 3 - From Bits to Qubits](lecture-3/from-bits-to-qubits.md) -- [Lecture 4 - Realizing Quantum Computing Systems](lecture-4/realizing-quantum-computing-systems.md) -- [Lecture 5 - Accessing Quantum Computing Systems](lecture-5/accessing-quantum-computing-systems.md) -- [Lecture 6 - Landscape of Quantum SDK's and Tools](lecture-6/landscape-of-sdks-tools.md) -- [Lecture 7 - Landscape of Quantum algorithms](lecture-7/landscape-of-quantum-algorithms.md) - +- [Lecture 1 - Demystifying Quantum Computing](lecture-01/demystifying-quantum-computing.md) +- [Lecture 2 - Integrating Classical and Quantum Computing](lecture-02/integrating-classical-and-quantum-computing.md) +- [Lecture 3 - From Bits to Qubits](lecture-03/from-bits-to-qubits.md) +- [Lecture 4 - Mathematical Framework for Qubits](lecture-04/math-for-qc.md) +- [Lecture 5 - Guest Lecture: Introduction to Quantum Information & Cryptography](lecture-05/intro-to-quantum-info.md) +- [Lecture 6 - Realizing Quantum Computing Systems](lecture-06/realizing-qc-systems.md) +- [Lecture 7 - Guest Lecture: Building a Quantum Computer](lecture-07/qc-hardwares.md) +- Lecture 8 - Accessing and Programming Quantum Computing Systems + - [8a: Accessing Quantum Computing](lecture-08/accessing-qc-systems.md) + - [8b: Landscape of Quantum SDK's and Tools](lecture-08/landscape-of-sdks-tools.md) +- [Lecture 9 - Guest Lecture: Cloud Quantum computing Service](lecture-09/cloud-qc.md) +- [Lecture 10 - Quantum Algorithms - I](lecture-10/quantum-algorithms-1.md) +- [Lecture 11 - Quantum Algorithms - II](lecture-11/quantum-algorithms-2.md) +- [Lecture 12 - ICHEC's engagement in Quantum Computing](lecture-12/quantum-activity-in-ichec.md) --- ## Contact -For QPCC related queries, contact us or the instructors at following - +For course related queries, contact us or the instructors at following - | Name | Email | |--- |:---: | -| QPCC team | | | Emil Dimitrov | | | Karthik Krishnakumar | | -| Pablo Lauret | | -| Pablo Suárez Vieites | | | Rajarshi Tiwari | | | Venkatesh Kannan | | diff --git a/lecture-01/demystifying-quantum-computing.md b/lecture-01/demystifying-qc.md similarity index 100% rename from lecture-01/demystifying-quantum-computing.md rename to lecture-01/demystifying-qc.md diff --git a/lecture-02/integrating-classical-and-quantum-computing.md b/lecture-02/integrating-cc-and-qc.md similarity index 98% rename from lecture-02/integrating-classical-and-quantum-computing.md rename to lecture-02/integrating-cc-and-qc.md index 4ea3ac1..91748ea 100644 --- a/lecture-02/integrating-classical-and-quantum-computing.md +++ b/lecture-02/integrating-cc-and-qc.md @@ -61,6 +61,10 @@ And, the importance of doing this as a part of existing HPC software methods and ### Quantum Computation Workflow Before going forward with some specific examples of potential hybrid high-performance quantum computing applications, let us look deeper into the quantum computing part of an application workflow. +```{image} ../prep/images/Computation_map.jpg +:align: center +``` + Presently, all data is generated and stored in classical format – that is in binary as bits. This is represented by the first letter in this map where C represents generation of classical data. This classical data is then processed by classical computing systems in classical formats. This is represented by the second letter in the map where C represents classical nature of the processing/computing system. Thus, the top left category CC is the scenario where classical data is generated and stored is processed by classical computing systems. @@ -69,9 +73,11 @@ Towards the end of this lecture, we will highlight quantum sensing and metrology QC is the scenario where quantum data may be used for classical computing systems, an example is where classical applications such as machine learning models could be useful to study the internal state of a quantum system and associated quantum data. And, QQ is where quantum data is processed by quantum computers. This quantum data may come from measuring a quantum system through quantum sensing and metrology technologies, or quantum data within a quantum computer to simulate a quantum system such as a physics or molecular models. -Now, the highlighted category CQ is the scenario where quantum computing systems process classical data. The data can be constituted of any kind of observations from classical systems such as text, images, time series, structured or unstructured data. In this scenario, is necessary to translate the classical data and represent it as quantum data within a quantum computer for it to be processed. This is illustrated in the workflow on the right. +Now, the highlighted category CQ is the scenario where quantum computing systems process classical data. The data can be constituted of any kind of observations from classical systems such as text, images, time series, structured or unstructured data. In this scenario, is necessary to translate the classical data and represent it as quantum data within a quantum computer for it to be processed. This is illustrated in the workflow below. -<> +```{image} ../prep/images/workflow_quantum.png +:align: center +``` The classical input data is prepared into quantum data through a step commonly referred to as quantum encoding or state preparation. The result is quantum states in which a set of qubits are used to represent the data as a superposition – do not worry about the terminologies and complexities now – if you continue with future lectures, these are introduced more understandably. For now, it is essential to just acknowledge that classical input data has to be encoded into quantum states, which can then be processed by a quantum program which is defined using a series of quantum operations. These quantum operations process the initial quantum state into a resultant quantum state. At the end of the processing, in order to get the quantum results out of the quantum computer, a series of steps have to be performed. The first of these steps is to perform measurements to read what are called observables of the quantum computing system. Let’s pause here for a moment. In the lecture on “Demystifying quantum computing”, we discussed that there are several technology options available to engineer and develop a quantum computer – using superconductors, photons, neutral atoms, ions, etc. – each with its own pros and cons. Depending on the technology used to implement a quantum processor, the observables of the quantum system that will be measured may be different. For a photon-based quantum computer, the observables can be phase, polarisation and wavelength. Irrespective of this, the observables are measured to describe the state of a quantum system. diff --git a/lecture-04/math-for-qc.md b/lecture-04/math-for-qc.md new file mode 100644 index 0000000..8be5060 --- /dev/null +++ b/lecture-04/math-for-qc.md @@ -0,0 +1,1399 @@ +--- +title: Mathematical framework for Quantum Computing +jupytext: + formats: md:myst + text_representation: + extension: .md + format_name: myst +kernelspec: + display_name: Python 3 + language: python + name: python3 +mystnb: + render_markdown_format: myst +--- + +(lecture-4)= +# Lecture 4: Mathematical framework for Quantum Computing + +```{warning} These lecture notes are a work in progress and are not a replacement for watching the lecture video, it's intended to be a supplementary reading after watching the lecture +``` + + +```{admonition} Learning outcomes +:class: tip + +In this lecture we discuss the mathematical framework and tools required to properly understand how quantum system works. We give a short introduction to notion of vector spaces, linear operators, and how they connect to physical reality. +``` + +## Postulates of Quantum Physics +Let us go through some of the building blocks of quantum mechanics, and see how the required mathematical framework emerges. + +### Uncertainty Principle +It is a fundamental principle of quantum mechanics, which states that certain pairs of physical properties can't be measured simultaneously with arbitrary precision, for example a particle's position and momentum. The properties which can form such pairs are called conjugate properties to each other. In the coming sections we will discuss more about them. In fact the product of uncertainties of the conjugate properties is bounded below. If the conjugate properties are $A$ and $B$, and the standard deviation or uncertainties in their simulaneous measurement in a given experiment are $\sigma_A$ and $\sigma_B$, then + +$$ +\sigma_A \sigma_B \ge \frac{h}{4\pi} +$$ + +where $h$ is Plank's constant. + +### State as an abstract vector + +In everyday life we use the term `state` when we refer to the situation/condition somebody or something is in. We make it more comprehensive by adding adjectives to it, such as *in state of weakness*, *in state of pain*, etc. In case of a physical system, the same idea extends to a comprehensive definition, with quantifiability. The state of a physical system refers to something that can provide complete physically accessible information about the system at a given instant of time. This is quantified with first determining the number of independent quantities required for complete information, and then assigning a variable for each of those. +A numerical value of each of those variable defines the state of the system. Formally - + +> A **state** is a **set of variables** describing a system which does not include anything about its history. + +This set of variable is assumed to be *minimal* so that removing any component results in only partial information about the system. Take for example the case of a single isolated particle. +Then it's position and velocity are two independent minimal properties. If the motion of this particle is constrained along a line, then a variable $x$ denoting it's distance from a chosen origin on the line completely determines it's position, and it's time derivative $v = \frac{dx}{dt}$ determines the velocity. Thus together, $(x, v)$ define the state of the particle. +If the motion was not constrained, one would need three coordinates $(x, y, z)$ for position, and three components of velocity $(v_x, v_y, v_z)$ with respect to a given reference frame. Thus collectively a set of six variables $(x, y, z, v_x, v_y, v_z)$ defines the state of a particle. For a system of many particles, the variables are concatenated, and the set becomes bigger. For $N$ particle system, the set contains $6N$ variables. + +Note that this set has to be ordered so there is no confusion in the meaning of each of its elements. Such ordered sets are essentially what one calls vectors. We discuss vectors in more details in the coming sections. + +>> Add Figure + + +```{margin} +A reference frame refers to a chosen point of origin, and a given orientation of coordinate axes in which a position is measured. +``` + +```{admonition} Degrees of Freedom +:class: tip +The degrees of freedom of a system is a number associated with it. It is the number of independent ways one +can change the system's state. Alternatively, it's also the minimum number of individual quantities required to specify the state. +``` + +In case of single particle, it's degrees of freedom is 6. For a system of $N$ particles, it's $6N$. + +Now consider a quantum particle, and think whether we can use the above mentioned set of positions and velocities/momenta $(x, y, z, v_x, v_y, v_z)$ can describe the state of quantum particle. Due to uncertainty principle, we immediately run into a problem, because the position $x$, and velocity $v_x$ can not be accurately determined simultaneously. Thus the set of position and velocity variables can not provide complete information about particle's state. + +So how do we define state of a quantum system? Here one postulates, that it is possible to define a `state` of a quantum system, represented as some type of abstract object. This object will likely have multiple components associated with it, one for each degree of freedom. It will thus be a vector +of some kind. For the moment we call it an abstract vector, as we don't know it's structure. As we go throught the sections, we will explore how this structure emerges, and how it works. + +So, for the moment, we say that the state of a quantum system is represented by an abstract vector. In due course we will learn several synonyms for this abstract vector defining the state of a quantum system. + +--- + +### Superposition principle + +Superposition, issentially means applying multiple effect/stimuli/attributes on a system/object. + +In general, the superposition principle applies to anywhere more than one attributes can be imposed on a single object. +Formally speaking, the principle states that in all linear systems, the net response caused by two or more stimuli on a system is sum of the individual responses that would have been caused by each individual stimulus. + +> The sum of responses of individual effects, is same as the response of the sum of individual effecs. + +Once we go through the mathematical structure in the coming sections, it will become clear that the superposition principle issentially is a consequence of **linearity** in the system, or linear behaviour. + +In quantum mechanics, the superposition applies to states. What that means is, that if a system can exist in say two states $A$ and $B$, then it can also exist in a superposition of $A$ and $B$. In the section below we will learn how to interpret such a thing mathematically, but for now we can intuitively speculate, that a superposition of two states should have properties resembling both the states even though the two state might be very different. + +>> Figure for illustration + +### Role of interference +The notion of intereference is quantum systems is very similar to what it means in waves. When two waves are combined, their instantaneous intensities or displacements are added. The intensity or displacement of the resulting wave can be greater or lower depending on their `relative phase`. + +![](https://upload.wikimedia.org/wikipedia/commons/5/5d/Waventerference.gif) + +In case of quantum system, as we will see, probability amplitudes take the role of intensity or displacements. + +### Principles of measurement +In quantum mechanics, a measurement is testing or manipulation of a physical system that yields a numerical result. +This in principle doesn't look much different than a measurement of a classical system. However, in the quantum realm, +the process of `measureing` something also changes the underlying system. + + +### No-cloning + + +### Entanglement +### Tunnelling + +--- +## Mathematica Structure + +Here we discuss in bravety the necessary mathematical structures upon which the formulation of quantum mechanics relies on. +It progressively goes as follows - +```{mermaid} +mindmap +root(Mathematical Framework) + Vector Space, Hilbert Space + Scalar vs Vector + States as Vector (Bra and Ket) + Linear combination + Linear independence + Inner Product + Overlap of vectors + Orthogonality + Linear Operators + Commutativity + Special operators: Unitary, Hermitian, ... + Probability conservation + Representation theory +``` + +### Scalar vs Vector + +Any quantity that can be described by a single numerical value, usually with real, and sometimes with complex numbers is a scalar. +The common examples of scalars are volume, density, speed, energy, mass and time. + +Quantities require multiples of numerical values, with each value describing some aspect or attribute of the quantities, are called vectors. The number of these values is called the `dimension` of the vector. Common examples of vector quantities from physics include position, velocity, momentum, and force. They all have two common attributes, (i) a **magnitude**, and (ii) a **direction** associated with them. + +Both scalars and vectors are represented usually with real numbers, and often with complex numbers. So the notions of `addition`, `subtraction`, `multiplication` and `division`, +through which we manipulate numbers, are suitably extended on scalars and vectors. + +**Scalars**: are expressed in terms of single number, so their algebra is essentially the same as algebra of real/complex numbers they are expressed in. + +**Vectors**: are expressed in terms of multiple numbers. So it's not straight forward as to how to manipulate vectors, based on scalars, or formally extend their algebra from the component numbers. We see below how this is done. + +**Vector Space, Hilbert Space**: A Vector space is a mathematical structure, that constitutes the necessary components to manipulate vectors in sensible way. Before we define it, we need to understand a few definitions, namely `Set`, `map`, `Binary operations`, `Group` and `Field` - + +### Set +Learning the notion of sets, and their manipulation provide not only training in fundamentals of logic of categorisation, organisation, it is crucial building block of most of mathematics. + +In Mathematics, a set is defined as a unique collection of well defined objects[^1], and the object in the collection are called elements of the set. + +For example, + +- $A=\{a, e, i, o, u\}$ is a set of vowels in english language. +- $\mathbb{Z} = \{0, \pm1, \pm2, \pm3,\dots\}$ is the set of integers. + +It's important to imphesise the important of uniqueness in a set. It means in that in a set, a member exists only once. Thus $A=\{a, e, i, o, u\}$ is a well defined set, while $A=\{a, e, i, o, u, a, i\}$ is not, as $a, i$ are put twice. So a set is different than a mere list, which can have multiple occurrance of an object. + +Secondly, the order of elements in a set have no meaning, so $\{a, e, i, o, u\}$ and say, $\{i, o, a, u, e\}$ are same sets, just expressed differently. + +A set is expressed with mainly two ways: +1. **Roster method**: This is the method where we list all the elements of the set, in no particular order, and put them in curly braces. The set of vowels, $\{a, e, i, o, u\}$ is one such examples. It is the simplest method, but becomes inconvenient for sets with large number of elements, or infinite number of elements. + +2. **Set builder/logical method**: In this method, instead of trying to list elements one by one, we name a representative element, and describe it's specific properties that make it a member of the set. For example, see below, and example of set builder method. + +$$ +B = \{a| a\in \mathbb{Z}, \text{ and } a \text{ is even}\} +$$ + +The above is seen or read as "B equals a set of all '$a$' such that $a$ is an integer, and $a$ is even". Equivalently, B is set of all even integers. The roster version of this would be $B = \{\dots, -3, -2, -1, 0, 1, 2, 3, \dots\}$. + + +A set can be finite, or infinite, that is, the number of elements in a set can be finite, or infinite. + +You can manipulate a set, by adding or removing elements from it. A set with no elements is called `Null set`, denoted by $\emptyset$. + +Sets can be finite and infinite. We all know what being finite is, so a finite set is a set with finite number of elements which one could count. + +Infinite is a slightly tricky concept in mathematics. To start with, an infinite set is a set that **is not** finite. + +The set of natural numbers $\mathbb{N} = \{1, 2, 3, \dots\}$ plays a central role in the categorisation of sets. First, it let's us define countability. So a set in which you could count the number of elements one by one, is called countable. If the counting finishes after finite number, the set is finite and countable. If you can count, and the counting can not finish in finite time, the set is said to be countably infinite. By definition or axiom, the set of natural number is countably infinite. **Uncountable** sets on the other hand, are the ones that are inifinite, and contains too many elements to be even countable. + +We use the term **cardinality** for representing a measure of number of elements in a set. The cardinality of a finite set is the number of elements in it. For infinite sets, the cardinality is symbolic and is established by comparison of two sets and defining map among them. + + + +#### Subsets +Imagine we have two sets, A and B, and it is such that, every element of A is also element of B, then we say that A is a subset of B. It is denoted as $A\subset B$. We also in this case, call B as **superset** of A. + +Naturally, every set is subset and superset of itself. We a call a set A to be a **proper subset** of B, if every element of A is in B, but at least one element exists in B that is not in A. In this case, B is called a **proper superset** of A. + +For finite sets, their proper subsets have strictly lower number of element than the set itself. However for infinite sets, a proper subset may +have same cardinality as the set itself. + + +```{figure} https://upload.wikimedia.org/wikipedia/commons/b/b0/Venn_A_subset_B.svg +:align: center +:width: 400px + +A is subset of B, and B is superset of A +``` + +```{figure} https://upload.wikimedia.org/wikipedia/commons/a/a0/NumberSetinC.svg +:align: center +:width: 400px + +Visualisation of the set of numbers, natural numbers $\mathbb{N}$, integers $\mathbb{Z}$, rational numbers $\mathbb{Q}$, real numbers $\mathbb{R}$, and complex numbers $\mathbb{C}$. We have following $\mathbb{N}\subset \mathbb{Z}\subset \mathbb{Q}\subset \mathbb{R}\subset \mathbb{C}$ +``` + +```{code-cell} +:align: center +:tags: ["remove-input"] +# Library +from matplotlib import pyplot as plt +from matplotlib_venn import venn2 + +# Basic Venn +v = venn2((10, 12, 10), ("A", "B", "AB"), alpha = 0.5) + +# Change Backgroud +plt.gca().set_facecolor('white') +plt.gca().set_axis_on() + +# Show it +plt.show() +``` + + +We defined what a set is, and introduced a notion of comparison by defining what a subset, and superset is. There is a lot more one can do with the notion of sets, to manipulate them, to the extent that it looks like everyday algebra. + +- **Universal set:** For a given consideration of problem, a universal set $U$ is set of all elements considered, and fixed, so that every set defined for the problem, is a subset of $U$. + + +- **Complement:** Compliment of a set A, denoted by $A'$, or sometimes $A^c$ is defined with respect to the universal set, is set of all elements of $U$ that are not in A. + +``````{sidebar} +```{figure} ./set-union-inters-diff.jpg +Set Union, intersection and set difference. +``` +`````` + + +- **Union:** A union of two sets, say A and B, denoted as $A\cup B$ is defined as the set of all elements that belong to either A, or B, or both. For example, if $A=\{1,2,3,4\}$ and $B=\{1,3,5,7\}$, then + +$$A\cup B = \{1, 2, 3, 4, 5, 7\}$$ + +- **Intersection:** An intersection of two sets, say A and B, denoted as $A\cap B$ is defined as set of all elements that belong to both A and B. + +- **Difference:** The set difference of A from B, denote as $A-B$, is set of all elements of A that are not elements of B. + +- **Cartesian Product:** A cartesian product of two sets, say A and B, denoted by $A\times B$ is the set of all ordered pairs $(a, b)$ such that $a$ belongs to A, and $b$ belongs to B. + +For examples, if $A=\{a, b, c\}$ and $B=\{x, y, z\}$ then + +$$ +A\times B = \{(a, x), (a, y), (a, z), +(b, x), (b, y), (b, z), +(c, x), (c, y), (c, z)\} +$$ + + +### Map +In mathematics, a map is somethings that defines a symbolic relation from elements of a set **X** to elements of another set **Y**, such that each element of **X** gets associated to an element of **Y**. The set **X** whose elemets get `mapped to` is called the **domain of the map** and the set **Y** the elements of which they get `mapped from` is called the **range or codomain of the map**. + +Symbolically, a map is expressed as follows + +- We say that $f$ is a map from X to Y by $f: X\longrightarrow Y$ +- For an element $x$ in X, the element in Y it maps to, is expressed as $f(x)$. +- The element $f(x)$ belongs to Y, and is called the **image** of $x$. + +```{figure} https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Function_color_example_3.svg/1024px-Function_color_example_3.svg.png +:align: center +:width: 70% +``` + +- The map, mapping, correspondence are synonyms. Usually, if the set is of numbers, they are also called functions. + +- A map between two sets let's us see a holistic relation between them. + +- If distinct elements of the domain set X get mapped to distinct elements of the codomain set Y, the map is called **injective, or one-to-one**. For example, consider the set of integers $\mathbb{Z}$, and a map $f: \mathbb{Z} \longrightarrow \mathbb{Z} $ such that $f(x) = 3 x$. This is an injective map from $\mathbb{Z}$ to itself. + +- A map in which each element of the codomain set is image of some element in domain set, is called **surjective or on-to** map. + +- A map that is both injective, and surjective, is called a **bijective map**. Bijective maps play an important role in mathematics. + +```{figure} https://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Bijection.svg/1024px-Bijection.svg.png +:align: center +:width: 70% +``` + +- Recall the uncountable sets. Using concept of map we can more clearly define it as follows - A set X is uncountable if and only if there exists no injective map from the set X to set of natural numbers $\mathbb{N}$. + +- Consider the set of integers $\mathbb{Z}=\{\dots, -2, -1, 0, 1, 2, \dots\}$ and a map $f:\mathbb{Z}\longrightarrow \mathbb{Z};\quad f(n)=3n$. The range of this set is a proper subset of $\mathbb{Z}$, as the range only contains numbers that are multiple of 3. However, since the map is injective, this means that the subset has the same cardinality as $\mathbb{Z}$. + +$$ +\begin{align} + \begin{Bmatrix} + \vdots \\ + -2\\ + -1\\ + 0\\ + 1\\ + 2\\ + \vdots + \end{Bmatrix} \underrightarrow{~~~~~~f~~~~~~} + \begin{Bmatrix} + \vdots \\ + -6\\ + -3\\ + 0\\ + 3\\ + 6\\ + \vdots + \end{Bmatrix} +\end{align} +$$ + + +- Maps can be combined. Instead of exploring general consequences, consider two bijective maps $f, g$ from a set X to itself. If $f$ maps an arbitrary element $a$ in X to $b=f(a)$, and $g$ maps $b$ to $c=g(b)$, then the the **combination, or composition** of the two maps $fog$ maps $a$ to $fog(a) = f(g(a))$. + +```{mermaid} +:align: center +graph LR +a(["X"]) +b(["X"]) +c(["X"]) +a --f--> b --g--> c +a --fog--> c +``` + + +### Binary operations + +Binary operations, as the name suggests are operations that take two objects and combine them to give (usually) one unique object. + +In mathematics, binary operation is defined on a set, that takes two elements of the set, and returns one element of a set. + +Formally, a binary operation on a set A is a mapping of elements of $A\times A$ to A, expressed as + +$$ +o : A\times A \longrightarrow A +$$ + +For the binary operation to be well defined, the operation $o$ should be such that *every* pair of elements from A, should map to a unique element in A. That is, if $a, b$ are two arbitrary elements of A, then there exists a $c$ in A, that $o(a, b) = c$. $o(a, b)$ or $a~o~b$ is denoted as result of the binary operation. + +**Commutativity** A binary operation is said to be commutative, if the result of combining does not depend on which is combined to the other i.e., if $a o b = b o a$ for every $a, b$ in the set A. + +Examples: + +- On the set of real numbers $\mathbb{R}$, the usual addition $o(a,b) = a + b$, and the usual multiplication $o(a,b) = ab$ are most common examples of binary operations. +- Consider a given set X, and a set S of all possible bijective maps from X to X, then the composition of maps `o` is a binary operation. + + +### Group +When we have a set, it let's us categorize, and organize the elements. Having binary operations defined on a set tells us how a pair of elements of the set result in another element, in effect how combining elements gives us different elements. + +The binary operations defined on a set, give new structure to the set. A group is one such structure. + +A group is a set $A$ with an operation $o$, expressed as $(A, o)$, such that the operation satifies following conditions - + +1. **Associativity** A binary operation is called associative, if $a o (b o c) = (a o b) o c$ for every elements $a, b, c$ in $A$. +2. **Existence of Identity** There exist an element $e$ in $A$ such that for every element $a\in A$, $e o a = a$, i.e., combining any element with $e$ results in the same element. +3. **Existence of Inverse** For every element $a\in A$, there exists another element, say $a'$ such that $a' o a = e$, i.e, combining the two results in indentity element. + +The inverse of an element $a$ is often denoted by $a^{-1}$. There are certain consequence, that result directly out of the above three assumptions. Consider the identity in the group $(A, o)$: we said for identity, $e o a = a$, and why not $a o e = a$? + +The two expressions are in general different, and can potentially, mean existence of two types of identity elements, say `left identity` and `right identity`. However one can prove based on the purely logic, and the knowledge that $(A, o)$ is a group, that the left and right identities, are the same element. + +The same question can be posed for the existence of the inverse. The left and the right inverses of an element (can be proven) are the same. + +The inverse of the inverse of the element $a$, is the element itself, i.e., $(a^{-1})^{-1} = a$ + +#### Subgroups +Just like sets have subsets, groups have subgroups. A subgroup of a group $(G, o)$ is a subset $S\subset G$, that forms group under the binary operation $o$ of the group constrained within $S$. So in order for a subset to be a subgroup, following must be satisfied +- The binary operation $o$ defined on the set $G$, is also a binary operation on the subset $S$. +- The identity of $o$, say $e$ belongs to $S$, and for every $a$ in $S$, $a^{-1}$ also belongs to $S$ + + +#### Examples + +```{admonition} The set of integers with arithmatic addition $(\mathbb{Z}, +)$ forms a group. +:class: information +The arithmatic operation `+` is a binary operation, as adding any two integers results in another, unique integer. Since the order of adding two integers, does not matter, the operation is obviously commutative. + +Next, we know that addition of three numbers is associative (otherwise grocery shopping to stock markets, everything would have been a mess! 😀). + +Zero is clearly the identity element in the set of integers. + +For every number, it's negative is the additive inverse. +``` + +- What about the set of rational numbers, real numbers and complex numbers. Do any of these form a group with arithmatic addition `+`, or multiplication `*` ? Following table gives a summary of answers, try to figure out why. + +| Set A | (A, `+`)|(A, `.`)|($A^*$, `.`)| +|-- |-- |-- |-- | +|$\mathbb{Z}$|Group |No |No | +|$\mathbb{Q}$|Group |No |Yes | +|$\mathbb{R}$|Group |No |Yes | +|$\mathbb{C}$|Group |No |Yes | + +Here $A^* = A - {0}$, is the set with additive identity element removed from $A$. + +The above defines what a group is, and based on the above example it may look like that a group is just a formal abstract version of what we already know about numbers from our school algebra/arithmatic knowlege. However this abstraction leads to generalization of the arithmatic operation to sets of other objects. See the following examples - + +```{admonition} Permutation Group +:class: information +A permutation is an arrangement of elements of a set. As we know, a set does not have a notion order of elements. But if the order of the elements mattered, each permutation, seen as ordered sequence of elements, will look different, as in figure below. + +```{figure} https://upload.wikimedia.org/wikipedia/commons/4/4c/Permutations_RGB.svg +:align: center +:name: rgb + +Each row represents an arrangement of the three balls of colour red, green and blue. There are 6 such arrangements. +``` + +To abstractify, instead of ball of three colours, consider a set of 3 objects, and without loss of generality we can call them $a, b, c$. Now consider a set of each permutations of the three elements. +The table below shows all possible arrangements of the three objects $a, b, c$ symbolically represented as $p_0, p_1, p_2...$. + + +||$p_0$|$p_1$|$p_2$|$p_3$|$p_4$|$p_5$| +|--- |--- |--- |--- |--- |--- |--| +|Sequence|(abc)|(acb)|(bac)|(bca)|(cab)|(cba)| +|Mapping |(123)|(132)|(213)|(231)|(312)|(321)| + +If we choose a reference arrangement to be $(a,b,c)$, then, $p_0$ is a map that maps (abc) to it itself, $p_1$ maps (abc) to (acb), and so on. +Basically, $p_0, p_1, ...$ are bijective maps which map (abc) to different arrangements. Below is a table that show how resulting maps of combining two maps. + +They can be computed as following - + +$$ +\begin{align} +p_1 p_1(abc) &= p_1(acb) = (abc) = p_0(abc) \implies p_1p_1 = p_0\\ +p_1 p_2(abc) &= p_1(bac) = (bac) = p_3(abc) \implies p_1p_2 = p_3\\ +p_1 p_3(abc) &= p_1(bac) = (bac) = p_2(abc) \implies p_1p_3 = p_2\\ +\dots &= \dots +\end{align} +$$ + +Below is the operation table for composition $o$. Row and column numbers correspond to first and second operand respectively (row $o$ column). + +|$o$ |$p_0$|$p_1$|$p_2$|$p_3$|$p_4$|$p_5$| +|-- |-- |-- |-- |-- |-- |-- | +|$p_0$|$\mathbf{p_0}$|$p_1$|$p_2$|$p_3$|$p_4$|$p_5$| +|$p_1$|$p_1$|$\mathbf{p_0}$|$p_3$|$p_2$|$p_5$|$p_4$| +|$p_2$|$p_2$|$p_4$|$\mathbf{p_0}$|$p_5$|$p_1$|$p_3$| +|$p_3$|$p_3$|$p_5$|$p_1$|$p_4$|$\mathbf{p_0}$|$p_2$| +|$p_4$|$p_4$|$p_2$|$p_5$|$\mathbf{p_0}$|$p_3$|$p_1$| +|$p_5$|$p_5$|$p_3$|$p_4$|$p_1$|$p_2$|$\mathbf{p_0}$| + + +If we consider the set $P=\{p_0\, p_1, ..., p_5\}$, then the above composition $o$ is a binary operation, and $(P, o)$ forms a group. Here $p_0$, is the identity, as combining it with any other map gives the same map. Each element has an inverse, $p_0, p_1, p_2, p_5$ are inverses of their own, and $p_3$ and $p_4$ are inverses of each other. + +This is called permutation group. We showed the example of three objects, but the group generalises to any number of objects. For $n$ object, the set of bijective maps has $n!$ elements. + +```{admonition} Group of modular arithmatic +:class: information + +Modular arithmatic is a system of arithmatic, where numbers wrap around after reaching a certain value. A common example is arithmatic of `12-hour clock`. In general, consider a positive integer $m > 1$. Now any arbitrary integer $a\in \mathbb{Z}$, we can write $a = qm + r$ where $q, r$ are some integers. There is unique pair $q, r$ such that $q$ is largest, and $0\le r\lt m$, in which case we know $q$ and $r$ as quotient and remainder when $a$ is divided by $m$. Since in this unique representation $r$ can have only $m$ possible values in set $Z_m = \{0, 1, 2, \dots, m-1\}$. + +On this set, we define modular addition $\oplus$, to distinguish with usual addition `+` as follows: + +For any two arbitrary $a, b$ in $Z_m$, $a \oplus b = c$ where $a + b = qm + c$, i.e, $c$ is obtained by computing the remainder when $a+b$ is divided by $m$. + +Then $(Z_m, \oplus)$ forms a group, because of following - +- $\oplus$ is a binary operation, moreover, it is also commutative. +- 0 is the identity, for any $a\oplus 0 = a$. +- For any $a$ in $Z_m$, $0\le a\lt m$, there exists $m-a$, such that $a\oplus (m-a) = 0$, so $m-a$ is the inverse of $a$. + +``` + +**Illustration:** Consider $(Z_{8}, \oplus)$, where $Z_8 = \{0, 1, 2, 3, 4, 5, 6, 7\}$, then under modular arithmatic, $2\oplus 3 = 5$, but $4\oplus 4 = 0$ and $4\oplus 7 = 3$ + + + +### Field +In mathematics, a field is defined as a set $F$ with two binary operations, say `+` and `.` such that following conditions are satisfied - +1. The binary operations `+` and `.` are commutative, i.e., $a + b = b + a$, and $a\cdot b = b\cdot a$ for every $a, b\in F$. +2. $(F, +)$ is a group. Let's call `0` it's identity for `+`. +3. $(F^*, \cdot)$ is also a group, where $F^* = F - \{0\}$ is set with identity of `+` removed from it. Let's call the identity for this as `1`. +4. The operation `.` distributes over `+`, i.e., $a\cdot (b + c) = (a\cdot b) + (a\cdot c)$ for every $a, b, c \in F$. + + + +**Examples:** + +- The set of rational ($\mathbb{Q}$), real ($\mathbb{R}$), and complex numbers ($\mathbb{C}$), all from respective fields with usual arithmatic addition `+` and multiplication `.`. $(\mathbb{Q}, +, \cdot)$, $(\mathbb{R}, +, \cdot)$, $(\mathbb{C}, +, \cdot)$ are all fields, with 0 as additive identity, and 1 as multiplicative identity. + +- There are examples of fields of finite set, but their discussion takes us (more than usual) different direction than we intend this lecture notes to. For most of the discussion, even the group aspect might be generally needed, the field of number relevant for us will be that of $(\mathbb{R}, +, \cdot)$ and $(\mathbb{C}, +, \cdot)$. + +- Recall the modular arithmatic, where $(Z_m, \oplus)$ formed a group for any arbitrary positive integer $m$. Now consider a modular version of the usual arithmatic multiplication, $\odot$, defined as follows. If $a, b$ are two arbitrary integers in $Z_m$, then $a\odot b = c$ where $c$ is the remainder you get when you divide $ab$ with $m$. Does the $(Z_m, \oplus, \odot)$ + - Clearly, $\odot: Z_m\times Z_m \longrightarrow Z_m$ is a binary operation. + - 1 is the multiplicative identity, as $1 \odot a = a$ for every $a$ in $Z_m$. + - However, unless $m$ is prime, we have issues with the structure of identity and inverse. + - Does every element has an inverse? Imagine $a, b$ in $Z_m$ are inverses of each other, then $a\odot b = 1$, which means $ab$ is of the form $ab = qm + 1$, which means $b= {qm + 1\over a}$ + +```{admonition} Polynomials +:class: tip + +We need the structure of a field, i.e., set with atleast two binary operations to construct expressions that we call polynomials. +``` + +## Vector Space +All the above mathematical definitions, going through which can be perhaps excruciating, let us define what we need for the underlying math of quantum computing: A vector space, and a Hilbert space. We will see, that these two are nearly same structures, with one difference. + +A vector space is a mathematical structure, that consists of two sets, which have the following substructures: +- The first set, say **V**, whose elements are called vectors, is a commutative group $(\mathbf{V}, +_v)$ with `addition` $+_v$. Let's call $0_v$ the zero vector as the identity of this group. + +- The second set, say F, whose elements are called scalars, is a Field $(F, +_f, \cdot_f)$ with `addition` $+_f$ and `multiplication` $\cdot_f$. Let's call the $0$ and $1$ additive and multiplicative identity of the field. +- A binary operation $\cdot : F\times V \longrightarrow V$ called scalar multiplication. This operation combines a scalar and a vector, and gives us a vector. It lets manipulate vectors through scalars, and satisfies following - + +1. **Associativity**: +For any arbitrary $a, b$ in F, and any arbitrary $\mathbf{v}$ in **V**, + +$$a \cdot (b\cdot\mathbf{v}) = (a\cdot_f b)\mathbf{v}$$ + +This means multiplying a vector successively by two scalars gives the same vector, as when multiplying the field multiplication of those two scalars to the vector. + +2. **Distribution**: +The scalar multiplication distributes over addition of vectors, and addition of scalars. That is, for any arbitrary scalars $a, b$ in F and any arbitrary vectors $\mathbf{u, v}$ in **V**, the following holds + +$$ +\begin{align*} +a\cdot(\mathbf{u} +_v \mathbf{v}) &= (a\cdot\mathbf{u}) +_v (a\cdot\mathbf{v})\\ +(a +_f b)\cdot \mathbf{v} &= (a\cdot\mathbf{v}) +_v (b\cdot\mathbf{v}) +\end{align*} +$$ + +- Multiplying any scalar with zero vector gives zero vector, $a\cdot 0_v = 0_v$, and multiplying zero scalar 0, with any vector gives zero vector, $0\cdot v = 0_v$. + +Because of associativity, and distribution of scalars with vectors, we often use the same symbol for addition (`+` for $+_v$ and $+_f$) and scalar multiplications ($\cdot$ for $\cdot_f$). + +Let us take a moment to appreciate what makes the structure of vector space rich. +We have a set **V** of vectors elements, and set **F** of scalar elements. If one of the sets is infinite, the vector space automatically becomes infinite. (Guess Why?) + + +**Examples:** + +Consider the set of points on 3D space, they are represented by the cartesian product of the set of real numbers + +$$ +\mathbb{R}^3 = \mathbb{R}\times \mathbb{R}\times \mathbb{R} = {(x, y, z): x, y, z\in \mathbb{R}} +$$ + +If we define vector addition of two arbitrary points $\mathbf{r_1}=(x_1, y_1, z_1)$, and $\mathbf{r_2}=(x_2, y_2, z_2)$ as + +$$ +\mathbf{r_1} + \mathbf{r_2} = (x_1 + x_2, y_1 + y_2, z_1 + z_2) +$$ + +then $\mathbb{R}^3$ forms a vector space over the field of real numbers $(\mathbb{R}, +, \cdot)$. + +Consider a toy example of 'constructing a vector space'. Let there be a set of just two non-zero vectors $\mathbf{V} = \{0, \mathbf{a_{\uparrow}}, \mathbf{a_{\downarrow}}\}$, where 0 is zero vector with respect to some addition operator '+' which we define below. To define addition as binary operation, we have the following by definition of zero, or identity. + +$$ +\mathbf{a_{\uparrow}} + 0 = 0 + \mathbf{a_{\uparrow}} = \mathbf{a_{\uparrow}}\\ +\mathbf{a_{\downarrow}} + 0 = 0 + \mathbf{a_{\downarrow}} = \mathbf{a_{\downarrow}} +$$ + +But what about $\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}}$ ? It's value can neither be $\mathbf{a_{\uparrow}}$, nor $\mathbf{a_{\downarrow}}$ as in either case, the other element becomes the identity, or 0. + +$$ +\text{If}\quad\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}} = \mathbf{a_{\uparrow}} \implies \mathbf{a_{\downarrow}} = 0\quad\text{but we assumed it to be non-zero.} +$$ + +Thus the only option **within the set** is $\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}} = 0$, which makes the two vectors inverse of each other. Now, what do we assign to $\mathbf{a_{\uparrow}} + \mathbf{a_{\uparrow}}$, and $\mathbf{a_{\downarrow}} + \mathbf{a_{\downarrow}}$? We can't have $\mathbf{a_{\uparrow}} + \mathbf{a_{\uparrow}} = 0$ as this will make $\mathbf{a_{\uparrow}} = 0$, and same argument holds for $\mathbf{a_{\downarrow}}$. So the only option plaussible is $\mathbf{a_{\uparrow}} + \mathbf{a_{\uparrow}} = \mathbf{a_{\downarrow}}$, and $\mathbf{a_{\downarrow}} + \mathbf{a_{\downarrow}} = \mathbf{a_{\uparrow}}$. + +This gives the structure of this three element group, where combining any non-zero element with itself gives the other element, and both non-zero elements are inverses of each other. + +Other option, which gives us more to play with in context of vector space is, to assume that $\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}}$ should exist as separate vector in **V**. +Moreover, if $\mathbf{a_{\uparrow}}$ and $\mathbf{a_{\downarrow}}$ aren't inverses of each other like above, they should have separate inverses. This means that the set **V** should be extended to atleast + +$$ +\mathbf{V} \to \{0, \mathbf{a_{\uparrow}}, -\mathbf{a_{\uparrow}}, \mathbf{a_{\downarrow}}, -\mathbf{a_{\downarrow}}, \mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}}, -(\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}})\} +$$ + +With introduction of more elements, we have to again make sure that the binary operation is well defined, i.e., addition of any two element results an element in the set. Consider now the $\mathbf{a_{\uparrow}} + (\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}})$, just like previous exercise, its value can not be either of $\mathbf{a_{\uparrow}}, \mathbf{a_{\downarrow}}$ or $\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}}$, otherwise either of these will result in a contradiction. + +So, $\mathbf{a_{\uparrow}} + (\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}})$, and it's inverse must now exist as seperate vector. We can simplify the expression $\mathbf{a_{\uparrow}} + (\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}})$ = $(\mathbf{a_{\uparrow}} + \mathbf{a_{\uparrow}}) + \mathbf{a_{\downarrow}}$ = $2\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}}$, where $2\mathbf{a_{\uparrow}}$ symbolically means $\mathbf{a_{\uparrow}} + \mathbf{a_{\uparrow}}$. We can easily see that + +- This process of extending is actually endless +- If we keep doing this over and over again, the new elements added are expressed as some 'combination' of the originally assumed two non-zero vectors. +- We have deceptively used the notion of actual numbers to express new vectors. +- The fully extended set looks like + +$$ +\mathbf{V} \to \{ + 0, \mathbf{a_{\uparrow}}, -\mathbf{a_{\uparrow}}, \mathbf{a_{\downarrow}}, -\mathbf{a_{\downarrow}}, \mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}}, -(\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}}), + 2\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}},-(2\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}}),\\ + \mathbf{a_{\uparrow}} + 2\mathbf{a_{\downarrow}},-(\mathbf{a_{\uparrow}} + 2\mathbf{a_{\downarrow}}), + 3\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}},-(3\mathbf{a_{\uparrow}} + \mathbf{a_{\downarrow}}), + \mathbf{a_{\uparrow}} + 3\mathbf{a_{\downarrow}},-(\mathbf{a_{\uparrow}} + 3\mathbf{a_{\downarrow}}),\\ + 2\mathbf{a_{\uparrow}} + 3\mathbf{a_{\downarrow}},-(2\mathbf{a_{\uparrow}} + 3\mathbf{a_{\downarrow}}), + 3\mathbf{a_{\uparrow}} +2\mathbf{a_{\downarrow}},-(3\mathbf{a_{\uparrow}} + 2\mathbf{a_{\downarrow}}), + \dots +\} +$$ + +In a more compact form (albeit terse looking) the set looks like $\mathbf{V} = \{n_1\mathbf{a_{\uparrow}} + n_2\mathbf{a_{\downarrow}}: \text{where}\quad n_1, n_2 \in \mathbb{Z}\}$, i.e., every element in the set is of the form $n_1\mathbf{a_{\uparrow}} + n_2\mathbf{a_{\downarrow}}$ for some integers $n_1, n_2$. + +So we had to issentially grow the initial set to contain infinitely many element to make sure the binary operation was within the set, which makes $(\mathbf{V}, +)$ a group. While extending the set, we used integers to express derived vectors as combinations of $\mathbf{a_{\uparrow}}, \mathbf{a_{\downarrow}}$. This is basically trying to use the integers as scalar field. We know that the set of integers does not form a field, so we have to also generalise the numbers from integers to atleast rational number, or for comfort real or complex numbers. + +### Vector Sub-space +Just like Groups have subgroup, vector space had vector subspace. Given a vector space **(V, +)**, with a field $F(+, .)$, a sub-space is a subset **S** of **V**, such that **(S, +)**, forms a vector space with a field $F(+, .)$. Since here all the operations, field are defined for the parent set **V**, to form a sub-space, all one needs to ensure is that those operations done on elements of **S** keep the results within **S**. + +### Linear combination +We saw from the above example, how a finite set object can be extended to an infinite set with a vector space by using combinations of those finite elements. +These combinations are called linear combination of vectors, as they are expressed as sum of terms, each of those terms being vector, with scalar multiplied to. More formally, consider an arbitrarily chosen set of $n$ vectors $v_1, v_2, v_3, \dots, v_n$ in **V**, and scalars $a_1, a_2, a_3, \dots, a_n$, then the following is called a linear combination of the vectors + +$$ +v = \sum_{i=1}^n a_i \mathbf{v_i} = a_1 \mathbf{v_1} + a_2 \mathbf{v_2} + \dots a_n \mathbf{v_n} +$$ + +and the scalars $a_i$ are called **coefficients** of corresponding vectors $\mathbf{v_i}$. + +Let's try to make some interpretations on this linear combination, and here we recall that in physics we usually called single valued objects as scalars, and multi-valued objects as vectors. Thus a number is enough to represent scalar, while a vector having multiple attributes, requires multiple numbers. + +Given a vector $\mathbf{v}$ and a non-zero scalars $a$ and $b$, $\mathbf{v}$, $a\mathbf{v}$, $b\mathbf{v}$, and $(a+b)\mathbf{v}$ are all different vectors, yet they have something in common, the $\mathbf{v}$ itself. One can say, that all these, share some attributes. Recalling that a vector defined in usual sense in physics has a magnitude, and a direction, and magnitude is scalar while the direction is a multi attribute object, we can interpret the following - + +- Multiplying a vector with a scalar, changes it's `magnitude`. +- $\mathbf{v}$, $a\mathbf{v}$, $b\mathbf{v}$, $(a+b)\mathbf{v}$ all have the same `direction`. + +Given a vector space **(V, +)**, with a field $F(+, .)$, and a non-zero vector $\mathbf{v}$, we can imagine a set of all vectors that can be created by multiplying scalars to $\mathbf{v}$. This is called a **linear span of the vector** $\mathbf{v}$ + +$$ +F\mathbf{v} = \{a\mathbf{v}: \text{For every}\quad a\in F\} +$$ + +Clearly, $F\mathbf{v}$ is a subset of **V**, and its easy to see that it forms a vector sub-space. + +```{admonition} Linear span of a set +:class: information + +Consider a set A with $n$ number of non-zero vectors $A=\{\mathbf{v_1, v_2,\dots,v_n}\}$, all elements of a given vector space, then a set containing all the vectors that can be generated by forming linear combination of vectors in A is called the **linear span** of A. Formally, linear span of the set A is + +$$ +F_A=F_{\{\mathbf{v_1, v_2, \dots,v_n}\}} = \{a_1\mathbf{v_1}+a_2\mathbf{v_2}+\dots +a_n\mathbf{v_n}: \text{For every}~~a_1, a_2, \dots, a_n \in F\} +$$ + +``` + +### Linear independence + +Consider the following equation: $a\mathbf{u} + b\mathbf{v} = 0$, where $a, b$ are some arbitraty scalars and $\mathbf{u}, \mathbf{v}$ are two arbitray vectors, and speculate it's implication. + +The left part of the expression is a vector that is linear combination of $\mathbf{u}$ and $\mathbf{v}$, and equating to zero means that the sum is zero vector. But then we can say the following - + +- $a\mathbf{u}$ and $b\mathbf{v}$ are inverses of each other. +- If $a \ne 0$, then $\mathbf{u} = (-a^{-1}b)\mathbf{v}$, which means $\mathbf{u}$ shares the same direction as $\mathbf{v}$. +- If $b \ne 0$, then $\mathbf{v} = (-b^{-1}a)\mathbf{u}$, which also means $\mathbf{u}$ shares the same direction as $\mathbf{v}$. +- The set of their span are identical $F\mathbf{u} = F\mathbf{v}$ (try to see why). + +```{admonition} Tip +:class: tip + +Thus if a linear combination of two vectors can be set to zero, with atleast one coefficient being non-zero, then the two vectors share the same direction. +``` + +What happens, if this cannot happen? That is, for the above two vectors, $\mathbf{u}$ and $\mathbf{v}$ there is no $a, b$ with atleast one of them being non-zero, such that $a\mathbf{u} + b\mathbf{v} = 0$? + +Then the vector's don't share directions, and in a sense are independent of each other. A logically equivalent, but more intuitive way of saying the above is if two vectors don't share direction, or can't be written as scalar multiple of each other, then $a\mathbf{u} + b\mathbf{v} = 0$ implies that $a=b=0$. + +```{admonition} Linear span of two vectors +:class: information + +Imagine we have two vectors $\mathbf{v_1}$, $\mathbf{v_2}$ that don't share direction. We can construct the span of these two vectors + +$$ +F\mathbf{v_1, v_2} = \{a_1\mathbf{v_1}+a_2\mathbf{v_2}: \text{For every}~~a_1, a_2 \in F\} +$$ + +It's also easy to see that this is a sup-space, and linear spans $F\mathbf{v_1}$ and $F\mathbf{v_2}$ are contained in it. +``` + +Let's extend this line of thinking, and consider three non-zero vectors $\mathbf{v_1}$, $\mathbf{v_2}$, $\mathbf{v_3}$, such that $a_1\mathbf{v_1}+a_2\mathbf{v_2}+a_3\mathbf{v_3} = 0$, then following can be said - + +1. If all the coefficients $a_1, a_2, a_3$ are non-zero, any one vector can be written as linear combination of the other two, for example, $\mathbf{v_1} = (-a_1^{-1}a_2)\mathbf{v_2} + (-a_1^{-1}a_3)\mathbf{v_3}$, assuming $a_1\ne 0$. +2. If one of the coefficients is zero, then the expression maps to case of two vectors, and the other two coefficients being non-zero, they share direction. +3. If two of the coefficients are zero, say $a_1 = a_2 = 0$, then the third has to be zero automatically, as $a_1\mathbf{v_1}+a_2\mathbf{v_2}+a_3\mathbf{v_3} = a_3\mathbf{v_3} = 0$, but $\mathbf{v_3}$ is non-zero, so $a_3$ has to be zero. + +4. If all the coefficients are zero, then non of the two vector out of the above three share direction. One can say, that each vector has directions that are independent of each other. + + +```{admonition} Linear span of three vectors +:class: information + +Now, if we have three vectors $\mathbf{v_1}$, $\mathbf{v_2}$ and $\mathbf{v_3}$ with independent directions. We can construct the span of these three vectors + +$$ +F\mathbf{v_1, v_2, v_3} = \{a_1\mathbf{v_1}+a_2\mathbf{v_2}+a_3\mathbf{v_3}: \text{For every}~~a_1, a_2, a_3 \in F\} +$$ + +Just like two vectors, this is a sup-space, and linear spans $F\mathbf{v_1}$, $F\mathbf{v_2}$, $F\mathbf{v_3}$, $F\mathbf{v_1,v_2}$, $F\mathbf{v_2,v_3}$ and $F\mathbf{v_1,v_3}$ are contained in it. +``` + +This situation, generalised to arbitrary number of vectors is defined as **linear independence**. Formally, a set of vectors $n$ vectors $\mathbf{v_1}$, $\mathbf{v_2}$, $\dots$, $\mathbf{v_n}$ are called linearly independent, if and only if + +$$ +\sum_{i=1}^n a_i \mathbf{v_i} = a_1 \mathbf{v_1} + a_2 \mathbf{v_2} + \dots a_n \mathbf{v_n} = 0;\implies a_1 = a_2 = \dots a_n = 0 +$$ + +They are called linearly dependent, if there exists a set of coefficients $(a_1, a_2,\dots,a_n)$ with atleast one non-zero component such that above linear combination equals to zero. + + + +This concept linear independence enhances the ability to express vectors, and categorise or manipulate vector space by defining various types of sub-spaces. + +### Basis + +We saw what are linearly independent vectors, and what linear span of some vectors is. When we start collecting non-zero vectors to a set A, and consider the linear span of the set $F_A$. Clearly, as we discussed above, $F_A$, is a subset of the given vector space **V**, and it is also a sub-space. + +Now let's notice that as the number of elements in the set A increases, the linear span also starts to get bigger, infact, a lot bigger. See the table below, where we illustrate the linear span of a set A for different number of elements in it, assuming in each case, the vectors in the set A are linearly independent. + + +|No of elements|Set A| Linear span $F_A$| +|--- |---|---| +|1|$\{\mathbf{v_1}\}$|$\{a_1\mathbf{v_1}: \text{For every}~~a_1 \in F\}$| +|2|$\{\mathbf{v_1, v_2}\}$|$\{a_1\mathbf{v_1}+a_2\mathbf{v_2}: \text{For every}~~a_1, a_2 \in F\}$| +|3|$\{\mathbf{v_1, v_2, v_3}\}$|$\{a_1\mathbf{v_1}+a_2\mathbf{v_2}+a_3\mathbf{v_3}: \text{For every}~~a_1, a_2, a_3 \in F\}$| +|$\dots$|$\dots$|$\dots$| +|n|$\{\mathbf{v_1,v_2, v_3,\dots, v_n}\}$|$\{\sum_{i=1}^n a_i\mathbf{v_i}: \text{For every}~~a_1, a_2, a_3,\dots,a_n \in F\}$| + +- For one element set $\{\mathbf{v_1}\}$, the linear span $F_A$ contains a different vector for each possible value of scalar $a_1$. +- For two element set $\{\mathbf{v_1, v_2}\}$, the linear span $F_A$ contains a different vector for each possible value of scalar $a_1$ as well as each possible value of $a_2$. +- For three element set, the linear span contains a vector for each possible values of $a_1$, $a_2$ and $a_3$ independently. +- The scalar possibilities get multiplied everytime we add another vector to the set. + +Clearly, at each stage the linear span $F_A$ gets bigger, but is still subset of **V**. Now let's ask the following questions: If we keep adding more and more linearly independent vectors to the set A, +1. Will there be a stage, at which the linear span becomes the **V**, the vector space itself? +2. If so, can we keep adding vectors still? +3. What happens if $F_A$ never becomes **V**? + +First, when this happens, i.e., the linear span $F_A$ spans the entire vector space **V**, the set A becomes special, because every element of the vector space can be expressed as linear combination of elements of A, and such a set is called a **basis** of the vector space. + +Thus a set A of vectors is called a **basis**, if all its vectors are linearly independent, and every vector in the vector space can be written as linear combination of the vectors of A. + + +Following theorem sheds light on question 1 and 3. + +```{admonition} Theorem +Every vector space has a basis. +``` + +Now the question 2. If the set A has become the basis, then every vector can be written as linear combination of its elements. But then there are no more vectors left to add so that the set can still stay linearly independent. + +Without going into details of proving it, though you are encouraged to try, following statements hold for any basis and any vector space. + +- A vector space may have multiple basis, however the number of elements in each basis stays the same. +- The basis may be finite or infinite. The number of element in the basis is called **dimension** of vector space. If the set A is infinite, then the dimension of the vector space is also infinite. +- Basis is a minimal set. As we saw above, you can't add elements to it. However, if you remove any element from it, it will no longer be a basis. + + +For a given basis A for vector space **V**, since every vector $\mathbf{v}$ can be written as linear combination of elements of A, + +$$ +\mathbf{v} = \sum_i^n a_i \mathbf{v_i} +$$ + +The linear combination is defined by the scalars $a_i$, and it is unique for each vector (Easy to prove). The coefficients $a_i$ can now be called coordinates of the vector $\mathbf{v}$, as $(a_1, a_2, \dots, a_n)$ uniquely determine the vector $\mathbf{v}$. + +It is often easier to imagine and interpret even abstract vectors in terms of these scalar coordinates, and this is facilitated by the basis. + + + +### Linear Operators + +Now that we know about vector space, let's discuss how it's elements are manipulated. + +Linear operators, are issentially maps from a vector space to another that follow linearity. + +For our purposes, we will restrict ourselves to maps from a vector space to itself. In that case, a linear operator, or a linear map is a map $L: V \longrightarrow V$, such that for every vectors $\mathbf{v_1, v_2}$, and scalars $a_1, a_2$, the map satisfies the following - + +$$ +L(a_1 \mathbf{v_1} + a_2 \mathbf{v_2}) = a_1 L(\mathbf{v_1}) + a_2 L(\mathbf{v_2}) +$$ + +Let's see some simple implications of this. If we choose $a_2 = 0$, then above gives us $L(a_1\mathbf{v_1}) = a_1 L(\mathbf{v_1}$. Basically, it means that under a linear operator, the image of a scaled vector is the scaled image of that vector. + +Next, if we choose $a_1 = a_2 = 1$, then above gives us $L(\mathbf{v_1} + \mathbf{v_2}) = L(\mathbf{v_1}) + L(\mathbf{v_2})$, i.e., under linear operator, the image of the sum of two vectors is the sum of the images of the two vectors. + +The above two deduction might look like just a clever word-play, but their impact is profound, which is that the linear relations of the vectors stays preserved under the linear maps. + +Here is the place we the use of Basis becomes very handy. For a linear map L, suppose we have a basis $B=\{\mathbf{v_1, v_2,\dots, v_n}\}$, and we know how L maps the vectors in the basis. That is, we know $L(B)=\{L(\mathbf{v_1}), L(\mathbf{v_2}),\dots, L(\mathbf{v_n})\}$. + +Since B is basis, any arbitrary vector $\mathbf{v}$ can be written in terms of elemenets of B. i.e., + +$$ +\mathbf{v} = \sum_i^n a_i \mathbf{v_i}~~\text{for some unique} ~~a_i\in F +$$ + +Then because of linearity, the image of $\mathbf{v}$ can be computed as + +$$ +L(\mathbf{v}) = L(\sum_i^n a_i \mathbf{v_i}) = \sum_i^n a_i L(\mathbf{v_i}) +$$ + +This means a linear map is completely specified by how it maps elements of a basis. For a general set on the other hand, one has to speficy the mapping of every element of the set. + +Now let's consider one of the mapped vectors $L(\mathbf{v_j})$ for some $1\le j\le n$, and we know that it can also be written as linear combination of the Basis vectors. Let us assume that the coefficients of this linear combination are $l_{ij}$ and the linear expression is + +$$ +L(\mathbf{v_j}) = \sum_j^n l_{ij} \mathbf{v_i} = l_{1j} \mathbf{v_1} + l_{2j} \mathbf{v_2} + \dots + l_{nj} \mathbf{v_n} +$$ + +Then the map L is completely specified in terms of the values $l_{ij}$. The matrix generated by these values + +$$ +\mathbf{L} = \begin{pmatrix} +l_{11} & l_{12} & \dots & l_{1n}\\ +l_{21} & l_{22} & \dots & l_{1n}\\ +\vdots & \vdots & \ddots & \vdots\\ +l_{n1} & l_{n2} & \dots & l_{nn} +\end{pmatrix} +$$ + +Is the matrix representation of the linear map L, and if we express an arbitrary vector $\mathbf{v} = \sum_i a_i \mathbf{v_i}$, as coordinate vector $\mathbf{a} = (a_1, a_2, \dots, a_n)^T$, then the coordinates of the $\mathbf{La}$ are the same as the coefficients of the vector obtained by applying the linear map, when expressed in the basis B. + +This is how matrices representation of linear operators naturally emerges. To see more clearly, let's compute $L({\bf v})$ in terms of basis. + +$$ +L({\bf v}) = L\left( + \sum_j a_j {\bf v_j} +\right) +=\sum_j a_j L({\bf v_j})= +\sum_j a_j \left( + \sum_i l_{ij} {\bf v_i} +\right) +=\sum_i \left( + \sum_j l_{ij} a_j +\right){\bf v_i} +=\sum_i ({\bf La})_i {\bf v_i} +$$ + +Thus the image $L({\bf v})$ of an arbitrary vector ${\bf v}=\sum_i a_j {\bf v_j}$ expressed in the same basis ${\bf v_j}$ has coefficients $({\bf La})_i$, or, equivalently the 'coordinates' ${\bf a}=(a_1, a_2, \dots, a_n)^T$ is mapped to coordinates $({\bf La})_i$, wchih are result of matrix multiplication ${\bf La}$. + +- So once we choose the basis, we can express abstract vectors as regular array of numbers, and linear operators as matrices. + +- This helps us encode abstract problems of vector space to matrix-vector manipulations, which are naturally done efficiently on computers. +- This is why we map states and operators to regular vectors and matrices in Quantum Physics and quantum computing. + + +## Inner product space + +We now know what a vector space $V(F)$ is. We call the elements of $V$ as vector, as in general we expect these elements to have some notion of magnitude and direction. + +For vector spaces that are defined over the field of real $\mathbb{R}$ or complex $\mathbb{C}$ numbers, one can define more concrete geometric attributes. This is formally done by defining an **Inner Product** on the vector space. For the discussion onwards, we will assume the field to be of either real, or complex numbers $F=\mathbb{R, C}$. + +An inner product, is a map $\langle , \rangle: V\times V \longrightarrow F$ that satisfies the following conditions. + +For any arbitrary vectors $v_1, v_2, v_3 \in V$, and arbitrary scalars $a_1, a_2, a_3 \in F$ - + +1. **Conjugate symmetry:** $\langle v_1, v_2\rangle = \langle v_2, v_1\rangle^*$, where $^*$ denotes complex conjugate of the complex number. If the $F=\mathbb{R}$, then this becomes symmetry. + +2. **Linearity:** Given that it is a function of two vectors, and is conjugate symmetric (point 1 above), it should have some level of linearity. Formally, it should be linear in the second argument, and conjugate linear in first argument, i.e., + +$$ +\langle {\color{red} v_1}, a_2 v_2 + a_3 v_3\rangle = a_2 \langle {\color{red} v_1}, v_2 \rangle + a_3 \langle {\color{red} v_1}, v_3 \rangle +\\ +\langle a_1 v_1 + a_2 v_2, {\color{red} v_3} \rangle = a_1^* \langle v_1, {\color{red} v_3} \rangle + a_2^* \langle v_2, {\color{red} v_3} \rangle +$$ + +3. **Positive definiteness:** Note, that conjugate symmetry dictates that $\langle v, v\rangle = \langle v, v \rangle^*$, so the inner product of a vector with itself is a real number. We further say, that for every $v\in V$, the inner product of a vector with itself is non-negative, i.e, $\langle v, v\rangle \ge 0$. Moreover, $\langle v, v\rangle = 0$ if and only if $v=0$, i.e, a non-zero vector's inner product with itself is always a positive non-zero number. + +The inner product can be defined in two ways in terms of linearity, (i) as above, where in condition 2, we imposed linearity in second argument, and conjugate linearity in first argument, and (ii) where we impose linearity in the first argument + +```{admonition} Inner product space +:class: tip + +A vector space that has an inner product defined on it, is called an **Inner product space**. +``` + +### Norm of a vector + +As we saw in the definitio of inner product, $\langle v, v\rangle$ is a positive definite number, and depends only on single vector $v$, so it can be used to define the length or size of a vector. + +The **norm** of a vector is defined as $|v|=\sqrt{\langle v, v\rangle}$. The larger this value, he bigger the size of the vector. Let's see how scalar multiple affects the size of a vector. Consider a scalar $a\ne 0$, then the norm of $av$ is + +$$ +|av| = \sqrt{\langle av, av\rangle} = \sqrt{a^*\langle v, av\rangle} = \sqrt{a^* a\langle v, v\rangle} =\sqrt{|a|^2\langle v, v\rangle} = |a||v| +$$ +where $|a|$ is magnitude of the scalar $a$. So the scalar multiplication to a vector multiplies to the norm of the vector. + +### Caucy-Schwarz inequality + +It is a theorem, that states that the absolute value of the inner product of two vectors in a vector space is always less than or equal to the product of their norm. + +$$ +|\langle v_1, v_2\rangle|\le |v_1||v_2|,\quad \text{or equivalently}\quad {\langle v_1, v_2 \rangle\over |v_1||v_2|} \le 1 +$$ + +Since this ratio of inner product and product of norms of the two vector is bounded below 1, we can interpret this ratio to be cosine of an angle, and call this angle as the angle between two vectors. + +$$ +\cos{\theta} = {\langle v_1, v_2 \rangle\over |v_1||v_2|}, \quad\text{or equivalently}\quad +\theta = \cos^{-1}{\langle v_1, v_2 \rangle\over |v_1||v_2|} +$$ + +With this interpretation, the inner product tells us how 'close' two vectors are in direction. + +## Hilbert space +With the inner product defined on the vector space, we can extend the notion of distance between two vectors. For this we need a function of two vectors to act as distance, but just any function wouldn't do. This function has to generalise the concept of distance in real life, for it to make sense. + +In mathematics, such a function is called a metric. A metric, or distance function defined on a set $V$ is a map $d: V\times V\longrightarrow R^{+}$, where $R^{+}$ is the set of non-negative real numbers, and satisfies following conditions - + +1. **Positive definiteness:** For any arbitrary $v_1, v_2 \in V$, $d(v_1, v_2)\ge 0$, and $d(v_1, v_2)=0$ if and only if $v_1 = v_2$. +2. **Symmetry:** the distance function is symmetric, i.e., $d(v_1, v_2) = d(v_2, v_1)$ +3. **Triangular inequality:** For any three elements/vectors $v_1, v_2, v_3 \in V$, the sum of the distance between the first two vectors is always more than or equal to the distance between the first and third vector, i.e., we have +$$ +d(v_1, v_2) + d(v_2, v_3) \ge d(v_1, v_3) +$$ + +Any set with a metric defined on it, is called a **metric space**. It's elements can be thought of as point in a geometrical sense, as there is a well defined distance between each of them. + +With this notion added, the vectors can be seen as 'points' in a vector space. The inner product space has a naturally defined notion of distance through the inner product itself, and that is + +$$ +d(v_1, v_2) = |v_1 - v_2| = \sqrt{\langle v_1 - v_2, v_1 - v_2\rangle } += \sqrt{|v_1|^2 + |v_2|^2 + \langle v_1, v_2\rangle +\langle v_1, v_2\rangle^*} +$$ + +It is easy to check that the above defined distance satisfies the three condition for being a metric. + +With this distance defined on it, we have a **Hilbert space**. Formally, + +```{admonition} Hilbert Space +:class: tip + +Hilbert Space is a vector space equipped with an inner product that induces a metric/distance function for which the space is a complete metric space. +``` + +Now what is a complete metric space, or equivalently completeness? +We will not go into details of this, but rather illustrate the concept of completeness. +We know that vector addition is a binary operation, and similarly usual addition is a binary operation. And by definition, adding two numbers or vectors gives another number/vector. + +Within the set of rational numbers $\mathbb{Q}$, if we have a sequence of $n$ rational numbers, say $a_1, a_2, \dots, a_n$ then because of associativity, +their sum $S_n$ defined as + +$S_n = \sum_{l=1}^n a_l = a_1 + a_2 + \dots, a_n$ + +is also a rational number and belongs to the same set $\mathbb{Q}$. But what happens when $n$ is not finite, but infinite. In this case, question arises, as to whether the sum 'converges' to a specific finite number, or 'diverges' to infinity. Within the set of rational numbers, there is an issue even with the converged scenario. For example, consider the sequence $a_n = (-1)^{n-1}\frac{1}{2n+1}$ then the sum of the $n$ terms is + +$$ +S_n = 1 -\frac 13 + \frac 15 - \frac 17+\dots + (-1)^{n-1}\frac{1}{2n+1} +$$ + +So far, the sum is rational number. However in the limit of $n\to \infty$, this sum is known to be equal to $\frac{\pi}{4}$, which is an irrational number +$$ +S_\infty = 1 -\frac 13 + \frac 15 - \frac 17+\dots = \frac{\pi}{4} +$$ + +This illustrates, that an infinite summation of rational numbers is actually not rational, but an irrational number. This is what completeness is about. In a complete metric space, the limit of an infinite sequence lies in the set. Thus, $\mathbb{Q}$ is not complete, though the set of real numbers $\mathbb{R}$ is complete. + +```{figure} https://upload.wikimedia.org/wikipedia/commons/8/89/Completeness_in_Hilbert_space.png + +An infinite series of sum of vectors results in a well defined net displacement vector. +``` + +In case of vectors in a vector space, this translates to the property that linear combination of infinitely many vectors is still a vector in the vector space. Having this property insures we do not end up in an unphysical state outside the vector space. + +### Normality +Normality, or a vector being normal is just size of vector being of unit size. A vector $v$ is called normal if $|v|=1$. This notion is the same as those of unit vectors in coordinate geometry. When we work with a basis, it is easier to express coordinates if the basis vectors are normal. + +```{note} +Any non-zero vector $v$ can always be normalized as $v\to\frac{1}{|v|}v$ +``` + +### Orthogonality +Orthogonality in a vector space is the generalisation of two vectors being perpendicular in coordinate geometry. In this sense, the inner product naturally extends the notion of ordinary dot product. + +So, two vectors, say $v_1, v_2$ of an inner product space are called orthogonal, if +their inner product is zero, i.e., $\langle v_1, v_2\rangle=0$. If we recall the angular interpretation of the inner product $\theta = \cos^{-1}\frac{\langle v_1, v_2\rangle}{|v_1||v_2|}$, then if the inner product is zero, then $\theta = \cos^{-1}(0) = \frac{\pi}{2}$. That is, the 'angle' between the two vectors is $90^o$. + +If two vectors are linearly independent, then the angle between them can not be zero. Such vectors can be transformed into orthogonal vectors. This process is called **Gram Schmidt Orthogonalization**, see the [wiki link](https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process). + +Let's see this through two vectors. Assume we have two vectors $v_1, v_2$ in the inner product space, that aren't orthogonal, and we need to get new set of two vectors $v_1', v_2'$ from them that are. Then we do the following - + +We can choose the first vector $v_1'=v_1$ as the original one. We then need $v_2'$ such that $\langle v_1', v_2'\rangle = 0$. We use the following ansatz + +$$ +v_2' = v_2 -\frac{\langle v_1, v_2\rangle}{\langle v_1, v_1 \rangle} v_1 +$$ + +then + +$$ +\langle v_1', v_2' \rangle = \langle v_1, v_2' \rangle = +\left\langle + v_1, v_2 -\frac{\langle v_1, v_2\rangle}{\langle v_1, v_1 \rangle} v_1 +\right\rangle +=\\ +\langle v_1, v_2 \rangle - +\frac{\langle v_1, v_2\rangle}{\langle v_1, v_1 \rangle} \langle v_1, v_1 \rangle += \langle v_1, v_2 \rangle - \langle v_1, v_2 \rangle = 0 +$$ + +Here we subtracted $\frac{\langle v_1, v_2\rangle}{\langle v_1, v_1 \rangle}v_1$ from $v_2$, which resulted in the new set being orthogonal. + +```{tip} +$\frac{\langle v_1, v_2\rangle}{\langle v_1, v_1 \rangle}v_1$ is interpreted as the projection of $v_2$ with $v_1$. +``` + +### Overlap of vectors +In an inner product space, the inner product of two vectors $\langle v_1, v_2\rangle$ is interpreted as overlap of two vectors. If the two vectors are normal, then the overlap is solely attributed to how apart the two vectors are in direction. + +### Orthonormal basis + +A basis of an inner product space, in which every vector is normal, and all the vectors are orthogonal to one another, is called an orthonormal basis. It is the basis most convenient to work with in a vector space. + +Consider a basis $B={v_1, v_2, \dots, v_n}$ that is orthonormal. This means $\langle v_i, v_j\rangle = 0$ if $i\ne j$, and $\langle v_i, v_i\rangle = 1$ for all $1\le i, j\le n$. With these properties in mind, let's compute the inner product of two arbitrary vectors $u, v$. We first express them in the basis B. + +$$ +u=\sum_i a_i v_i = a_1v_1 + a_2v_2 +\dots, a_nv_n, \quad\text{and}\quad v=\sum_i b_i v_i = b_1v_1 + b_2v_2 +\dots, b_nv_n +$$ +where $a_1, a_2,\dots, a_n$ and $b_1, b_2, \dots, b_n$ are coordinates of vectors $u, v$ respectively in the basis B. So now the inner product can be written as following, assuming ${\bf a} = (a_1, a_2, \dots, a_n)^T$ +and ${\bf b} = (b_1, b_2, \dots, b_n)^T$ are coordinate representation of vectors $u, v$ as column vectors - + +$$ +\langle u, v\rangle = \left\langle\sum_i a_i v_i, \sum_j b_j v_j \right\rangle += \sum_{ij} a_i^*b_j \langle v_i, v_j\rangle = \sum_i a_i^* b_i = {\bf a^{\dagger}b} +$$ + +where we utilised the linearity of the inner product and the fact that the basis vectors are orthonormal. +This shows that in the orthonormal basis, the inner product of the two vectors becomes the usual complex dot product of the corresponding coordinate vectors. + +Another advantage one can quickly see that if the basis vectors were not orthonormal, the double summation will not simplify to single summation, and there will be $i\ne j$ terms, makding computing of inner product more computationally expensive. + +So from now on, when we refer to a basis, it will be orthonormal basis, unless stated otherwise. + +### Changing basis + +A basis works as a reference in a vector space. When we write a vector as linear combination of basis elements, the coefficients, or coordinates basically tell us how much each of the basis vector needs to scale so that the added resulting vector is the desired one. + +Depending on what system the vector space describes, a specific basis can mean a specific orientation of the system, a specific frame of reference, or specific type of measurement system. One often changes the orientation, reference, or type of measurement. This means choosing a different basis. + +So here we will see how a vector transforms when we change the basis. Consider a basis $B={v_1, v_2, \dots, v_n}$, and another basis $B'={v'_1, v'_2, \dots, v'_n}$. We need to know how $B'$ is related to $B$. Say $B$ is our original basis, so we try expressing vectors of $B'$ in terms of $B$. We write, for every $1\le j \le n$ + +$$ +v_j = \sum_i T_{ij} v_i' +$$ + +where $T_{ij}$ are linear coefficients for each $j$. Now an arbitrary vector $v=\sum_j a_j v_j$ can be expressed follows + +$$ +v = \sum_j a_j v_j = \sum_j a_j \left(\sum_i T_{ij}v_i'\right) +=\sum_i +\left( +\sum_j T_{ij}a_j +\right)v_i' +=\sum_i({\bf Ta})_i v_i'=\sum_i a_i'v_i' +$$ + +where $a_i'=({\bf Ta})_i$. Thus the coordinates ${\bf a}=(a_1, a_2, \dots, a_n)$ of vector $v$ in basis $B$ become ${\bf a'}=(a_1', a_2', \dots, a_n')$ in the new basis $B'$. And since $a_i'=({\bf Ta})_i$, the coordinates are related as ${\bf a'=Ta}$ in the usual matrix multiplication sense. + +## Special operators + +Consider a set of all linear operators on a vector space $L_v=\{L| L:V\to V\text{~is a linear operator}\}$. This set itself has interesting structure, with various operators that are of particular importance. Let's see below. + +- Sum of two linear operators is defined as follows. If $L_1, L_2 \in L_v$ are linear operators, then their sum $L=L_1 + L_2$ is a linear operator such that $L(v) = L_1(v) + L_2(v)$ for every $v\in V$. + +- Scalar multiplication to a linear operator is defined through $L=a_1L_1\implies L(v) = a_1 L_1(v)$ +- The **zero operator**, or map is $O:V \longrightarrow V$, that maps every vector $v$ to zero vector, $O(v)=0$. + +With the above, it is easy to see that the set $L_v$ of all the linear maps forms a vector space itself. + +- The **Identity operator**, $I:V\longrightarrow V$ maps every vector to itself, $I(v) = v$. + +Linear operators can be combined, or 'multiplied' in the following way. If $L_1, L_2$ are two linear operators, then their product, is defined as $L=L_1L_2$, such that $L(v)=L_1(L_2(v))$. It is easy to see that if ${\bf L_1, L_2}$ are matrix representations of the operators $L_1, L_2$, then $L$ is represented by the matrix multiplication ${\bf L=L_1L_2}$. + + +- **Invertable operators**: Operators are map, and if they are bijective maps, they can be inverted. The inverse of an operator $L$ is an operator denoted as $L^{-1}$ such that $L^{-1}L = I, i.e., L^{-1}(L(v))=L^{-1}L(v)=I(v)=v$ for every $v\in V$. + +### Adjoint operator + +Adjoint operator is an operator related to another operator. For a given operator in an inner product space, it's adjoint operator is defined best with help of the inner product, as follows. If $A$ is an operator, it's adjoint operator is defined as an operator denoted as $A^{\dagger}$ such that, for any two vectors $v_1, v_2$, the following is always true- + +$$ +\langle A^{\dagger}v_1, v_2\rangle = \langle v_1, Av_2\rangle \quad\text{or equivalently}\quad \langle v_1, Av_2 \rangle = \langle v_2, A^{\dagger}v_1\rangle^* +$$ + +So if we swap the two vectors, and conjugate the inner product, then the adjoint operator gives the same scalar as the given operator $A$. In this sense, the adjoint operator is conjugate transpose of the given vector. + +### Hermitian operators + +Hermitian operators are of vital importance in linear algebra, vector spaces, and in quantum science. These are operators that are adjoint of themselves. That is, an operator $A$ is called Hermitian if $A^{\dagger} = A$. + +```{tip} +The matrix representation of a Hermitian operator is conjugate symmetric, i.e., ${\bf A^{\dagger}_{ij} = A^*_{ji}}$. +``` + +### Unitary opertors +Unitary operators are special type of invertable operators, such that their adjoint is their inverse, i.e., $A^{\dagger}=A^{-1}$, and equivalently $A^{\dagger}A = AA^{\dagger} = I$. + +They are also of vital importance in quantum science, as well as linear algebra. To see why, let us see what happens to the norm of a vector that is transformed by a unitary operator. Say $U$ is a unitary operator, and $v$ an arbitrary vector. If $v'=Uv$, then + +$$ +\langle v', v'\rangle = \langle Uv, Uv\rangle = \langle v, U^{\dagger}Uv\rangle = \langle v, Iv\rangle = \langle v, v\rangle +$$ + +That is, norm of a vector does not change under the effect of unitary operator. That is why, the act of unitary operator on vectors is interpreted as 'rotation' of vectors, and is called unitary rotation. + +### Eigenvalues, and Eigenvectors + +The concept eigenvalues and eigenvectors has rather wide range of applications in physics, as well as technology. + +In a vector space, eigenvalues and eigenvector are attributes associated with a linear map or operator. We all know that linear operators map a vector to another vector. Say $L$ is a linear operator, then for a given arbitrary vector $v$, $v'=L(v)$ is in general another vector. + +If it so happens that for a particular vector $v_e$, the transformation via $L$ does not change the direction, i.e., $L(v_e)$ is in the same direction. But then we can write $L(v_e) = \lambda v_e$, where $\lambda$ is a scalar. Such a vector is called eigenvector of the operator, and the associated scalar $\lambda$ is called an eigenvalue of the operator. + +```{admonition} Definition +:class: tip + +For a given operator $L$, a vector $v$ is called an **eigenvector** if the vector gets mapped to a vector parallel to itself, i.e., + +$$ +L(v) = \lambda v +$$ + +The corresponding number $\lambda$ with which the eigenvector get scaled is called the **eigenvalue**. +``` + +One can ask the following, how many eigenvalues and/or eigenvectors can a linear operator have? + +To answer it, and to also understand the nature and purpose of eigenvalues and eigenvectors, let's work with the matrix representation of the linear operator and vectors. Consider a basis $B=\{v_1, v_2,\dots, v_n\}$ in which the coordinates of a vector $v$ are ${\bf X}=(x_1, x_2, \dots, x_n)$, and the matrix representation of the operator $L$ is ${\bf L}$. Then if $v$ is an eigenvector of $L$ with eigenvalue $\lambda$, then $L(v) = \lambda v$ is equivalent to the following matrix expression + +$$ +{\bf LX} = \lambda{\bf X}, \quad\text{or, equivalently}\quad ({\bf L}-\lambda {\bf I})X = 0 +$$ +where ${\bf I}$ is identity matrix. Since ${\bf X}$ is in general non-zero, the equation $({\bf L}-\lambda {\bf I})X = 0$ can only be true if the [determinant](https://en.wikipedia.org/wiki/Determinant) of the matrix ${\bf L_\lambda= L}-\lambda {\bf I}$ is zero. + +Determinant of a square matrix is a scalar function, expressed as $Det(L_\lambda)$. Computing the $Det({\bf L}-\lambda {\bf I})=0$ gives a polynomial equation in $\lambda$ of degree $n$. This equation will have $n$ solutions for $\lambda$. These $n$ values are the set of eigenvalues associated with the operator. + +If we label the $n$ eigenvalues as $\lambda_i$, then by solving the linear equation ${\bf L}X = \lambda_i X$ for vector $X$, we get the coordinates of the corresponding eigenvectors. + +```{admonition} Property +:class: tip + +Eigenvectors corresponding to two distinct eigenvalues are linearly independent. +``` + +In fact, if we have a matrix with all distinct eigenvalues, the corresponding eigenvectors form a Basis of the vector space, called ***eigenbasis***. + + +### Dirac Notation + +$$ +{\Huge +\left\langle + \text{Bra}| \text{Operator}| \text{Ket} +\right\rangle = \text{Number} +}$$ + +The Dirac notation, also called Bra-Ket notation, is a notation used in Quantum Physics to express vector operations, and inner product. +It makes interpretation of state, observations and inner product easier. + +- It uses angular brackets $\langle , \rangle$ and vertical bar $|$. +- A Ket is a vector of the Hilbert space denoted as $|v\rangle$, and represents state of a quantum system. +- Action of linear operator $A$ on a ket is expressed as $A|v\rangle$. +- A Bra is of the form $\langle f|$. It is a map $f: V\longrightarrow C$, i.e., it maps a vector to a number, usually complex number. +- With an inner product $\langle , \rangle$ defined on vector space, each ket has a unique corresponding bra $\langle v, ~ \rangle \equiv \langle v|$ +- Basically a bra is a map that is literally parameterised by the vector of Hilbert space, and its action on a vector is governed by the defined inner product. +- The inner product then is equivalently expressed more conveniently as + +$$ +\langle v_1, v_2 \rangle \equiv \langle v_1 | v_2 \rangle , \quad\text{and for some operator, }A\quad \langle v_1, A v_2\rangle \equiv \langle v_1|A|v_2\rangle +$$ + +- The set of all Bra is called dual space of vector space, and both can be used to represent the state. +- One also defines outer product, of two vectors as $L=|v_1\rangle \langle v_2|$, which acts as an operator +$L(v)\equiv L|v\rangle = |v_1\rangle\langle v_2|v\rangle = \langle v_2|v\rangle|v_1\rangle$. +Here applying $L$ on $|v\rangle$ gives the state $|v_1\rangle$ multiplied by scalar $\langle v_2|v \rangle$. + +- For a basis $\{|v_1\rangle, |v_2\rangle, \dots, |v_n\rangle \}$ there is a corresponding basis for dual space, a basis of bra's $\{\langle v_1|, \langle v_2|, \dots, \langle v_n|\}$ + +- The linear combination for a ket is simply expressed as $|v\rangle = \sum_i a_i |v_i\rangle$, however, for the corresponding bra $\langle v|$ has conjugate coefficients. + +$$ +\langle v| = \sum_i a_i^*\langle v_i| +$$ + +## States and Operators + + +Here we will recall the fundamental notions of quantum mechanics we use when we setup the mathematical framework for a given quantum system. + +To describe or study a quantum system, we first start with a set of states that are mutually exclusive with respect to an observation or measurement. +Classically, a system and observations are two distinct things without their interplay. Since classically when we observe something, for example a moving car, or a passing meteor, our 'observation' does not affect the dynamics or behaviour of the system in question. It is because the interaction of the observer and the system is usually so weak that there is no effect of the presence of observer on the system. + +But within the quantum realm, this is not the case. In the strict sense, any observation in quantum realm is result of a measurement, which itself is associated with the property of the system, such as position, momentum, or energy of the system. Secondly, in the quantum realm, properties are quantised, that is, instead of any possible value, there exist descrete values or outcomes that individual measurement can result in. For example, in case of a qubit, the measurement of the state result in either $|0\rangle$ or $|1\rangle$. + +So when there is an observation we think of, and the decrete set of state the system is in, and these state are mutually exlusive in the sense of possibility. + +If the system is found in one of those state, and the corresponding measurement is done, it will always be found in that state. We choose this set as our basis. Imagine there are $n$ possible states, then basis may be expressed as $B=\{|1\rangle, |2\rangle, |3\rangle, \dots, |n\rangle\}$. Here the states are symbolically expressed by the outcome labels $1, 2, \dots, n$. The Hilbert space for the quantum system is then the linear span of these states - + +$$ +H_b = \left\{|s\rangle =\sum_{l=1}^n c_l|l\rangle: \text{where } c_l\in \mathbb{C}\right\} +$$ + +Each vector in this Hilbert space is a possible state. This is because of the **superposition principle** which states that If a quantum system can exist in two states (or more), it can exist in all possible superpositions of the two (or more of those) states. Let's see below what this superposition means in connection with a quantum system. + +### Connection with Experiment + +We have the following probabilistic interpretation of a general state in the Hilbert space. + +#### Probabilistic interpretation + +```{admonition} Probabilistic interpretation of superposition +:class: tip + +A quantum state $|s\rangle = c_1|1\rangle + c_2|2\rangle + \dots c_n|n\rangle $ is a state, in which possibilities of being measured in each one of the basis states $|l\rangle$ coexist simultaneously, untill the measurement is done. +``` + +The coefficients $c_l$ are complex probability amplitudes for each state $|l\rangle$, and the actual probability of measurement outcome being in the state $|l\rangle$ is $|c_l|^2$. Since sum of all the probabilities must add to 1, we must have - + +$$ +1 = \sum_{l=1}^n |c_l|^2 = |c_1|^2 + |c_2|^2 + \dots +|c_n|^2 +$$ + +```{admonition} Overlap of probability +The inner product of the two states $\langle s, s'\rangle \equiv \langle s|s'\rangle$ gives the overlap of probabilities of the two states. +``` + +For mutually exclusive states this overlap is zero, hence the mutually exclusive states should be orthogonal to each other. That is why we impose that the basis above is orthogonal, i.e., $\langle l|l'\rangle = 0$ for $l\ne l'$ and normal $\langle l|l\rangle = 1$. + +Further, lets compute the norm of the above generic state $|s\rangle$. + +$$ +\langle s|s\rangle = \sum_l c_l^*\langle l| \sum_{l'} c_{l'}|l'\rangle = \sum_{l,l'} c_l^*c_{l'}\langle l|l'\rangle = \sum_{l} |c_l|^2 +$$ + +But the probability argument implied that the last summation equals 1, so $\langle s|s'\rangle = 1$, that is the norm of the state must also be 1. That is why in quantum system, a state is represented by a unit vector of the Hilbert space. + + + +#### Interpretation of measurement +Let us try to illustrate how quantum measurement works. +When we measure a property of a quantum system, the outcome of the measurement should yield a value. + +Let's assume the quantum system imagined in the previous section, the states are $|l\rangle$ with $l=1,2,\dots n$. If the system is already in one of these states, then it stays in it, and the outcome of the measurement is, say $a_l$ corresponding to the state $|l\rangle$. + +This observation, against our intuition of uncertainty in quantum system, is actually definite. Is there something special about the system being in state $|l\rangle$ ? Yes, it is so because these state are by construction mutually exclusive with respect to observation, as discussed in section [](#states-and-operators). + +The uncertainty comes if before the measurement system was in a superposition state $|s\rangle = c_1|1\rangle + c_2|2\rangle + \dots c_n|n\rangle$. In this case, the system is in a state where the possibility of being in any one of the $|l\rangle$ state coexist until the measurement. + +Once we observe the system, or measure it, the system collapses into one of the $|l\rangle$ states with probability $|c_l|^2$. In this situation the outcome is not definite, but probabilistic, and if we repeat the above experiment, we get a probability averaged outcome, called **expectation value**. It is denoted as $\langle a \rangle$ and is given by the weighted average of the probabilities - + +$$ +\langle a \rangle = \sum_{l=1}^n |c_l|^2 a_l +$$ + +#### Mathematical interpretation + +Mathematically, the above measurement is interpreted as following. + +Every physically measurable quantity is called an observable, and for every observable, there is a Hermitian operator, say $A$ that acts on a state. +If the state is $l\rangle$, the result of the action is $A|l\rangle=a_l|l\rangle$, and if the state is in superposition $|s\rangle$, the state changes to $A|s\rangle$. + +The overlap, or inner product of the resulting state with initial state gives the outcome of the measurement. The outcome, which is also called the expectation value, is expressed as $\langle s, As\rangle$ or $\langle s|A|s\rangle$ in the Dirac notation. + +- For the $|l\rangle$ state, the outcome is $\langle l|A|l\rangle = a_l\langle l|l\rangle = a_l$, and if definite. + +- For the superposition state, the outcome is probabilistic with expectation value + +$$ +\begin{align} +\langle a \rangle &= \langle s|A|s \rangle = +\left( + \sum_{l'}c_{l'}^*\langle l'| +\right)A +\left( +\sum_l c_l|l\rangle +\right)\\ +&= +\sum_{l,l'}c_{l'}^*c_l a_l\langle l'|l \rangle += \sum_l a_l|c_l|^2 +\end{align} +$$ + +which is same as one interpreted as measurement outcome in the previous section. + + +## Hilbert space of Qubits + +Let us finally come to example of quantum systems that are useful for quantum computing. + +### Single Qubit + +A **Qubit** is a quantum system with two state basis. A single qubit is one of the simplest quantum system of 2-dimensional Hilbert space. + +A qubit is an abstraction of a quantum system with two dimensional Hilbert space, with a basis $\{|0\rangle, |1\rangle\}$. The Hilbert space then looks like + +$$ +H_1 = {|s\rangle = c_0|0\rangle + c_1|1\rangle: c_0, c_1 \in \mathbb{C}} +$$ + +Note that in order to represent a quantum state, the kets $|s\rangle$ need to be normal, which means + +$$ +|c_0|^2 + |c_1|^2 = 1 +$$ + +Since the Hilbert space is two dimensional, all the operator on it can be +represented as $2\times 2$ complex matrices. + +Noteworthy operators are the following - +- Identity $I$, and Hadamard $H$ operators. Their matrix representation is following - + +$$ +I = \begin{pmatrix} 1 & 0\\0 & 1 \end{pmatrix}; +H = \frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1\\1 & -1 \end{pmatrix} +$$ + +- Pauli $X, Y, Z$ operators. Their matrix representation is following - +$$ +X = \begin{pmatrix} 0 & 1\\1 & 0 \end{pmatrix}; +Y = \begin{pmatrix} 0 & -i\\i & 0 \end{pmatrix}; +Z = \begin{pmatrix} 1 & 0\\0 & -1 \end{pmatrix}; +$$ + +One assumes a coordinate system with $x,y$ and $z$ axis, and a basis +that is eigenstate of Pauli z operators. + +### Multiple Qubits + +In general, when we combine two quantum systems, the Hilbert space of the +combined system is constructed from the cartesian product of the basis of +component systems. + +Let us first consider a system of two qubits, if the basis for one qubit is +$B_1 = \{|0\rangle, |1\rangle\}$, then the basis for the two qubit system is + +$$ +B_2 = B_1\times B_1 = {(|0\rangle, |0\rangle), (|0\rangle, |1\rangle), +(|1\rangle, |0\rangle), (|1\rangle, |1\rangle)} +$$ + +Where the order of the states in ordered pair follows the qubit label. +For example, $(|0\rangle, |1\rangle)$ represents a state in which first +qubit is in 0 state, and second qubit is in 1 state. + +If we have more qubits, the Hilbert space will grow as $B_3 = B_1\times B_1\times B_1$, and so on. +The ordered pair notation becomes combersome, so one puts the individual state labels inside the +angular brackets. In this way, the basis for two and three qubits looks like following - + +$$ +\begin{align} +B_2 = &\{|00\rangle, |01\rangle, |10\rangle, |11\rangle\}\\ +B_3 = &\{|000\rangle, |001\rangle, |010\rangle, |011\rangle, |100\rangle, |101\rangle, |110\rangle, |111\rangle\}\\ +B_4 = &\{ + |0000\rangle, |0001\rangle, |0010\rangle, |0011\rangle,\\ + &|0100\rangle, |0101\rangle, |0110\rangle, |0111\rangle,\\ + &|1000\rangle, |1001\rangle, |1010\rangle, |1011\rangle,\\ + &|1100\rangle, |1101\rangle, |1110\rangle, |1111\rangle +\} +\end{align} +$$ + +```{tip} +The size of the basis, and hence the dimension of the Hilbert space of $n$ qubits is $2^n$ +``` + +### Pure vs Mixed States + +#### Pure state +The quantum state we referred to so far are what one calls pure states, and they are represented by a normalised vector in a complex Hilbert space. In the Dirac notation, they are described as a ket $|v\rangle$ or a bra $\langle v|$. + +There is another way to describe the state of quantum system which can be generalised to mixed states (defined below), and the is through **density operator**. For a system in pure quantum state $|v\rangle$, the density operator is defined as + +$$ +{\Huge +\rho = |v\rangle \langle v| +} +$$ + +- It is easy to see that trace of the density operator is 1, i.e., $\text{Tr}(\rho)=1$. +- For a pure state, $\rho^2 = \rho$, so $\text{Tr}(\rho^2)=1$ + +#### Mixed state +Suppose we have a quantum system, and wish to prepare it in a state $|l\rangle$ out of, say $\{|1\rangle, |2\rangle, |3\rangle,\dots, |n\rangle\}$. If we could do it, then the system is in a pure state. But on the other hand, due to some difficulty, experimental or otherwise of physical nature, when we try to prepare it in $|l\rangle$, each time we get the system prepared in a different state. We can repeat the attempt of preparing the state several times, and compute the statistical *weight* $w_l$ of having prepared the system in the expected state $|l\rangle$. This adds another uncertainty, which is classical in nature on any measurement on the system in such a state, and any outcome of quantum measurement will be an ensemble average of these weights. Such a state is called a **mixed state**. + +What mathematical object should we use to represent such a state? Clearly a single vector does not suffice, so we need something that depends on the weights $w_l$ and the state $|l\rangle$ for all values of $l$. + +Such state are represented by the following + +$$ +\rho = \sum_l w_l |l\rangle \langle l| +$$ + +- For a mixed state, $\rho^2 \ne \rho$, and $\text{Tr}(\rho) <1$. + + +[youtube](https://youtube.com/clip/Ugkxh9W3xafNSWAP-VU9LCrRXkx9kgUH0mY8?si=MVsRsDUeJld5fV9_) + + + + +[^1]: See the [Wikipedia article on set](https://en.wikipedia.org/wiki/Set_(mathematics)) for more details. diff --git a/lecture-04/mathematical-framework-for-qc.md b/lecture-04/mathematical-framework-for-qc.md deleted file mode 100644 index 56f175b..0000000 --- a/lecture-04/mathematical-framework-for-qc.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Mathematical framework for Quantum Computing -layout: post ---- - -(lecture-4)= -# Lecture 4: Mathematical framework for Quantum Computing - -```{warning} These lecture notes are a work in progress and are not a replacement for watching the lecture video, it's intended to be a supplementary reading after watching the lecture -``` - -```{admonition} Learning outcomes -:class: tip - -In this lecture we discuss the mathematical framework and tools required to properly understand how quantum system works. We give a short introduction to notion of vector spaces, linear operators, and how they connect to physical reality. -``` - -## Postulates of Quantum Physics - -- State as an abstract vector -- Superposition principle -- Role of interference -- Principles of measurement -- No-cloning -- Entanglement -- Tunnelling - -## Mathematica Structure - -```{mermaid} -mindmap -root(Mathematical Framework) - Vector Space, Hilbert Space - Scalar vs Vector - States as Vector (Bra and Ket) - Linear combination - Linear independence - Inner Product - Overlap of vectors - Orthogonality - Linear Operators - Commutativity - Special operators: Unitary, Hermitian, ... - Probability conservation - Representation theory -``` - -### Vector Space, Hilbert Space -- Scalar vs Vector -- States as Vector (Bra and Ket) -### Linear combination -- Linear independence -### Inner Product -- Overlap of vectors -- Orthogonality -### Linear Operators -- Commutativity -- Special operators: Unitary, Hermitian, ... -- Probability conservation -### Representation theory - - diff --git a/lecture-04/set-union-inters-diff.jpg b/lecture-04/set-union-inters-diff.jpg new file mode 100644 index 0000000..46684d8 Binary files /dev/null and b/lecture-04/set-union-inters-diff.jpg differ diff --git a/lecture-05/intro-to-quantum-info.md b/lecture-05/intro-to-quantum-info.md index 24913ec..cabe289 100644 --- a/lecture-05/intro-to-quantum-info.md +++ b/lecture-05/intro-to-quantum-info.md @@ -10,4 +10,83 @@ layout: post :class: tip This is a placeholder for the Guest Lecture. It will be populated in due time with necessary prerequisits, and supplementary content on Quantum Information. +``` + +## About the Guest +``````{admonition} The Speaker: Dr. Homer Papadopoulos +:class: information + +Dr. Homer Papadopoulos is a functional researcher at the Institute of Informatics and Telecommunications (IIT) of NCSR Demokritos and co-founder of the startup **Syndesis Ltd**, living and working in Athens. A natural polymath, Dr. Papadopoulos holds degrees in Physics, Telecommunications, Management, and a PhD in Information Systems Science, among others. With over 20 years of research experience, he has submitted numerous papers in various fields, showcasing his expertise and deep understanding of complex subjects and he has created multidisciplinary research programs, consistently pushing the boundaries of innovation in digital technologies. + +```{card} +:align: center +[LinkedIn Profile: Dr. Homer Papadopoulos](https://www.linkedin.com/in/homer-papadopoulos-3146519/?originalSubdomain=gr) +``` +`````` + + +```{admonition} Affiliation and activities + +The National Centre for Scientific Research "Demokritos" (NCSRD) (www.demokritos.gr) is a self- governing research organization, under the supervision of the Greek Government. With a staff of over 700, including 100 post-graduate students and over 300 research associates, NCSRD is the biggest research centre in applied sciences and engineering in Greece. +The Institute of Informatics and Telecommunications - [IIT](https://www.iit.demokritos.gr/), one of the five Institutes of NCSRD, has accumulated substantial expertise and is actively involved in many areas of information technologies including Quantum information technologies, mobile applications and telecommunications, while it has participated in numerous EU and nationally funded research projects. NCSRD’s IIT is involved in technological research and it has been participating in a number of European projects in the above mentioned fields such as the Quantum information domain, namely: OPENQKD, HellasQCI and others +[Syndesis Ltd](https://www.syndesis.eu/), a spin-off from the NCSR "Demokritos", grounded in a solid background in informatics, software engineering, digital security, and trusted computing ensures its leading role in developing the central hub for PQC utilising AI technologies. Its participation in the OPENQKD pilot project and HellasQCI project highlights its advanced expertise in PQC technologies and standardisation efforts. Syndesis is an active member of standard development organisations (SDOs) like CEN/CENELEC JTC 22 and the QuIC, where it leads the standards working group. The company's contributions to the development of the CEN/CENELEC FGQT roadmap for standardising quantum technologies in the EU demonstrate its role in quantum standardisation. + +``` + +## Summary of lecture + +```{admonition} Summary +:class: information +He will first touch upon what is information, and how do we quantify it. He will describe aspects of information, such as transferring from point A to point B, encoding and decoding information, and measuring information. He will describe the distinction between classical and quantum information, and tools for measuring quantum information. + +He will then dwelve into aspect of information security, particularly encryption. He will describe what cryptography is, and how it is used to safely transfer information for the right recepient, and protect it from third party. He will discuss symmetric and assymmytric cryptography, and digital signatures. + +This will be followed by some demos on cryptography, and then he will discuss Quantum enabled cryptography, quantum key distribution (QKD), quantum random number generation, and challenges in quantum cryptography, and introduce post-quantum cryptography (PQC). He will conclude the lecture after discussing some necessary aspects of PQC. +``` + +## References + +It will be good idea to have looked through or read the following references before the guest lecture. These are recommended by Dr. Papadopoulos. + +```{admonition} References +:class: information + +**Recommended Reading** + +1. Basics of Quantum Information + - [IBM tutorial](https://learning.quantum.ibm.com/course/basics-of-quantum-information) + +2. Quantum internet: A vision for the road ahead + - [Science Review, semi-technical](https://www.science.org/doi/10.1126/science.aam9288) + +3. DIKW pyramid: + - Wiki page https://en.wikipedia.org/wiki/DIKW_pyramid + +4. An Introduction to Public Key Cryptography + - [Semi-technical article](https://betterprogramming.pub/an-introduction-to-public-key-cryptography-3ea0cf7bf4ba) + +5. Quantum random number generation + - [Article, NPJ Quantum Inf **2**, 16021, 2016](https://www.nature.com/articles/npjqi201621) + +6. NIST Releases First 3 Finalized Post-Quantum Encryption Standards + - [NIST press release, 13 Aug, 2024](https://www.nist.gov/news-events/news/2024/08/nist-releases-first-3-finalized-post-quantum-encryption-standards) + + +**Advance Reading** + +1. Quantum Communications—Michal Hajdušek and Rodney Van Meter + - [Arxiv book](https://arxiv.org/abs/2311.02367) + +2. Quantum Information Theory – Lecture Notes—Christoph Dittel + - [Arxiv Lecture notes](https://arxiv.org/abs/2311.12442) + +3. Information Science in Theory and Practice + - [Book by Alina Vickery and Brian C. Vickery, (1987)](https://dokumen.pub/information-science-in-theory-and-practice-3nbsped-3598116586-9783598116582.html) + +4. The Mathematical Theory of Communication + - Book by *Shannon, C., & Weaver, W.* (1948), University of Illinois Press. + +5. Homomorphic Encryption Standardization + - [Website on Homomorphic Encryption Standardization](https://homomorphicencryption.org/) + ``` \ No newline at end of file diff --git a/lecture-06/images/NMR.png b/lecture-06/images/NMR.png new file mode 100644 index 0000000..8ba332f Binary files /dev/null and b/lecture-06/images/NMR.png differ diff --git a/lecture-06/images/color-centre.png b/lecture-06/images/color-centre.png new file mode 100644 index 0000000..dc5699a Binary files /dev/null and b/lecture-06/images/color-centre.png differ diff --git a/lecture-06/images/electron-on-helium.png b/lecture-06/images/electron-on-helium.png new file mode 100644 index 0000000..5fede29 Binary files /dev/null and b/lecture-06/images/electron-on-helium.png differ diff --git a/lecture-06/images/neutral-atom.png b/lecture-06/images/neutral-atom.png new file mode 100644 index 0000000..60afe40 Binary files /dev/null and b/lecture-06/images/neutral-atom.png differ diff --git a/lecture-06/images/photonics.png b/lecture-06/images/photonics.png new file mode 100644 index 0000000..24cf3ac Binary files /dev/null and b/lecture-06/images/photonics.png differ diff --git a/lecture-06/images/quantum-dot.png b/lecture-06/images/quantum-dot.png new file mode 100644 index 0000000..559cf05 Binary files /dev/null and b/lecture-06/images/quantum-dot.png differ diff --git a/lecture-06/images/superconducting.png b/lecture-06/images/superconducting.png new file mode 100644 index 0000000..c611d54 Binary files /dev/null and b/lecture-06/images/superconducting.png differ diff --git a/lecture-06/images/trapped-ion.png b/lecture-06/images/trapped-ion.png new file mode 100644 index 0000000..9340536 Binary files /dev/null and b/lecture-06/images/trapped-ion.png differ diff --git a/lecture-06/realizing-quantum-computing-systems.md b/lecture-06/realizing-qc-systems.md similarity index 79% rename from lecture-06/realizing-quantum-computing-systems.md rename to lecture-06/realizing-qc-systems.md index e06fbd9..3c4499d 100644 --- a/lecture-06/realizing-quantum-computing-systems.md +++ b/lecture-06/realizing-qc-systems.md @@ -115,9 +115,62 @@ Trapped Ion : Computers use Ions or charged particles which are suspended in fre -Photonics, Diamond Vacancies Silicon Quantum Dots and Topological qubits are some other architectures which are also currently being worked on. Each technology comes with it’s share of advantages in terms of Scalability, Operation temperature and Coherence times and therefore each of them are ideal for different use cases and applications. +Photonics, Diamond Vacancies, Silicon Quantum Dots and Topological qubits are some other architectures which are also currently being worked on. Each technology comes with it’s share of advantages in terms of Scalability, Operation temperature and Coherence times and therefore each of them are ideal for different use cases and applications. +#### Superconducting Qubits +A Superconductor is a special type of material that has zero electrical resistance. The qubits are implemented using superconducting loops and circuits. Here, the two states are not |0> and |1> but the ground and excited states respectively, and are denoted by |g> and |e> respectively. -#### Performance Metrics for Qubits +There are many different types of superconductors + +- Transmon Qubits: Transmons are a widely used type of superconducting qubits. They are based on a nonlinear oscillator design and can have longer coherence times (the time during which quantum information is preserved) compared to some other qubit types. +- Xmon Qubits: Xmons are a variation of transmon qubits designed with a different geometry that improves qubit-qubit connectivity, making them suitable for building larger quantum processors. +- Flux Qubits: Flux qubits use the superconducting properties of Josephson junctions to encode quantum information. They can have strong interactions with other qubits, which is useful for certain quantum operations. + +```{image} ./images/superconducting.png +:align: center +``` +#### Trapped-Ion Qubits +Here, ions are trapped in electromagnetic fields. The qubits are usually encoded in the internal state of individual atoms. From these ions, there are 2 types of qubits which we can form + +- Hyperfine qubits: The energy level of both ions is degenerate which in simple terms means they are the same +- Optical qubits: Formed by one ground state and one excited state of two ions respectively. +Lasers are used for manipulation of the qubits like performing entanglement, gate operations, etc. +```{image} ./images/trapped-ion.png +:align: center +``` +#### Neutral Atom Qubits +Parallel to trapped ions, here, we have neutral atoms which are trapped inside the electromagnetic field. There are different trapping techniques such as the optical trap, magnetic trap, magneto-optical trap, etc. The qubits are encoded in the internal state of the individual atoms. Lasers are used for the manipulation of the qubits and also for gate operations. +```{image} ./images/neutral-atom.png +:align: center +``` +#### Quantum Dot Qubits +Quantum Dots are tiny semiconductor nanocrystals that can trap individual electrons or other charge carriers. The qubit state depends on the individual electrons trapped inside the dot and the state is represented by its spin. The manipulation of these qubits is done by microwave pulses or by applying electric or magnetic fields externally. +```{image} ./images/quantum-dot.png +:align: center +``` + +#### Photonics Qubits +Here we use photons as qubits and thus are also known as photonic qubits. The quantum state can be polarization, frequency, or phases of the qubits. the superposition and entanglement are created using wave plates whereas the qubit manipulation is done by optical instruments like beam splitter, phase shifters, etc. For gate implementation, normal quantum gates are used. +```{image} ./images/photonics.png +:align: center +``` +#### Color center qubits +Color centers are defects in the solid state. Defects result from missing or substituted atoms in the crystal lattice. The qubits are embedded into these defects. The quantum states of color centers are often encoded in their electronic and nuclear spin states. The ground and excited states of color centers can be used to represent qubit states. The qubits are manipulated using laser lights to create superposition and entanglement. +```{image} ./images/color-centre.png +:align: center +``` +#### NMR based qubits +These use the principles of NMR(Nuclear Magnetic Resonance) for quantum computation. NMR is a phenomenon that occurs when the nuclei of certain atoms, such as hydrogen, respond to a magnetic field by emitting or absorbing radiofrequency electromagnetic radiation. Here, qubits are typically encoded in the nuclear spins of certain atoms in a molecule. The manipulation is done using radiofrequency pulses. +```{image} ./images/NMR.png +:align: center +``` +#### Topological qubits +#### Electron-on-Helium +Electrons are trapped on the surface of Superfluid helium and serve as qubits. Superfluid helium is a state of helium that exhibits unique properties due to its extremely low temperature. It lacks viscosity and can flow without friction. On the surface of superfluid helium, a two-dimensional layer forms, creating a quantum well where electrons can be trapped. This confines the electron and keeps the electron localized in a small region and allows for precise control over its quantum properties. Manipulations are done by external magnetic and electric fields. +```{image} ./images/electron-on-helium.png +:align: center +``` + +### Performance Metrics for Qubits Mentioned below are some of the key metrics used to determine the performance of a Qubit based system diff --git a/lecture-07/qc-hardwares.md b/lecture-07/qc-hardwares.md new file mode 100644 index 0000000..e18c540 --- /dev/null +++ b/lecture-07/qc-hardwares.md @@ -0,0 +1,62 @@ +--- +title: Hardwares for Quantum Computing +layout: post +--- + +# Lecture 7: Hardwares for Quantum Computing + + +```{admonition} Overview +:class: tip + +This is a placeholder for the Guest Lecture. It will be populated in due time with necessary prerequisits, and supplementary content on Quantum Hardwares. +``` + + +## About the Guest +``````{admonition} The Speaker: David Redmond +:class: information + +David Redmond received the B.E.E. degree from University College Cork, in 1988, and the M.Sc. degree in mathematics from University College Dublin, in 2017. He was involved in the semiconductor industry for more than 30 years developing high volume consumer and industrial products from handset 2/3/4G RF transceivers, to SerDes and Gigabit Ethernet products for such companies, such as AT&T Lucent, S3, Motorola, Freescale, and Analog Devices, operating at various levels of corporate research and development and product development. Since 2020, he has been with Equal1 Labs for VP AI & silicon. His research interests include machine learning and statistics. + +From [IEEE Xplore](https://ieeexplore.ieee.org/author/37089004330) + +```{card} +:align: center +[LinkedIn Profile: David Redmond](https://www.linkedin.com/in/davidredmo/) +``` +`````` + + +```{admonition} Affiliation and activities +David has been with the Equal1 since 2020, working towards building silicon based quantum computing device. His expertise include: + +ML hardware for QEC, mixed-signal circuits for qubit control, ML mixed-signal CMOS accelerators +Quantum Algorithms, Quantum Error Correction, Hybrid ML quantum algorithms. Deep Learning Networks, NISQ Quantum Computers, Time series, Anomaly detection, Computer vision. +IIoT sensors to cloud to insights, vibrational analysis and predictive maintenance, business innovation, +Industrial and Consumer ethernet. +Full Silicon Product development for consumer and industrial products +``` + +## Summary of lecture + +```{admonition} Summary +:class: information + +This lecture will be illustrating how a quantum computing device is built. He will go through the underlying technology to define qubits, methods to control them, and challenges there in. + +``` + +## References + + +```{admonition} References +:class: information + +**Recommended Reading** + + +**Advance Reading** + + +``` \ No newline at end of file diff --git a/lecture-07/quantum-computing-hardwares.md b/lecture-07/quantum-computing-hardwares.md deleted file mode 100644 index c23ce54..0000000 --- a/lecture-07/quantum-computing-hardwares.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Hardwares for Quantum Computing -layout: post ---- - -# Lecture 7: Hardwares for Quantum Computing - - -```{admonition} Overview -:class: tip - -This is a placeholder for the Guest Lecture. It will be populated in due time with necessary prerequisits, and supplementary content on Quantum Hardwares. -``` diff --git a/lecture-08/accessing-quantum-computing-systems.md b/lecture-08/accessing-qc-systems.md similarity index 97% rename from lecture-08/accessing-quantum-computing-systems.md rename to lecture-08/accessing-qc-systems.md index 9cd8fa0..03d7f90 100644 --- a/lecture-08/accessing-quantum-computing-systems.md +++ b/lecture-08/accessing-qc-systems.md @@ -13,8 +13,8 @@ mystnb: render_markdown_format: myst --- -(lecture-8)= -# Lecture 8: Accessing Quantum Computing Systems +(lecture-8a)= +# Lecture 8a: Accessing Quantum Computing Systems ```{warning} These lecture notes are a work in progress and are not a replacement for watching the lecture video, it's intended to be a supplementary reading after watching the lecture ``` @@ -408,19 +408,21 @@ Current capabilities​ IBM Quantum Eagle​ ``` -Here we see a preview of the Quantum Lab, IBMs cloud computing service. On the right, we see a programming tool in which code can be written and ran. On the left we a directory containing tutorials and whatever files you create. ​ +Here we see a preview of the (Initially called IBM Quantum Lab, and renamed, restructured into) [IBM Quantum Platform](https://quantum.ibm.com) is IBM's cloud computing service. Earlier, they provided jupyter notebook running facility through the browser, but that service has been discontinued. -```{card} IBM Quantum Lab - +``````{card} IBM Quantum Platform +```{image} ./ibm-q-platform.png +:align: center ``` +`````` -Here is the quantum composer. You can see in the centre the quantum circuit builder, where you can place qubits and gates to your liking and then perform measurements on the circuit. The results are diagrammatically shown in the bottom left aswell as on the Q-sphere on the bottom right. Qiskit code that represents the circuit is generated in the right panel.​ +Here is the screenshot of the [IBM quantum composer](https://quantum.ibm.com/composer/files/new). You can see in the centre the quantum circuit builder, where you can place qubits and gates to your liking and then perform measurements on the circuit. The results are diagrammatically shown in the bottom left aswell as on the Q-sphere on the bottom right. Qiskit code that represents the circuit is generated in the right panel.​ -```{card} IBM Quantum Composer - +``````{card} +```{image} ./ibm-composer.png +:align: center ``` +`````` ### Xanadu @@ -460,12 +462,13 @@ Here is the link to [Xanadu codebook](https://codebook.xanadu.ai/). Please also ### D-Wave Leap IDE + +We see a similar structure to IBM and Xanadu with D-Wave with some differences. Most notably that D-Wave uses **quantum annealing** based programming, with Ocean, and quantum annealing hardware. Ocean is D-wave's software suit. D-Wave also offers unique hybrid Classical-Quantum Solvers. Classical simulation can also be performed on D-Waves so-called classical solvers. D-Wave also offers an online cloud-computing service akin to IBM and Xanadu called the Leap IDE. ​ + ```{drawio-image} ./dwave-diag.drawio :align: center ``` -We see a similar structure to IBM and Xanadu with D-Wave with some differences. Most notably that D-Wave uses **quantum annealing** based programming, with Ocean, and quantum annealing hardware. Ocean is D-wave's software suit. D-Wave also offers unique hybrid Classical-Quantum Solvers. Classical simulation can also be performed on D-Waves so-called classical solvers. D-Wave also offers an online cloud-computing service akin to IBM and Xanadu called the Leap IDE. ​ - To checkout the D-wave's cloud setup, click this [link](https://www.dwavesys.com/solutions-and-products/cloud-platform/), and to signup for the cloud services, check [link](https://cloud.dwavesys.com/leap/signup/​). Following video gives an intro to D-wave's quantum computing setup. ```{youtube} eFIk7wpU5vA diff --git a/lecture-08/ibm-composer.png b/lecture-08/ibm-composer.png new file mode 100644 index 0000000..789fbd3 Binary files /dev/null and b/lecture-08/ibm-composer.png differ diff --git a/lecture-08/ibm-q-platform.png b/lecture-08/ibm-q-platform.png new file mode 100644 index 0000000..eeb4bf9 Binary files /dev/null and b/lecture-08/ibm-q-platform.png differ diff --git a/lecture-08/instructions/instructions.md b/lecture-08/instructions/instructions.md index 05b25c5..cedf4ee 100644 --- a/lecture-08/instructions/instructions.md +++ b/lecture-08/instructions/instructions.md @@ -6,7 +6,10 @@ The link to install annaconda and installation instruction can be found [here](h --- -# Instructions for installing Julia for YAO +## Instructions for installing Julia for YAO + +### Using Conda + 1. Create an environment in conda each for julia ```bash conda create -n julia-env python=3 notebook @@ -25,27 +28,45 @@ The link to install annaconda and installation instruction can be found [here](h conda install -c conda-forge julia ``` - If you want a separate julia installation other than conda, you can download from official julia download pare [here](https://julialang.org/downloads/). + +If you want a separate julia installation other than conda, you can download from official julia download pare [here](https://julialang.org/downloads/), or use your operating system's package manager as bellow. + +### system level installation + +Since Julia has it's own package management, one may also just want to install at system level. + +On linux, most package managers have julia included, such as on Ubuntu you can install it by following terminal command - + +```bash +sudo apt install julia +``` + +On MacOS one can install via `Homebrew` +```zsh +brew install julia +``` --- -4. Now we need to install julia kernel to be able to use them in python notebook. Julia does it's own package management, so we need to install the kernel through julia. Let's first launch julia by simply typing following in the terminal - - ```bash - julia - ``` - This will run julia, and you will see julia prompt similar to python/ipython prompt. Within the prompt, now we run the following in sequence- - ```julia - using Pkg; Pkg.add("IJulia") - ``` - This will install IJulia which provides ability to use julia kernel. - - We further configure the kernel by following command - - ```julia - using IJulia - installkernel("[Julia 4 cpu]", env=Dict("JULIA_NUM_THREADS"=>"4")) - ``` - The *installkernel* command is taking two arguments, first is a string, that is name of the kernel (visible when choosing a kernel in vscode/jupyter notebook) and next one defines a variable JULIA_NUM_THREADS which tells julia kernel how many cpu threads it can use. We choose 4, but it can be any positive number ≤ total number of cpu threads on your machine (laptop/desktop). + +Once we have julia installed, we need to install julia kernel to be able to use them in python notebook. Julia does it's own package management, so we need to install the kernel through julia. Let's first launch julia by simply typing following in the terminal - +```bash +julia +``` +This will run julia, and you will see julia prompt similar to python/ipython prompt. Within the prompt, now we run the following in sequence- +```julia +using Pkg; Pkg.add("IJulia") +``` +This will install IJulia which provides ability to use julia kernel. + +We further configure the kernel by following command - +```julia +using IJulia +installkernel("[Julia 4 cpu]", env=Dict("JULIA_NUM_THREADS"=>"4")) +``` +The *installkernel* command is taking two arguments, first is a string, that is name of the kernel (visible when choosing a kernel in vscode/jupyter notebook) and next one defines a variable JULIA_NUM_THREADS which tells julia kernel how many cpu threads it can use. We choose 4, but it can be any positive number ≤ total number of cpu threads on your machine (laptop/desktop). + --- -5. We just setup a functioning julia kernel. When you open any notebook, it shows an option in top right corner to *select a kernel*. So now you can go ahead and open a julia notebook in vscode. You should be able to see "Julia 4 cpu" (or whichever name you chose) as a julia kernel from the list of jupyter kernels. Select it, and run any julia code in the cell. Happy coding! +We just setup a functioning julia kernel. When you open any notebook, it shows an option in top right corner to *select a kernel*. So now you can go ahead and open a julia notebook in vscode. You should be able to see "Julia 4 cpu" (or whichever name you chose) as a julia kernel from the list of jupyter kernels. Select it, and run any julia code in the cell. Happy coding! ![Julia Kernel](./julia-kernel.png) diff --git a/lecture-08/lambeq-example.png b/lecture-08/lambeq-example.png new file mode 100644 index 0000000..a94f6fa Binary files /dev/null and b/lecture-08/lambeq-example.png differ diff --git a/lecture-08/landscape-of-sdks-tools.md b/lecture-08/landscape-of-sdks-tools.md index 8e39ecf..3e65169 100644 --- a/lecture-08/landscape-of-sdks-tools.md +++ b/lecture-08/landscape-of-sdks-tools.md @@ -1,12 +1,20 @@ --- title: Landscape of Quantum SDK's and Tools -layout: post -mathjax: true -mermaid: true +jupytext: + formats: md:myst + text_representation: + extension: .md + format_name: myst +kernelspec: + display_name: Python 3 + language: python + name: python3 +mystnb: + render_markdown_format: myst --- -(lecture-6)= -# Lecture 6: Landscape of Quantum SDK's and Tools +(lecture-8b)= +# Lecture 8b: Landscape of Quantum SDK's and Tools ```{warning} These lecture notes are a work in progress and are not a replacement for watching the lecture video, it's intended to be a supplementary reading after watching the lecture ``` @@ -41,7 +49,7 @@ Some of the most common terms in softwares and programming in general are the fo Then we'll introduce the notion of the quantum programming stack, which overlaps the lower two layers of the Quantum Stack. This encapsulates the idea that these two layers are tightly connected and in order to build a functioning quantum programming stack, one must carefully select the compatible components from the two constituting layers. Alternatively a number of big vendors provide pre-integrated quantum programming stacks as a service, deployed in a cloud environment, some components of which could also be used locally. Another approach are the so called Quantum Orchestrators which are very similar to the QPSaaS, but they are generally provided by smaller, independent quantum software companies. The Quantum Orchestrators are generally bespoke and more flexible and could be deployed either on-prem or in the cloud. ​ ```{mermaid} -:center: +:align: center graph LR; linkStyle default fill-opacity:0.0,stroke-width:0px,stroke-opacity:0.0 @@ -53,29 +61,167 @@ Then we'll introduce the notion of the quantum programming stack, which overlaps 3(Circuit Based) --- 4(Anolog) end end + ``` + ## High-Level Quantum Software -### Quantum programming languages + + +### Quantum programming languages +Here we try to establsh what a quantum programming language is, which also gives us insight into quantum computing softwares. Well, what is a quantum programming language? To answer this question we will first recall a classical programming language, which is a type of human-computer interface used to create programs to run on classical computers. It uses typographical notations to express the desired classical computational operations: + +- Some building blocks of computational operations are Logical gates: **OR**, **AND** etc. + +Once you create a program using a classical language, then it can be *compiled* into instructions the classical hardware can understand and execute. + +In contrast, A quantum programming language is a type of human-computer interface used to create programs to run on quantum computers or quantum software simulators. It uses typographical notations to express the desired quantum computational operations: + +- Some building blocks of quantum computational operations are quantum gates: **Hadamard**, **CNOT**, Rotation gates $\mathbf{R_x, R_y, R_z}$ etc. + +Once you create a quantum program, similar to classical programs, it can be compiled into instructions that your choice of hardware can understand and execute. Most notably with quantum hardware, we can make use of the advantage it's quantum nature provides.  And so, quantum programming languages are designed with the ease of use of quantum properties, such as entanglement and superposition. +Keep in mind, our quantum programs can also be executed on classical hardware as a simulation, although this is limited in scale it is still useful for testing and prototyping programs.    + + ### Generic quantum languages & libraries -```python +There are different types of quantum programming languages (QPL). The most vastly used QPL today are the generic Quantum language libraries. Some quantum programming environments are separate programming languages (for example **Q#** and **Silq**) while other are extensions (in the form of additional libraries) to existing programming languages. Currently a lot of quantum programming libraries are based on Python (like Qiskit and Pennylane), but other languages are also supported, like Yao.jl for Julia and Intel Quantum SDK for C++. + +These languages and libraries are not built with a specific application in mind, rather their purpose is to be able to provide generic quantum programming primitives to accommodate the implementation of quantum algorithms from different domains. + +In the example code snippet written in Qiskit on the first line we define a quantum circuit with 2 qubits, then apply a Hadamard gate on the first qubit (0-indexed, as is custom in Python), then apply a CNOT gate between the first and second qubit. At the end we draw the resulting quantum circuit. This high-level programming abstraction allows us to define any number of qubits and apply any number of gates in predefined order without worrying about the underlying quantum hardware software emulator implementation. + +One point to reiterate is that the gate-based quantum computing paradigm is universal, hence the quantum programming languages and libraries based on it are also universal. In contrast the annealer-based QPL sacrifice universality for specialization in domains in which annealing provides computational advantage. + +```{code-cell} +import qiskit # Qiskit -qc = QuantumCircuit(2) # this constructs a quantum circuit object named qc. +qc = qiskit.QuantumCircuit(2) # this constructs a quantum circuit object named qc. # quantum circuit object has methods, that can add different gates to the circuit. qc.h(0) # Applies the Hadamard gate to the first qubit. + qc.cx(0, 1) # Applies the CNOT gate between the first two qubits. -qc.draw() # Print the drawing of the circuit. + +qc.h(1) # applies the Hadamard gate to the second qubit + +qc.draw(output='mpl', scale=1.5) # Print the drawing of the circuit. ``` +QL are similar in some regards to classical hardware description +languages, for example Verilog, as far as they describe the desired +computation in terms of a succession of basic operations on +computational units. For example on the right hand side we +have a classical adding circuit, and we can see how it can be +represented as a series of logical gates applied to some inputs. +In quantum computing we have a similar flow where qubits are +inputted to a circuit where quantum gates are applied. + +We should also mention some similarities and dissimilarities +between classical circuit and quantum circuits: +One example is photonics based quantum circuits where photons +(playing the role of qubits) are physically passing through +a course composed of photonic actuators (playing the role of gates). +This setup is very similar to a classical circuit, where electrical +current (bit) is passing through electrical components (gates). +On the other had we have the in-situ quantum computation where +gates (for example pulses) are applied to stationary +physical entities, representing qubits. Another example is +superconducting quantum circuits. + +The problem of measurement in Quantum Circuits: +One important difference between our classical and quantum circuits +is in the nature of our output. In the classical circuit, we can +simply take a voltage reading of our circuit to obtain a binary +result on each wire. In the quantum scenario we must perform a +measurement on our qubit, which collapses the qubit into a binary +state, this necessarily destroys our quantum state and we cannot +get any additional information beyond the binary result. + +```{figure} ./qc-cc.png +:align: center +``` ### Specialised quantum languages & libraries + +Aside from the generic quantum languages and libraries, +we also have specialised languages and libraries. These +are designed and optimised for specific application domains, +like Quantum chemistry, QNLP, QML and others. For example the +Tequila library is geared towards solving problems in the +quantum chemistry domain. Another example is the Lambeq library +which aims to represent sentence grammatical structures in the +form of a quantum circuit as depicted below. The sentence +"John walks in the park" is deconstructed using diagrammatic +methods and then represented in a quantum circuit. +We can then use this circuit in natural language processing +applications like classification or sentiment analysis. + +```{figure} ./lambeq-example.png +:align: center +``` + +Below are some examples of specialised libraries. + +|Library |Specialised usage | +|--- |--- | +|Lambeq |Quantum natural language processing| +|Tequila |Quantum chemistry | +|OpenFermion |Quantum chemistry | +|Tensorflow Quantum |Quantum machine learning | +|Ocean |Annealing | + + ## Low-Level Quantum Software +Let's touch upon the low-level quantum software. In particular, +we take a look at the low-level intermediate representation languages +that serve as an interface between many high-level quantum +software languages and the target quantum computing hardware +platforms. In other words, in a similar way to classical +programming the high-level languages are translated to an +intermediate language which is then used to apply the +instructions to quantum hardware. + +Below we show a comparison between a high level language and an 'intermediate' operation. +One of the more common intermediate languages is `OpenQASM` +as you see on the right hand side. In this example we create a +Bell state. The corresponding high-level code written in Qiskit +can be seen on the left. Some consider these intermediate +representations the equivalent to assembly in the classical +programming world. They provide similar functionality, for +example different high-level Quantum Languages could be +converted to the same intermediate representation which provides a mechanism to +target different quantum systems with the same high level code. + +https://devblogs.microsoft.com/qsharp/introducing-quantum-intermediate-representation-qir/ + +``````{grid} 2 2 2 2 + +````{card} Qiskit + +```python +from qiskit import ( + QuantumRegister, + ClassicalRegister, + QuantumCircuit) +reg_q = QuantumRegister(2, 'q') +reg_c = ClassicalRegister(2, 'c') +circ = QuantumCircuit(reg_q, reg_c) + +circ.h(reg_q[0]) +circ.cx(reg_q[0], reg_q[1]) +circ.measure(reg_q[0], reg_c[0]) +circ.measure(reg_q[1], reg_c[1]) +``` + +```` + +````{card} OpenQASM + ```openqasm OPENQASM 2.0; include "qelib1.inc"; @@ -87,11 +233,97 @@ h q[0]; cx [0], q[1]; measure q[0] -> c[0]; measure q[1] -> c[1]; + + ``` +```` +`````` + + + ## Quantum Programming Stacks as a Service +A lot of quantum programming stacks could be installed and configured locally, but this could be a laborious process. As discussed in the previous module, a lot of companies provide readily available quantum programming stacks online or on-prem. This also provides an environment in which users can access and run programs on real quantum hardware, which isn't available on a local level. As reminder some example include, IBM's quantum lab and google's quantum AI. Generally, the only requirement to use these environments is to set up a free account on these vendor's websites. Signing up for a free account however, generally comes with a drawback in the size of the quantum hardware you have access to. If you want to use the most powerful quantum hardware, you may need to contact your respective vendor to use it for research purposes and also possibly pay a fee. + +The layers in these quantum programming stacks could be developed entirely internally (as is he case of the IBM Quantum Stack) or they could be an integration of quantum layers from different providers – for example Amazon Braket. Another point is that, at present, there is a big overlap between the Quantum programming stacks supported by the different commercial vendors. Quantum programming is still in it's early days, there are a lot of new components developed all the time. Hence the vendors would never manage to integrate all components that might be of interest for a particular project or application of QC.  + +These out-of-the-box quantum programming stacks come with some pros and cons. For instance, all of the components are tested to work together which allows the user the concentrate solely on application development. One drawback of these pre-integrated stacks is that they are limited to the components supported by the vendor. Another drawback, as is the case across the board, the quantum hardware is only remotely accessible. In contrast, you can run classical simulations locally and remotely. + + +``````{grid} 2 2 2 2 + +````{card} IBM Quantum Lab + +```{drawio-image} ./ibm-q.drawio +:export-scale: 70 +``` + +```` + +````{card} Amazon Braket + +```{drawio-image} ./braket.drawio +:export-scale: 70 +``` + +```` +`````` +Pros: +- All components (even the ones coming from different providers) are tested to work together. +- Allows the customers to concentrate on testing and creating solutions using Quantum Software. + +Cons: +- Limited to the Quantum SDKs and/or Quantum Hardware that is supported by the vendor. +- Classical simulations could be run on-prem, but there is no local access to Quantum Hardware. + ## Quantum Workflows & Orchestrators + +Quantum Orchestrators bear a lot of similarities to commercial QPSaaS. QO allow the creation of bespoke Quantum programming stacks could be deployed locally or remotely (in public or private cloud). The key difference between quantum orchestrators and other quantum programming stacks is that quantum orchestrators allow for the management and optimisation of both classical and quantum programs on classical and quantum hardware as well as data management and access. This is ideal for problems that require classical programs to work in tandem with quantum programs. This gives the user more control in the design of their application or research. Nowadays the distinction of QO and QPSasS becomes more and more blurred. Examples of quantum orchestrators include - + +- Qrquestra +- Strangeworks + + +```{figure} ./qp-orchestrator.png +:align: center +``` + ## Custom Quantum Software Stacks +As discussed already above, there are specialised quantum languages and libraries for specific applications.  + +There are also projects implementing specialised components of the quantum programming stack, which are not necessarily targeted directly at specific applications. One example is Qulacs, which is a the standalone high performance quantum circuit simulator (written in C++), which can be integrated with a large number of high-level QLLs. + +This opens the door to building specialised quantum stacks made up of one or more of these libraries and/or some generic quantum libraries and languages. Building specialised quantum stacks is analogous to the building of a rocket with components manufactured and supplied by different vendors. + +Custom quantum software stacks are useful when we want to accomplish a specific task that cannot be performed efficiently or at all by a generic quantum stack. They consist of components, provided by different vendors, that may be specialized for certain tasks. It's not quite rocket science but the integration is challenging because it requires a careful selection of compatible components.  + +Below we show a custom quantum programming stack, built by ICHEC for a quantum chemistry project. + +### Custom Quantum software stack example: QPFAS + +Quantum computing simulation of PFAS molecule (QPFAS) - Study of bond breaking. + +```{figure} ./pfas-mol.png +:align: center +``` + +An example is the custom quantum software stack, built for the Quantum PFAS project, which was a joint project between ICHEC and an industry partner.  QPFAS aims to study the nature of bond-breaking in different molecules with the end-goal of understanding how to break down so-called PFAS molecules. +We used these components because at the time project was being defined (2019/2020) there was no +integrated quantum software stack that could be used for quantum chemistry. Also integration with HPC software (Dask) required wrapping a lot of existing components in custom code. + +### QPFAS components and diagram + +Lets take a look at the specific quantum software components used. First we have the quantum chemistry library Tequila, which was used to define the molecules in our problem. In the first iteration of the project, Tequila was interfacing with Qulacs directly to run quantum chemistry simulations on HPC hardware. At a later stage the quantum chemistry simulations were ran on actual quantum hardware, which required extending the existing code with support for Qiskit. Qiskit was used to convert Tequila code to the OpenQASM intermediate representation, which was the format supported by the trapped ion hardware vendor. This vendor provided classical simulation as well as access to quantum hardware on which the program was run. + +```{figure} ./qpfas.png +:align: center +``` + +```{admonition} Julia instructions +:class: tip + +Instructions for using Julia and Julia Yao can be found [here](./instructions/instructions.md) +``` diff --git a/lecture-08/pfas-mol.png b/lecture-08/pfas-mol.png new file mode 100644 index 0000000..e2bea23 Binary files /dev/null and b/lecture-08/pfas-mol.png differ diff --git a/lecture-08/qc-cc.png b/lecture-08/qc-cc.png new file mode 100644 index 0000000..530d2a3 Binary files /dev/null and b/lecture-08/qc-cc.png differ diff --git a/lecture-08/qp-orchestrator.png b/lecture-08/qp-orchestrator.png new file mode 100644 index 0000000..6631e47 Binary files /dev/null and b/lecture-08/qp-orchestrator.png differ diff --git a/lecture-08/qpfas.png b/lecture-08/qpfas.png new file mode 100644 index 0000000..e300015 Binary files /dev/null and b/lecture-08/qpfas.png differ diff --git a/lecture-09/cloud-qc.md b/lecture-09/cloud-qc.md new file mode 100644 index 0000000..8fb5cbd --- /dev/null +++ b/lecture-09/cloud-qc.md @@ -0,0 +1,45 @@ +--- +title: Heterogeneous Quantum Computing on AWS with Amazon Braket +--- + +(lecture-9)= +# Lecture 9: Heterogeneous Quantum Computing on AWS with Amazon Braket + +```{admonition} Overview +:class: tip + +This is a placeholder for the Guest Lecture. It will be populated in due time with necessary prerequisits, and supplementary content on Heterogeneous Quantum Computing. +``` + +## About the guest + +```{admonition} The Speaker: Dr. Sebastian Stern + +Dr. Sebastian Stern is a Senior Specialist Solutions Architect for Quantum Computing at [Amazon Web Services](https://aws.amazon.com/) (AWS). In his role, he works with AWS customers to explore and build quantum computing solutions in the cloud, with a focus on [Amazon Braket](https://aws.amazon.com/braket), the quantum computing service of AWS. Sebastian studied Physics at the Technical University of Munich (TUM) and earned his PhD at the Max Planck Institute for Physics in Munich, Germany. He spent several years in academic research in the field of High Energy Physics and researched in the Higgs boson working group at the LHC at CERN. Later, he has been working in several tech industry roles, accelerating enterprises and public sector organizations in their adoption of emerging technologies. Sebastian joined AWS in 2019 and is affiliated with the wordwide Advanced Compute specialists team. + +LinkedIn profile: [www.linkedin.com/in/sebastianstern](http://www.linkedin.com/in/sebastianstern) + +``` + +```{admonition} Lecture Summary + +Join this guest lecture for a practical, demo-based overview of heterogeneous quantum computing capabilities on AWS. We will start with a technical introduction to Amazon Braket, the quantum computing cloud service of AWS, followed by a live demo of how to build a run quantum circuits on cloud-based simulators and real quantum processing units (QPUs). We then focus on hybrid quantum-classical computation and variational algorithms and explore in a demo how to run an entire quantum algorithm in the managed cloud environment provided by Amazon Braket. In the second part of the lecture we review an application for quantum computing. We explore together how we can solve a paradigmatic graph optimization problem with different quantum computing paradigms, implemented on QPUs available on Amazon Braket. Specifically, we will explore how to solve the Maximum Independent Set problem with the Quantum Approximate Optimization Algorithm (QAOA) on gate-based quantum computers and, alternatively, with Analog Hamiltonian Simulation on a Rydberg atom quantum computer. + +``` + + +```{admonition} References + +Students who are interested to immerse themselves in the topics we will cover during the lecture can review the following resources: + +- The [Amazon Braket public website](https://aws.amazon.com/braket/) is a good starting point to get a high-level overview of the service and its capabilities. The [developer guide](https://docs.aws.amazon.com/braket/latest/developerguide/what-is-braket.html) provides more detailed information how to work with Braket. + +- In the first demo, we explore how we can build a quantum circuit preparing a [GHZ state](https://en.wikipedia.org/wiki/Greenberger%E2%80%93Horne%E2%80%93Zeilinger_state) with the open-source [Amazon Braket Python SDK](https://github.com/amazon-braket/amazon-braket-sdk-python) and how we can run the circuit on simulators and QPUs available on Amazon Braket. We will also learn how we can run circuits built with third-party software like [Qiskit](https://github.com/qiskit-community/qiskit-braket-provider) and [PennyLane](https://github.com/amazon-braket/amazon-braket-pennylane-plugin-python) directly on Braket. + +- After we have familiarized with Braket, we will run through two examples solutions for the [Maximum Independent Set](https://www.quera.com/glossary/maximum-independent-set) graph optimization problem. + +- The first example will use the [Quantum Approximate Optimization Algorithm](https://arxiv.org/abs/1411.4028), implemented with [PennyLane](https://pennylane.ai/qml/), an open-source library for differentiable programming of quantum computers, and executed with [Amazon Braket Hybrid Jobs](https://pennylane.ai/qml/demos/getting_started_with_hybrid_jobs/) + +- The second example solution is realized with Analog Hamiltonian Simulation using Rydberg atom arrays (https://aws.amazon.com/blogs/quantum-computing/optimization-with-rydberg-atom-based-quantum-processor/, https://arxiv.org/abs/2202.09372). + +``` \ No newline at end of file diff --git a/lecture-09/heterogeneous-quantum-computing.md b/lecture-09/heterogeneous-quantum-computing.md deleted file mode 100644 index 8311fa6..0000000 --- a/lecture-09/heterogeneous-quantum-computing.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Heterogeneous Quantum Computing -layout: post ---- - -(lecture-9)= -# Lecture 9: Heterogeneous Quantum Computing - -```{admonition} Overview -:class: tip - -This is a placeholder for the Guest Lecture. It will be populated in due time with necessary prerequisits, and supplementary content on Heterogeneous Quantum Computing. -``` \ No newline at end of file diff --git a/lecture-10/quantum-algorithms-1.md b/lecture-10/quantum-algorithms-1.md index 13cc132..f6c8dac 100644 --- a/lecture-10/quantum-algorithms-1.md +++ b/lecture-10/quantum-algorithms-1.md @@ -1,10 +1,10 @@ --- -title: Quantum Algorithms - I +title: Early Quantum Algorithms layout: post --- (lecture-10)= -# Lecture 10: Quantum Algorithms - I +# Lecture 10: Early Quantum Algorithms ```{warning} These lecture notes are a work in progress and are not a replacement for watching the lecture video, it's intended to be a supplementary reading after watching the lecture ``` @@ -147,253 +147,6 @@ Let's start with a quick recap of why we need quantum computers: - Another solution to face the errors is to modify the algorithms and try to make them shallower and using less qubits. -## NISQ era and algorithms - -- NISQ stands for Noisy Intermediate Scale Quantum. This describes the current state of quantum hardware, with approximately 100 qubits, subject to noise. - -- To work with this circuit, shallow quantum algorithms with low number of qubits are needed. In most of the cases, this algorithms are embbeded to a classical algorithm, resulting on _hybrid classical-quantum algorithms_. - -- The most common type of NISQ algorithms are the variational quantum circuits (VQCs), which are quantum circuits that contain classical parameters that need to be classically optimised. -```{image} ./images/nisq_algorithm.jpg -:align: center -``` - -### Variational quantum algorithms - -- One can think as VQC's as trainable quantum circuits. Different problems will require different gates and parameter structure. - -- In order to train the variational parameters, we will measure the output of the circuit, sent it to a cost function (which is problem-dependant) and perform an optimisation step (like stochastic gradient descent) to update the parameters. We can repeat this process until we get a set of parameters that make the circuit output the desired solution. -```{image} ./images/vqc.jpg -:align: center -``` - -- We can use VQCs to solve simulation, optimisation and machine learning problems. - -- Even though VQCs by themselves doesn't allow us to solve large problems, its integration in classical pipelines may be of interest in the near future. - -### Map of NISQ algorithms - -In the diagram below we can see some of the applications of NISQ algorithms. We will cover the different areas of application (simulation, optimisation and machine learning) in the following sections. -```{image} ./images/nisq_applications.jpg -:align: center -``` - -### Quantum algorithms and applications - -In the diagram below we can see another diagram showing the problems solved by NISQ algorithms and the sectors in which these algorithms are useful. As examples, the maximum-cut proble is frequent in the tech sector, like in the study of networks. On the other hand fluid dynamics is present in aerospace engineer, or the travelling salesman problem in logistics. - -```{image} ./images/nisq_applications_2.jpg -:align: center -``` - - -### Simulation - -- Simulation of quantum systems aims to predict the behaviour of a complex physical system such as a molecule. It remains extremely difficult for a classical computer to simulate this kind of systems. -```{image} ./images/simulation_1.jpg -:align: center -``` - -- These complex systems are generally composed of interacting quantum objects, which can be simulated on quantum computers by directly mapping these objects onto qubits. - -- To run a quantum computing simulation algorithm, we have to encode the problem we are solving in a mathematical function called Hamiltonian, which can be thought as the energy model for the system. After encoding the Hamiltonian in the qubits of our circuit, we can apply one of our simulation algorithms to reach the desired solution. -```{image} ./images/simulation_2.jpg -:align: center -``` - -### Advantage of NISQ simulation algorithms - -- Quantum systems like molecules are easy to simulate with other quantum systems (qubits are quantum systems!), as they maintain the same properties and follow the same physical laws. - -- As quantum systems are very complex, they are impossible to simulate classically due to memory constraints when the system size exceeds $N=50$. - -- This however doesn't mean that any problem computation done with more than 50 qubits can't be solved classically using alternative methods. - - -### Simulation map - -```{image} ./images/simulation_map.jpg -:align: center -``` - -- Above is shown the mapping between quantum simulation algorithms and some of their applications in specific industries. - -- Algorithms are shown in red, applications in green, and more abstract problems in blue. - -- Algorithms can solve a set of particular problems, shown in blue, which can be used for a particular application on an industry. - -- As we see, the generic simulation algorithms are the Variational Quantum Eigensolver (VQE) and the Quantum Approximate Optimsation Algorithm (QAOA). The objective of both algorithms is to measure the energies of some Hamiltonian. - -### The variational quantum eigensolver - -- Looking back at the Benzene molecule we saw at the beginning of the lecture, let's see how we can use the VQE to find its minimum energy state in a process called eigensolving. - -- We can encode the Benzene molecule in a Hamiltonian in which we can the apply the VQE to. - -- Each of our qubits will represent one component of the system. We can apply evolution operators to these qubits, which will contain variational quantum parameters, that will be optimised until we find the desired minimum energy. -```{image} ./images/vqe.jpg -:align: center -``` - -### PFAS molecule destruction - -- An important use-case of the VQE is the study of PFAS (per-and polyfluoroalkyl) molecule destruction. These molecules are used as heat, water and oil resistant coatings in many areas. - -- These molecules are present in many materials, and have the inconvenient that are toxic to human bodies and they can easily contaminate water. Thus, there is an interest in chemical degradation and destruction of these molecules. In order to break these molecules we need to be able to simulate their energies, something that can be done with the VQE. - -### Optimisation - -- Optimisation is a branch of mathematics and computer science that deals with finding the best solution (maximum or minimum) of some problem, by performing iterations of a given algorithm. - -- One may want to minimise quantities like energy use or manufacturing time, or maximise profit for example. - -- It turns out that the VQCs we have seen before are promising candidates to solve optimisation problems. - -- An optimisation problem can be encoded on a VQC. The quantity we want to maximise/minimise would therefore be a function of the output when measuring the VQC. We can update the variational parameters of the VQC (using a classical optimiser) in successive iterations until the desired solution for our optimisation problem is attained. -```{image} ./images/optimisation.jpg -:align: center -``` - -### Optimisation map - -```{image} ./images/optimisation_map.jpg -:align: center -``` - -- Above is shown the mapping between quantum optimisation algorithms and some of their applications in different industries. - -- When comparing this map with the one we presented before for simulation, we seen than the Grover adaptative search algorithm has been added now. This algorithm is a NISQ variation of Grover's algorithm, where Grover search is iteratively applied and classically optimised to find good solutions. - -- As we see, the applications and sectors are different when we compare them to the simulation map. - -### Max-cut problem - -- A graph is a structure made up of various nodes that have weighted connections (edges) between them. They can be used to model different problems and scenarios. For example social media users can be modelled using a graph, where its edges represent the influence between different users. - -- The Max-cut problem aims to do a binary partition of the nodes of the graph so that the sum of the weights of the connections between the two sets is maximised. In the image below we can see how the graph's nodes were divided in two sets: one conatining nodes 0,3 and the other containing nodes 1,2. -```{image} ./images/max_cut.jpg -:align: center -``` - -- The Max-cut problem can be easily mapped to what is called an Ising Hamiltonian, which can be easily encoded and optimised on quantum computers. - -- The Max-cut problem has applications in many areas including clustering, or graph and electrical design. It is often used as benchmnarking for evaluating optimisation techniques. - -### Travelling-salesman problem - -- The travelling-salesman problem is another famous optimisation problem. Given a list of cities represented with nodes on a graph, and its distances represented by the weighted edges, the objective of this problem is to find the shortest possible route, so that each city is visited just once, and the starting and ending point of the route is the same. - -- Similarly to Max-cut, this problem can be easily mapped to an Ising hamiltonian and optimised in a quantum computer. In the image below we can see the graph representing the problem (left) and the shortest optimal route (right). -```{image} ./images/travelling_salesman.jpg -:align: center -``` - -- This problem has different applications in many areas, being finance and marketing among the most notable ones. - -### Optimisation using annealing - -- Until now we have mainly focused on VQCs, a type of quantum algorithm that is meant to be implemented on a gate-based quantum computer. However, there exist other types of quantum computer architectures that are good when it comes to solve optimisation problems. - -- One of these architectures is what is called quantum annealing. This type of quantum computers are only capable of solving problems that can be encoded as Ising Hamiltonians. - -- While this is a limitation, it is compensated by the fact that annealers have more than 5,000 qubits available, meaning that the size of the problems that can be solved is much larger when compared to gate based computers. -```{image} ./images/annealing.jpg -:align: center -``` - -- One of the most promising quantum annealing applications is portfolio optimisation. - - -## Machine learning - -- The primary goal of machine learning is to develop models that can generalize well to new, unseen data, allowing them to make accurate predictions or decisions in various situations. - -- A simple example of a machine learning task is image classification. In the image below we can see bees and ants. One machine learning model (which is well trained), would be capable of distinguishing between the bees and ants in the image. -```{image} ./images/machine_learning.png -:align: center -``` - -### Advantage of NISQ machine learning algorithms - -- We can find different computational bottlenecks in a classical machine learning workflow. One example of this is matrix-vector multiplication, a seemingly simple operation which consumes a lot of computation power when the matrices are very large. -```{image} ./images/matrix.jpg -:align: center -``` - -- Other examples of computationally expensive tasks appearing in machine learning tasks are Fourier transforms, diagonalising matrices or solving linear systems of equations. - -- With quantum algorithms it is thought that we can get an speed-up in some of these tasks. - - -### Machine learning map - -```{image} ./images/machine_learning_map.jpg -:align: center -``` - -- Above is shown the mapping between quantum machine learning algorithms and some of their applications in different industries. - -- When compared to the previous maps we have shown, it can be seen that VQCs are still important here, and also the quantum embedding kernels, which are based on classical kernel methods but implemented on a quantum computer. - -- Among the applications we find neural networks (we can use VQCs as one neural network layer) or quantum generative adversarial methods (quantum GANs), that can be used to generate data that resembles the original data used for training. These are especially important in fraud detection in finance industry. - -### Classical neural networks - -```{image} ./images/neural_network.jpg -:align: center -``` - -- A classical neural network is composed of multiple layers of transformations, governed by certain weights and parameters, which are represented in nodes in the image. - -- A vector is input to the networks and is transformed multiple times until we get the output vector. - -- The parameters of the network are trained to minimise a cost function that will depend on the quantity that we are measuring. - -### Quantum neural network - -- A quantum neural network is a neural network where one of more of the layers is a VQC. - -- As we seen in the previous section, each layer of the network is governed by a set of parameters. When a layer is a VQC, these parameters will be the variational parameters appearing in the quantum circuit, that will be optimised during the training phase. - -- What the benefits are of having a VQC as layer is still an open question in quantum machine learning. -```{image} ./images/quantum_neural_network.jpg -:align: center -``` - -### Quantum tranfer learning - -- Quantum transfer learning is a technique that falls within the field of quantum neural networks. - -- This technique involves using a pre-trained classical neural network, and substituting one of the layers of the networks by a VQC, as we can see in the image. - -- The VQC variational parameters are trained using the output of the pre-trained classical neural network to get the desired result. -```{image} ./images/quantum_transfer_learning.jpg -:align: center -``` - -### Quantum machine learning example - -- Let's return to the image processing task on bees and ants that we saw before to see an example of application of quantum machine learning. - -- As we see in the diagram, we input an image encoded in 512 pixeles to a pre-trained neural network on image classification. - -- After that a layer is applied to reduce dimensionality, and its output is sent to a VQC with 4 parameters. Then, another layer is applied to get a 2-dimensional vector with out predictions -```{image} ./images/quantum_machine_learning_example.jpg -:align: center -``` - -### Anomaly detection with qGANs - -- As we have seen before, GANs have seen great success in anomaly detection. - -- A GAN consists of two neural networks, a generator and a discriminator. The generator aims to to create a dataset which is indistinguishable from the training data provided, and the discriminator aims to succesfully distinguish between these two datasets. - -- After training these two networks, the discriminator will be capable of detecting anomalies on unseen data. - -- The classical GANs have shown limitations in training phase and sampling procedure. That is why in qGANs the classical generator is replaced with a VQC to try to overcome this limitations. -```{image} ./images/qGANs.jpg -:align: center -``` ## Wrap-up Learning outcomes achieved: @@ -401,7 +154,3 @@ Learning outcomes achieved: - Searching - Cryptography - Grasping potential advantage of quantum algorithms -- Introduction to NISQ algorithms and their applications in different areas - - Simulation - - Optimisation - - Machine learning diff --git a/lecture-10/images/annealing.jpg b/lecture-11/images/annealing.jpg similarity index 100% rename from lecture-10/images/annealing.jpg rename to lecture-11/images/annealing.jpg diff --git a/lecture-10/images/machine_learning.png b/lecture-11/images/machine_learning.png similarity index 100% rename from lecture-10/images/machine_learning.png rename to lecture-11/images/machine_learning.png diff --git a/lecture-10/images/machine_learning_map.jpg b/lecture-11/images/machine_learning_map.jpg similarity index 100% rename from lecture-10/images/machine_learning_map.jpg rename to lecture-11/images/machine_learning_map.jpg diff --git a/lecture-10/images/matrix.jpg b/lecture-11/images/matrix.jpg similarity index 100% rename from lecture-10/images/matrix.jpg rename to lecture-11/images/matrix.jpg diff --git a/lecture-10/images/max_cut.jpg b/lecture-11/images/max_cut.jpg similarity index 100% rename from lecture-10/images/max_cut.jpg rename to lecture-11/images/max_cut.jpg diff --git a/lecture-10/images/neural_network.jpg b/lecture-11/images/neural_network.jpg similarity index 100% rename from lecture-10/images/neural_network.jpg rename to lecture-11/images/neural_network.jpg diff --git a/lecture-10/images/nisq_algorithm.jpg b/lecture-11/images/nisq_algorithm.jpg similarity index 100% rename from lecture-10/images/nisq_algorithm.jpg rename to lecture-11/images/nisq_algorithm.jpg diff --git a/lecture-10/images/nisq_applications.jpg b/lecture-11/images/nisq_applications.jpg similarity index 100% rename from lecture-10/images/nisq_applications.jpg rename to lecture-11/images/nisq_applications.jpg diff --git a/lecture-10/images/nisq_applications_2.jpg b/lecture-11/images/nisq_applications_2.jpg similarity index 100% rename from lecture-10/images/nisq_applications_2.jpg rename to lecture-11/images/nisq_applications_2.jpg diff --git a/lecture-10/images/optimisation.jpg b/lecture-11/images/optimisation.jpg similarity index 100% rename from lecture-10/images/optimisation.jpg rename to lecture-11/images/optimisation.jpg diff --git a/lecture-10/images/optimisation_map.jpg b/lecture-11/images/optimisation_map.jpg similarity index 100% rename from lecture-10/images/optimisation_map.jpg rename to lecture-11/images/optimisation_map.jpg diff --git a/lecture-10/images/qGANs.jpg b/lecture-11/images/qGANs.jpg similarity index 100% rename from lecture-10/images/qGANs.jpg rename to lecture-11/images/qGANs.jpg diff --git a/lecture-10/images/quantum_machine_learning_example.jpg b/lecture-11/images/quantum_machine_learning_example.jpg similarity index 100% rename from lecture-10/images/quantum_machine_learning_example.jpg rename to lecture-11/images/quantum_machine_learning_example.jpg diff --git a/lecture-10/images/quantum_neural_network.jpg b/lecture-11/images/quantum_neural_network.jpg similarity index 100% rename from lecture-10/images/quantum_neural_network.jpg rename to lecture-11/images/quantum_neural_network.jpg diff --git a/lecture-10/images/quantum_transfer_learning.jpg b/lecture-11/images/quantum_transfer_learning.jpg similarity index 100% rename from lecture-10/images/quantum_transfer_learning.jpg rename to lecture-11/images/quantum_transfer_learning.jpg diff --git a/lecture-10/images/simulation_1.jpg b/lecture-11/images/simulation_1.jpg similarity index 100% rename from lecture-10/images/simulation_1.jpg rename to lecture-11/images/simulation_1.jpg diff --git a/lecture-10/images/simulation_2.jpg b/lecture-11/images/simulation_2.jpg similarity index 100% rename from lecture-10/images/simulation_2.jpg rename to lecture-11/images/simulation_2.jpg diff --git a/lecture-10/images/simulation_map.jpg b/lecture-11/images/simulation_map.jpg similarity index 100% rename from lecture-10/images/simulation_map.jpg rename to lecture-11/images/simulation_map.jpg diff --git a/lecture-10/images/travelling_salesman.jpg b/lecture-11/images/travelling_salesman.jpg similarity index 100% rename from lecture-10/images/travelling_salesman.jpg rename to lecture-11/images/travelling_salesman.jpg diff --git a/lecture-10/images/vqc.jpg b/lecture-11/images/vqc.jpg similarity index 100% rename from lecture-10/images/vqc.jpg rename to lecture-11/images/vqc.jpg diff --git a/lecture-10/images/vqe.jpg b/lecture-11/images/vqe.jpg similarity index 100% rename from lecture-10/images/vqe.jpg rename to lecture-11/images/vqe.jpg diff --git a/lecture-11/lecture-11-note.ipynb b/lecture-11/lecture-11-note.ipynb new file mode 100644 index 0000000..5c4cca2 --- /dev/null +++ b/lecture-11/lecture-11-note.ipynb @@ -0,0 +1,806 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quadratic unconstrained binary optimization (QUBO)\n", + "\n", + "## Example 1\n", + "\n", + "Consider a set of N positive integers (though one doesn't need to) $U = \\{n_1, n_2, n_3, \\dots, n_N\\}$, and imagine the goal is to construct two disjoint subsets of this, called A and B, such that $A\\cup B=U$ and $A\\cap B=\\empty$, such that the sum of the numbers in each subset is equal or as close to each other as possible.\n", + "\n", + "Formally, the sets A and B are to be constructed so that\n", + "\n", + "$$f(\\{n_i\\}) = (S_A - S_B)^2~~\\text{where}$$\n", + "$$S_A = \\sum_{i\\in A} n_i, \\quad S_B = \\sum_{i\\in B}n_i$$\n", + "\n", + "is minimum. This is a `cost function` that has to be minimized.\n", + "\n", + "What we do is, assign to each number $n_i$ a binary variable $x_i$, such that $x_i = 1$ if $n_i\\in A$ or otherwise $x_i = 0$ if $n_i \\in B$.\n", + "\n", + "Now we can write the partial sum as\n", + "$$\n", + "S_A = \\sum_{i\\in U} n_i x_i \\\\S_B = \\sum_{i\\in U}n_i (1-x_i)\n", + "$$\n", + "\n", + "The cost function can now be written as \n", + "\n", + "\\begin{align}\n", + "f(\\{n_i\\}) &= (S_A - S_B)^2 = S_A^2 + S_B^2 - 2S_A S_B\\\\\n", + "&= (\\sum_{i\\in U} n_i x_i)^2 + (\\sum_{i\\in U}n_i (1-x_i))^2 - 2 (\\sum_{i\\in U} n_i x_i)\\sum_{j\\in U}n_j (1-x_j)\\\\\n", + "&= \\sum_{ij\\in U}\\left[\n", + " n_i n_j x_i x_j + n_i n_j (1-x_i)(1-x_j) - 2 n_i n_j x_i (1-x_j)\n", + " \\right]\\\\\n", + " &= \\sum_{ij\\in U} n_i n_j (x_i x_j + 1 - x_i - x_j + x_i x_j - 2x_i + 2 x_i x_j)\\\\\n", + " &= 4\\sum_{ij\\in U} n_i n_j x_i x_j - 4\\sum_{ij\\in U}(n_i n_j x_i) + S^2\\\\\n", + " &= 4\\sum_{ij\\in U} n_i n_j x_i x_j - 4S\\sum_{i\\in U}n_i x_i + S^2 \n", + "\\end{align}\n", + "\n", + "Where $S_U = \\sum_{i\\in U} n_i$ is the sum of all the numbers in the set U. Thus we need to minimize the `f` over the discrete space of vector **x** $ = \\{x_1, x_2, \\dots, x_N\\}$. Note that the cost function `f` is quadratic in $x_i$\n", + "\n", + "$$\n", + "f(x) = 4\\sum_{ij\\in U} n_i n_j x_i x_j - 4S\\sum_{i\\in U}n_i x_i + S^2 \n", + "$$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The cost function can be expressed in matrix form as\n", + "\n", + "$$\n", + "f(x) = 4 x^{T}Qx + V^{T}x + S^2\n", + "$$\n", + "\n", + "where $Q_{ij} = 4n_i n_j$ and $V_i = -4S n_i$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\\begin{align}\n", + "f(\\{n_i\\}) = 4\\sum_{ij\\in U} n_i n_j x_i x_j - 4S\\sum_{i\\in U}n_i x_i + S^2\n", + "\\\\\n", + "= 8\\sum_{i>j} n_i n_j x_i x_j\n", + "+4\\sum_{i}(n_i^2 - S n_i) x_i + S^2 \n", + "\\end{align}\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Package dependency\n", + "\n", + "We need the `dwave` SDK for the optimizations to test or run the codes.\n", + "\n", + "In your virtual environment, install the following -\n", + "```bash\n", + "pip install dwave-system\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import Any\n", + "import numpy as np\n", + "import itertools\n", + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "class qubo:\n", + "\n", + " def __init__(self, ni: np.ndarray) -> None:\n", + " self.ni = np.asarray(ni)\n", + " self.Q = 4 * np.outer(self.ni, self.ni)\n", + " self.S = self.ni.sum()\n", + " self.V = -4 * self.S * self.ni\n", + " self.N = self.ni.shape[0]\n", + " def __call__(self, x: Any) -> float:\n", + " f = x @ (self.Q @ x) + self.V.dot(x) + self.S**2\n", + " return f\n", + "\n", + "def heuristic_solve(numlist):\n", + " import copy\n", + " N = len(numlist)\n", + " list_copy = copy.deepcopy(list(numlist))\n", + " list_copy.sort()\n", + " set_AB = ([], [])\n", + " ii, cc = 0, 0\n", + " for i in range(N//2):\n", + " x, y = list_copy.pop(0), list_copy.pop(-1)\n", + " set_AB[ii].extend((x, y))\n", + " ii = 1 - ii\n", + " cc += 1\n", + " n = len(list_copy)\n", + " if n == 1:\n", + " set_AB[1].append(list_copy.pop())\n", + " elif n == 2:\n", + " if cc%2 == 0:\n", + " x, y = list_copy\n", + " set_AB[ii].append(y)\n", + " set_AB[1-ii].append(x)\n", + " else:\n", + " x, y = list_copy.pop(), list_copy.pop()\n", + " set_AB[ii].extend((x, y))\n", + " y1, y2 = set_AB\n", + " x = np.asarray([i in y1 for i in numlist])\n", + " # fix this!\n", + " return x, y1, y2\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Plotting the distribution\n", + "\n", + "Here we plot the distribution of the cost function $f(x)$. We generate all possible ways we can divide the set into two subsets, which gives us binary vector ${x}$, and corresponding value of the cost function $f(x)$. We plot the historgram of $f(x)$.\n", + "\n", + "To count the numbers, first we group ways into cardinality of subsets A and B. \n", + "\n", + "- If set A has 1 element, and B the rest $N-1$ elements, there are $N$ or ${}^NC_1$ ways to construct A and B.\n", + "- If set A has 2 elements, and B the rest $N-2$ elements, there are $N(N-1)/2$ or ${}^NC_2$ ways to construct A and B.\n", + "- If set A has 3 elements, and B the rest $N-3$ elements, there are ${}^NC_3$ ways to construct A and B.\n", + "- This can go on, until A has $\\frac N2$ elements, and B remaining, and there are ${}^NC_{\\frac N2}$ ways to construct A, and B.\n", + "\n", + "The total number, to construct A and B, and corresponding number of $x$ vectors is\n", + "\n", + "$$\n", + "N_{vec} = {}^NC_1 + {}^NC_2 + {}^NC_3 \\dots {}^NC_{\\frac{N}{2}} = 2^{N-1}\n", + "$$\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 1\n", + "separation: (1,5)\n", + "separation: (2,4)\n", + "separation: (3,3)\n" + ] + } + ], + "source": [ + "# a = np.random.random(6) * 10 + 1\n", + "a = np.array([2, 5, 9, 7, 3, 5])\n", + "x = np.array([1, 1, 1, 0, 0, 0])\n", + "a = a.astype(int)\n", + "qfunc = qubo(ni=a)\n", + "a == qfunc.ni,a\n", + "A = np.array([2,5,9])\n", + "B = np.array([7,3,5])\n", + "print(qfunc(x), (A.sum()-B.sum())**2)\n", + "\n", + "nsize = len(a) # the number of numbers\n", + "il = np.arange(nsize)\n", + "q_f = qfunc\n", + "vecs = [] # store the vectors\n", + "dist = [] # store the function values\n", + "for choose in range(1,nsize//2+1):\n", + " print(f'separation: ({choose},{nsize-choose})')\n", + " for ii in itertools.combinations(il, choose):\n", + " xi = np.fromiter(((i in ii) for i in il), dtype=bool)\n", + " fi = q_f(xi)\n", + " vecs += [xi]\n", + " dist += [fi]\n", + " #print(ii, xi.astype(int))\n", + "vecs = np.array(vecs)\n", + "dist = np.array(dist)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjkAAAG2CAYAAACd5Zf9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+WklEQVR4nO3deVRV9f7/8ddhdgAEVBBHTEtNU1JTrHC8lJlNZpkT2uh1SKJvKtpNG5TM8mvqN2+a5titW4ppZuaIZWqII2YmicN1uKQWgxoI7N8fLs5PEhA4Bw5n+3ystdc6Z+/P3vv9gaO8zmdPFsMwDAEAAJiMi6MLAAAAKA+EHAAAYEqEHAAAYEqEHAAAYEqEHAAAYEqEHAAAYEqEHAAAYEpuji7AUfLy8nT69Gl5e3vLYrE4uhwAAFAChmEoIyNDwcHBcnEpfqzmpg05p0+fVv369R1dBgAAKIOTJ0+qXr16xba5aUOOt7e3pKs/JB8fHwdXAwAASiI9PV3169e3/h0vzk0bcvIPUfn4+BByAABwMiU51YQTjwEAgCkRcgAAgCkRcgAAgCkRcgAAgCkRcgAAgCkRcgAAgCkRcgAAgCkRcgAAgCkRcgAAgCkRcgAAgCkRcgAAgCkRcgAAgCkRcgAAgCkRcgAAgCkRcgAAgCm5OboAs2o0bk2Z1z32di87VgIAwM2JkRwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKhBwAAGBKlTLkbN26Vb1791ZwcLAsFotWrlxZZNsXXnhBFotFM2bMqLD6AABA5VcpQ87FixfVunVrzZ49u9h2K1eu1M6dOxUcHFxBlQEAAGfh5ugCCtOzZ0/17Nmz2DanTp3SyJEjtW7dOvXq1euG28zKylJWVpb1fXp6us11AgCAyqtSjuTcSF5engYNGqRXXnlFt99+e4nWiY2Nla+vr3WqX79+OVcJAAAcySlDztSpU+Xm5qYXX3yxxOvExMQoLS3NOp08ebIcKwQAAI5WKQ9XFScxMVHvv/++du/eLYvFUuL1PD095enpWY6VAQCAysTpRnK+++47paamqkGDBnJzc5Obm5uOHz+ul19+WY0aNXJ0eQAAoJJwupGcQYMGqUePHgXm3XfffRo0aJCGDh3qoKoAAEBlUylDTmZmppKTk63vU1JStHfvXvn7+6tBgwYKCAgo0N7d3V1BQUG67bbbKrpUAABQSVXKkLNr1y517drV+j46OlqSFBkZqYULFzqoKgAA4EwqZcjp0qWLDMMocftjx46VXzEAAMApOd2JxwAAACVByAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAEAAKZEyAFw08vLy1P79u1lsVj06quvOrocwKmFh4fLYrEoKirK0aUQcgDYZtKkSbJYLLJYLFq4cGGJ1jl27Jh1nS5dupRrfSUxd+5c7dq1S35+fvqf//mfQtucPn1a8+fP1+DBg9W6dWv5+vrK3d1dAQEBCgsL04QJE3Ts2LEKrbtLly7Wn+ONpor+g7Njxw4988wzuvXWW1W9enVVq1ZNTZs21XPPPaedO3dWWB3Xfj5LM5X373LdunWaPHmyHnvsMbVq1UrBwcHy9PRU9erV1bhxY/Xp00fLli3TlStXyrWOa9nr8zR58mRJ0uzZs7V///4Kqr5wbg7dOwA4WGZmpiZOnChJeuWVV1SjRo3r2kycOFFvvvmmDMO4btmFCxe0Y8cO7dixQ++++67eeustvfLKK+VddqWVlZWl4cOHa8GCBdctS05OVnJysubPn6+XXnpJ7777riwWiwOqLF6NGjUUFBRUrvvo1auXcnNzr5ufnZ2tlJQUpaSkaMWKFZo8ebKWL1+u5s2bl2s99nTvvffqvvvu07p16zRu3Dh9/fXXDquFkAPgpjZ79mylpqaqevXqGjVqVKFtTp06JcMw5O7urp49e6p79+5q1aqVatSoodTUVK1evVpz585Vdna2xowZI8MwNGbMmArrQ3BwsNatW1dsm5o1a1ZILUOHDtW//vUvSVLdunUVHR2tsLAwubu768CBA5oxY4b279+v6dOny93dXW+//Xa51jN8+HA9/vjjN2z34Ycfavbs2ZKkAQMGyMvLq1zr8vb2VlhYmNq3b6+mTZsqKChIAQEBunTpkg4ePKjFixdr27ZtOnTokLp06aKkpCTVqlWrXGvKZ4/PU0xMjNatW6e1a9dq+/btCgsLs2eJJUbIAXDTys7O1vvvvy9J6tOnj6pXr15oOz8/P02aNEkjR45UQEDAdcvvu+8+PfHEE4qIiFBWVpZee+01PfXUU6pfv3651p/P3d1dLVu2rJB9Fefrr7+2BpymTZtq27ZtBf4wt2vXTv3799fDDz+sdevWadq0aXryyScVGhpabjXVrl1btWvXvmG7jRs3Wl8/88wz5VZPvt9++01uboX/Cb777rv1/PPPa8SIEfrggw+UmpqqadOm6Z133in3uiT7fJ7Cw8MVEhKilJQUTZs2TStWrLBTdaXDOTkAblpxcXE6e/asJCkyMrLIdtOmTdPEiRMLDTj5wsPD9fe//13S1UM2cXFx9i3WCcybN8/6esaMGYWOPHh6emru3LlydXVVXl6e3nzzzYossVDbt2/XoUOHJEmhoaHlGrryFRVwrnXtSfCbN28uz3LszmKxaODAgZKkVatW6cyZMw6pg5AD4Ka1ZMkSSVJgYKBdToDu3r279fUvv/xi8/aczY4dOyRJXl5e+tvf/lZkuwYNGuiOO+6QdHX0Jy0trULqK8r8+fOtrytiFKekfHx8rK/T09MdWEnZ9OvXT5KUm5urTz75xCE1EHIA3JQuX75sPUTRsWNHu5wAm52dbX3t6upq8/aczfnz5yVJAQEBcnd3L7ZtnTp1JF0d9frhhx/KvbaiXLx4Uf/+978lXQ1n/fv3d1gtf7V06VLr62bNmjmwkrJp3ry5/Pz8JF0dzXEEQg6Am9L27dv1559/Sroacuxh06ZN1te33367XbZZEufPn1fXrl1Vq1YteXh4qFatWgoLC9P48eMr9LL2atWqSZLS0tIKvRLtWn/88Yf1dVJSUnmWVazPP/9cGRkZkqRHH33U+kfZEQzD0G+//aYdO3Zo+PDhGjlypHXZiy++WGF12OvzZLFYrP+2rv33VpEIOQAqpSFDhpTp/iZ/nYYMGVLo9hMTE62v27VrZ3O9x48ft94nqGrVqnrkkUds3mZJZWZmasuWLTp37pyuXLmic+fOaceOHYqNjVWTJk30xhtvKC8vr9zryA92mZmZSkhIKLLdH3/8od27d1vfV/T9ha5VGQ5VVa9eXRaLRS4uLqpdu7bCwsI0Z84c5eTkyNPTUwsWLChwKLS82fPz1L59e0nSlStXtG/fvvIsu1BcXQXgpnTkyBHra1vviZKTk6PIyEhdvHhRkjRmzJgSXdFjKxcXF4WHh+v+++9XmzZtFBgYqCtXrujXX39VXFycVqxYodzcXE2cOFHnz5+3XklWXvr06aNt27ZJuvozWL9+faGHrcaPH1/gW33+SEpFO3LkiL7//ntJUqNGjdStWzeH1FGUwYMHa9KkSQoJCamQ/ZXH5ykwMND6+siRI+rQoUN5duE6hBwAldLkyZOLvPtwaRR1+OHaqz38/f1t2sfIkSMVHx8vSerUqZMmTJhg0/ZKavny5YX2r0OHDurfv782bdqkhx56SBcvXtTMmTP10EMPleuIwLBhwzRnzhwdOXJE8fHx6tq1qyZNmqSwsDC5ubnpwIEDmjZtmv7973/Lw8PDeg7TpUuXyq2m4lw7ivP000877MaECQkJys3NlWEY+v3335WYmKh58+ZpyZIlOnr0qD788EO1aNGi3Osoj8/TtVckOuIKK0IOgEqpbt26qlu3brlt/9o/rLach/Haa6/pww8/lCSFhIToiy++KNHlwfZwo7q7deum999/X88++6wkafr06eUacqpUqaKvv/5aDzzwgI4cOaJt27YVepWVn5+fXn31Vb388suSCl5FVFFyc3O1ePFiSVdHMIo6rFkR/no34/DwcI0cOVLPPfecFi1apA4dOmjNmjUKDw8v1zrK4/N07ReI/JHOisQ5OQBscu233xudbFpYO0d9e772MEpZT4icMmWK9T4v9evX16ZNm6xXDVUWgwcPlre3t6Sr91op6e+orJo0aaLExES99dZb110R5OPjo2eeeUZJSUkFDhHaOpJWFmvXrrWOLERERFTYjRtLyt3dXf/85z9Vt25dZWZmaujQoYU+BqKilfbzdPnyZevrG11xVx4YyQFgk6pVq1pfl/Sww7Xf6PKvyPmrU6dO6ffff7etOF39dlrYiNC131rPnz9f6tGcadOmWQ9L1a1bV5s3b1ajRo1sqrU8uLu767bbbtOuXbt0+fJlnT9/vtwf8eDt7a0JEyZowoQJSktL02+//SYvLy/VqVPHemn9nj17rO0dcbfmvx6qqoy8vLz0wAMPaN68eTp69KgSEhLsdiVgWZX285R/WwFJhT4XrrwRcgDYpCzH3E+fPl3o+teaMGGCFi1aZFtxunon48Kejt6wYUPr6wsXLpRqm++++6712VTBwcHasmWLbrnlFpvqLE+OfAimr6+vfH19r5u/ZcsW6+uKfq5Ramqq1qxZI+nq5+/hhx+u0P2XxrUBIiUlxeEhRyrd5+naf1uO+BLA4SoANmndurX1dXGXDV/r2nZt2rSxd0kl0qpVK+vrw4cPl3i99957z/qU8fyA06RJE7vXZy9Xrlyx9s/Ly6vYR1NUlIMHD2rXrl2SpLZt2+q2226r0P0vWbJEV65ckSQNGjRIHh4eFbr/0jh16pT1df5hIkcq7efp559/tr6+9t9cRamUIWfr1q3q3bu3goODZbFYtHLlSuuyK1euaOzYsWrVqpWqVaum4OBgDR48uMA3QwAVJ/9SU+nqzfBOnjxZbPucnJwCd3KNiIgotN3ChQtlGIbNU2GjONLVq6Dy7dy5s0R9nT59uvWKr+DgYG3evFlNmzYt0bqOsmTJEusjATp37uzQUZ18+SFRkqKioip8/wsWLLC+rkyPcfir9PR064iT5JiQ8Fel/Txt375d0tVDug0aNCj3+v6qUoacixcvqnXr1tbH3l/r0qVL2r17t/7xj39o9+7dWrFihX755Rc99NBDDqgUgKurq0aNGiXpaoAZPHhwsVdRjBkzxvrt7r777qvQOwNfKyQkxDqCkP/MpeLMmDHDejVQfsC59dZby7Tva29WWFabNm0qcL5DUW2uvVNucYHCHjVJ0okTJ4o8GTU3N1dRUVFau3atJKlHjx4aMGBAudd0rR07duinn36SJN11112lPh/IHjXFxcXd8MtAZmamBgwYYP0dd+/evcAhVnvXZO/Pk3Q1pOU/+LRnz55lrs0WlfKcnJ49exb5A/H19dX69esLzJs1a5buuusunThxosikmJWVpaysLOt7Z3zYGVBZvfLKK1q9erV27typLVu2qHnz5nrhhRcUFhYmf39/Xbx4UQcOHNDHH3+sH3/8UdLVcw3mzp3r0Lr79u2rt956S/v27VNqamqRN/CbM2eOXnrpJUlXL5OeNWuWsrOzi30cQbVq1cr1Jm6LFy/Wv//9b91///3q1q2bmjdvLn9/f+Xk5Cg5OVlxcXFavny59c60zz//vO6///5yqyff+PHjtX37dg0cOFBhYWEKDAxUZmam9u7dq48++kj79++XdPWy6SVLllT4yFJlGMX58ssv9cQTT6hHjx7q0aOHWrVqZT3sc/bsWf3www9auHCh9QhFrVq1NGfOnHKtqTw+Txs2bLC279u3b7nWX5RKGXJKKy0tTRaLpdgzt2NjY/X6669XXFHATcTDw0Pr1q3T0KFDrd9SX3311SLbt2zZUl988YVDhq+vNWTIEE2ePFk5OTlatmyZNcj81WeffWZ9ffnyZfXp0+eG2+7cuXOBk2vzXXsFmq3nx1y+fFlxcXGKi4srso2bm5smTJig1157rcg29qxJko4ePao33nijyOW9e/fW/PnzVatWrQqrKX+b+b/LqlWrWp+SXZr17VVTTk6OvvnmG33zzTfFtuvYsaMWLlxY5GHRyvh5ypd/4UD9+vXVo0cPm2orK6cPOX/++afGjRun/v37F3tDqZiYGEVHR1vfp6enV7r7IgDOzNfXVytWrNDOnTu1ePFibdu2TSdPnlR6erqqVq2q2rVr66677tJjjz2mRx99VC4ujj9afsstt+jBBx/U6tWrtWjRoiJDjj3lP0ZAkvUKrbIYN26c7rzzTv34449KSkrSuXPndP78eRmGIT8/P7Vo0UKdO3fW008/rXr16lVITZL00ksvqUGDBvruu+90/Phx/fbbb3J3d1dwcLDCw8PVv39/denS5YbbsWdN+T7//HPrKP7jjz9e6psQ2qumd999V71791Z8fLx27dqls2fPKjU1VdnZ2fLx8VGjRo3Uvn17Pf744+rWrVuxo12V8fMkSefOnbMelhw1apTD/r07dci5cuWK+vXrp7y8PH3wwQfFtvX09JSnp2cFVQbcvDp06FDhz6exxfjx47V69Wrt27dP27dvL/Ry5sJGZMoq/0nlgYGBBZ4yXVrNmjW77mZ7jq5Junq1VNu2bStVTfkiIyMVGRnp8Jpq1qypPn36lGhEsKJqsufnSbp6WPDKlSsKCAjQCy+8YLftlpbjv0qV0ZUrV/TEE08oJSVF69evd8htwQE4v44dO1qfGP6Pf/yj3PeX/0dp3LhxBW6k6EjUVDLUVDIZGRl65513JF09iuLIv88Wo7zv8W0ji8WiuLg4639C0v8POEeOHNHmzZuLPa5blPT0dPn6+iotLa1cfgGNxq25caMiHHu7lx0rAXAjycnJatWqlf78809t3Lix3J5GnZ6eLn9/fwUGBurXX3+Vl5dXueyHmqjJkV5//XVNmjRJt912m/bv32/3+xCV5u93pTxclZmZqeTkZOv7lJQU7d27V/7+/goODtbjjz+u3bt366uvvlJubq7Onj0r6erzTyrzTZ0AVE5NmjTR0qVLdeDAAbs8SqIoPj4+ysnJKbftlwU1lQw1lZyPj48mTpyoXr16OfxvcqUcydmyZYu6du163fzIyEhNmjSpyMsyN2/eXKIT2iRGcgAAcEZOP5LTpUuXYp9sWglzGQAAqGSc9sRjAACA4hByAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKRFyAACAKdkUciIiIvTFF1/oypUr9qoHAADALmwKORs2bNCTTz6punXrasyYMTp8+LC96gIAALCJTSFny5Yt6t+/vzIzM/Xuu++qRYsW6tKli5YtW6asrCx71QgAAFBqNoWc8PBwLVmyRGfOnNHMmTPVsmVLbd26VYMHD1adOnU0evRo7d+/3161AgAAlJhdTjz29fXVyJEjtW/fPu3cuVPPPPOMcnNzNWvWLIWGhqpjx45asGCBLl68WKLtbd26Vb1791ZwcLAsFotWrlxZYLlhGJo0aZKCg4NVpUoVdenSRQcPHrRHVwAAgEnY/eqq9u3ba+7cuTp9+rSioqJkGIYSEhL03HPPKTg4WKNHj9aZM2eK3cbFixfVunVrzZ49u9Dl77zzjqZPn67Zs2crISFBQUFB+tvf/qaMjAx7dwcAADgpu4ecy5cva9GiRbrvvvv0/vvvS5KCg4PVr18/ubi4aNasWWrRooW2bdtW5DZ69uypt956S4899th1ywzD0IwZMzRhwgQ99thjatmypRYtWqRLly7pk08+sXd3AACAk7JbyNmzZ4+GDx+uOnXq6Omnn9b27dsVERGhuLg4HT9+XMuWLdPp06c1depUZWRk6OWXXy7TflJSUnT27FlFRERY53l6eqpz58764YcfilwvKytL6enpBSYAAGBebrasnJGRoWXLlmnevHnau3evDMNQYGCghg8frueff16NGjUq0L5KlSp65ZVXtHXrVm3YsKFM+zx79qwkKTAwsMD8wMBAHT9+vMj1YmNj9frrr5dpnwAAwPnY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GTNmKDQ01F4165577tHGjRv1yy+/SJL27dun77//Xg888ECR62RlZSk9Pb3ABAAAzMvmmwG++OKL+v7779W7d2/l5eXJMAylp6crMzNTERER2rx5s4YPH26PWq3Gjh2rp556Ss2aNZO7u7tCQ0MVFRWlp556qsh1YmNj5evra53q169v15oAAEDlYpfHOnTs2FErV66UYRg6f/68cnNzVbNmTbm6utpj89f57LPPtHTpUn3yySe6/fbbtXfvXkVFRSk4OFiRkZGFrhMTE6Po6Gjr+/T0dIIOAAAmZrdnV0mSxWJRzZo17bnJQr3yyisaN26c+vXrJ0lq1aqVjh8/rtjY2CJDjqenpzw9Pcu9NgAAUDk45VPIL126JBeXgqW7urpyCTkAALCyOeT89NNPGjJkiBo3bqwqVarI1dW10MnNzX6DRr1799bkyZO1Zs0aHTt2THFxcZo+fboeffRRu+0DAAA4N5uSx/bt29WjRw9dvnxZkhQQEKDq1avbpbDizJo1S//4xz80fPhwpaamKjg4WC+88IJee+21ct83AABwDjaFnJiYGF2+fFlRUVF69dVX5e/vb6+6iuXt7a0ZM2ZoxowZFbI/AADgfGwKObt27VKbNm00ffp0e9UDAABgFzadk+Ph4aEmTZrYqxYAAAC7sfmOxwcOHLBXLQAAAHZjU8iZMmWKTp48qffee89e9QAAANiFTefk7N69W0OHDtWYMWO0evVq/e1vf1O9evVksVgKbT948GBbdgcAAFBiFsMwjLKu7OLiIovFovxNFBVuDMOQxWJRbm5uWXdld+np6fL19VVaWpp8fHzsvv1G49aUed1jb/eyYyUAAJhHaf5+2zSS89prrxUZbAAAABzJppAzadIkO5UBAABgX0757CoAAIAbsdsDpfbu3auEhASdO3dOt99+ux566CFJUlZWlrKyssrlvBcAAICi2DySc+jQIXXs2FFt27bVsGHD9Oqrr2rlypXW5QsWLJCfn5+++eYbW3cFAABQYjaFnOPHjys8PFw//vijHn74Yb3zzjv668Va/fr1k7u7u5YvX25ToQAAAKVhU8h5/fXXdeHCBS1atEgrVqzQyy+/fF0bPz8/tWjRQtu3b7dlVwAAAKViU8hZt26dQkNDNWjQoGLbNWzYUKdPn7ZlVwAAAKViU8g5f/68brnllhu2s1gs+vPPP23Z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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot the distribution\n", + "\n", + "#plt.xlim(0,30000)\n", + "toprint = 'U=(' + ', '.join([str(i) for i in a]) + ')'\n", + "plt.text(300, 12, toprint, fontsize=21)\n", + "plt.xlabel('f(x)', fontsize=15)\n", + "plt.ylabel('Degeneracy', fontsize=15)\n", + "dd = plt.hist(dist, bins=30)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9801 9801\n", + "separation: (1,6)\n", + "separation: (2,5)\n", + "separation: (3,4)\n" + ] + } + ], + "source": [ + "\n", + "\n", + "# a = np.random.random(6) * 10 + 1\n", + "a = np.array([2, 5, 9, 7, 3, 5, 100])\n", + "x = np.array([1, 1, 1, 0, 0, 0, 0])\n", + "a = a.astype(int)\n", + "qfunc = qubo(ni=a)\n", + "a == qfunc.ni,a\n", + "A = np.array([2,5,9])\n", + "B = np.array([7,3,5, 100])\n", + "print(qfunc(x), (A.sum()-B.sum())**2)\n", + "\n", + "nsize = len(a) # the number of numbers\n", + "il = np.arange(nsize)\n", + "q_f = qfunc\n", + "vecs = [] # store the vectors\n", + "dist = [] # store the function values\n", + "for choose in range(1,nsize//2+1):\n", + " print(f'separation: ({choose},{nsize-choose})')\n", + " for ii in itertools.combinations(il, choose):\n", + " xi = np.fromiter(((i in ii) for i in il), dtype=bool)\n", + " fi = q_f(xi)\n", + " vecs += [xi]\n", + " dist += [fi]\n", + " #print(ii, xi.astype(int))\n", + "vecs = np.array(vecs)\n", + "dist = np.array(dist)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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trxmeebHMn/vU3aufFGmJOtbeXPy22+/Wfczvze5hMsvTgBcJ9LS0kxYWJiRZLy8vPK8iGFqaqqpU6eOdb2RHTt2FFOlWe3fv9+q4ZlnnsnXOm+//ba1TkREhNm9e3cRV+m8SZMmWTXfddddJV2OMcaYDh06WDVNnz692MevV6+eNf727duLffz8SkxMNKGhoVatf/zxR0mX5Bavp8JcC2nw4MEFvhbS999/f83y06dPGx8fnwJdCykqKirP+m655RYjyVSqVClfz6cgCDBALl5//XXrj75Vq1bm7NmzObZ9/vnnS/wN8IratWsbSaZx48Z5tn333XddFl6u9OPMZ6Nly5blenXsK22uXIE3pzdkV9ZkzOULNeZ0Fd+0tDTTv39/a5y2bdvm2NaVNWUWFxdn9fl///d/BV7fFTXNnj07z6CfnJxs7r33XmusO+64o0hrctfXU3YKE2AOHz5sSpUqlevVqOfNm2eFjr///e85vjYzX7T1hRdeuGb5hQsXslyN+ttvv821tsTEROPh4WEkmccffzxfz6cgOAYGyMWgQYM0f/58rVu3TitXrlTdunX11FNPKTo6WiEhITp37py2b9+uTz/91Np/XK5cOU2cOLFE6+7atatef/11bd26VcePH8/xy+cmTJig559/XtLl0yjff/99Xbp0KdevwA8ICCjSLyCbNm2avvnmG7Vv315t2rRR3bp1FRISorS0NO3du1dz5szRrFmzrG9MffLJJ9W+ffsiq+eKl156SXFxcXrkkUcUHR2tsLAwnT17Vlu2bNEnn3yibdu2Sbp86vD06dOL/XiKyZMnW/dL6pt3v/32Wz344INq27at2rZtq/r161u7Yo4ePao1a9ZoypQp1rFi5cuX14QJE4q0Jnd9PR09elSLFi3K8tjevXut+4sWLbrmm5yzOyU+IiJCY8aM0bPPPquTJ08qKipKsbGxatasmVJSUjR//nyNHTtWxhj5+/trwoQJOb42X3nlFX333Xfau3ev3n77be3bt0+PP/64wsLCtHv3br311lvasmWLpMtf7tipU6dcn+PSpUutee3atWseM1IILo9EwHXmzJkzpnPnzlk+eeV0i4yMNL/99ltJl2z27t1rfeJ65513cmzXsmXLfD2vzLeWLVtm29e5c+esNqGhoYWuPfOn0NxuXl5e5tVXXzXp6ek59uWqmowx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maEAAAAsTgWY8PBwbd++Pc92O3bsULly5ZwZCgAAwOJUgGndurV27typWbNm5dhm9uzZ2rFjh1q3bu3MUAAAABanAszgwYPl4+OjHj16aMCAAfr111918eJFpaSk6Ndff9WAAQPUvXt3+fj4aPDgwa6qGQAA3OCc+iK7unXratq0aYqJidH777+v999/X9LlA3eNMTLGyM/PT5MnT1b9+vVdUjAAAIDTV6Pu2rWrtm3bpqeeeko1a9aUr6+vfHx8VLNmTf3rX//S1q1b1a1bN1fUCgAAIMnJLTBX1KxZky+qAwAAxcbpLTAAAADFjQADAABsx+kAc/78eb3++utq2rSpypQpI09Pz2xvXl4u2VsFAADg3DEwiYmJuv3227Vz5055enrKx8dHxhhVrFhRR48elTFGklStWjWXFAsAACA5uQVm9OjR2rFjh5588kklJSXpn//8pxwOhw4fPqxz585pypQpCg8PV1RUlPbv3++qmgEAwA3OqQAzd+5cRUREaNy4cfLz85PD4bCW+fn5qVevXlq6dKnmzJmjt956K9/9TpgwQbfeequCgoIUFBSk6Ohoff/9986UCgAAriNOBZgDBw7o73//u7y9vS935nG5u9TUVKtNvXr11LJlS02dOjXf/VauXFmjR4/Whg0btGHDBrVp00b33Xefdu7c6Uy5AADgOuFUgPHz85Ovr6/1c1BQkCTp6NGjWdqFhIQoPj4+3/127NhRd999t2rVqqVatWpp5MiRKl26tNauXetMuQAA4DrhVICpUqWKDhw4YP1cp04dSdKqVausx9LS0rR+/XqFhoYWaoz09HR99dVXOnfunKKjo50pFwAAXCecOgvp9ttv1+TJk5WYmKjg4GB17NhR/fv313PPPafk5GRVrlxZkyZN0h9//KHu3bsXqO/t27crOjpaFy9eVOnSpTVnzhzVq1cv27YpKSlKSUmxfk5KSnLmaQEAADfnVIDp1q2bNm7cqLi4OLVv314RERF644039OKLL6pfv36SJGOMwsPDNWbMmAL1Xbt2bW3ZskVnzpzRrFmzFBMTo1WrVmUbYkaNGqURI0Y481RuaDcNXZDr8j9G33NdjQvXceZ3yO8fhZXba6ekXje8noufUwHmtttuU1xcXJbHBg4cqH/84x+aM2eOTp8+rVq1aqlPnz4KCQkpUN9XLggpSU2aNNH69es1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8Ji7wmPuCq+4584Yo+TkZEVEROTZ1u0CTLly5eTp6amjR49mefz48eMKCwvLdh1fX1/5+vpmeaxMmTJFVeJ1IygoiD/mQmLunMP8FR5zV3jMXeEV59wFBwfnq53bHcTr4+Ojxo0ba8mSJVkeX7JkiZo3b15CVQEAAHfidltgJGngwIHq2bOnmjRpoujoaE2cOFEHDx7U008/XdKlAQAAN+CWAeahhx7SyZMn9dprr+nIkSOKjIzUwoULVa1atZIu7brg6+urV1999Zrdbsgbc+cc5q/wmLvCY+4Kz53nzmFMfs5VAgAAcB9udwwMAABAXggwAADAdggwAADAdggwAADAdggwNnX48GE98sgjCg0NValSpdSwYUNt3LjRWm6M0fDhwxURESF/f3+1atVKO3fuzNJHSkqKnn32WZUrV04BAQHq1KmT/vzzzyxtTp8+rZ49eyo4OFjBwcHq2bOnzpw5UxxPsUikpaXp5ZdfVvXq1eXv768aNWrotddeU0ZGhtWGufuf1atXq2PHjoqIiJDD4dDcuXOzLC/OuTp48KA6duyogIAAlStXTs8995wuXbpUFE/bJXKbu9TUVA0ZMkT169dXQECAIiIi1KtXLyUkJGTp40adOynv115mTz31lBwOh957770sj9+o85efudu1a5c6deqk4OBgBQYGqlmzZjp48KC13BZz59yVi1ASTp06ZapVq2Z69+5t1q1bZ+Lj483SpUvN3r17rTajR482gYGBZtasWWb79u3moYceMhUrVjRJSUlWm6efftpUqlTJLFmyxGzatMm0bt3aNGjQwKSlpVlt2rdvbyIjI82aNWvMmjVrTGRkpLn33nuL9fm60uuvv25CQ0PNd999Z+Lj482MGTNM6dKlzXvvvWe1Ye7+Z+HChWbYsGFm1qxZRpKZM2dOluXFNVdpaWkmMjLStG7d2mzatMksWbLEREREmH79+hX5HBRWbnN35swZ07ZtW/P111+b3377zcTFxZmoqCjTuHHjLH3cqHNnTN6vvSvmzJljGjRoYCIiIsy7776bZdmNOn95zd3evXtNSEiIGTRokNm0aZPZt2+f+e6778yxY8esNnaYOwKMDQ0ZMsTcdtttOS7PyMgw4eHhZvTo0dZjFy9eNMHBwebDDz80xlx+A/X29jZfffWV1ebw4cPGw8PDLFq0yBhjzK+//mokmbVr11pt4uLijCTz22+/ufppFYt77rnHPProo1kee+CBB8wjjzxijGHucnP1G2FxztXChQuNh4eHOXz4sNXmyy+/NL6+viYxMbFInq8r5fYP+IpffvnFSDIHDhwwxjB3meU0f3/++aepVKmS2bFjh6lWrVqWAMP8XZbd3D300EPWe1527DJ37EKyoXnz5qlJkybq2rWrKlSooEaNGunjjz+2lsfHx+vo0aNq166d9Zivr69atmypNWvWSJI2btyo1NTULG0iIiIUGRlptYmLi1NwcLCioqKsNs2aNVNwcLDVxm5uu+02LVu2TL///rskaevWrfrpp5909913S2LuCqI45youLk6RkZFZLvB21113KSUlJcuuUztLTEyUw+GwruPG3OUuIyNDPXv21KBBg3TLLbdcs5z5y15GRoYWLFigWrVq6a677lKFChUUFRWVZTeTXeaOAGND+/fv14QJE3TzzTdr8eLFevrpp/Xcc89p2rRpkmRdCPPqi1+GhYVZy44ePSofHx+VLVs21zYVKlS4ZvwKFSpcc7FNuxgyZIgefvhh1alTR97e3mrUqJEGDBighx9+WBJzVxDFOVdHjx69ZpyyZcvKx8fnupjPixcvaujQoerevbt1wTzmLndjxoyRl5eXnnvuuWyXM3/ZO378uM6ePavRo0erffv2+uGHH9S5c2c98MADWrVqlST7zJ1bXkoAucvIyFCTJk30xhtvSJIaNWqknTt3asKECerVq5fVzuFwZFnPGHPNY1e7uk127fPTj7v6+uuv9dlnn+mLL77QLbfcoi1btmjAgAGKiIhQTEyM1Y65y7/imqvrdT5TU1PVrVs3ZWRk6IMPPsizPXN3eQvB2LFjtWnTpgI/hxt9/q6csHDffffp+eeflyQ1bNhQa9as0YcffqiWLVvmuK67zR1bYGyoYsWKqlevXpbH6tatax1BHh4eLknXJNzjx49baTg8PFyXLl3S6dOnc21z7Nixa8b/66+/rknVdjFo0CANHTpU3bp1U/369dWzZ089//zzGjVqlCTmriCKc67Cw8OvGef06dNKTU219XympqbqwQcfVHx8vJYsWWJtfZGYu9z8+OOPOn78uKpWrSovLy95eXnpwIEDeuGFF3TTTTdJYv5yUq5cOXl5eeX5P8QOc0eAsaF//OMf2r17d5bHfv/9d+til9WrV1d4eLiWLFli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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot the distribution\n", + "\n", + "#plt.xlim(0,30000)\n", + "toprint = 'U=(' + ', '.join([str(i) for i in a]) + ')'\n", + "plt.text(7800, 5.4, toprint, fontsize=21)\n", + "plt.xlabel('f(x)', fontsize=15)\n", + "plt.ylabel('Degeneracy', fontsize=15)\n", + "dd = plt.hist(dist, bins=60)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "separation: (1,20)\n", + "separation: (2,19)\n", + "separation: (3,18)\n", + "separation: (4,17)\n", + "separation: (5,16)\n", + "separation: (6,15)\n", + "separation: (7,14)\n", + "separation: (8,13)\n", + "separation: (9,12)\n", + "separation: (10,11)\n" + ] + } + ], + "source": [ + "# Now test the distribution for a larger set size, containing uniformly distributed numbers.\n", + "\n", + "nsize = 21\n", + "ni = np.random.randint(1, 30, size=nsize)\n", + "# ni = np.array([10, 1, 16, 14, 22, 26, 29, 23, 21, 5, 14, 9, 12, 27, 22, 9, 14, 27, 12, 9, 24])\n", + "# ni[-1] = 1500\n", + "il = np.arange(nsize)\n", + "q_f = qubo(ni=ni)\n", + "vecs = []\n", + "dist = []\n", + "for choose in range(1,nsize//2+1):\n", + " print(f'separation: ({choose},{nsize-choose})')\n", + " for ii in itertools.combinations(il, choose):\n", + " xi = np.fromiter(((i in ii) for i in il), dtype=bool)\n", + " fi = q_f(xi)\n", + " vecs += [xi]\n", + " dist += [fi]\n", + " #print(ii, xi.astype(int))\n", + "vecs = np.array(vecs)\n", + "dist = np.array(dist)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "U=(28, 3, 18, 17, 2, 14\n", + "8, 4, 6, 3, 16, 28\n", + "1, 13, 23, 27, 18, 6\n", + "14, 15, 1)\n" + ] + }, + { + "data": { + "image/png": "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mIDevXujcePGAABPT084OjrC29sbK1aswKNHjzBr1iyMHz+ePWxERERU4XSykLt37x6GDRuGhw8fonbt2nB3d0d4eDjs7e0BALNnz0ZWVhYmTZqElJQUuLm54fDhwzA1NZXO8c0338DAwACDBw9GVlYWunTpAj8/P+jr60sxW7duxdSpU6XRrX369MEPP/wg7dfX18f+/fsxadIktG3bFsbGxhg+fDhWrlz5kq4EERERvc5kQghR2UnQ08EOCoUCSqWyxN684tZI1ZbiBjJwsAMREVHpyvL7uyK9Es/IEREREb2OWMgRERER6SgWckREREQ6ioUcERERkY5iIUdERESko1jIEREREekoFnJEREREOoqFHBEREZGOYiFHREREpKNYyBERERHpKBZyRERERDqKhRwRERGRjmIhR0RERKSjDCo7AaoaGszdX9kpEBERUTmxR46IiIhIR7GQIyIiItJRLOSIiIiIdBQLOSIiIiIdxcEOVGbFDYi47durEjIhIiIigD1yRERERDqLPXKkEfbSERERVR72yBERERHpKPbIkdaxl46IiOjlYI8cERERkY5ijxy9FIV76dhDR0REpDn2yBERERHpKPbIUaXgc3RERESaY48cERERkY5iIUdERESko3hrlao0DpIgIiIqGXvkiIiIiHQUe+RI53HgBBERva7YI0dERESko1jIEREREeko3lql1wJvvxIR0auIPXJEREREOoqFHBEREZGO4q1Vomdw3joiItIl7JEjIiIi0lEs5IiIiIh0FG+tEmkBb8kSEVFlYI8cERERkY5ijxxVGcXN9UZEREQlY48cERERkY5ijxzplNex146rUhARUUlYyNEr6XUs+IiI6PXDW6tEREREOoo9cvTaYq8dERHpOhZyRKVgsUdERFUZb60SERER6Sj2yBFVAE168jgilYiIyoqFHFEVw9u5RERUVizkiHTQixZ77O0jInq1sJAjeo1os7ePRSERUeVjIadFa9euxYoVKxAfH49mzZrh22+/Rfv27Ss7LaIKoa2ikAUhEdGLYyGnJX/88QemT5+OtWvXom3btvj555/Rs2dPXLp0CfXr16/s9IiqrMp4JpDFIxG9KmRCCFHZSbwK3Nzc8Pbbb2PdunXStqZNm6Jfv35YtmzZc49PS0uDQqGAUqmEmZlZsTF8CJ5IOwoXci/731ZxhWRZ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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "toprint = 'U=('\n", + "for i in range(0, ni.shape[0], 6):\n", + " toprint += ', '.join([str(i) for i in ni[i:i+6]]) + '\\n'\n", + "toprint = toprint[:-1] + ')'\n", + "print(toprint)\n", + "plt.text(20000, 150000, toprint, fontsize=15)\n", + "plt.xlabel('f(x)', fontsize=15)\n", + "plt.ylabel('Degeneracy', fontsize=15)\n", + "plt.xlim(-1000, 60000)\n", + "dd = plt.hist(dist, bins=120)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "separation: (1,20)\n", + "separation: (2,19)\n", + "separation: (3,18)\n", + "separation: (4,17)\n", + "separation: (5,16)\n", + "separation: (6,15)\n", + "separation: (7,14)\n", + "separation: (8,13)\n", + "separation: (9,12)\n", + "separation: (10,11)\n" + ] + } + ], + "source": [ + "# We look at the large set, which is uniformly distributed, except one element that is way larger then the rest.\n", + "# We see how the distribution changes.\n", + "\n", + "nsize = 21\n", + "#ni = np.random.randint(1, 30, size=nsize)\n", + "ni[-1] = 1500\n", + "il = np.arange(nsize)\n", + "q_f = qubo(ni=ni)\n", + "vecs = []\n", + "dist = []\n", + "for choose in range(1,nsize//2+1):\n", + " print(f'separation: ({choose},{nsize-choose})')\n", + " for ii in itertools.combinations(il, choose):\n", + " xi = np.fromiter(((i in ii) for i in il), dtype=bool)\n", + " fi = q_f(xi)\n", + " vecs += [xi]\n", + " dist += [fi]\n", + " #print(ii, xi.astype(int))\n", + "vecs = np.array(vecs)\n", + "dist = np.array(dist)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "U=(28, 3, 18, 17, 2, 14\n", + "8, 4, 6, 3, 16, 28\n", + "1, 13, 23, 27, 18, 6\n", + "14, 15, 1500)\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "toprint = 'U=('\n", + "for i in range(0, ni.shape[0], 6):\n", + " toprint += ', '.join([str(i) for i in ni[i:i+6]]) + '\\n'\n", + "toprint = toprint[:-1] + ')'\n", + "print(toprint)\n", + "plt.text(2.3e6, 45000, toprint, fontsize=15)\n", + "plt.xlabel('f(x)', fontsize=15)\n", + "plt.ylabel('Degeneracy', fontsize=15)\n", + "#plt.xlim(-1000, 60000)\n", + "dd = plt.hist(dist, bins=60)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1 1 1 ... 1 1 1]\n", + "1001 [6, 5, 0, 7, 10, 1, 6, 0, 9, 4, 4, 5, 4, 5, 1, 8, 8, 0, 8, 3, 4, 10, 5, 0, 2, 10, 3, 6, 6, 6, 9, 3, 7, 8, 9, 4, 8, 8, 7, 0, 2, 5, 6, 8, 10, 6, 6, 9, 0, 0, 8, 2, 1, 4, 3, 2, 8, 1, 1, 9, 4, 1, 5, 3, 10, 0, 4, 7, 0, 10, 9, 3, 10, 7, 8, 4, 8, 5, 3, 3, 3, 8, 1, 4, 0, 1, 6, 10, 4, 7, 6, 5, 7, 5, 4, 6, 2, 2, 4, 9, 0, 1, 10, 3, 5, 1, 2, 4, 9, 3, 4, 7, 4, 7, 6, 6, 5, 0, 8, 9, 3, 5, 4, 6, 2, 0, 3, 7, 9, 10, 3, 0, 7, 6, 9, 5, 0, 1, 10, 7, 6, 5, 2, 3, 9, 7, 8, 8, 8, 8, 9, 6, 2, 0, 7, 2, 7, 2, 2, 7, 8, 9, 7, 0, 2, 2, 6, 6, 5, 4, 5, 1, 6, 2, 2, 0, 6, 5, 10, 9, 1, 9, 6, 5, 9, 3, 4, 2, 0, 7, 2, 6, 3, 7, 8, 3, 10, 1, 4, 4, 4, 2, 10, 1, 10, 6, 4, 5, 0, 6, 0, 6, 2, 2, 2, 9, 2, 6, 3, 3, 4, 3, 1, 5, 3, 3, 8, 1, 3, 4, 4, 6, 3, 7, 8, 9, 6, 2, 2, 6, 7, 4, 9, 7, 3, 9, 7, 3, 5, 4, 1, 2, 1, 7, 3, 3, 3, 9, 6, 8, 1, 9, 8, 6, 8, 7, 5, 4, 7, 5, 9, 2, 9, 9, 9, 6, 10, 3, 0, 4, 5, 7, 9, 8, 1, 7, 1, 10, 1, 9, 6, 5, 0, 6, 0, 8, 10, 8, 4, 1, 7, 10, 4, 9, 0, 6, 3, 2, 3, 7, 6, 6, 0, 8, 7, 8, 10, 4, 7, 9, 6, 10, 9, 0, 5, 7, 0, 0, 2, 1, 7, 1, 2, 8, 2, 6, 2, 8, 9, 6, 8, 1, 8, 6, 9, 9, 6, 7, 4, 9, 7, 3, 8, 0, 1, 7, 3, 6, 1, 9, 8, 0, 7, 10, 3, 4, 0, 4, 0, 5, 0, 2, 4, 8, 1, 7, 9, 2, 4, 6, 4, 6, 6, 4, 7, 6, 9, 5, 3, 10, 2, 10, 10, 10, 3, 0, 9, 10, 7, 0, 2, 1, 2, 4, 5, 6, 7, 1, 8, 9, 7, 1, 4, 3, 8, 3, 6, 8, 10, 8, 9, 10, 6, 3, 0, 7, 4, 10, 8, 6, 9, 10, 3, 7, 4, 9, 3, 4, 6, 8, 6, 5, 6, 1, 9, 2, 10, 6, 4, 7, 1, 7, 5, 1, 10, 5, 2, 2, 8, 3, 10, 9, 0, 6, 7, 2, 3, 5, 4, 4, 8, 2, 4, 9, 4, 6, 2, 2, 6, 0, 3, 2, 3, 4, 7, 10, 7, 1, 4, 7, 5, 6, 8, 9, 9, 10, 3, 2, 9, 2, 1, 0, 0, 7, 9, 7, 0, 3, 9, 0, 6, 8, 2, 4, 7, 3, 7, 4, 7, 9, 10, 5, 8, 1, 9, 10, 0, 4, 2, 2, 10, 3, 9, 8, 7, 2, 3, 2, 4, 9, 9, 3, 3, 3, 10, 2, 5, 5, 1, 7, 10, 0, 5, 7, 6, 8, 3, 2, 10, 5, 7, 8, 5, 8, 4, 6, 1, 6, 7, 3, 10, 8, 3, 2, 10, 0, 1, 0, 3, 3, 10, 4, 1, 0, 3, 6, 8, 7, 5, 6, 3, 9, 4, 4, 6, 9, 1, 0, 8, 7, 9, 9, 7, 5, 5, 0, 5, 8, 0, 9, 2, 0, 8, 8, 0, 7, 0, 4, 7, 4, 10, 10, 0, 3, 5, 6, 1, 5, 5, 7, 5, 3, 7, 1, 3, 8, 3, 3, 10, 2, 1, 0, 0, 8, 0, 5, 3, 2, 7, 9, 4, 2, 10, 1, 5, 7, 8, 2, 5, 4, 0, 0, 1, 1, 10, 2, 10, 5, 9, 10, 3, 5, 6, 6, 5, 1, 7, 8, 3, 3, 9, 9, 0, 7, 9, 1, 1, 7, 1, 10, 5, 9, 8, 3, 9, 4, 8, 0, 6, 6, 3, 1, 4, 2, 9, 0, 0, 4, 9, 3, 2, 0, 5, 7, 4, 4, 4, 10, 3, 2, 7, 7, 9, 10, 8, 8, 9, 1, 6, 4, 9, 6, 8, 3, 2, 8, 0, 7, 9, 7, 6, 5, 0, 0, 8, 9, 5, 2, 1, 10, 7, 9, 2, 4, 1, 9, 3, 4, 10, 4, 2, 6, 7, 3, 5, 10, 1, 1, 9, 9, 3, 0, 1, 7, 5, 9, 6, 9, 2, 1, 3, 8, 3, 7, 7, 3, 9, 5, 9, 2, 3, 10, 10, 8, 5, 5, 3, 5, 3, 6, 7, 5, 9, 9, 5, 9, 6, 4, 0, 2, 2, 10, 9, 6, 1, 6, 9, 6, 0, 9, 1, 7, 5, 10, 10, 9, 3, 6, 2, 10, 3, 10, 8, 8, 0, 8, 7, 6, 9, 5, 6, 0, 7, 3, 3, 7, 4, 7, 0, 3, 8, 6, 2, 5, 3, 1, 0, 5, 4, 1, 8, 4, 3, 0, 2, 9, 7, 4, 1, 5, 10, 8, 10, 8, 9, 6, 7, 0, 0, 5, 10, 0, 4, 8, 3, 3, 10, 5, 8, 7, 10, 6, 2, 4, 10, 8, 9, 4, 8, 4, 7, 9, 8, 10, 4, 4, 9, 1, 9, 7, 9, 8, 5, 7, 6, 1, 10, 7, 0, 10, 5, 1, 4, 9, 3, 0, 1, 5, 8, 0, 10, 6, 1, 10, 7, 2, 3, 7, 0, 4, 5, 6, 4, 10, 2, 10, 3, 4, 2, 1, 3, 2, 3, 7, 5, 6, 7, 9, 6, 6, 5, 10, 3, 0, 0, 3, 4, 6, 10, 2, 4, 6, 3, 10, 7, 5, 4, 6, 8, 10, 6, 7, 7, 8, 0, 10, 2, 7, 9, 10, 9, 1, 3, 5, 9, 8, 10, 8, 10, 1, 100]\n", + "500 [0, 100, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 1, 10, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]\n", + "501 [0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 9, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 2, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 7, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 4, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]\n", + "f_n = 7569\n" + ] + } + ], + "source": [ + "# In this cell one can play with the heuristic solver.\n", + "# It is very fast, but starts to give wrong answers for larger sets that are not evenly distributed.\n", + "# It's result aren't ideal even if the set's elements are evenly distributed.\n", + "\n", + "\n", + "# numlist = [3,4,3,6,10,7,12,8,5,6,11, 2, 3]\n", + "# numlist = [1,2,3,4,5,6,7,8, 12]\n", + "nsize = 1001\n", + "numlist = np.random.randint(0, 11, size=1001).tolist()\n", + "numlist[-1] = 100 # comment this line to keep the set uniformly distributed.\n", + "\n", + "x, y1, y2 = heuristic_solve(np.array(numlist))\n", + "print(x.astype(int))\n", + "print(len(numlist), numlist)\n", + "print(len(y1), y1)\n", + "print(len(y2), y2)\n", + "print('f_n = ', (sum(y1) - sum(y2))**2)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{(1, 0): 464, (2, 0): 2320, (2, 1): 160, (3, 0): 3248, (3, 1): 224, (3, 2): 1120, (4, 0): 4408, (4, 1): 304, (4, 2): 1520, (4, 3): 2128, (5, 0): 3248, (5, 1): 224, (5, 2): 1120, (5, 3): 1568, (5, 4): 2128, (6, 0): 6264, (6, 1): 432, (6, 2): 2160, (6, 3): 3024, (6, 4): 4104, (6, 5): 3024, (7, 0): 3944, (7, 1): 272, (7, 2): 1360, (7, 3): 1904, (7, 4): 2584, (7, 5): 1904, (7, 6): 3672, (8, 0): 5336, (8, 1): 368, (8, 2): 1840, (8, 3): 2576, (8, 4): 3496, (8, 5): 2576, (8, 6): 4968, (8, 7): 3128, (9, 0): 2320, (9, 1): 160, (9, 2): 800, (9, 3): 1120, (9, 4): 1520, (9, 5): 1120, (9, 6): 2160, (9, 7): 1360, (9, 8): 1840, (10, 0): 0, (10, 1): 0, (10, 2): 0, (10, 3): 0, (10, 4): 0, (10, 5): 0, (10, 6): 0, (10, 7): 0, (10, 8): 0, (10, 9): 0, (11, 0): 5800, (11, 1): 400, (11, 2): 2000, (11, 3): 2800, (11, 4): 3800, (11, 5): 2800, (11, 6): 5400, (11, 7): 3400, (11, 8): 4600, (11, 9): 2000, (11, 10): 0, (12, 0): 1160, (12, 1): 80, (12, 2): 400, (12, 3): 560, (12, 4): 760, (12, 5): 560, (12, 6): 1080, (12, 7): 680, (12, 8): 920, (12, 9): 400, (12, 10): 0, (12, 11): 1000, (13, 0): 3248, (13, 1): 224, (13, 2): 1120, (13, 3): 1568, (13, 4): 2128, (13, 5): 1568, (13, 6): 3024, (13, 7): 1904, (13, 8): 2576, (13, 9): 1120, (13, 10): 0, (13, 11): 2800, (13, 12): 560, (14, 0): 3016, (14, 1): 208, (14, 2): 1040, (14, 3): 1456, (14, 4): 1976, (14, 5): 1456, (14, 6): 2808, (14, 7): 1768, (14, 8): 2392, (14, 9): 1040, (14, 10): 0, (14, 11): 2600, (14, 12): 520, (14, 13): 1456, (15, 0): 1160, (15, 1): 80, (15, 2): 400, (15, 3): 560, (15, 4): 760, (15, 5): 560, (15, 6): 1080, (15, 7): 680, (15, 8): 920, (15, 9): 400, (15, 10): 0, (15, 11): 1000, (15, 12): 200, (15, 13): 560, (15, 14): 520, (16, 0): 3016, (16, 1): 208, (16, 2): 1040, (16, 3): 1456, (16, 4): 1976, (16, 5): 1456, (16, 6): 2808, (16, 7): 1768, (16, 8): 2392, (16, 9): 1040, (16, 10): 0, (16, 11): 2600, (16, 12): 520, (16, 13): 1456, (16, 14): 1352, (16, 15): 520, (17, 0): 4408, (17, 1): 304, (17, 2): 1520, (17, 3): 2128, (17, 4): 2888, (17, 5): 2128, (17, 6): 4104, (17, 7): 2584, (17, 8): 3496, (17, 9): 1520, (17, 10): 0, (17, 11): 3800, (17, 12): 760, (17, 13): 2128, (17, 14): 1976, (17, 15): 760, (17, 16): 1976, (18, 0): 2320, (18, 1): 160, (18, 2): 800, (18, 3): 1120, (18, 4): 1520, (18, 5): 1120, (18, 6): 2160, (18, 7): 1360, (18, 8): 1840, (18, 9): 800, (18, 10): 0, (18, 11): 2000, (18, 12): 400, (18, 13): 1120, (18, 14): 1040, (18, 15): 400, (18, 16): 1040, (18, 17): 1520, (19, 0): 1160, (19, 1): 80, (19, 2): 400, (19, 3): 560, (19, 4): 760, (19, 5): 560, (19, 6): 1080, (19, 7): 680, (19, 8): 920, (19, 9): 400, (19, 10): 0, (19, 11): 1000, (19, 12): 200, (19, 13): 560, (19, 14): 520, (19, 15): 200, (19, 16): 520, (19, 17): 760, (19, 18): 400, (20, 0): 696, (20, 1): 48, (20, 2): 240, (20, 3): 336, (20, 4): 456, (20, 5): 336, (20, 6): 648, (20, 7): 408, (20, 8): 552, (20, 9): 240, (20, 10): 0, (20, 11): 600, (20, 12): 120, (20, 13): 336, (20, 14): 312, (20, 15): 120, (20, 16): 312, (20, 17): 456, (20, 18): 240, (20, 19): 120, (21, 0): 4408, (21, 1): 304, (21, 2): 1520, (21, 3): 2128, (21, 4): 2888, (21, 5): 2128, (21, 6): 4104, (21, 7): 2584, (21, 8): 3496, (21, 9): 1520, (21, 10): 0, (21, 11): 3800, (21, 12): 760, (21, 13): 2128, (21, 14): 1976, (21, 15): 760, (21, 16): 1976, (21, 17): 2888, (21, 18): 1520, (21, 19): 760, (21, 20): 456, (22, 0): 1392, (22, 1): 96, (22, 2): 480, (22, 3): 672, (22, 4): 912, (22, 5): 672, (22, 6): 1296, (22, 7): 816, (22, 8): 1104, (22, 9): 480, (22, 10): 0, (22, 11): 1200, (22, 12): 240, (22, 13): 672, (22, 14): 624, (22, 15): 240, (22, 16): 624, (22, 17): 912, (22, 18): 480, (22, 19): 240, (22, 20): 144, (22, 21): 912, (23, 0): 1160, (23, 1): 80, (23, 2): 400, (23, 3): 560, (23, 4): 760, (23, 5): 560, (23, 6): 1080, (23, 7): 680, (23, 8): 920, (23, 9): 400, (23, 10): 0, (23, 11): 1000, (23, 12): 200, (23, 13): 560, (23, 14): 520, (23, 15): 200, (23, 16): 520, (23, 17): 760, (23, 18): 400, (23, 19): 200, (23, 20): 120, (23, 21): 760, (23, 22): 240, (24, 0): 1856, (24, 1): 128, (24, 2): 640, (24, 3): 896, (24, 4): 1216, (24, 5): 896, (24, 6): 1728, (24, 7): 1088, (24, 8): 1472, (24, 9): 640, (24, 10): 0, (24, 11): 1600, (24, 12): 320, (24, 13): 896, (24, 14): 832, (24, 15): 320, (24, 16): 832, (24, 17): 1216, (24, 18): 640, (24, 19): 320, (24, 20): 192, (24, 21): 1216, (24, 22): 384, (24, 23): 320, (25, 0): 3712, (25, 1): 256, (25, 2): 1280, (25, 3): 1792, (25, 4): 2432, (25, 5): 1792, (25, 6): 3456, (25, 7): 2176, (25, 8): 2944, (25, 9): 1280, (25, 10): 0, (25, 11): 3200, (25, 12): 640, (25, 13): 1792, (25, 14): 1664, (25, 15): 640, (25, 16): 1664, (25, 17): 2432, (25, 18): 1280, (25, 19): 640, (25, 20): 384, (25, 21): 2432, (25, 22): 768, (25, 23): 640, (25, 24): 1024, (26, 0): 1160, (26, 1): 80, (26, 2): 400, (26, 3): 560, (26, 4): 760, (26, 5): 560, (26, 6): 1080, (26, 7): 680, (26, 8): 920, (26, 9): 400, (26, 10): 0, (26, 11): 1000, (26, 12): 200, (26, 13): 560, (26, 14): 520, (26, 15): 200, (26, 16): 520, (26, 17): 760, (26, 18): 400, (26, 19): 200, (26, 20): 120, (26, 21): 760, (26, 22): 240, (26, 23): 200, (26, 24): 320, (26, 25): 640, (27, 0): 928, (27, 1): 64, (27, 2): 320, (27, 3): 448, (27, 4): 608, (27, 5): 448, (27, 6): 864, (27, 7): 544, (27, 8): 736, (27, 9): 320, (27, 10): 0, (27, 11): 800, (27, 12): 160, (27, 13): 448, (27, 14): 416, (27, 15): 160, (27, 16): 416, (27, 17): 608, (27, 18): 320, (27, 19): 160, (27, 20): 96, (27, 21): 608, (27, 22): 192, (27, 23): 160, (27, 24): 256, (27, 25): 512, (27, 26): 160, (28, 0): 4872, (28, 1): 336, (28, 2): 1680, (28, 3): 2352, (28, 4): 3192, (28, 5): 2352, (28, 6): 4536, (28, 7): 2856, (28, 8): 3864, (28, 9): 1680, (28, 10): 0, (28, 11): 4200, (28, 12): 840, (28, 13): 2352, (28, 14): 2184, (28, 15): 840, (28, 16): 2184, (28, 17): 3192, (28, 18): 1680, (28, 19): 840, (28, 20): 504, (28, 21): 3192, (28, 22): 1008, (28, 23): 840, (28, 24): 1344, (28, 25): 2688, (28, 26): 840, (28, 27): 672, (29, 0): 2784, (29, 1): 192, (29, 2): 960, (29, 3): 1344, (29, 4): 1824, (29, 5): 1344, (29, 6): 2592, (29, 7): 1632, (29, 8): 2208, (29, 9): 960, (29, 10): 0, (29, 11): 2400, (29, 12): 480, (29, 13): 1344, (29, 14): 1248, (29, 15): 480, (29, 16): 1248, (29, 17): 1824, (29, 18): 960, (29, 19): 480, (29, 20): 288, (29, 21): 1824, (29, 22): 576, (29, 23): 480, (29, 24): 768, (29, 25): 1536, (29, 26): 480, (29, 27): 384, (29, 28): 2016, (30, 0): 4176, (30, 1): 288, (30, 2): 1440, (30, 3): 2016, (30, 4): 2736, (30, 5): 2016, (30, 6): 3888, (30, 7): 2448, (30, 8): 3312, (30, 9): 1440, (30, 10): 0, (30, 11): 3600, (30, 12): 720, (30, 13): 2016, (30, 14): 1872, (30, 15): 720, (30, 16): 1872, (30, 17): 2736, (30, 18): 1440, (30, 19): 720, (30, 20): 432, (30, 21): 2736, (30, 22): 864, (30, 23): 720, (30, 24): 1152, (30, 25): 2304, (30, 26): 720, (30, 27): 576, (30, 28): 3024, (30, 29): 1728, (31, 0): 2552, (31, 1): 176, (31, 2): 880, (31, 3): 1232, (31, 4): 1672, (31, 5): 1232, (31, 6): 2376, (31, 7): 1496, (31, 8): 2024, (31, 9): 880, (31, 10): 0, (31, 11): 2200, (31, 12): 440, (31, 13): 1232, (31, 14): 1144, (31, 15): 440, (31, 16): 1144, (31, 17): 1672, (31, 18): 880, (31, 19): 440, (31, 20): 264, (31, 21): 1672, (31, 22): 528, (31, 23): 440, (31, 24): 704, (31, 25): 1408, (31, 26): 440, (31, 27): 352, (31, 28): 1848, (31, 29): 1056, (31, 30): 1584, (32, 0): 928, (32, 1): 64, (32, 2): 320, (32, 3): 448, (32, 4): 608, (32, 5): 448, (32, 6): 864, (32, 7): 544, (32, 8): 736, (32, 9): 320, (32, 10): 0, (32, 11): 800, (32, 12): 160, (32, 13): 448, (32, 14): 416, (32, 15): 160, (32, 16): 416, (32, 17): 608, (32, 18): 320, (32, 19): 160, (32, 20): 96, (32, 21): 608, (32, 22): 192, (32, 23): 160, (32, 24): 256, (32, 25): 512, (32, 26): 160, (32, 27): 128, (32, 28): 672, (32, 29): 384, (32, 30): 576, (32, 31): 352, (33, 0): 3712, (33, 1): 256, (33, 2): 1280, (33, 3): 1792, (33, 4): 2432, (33, 5): 1792, (33, 6): 3456, (33, 7): 2176, (33, 8): 2944, (33, 9): 1280, (33, 10): 0, (33, 11): 3200, (33, 12): 640, (33, 13): 1792, (33, 14): 1664, (33, 15): 640, (33, 16): 1664, (33, 17): 2432, (33, 18): 1280, (33, 19): 640, (33, 20): 384, (33, 21): 2432, (33, 22): 768, (33, 23): 640, (33, 24): 1024, (33, 25): 2048, (33, 26): 640, (33, 27): 512, (33, 28): 2688, (33, 29): 1536, (33, 30): 2304, (33, 31): 1408, (33, 32): 512, (34, 0): 6496, (34, 1): 448, (34, 2): 2240, (34, 3): 3136, (34, 4): 4256, (34, 5): 3136, (34, 6): 6048, (34, 7): 3808, (34, 8): 5152, (34, 9): 2240, (34, 10): 0, (34, 11): 5600, (34, 12): 1120, (34, 13): 3136, (34, 14): 2912, (34, 15): 1120, (34, 16): 2912, (34, 17): 4256, (34, 18): 2240, (34, 19): 1120, (34, 20): 672, (34, 21): 4256, (34, 22): 1344, (34, 23): 1120, (34, 24): 1792, (34, 25): 3584, (34, 26): 1120, (34, 27): 896, (34, 28): 4704, (34, 29): 2688, (34, 30): 4032, (34, 31): 2464, (34, 32): 896, (34, 33): 3584, (35, 0): 6264, (35, 1): 432, (35, 2): 2160, (35, 3): 3024, (35, 4): 4104, (35, 5): 3024, (35, 6): 5832, (35, 7): 3672, (35, 8): 4968, (35, 9): 2160, (35, 10): 0, (35, 11): 5400, (35, 12): 1080, (35, 13): 3024, (35, 14): 2808, (35, 15): 1080, (35, 16): 2808, (35, 17): 4104, (35, 18): 2160, (35, 19): 1080, (35, 20): 648, (35, 21): 4104, (35, 22): 1296, (35, 23): 1080, (35, 24): 1728, (35, 25): 3456, (35, 26): 1080, (35, 27): 864, (35, 28): 4536, (35, 29): 2592, (35, 30): 3888, (35, 31): 2376, (35, 32): 864, (35, 33): 3456, (35, 34): 6048, (36, 0): 6960, (36, 1): 480, (36, 2): 2400, (36, 3): 3360, (36, 4): 4560, (36, 5): 3360, (36, 6): 6480, (36, 7): 4080, (36, 8): 5520, (36, 9): 2400, (36, 10): 0, (36, 11): 6000, (36, 12): 1200, (36, 13): 3360, (36, 14): 3120, (36, 15): 1200, (36, 16): 3120, (36, 17): 4560, (36, 18): 2400, (36, 19): 1200, (36, 20): 720, (36, 21): 4560, (36, 22): 1440, (36, 23): 1200, (36, 24): 1920, (36, 25): 3840, (36, 26): 1200, (36, 27): 960, (36, 28): 5040, (36, 29): 2880, (36, 30): 4320, (36, 31): 2640, (36, 32): 960, (36, 33): 3840, (36, 34): 6720, (36, 35): 6480, (37, 0): 6032, (37, 1): 416, (37, 2): 2080, (37, 3): 2912, (37, 4): 3952, (37, 5): 2912, (37, 6): 5616, (37, 7): 3536, (37, 8): 4784, (37, 9): 2080, (37, 10): 0, (37, 11): 5200, (37, 12): 1040, (37, 13): 2912, (37, 14): 2704, (37, 15): 1040, (37, 16): 2704, (37, 17): 3952, (37, 18): 2080, (37, 19): 1040, (37, 20): 624, (37, 21): 3952, (37, 22): 1248, (37, 23): 1040, (37, 24): 1664, (37, 25): 3328, (37, 26): 1040, (37, 27): 832, (37, 28): 4368, (37, 29): 2496, (37, 30): 3744, (37, 31): 2288, (37, 32): 832, (37, 33): 3328, (37, 34): 5824, (37, 35): 5616, (37, 36): 6240, (38, 0): 696, (38, 1): 48, (38, 2): 240, (38, 3): 336, (38, 4): 456, (38, 5): 336, (38, 6): 648, (38, 7): 408, (38, 8): 552, (38, 9): 240, (38, 10): 0, (38, 11): 600, (38, 12): 120, (38, 13): 336, (38, 14): 312, (38, 15): 120, (38, 16): 312, (38, 17): 456, (38, 18): 240, (38, 19): 120, (38, 20): 72, (38, 21): 456, (38, 22): 144, (38, 23): 120, (38, 24): 192, (38, 25): 384, (38, 26): 120, (38, 27): 96, (38, 28): 504, (38, 29): 288, (38, 30): 432, (38, 31): 264, (38, 32): 96, (38, 33): 384, (38, 34): 672, (38, 35): 648, (38, 36): 720, (38, 37): 624, (39, 0): 6960, (39, 1): 480, (39, 2): 2400, (39, 3): 3360, (39, 4): 4560, (39, 5): 3360, (39, 6): 6480, (39, 7): 4080, (39, 8): 5520, (39, 9): 2400, (39, 10): 0, (39, 11): 6000, (39, 12): 1200, (39, 13): 3360, (39, 14): 3120, (39, 15): 1200, (39, 16): 3120, (39, 17): 4560, (39, 18): 2400, (39, 19): 1200, (39, 20): 720, (39, 21): 4560, (39, 22): 1440, (39, 23): 1200, (39, 24): 1920, (39, 25): 3840, (39, 26): 1200, (39, 27): 960, (39, 28): 5040, (39, 29): 2880, (39, 30): 4320, (39, 31): 2640, (39, 32): 960, (39, 33): 3840, (39, 34): 6720, (39, 35): 6480, (39, 36): 7200, (39, 37): 6240, (39, 38): 720, (40, 0): 3248, (40, 1): 224, (40, 2): 1120, (40, 3): 1568, (40, 4): 2128, (40, 5): 1568, (40, 6): 3024, (40, 7): 1904, (40, 8): 2576, (40, 9): 1120, (40, 10): 0, (40, 11): 2800, (40, 12): 560, (40, 13): 1568, (40, 14): 1456, (40, 15): 560, (40, 16): 1456, (40, 17): 2128, (40, 18): 1120, (40, 19): 560, (40, 20): 336, (40, 21): 2128, (40, 22): 672, (40, 23): 560, (40, 24): 896, (40, 25): 1792, (40, 26): 560, (40, 27): 448, (40, 28): 2352, (40, 29): 1344, (40, 30): 2016, (40, 31): 1232, (40, 32): 448, (40, 33): 1792, (40, 34): 3136, (40, 35): 3024, (40, 36): 3360, (40, 37): 2912, (40, 38): 336, (40, 39): 3360, (41, 0): 2552, (41, 1): 176, (41, 2): 880, (41, 3): 1232, (41, 4): 1672, (41, 5): 1232, (41, 6): 2376, (41, 7): 1496, (41, 8): 2024, (41, 9): 880, (41, 10): 0, (41, 11): 2200, (41, 12): 440, (41, 13): 1232, (41, 14): 1144, (41, 15): 440, (41, 16): 1144, (41, 17): 1672, (41, 18): 880, (41, 19): 440, (41, 20): 264, (41, 21): 1672, (41, 22): 528, (41, 23): 440, (41, 24): 704, (41, 25): 1408, (41, 26): 440, (41, 27): 352, (41, 28): 1848, (41, 29): 1056, (41, 30): 1584, (41, 31): 968, (41, 32): 352, (41, 33): 1408, (41, 34): 2464, (41, 35): 2376, (41, 36): 2640, (41, 37): 2288, (41, 38): 264, (41, 39): 2640, (41, 40): 1232, (42, 0): 3248, (42, 1): 224, (42, 2): 1120, (42, 3): 1568, (42, 4): 2128, (42, 5): 1568, (42, 6): 3024, (42, 7): 1904, (42, 8): 2576, (42, 9): 1120, (42, 10): 0, (42, 11): 2800, (42, 12): 560, (42, 13): 1568, (42, 14): 1456, (42, 15): 560, (42, 16): 1456, (42, 17): 2128, (42, 18): 1120, (42, 19): 560, (42, 20): 336, (42, 21): 2128, (42, 22): 672, (42, 23): 560, (42, 24): 896, (42, 25): 1792, (42, 26): 560, (42, 27): 448, (42, 28): 2352, (42, 29): 1344, (42, 30): 2016, (42, 31): 1232, (42, 32): 448, (42, 33): 1792, (42, 34): 3136, (42, 35): 3024, (42, 36): 3360, (42, 37): 2912, (42, 38): 336, (42, 39): 3360, (42, 40): 1568, (42, 41): 1232, (43, 0): 1856, (43, 1): 128, (43, 2): 640, (43, 3): 896, (43, 4): 1216, (43, 5): 896, (43, 6): 1728, (43, 7): 1088, (43, 8): 1472, (43, 9): 640, (43, 10): 0, (43, 11): 1600, (43, 12): 320, (43, 13): 896, (43, 14): 832, (43, 15): 320, (43, 16): 832, (43, 17): 1216, (43, 18): 640, (43, 19): 320, (43, 20): 192, (43, 21): 1216, (43, 22): 384, (43, 23): 320, (43, 24): 512, (43, 25): 1024, (43, 26): 320, (43, 27): 256, (43, 28): 1344, (43, 29): 768, (43, 30): 1152, (43, 31): 704, (43, 32): 256, (43, 33): 1024, (43, 34): 1792, (43, 35): 1728, (43, 36): 1920, (43, 37): 1664, (43, 38): 192, (43, 39): 1920, (43, 40): 896, (43, 41): 704, (43, 42): 896, (44, 0): 4408, (44, 1): 304, (44, 2): 1520, (44, 3): 2128, (44, 4): 2888, (44, 5): 2128, (44, 6): 4104, (44, 7): 2584, (44, 8): 3496, (44, 9): 1520, (44, 10): 0, (44, 11): 3800, (44, 12): 760, (44, 13): 2128, (44, 14): 1976, (44, 15): 760, (44, 16): 1976, (44, 17): 2888, (44, 18): 1520, (44, 19): 760, (44, 20): 456, (44, 21): 2888, (44, 22): 912, (44, 23): 760, (44, 24): 1216, (44, 25): 2432, (44, 26): 760, (44, 27): 608, (44, 28): 3192, (44, 29): 1824, (44, 30): 2736, (44, 31): 1672, (44, 32): 608, (44, 33): 2432, (44, 34): 4256, (44, 35): 4104, (44, 36): 4560, (44, 37): 3952, (44, 38): 456, (44, 39): 4560, (44, 40): 2128, (44, 41): 1672, (44, 42): 2128, (44, 43): 1216, (45, 0): 4640, (45, 1): 320, (45, 2): 1600, (45, 3): 2240, (45, 4): 3040, (45, 5): 2240, (45, 6): 4320, (45, 7): 2720, (45, 8): 3680, (45, 9): 1600, (45, 10): 0, (45, 11): 4000, (45, 12): 800, (45, 13): 2240, (45, 14): 2080, (45, 15): 800, (45, 16): 2080, (45, 17): 3040, (45, 18): 1600, (45, 19): 800, (45, 20): 480, (45, 21): 3040, (45, 22): 960, (45, 23): 800, (45, 24): 1280, (45, 25): 2560, (45, 26): 800, (45, 27): 640, (45, 28): 3360, (45, 29): 1920, (45, 30): 2880, (45, 31): 1760, (45, 32): 640, (45, 33): 2560, (45, 34): 4480, (45, 35): 4320, (45, 36): 4800, (45, 37): 4160, (45, 38): 480, (45, 39): 4800, (45, 40): 2240, (45, 41): 1760, (45, 42): 2240, (45, 43): 1280, (45, 44): 3040, (46, 0): 1160, (46, 1): 80, (46, 2): 400, (46, 3): 560, (46, 4): 760, (46, 5): 560, (46, 6): 1080, (46, 7): 680, (46, 8): 920, (46, 9): 400, (46, 10): 0, (46, 11): 1000, (46, 12): 200, (46, 13): 560, (46, 14): 520, (46, 15): 200, (46, 16): 520, (46, 17): 760, (46, 18): 400, (46, 19): 200, (46, 20): 120, (46, 21): 760, (46, 22): 240, (46, 23): 200, (46, 24): 320, (46, 25): 640, (46, 26): 200, (46, 27): 160, (46, 28): 840, (46, 29): 480, (46, 30): 720, (46, 31): 440, (46, 32): 160, (46, 33): 640, (46, 34): 1120, (46, 35): 1080, (46, 36): 1200, (46, 37): 1040, (46, 38): 120, (46, 39): 1200, (46, 40): 560, (46, 41): 440, (46, 42): 560, (46, 43): 320, (46, 44): 760, (46, 45): 800, (47, 0): 1392, (47, 1): 96, (47, 2): 480, (47, 3): 672, (47, 4): 912, (47, 5): 672, (47, 6): 1296, (47, 7): 816, (47, 8): 1104, (47, 9): 480, (47, 10): 0, (47, 11): 1200, (47, 12): 240, (47, 13): 672, (47, 14): 624, (47, 15): 240, (47, 16): 624, (47, 17): 912, (47, 18): 480, (47, 19): 240, (47, 20): 144, (47, 21): 912, (47, 22): 288, (47, 23): 240, (47, 24): 384, (47, 25): 768, (47, 26): 240, (47, 27): 192, (47, 28): 1008, (47, 29): 576, (47, 30): 864, (47, 31): 528, (47, 32): 192, (47, 33): 768, (47, 34): 1344, (47, 35): 1296, (47, 36): 1440, (47, 37): 1248, (47, 38): 144, (47, 39): 1440, (47, 40): 672, (47, 41): 528, (47, 42): 672, (47, 43): 384, (47, 44): 912, (47, 45): 960, (47, 46): 240, (48, 0): 1160, (48, 1): 80, (48, 2): 400, (48, 3): 560, (48, 4): 760, (48, 5): 560, (48, 6): 1080, (48, 7): 680, (48, 8): 920, (48, 9): 400, (48, 10): 0, (48, 11): 1000, (48, 12): 200, (48, 13): 560, (48, 14): 520, (48, 15): 200, (48, 16): 520, (48, 17): 760, (48, 18): 400, (48, 19): 200, (48, 20): 120, (48, 21): 760, (48, 22): 240, (48, 23): 200, (48, 24): 320, (48, 25): 640, (48, 26): 200, (48, 27): 160, (48, 28): 840, (48, 29): 480, (48, 30): 720, (48, 31): 440, (48, 32): 160, (48, 33): 640, (48, 34): 1120, (48, 35): 1080, (48, 36): 1200, (48, 37): 1040, (48, 38): 120, (48, 39): 1200, (48, 40): 560, (48, 41): 440, (48, 42): 560, (48, 43): 320, (48, 44): 760, (48, 45): 800, (48, 46): 200, (48, 47): 240, (49, 0): 1160, (49, 1): 80, (49, 2): 400, (49, 3): 560, (49, 4): 760, (49, 5): 560, (49, 6): 1080, (49, 7): 680, (49, 8): 920, (49, 9): 400, (49, 10): 0, (49, 11): 1000, (49, 12): 200, (49, 13): 560, (49, 14): 520, (49, 15): 200, (49, 16): 520, (49, 17): 760, (49, 18): 400, (49, 19): 200, (49, 20): 120, (49, 21): 760, (49, 22): 240, (49, 23): 200, (49, 24): 320, (49, 25): 640, (49, 26): 200, (49, 27): 160, (49, 28): 840, (49, 29): 480, (49, 30): 720, (49, 31): 440, (49, 32): 160, (49, 33): 640, (49, 34): 1120, (49, 35): 1080, (49, 36): 1200, (49, 37): 1040, (49, 38): 120, (49, 39): 1200, (49, 40): 560, (49, 41): 440, (49, 42): 560, (49, 43): 320, (49, 44): 760, (49, 45): 800, (49, 46): 200, (49, 47): 240, (49, 48): 200, (50, 0): 5568, (50, 1): 384, (50, 2): 1920, (50, 3): 2688, (50, 4): 3648, (50, 5): 2688, (50, 6): 5184, (50, 7): 3264, (50, 8): 4416, (50, 9): 1920, (50, 10): 0, (50, 11): 4800, (50, 12): 960, (50, 13): 2688, (50, 14): 2496, (50, 15): 960, (50, 16): 2496, (50, 17): 3648, (50, 18): 1920, (50, 19): 960, (50, 20): 576, (50, 21): 3648, (50, 22): 1152, (50, 23): 960, (50, 24): 1536, (50, 25): 3072, (50, 26): 960, (50, 27): 768, (50, 28): 4032, (50, 29): 2304, (50, 30): 3456, (50, 31): 2112, (50, 32): 768, (50, 33): 3072, (50, 34): 5376, (50, 35): 5184, (50, 36): 5760, (50, 37): 4992, (50, 38): 576, (50, 39): 5760, (50, 40): 2688, (50, 41): 2112, (50, 42): 2688, (50, 43): 1536, (50, 44): 3648, (50, 45): 3840, (50, 46): 960, (50, 47): 1152, (50, 48): 960, (50, 49): 960, (51, 0): 4408, (51, 1): 304, (51, 2): 1520, (51, 3): 2128, (51, 4): 2888, (51, 5): 2128, (51, 6): 4104, (51, 7): 2584, (51, 8): 3496, (51, 9): 1520, (51, 10): 0, (51, 11): 3800, (51, 12): 760, (51, 13): 2128, (51, 14): 1976, (51, 15): 760, (51, 16): 1976, (51, 17): 2888, (51, 18): 1520, (51, 19): 760, (51, 20): 456, (51, 21): 2888, (51, 22): 912, (51, 23): 760, (51, 24): 1216, (51, 25): 2432, (51, 26): 760, (51, 27): 608, (51, 28): 3192, (51, 29): 1824, (51, 30): 2736, (51, 31): 1672, (51, 32): 608, (51, 33): 2432, (51, 34): 4256, (51, 35): 4104, (51, 36): 4560, (51, 37): 3952, (51, 38): 456, (51, 39): 4560, (51, 40): 2128, (51, 41): 1672, (51, 42): 2128, (51, 43): 1216, (51, 44): 2888, (51, 45): 3040, (51, 46): 760, (51, 47): 912, (51, 48): 760, (51, 49): 760, (51, 50): 3648, (52, 0): 464, (52, 1): 32, (52, 2): 160, (52, 3): 224, (52, 4): 304, (52, 5): 224, (52, 6): 432, (52, 7): 272, (52, 8): 368, (52, 9): 160, (52, 10): 0, (52, 11): 400, (52, 12): 80, (52, 13): 224, (52, 14): 208, (52, 15): 80, (52, 16): 208, (52, 17): 304, (52, 18): 160, (52, 19): 80, (52, 20): 48, (52, 21): 304, (52, 22): 96, (52, 23): 80, (52, 24): 128, (52, 25): 256, (52, 26): 80, (52, 27): 64, (52, 28): 336, (52, 29): 192, (52, 30): 288, (52, 31): 176, (52, 32): 64, (52, 33): 256, (52, 34): 448, (52, 35): 432, (52, 36): 480, (52, 37): 416, (52, 38): 48, (52, 39): 480, (52, 40): 224, (52, 41): 176, (52, 42): 224, (52, 43): 128, (52, 44): 304, (52, 45): 320, (52, 46): 80, (52, 47): 96, (52, 48): 80, (52, 49): 80, (52, 50): 384, (52, 51): 304, (53, 0): 6496, (53, 1): 448, (53, 2): 2240, (53, 3): 3136, (53, 4): 4256, (53, 5): 3136, (53, 6): 6048, (53, 7): 3808, (53, 8): 5152, (53, 9): 2240, (53, 10): 0, (53, 11): 5600, (53, 12): 1120, (53, 13): 3136, (53, 14): 2912, (53, 15): 1120, (53, 16): 2912, (53, 17): 4256, (53, 18): 2240, (53, 19): 1120, (53, 20): 672, (53, 21): 4256, (53, 22): 1344, (53, 23): 1120, (53, 24): 1792, (53, 25): 3584, (53, 26): 1120, (53, 27): 896, (53, 28): 4704, (53, 29): 2688, (53, 30): 4032, (53, 31): 2464, (53, 32): 896, (53, 33): 3584, (53, 34): 6272, (53, 35): 6048, (53, 36): 6720, (53, 37): 5824, (53, 38): 672, (53, 39): 6720, (53, 40): 3136, (53, 41): 2464, (53, 42): 3136, (53, 43): 1792, (53, 44): 4256, (53, 45): 4480, (53, 46): 1120, (53, 47): 1344, (53, 48): 1120, (53, 49): 1120, (53, 50): 5376, (53, 51): 4256, (53, 52): 448, (54, 0): 3944, (54, 1): 272, (54, 2): 1360, (54, 3): 1904, (54, 4): 2584, (54, 5): 1904, (54, 6): 3672, (54, 7): 2312, (54, 8): 3128, (54, 9): 1360, (54, 10): 0, (54, 11): 3400, (54, 12): 680, (54, 13): 1904, (54, 14): 1768, (54, 15): 680, (54, 16): 1768, (54, 17): 2584, (54, 18): 1360, (54, 19): 680, (54, 20): 408, (54, 21): 2584, (54, 22): 816, (54, 23): 680, (54, 24): 1088, (54, 25): 2176, (54, 26): 680, (54, 27): 544, (54, 28): 2856, (54, 29): 1632, (54, 30): 2448, (54, 31): 1496, (54, 32): 544, (54, 33): 2176, (54, 34): 3808, (54, 35): 3672, (54, 36): 4080, (54, 37): 3536, (54, 38): 408, (54, 39): 4080, (54, 40): 1904, (54, 41): 1496, (54, 42): 1904, (54, 43): 1088, (54, 44): 2584, (54, 45): 2720, (54, 46): 680, (54, 47): 816, (54, 48): 680, (54, 49): 680, (54, 50): 3264, (54, 51): 2584, (54, 52): 272, (54, 53): 3808, (55, 0): 232, (55, 1): 16, (55, 2): 80, (55, 3): 112, (55, 4): 152, (55, 5): 112, (55, 6): 216, (55, 7): 136, (55, 8): 184, (55, 9): 80, (55, 10): 0, (55, 11): 200, (55, 12): 40, (55, 13): 112, (55, 14): 104, (55, 15): 40, (55, 16): 104, (55, 17): 152, (55, 18): 80, (55, 19): 40, (55, 20): 24, (55, 21): 152, (55, 22): 48, (55, 23): 40, (55, 24): 64, (55, 25): 128, (55, 26): 40, (55, 27): 32, (55, 28): 168, (55, 29): 96, (55, 30): 144, (55, 31): 88, (55, 32): 32, (55, 33): 128, (55, 34): 224, (55, 35): 216, (55, 36): 240, (55, 37): 208, (55, 38): 24, (55, 39): 240, (55, 40): 112, (55, 41): 88, (55, 42): 112, (55, 43): 64, (55, 44): 152, (55, 45): 160, (55, 46): 40, (55, 47): 48, (55, 48): 40, (55, 49): 40, (55, 50): 192, (55, 51): 152, (55, 52): 16, (55, 53): 224, (55, 54): 136, (56, 0): 4872, (56, 1): 336, (56, 2): 1680, (56, 3): 2352, (56, 4): 3192, (56, 5): 2352, (56, 6): 4536, (56, 7): 2856, (56, 8): 3864, (56, 9): 1680, (56, 10): 0, (56, 11): 4200, (56, 12): 840, (56, 13): 2352, (56, 14): 2184, (56, 15): 840, (56, 16): 2184, (56, 17): 3192, (56, 18): 1680, (56, 19): 840, (56, 20): 504, (56, 21): 3192, (56, 22): 1008, (56, 23): 840, (56, 24): 1344, (56, 25): 2688, (56, 26): 840, (56, 27): 672, (56, 28): 3528, (56, 29): 2016, (56, 30): 3024, (56, 31): 1848, (56, 32): 672, (56, 33): 2688, (56, 34): 4704, (56, 35): 4536, (56, 36): 5040, (56, 37): 4368, (56, 38): 504, (56, 39): 5040, (56, 40): 2352, (56, 41): 1848, (56, 42): 2352, (56, 43): 1344, (56, 44): 3192, (56, 45): 3360, (56, 46): 840, (56, 47): 1008, (56, 48): 840, (56, 49): 840, (56, 50): 4032, (56, 51): 3192, (56, 52): 336, (56, 53): 4704, (56, 54): 2856, (56, 55): 168, (57, 0): 2552, (57, 1): 176, (57, 2): 880, (57, 3): 1232, (57, 4): 1672, (57, 5): 1232, (57, 6): 2376, (57, 7): 1496, (57, 8): 2024, (57, 9): 880, (57, 10): 0, (57, 11): 2200, (57, 12): 440, (57, 13): 1232, (57, 14): 1144, (57, 15): 440, (57, 16): 1144, (57, 17): 1672, (57, 18): 880, (57, 19): 440, (57, 20): 264, (57, 21): 1672, (57, 22): 528, (57, 23): 440, (57, 24): 704, (57, 25): 1408, (57, 26): 440, (57, 27): 352, (57, 28): 1848, (57, 29): 1056, (57, 30): 1584, (57, 31): 968, (57, 32): 352, (57, 33): 1408, (57, 34): 2464, (57, 35): 2376, (57, 36): 2640, (57, 37): 2288, (57, 38): 264, (57, 39): 2640, (57, 40): 1232, (57, 41): 968, (57, 42): 1232, (57, 43): 704, (57, 44): 1672, (57, 45): 1760, (57, 46): 440, (57, 47): 528, (57, 48): 440, (57, 49): 440, (57, 50): 2112, (57, 51): 1672, (57, 52): 176, (57, 53): 2464, (57, 54): 1496, (57, 55): 88, (57, 56): 1848, (58, 0): 6032, (58, 1): 416, (58, 2): 2080, (58, 3): 2912, (58, 4): 3952, (58, 5): 2912, (58, 6): 5616, (58, 7): 3536, (58, 8): 4784, (58, 9): 2080, (58, 10): 0, (58, 11): 5200, (58, 12): 1040, (58, 13): 2912, (58, 14): 2704, (58, 15): 1040, (58, 16): 2704, (58, 17): 3952, (58, 18): 2080, (58, 19): 1040, (58, 20): 624, (58, 21): 3952, (58, 22): 1248, (58, 23): 1040, (58, 24): 1664, (58, 25): 3328, (58, 26): 1040, (58, 27): 832, (58, 28): 4368, (58, 29): 2496, (58, 30): 3744, (58, 31): 2288, (58, 32): 832, (58, 33): 3328, (58, 34): 5824, (58, 35): 5616, (58, 36): 6240, (58, 37): 5408, (58, 38): 624, (58, 39): 6240, (58, 40): 2912, (58, 41): 2288, (58, 42): 2912, (58, 43): 1664, (58, 44): 3952, (58, 45): 4160, (58, 46): 1040, (58, 47): 1248, (58, 48): 1040, (58, 49): 1040, (58, 50): 4992, (58, 51): 3952, (58, 52): 416, (58, 53): 5824, (58, 54): 3536, (58, 55): 208, (58, 56): 4368, (58, 57): 2288, (59, 0): 48024, (59, 1): 3312, (59, 2): 16560, (59, 3): 23184, (59, 4): 31464, (59, 5): 23184, (59, 6): 44712, (59, 7): 28152, (59, 8): 38088, (59, 9): 16560, (59, 10): 0, (59, 11): 41400, (59, 12): 8280, (59, 13): 23184, (59, 14): 21528, (59, 15): 8280, (59, 16): 21528, (59, 17): 31464, (59, 18): 16560, (59, 19): 8280, (59, 20): 4968, (59, 21): 31464, (59, 22): 9936, (59, 23): 8280, (59, 24): 13248, (59, 25): 26496, (59, 26): 8280, (59, 27): 6624, (59, 28): 34776, (59, 29): 19872, (59, 30): 29808, (59, 31): 18216, (59, 32): 6624, (59, 33): 26496, (59, 34): 46368, (59, 35): 44712, (59, 36): 49680, (59, 37): 43056, (59, 38): 4968, (59, 39): 49680, (59, 40): 23184, (59, 41): 18216, (59, 42): 23184, (59, 43): 13248, (59, 44): 31464, (59, 45): 33120, (59, 46): 8280, (59, 47): 9936, (59, 48): 8280, (59, 49): 8280, (59, 50): 39744, (59, 51): 31464, (59, 52): 3312, (59, 53): 46368, (59, 54): 28152, (59, 55): 1656, (59, 56): 34776, (59, 57): 18216, (59, 58): 43056}\n", + "{0: -116000, 1: -8216, 2: -40760, 3: -56840, 4: -76760, 5: -56840, 6: -108216, 7: -68816, 8: -92552, 9: -40760, 10: 0, 11: -100400, 12: -20480, 13: -56840, 14: -52832, 15: -20480, 16: -52832, 17: -76760, 18: -40760, 19: -20480, 20: -12312, 21: -76760, 22: -24552, 23: -20480, 24: -32672, 25: -64832, 26: -20480, 27: -16400, 28: -84672, 29: -48816, 30: -72792, 31: -44792, 32: -16400, 33: -64832, 34: -112112, 35: -108216, 36: -119880, 37: -104312, 38: -12312, 39: -119880, 40: -56840, 41: -44792, 42: -56840, 43: -32672, 44: -76760, 45: -80720, 46: -20480, 47: -24552, 48: -20480, 49: -20480, 50: -96480, 51: -76760, 52: -8216, 53: -112112, 54: -68816, 55: -4112, 56: -84672, 57: -44792, 58: -104312, 59: -680616}\n", + "1058841\n" + ] + } + ], + "source": [ + "import dimod\n", + "\n", + "# First initialize our own class qubo\n", + "\n", + "\n", + "# ni = np.array([3, 4, 5, 6, 8, 12, 11, 15])\n", + "# ni = np.array([1,2,3,4,5,6,7,8])\n", + "\n", + "# Define the set\n", + "ni = np.random.randint(0, 31, size=60)\n", + "ni[-1] = int(ni.mean()*15)\n", + "\n", + "qubofunc = qubo(ni=ni) # initialise the function.\n", + "\n", + "# extract the quadratic term as dictionary\n", + "qdict = {(i, j): 2*qubofunc.Q[i, j] for i in range(qubofunc.N) for j in range(qubofunc.N) if i>j}\n", + "\n", + "# extract the linear term as dictionary\n", + "ldict = {i: qubofunc.V[i]+qubofunc.Q[i, i] for i in range(qubofunc.N)}\n", + "# the constant\n", + "constant = qubofunc.S**2\n", + "\n", + "print(qdict)\n", + "print(ldict)\n", + "print(constant)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "x = [1 0 1 1 1 1 1 1 0 0 1 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 0\n", + " 0 0 1 1 0 0 1 1 0 1 0 0 1 0 1 0 1 0 0 1 1 1 0], f(x)=1, set A = [ 2 23 10 25 5 13 10 5 5 8 4 21 18 30 26 3 11 14\n", + " 20 6 5 24 2 17 1 207], set B = [29 10 14 19 14 27 17 0 5 14 13 19 3 19 6 16 5 12 11 4 16 28 27 30\n", + " 14 8 19 5 5 19 28 21 11 26]\n", + "x = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 0\n", + " 0 0 1 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 1 1 1 1 1], f(x)=1, set A = [29 2 10 14 19 14 27 17 23 10 0 25 5 14 13 5 13 19 10 19 6 12 18 11\n", + " 4 16 30 26 3 11 8 19 5 5 24 28], set B = [ 5 3 5 8 16 5 4 21 28 27 30 14 14 20 6 5 19 2\n", + " 17 1 21 11 26 207]\n", + "x = [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 1 0 0 0 1 1\n", + " 0 0 0 0 1 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 0], f(x)=1, set A = [ 13 10 5 19 6 5 8 4 12 18 4 16 28 26 3 30 14 19\n", + " 5 5 19 17 1 21 207], set B = [29 2 10 14 19 14 27 17 23 10 0 25 5 14 13 5 19 3 16 5 21 11 27 30\n", + " 11 14 8 20 6 5 24 2 28 11 26]\n", + "x = [1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0\n", + " 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0], f(x)=1, set A = [ 0 6 5 5 4 21 18 4 16 28 27 30 3 30 14 11 20 5\n", + " 24 11 26 207], set B = [29 2 10 14 19 14 27 17 23 10 25 5 14 13 5 13 19 10 5 3 19 8 16 12\n", + " 11 26 14 8 19 6 5 5 19 2 28 17 1 21]\n", + "x = [0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0\n", + " 1 1 0 0 0 1 0 0 1 0 0 1 1 1 0 1 0 1 0 1 0 0 1], f(x)=1, set A = [29 2 10 14 19 14 27 17 0 25 5 13 5 19 5 3 19 5 8 4 21 16 27 30\n", + " 30 14 11 8 19 5 6 19 28 1 11 26], set B = [ 23 10 14 13 10 6 16 5 12 18 11 4 28 26 3 14 20 5\n", + " 5 24 2 17 21 207]\n", + "x = [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 1 1\n", + " 0 0 1 0 0 0 1 1 1 0 1 0 0 1 0 1 1 0 0 0 1 0 1], f(x)=1, set A = [29 2 10 14 19 14 27 17 23 10 25 5 14 13 6 5 16 21 18 11 4 16 28 26\n", + " 3 14 11 14 5 5 5 19 17 1 21 26], set B = [ 0 5 13 19 10 5 3 19 8 5 4 12 27 30 30 8 19 20\n", + " 6 24 2 28 11 207]\n", + "x = [0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 0\n", + " 0 1 0 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 0 1 1 0 1], f(x)=1, set A = [29 2 10 14 19 14 27 23 10 0 25 5 5 19 10 5 19 6 5 8 16 4 11 28\n", + " 30 26 30 14 20 24 2 28 1 26], set B = [ 17 14 13 13 3 5 21 12 18 4 16 27 3 14 11 8 19 5\n", + " 6 5 5 19 17 21 11 207]\n", + "x = [1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 1 1 0\n", + " 0 1 1 0 0 1 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 0 0], f(x)=1, set A = [ 0 13 5 13 5 3 19 6 18 30 26 14 11 19 20 5 24 19\n", + " 2 17 1 11 26 207], set B = [29 2 10 14 19 14 27 17 23 10 25 5 14 19 10 5 8 16 5 4 21 12 11 4\n", + " 16 28 27 3 30 14 8 6 5 5 28 21]\n", + "x = [1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 0 1 0\n", + " 1 1 1 0 1 1 0 0 1 1 1 0 1 0 1 1 0 1 1 1 0 1 0], f(x)=1, set A = [ 17 10 25 13 10 5 3 5 8 16 5 4 4 16 28 30 14 8\n", + " 19 5 24 28 11 207], set B = [29 2 10 14 19 14 27 23 0 5 14 13 5 19 19 6 21 12 18 11 27 26 3 30\n", + " 11 14 20 5 6 5 19 2 17 1 21 26]\n", + "x = [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 1\n", + " 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0], f(x)=9, set A = [ 19 8 16 4 12 18 4 16 28 26 14 11 14 19 20 6 5 5\n", + " 24 19 21 207], set B = [29 2 10 14 19 14 27 17 23 10 0 25 5 14 13 5 13 19 10 5 3 6 5 5\n", + " 21 11 27 30 3 30 8 5 2 28 17 1 11 26]\n", + "[ 29 2 10 14 19 14 27 17 23 10 0 25 5 14 13 5 13 19\n", + " 10 5 3 19 6 5 8 16 5 4 21 12 18 11 4 16 28 27\n", + " 30 26 3 30 14 11 14 8 19 20 5 6 5 5 24 19 2 28\n", + " 17 1 21 11 26 207]\n" + ] + } + ], + "source": [ + "# We pass the quadratic, linear and constant term to the BinaryQuadraticModel class of the dimod module.\n", + "bqm_set = dimod.BinaryQuadraticModel(ldict, qdict, offset=constant, vartype=dimod.BINARY)\n", + "\n", + "print(bqm_set.quadratic == qdict)\n", + "print(bqm_set.linear == ldict)\n", + "\n", + "# Samplers are solvers that provide us with optimized samples of the variable 'x'\n", + "# with optimal cost function value.\n", + "\n", + "# sampler = dimod.ExactSolver() # this is exact solver, that searches minima with brute force.\n", + "\n", + "sampler = dimod.samplers.SimulatedAnnealingSampler() # this uses Monte-Carlo based Annealing to get minima.\n", + "sample_set = sampler.sample(bqm_set, num_sweeps=1000)\n", + "sample_set = sample_set.truncate(15)\n", + "\n", + "for sample in sample_set.samples():\n", + " xi = sample._data.astype(int)\n", + " fi = qubofunc(xi)\n", + " ia = [k for k, v in sample.items() if v == 0]\n", + " ib = [k for k, v in sample.items() if v == 1]\n", + " print(f\"x = {xi}, f(x)={fi}, set A = {ni[ia]}, set B = {ni[ib]}\")\n", + "print(ni)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Heuristic result: set A = [0, 207, 2, 30, 3, 28, 4, 27, 5, 26, 5, 25, 5, 23, 5, 21, 6, 19, 8, 19, 10, 19, 10, 17, 11, 16, 12, 14, 13, 14], set B = [1, 30, 2, 29, 3, 28, 4, 27, 5, 26, 5, 24, 5, 21, 5, 20, 6, 19, 8, 19, 10, 18, 11, 17, 11, 16, 13, 14, 14, 14], 32041\n" + ] + } + ], + "source": [ + "# The corresponding Heuristic solver\n", + "x, y1, y2 = heuristic_solve(ni)\n", + "print(f\"Heuristic result: set A = {y1}, set B = {y2}, {(sum(y1) - sum(y2))**2}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{(1, 0): 1.0, (2, 0): 0.0, (2, 1): 1.0, (3, 0): 0.0, (3, 1): 0.0, (3, 2): 1.0, (4, 0): 0.0, (4, 1): 0.0, (4, 2): 0.0, (4, 3): 1.0, (5, 0): 0.0, (5, 1): 0.0, (5, 2): 0.0, (5, 3): 0.0, (5, 4): 1.0, (6, 0): 0.0, (6, 1): 0.0, (6, 2): 0.0, (6, 3): 0.0, (6, 4): 0.0, (6, 5): 1.0, (7, 0): 0.0, (7, 1): 0.0, (7, 2): 0.0, (7, 3): 0.0, (7, 4): 0.0, (7, 5): 0.0, (7, 6): 1.0, (8, 0): 0.0, (8, 1): 0.0, (8, 2): 0.0, (8, 3): 0.0, (8, 4): 0.0, (8, 5): 0.0, (8, 6): 0.0, (8, 7): 1.0, (9, 0): 0.0, (9, 1): 0.0, (9, 2): 0.0, (9, 3): 0.0, (9, 4): 0.0, (9, 5): 0.0, (9, 6): 0.0, (9, 7): 0.0, (9, 8): 1.0, (10, 0): 0.0, (10, 1): 0.0, (10, 2): 0.0, (10, 3): 0.0, (10, 4): 0.0, (10, 5): 0.0, (10, 6): 0.0, (10, 7): 0.0, (10, 8): 0.0, (10, 9): 1.0, (11, 0): 0.0, (11, 1): 0.0, (11, 2): 0.0, (11, 3): 0.0, (11, 4): 0.0, (11, 5): 0.0, (11, 6): 0.0, (11, 7): 0.0, (11, 8): 0.0, (11, 9): 0.0, (11, 10): 1.0, (12, 0): 0.0, (12, 1): 0.0, (12, 2): 0.0, (12, 3): 0.0, (12, 4): 0.0, (12, 5): 0.0, (12, 6): 0.0, (12, 7): 0.0, (12, 8): 0.0, (12, 9): 0.0, (12, 10): 0.0, (12, 11): 1.0, (13, 0): 0.0, (13, 1): 0.0, (13, 2): 0.0, (13, 3): 0.0, (13, 4): 0.0, (13, 5): 0.0, (13, 6): 0.0, (13, 7): 0.0, (13, 8): 0.0, (13, 9): 0.0, (13, 10): 0.0, (13, 11): 0.0, (13, 12): 1.0, (14, 0): 0.0, (14, 1): 0.0, (14, 2): 0.0, (14, 3): 0.0, (14, 4): 0.0, (14, 5): 0.0, (14, 6): 0.0, (14, 7): 0.0, (14, 8): 0.0, (14, 9): 0.0, (14, 10): 0.0, (14, 11): 0.0, (14, 12): 0.0, (14, 13): 1.0, (15, 0): 0.0, (15, 1): 0.0, (15, 2): 0.0, (15, 3): 0.0, (15, 4): 0.0, (15, 5): 0.0, (15, 6): 0.0, (15, 7): 0.0, (15, 8): 0.0, (15, 9): 0.0, (15, 10): 0.0, (15, 11): 0.0, (15, 12): 0.0, (15, 13): 0.0, (15, 14): 1.0, (16, 0): 0.0, (16, 1): 0.0, (16, 2): 0.0, (16, 3): 0.0, (16, 4): 0.0, (16, 5): 0.0, (16, 6): 0.0, (16, 7): 0.0, (16, 8): 0.0, (16, 9): 0.0, (16, 10): 0.0, (16, 11): 0.0, (16, 12): 0.0, (16, 13): 0.0, (16, 14): 0.0, (16, 15): 1.0, (17, 0): 0.0, (17, 1): 0.0, (17, 2): 0.0, (17, 3): 0.0, (17, 4): 0.0, (17, 5): 0.0, (17, 6): 0.0, (17, 7): 0.0, (17, 8): 0.0, (17, 9): 0.0, (17, 10): 0.0, (17, 11): 0.0, (17, 12): 0.0, (17, 13): 0.0, (17, 14): 0.0, (17, 15): 0.0, (17, 16): 1.0, (18, 0): 0.0, (18, 1): 0.0, (18, 2): 0.0, (18, 3): 0.0, (18, 4): 0.0, (18, 5): 0.0, (18, 6): 0.0, (18, 7): 0.0, (18, 8): 0.0, (18, 9): 0.0, (18, 10): 0.0, (18, 11): 0.0, (18, 12): 0.0, (18, 13): 0.0, (18, 14): 0.0, (18, 15): 0.0, (18, 16): 0.0, (18, 17): 1.0, (19, 0): 0.0, (19, 1): 0.0, (19, 2): 0.0, (19, 3): 0.0, (19, 4): 0.0, (19, 5): 0.0, (19, 6): 0.0, (19, 7): 0.0, (19, 8): 0.0, (19, 9): 0.0, (19, 10): 0.0, (19, 11): 0.0, (19, 12): 0.0, (19, 13): 0.0, (19, 14): 0.0, (19, 15): 0.0, (19, 16): 0.0, (19, 17): 0.0, (19, 18): 1.0, (20, 0): 0.0, (20, 1): 0.0, (20, 2): 0.0, (20, 3): 0.0, (20, 4): 0.0, (20, 5): 0.0, (20, 6): 0.0, (20, 7): 0.0, (20, 8): 0.0, (20, 9): 0.0, (20, 10): 0.0, (20, 11): 0.0, (20, 12): 0.0, (20, 13): 0.0, (20, 14): 0.0, (20, 15): 0.0, (20, 16): 0.0, (20, 17): 0.0, (20, 18): 0.0, (20, 19): 1.0, (21, 0): 0.0, (21, 1): 0.0, (21, 2): 0.0, (21, 3): 0.0, (21, 4): 0.0, (21, 5): 0.0, (21, 6): 0.0, (21, 7): 0.0, (21, 8): 0.0, (21, 9): 0.0, (21, 10): 0.0, (21, 11): 0.0, (21, 12): 0.0, (21, 13): 0.0, (21, 14): 0.0, (21, 15): 0.0, (21, 16): 0.0, (21, 17): 0.0, (21, 18): 0.0, (21, 19): 0.0, (21, 20): 1.0, (22, 0): 0.0, (22, 1): 0.0, (22, 2): 0.0, (22, 3): 0.0, (22, 4): 0.0, (22, 5): 0.0, (22, 6): 0.0, (22, 7): 0.0, (22, 8): 0.0, (22, 9): 0.0, (22, 10): 0.0, (22, 11): 0.0, (22, 12): 0.0, (22, 13): 0.0, (22, 14): 0.0, (22, 15): 0.0, (22, 16): 0.0, (22, 17): 0.0, (22, 18): 0.0, (22, 19): 0.0, (22, 20): 0.0, (22, 21): 1.0, (23, 0): 0.0, (23, 1): 0.0, (23, 2): 0.0, (23, 3): 0.0, (23, 4): 0.0, (23, 5): 0.0, (23, 6): 0.0, (23, 7): 0.0, (23, 8): 0.0, (23, 9): 0.0, (23, 10): 0.0, (23, 11): 0.0, (23, 12): 0.0, (23, 13): 0.0, (23, 14): 0.0, (23, 15): 0.0, (23, 16): 0.0, (23, 17): 0.0, (23, 18): 0.0, (23, 19): 0.0, (23, 20): 0.0, (23, 21): 0.0, (23, 22): 1.0, (24, 0): 0.0, (24, 1): 0.0, (24, 2): 0.0, (24, 3): 0.0, (24, 4): 0.0, (24, 5): 0.0, (24, 6): 0.0, (24, 7): 0.0, (24, 8): 0.0, (24, 9): 0.0, (24, 10): 0.0, (24, 11): 0.0, (24, 12): 0.0, (24, 13): 0.0, (24, 14): 0.0, (24, 15): 0.0, (24, 16): 0.0, (24, 17): 0.0, (24, 18): 0.0, (24, 19): 0.0, (24, 20): 0.0, (24, 21): 0.0, (24, 22): 0.0, (24, 23): 1.0, (25, 0): 0.0, (25, 1): 0.0, (25, 2): 0.0, (25, 3): 0.0, (25, 4): 0.0, (25, 5): 0.0, (25, 6): 0.0, (25, 7): 0.0, (25, 8): 0.0, (25, 9): 0.0, (25, 10): 0.0, (25, 11): 0.0, (25, 12): 0.0, (25, 13): 0.0, (25, 14): 0.0, (25, 15): 0.0, (25, 16): 0.0, (25, 17): 0.0, (25, 18): 0.0, (25, 19): 0.0, (25, 20): 0.0, (25, 21): 0.0, (25, 22): 0.0, (25, 23): 0.0, (25, 24): 1.0, (26, 0): 0.0, (26, 1): 0.0, (26, 2): 0.0, (26, 3): 0.0, (26, 4): 0.0, (26, 5): 0.0, (26, 6): 0.0, (26, 7): 0.0, (26, 8): 0.0, (26, 9): 0.0, (26, 10): 0.0, (26, 11): 0.0, (26, 12): 0.0, (26, 13): 0.0, (26, 14): 0.0, (26, 15): 0.0, (26, 16): 0.0, (26, 17): 0.0, (26, 18): 0.0, (26, 19): 0.0, (26, 20): 0.0, (26, 21): 0.0, (26, 22): 0.0, (26, 23): 0.0, (26, 24): 0.0, (26, 25): 1.0, (27, 0): 0.0, (27, 1): 0.0, (27, 2): 0.0, (27, 3): 0.0, (27, 4): 0.0, (27, 5): 0.0, (27, 6): 0.0, (27, 7): 0.0, (27, 8): 0.0, (27, 9): 0.0, (27, 10): 0.0, (27, 11): 0.0, (27, 12): 0.0, (27, 13): 0.0, (27, 14): 0.0, (27, 15): 0.0, (27, 16): 0.0, (27, 17): 0.0, (27, 18): 0.0, (27, 19): 0.0, (27, 20): 0.0, (27, 21): 0.0, (27, 22): 0.0, (27, 23): 0.0, (27, 24): 0.0, (27, 25): 0.0, (27, 26): 1.0, (28, 0): 0.0, (28, 1): 0.0, (28, 2): 0.0, (28, 3): 0.0, (28, 4): 0.0, (28, 5): 0.0, (28, 6): 0.0, (28, 7): 0.0, (28, 8): 0.0, (28, 9): 0.0, (28, 10): 0.0, (28, 11): 0.0, (28, 12): 0.0, (28, 13): 0.0, (28, 14): 0.0, (28, 15): 0.0, (28, 16): 0.0, (28, 17): 0.0, (28, 18): 0.0, (28, 19): 0.0, (28, 20): 0.0, (28, 21): 0.0, (28, 22): 0.0, (28, 23): 0.0, (28, 24): 0.0, (28, 25): 0.0, (28, 26): 0.0, (28, 27): 1.0, (29, 0): 0.0, (29, 1): 0.0, (29, 2): 0.0, (29, 3): 0.0, (29, 4): 0.0, (29, 5): 0.0, (29, 6): 0.0, (29, 7): 0.0, (29, 8): 0.0, (29, 9): 0.0, (29, 10): 0.0, (29, 11): 0.0, (29, 12): 0.0, (29, 13): 0.0, (29, 14): 0.0, (29, 15): 0.0, (29, 16): 0.0, (29, 17): 0.0, (29, 18): 0.0, (29, 19): 0.0, (29, 20): 0.0, (29, 21): 0.0, (29, 22): 0.0, (29, 23): 0.0, (29, 24): 0.0, (29, 25): 0.0, (29, 26): 0.0, (29, 27): 0.0, (29, 28): 1.0}\n", + " 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... 29 energy num_oc.\n", + "0 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 ... +1 -29.0 1\n", + "1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 ... +1 -29.0 1\n", + "2 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 ... -1 -29.0 1\n", + "3 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 ... +1 -29.0 1\n", + "4 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 ... -1 -29.0 1\n", + "5 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 ... -1 -29.0 1\n", + "6 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 ... +1 -29.0 1\n", + "7 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 ... -1 -29.0 1\n", + "8 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 ... +1 -29.0 1\n", + "9 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 -1 +1 ... +1 -29.0 1\n", + "['SPIN', 10 rows, 10 samples, 30 variables]\n", + "[-1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1\n", + " -1 1 -1 1 -1 1] -29.0\n", + "[-1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1\n", + " -1 1 -1 1 -1 1] -29.0\n", + "[ 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1\n", + " 1 -1 1 -1 1 -1] -29.0\n", + "[-1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1\n", + " -1 1 -1 1 -1 1] -29.0\n", + "[ 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1\n", + " 1 -1 1 -1 1 -1] -29.0\n", + "[ 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1\n", + " 1 -1 1 -1 1 -1] -29.0\n", + "[-1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1\n", + " -1 1 -1 1 -1 1] -29.0\n", + "[ 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1\n", + " 1 -1 1 -1 1 -1] -29.0\n", + "[-1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1\n", + " -1 1 -1 1 -1 1] -29.0\n", + "[-1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1\n", + " -1 1 -1 1 -1 1] -29.0\n" + ] + }, + { + "data": { + "text/plain": [ + "array([-1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1,\n", + " 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1], dtype=int8)" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"\n", + "Below is ising model example.\n", + "\"\"\"\n", + "\n", + "class Ising:\n", + " \"\"\"\n", + " Here we define 1D Ising model through a python class,\n", + " which we use in the QUBO exercise.\n", + " \"\"\"\n", + " def __init__(self, N=10, Jij=None, h=None) -> None:\n", + " \"\"\"\n", + " Ising class init.\n", + " Requires N: int -> number of lattice site.\n", + " Jij: real array of length (N-1)\n", + " h = magnetic field, keep this none for the moment.\n", + " \"\"\"\n", + " self.N = N\n", + " if Jij is None:\n", + " self.Jij = np.ones(self.N-1)\n", + " else:\n", + " self.Jij = Jij\n", + " self.h = h\n", + " self.Q = np.zeros([self.N, self.N])\n", + " # self.Q is the matrix that encapsulates the QUBO problem.\n", + " for i in range(self.N-1):\n", + " self.Q[i, i+1] = Jij[i]\n", + " self.Q[i+1, i] = Jij[i]\n", + " if h is None:\n", + " self.V = np.zeros(self.N)\n", + " else:\n", + " self.V = h * np.ones(self.N)\n", + " #\n", + " def __call__(self, x):\n", + " f = 0.5 * (x.T @ self.Q) @ x + self.V @ x\n", + " return f\n", + "\n", + "\n", + "N = 30 # Define the lattice size\n", + "Jey = np.ones(N-1) # Define the coupling\n", + "\n", + "ising = Ising(N=N, Jij=Jey) # Instantiate the ising class.\n", + "qdict_ising = {(i, j): 0.5 * ising.Q[i, j] for i in range(ising.N) for j in range(ising.N)}\n", + "bqm_ising = dimod.BinaryQuadraticModel(qdict_ising, vartype=dimod.SPIN)\n", + "print(bqm_ising.quadratic)\n", + "\n", + "# sampler = dimod.ExactSolver()\n", + "sampler = dimod.samplers.SimulatedAnnealingSampler()\n", + "sample_set = sampler.sample(bqm_ising, num_sweeps=1000)\n", + "sample_set = sample_set.truncate(15)\n", + "\n", + "print(sample_set)\n", + "for sample in sample_set.samples():\n", + " xi = sample._data.astype(int)\n", + " fi = ising(xi)\n", + " print(xi, fi)\n", + "\n", + "sample._data\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture-11/quantum-algorithms-2.md b/lecture-11/quantum-algorithms-2.md index 90c8465..88f8c2f 100644 --- a/lecture-11/quantum-algorithms-2.md +++ b/lecture-11/quantum-algorithms-2.md @@ -4,4 +4,355 @@ layout: post --- (lecture-11)= -# Lecture 11: Quantum Algorithms - II +# Lecture 11: NISQ Quantum Algorithms + +```{warning} These lecture notes are a work in progress and are not a replacement for watching the lecture video, it's intended to be a supplementary reading after watching the lecture +``` + +```{admonition} Learning Outcomes +:class: tip +In this lecture we will be looking into Noisy Intermediate Scale Quantum (NISQ) algorithms. The learning outcomes of this lecture will be the following : +- Introduction to NISQ algorithms and their applications. +- Grasping potential advantage of NISQ algorithms. +- Some illustration of the Optimization problem, namely QUBO. +``` + + +```{image} ../prep/images/quant.png +:align: center +``` + + +## NISQ era and algorithms + +- NISQ stands for Noisy Intermediate Scale Quantum. This describes the current state of quantum hardware, with approximately 100 qubits, subject to noise. + +- To work with this circuit, shallow quantum algorithms with low number of qubits are needed. In most of the cases, this algorithms are embbeded to a classical algorithm, resulting on _hybrid classical-quantum algorithms_. + +- The most common type of NISQ algorithms are the variational quantum circuits (VQCs), which are quantum circuits that contain classical parameters that need to be classically optimised. +```{image} ./images/nisq_algorithm.jpg +:align: center +``` + +### Variational quantum algorithms + +- One can think as VQC's as trainable quantum circuits. Different problems will require different gates and parameter structure. + +- In order to train the variational parameters, we will measure the output of the circuit, sent it to a cost function (which is problem-dependant) and perform an optimisation step (like stochastic gradient descent) to update the parameters. We can repeat this process until we get a set of parameters that make the circuit output the desired solution. +```{image} ./images/vqc.jpg +:align: center +``` + +- We can use VQCs to solve simulation, optimisation and machine learning problems. + +- Even though VQCs by themselves doesn't allow us to solve large problems, its integration in classical pipelines may be of interest in the near future. + +### Map of NISQ algorithms + +In the diagram below we can see some of the applications of NISQ algorithms. We will cover the different areas of application (simulation, optimisation and machine learning) in the following sections. +```{image} ./images/nisq_applications.jpg +:align: center +``` + +### Quantum algorithms and applications + +In the diagram below we can see another diagram showing the problems solved by NISQ algorithms and the sectors in which these algorithms are useful. As examples, the maximum-cut proble is frequent in the tech sector, like in the study of networks. On the other hand fluid dynamics is present in aerospace engineer, or the travelling salesman problem in logistics. + +```{image} ./images/nisq_applications_2.jpg +:align: center +``` + + +### Simulation + +- Simulation of quantum systems aims to predict the behaviour of a complex physical system such as a molecule. It remains extremely difficult for a classical computer to simulate this kind of systems. +```{image} ./images/simulation_1.jpg +:align: center +``` + +- These complex systems are generally composed of interacting quantum objects, which can be simulated on quantum computers by directly mapping these objects onto qubits. + +- To run a quantum computing simulation algorithm, we have to encode the problem we are solving in a mathematical function called Hamiltonian, which can be thought as the energy model for the system. After encoding the Hamiltonian in the qubits of our circuit, we can apply one of our simulation algorithms to reach the desired solution. +```{image} ./images/simulation_2.jpg +:align: center +``` + +### Advantage of NISQ simulation algorithms + +- Quantum systems like molecules are easy to simulate with other quantum systems (qubits are quantum systems!), as they maintain the same properties and follow the same physical laws. + +- As quantum systems are very complex, they are impossible to simulate classically due to memory constraints when the system size exceeds $N=50$. + +- This however doesn't mean that any problem computation done with more than 50 qubits can't be solved classically using alternative methods. + + +### Simulation map + +```{image} ./images/simulation_map.jpg +:align: center +``` + +- Above is shown the mapping between quantum simulation algorithms and some of their applications in specific industries. + +- Algorithms are shown in red, applications in green, and more abstract problems in blue. + +- Algorithms can solve a set of particular problems, shown in blue, which can be used for a particular application on an industry. + +- As we see, the generic simulation algorithms are the Variational Quantum Eigensolver (VQE) and the Quantum Approximate Optimsation Algorithm (QAOA). The objective of both algorithms is to measure the energies of some Hamiltonian. + +### The variational quantum eigensolver + +- Looking back at the Benzene molecule we saw at the beginning of the lecture, let's see how we can use the VQE to find its minimum energy state in a process called eigensolving. + +- We can encode the Benzene molecule in a Hamiltonian in which we can the apply the VQE to. + +- Each of our qubits will represent one component of the system. We can apply evolution operators to these qubits, which will contain variational quantum parameters, that will be optimised until we find the desired minimum energy. +```{image} ./images/vqe.jpg +:align: center +``` + +### PFAS molecule destruction + +- An important use-case of the VQE is the study of PFAS (per-and polyfluoroalkyl) molecule destruction. These molecules are used as heat, water and oil resistant coatings in many areas. + +- These molecules are present in many materials, and have the inconvenient that are toxic to human bodies and they can easily contaminate water. Thus, there is an interest in chemical degradation and destruction of these molecules. In order to break these molecules we need to be able to simulate their energies, something that can be done with the VQE. + +### Optimisation + +- Optimisation is a branch of mathematics and computer science that deals with finding the best solution (maximum or minimum) of some problem, by performing iterations of a given algorithm. + +- One may want to minimise quantities like energy use or manufacturing time, or maximise profit for example. + +- It turns out that the VQCs we have seen before are promising candidates to solve optimisation problems. + +- An optimisation problem can be encoded on a VQC. The quantity we want to maximise/minimise would therefore be a function of the output when measuring the VQC. We can update the variational parameters of the VQC (using a classical optimiser) in successive iterations until the desired solution for our optimisation problem is attained. +```{image} ./images/optimisation.jpg +:align: center +``` + +### Optimisation map + +```{image} ./images/optimisation_map.jpg +:align: center +``` + +- Above is shown the mapping between quantum optimisation algorithms and some of their applications in different industries. + +- When comparing this map with the one we presented before for simulation, we seen than the Grover adaptative search algorithm has been added now. This algorithm is a NISQ variation of Grover's algorithm, where Grover search is iteratively applied and classically optimised to find good solutions. + +- As we see, the applications and sectors are different when we compare them to the simulation map. + +### Max-cut problem + +- A graph is a structure made up of various nodes that have weighted connections (edges) between them. They can be used to model different problems and scenarios. For example social media users can be modelled using a graph, where its edges represent the influence between different users. + +- The Max-cut problem aims to do a binary partition of the nodes of the graph so that the sum of the weights of the connections between the two sets is maximised. In the image below we can see how the graph's nodes were divided in two sets: one conatining nodes 0,3 and the other containing nodes 1,2. +```{image} ./images/max_cut.jpg +:align: center +``` + +- The Max-cut problem can be easily mapped to what is called an Ising Hamiltonian, which can be easily encoded and optimised on quantum computers. + +- The Max-cut problem has applications in many areas including clustering, or graph and electrical design. It is often used as benchmnarking for evaluating optimisation techniques. + +### Travelling-salesman problem + +- The travelling-salesman problem is another famous optimisation problem. Given a list of cities represented with nodes on a graph, and its distances represented by the weighted edges, the objective of this problem is to find the shortest possible route, so that each city is visited just once, and the starting and ending point of the route is the same. + +- Similarly to Max-cut, this problem can be easily mapped to an Ising hamiltonian and optimised in a quantum computer. In the image below we can see the graph representing the problem (left) and the shortest optimal route (right). +```{image} ./images/travelling_salesman.jpg +:align: center +``` + +- This problem has different applications in many areas, being finance and marketing among the most notable ones. + +### Optimisation using annealing + +- Until now we have mainly focused on VQCs, a type of quantum algorithm that is meant to be implemented on a gate-based quantum computer. However, there exist other types of quantum computer architectures that are good when it comes to solve optimisation problems. + +- One of these architectures is what is called quantum annealing. This type of quantum computers are only capable of solving problems that can be encoded as Ising Hamiltonians. + +- While this is a limitation, it is compensated by the fact that annealers have more than 5,000 qubits available, meaning that the size of the problems that can be solved is much larger when compared to gate based computers. +```{image} ./images/annealing.jpg +:align: center +``` + +- One of the most promising quantum annealing applications is portfolio optimisation. + + +## Machine learning + +- The primary goal of machine learning is to develop models that can generalize well to new, unseen data, allowing them to make accurate predictions or decisions in various situations. + +- A simple example of a machine learning task is image classification. In the image below we can see bees and ants. One machine learning model (which is well trained), would be capable of distinguishing between the bees and ants in the image. +```{image} ./images/machine_learning.png +:align: center +``` + +### Advantage of NISQ machine learning algorithms + +- We can find different computational bottlenecks in a classical machine learning workflow. One example of this is matrix-vector multiplication, a seemingly simple operation which consumes a lot of computation power when the matrices are very large. +```{image} ./images/matrix.jpg +:align: center +``` + +- Other examples of computationally expensive tasks appearing in machine learning tasks are Fourier transforms, diagonalising matrices or solving linear systems of equations. + +- With quantum algorithms it is thought that we can get an speed-up in some of these tasks. + + +### Machine learning map + +```{image} ./images/machine_learning_map.jpg +:align: center +``` + +- Above is shown the mapping between quantum machine learning algorithms and some of their applications in different industries. + +- When compared to the previous maps we have shown, it can be seen that VQCs are still important here, and also the quantum embedding kernels, which are based on classical kernel methods but implemented on a quantum computer. + +- Among the applications we find neural networks (we can use VQCs as one neural network layer) or quantum generative adversarial methods (quantum GANs), that can be used to generate data that resembles the original data used for training. These are especially important in fraud detection in finance industry. + +### Classical neural networks + +```{image} ./images/neural_network.jpg +:align: center +``` + +- A classical neural network is composed of multiple layers of transformations, governed by certain weights and parameters, which are represented in nodes in the image. + +- A vector is input to the networks and is transformed multiple times until we get the output vector. + +- The parameters of the network are trained to minimise a cost function that will depend on the quantity that we are measuring. + +### Quantum neural network + +- A quantum neural network is a neural network where one of more of the layers is a VQC. + +- As we seen in the previous section, each layer of the network is governed by a set of parameters. When a layer is a VQC, these parameters will be the variational parameters appearing in the quantum circuit, that will be optimised during the training phase. + +- What the benefits are of having a VQC as layer is still an open question in quantum machine learning. +```{image} ./images/quantum_neural_network.jpg +:align: center +``` + +### Quantum tranfer learning + +- Quantum transfer learning is a technique that falls within the field of quantum neural networks. + +- This technique involves using a pre-trained classical neural network, and substituting one of the layers of the networks by a VQC, as we can see in the image. + +- The VQC variational parameters are trained using the output of the pre-trained classical neural network to get the desired result. +```{image} ./images/quantum_transfer_learning.jpg +:align: center +``` + +### Quantum machine learning example + +- Let's return to the image processing task on bees and ants that we saw before to see an example of application of quantum machine learning. + +- As we see in the diagram, we input an image encoded in 512 pixeles to a pre-trained neural network on image classification. + +- After that a layer is applied to reduce dimensionality, and its output is sent to a VQC with 4 parameters. Then, another layer is applied to get a 2-dimensional vector with out predictions +```{image} ./images/quantum_machine_learning_example.jpg +:align: center +``` + +### Anomaly detection with qGANs + +- As we have seen before, GANs have seen great success in anomaly detection. + +- A GAN consists of two neural networks, a generator and a discriminator. The generator aims to to create a dataset which is indistinguishable from the training data provided, and the discriminator aims to succesfully distinguish between these two datasets. + +- After training these two networks, the discriminator will be capable of detecting anomalies on unseen data. + +- The classical GANs have shown limitations in training phase and sampling procedure. That is why in qGANs the classical generator is replaced with a VQC to try to overcome this limitations. +```{image} ./images/qGANs.jpg +:align: center +``` + +## QUBO problem + +The Quadratic unconstrained binary optimiation, or **QUBO** is a class of mathematical problem, that has rather vast and diverse applications. The QUBO problem seeks minimization of a real valued function of several binary variables. More formally, one looks for minimization of the following function $f$ of $N$ variables - + +$$ +f({\bf x}) = {\bf x}^T Q {\bf x} + {\bf v}^T {\bf x} + c +$$ + +of equivalently + +$$ +f({\bf x}) = \sum_{ij} x_i Q_{ij} x_j + \sum_i v_i x_i + c +$$ + +where, $Q$ is real symmetric matrix of size $N\times N$ with entries $Q_{ij}$, ${\bf v}$ is real valued vector of length $N$, and $c$ is a constant number. The function $f$ is a function of $N$ binary variable ${\bf x} = (x_1, x_2, x_3, \dots, x_N)$, i.e., $x_i = 0, 1$. The matrix, vector and scalar $({\bf Q}, {\bf v}, c)$ define the optimization problem. + +The variables being binary is what makes minimization of $f(x)$ interesting and harder. Not that the minimization would have been easy if ${\bf x}$ was vector of continuous variables, as the minimization of functions of several variables is an $NP$ hard problem. But real variables give us access to local minima through gradient descent methods. + +### QUBO example: Set partitioning. + +To get a better feel about how and what kind of problems get mapped to QUBO, let us look at the following problem. +We have a set of $N$ numbers $U = \{n_1, n_2, n_3, \dots, n_N\}$, and we need to partition the set into two disjoint subsets $A$ and $B$ such that the sum of numbers in both the sets is as close to each other as possible. More formally, if + +$$ +S_A = \sum_{i\in A} n_i \quad \text{and} \quad S_B = \sum_{i\in B} n_i +$$ + +The we need to construct the sets $A$ and $B$ such that $f_{\bf n} = (S_A - S_B)^2$ is minimum. Here ${\bf n} = (n_1, n_2, \dots, n_N)$ is the vector of numbers in the set. The function $f_{\bf n}$ is the cost function. + + +```{tip} +An example of such problem in daily life can be partitioning a class of students into two section, such that average grade of students in each section is almost same. +``` + +The process of finding optimal solution involves finding different partitionings of the the set $U$ into $A$ and $B$, and computing the cost function, to seek minima using some algorithm. The cost function can be better formalised if we can define a definite set of variables for our problem. + +For partitioning the set, we each of the numbers $n_i$ in only one of the two sets $A$, $B$, so we can associate a binary variable $x_i$ to $n_i$, such that if $x_i = 1$ if we put $n_i$ into $A$, and $x_i = 0$ if we put $n_i$ into $B$. Then a vector ${\bf x} = (x1, x_2,\dots, x_N)$ of binary variables encapsulated the set partitioning, and different configurations of the vector ${\bf x}$ correspond to different ways of partitioning the set into $A$ and $B$. + +With ${\bf x}$, we can also write the set sums as follows - + +$$ +S_A = \sum_i n_i x_i \quad \text{and} \quad S_B = \sum_i n_i (1 - x_i) +$$ + +We can also define $S = \sum_i n_i$ as sum of all the numbers in the set $U$. Using the above expressions, we can compute the cost function as follows + +$$ +\begin{align} +f_{\bf n}({\bf x}) &= (S_A - S_B)^2 = S_A^2 + S_B^2 - 2 S_A S_B \\ +&= \left( + \sum_i n_i x_i +\right)^2 + +\left( + \sum_i n_i (1 - x_i) +\right)^2 - 2 +\left( + \sum_i n_i x_i +\right) +\left( + \sum_i n_i (1 - x_i) +\right)\\ +&= \sum_{ij}\left( + n_i n_j x_i x_j + n_i n_j (1 - x_i) (1 - x_j) - 2 n_i n_j x_i (1 - x_j) +\right)\\ +& = 4\sum_{ij} n_i n_j x_i x_j -4S\sum_i n_i x_i + S^2 +\end{align} +$$ + +If we define $Q_{ij} = n_i n_j, v_i = -4S n_i$, and $c = S^2$, then the cost function can be written in the matrix form as follows - + +$$ +f_{\bf n}({\bf x}) = {\bf x}^T Q {\bf x} + {\bf v}^T {\bf x} + c = \sum_{ij} Q_ij x_i x_j + \sum_i v_i x_i + c +$$ + +For small size problems, one can use heuristic algorithm we use in daily life to partition the set. However, with growing problem size, the heuristic algorithms can lead to quite misleading results. + + +## Wrap-up + +- Introduction to NISQ algorithms and their applications in different areas + - Simulation + - Optimisation + - Machine learning + - QUBO +- Add more \ No newline at end of file diff --git a/lecture-12/quantum-activity-in-ichec.md b/lecture-12/quantum-activity-in-ichec.md deleted file mode 100644 index be100b4..0000000 --- a/lecture-12/quantum-activity-in-ichec.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Quantum Activities in ICHEC -layout: post ---- - -(lecture-12)= -# Lecture 12: Quantum Activities in ICHEC - -```{admonition} Overview -:class: tip - -This is a placeholder for the in house lecture from ICHEC. It will be populated in due time with necessary prerequisits, and supplementary content on ICHEC's activities on quantum computing. -``` \ No newline at end of file diff --git a/lecture-12/quantum-computing-ireland.md b/lecture-12/quantum-computing-ireland.md new file mode 100644 index 0000000..37e8986 --- /dev/null +++ b/lecture-12/quantum-computing-ireland.md @@ -0,0 +1,65 @@ +--- +title: Quantum Activities in ICHEC +layout: post +--- + +(lecture-12)= +# Lecture 12: Quantum Computing in Ireland + +```{admonition} Overview +:class: tip + +This is a placeholder for the in house lecture from ICHEC. It will be populated in due time with necessary prerequisits, and supplementary content on ICHEC's activities on quantum computing. +``` + +## Summary + +This is a live lecture, and covers Irish footprint on Quantum computing. We recall the scientist from Ireland whose discoveries helped the quantum computing, discuss the current research and industry activities in quantum computing, and describe ICHEC's positioning in the quantum computing ecosystem in Ireland. + + +## References + +Below is a list of books on a wide range of topics related to quantum computing and quantum mechanics. Students are encouraged to further their studies by selecting the topics that interest them most. + +```{note} +Some of the topics are so new and still in developement, that there are no books available on the topic or if there are, they might be partially or completely out of date. +``` + +### General Quantum Computing + +- [Introductory] "Quantum Computing: An Applied Approach", Hidary +- [Introductory] "Dansing with Qubits", Sutor +- [Introductory] "Qauntum Computer Science", Mermin +- [Intermediate/Advanced] "Quantum Computing for Computer Scientists", Yanofsky and Mannucci +- [Advanced] "Qauntum Computing since Democritus", Aaronson +- [Advanced] "Quantum Computing and Quantum Information", Nielsen and Chuang + +### Quantum Computing Mathematics + +- [Introductory] "Essential Mathematics for Quantum Computing", Woody III +- [Intermediate] "Mathematics of Quantum Computing", Scherer +- [Advanced] "Mathematical Founations of Quantum Mechanics", von Neumann + +### Quantum Mechanics + +- [Introductory] "Quantum Mechanics: The Teoretical Minimum", Susskind +- [Intermediate] "The Feynman Lectures on Physics, Volume 3", Feynman +- [Advanced] "Quantum Mechanics: A Modern Development", Ballentine + +### Quantum Chemistry + +- [Intermediate] "Quantum Chemistry and Computing for the Curious: Illustrated with Python and Qiskit code", Sharkey and Chance + +### Quantum Machine Learning + +- [Introductory] "Quantum Machine Learning: An Applied Approach", Ganguly +- [Intermediate] "Machine Learning with Quantum Computers", Schuld and Petruccione + +### Quantum Optimisation + +- [Introductory] "Quantum Optimization and Annealing Techniques : Quantum Annealing for Optimization, Comparing with Classical Methods, and Practical Applications", Parker + +### Quantum Computing from Business point of view + +- [Introductory] "Quantum Boost", Lenahan +- [Introductory] "Quantum Excellence", Lenahan diff --git a/prep/images/Computation_map.jpg b/prep/images/Computation_map.jpg new file mode 100644 index 0000000..578f643 Binary files /dev/null and b/prep/images/Computation_map.jpg differ diff --git a/prep/images/workflow_quantum.png b/prep/images/workflow_quantum.png new file mode 100644 index 0000000..9587ca8 Binary files /dev/null and b/prep/images/workflow_quantum.png differ diff --git a/requirements.txt b/requirements.txt index 3aedac8..6872ac5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,7 @@ jupyter-book jupytercards jupyterquiz matplotlib +matplotlib-venn numpy sphinxcontrib.mermaid sphinxcontrib.youtube diff --git a/testpad.ipynb b/testpad.ipynb index 4aecdbd..52a1e54 100644 --- a/testpad.ipynb +++ b/testpad.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -12,7 +12,7 @@ "
" ] }, - "execution_count": 5, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -31,17 +31,17 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "metadata": {}, "outputs": [ { "data": { - "image/png": "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48eP9+RQAcAr+C5qwHvccZnhb7/9pi+//FJbt251Tj7MmjVLvXv31owZM3xyr6GLXa5mWZYefPBBPfXUU6pfv77zVPGqVavqxhtvdHmu1atXa+/evbrrrru8nuNy4pgIGzNmjCZMmKCtW7dq1KhRCgoK0rBhwwp0H4Zx48bp5Zdf1qlTp9SuXTstXbrUazmAi2Gm/zLkjtPPVq9erU2bNik4OFgBAQGqV6+eJKl169Z8zRoAAMiTO2ZXN23apLJly7qcbditWzf5+fnp22+/9V6Yc+TncrWxY8fq/vvv14gRI9SmTRulpKToyy+/dF4b7vD666+rffv2atSokbdjXFays7PVsmVLTZ06VVFRURoxYoRiYmJcLh/Mr4cfflg//PCDYmNj5e/vr9tuu03GGA+MGig4ZvovQwU5/axFixaS/nf62ciRIyVJL730kp566innzx88eFA9e/bU4sWLddVVV3knCAAAKHbcMbuakJCQ41sjAgICVL58+TzvhO8NF7thpmVZeuKJJ/TEE09c8Hneeecddw8NuchrIuyjjz6S5DoRFhER4Vzn8OHDzs/IDhUqVFCFChXUoEEDNW7cWDVq1NDmzZtzXLoB+AKl/zLkjtPPatas6fKcpUqVkiTVrVuXr5UBAAB5cvdd7oHCcsdEWG6ys7MlSWlpaZ4ZOFBAlP7LkOP0s/Hjx+uJJ55QZGRkrqefpaamasSIETp58qQ6duyY6+lnAAAABeGO2dUqVaro77//dnmOzMxMHT9+PNc74QO5ccdE2LfffqutW7eqY8eOKleunP744w9NnDhRdevWZZYfRQal/zLlrtPPHGrXrs11SwAA4KLcMbt69dVX6+TJk/r+++/VqlUrSWfvN5Sdnc1lhsg3d0yElSxZUh9//LEmTZqk1NRURUREqFevXnrssccUHBzsq2iAC0o/AAAAvMYds6uNGzdWr169nDddy8jI0H333afBgwf75M79KL4udSKsadOmWr16taeGB7gFpR8AAABe467LDN9++23dd9996tq1q/z8/HTTTTfppZde8kUkACjSKP0AAADwKndcZli+fHnucg8A+eDn6wEAAAAAAADPYKYfAAAAAGwg5gXv/nvzHvTuv4fCofQDgJt58xcuv2wBAABwIZzeDwAAAACATTHTDwDIF04ZBAAAKH6Y6QcAAAAAwKYo/QAAAAAA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0qVL66OPPtKff/6pGTNm6KGHHvL1EAEAAAAAuCSXbemXpC1btmjSpEnauHGjMjIy1LRpU40ZM0Y333yzr4cGAAAAAMAlu6xLPwAAAAAAdnZZ3sgPAAAAAIDLAaUfAAAAAACbovQDAAAAAGBTlH4AAAAAAGyK0o98c9zzkXs/Fg/nbie2WfHBdit+zt9mbDcAAFCUUPqRb5ZlufyvRCkpys7dTuf+/+zsbF8MB/nEdisezn3vsyxL6enpzv/v2G5ZWVk+GRvy59x9it9lxcO524z3xOKBbVZ85PY+yDazD76yDxeUmZmpXbt2KTY2VqGhoQoMDFSlSpXUokULVatWzdfDQy5Onz6tjRs36quvvlJgYKAsy1JkZKSuueYa1a1b19fDQx7YbsVPYmKiPv74Y23YsEFZWVnKzs7WFVdcoT59+qhJkybO9YwxLgdwioviOu6CyMjIUGBgoPPvjjM1/PyYEymqkpKSFBYW5vw726zoY5sVL+np6Tp58qQqVarksjw7O5ttVoxR+pGnvXv3aubMmXr11VddloeEhKh+/fqKjo7W9ddfr3bt2qlkyZKXxQfEom7nzp166qmn9M4770iSSpYsqVOnTkmSypQpo65du2rw4MHq0aOHyy/g4iAjI0P+/v4F/oVTHF6Xdt1udt5m27dv1+OPP66lS5dKkipUqKCjR486H4+KilJMTIwGDRqk8uXL+2qYBZaUlKSAgACVLFmyQD9XHLaZw549e7Rs2TL98ssvCgoKUmhoqJo0aaLo6GhFRET4eng4jzFGP/74o95++23t3btXGRkZKl26tNq0aaMbb7xRtWrVclm3uLwO7YxtVvxkZmbqm2++0ezZs3Xo0CElJiaqVKlS6tSpk2666Sa1atXKuW5x3WbFddzuQulHngYOHKhPPvlEMTExuuqqqxQQEKDExEStX79esbGxOnnypCIiInT77bfrgQceUMWKFX095HybOXOmoqKi1KFDBwUHB/t6OG5zww03aMWKFRo7dqyuvvpqlS5dWidPntSKFSv0wQcf6O+//5Yk3XLLLXr44YfVvHlzH484/x5//HHVqlVLnTp1UvXq1RUSEnLRnykub/B23W523mbXXXedvv76az3xxBO65pprFBERoaNHj2rp0qX69NNP9f3330uSrr76aj366KPq3bu3j0ecPw888IDCwsIUHR2tRo0aqVKlSgoICLjgzxSn2Z/Fixdr7NixOnDggCzLUsmSJZWamipJqlKliq677jrdcsstuuaaaxQUFFRsXo+nT59WiRIlCjzW4pBv7ty5mjx5shISElSuXDn5+fnp2LFjzsevvfZa/etf/1Lfvn1VokQJH460YBISElS+fHkFBQUV6OfYZr5j5202ffp0Pffcczp27JgaNGig06dP68CBA87HmzRponvvvVe33nqrQkNDfTjSgtm5c6eqV6+uUqVKOZc5qu+Ftklx2GYFZoBc7N271/j7+5t///vfJjs7O8fj8fHx5rXXXjNt2rQxlmWZa6+91sTFxflgpAW3d+9eY1mWsSzLXHHFFWbSpEnmp59+ynXdrKwsY8zZvB9//LHZtWuXN4daIPv27TN+fn5mwoQJea6zdOlS06NHDxMQEGBatGhhvvvuOy+OsPD27dvn3Ga1atUyMTEx5rPPPjN//fWXSU9Pd1nXsc327dtnXnrpJfPNN9/4Ysj5Ztftdjlss0mTJuW5zqZNm8zgwYNNYGCgqV27tlmxYoUxxuT6flpUnLvNwsPDTd++fc1LL71kNm/ebI4ePeqyriNHXFycGTdunPnkk098MeQC2b9/v6lQoYKpX7++WbZsmVm3bp3Ztm2bWbJkiRk6dKgpWbKksSzLlC9f3owfP96cPHnS10POl/j4eDNs2DDz8ccfmz///NOkpaVd9GcyMjK8MLJL9+eff5qyZcuaFi1amE2bNpnffvvNHD9+3GzatMmMHTvWNGzY0PmaHTx4sPn99999PeR8+euvv8x1111nnn/+ebNhwwbz999/5/ne4Fien+1aFLDNit8227dvnylVqpTp2LGj+eWXX8yxY8eMMcbs2LHDPP/886Znz54mICDAWJZl2rVrZ9atW+fjEefPgQMHTMuWLc0DDzxg3n//ffP777+bzMxMl3Uc28rxv6dPn/b6OL2F0o9cvfzyyyYkJMR88cUXxpi837h27dpl7rnnHmNZlrnjjjty7ExF0UsvvWQsyzItW7Y0lStXdv7yueaaa8yrr75q9u/f71zX8Sbw4osvGsuyzEcffeSrYV/UnDlzTIkSJcySJUuMMcZZrLKzs122S3JyspkxY4axLMtcd911JiUlxRfDLZBXX33VeXCpbdu2JigoyFiWZZo2bWomTJhg1q9fb44cOeIsj8acfQ1blmXeffddH4784uy63ey8zd544w0THBxsFi9ebIz53zbLysrK8R740UcfmcDAQBMVFWX+/vtvr4+1IObMmWMsyzL/+Mc/zMCBA53vjzVr1jRDhw41b775pvn5559NUlKS82dee+01Y1mWWbRokQ9Hnj8TJ040lSpVMkuXLs318fT0dLNgwQITFRVl/Pz8zE033VTkt5kxxjz66KPGsizj7+9vGjVqZB566CGzatUqc/jw4Tw/4K5YscJMnTrVxMfH+2LI+fb444+bSpUqmS+//DLPdb744gvTpUsXY1mW6dKli/njjz+8OMLCmThxorEsywQGBpqqVauawYMHm9dff91s3749x8Emxzb7+OOPTUxMjNm9e7cvhpxvbLPit80mT55sKlSoYFauXGmMMS6/lx2++eYbM3DgQGNZlmnWrJnZtm2bMaZoH8ieNGmSsSzLBAcHm9DQUNOxY0czceJEs2zZMvPXX3+5rOvI8d///td07949z8nA4ozSj1w5PvytWbPGGHPhnfr06dMmJibGWJZVpGfCHe655x7j5+dntmzZYnbu3Gmeeuop06VLF+csT8mSJc1NN91k3n//fZOcnGwyMzPN4MGDjWVZRbpoffjhh8ayLPPpp59edN2srCznB8Vvv/3WC6O7NKNHjzaWZZnNmzebgwcPmjfeeMMMHz7c1K9f3/mG3qVLFzNjxgzz888/m4SEBOcvp6K8zYyx73az8zZbtWqVsSzLzJ8/P891MjMzne+b//nPf4xlWWb58uXeGmKhjB071liWZTZu3GhSUlLM8uXLzZQpU0yXLl1M6dKlTUBAgGnSpIkZNWqUWbp0qfn555/NTTfdVCy2mTHGdO3a1TRv3txZdB2z3ecfrNm7d68ZOnSosSzLzJw50ydjLYjOnTubkJAQc/PNN5srr7zSWUzat29vnn32WbN161Zz8uRJZ8YzZ86YG264wYSEhBT5Wa0+ffqYxo0bmwMHDhhjjDPD+dssIyPD+d44ZswYn4y1ILp3725KlixpRo8ebXr27GnKli3rPGhzzz33mA8//ND8/vvvzv0qMzPT/OMf/zBBQUHm1KlTPh79hbHNit82GzhwoKlTp47Zt2+fMcZ1m51/AGDevHnGsiwzYMAAr4+zoPr06WNCQ0PNc889Z+666y5Ts2ZNY1mWqVixorn++uvNjBkzzDfffONyJtvAgQONn5+f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a9euSJdju+ZyF0o/jDHGzJgxw1iWZT744APnsvOPOp/7hnf77bebChUqmJ07d3ptjIVlx2x///23adu2ralWrZpz2enTp83bb79tunbt6vLBok2bNuall14y77//vomIiDDXX3+9D0d+cXbOZowxr7/+urEsy7zyyisuX5OTV0keP368KVWqVJGfWbVrriNHjpj27dubKlWqOJelpaWZ5cuXmzvvvNNEREQ4X48VK1Y0jzzyiHnrrbeK/OvRrrkcEhISTOPGjU337t0vum5GRoZ56aWXjGVZZty4cV4YXeHZNZcxxvzxxx+mYsWKpnPnzmb9+vVm5MiRpmbNms7XYbly5cw999zj8p7xww8/mHLlypnOnTv7buAXYddcxhhz9OhR07p163xNlGRkZJj33nvPWJZl7r77bi+MrvDsmsuYs5dPVq1a1bRr185s377dPPnkk6ZTp06mRIkSxrIsU7p0aTNo0CCzZMkSc+zYMWOMMVu2bDHly5c30dHRPh593uyay50o/TDGGLN+/XpTqlQp06hRoxzfUXnudYCO/506daoJDQ0tFt/RbMds+/fvN9dcc43p06ePMSbn9ewHDx40M2bMcJldcLzxnT+zUNTYOZsxxvz888+mWrVqpnz58ubzzz93eSw7O9t5Wrzj9fif//zHlChRwmzcuNHrYy0Iu+ZKSEgwvXr1Mt27dzcZGRk5ZgOOHDli3nzzTdOvXz8TGhrqclCqKL8e7ZrLmP+9rw8YMMCEhYU5r7c993WYm6ZNm5prr73WJCcne2uoBWLXXA6xsbHGsizz0EMPOZedPHnSLF682AwcONB5HbVlWaZu3brm2WefNePGjTOWZTlPrS6K7JrLcUA3JibGWJZlPv/8c+eB3gudndChQwfTpk0bZ/Eqauyay2H16tXGz8/PjBo1yrksOTnZrFixwowePdo0a9bM+XqsVq2aefDBB83dd99d5F+Pds3lTpR+ON/g5s2bZ/z9/Y1lWWbEiBHmq6++MklJSTnWP3XqlPnnP/9pwsPDvT3UArNrtvT0dLN69WqzceNGlxvanXuDO4ddu3aZe++911iWZcqXL++L4RaInbM5Xo/Lly831atXd96s8P333zfHjx/PsX5KSooZNGhQkX892jWXQ1xcnNmxY0eO1+P5ZzHs37/fPPHEE6ZkyZKmXLlyvhhqgdg1l8PcuXOd11Gff21nVlaWS9bExETTu3dv06RJE18MtUDsmmvjxo2mRo0aZu7cucaYnPff+fPPP82sWbNMly5dXA5CFfXXpF1zOSxbtsxYlmUaNGhgVqxY4fKY42aFjtfjyZMnzY033mgaNGjgi6EWiF1zbd++3dSvX9+89NJLxpic9985dOiQeffdd82wYcNMZGRksXk92jWXO1H64ZSSkmJee+01U6lSJWNZlqlUqZK54YYbzNSpU81XX31ljh8/br799ltz9913m6CgIJej1kWdXbPldSdmxxFpx5veli1bTMmSJc2IESO8ObxLYudsGRkZ5sMPP3Q58ty8eXNz7733mo8++sj89ttv5uOPPzY333yz8ff3N4888oivh5wvds11IY6i7Hg9btq0qdi9HnNjl1zPPvus8fPzM5ZlmWHDhpkVK1aY06dPOx93fGj/6quvTLVq1UxMTIyvhlogdsyVnp5ufvnlF+f9d4zJ+yyG33//3dx6663Gsixz7733enOYBWbXXOd6++23TeXKlZ3XUC9evNjlvh+O1+MXX3xhqlatWixej8bYN1dSUlKOA/K5feaKj4839913n7Esy9xzzz3eGl6h2TWXu1D6kWNWJyUlxbzwwgvm6quvNgEBAc4P735+fiYoKMhYlmVuv/32XG+KUdTYNdu5X6OVn6/8cby5fffdd54e2iWzc7bcLFmyxPTp0yfH69GyLBMUFGRGjx7t8mGxuLBrrotxnHlSXF+PeSluuRzv/SdOnDAzZ850HvANCAgwV111lRkzZoz5/PPPzfr1683MmTNNZGSkqVChgvnpp598PPILs2uu/Dj/d8KUKVOK1WsyL3bIdebMGfP222+bVq1aOd/vK1eubAYNGmTmzZtn3nzzTTN27FgTHh5uqlatesG7qhclds11Iee/Hh9//PFi93rMjV1zFYRljDECcnH06FH9/vvv2rx5s77++mtlZWWpQYMGaty4se68805fD++S2Dnb+ZKSknT33XdrzZo1SkhI8PVw3Kq4ZjPGKDs7W/7+/s5lCQkJWrNmjTZs2KDAwEBVrVpVjRo10vXXX+/DkRaMXXPlV2pqqu69914tW7ZMf//9t6+H4zbFMZcxRpZlOf9+5swZLVq0SG+++aY2bdqUY/0rrrhC48eP15AhQ7w5zAKzay5Jys7Olp+fn7KyslzeQ87lyP/777/r+uuvV2Zmpv744w8vj7Rg7JorN8YYff7555o7d65iY2OVmZnp8vjVV1+txx57TNddd52PRlg4ds11MXv27NGNN96o5ORk7d2719fDcRu75roYSv9l7u+//9bPP/+s33//XSkpKWrbtq0aNWqkChUq5PjllJaWpuDgYOffz//wUdTYNVteucLDwxUQECBJOT5cpKWl6e+//1aNGjV8Nex8sXM2xwe//Dg/Y1F+Pdo1l1SwbOdKSkpSWFiYB0bkHnbNlV/79+/XV199pR07dqhKlSqqVKmSOnbsqHr16vl6aJfErrlys2vXLt144426/vrr9dxzz/l6OG5TXHOZs2cOu7yvJCYmau3atdqzZ4+qVq2qUqVKqU2bNqpUqZIPR1owds2VX3v37tXdd9+tzp0769FHH/X1cNzGrrkuhtJ/GVu+fLmeeuqpHLMD5cuXV9euXXXzzTfr+uuvV2BgoPOxwn5Y9Da7ZrtQrm7dujlzOQpycWLnbOfL67WWlZUlPz8/WZalzMzMYpfVrrmk/L0/ZGZmyrKsPGfziiI75vryyy+1Y8cObd++XZUrV1br1q1Vr1491ahRQ+Hh4S7v+8WJXXNJrtkqVaqkNm3aqF69eqpVq5bCw8Pl7++f60HCov5+YtdcUs6DuOcutyyryH+eyotdc0l5Z/PUz3mLXXO5G6X/MnXgwAF16dJFqampGj58uKKjo7Vnzx798MMP+vHHH/XTTz8pLS1NV1xxhSZMmKABAwYoKCioyM/MSfbNlt9cV155pcaPH+/MVRwOZtg52+HDh/Xcc8+pR48euuqqq1S2bFnnY46336L8usuLXXNJ9s1m11wOJ0+e1DPPPKPp06fL399fWVlZzsfKly+vDh06qH///urXr5/Kly/vfKyov/fbNZeU/2w33nijy+u1qH9Yt2suKeeBwtxmw89fboxRVlZWkT6QYddcUv6znS89PV1BQUGeHl6h2TWXx7j/NgEoDh599FFTrlw589FHH+V47MCBA2bx4sVmyJAhzhuXTJs2zQejLBy7ZrNrLmPsnc1xs5jIyEjTp08fM336dLNlyxZz5swZl/UcX7VljDFr1qwxy5cv98Vw882uuYyxbza75nJ47rnnTMmSJU3//v3NmjVrzK5du8x7771npkyZYvr27WsqVqxoLMsyLVu2NEuWLPH1cPPNrrmMsW82u+YyxphXX33VDBo0yCxdutQkJye7PJaVlZXnN+8UdXbNZYx9s9k1l6dQ+i9TV111lenSpYs5cuSIMca4fAXauVavXm2ioqJMcHCwef311709zEKxaza75jLG3tlatGhhgoKCTLt27ZzfEFG7dm0zZMgQM3/+fPPbb7+5rJ+ammr69etn/Pz8XL6Cq6ixay5j7JvNrrkcatWqZfr06WOOHj2a47H4+HizdOlSM2LECOc3SsybN88Hoyw4u+Yyxr7Z7JrLGGNq165tLMsyJUqUMFdddZWZOHGi2bRpU45vS8rIyDDGnH0fef75583q1at9Mdx8s2suY+ybza65PIXSfxlKTk423bp1M40aNTKpqanGGNfvsczOznb5+7Zt20y5cuVMv379nI8XVXbNZtdcxtg72/79+03t2rVNq1atTHp6utm0aZOZOHGiad68ubEsy/j7+5tmzZqZ++67z7z//vsmMTHRbNmyxVSpUsVcf/31vh5+nuyayxj7ZrNrLofffvvt/9q7/9Co6ziO45/PvGrtlsPVVv64iVa6iNTQCIyETcy/auBqYpgriH6YK1eOQigEIZFIiizsn5BWSBgUOfsB/fijtDbTyDaZzsbVbanDaYE65m737I+4S7ep29zu6173fvy3uw3ezz+2u/f3+719yc3NZe3atanHBjrT093dzc6dO5k+fTr5+fns3r073aMOiWoX6LapdgE0NjbivWfevHksWrQodfVdbm4uixcv5s033+x38PD777/He88999wT0NSXptoFum2qXaPJlv4M9eKLL+K9H/Bs6blLVPJFqqysjBkzZhCNRtM243Cptql2gW5bfX09+fn5VFZWAhCPx+nt7eXYsWN88cUXPPXUU0ydOhXvPTk5OSxYsICFCxfivWfHjh3BDn8Rql2g26balXTgwAGmTJnC0qVLgf/O7PQ9eHju35JPP/10THxUSLULdNtUuwC2bduG955NmzYBcPDgQTZu3MicOXNSS9fEiRNZtmwZ77//PidOnOD111/He09dXV3A01+Yahfotql2jSZb+jNUW1sbd9xxB957qqqq2Lt3b7/LN5OXw/zzzz889NBDFBUVBTHqkKm2qXaBbltLSwtLlizhww8/HPD5s2fPEo1Gqa2tpaKigvz8fLz3TJgwIc2TDo1qF+i2qXad6+677+a6667j888/7/dccslKLl+dnZ1MmzaN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", + "image/png": "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utiQtXPnTt17772Kjo5WUFCQ6tatq1GjRikjI8NbLUkqngP053rrrbfUtWtX1ahRw52lX7KK655J8fHxmjNnjrZu3apPP/1U27dvV69evbzREnBJ4Zp+2Ep+QevTTz91mXZ20FqyZInLh4glS5Zo7ty5Onr0qHP666+/roULF2r27NnO06uB82nXrp22bt3qMu2PP/5QVFSU83fHdpiUlKSlS5cqIiIi3+VVqVJFkvT222+rTJky6ty5s3sKB1AiFMd171u2bFFOTo6mTZumevXqafPmzUpISFB6eromTpzotd5ycnLUqlUrjR07VpIUGxurzZs364033lC/fv1c5s3vAP3Z9uzZo/nz52vOnDlur/1SVRz3TJKkwYMHOx+PiorSE088oZtuukmZmZny9/d3cxfApYvQD1spjqB14sQJScp1+rSPj49ycnLcVDnsZvDgwYqLi9PYsWPVp08frVu3TtOnT9f06dMlndkOe/XqpQ0bNmju3LnKzs52fjtEhQoVFBAQIOnMh6a4uDiVLVtWCxcu1OOPP65x48ble4orAHsojpDVrVs3devWzfl4nTp1tHXrVk2dOtWrob84DtCfbebMmYqIiMg1qoziUxw3pz3XkSNH9N577ykuLo7AD7gZp/fDVgYPHqy1a9dq7Nix2rZtm95//31Nnz5dDz74oKT/Ba0ffvhB7733njNo7d+/33m6Y9u2bVW+fHn169dPP/30k/744w89/vjj2rFjh3r06OHN9lCKtG7dWp9//rk++OADNW7cWM8995xefvll3XnnnZLOnLb71Vdfac+ePWrevLkiIyOdP6tXr3YuZ926dercubOaNGmi6dOna9q0aUpMTPRWWwA8xB3XvTvmqVChQjFXWziFPUC/aNGifM+EMsZo5syZuvvuuwmOblScl2QMHz5cISEhioiI0K5du/Tll196ogXg0mZwUVJSUowkk5KS4u1S8F9ff/21ady4sQkMDDQNGzY006dPdz62Y8cOIynPn6VLlzrnW79+venSpYupUKGCCQ0NNW3atDHz5s3zQjcAPGnPnj3mzjvvNBUqVDBlypQxjRs3NuvXr3c+/umnn5rOnTubChUqGElm48aNuZaxb98+c9ddd5kqVaqY4OBgExsbaz755BMPdgE7CAwMNIGBgWbEiBFmw4YNZtq0aaZMmTJm1qxZec5/8uRJ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Yzp27GiaNWvmDLqO0e5zD9bs2LHD9O3b11iWZSZNmuSVWgujffv2JigoyNx6663m8ssvdwaTuLg4M27cOLN+/Xpz7NgxZ4+nTp0yN954owkKCirxo1o9evQwjRo1Mrt37zbGGGcP566zzMxM52vjkCFDvFJrYXTu3NkEBwebwYMHm65du5rw8HDnQZsHHnjAfPLJJ+aPP/5w7ldZWVnm//7v/0xAQIA5ceKEl6s/P9ZZ6VtnvXv3NnXq1DE7d+40xrius3MPALz55pvGsizTq1cvj9dZWD169DAhISHmX//6l/nHP/5hatWqZSzLMpUqVTLXX3+9mThxolm5cqXLmWy9e/c2Pj4+Jj093YuVuwehH3n66aefTHBwsLn66qudp+2fO/JozP9GuD7++GPj6+trZs2a5fFaCyMlJcX06NHDWJblciAjPT3dLFq0yDz22GMmNjbWOfpfrVo106tXLxMSEmJ69OjhxcovbPv27aZChQqmUaNGZvXq1c7pZ4cPY/73Qfe7774zvr6+5rXXXvN4rYWRmppqbrrpJmNZljl16pRz+qlTp8wPP/xgXn75ZXPzzTebqlWrOk/N7dixowkICCjx68wYe643u6+zffv2mVq1apmqVauaL774It/g5Fhny5cvNwEBAWbChAmeLLNQ0tPTzT333GMCAwNdRq0yMzPNtm3bzKeffmoGDx5sYmNjTUBAgAkODjYtWrQwlmWZnj17erHygsnIyDAJCQmmbNmyBQq6aWlppnnz5qZZs2YmJSXFAxUWTXJysmnatKlp2rSpMcaYTZs2mddee8306dPH1KhRw1iWZcLCwsz1119v3njjDbN7926zZMkSU7VqVdO1a1cvV39hw4YNM76+vrlG5c7mCCU5OTnm2muvNQ0aNCjRZzDs37/ftGjRwsTExBhjzhxk+vLLL82wYcNM69atTZkyZUxgYKC58sorzZNPPmn+85//mC+++MJUrlzZdOvWzcvVXxjrrPSts7FjxxrLssyPP/6Y7zxZWVnO97RevXqZqKgos2XLFk+VWGgHDhwwV1xxhalZs6YxxpgjR46YH374wbz++uvmhhtuMBEREcayLBMdHW3uvPNO8+6775rZs2ebSpUqmeuuu87L1bsHoR95OnHihBk4cKDzVM+NGze6PJ6dne0SSGbNmmX8/PycpwaVVBkZGWby5Mmmb9++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XHGF4uLi1LRpU+cZX6XldfJ8fbVp00ZXXXWVmjRpUipC1dkc///Ptx2ee4DN8ZySvO4K0ldptnXrVo0YMULz5s1TRkaGAgMDVb58eUVFRalNmzbq0qWLrrrqKoWGhkrKe4S8JDpfX3FxcerWrZvi4uJK5WDYhZy7jkrDfoYLcP8VBCgNduzYYYKDg0337t3N77//bow5c6fjDRs2mI8//tg8/PDDpn79+sayLNO8eXPnVzRd6Lq0ksCuve3YscNYlmW6du1qZs2aZQ4dOuTyeFZWlst34RpjnDcoLOns3Nuff/5pypQpY3r37u38OrvU1FSza9cu8/3335sJEyaYuLg44+/vb2rXrm1mz55tjMn/OsKSwq59GWPMtm3bjGVZplGjRmbChAlm3759Lo9nZWU5b4Ln6CctLc3s37//gtdbe5Nd+3LYt2+fadOmjfO64d69e5tbb73VtGnTxnlt6uWXX27GjBlTor8j/FyF6cvxDSDGFOxacm9LSUkxf/31l8u0s7fD0squfRljzN69e02TJk2Mj4+P6devnxk6dKgZPny46dmzpylXrpzzLvb33HOPWbt2rbfLLbDC9PX99987n1fYa8m94ciRI2bZsmXm1KlT3i6lWNm1r+JC6Icxxphnn33WVKhQwSxatMgYY3J9oEtJSTGrV682jz76qLEsy1StWtVs3LjRC5UWnl17Gzt2rMtd3itWrGj69etnvvnmm1w9OgLxG2+8YTp27Fiiv3faGHv39sILL5gKFSqYxYsXG2Ny3zE9MzPT/Pnnn+bll182lSpVMpZlme+++84bpRaKXfsyxpjx48e7bI9n3/X93Jsqnr09XnHFFSX6e4zt2pfDM888Y8qVK2defvll57SjR4+a3bt3mxUrVpinn37aXHbZZcbHx8e0bdvWrFy50hhT8g9E2bUvY858Z7tlWebqq682b7/9dq4bBGdmZuY6cLFv3z5z4MCBEt2fXfsyxpinn37alC9f3syYMcM57fTp0yYjI8Ps2rXLTJs2zbRr1874+PiYyy67zMydO9cYU/K3R7v2ZYwxjz32mPNbFZ577jmzefPmfOd19PPHH3+YTZs2legbCdu1r+JC6Icxxpi7777bREZGmv379xtj/rcz5PXi9eGHH5py5cqZNm3aeLTGorJrbz179jShoaFmxowZpl+/fs4RHsuyTL169cxj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", "text/plain": [ "
" ] }, - "execution_count": 6, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -59,16 +59,31 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'0000': 10000}" + "{'0101': 615,\n", + " '1100': 623,\n", + " '0100': 629,\n", + " '0111': 605,\n", + " '1000': 639,\n", + " '1110': 592,\n", + " '1011': 602,\n", + " '1010': 627,\n", + " '0110': 618,\n", + " '0011': 643,\n", + " '0001': 628,\n", + " '1111': 645,\n", + " '1101': 659,\n", + " '0010': 612,\n", + " '0000': 641,\n", + " '1001': 622}" ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -79,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -115,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -148,7 +163,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -300,6 +315,317 @@ "plt.fill_between?" ] }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Library\n", + "from matplotlib import pyplot as plt\n", + "from matplotlib_venn import venn2, venn3\n", + " \n", + "# Basic Venn\n", + "v = venn2(subsets={'10': 0, '01': 12, '11': 9},\n", + " set_labels=(\"A\", \"B\"),\n", + " set_colors=('r', 'b'),\n", + " alpha = 0.5)\n", + " \n", + "# Change Backgroud\n", + "plt.gca().set_facecolor('white')\n", + "#plt.gca().set_axis_on()\n", + " \n", + "# Show it\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[0;31mSignature:\u001b[0m\n", + "\u001b[0mvenn2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0msubsets\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mset_labels\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'A'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'B'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mset_colors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'r'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'g'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0malpha\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.4\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0mnormalize_to\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m \u001b[0msubset_label_formatter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", + "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mDocstring:\u001b[0m\n", + "Plots a 2-set area-weighted Venn diagram.\n", + "The subsets parameter can be one of the following:\n", + " - A list (or a tuple) containing two set objects.\n", + " - A dict, providing sizes of three diagram regions.\n", + " The regions are identified via two-letter binary codes ('10', '01', and '11'), hence a valid set could look like:\n", + " {'10': 10, '01': 20, '11': 40}. Unmentioned codes are considered to map to 0.\n", + " - A list (or a tuple) with three numbers, denoting the sizes of the regions in the following order:\n", + " (10, 01, 11)\n", + "\n", + "``set_labels`` parameter is a list of two strings - set labels. Set it to None to disable set labels.\n", + "The ``set_colors`` parameter should be a list of two elements, specifying the \"base colors\" of the two circles.\n", + "The color of circle intersection will be computed based on those.\n", + "\n", + "The ``normalize_to`` parameter specifies the total (on-axes) area of the circles to be drawn. Sometimes tuning it (together\n", + "with the overall fiture size) may be useful to fit the text labels better.\n", + "The return value is a ``VennDiagram`` object, that keeps references to the ``Text`` and ``Patch`` objects used on the plot\n", + "and lets you know the centers and radii of the circles, if you need it.\n", + "\n", + "The ``ax`` parameter specifies the axes on which the plot will be drawn (None means current axes).\n", + "\n", + "The ``subset_label_formatter`` parameter is a function that can be passed to format the labels\n", + "that describe the size of each subset.\n", + "\n", + ">>> from matplotlib_venn import *\n", + ">>> v = venn2(subsets={'10': 1, '01': 1, '11': 1}, set_labels = ('A', 'B'))\n", + ">>> c = venn2_circles(subsets=(1, 1, 1), linestyle='dashed')\n", + ">>> v.get_patch_by_id('10').set_alpha(1.0)\n", + ">>> v.get_patch_by_id('10').set_color('white')\n", + ">>> v.get_label_by_id('10').set_text('Unknown')\n", + ">>> v.get_label_by_id('A').set_text('Set A')\n", + "\n", + "You can provide sets themselves rather than subset sizes:\n", + ">>> v = venn2(subsets=[set([1,2]), set([2,3,4,5])], set_labels = ('A', 'B'))\n", + ">>> c = venn2_circles(subsets=[set([1,2]), set([2,3,4,5])], linestyle='dashed')\n", + ">>> print(\"%0.2f\" % (v.get_circle_radius(1)/v.get_circle_radius(0)))\n", + "1.41\n", + "\u001b[0;31mFile:\u001b[0m ~/miniforge/envs/jb/lib/python3.12/site-packages/matplotlib_venn/_venn2.py\n", + "\u001b[0;31mType:\u001b[0m function" + ] + } + ], + "source": [ + "venn2?" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "v = venn3(subsets=(1, 1, 1, 0, 0, 0, 2), set_labels = ('A', 'B', 'C'))\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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EchfEh4erkWLFmnv3r0XtxmGob1792rZsmUBnAz4u56eHj366KPavXu33nvvPWVlZQV6JOCi5cuXq6SkRIcOHbr4X15enr7xjW/o0KFDCg0NDfSIgG644YZ+y+OdOHFCkyZNCtBEQF/t7e0KCen7Y3poaKgMwwjQRIB/WVlZSk9P79NQbrdb+/fvH5UNxSnWl9i4caMeeugh5eXlacmSJXr66afV1tamb3/724EeDZDUe1r1c889p1deeUVms/nitR0Wi0VRUVEBng7jndls7nc9fExMjJKSkrhOHkHjhz/8oa6//nr9/Oc/14YNG3TgwAH98Y9/1B//+MdAjwZIktasWaOf/exnmjhxoubMmaODBw/qV7/6lb7zne8EejSMU62trTp16tTFr8vLy3Xo0CElJiZq4sSJeuyxx/TTn/5U06dPV1ZWln7yk58oIyPj4p2uRxOWefLhmWee0VNPPaXq6mrNnz9fv/71r7V06dJAjwVI6r21vi9/+ctf9K1vfWtkhwEG4JZbbmGZJwSd119/XZs2bdLJkyeVlZWljRs36p/+6Z8CPRYgSWppadFPfvIT7d69W7W1tcrIyNDXv/51PfHEEwoPDw/0eBiHPvjgA9166639tj/00EN69tln1dPTo82bN+uPf/yjmpubdeONN+p3v/udZsyYEYBprw2BDAAAAACAuAYZAAAAAABJBDIAAAAAAJIIZAAAAAAAJBHIAAAAAABIIpABAAAAAJBEIAMAAAAAIIlABgAAAABAEoEMAAAAAIAkAhkAAAAAAEkEMgAAAAAAkghkAAAAAAAkSf8/wd6BoaBZAcIAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "x = np.array([0, 3, 4, 4.5, 5, 7, 7.7, 8, 8.2, 10])\n", + "y = 0.5 * x\n", + "plt.figure(figsize=(12,3))\n", + "plt.plot(x, y, 'o-')\n", + "plt.axline((x[0], y[0]), (x[1], y[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "fig, ax = plt.subplots(figsize=(12, 8))\n", + "\n", + "c1 = plt.Circle((-1.2, 1), 1, color='g', alpha=0.5, ec='k')\n", + "c2 = plt.Circle((1.2, 1), 1, color='g', alpha=0.5, ec='k')\n", + "ax.text(c1.center[0], c1.center[1], 'A', fontsize=72, ha='center', va='center')\n", + "ax.text( c2.center[0], c2.center[1], 'B', fontsize=72, ha='center', va='center')\n", + "ax.add_patch(c1)\n", + "ax.add_patch(c2)\n", + "\n", + "c3 = plt.Circle((-0.5, -1), 1, color='g', alpha=0.5, ec='k')\n", + "c4 = plt.Circle(( 0.5, -1), 1, color='g', alpha=0.5, ec='k')\n", + "\n", + "ax.add_patch(c3)\n", + "ax.add_patch(c4)\n", + "\n", + "ax.set_xlim(-3, 3)\n", + "ax.set_ylim(-2.2, 2.2)\n", + "ax.set_xticks([])\n", + "ax.set_yticks([])\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.13325946491983 (120,)\n" + ] + }, + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi8AAAGdCAYAAADaPpOnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABBJklEQVR4nO3de3xU9Z3/8ffMJJlwS8ItFzAIXhFBFBA2XlqtqVBdWttuVxGEshZXFlok/bWCFSlrNdKq641CpbV2V620XXVVbFoMomuNRAlYI4gXEFjIBDAmExJynfP7Y2ZOZnKdM+HkJPB6Ph7zkJw5Z+abU8t5+/neXIZhGAIAAOgj3E43AAAAwArCCwAA6FMILwAAoE8hvAAAgD6F8AIAAPoUwgsAAOhTCC8AAKBPIbwAAIA+JcHpBpxogUBAhw4d0qBBg+RyuZxuDgAAiIFhGKqurtaIESPkdndeWznpwsuhQ4eUnZ3tdDMAAEAcDhw4oNNOO63Tc0668DJo0CBJwV8+JSXF4dYAAIBY+P1+ZWdnm8/xzpx04SXcVZSSkkJ4AQCgj4llyAcDdgEAQJ9CeAEAAH0K4QUAAPQphBcAANCnEF4AAECfQngBAAB9CuEFAAD0KYQXAADQp5x0i9TZpTlgqHhvhQ5X1yl9ULKmjhkij5u9kwAA6Gm2Vl7eeOMNzZw5UyNGjJDL5dILL7zQ5TVbtmzRpEmT5PV6ddZZZ+nJJ5+0s4kxKSgt02WrN2vW+re15NkdmrX+bV22erMKSsucbhoAAKccW8NLTU2NJk6cqDVr1sR0/t69e3Xttdfqyiuv1I4dO3Tbbbfpe9/7nv7yl7/Y2cxOFZSWaeFTJSqrqos67quq08KnSggwAAD0MJdhGEaPfJHLpeeff17XXXddh+fcfvvt2rhxo0pLS81jN9xwgyorK1VQUBDT9/j9fqWmpqqqqqrbexs1Bwxdtnpzm+AS5pKUmZqsN2//Cl1IAAB0g5Xnd68asFtUVKTc3NyoY9OnT1dRUVGH19TX18vv90e9TpTivRUdBhdJMiSVVdWpeG/FCftOAADQuV4VXnw+nzIyMqKOZWRkyO/36/jx4+1ek5+fr9TUVPOVnZ19wtpzuLrj4BLPeQAAoPt6VXiJx/Lly1VVVWW+Dhw4cMI+O31Q8gk9DwAAdF+vmiqdmZmp8vLyqGPl5eVKSUlRv3792r3G6/XK6/Xa0p6pY4YoKzVZvqo6tTcwKDzmZeqYIbZ8PwAAaKtXVV5ycnJUWFgYdWzTpk3KyclxpD0et0srZ45r973w8NyVM8cxWBcAgB5ka3g5duyYduzYoR07dkgKToXesWOH9u/fLynY5TN37lzz/FtvvVV79uzRj3/8Y3344Yf65S9/qT/84Q9aunSpnc3s1IzxWVo7Z5KGDkiKOp6Zmqy1cyZpxvgsh1oGAMCpydZuo3fffVdXXnml+XNeXp4kad68eXryySdVVlZmBhlJGjNmjDZu3KilS5fq4Ycf1mmnnaZf//rXmj59up3N7NKM8VkaOtCr76wr0tABSXrsxkmssAsAgENsDS9XXHGFOltGpr3Vc6+44gpt377dxlbFJ9ETLFIlJ3qUc+ZQh1sDAMCpq1eNeenNPK5glSXQM2v6AQCADhBeYuQO3anmAOEFAAAnEV5iFB7fQuUFAABnEV5iFO42ovICAICzCC8xcrsJLwAA9AaElxi1DNh1uCEAAJziCC8x8lB5AQCgVyC8xMjNgF0AAHoFwkuMwovpEl4AAHAW4SVGzDYCAKB3ILzEqKXbSJ1ueQAAAOxFeIlRuPIiMeMIAAAnEV5i5I7YQZquIwAAnEN4iZHHHVl5IbwAAOAUwkuMIruNqLwAAOAcwkuM3BF3qpnKCwAAjiG8xMgdUXkxAg42BACAUxzhJUZR3UZUXgAAcAzhJUbMNgIAoHcgvFjgYX8jAAAcR3ixgC0CAABwHuHFgvCMI8ILAADOIbxYEK680G0EAIBzCC8WhAftUnkBAMA5hBcLGLALAIDzCC8WuM1uI4cbAgDAKYzwYoGb2UYAADiO8GKBh9lGAAA4jvBiAbONAABwHuHFAmYbAQDgPMKLBcw2AgDAeYQXC1q2B3C4IQAAnMIILxbQbQQAgPMILxYwYBcAAOcRXiwIZRfCCwAADiK8WOCh2wgAAMcRXixgthEAAM4jvFjgZrYRAACOI7xYQLcRAADOI7xYwGwjAACcZ3t4WbNmjUaPHq3k5GRNmzZNxcXFnZ7/0EMP6dxzz1W/fv2UnZ2tpUuXqq6uzu5mxsTNxowAADjO1vCyYcMG5eXlaeXKlSopKdHEiRM1ffp0HT58uN3zn3nmGS1btkwrV67Url279Jvf/EYbNmzQHXfcYWczY8aAXQAAnGdreHnwwQe1YMECzZ8/X+PGjdO6devUv39/PfHEE+2e/9Zbb+nSSy/VjTfeqNGjR+vqq6/WrFmzuqzW9JSWAbuEFwAAnGJbeGloaNC2bduUm5vb8mVut3Jzc1VUVNTuNZdccom2bdtmhpU9e/bolVde0TXXXNPh99TX18vv90e97OI2x7zY9hUAAKALCXZ98NGjR9Xc3KyMjIyo4xkZGfrwww/bvebGG2/U0aNHddlll8kwDDU1NenWW2/ttNsoPz9fq1atOqFt74jZbUR6AQDAMb1qttGWLVt077336pe//KVKSkr03HPPaePGjbr77rs7vGb58uWqqqoyXwcOHLCtfWa3EWNeAABwjG2Vl2HDhsnj8ai8vDzqeHl5uTIzM9u9ZsWKFbrpppv0ve99T5I0YcIE1dTU6JZbbtFPfvITud1ts5bX65XX6z3xv0A7PMw2AgDAcbZVXpKSkjR58mQVFhaaxwKBgAoLC5WTk9PuNbW1tW0CisfjkSQZvaDawWwjAACcZ1vlRZLy8vI0b948TZkyRVOnTtVDDz2kmpoazZ8/X5I0d+5cjRw5Uvn5+ZKkmTNn6sEHH9RFF12kadOm6ZNPPtGKFSs0c+ZMM8Q4idlGAAA4z9bwcv311+vIkSO666675PP5dOGFF6qgoMAcxLt///6oSsudd94pl8ulO++8UwcPHtTw4cM1c+ZM3XPPPXY2M2ZsDwAAgPNcRm/ojzmB/H6/UlNTVVVVpZSUlBP62Xkbdui57Qd1xzVjdcuXzjyhnw0AwKnMyvO7V8026u3cbnaVBgDAaYQXC0LZhQG7AAA4iPBiAYvUAQDgPMKLBSxSBwCA8wgvFlB5AQDAeYQXC6i8AADgPMKLBR5mGwEA4DjCiwVsDwAAgPMILxawPQAAAM4jvFjArtIAADiP8GJBuPJyku2oAABAn0J4sYDZRgAAOI/wYgGzjQAAcB7hxQIWqQMAwHmEFwvoNgIAwHmEFwvCs42ovAAA4BzCiwVUXgAAcB7hxYKWAbuEFwAAnEJ4sSBceWF7AAAAnEN4scBtzjZyuCEAAJzCCC8WeBjzAgCA4wgvFjDbCAAA5xFeLGC2EQAAziO8WMBsIwAAnEd4scDcHoDKCwAAjiG8WGB2G1F5AQDAMYQXCzxMlQYAwHGEFwtC2YUBuwAAOIjwYgEr7AIA4DzCiwUt3UaEFwAAnEJ4sSC8PQDdRgAAOIfwYoG5PQADdgEAcAzhxQK6jQAAcB7hxQK2BwAAwHmEFwuovAAA4DzCiwXhXaWpvAAA4BzCiwUutgcAAMBxhBcLwrONKLwAAOAcwosF4TEvVF4AAHCO7eFlzZo1Gj16tJKTkzVt2jQVFxd3en5lZaUWLVqkrKwseb1enXPOOXrllVfsbmZMmG0EAIDzEuz88A0bNigvL0/r1q3TtGnT9NBDD2n69OnavXu30tPT25zf0NCgr371q0pPT9ef/vQnjRw5Uvv27VNaWpqdzYwZs40AAHCereHlwQcf1IIFCzR//nxJ0rp167Rx40Y98cQTWrZsWZvzn3jiCVVUVOitt95SYmKiJGn06NF2NtESZhsBAOA827qNGhoatG3bNuXm5rZ8mdut3NxcFRUVtXvNiy++qJycHC1atEgZGRkaP3687r33XjU3N3f4PfX19fL7/VEvu7iZbQQAgONsCy9Hjx5Vc3OzMjIyoo5nZGTI5/O1e82ePXv0pz/9Sc3NzXrllVe0YsUKPfDAA/rZz37W4ffk5+crNTXVfGVnZ5/Q3yMS3UYAADivV802CgQCSk9P1+OPP67Jkyfr+uuv109+8hOtW7euw2uWL1+uqqoq83XgwAHb2seAXQAAnGfbmJdhw4bJ4/GovLw86nh5ebkyMzPbvSYrK0uJiYnyeDzmsfPOO08+n08NDQ1KSkpqc43X65XX6z2xje+A26y89MjXAQCAdthWeUlKStLkyZNVWFhoHgsEAiosLFROTk6711x66aX65JNPFIhIBx999JGysrLaDS49LbxIXYDKCwAAjrG12ygvL0/r16/X7373O+3atUsLFy5UTU2NOfto7ty5Wr58uXn+woULVVFRoSVLluijjz7Sxo0bde+992rRokV2NjNmbmYbAQDgOFunSl9//fU6cuSI7rrrLvl8Pl144YUqKCgwB/Hu379fbndLfsrOztZf/vIXLV26VBdccIFGjhypJUuW6Pbbb7ezmTGL3B7AMAxzryMAANBzXIZxcpUR/H6/UlNTVVVVpZSUlBP62ZW1Dbrw3zdJkj6552tK8PSq8c4AAPRZVp7fPH0tCA/Yleg6AgDAKYQXCzwR3UTMOAIAwBmEFws8VF4AAHAc4cUCd0TlhS0CAABwBuHFgojCC1sEAADgEMKLBZHdRixUBwCAMwgvFrhcLoV7jhjzAgCAMwgvFplbBDDbCAAARxBeLAqv9ULlBQAAZxBeLGqpvBBeAABwAuHFovCgXaZKAwDgDMKLRW4G7AIA4CjCi0XhygvdRgAAOIPwYlF4lV0qLwAAOIPwYpHbzVRpAACcRHixyJxtROUFAABHEF4sYrYRAADOIrxY5A7dMca8AADgDMKLRSxSBwCAswgvFrnpNgIAwFGEF4s8TJUGAMBRhBeLPEyVBgDAUYQXi1xUXgAAcBThxSJP6I6xzgsAAM4gvFjEbCMAAJxFeLGI2UYAADiL8GIR2wMAAOAswotFLZUXhxsCAMApivBiEeu8AADgLMKLRS3rvBBeAABwAuHFolDhhQG7AAA4hPBiUbjyQrcRAADOILxYFB7zYhBeAABwBOHFImYbAQDgLMKLRcw2AgDAWYQXi5htBACAswgvFrE9AAAAziK8WOQJTZVmewAAAJxBeLGIygsAAM7qkfCyZs0ajR49WsnJyZo2bZqKi4tjuu7ZZ5+Vy+XSddddZ28DLXAzYBcAAEfZHl42bNigvLw8rVy5UiUlJZo4caKmT5+uw4cPd3rdZ599pv/3//6fLr/8crubaIm5qzSVFwAAHGF7eHnwwQe1YMECzZ8/X+PGjdO6devUv39/PfHEEx1e09zcrNmzZ2vVqlU644wz7G6iJeFuI7ILAADOsDW8NDQ0aNu2bcrNzW35Qrdbubm5Kioq6vC6f//3f1d6erpuvvlmO5sXF0/ojjHmBQAAZyTY+eFHjx5Vc3OzMjIyoo5nZGToww8/bPeaN998U7/5zW+0Y8eOmL6jvr5e9fX15s9+vz/u9sbC7DZizAsAAI7oVbONqqurddNNN2n9+vUaNmxYTNfk5+crNTXVfGVnZ9vaRmYbAQDgLFsrL8OGDZPH41F5eXnU8fLycmVmZrY5/9NPP9Vnn32mmTNnmscCgeAmQgkJCdq9e7fOPPPMqGuWL1+uvLw882e/329rgGF7AAAAnGVreElKStLkyZNVWFhoTncOBAIqLCzU4sWL25w/duxYvf/++1HH7rzzTlVXV+vhhx9uN5R4vV55vV5b2t8etgcAAMBZtoYXScrLy9O8efM0ZcoUTZ06VQ899JBqamo0f/58SdLcuXM1cuRI5efnKzk5WePHj4+6Pi0tTZLaHHcKu0oDAOAs28PL9ddfryNHjuiuu+6Sz+fThRdeqIKCAnMQ7/79++V296qhN51ysz0AAACOsj28SNLixYvb7SaSpC1btnR67ZNPPnniG9QNzDYCAMBZfafk0Usw2wgAAGcRXiyi8gIAgLMILxZReQEAwFmEF4s8zDYCAMBRhBeL6DYCAMBZhBeL6DYCAMBZhBeLPKF1XtgeAAAAZxBeLHKzPQAAAI4ivFjkZswLAACOIrxYxGwjAACcRXixiNlGAAA4i/BiEbONAABwFuHFIk/ojlF5AQDAGYQXi8IDdqm8AADgDMKLRR66jQAAcBThxSIG7AIA4CzCi0Uuuo0AAHAU4cWicLcR2QUAAGcQXixithEAAM4ivFjEbCMAAJxFeLGI2UYAADiL8GIRs40AAHAW4cUitgcAAMBZhBeLmG0EAICzCC8WMWAXAABnEV4sChVeCC8AADiE8GJRuNvIYMAuAACOILxYZHYbEV4AAHAE4cWilnVeHG4IAACnKMKLRS2zjai8AADgBMKLRcw2AgDAWYQXi8zKC+EFAABHEF4s8jBgFwAARxFeLHKxzgsAAI4ivFjEgF0AAJxFeLGIvY0AAHAW4cUiZhsBAOAswotF4cqLxIwjAACcQHixKDzbSGLGEQAATkhwugF9jTsi7jUHDCV6gv8s3luhw9V1Sh+UrKljhkRVaAAAwInTI5WXNWvWaPTo0UpOTta0adNUXFzc4bnr16/X5ZdfrsGDB2vw4MHKzc3t9PyeFtVtZBgqKC3TZas3a9b6t7Xk2R2atf5tXbZ6swpKyxxsJQAAJy/bw8uGDRuUl5enlStXqqSkRBMnTtT06dN1+PDhds/fsmWLZs2apddee01FRUXKzs7W1VdfrYMHD9rd1Ji4I7qN/lLq08KnSlRWVRd1jq+qTgufKiHAAABgA5dh2DtwY9q0abr44ov12GOPSZICgYCys7P1/e9/X8uWLevy+ubmZg0ePFiPPfaY5s6d2+X5fr9fqampqqqqUkpKSrfb31pDU0Dn3PlnSVJGilfl/vp2z3NJykxN1pu3f4UuJAAAumDl+W1r5aWhoUHbtm1Tbm5uyxe63crNzVVRUVFMn1FbW6vGxkYNGTKk3ffr6+vl9/ujXnaKDCIdBRdJMiSVVdWpeG+Fre0BAOBUY2t4OXr0qJqbm5WRkRF1PCMjQz6fL6bPuP322zVixIioABQpPz9fqamp5is7O7vb7e6M1SLK4eq6rk8CAAAx69VTpe+77z49++yzev7555WcnNzuOcuXL1dVVZX5OnDggK1tcrlclgJM+qD22w0AAOJj61TpYcOGyePxqLy8POp4eXm5MjMzO732/vvv13333adXX31VF1xwQYfneb1eeb3eE9LeWHncLgWaDaUP8upIdb3aGzQUHvMydUz73V0AACA+tlZekpKSNHnyZBUWFprHAoGACgsLlZOT0+F1P//5z3X33XeroKBAU6ZMsbOJcQnPOFpy1dmSgkElUvjnlTPHMVgXAIATzPZuo7y8PK1fv16/+93vtGvXLi1cuFA1NTWaP3++JGnu3Llavny5ef7q1au1YsUKPfHEExo9erR8Pp98Pp+OHTtmd1NjFg4kl589XGvnTFJmanTXUGZqstbOmaQZ47OcaB4AACc121fYvf7663XkyBHddddd8vl8uvDCC1VQUGAO4t2/f7/cEcvWrl27Vg0NDfqnf/qnqM9ZuXKlfvrTn9rd3JiEtwhoNgzNGJ+lr47L1KX3bZbPX6cvnT1Mv50/lYoLAAA26ZHtARYvXqzFixe3+96WLVuifv7ss8/sb1A3ud3RO0t73C4zrAxMTiC4AABgo14926i3CmeTQMT6fvVNzZKkmvpmJ5oEAMApg/ASB0+ryosk1TcFJEnHGwgvAADYifASh/Bso8jKS0MovNQ2NjnSJgAAThWElziEKy+BYF6RYRhqaA6FFyovAADYivASB3fEbCNJamw2FC7C1DLmBQAAWxFe4tB6zEu46iJJtQ10GwEAYCfCSxzMbqNQuSU83kWSjjdSeQEAwE6ElziEp0qblZeI8NLYbKgxohIDAABOLMJLHFoG7LYNLxKDdgEAsBPhJQ6tB+yGF6gLY9wLAAD26ZHtAU42ZngJhMNL55WX5oCh4r0VOlxdp/RByZo6ZghbCAAAECfCSxzCwSM8Pbqh1RiXyFV2C0rLtOqlnSqrqjOPZaUma+XMcew6DQBAHOg2ikPrjRk7GvNSUFqmhU+VRAUXSfJV1WnhUyUqKC3rgdYCAHByIbzEwROebdTOVGlJqmloUnPA0KqXdspofbFkHlv10s6o/ZEAAEDXCC9xaD3bqPWYl+MNzSreW9Gm4hLJkFRWVafivRW2tRMAgJMRY17i0Hq2UXvdRo3NHQeXSIerYzsPAAAEUXmJQ9vtAaJnFx1vaFL6oOSYPivW8wAAQBDhJQ6dbQ8gSTUNzZo6ZoiyUpPV0YRol4KzjqaOGWJjSwEAOPkQXuLgMtd5Cf7c3jovHrdLK2eOa//60D9XzhzHei8AAFhEeIlDeLZRR9sDHA+tsDtjfJbWzpmk1H6JUe9npiZr7ZxJ5jovzQFDRZ9+rv/ZcVBFn37ODCQAADrBgN04tO426myF3Rnjs1RWVadVL+2UJH3/K2fpttxzzM9gETsAAKyh8hKHrmYbHW+1PUBNfcteR8MHeaOCC4vYAQBgDeElDm12lQ4NfvEmBG9nTauNGavrWn7+oqZRkljEDgCAOBFe4tB6e4D6xmB4Gdw/SVLbjRn9keGltkGSWMQOAIA4MeYlDh6z2yj4c3idl7T+ifL569p0G/nrGs0/V4bCS6yL0/mqjqvo08/ZkRoAgBDCSxzadBuFxryEZxW1rrxEdRvVBoNMrIvT3b1xlypqGsyfGcwLADjV0W0Uh44G7Kb1D4eX1mNe2lZeulrELiwyuEhtB/MyzRoAcKqh8hKHcK9Nc6sBux2NeWmv8hJexG7hUyWWvttQcJG7VS/tVCAg3b2RadYAgFMLlZc4tNlVujFceQmGl9ZjXiIrL+EBu1LLInatqy9DBiSqM+HBvP/2TOfTrKnKAABORlRe4uA2F6kL/hyuvJjdRo3NMgzD3EYgsvJSXdekpuaAEjzB3HjFuelR06UfnXWRmgKGlm7YEVfbwpWZZc+9r5++uFM+P1UZAMDJhcpLHDytxryEV9hNCw3YbQ4YZqBpag606UaqPN5SiTl6rD7qvRFp/ZSZ0r2dpg1JlbWNUcFFYrwMAODkQOUlDh3NNgpXXiSptr5Z3gRPVNVlQJJHNQ3Nqqxt0LCBXknS0WPRA3IP++t09fmZykpNlq+qrt1F7OJlZbxMc8BQ8d4KpmgDAHodwkscWs82Clde+iUlKCnBrYamgGobmzVYLV1GyYluDR/kVc3nteagXUk6Wh1defH56zodzOuSuhVoIsfLtBauzNzypTF68b2yTgcCdxVuCD8AALsQXuIQGq4SUXkJdgsledzqn+RRQ1PA3Fk6vEDdoOTE4IDez2ujpj+37jYKd/WEB/P+8A/vqSai2ykzNVkrrj1Pd2/cZUtlRpJ+9cbeNu+Fg83aOZMkqdPNJLvabJLgAwDoDsJLHFpvDxAe35KU4Fb/RI8q1WiOcwlXXlKSEzQ41K1UWdtxeCmPeODPGJ+lF7YfVMEH5ZKkgV6P3rz9K/K4XXK7XZanWXdH5EDgqtrGNqEpsmrz+Bt7O32/s6qOncGHUAQAJwfCSxw6WqTOm+BWvySPJKmmPhxeWiov4XVgorqNQmNeRqb108HK420G2UY+xI/VN6umoUkpyYmaMT5Lj954kRY/sz3q/MwUr+qaAu0GjO4KDwTu6D1JWv+/bYNL5PudVXXsDD5S59UiqXtdYYQqAOg5hJc4hGcbtR6w601wa4A3eEuPNwYrLuHKy6DkBHMdmMi1Xo6EKi/nj0jRwcrjKvdHV2IOVh6P+nn/57UaPzJVkjQuKyXqvX+8IEsP33CRNu302TJeJhbxTFiyO/jc2kGF6kR1hdl5rWRfaLLzs3truwCcHAgvcTC7jVoN2E1KcKtfYrDyEu42Co95SUlObOk2qmk7YPf8Ean6685ylfvrzDVi6hqbzcrMGcMGaM/RGh2oaAkve47URLWrpr5JHrfLHC+T94f3oqZpp6d4tfIfx9kyXuZEsDP4dHRtd7vCugpGdoaqzt6LpQvOqUDmVLvs7nbsi0HxZPydemu7TsbfyUmElziYlZfwInUR4aV/UnR4iaq8DGhbeTkaUXkJX1ddH+waOhSqugxI8mj8yFTtOVqjfRW15rV7jwbDS0aKV+X+en18+Jj53ozxWXryb5/p7b0V5rF7rhuv3HGZPT5epifEu0TNiegKs+ParkJVd0KTk4HMqXbZ3e3YF4Piyfg79dZ2nYy/k9OLnboMw7D9P8DXrFmjX/ziF/L5fJo4caIeffRRTZ06tcPz//jHP2rFihX67LPPdPbZZ2v16tW65pprYvouv9+v1NRUVVVVKSUlpesL4vDY5o91/18/0g0XZ+veb07QGXe8Iknadmeu7vqfD7Tx/TKt+vr5mnfJaN2zcafW/+9eLbh8jCZmp2nxM9s1dfQQ/eHWHEnSxFV/VdXxRv116Zf07bVvqbquSZuWfklnZwzS/358RDf9pljnZAzU9PMz9ejmT3TjtFG695sTJEnLn3tfvy/er5v+4XT919v7JEkfrJquAd4EGYahSXdv0he1jTo7faA+PnxMeV89Rz+46mxJ0iOFH+vBTR9F/V5Zqcn6+sSsdh8AYWn9EzsdT+N2xR8kcOJ09b9Dd/53svPanm5X+L8fOwo+nXW1xnKtnZ/t1LW0q+eu7c3tWjtn0gkPMFae37avsLthwwbl5eVp5cqVKikp0cSJEzV9+nQdPny43fPfeustzZo1SzfffLO2b9+u6667Ttddd51KS0vtbmrMImcbhWcaSZI30dMyYLeh9ZiXyAG7wcpLQ1NAVaHVdocN9Jor64YH7R78Ilh5GZnWT6OG9JcUHPMStudIsNIy+fTBGjYw+Nmfho4drq7XF7WN8rhduu6ikZKk0oNV5rXh7q1JowYryRP8fZ747sVafs04rZ0zSQmtyoLJiW6tmzNJ931rQqf/0i+4fEyH960rvaASedLo6iHenYBp57U93S4j9OoosHdVIevqWjs/26lraVfPXdub27Xsv9/X3z456tjK7LaHlwcffFALFizQ/PnzNW7cOK1bt079+/fXE0880e75Dz/8sGbMmKEf/ehHOu+883T33Xdr0qRJeuyxx+xuaswitwcIj3eRguu8DAiFl+PtTJUOr8Abnm0UXu/F43YprV+iMlND4SVUogt3G42IDC/tdBuNGTZAZ6UPlCR9XB4MLzvL/JKCY2Umnz5YkvTBIb957Y7/q5Qk5Y5L1+TThwSPHQgeu/SsYea/kPNyTpcU7Lqafn6mZozP0g0XZ7e5JynJCVo7Z5KWXzNOpw/t3+b9rNRk/euXOg42BB84qTt//XZ1rZ2f7dS1tKvnru2t7ao83qjZv96qy1ZvNrec6Um2hpeGhgZt27ZNubm5LV/odis3N1dFRUXtXlNUVBR1viRNnz69w/Pr6+vl9/ujXnaL3B6gvqllQGyix6V+ScFhRK0H7EZWXiprG2QYhjneZeiAJLndLmWEKi/locrL/4XCy8jB/XT60AGSgrOPGpsDqq5r1OHQYN8xwwfo7PRBkmSOe/mwrFqSNDYrReNC42kOVh43A9N7oaBy4WlpZrjZtu8L85+GpFFD+usn145TcqJbn9c0mp/9eegzrr84W9ddOEKSdMFpqZoxPkvl/jrtC1WHfjl7kgaFZl/lf3OCll8zTtdOaFtmTHC7tHbOJP14xnlKSW47DCu1X6KtwSccODv7/HiRqQCczFrvmddTbA0vR48eVXNzszIyMqKOZ2RkyOfztXuNz+ezdH5+fr5SU1PNV3Z226rAidayzkv0YF2Xy9XpgN1weGkKGDpW32ROkw7vc5SREvxneLp0ZLdR+iCvkhLcag4YKqus02dHa81rU5ITdU5GuPISDC0f+oIhbmzmIKUkJ2p0qBrywaEqHT1Wr//74rhcLmn8aamadHqaJKlkfzC8vPNZcJDvxaOHKCnBrYtHByszRZ9+rsbmgN7+9HNJ0uxpo7ToyrMkScWffaHjDc3a/GGwO3BidpqumZClf5wYDDebdgUX2vv4cLB9C798pu771gQluF1qChgaM2ygij79XP66JqX2S9B//ctU/eMFWaH7kqRxI1I1pp2KjiTNGJ+h4YPa38zSJekHXzlT52UNavd9SVErGLfHqf/yAYDeLvx33KqXdvZoF1Kf31V6+fLlqqqqMl8HDhyw/TvDXRSBgBG1xoukiPDSdnuAfkke87zK2kZzmvSwQcHQ0nrMy6GqlvDidrvMrqN9FTXaczRYBTljWLAic1YHlZfwQ/v80PTq0oN+/T3UZXTm8IFKSU7URdnBysueIzWqqGlQcWiG0rQxwdDyD2cMlSS99elRvXegUtX1TUrrn6jzR6TqrPSBGpnWTw1NARXtOarCUEjJHZsuSbr6/GAQ3fj3Mv3q9U/1UfkxJbilW684UzdMHaUrQ+et3fKJHi4MDiC+ZkKWLj9nuC49a5gk6aPyGi15dof2hio68y45XQ/fcKH+IdS+P5eW62cbd0mSkjwuLc09Ww/+80QN9HpkSHpk86faFbofg5ITdNXY4e3/DwsAsMxQcEHV4ojZrXazNbwMGzZMHo9H5eXlUcfLy8uVmZnZ7jWZmZmWzvd6vUpJSYl62c3TzoDdlvAS3W0UWXmRFDVoN7yGS3iwbWS3UbjCIgW7jSS1hJfPa801Xs4YHgwvZ4cqLwe+qFXV8UZz4O7YzOD9GD8iFF4OVem9A8GBuxecFjw2eECSzgx9ztt7PjffvzgUDi45Mxhetu6t0BsfHZEUHBfjcbvkcrl0xbnBMPCfb32m10PvX3FuMJQcq2uUS8H+0fw/fxi6f24VfXo06nd6YcchvfNZsPLz1w/Klf/KTt3x3Pvt3v//fGufdh6qipoGHtbQbOihVz/Wbp9fx+rbVlSq65pU+OGRdj83zM5uIrqRAJysDlfXdX3SCWJreElKStLkyZNVWFhoHgsEAiosLFROTk671+Tk5ESdL0mbNm3q8HwnRC5SV98Y6jbyRFdeWgbstixSJwWDghQctBse8zI81G0UOWD3cHWdmgKGEtwupYe6RMIP+gMVtVGDdaVg99GQAUkyDOmvH/jUFDCUkpygrNBnjh8ZDDEfHKzSe6HKy4XZaebvFB738tu/7VVDc0DDB3nNrqYJI1M1IMmjytpGPfG3vZKkS0OBJvJ32/LRUTU2B8uGC/7rXeW/slM/+P2ONl0n9U0BLXyqRPmv7NQTb+5tc38/r2nQrzqZrm0ouH5KR7p6vyu9dfAdAPRm6R1039vB9kXq8vLyNG/ePE2ZMkVTp07VQw89pJqaGs2fP1+SNHfuXI0cOVL5+fmSpCVLlujLX/6yHnjgAV177bV69tln9e677+rxxx+3u6kxC882MgwjalNGSeZU6dqGJjU2B1QXCjcp/cKVl5bNGY+2GvMS7jY6eqzenBKdmZpsVnoiKy/hbQPOGD7QbNdZ6QNVvLdCL/09OHBqbFaKXKG2nh+qvHz2ea0+D1V8Jp6WZl47adRg/eHd/zOrH2cOG6CAIXlc0qu7ytUU6ssMVzP+49WPNSQUxNa9/mmbe+Srqmt3Of+wcMCI92Fu55RbnPy62iqjO1tp2Hltb21Xd67tre3qzrWnWrtcCj6rpoaq9T3B9jEv119/ve6//37ddddduvDCC7Vjxw4VFBSYg3L379+vsrKWUcqXXHKJnnnmGT3++OOaOHGi/vSnP+mFF17Q+PHj7W5qzKLWeWmKDi+RA3bDXUaSNNDbqtuoJiK8DAoeGzrQK4/bpYAhszoyMq2f+RnhKcj7KmrNNV7ClRdJOjs0XfpvnwS7ZM7LbBmkOmRAkkaEqjDV9U1KcLvMrqZweyO9vbdCl63erPxXdmrhUyVRU8Kl4LYGtz5VomXPvW9bAMGJ43bF32XV1bV2fnZ3r239viv0uuVLY8w/W32/O599MrarO9f21nZ159pTtV0rZ47r0W0DemTA7uLFi7Vv3z7V19dr69atmjZtmvneli1b9OSTT0ad/53vfEe7d+9WfX29SktLY15dt6d42plt5E0Ihpbo8NJoHksIdStFrvVytDo85iVYefG4XWYXUsm+Skkt412klsrLR+XVqmlolidiEK8kc9xKeMT3ORHhpaC0zJziLAVnPF31wOsqKC1TQWmZ7n55Z5vfsyxUPelskaOOltbvy3rjg96l4L878f7FE55KfqKvtfOzu9uuf/3SGLMrNiwzNdlcj2jtnElxvb9uziStc+Da3toufifaZcdqu13pke0BelJPbA/wwvaDum3DDl121jDN+YfTdetT2zT59MH674WXaFeZX197+H81bKBXv/3uxZr52JvKSPFq6x3BtWvu/8tuPfbaJ5qXc7pe/nswUPx5yeU6L7RD9DfW/E3vHajU8EFeHamu1/e/cpZ+ePW5kqS6xmaNXVFgtmP00P7a8qMrJQXDyR3Pl5rruEjB9WPu+WawYrXwqZIOl4hO65/Y50KI2yUZRsdlzK7el9qWQcMPwfCy2GrnfaOdP8d6bXc/286NGrtzbW/ee+Vk3QyvN7aL34l2dZeV5zfhJQ4vvndIP/j9duWcMVQ3TM3Wkmd3KOeMofr9Lf+gfZ/X6Mu/2KIBSR6tnztFN/56q85KH6hX874sSfr1/+7Rzzbu0rUXZOmV98tkGFLxT64yBzr963+9q7980DLb6r5vTdANU0eZP0+791VzHZgrzx2u386fqoLSsj4ZTuwKGLG+3xc36ZNOvb8Q++qutwCssfL8ZlfpOERuD9B6zIs5YLexOWKNl5bbHB7zsudIjQxDcrmkIaFjUsug3bDIbiNJGjW4vxle+iV61NAU0KqXdvbqrp2OAsiCy4MBo7OA0jpgZEY8yC8aNbjNg97K+z+ecV6HD70Z47P01XGZHb7f2XtdXdudz5aC3Ys5EbO9InX2np3X9uZ2ATj5EF7iELVIXQfrvBiGdCQ0q2dQaCqxJA0eEPxzeB2WIf2TzPEwkpTRqj9xRMSA3YLSMpVG7E/0SqlPb+e/qooaZ8KJS1JqaJdpyZ4A0p2A0dX7ffVBDwCnOsJLHCLXeWlTeUls2SfncGil3Mj9etJCVZbwdeHBumEZrebJh2cbddQ11FPBpaPqyH3fmiCpbVfHiQogdoYEAEDfRHiJQ7jbKHJ7gHB48bhdSk50q64xYG6wGFV5iegiklqmSYelD2oJMynJCUr0BPcz6qhrqLtORPVE6ryrg4ABADiRCC9xMHeVNmSufxLuNpKCXUd1jQ3yhcampESNeUlUpMjKS0Fpme58odT82V/XpMtWb9YNF2dHBQcrYgkn3a2eSAQQAEDPIbzEod1F6iLGrYS7jsqrwpWXltuckpwot6tlgbZweOmoW8hXVaf/ePXjuNppJZxI3aueAADQUwgvcTC7jSK2B/BGjHUJL1RXXt2228jtdim1X6K+CFVChg30dtotZKWraMiApKh1XqyEE4mAAgDoGwgvcXCHiiwdVV76h7YCCE9Rjqy8SMFxLy3hJUnFeyvi7haSghWWzNRkvf6jK7Vt3xeEEwDASY3wEofIdV7qm4J7AiVFjnmJqMJILbsuh6VFjHsZNshraRvxjmb9rJw5TkkJbsIJAOCk1yN7G51szAG7AcMcsBsVXpKiw0vryktav5bwUlZ5vM106Y4szT2n1+wrAQCAU6i8xMHVzgq7kbON+rUJLy1hpaC0TEV7Ksyf73i+VJkpXqWFZgS1N8Yl3C20+CtnafFXzmIpdADAKY3wEoeWyovarPMidVx56WhGUbm/vstN+SK3G6drCABwKqPbKA7mmJeI7QGiBuwmRWfClOTELmcUuRQcC5ORQrcQAACdofISh/Bso4BhqL6x68rLwOSELmcUGQrOTnr65klyu110CwEA0AHCSxxaVthtuzGjFB1eBiR55AmFkVgcranXNy4ceQJbCwDAyYVuozhEdRuZA3ZbAku/iG6jlNDMovRWGy52JNbzAAA4VRFe4tDu9gAdVF7Cg3WnjhmirNRkddQB5JKUlRrsJgIAAB0jvMShZXsAtQzY7TC8BCsvHrdLK2eOk6Q2Aaa9GUUAAKB9hJc4eCIqL/WNoRV2O5htFLlA3YzxWVo7ZxILzQEA0A0M2I1DqPASXKTO3Jix88pL2IzxWV1ukAgAADpGeIlDu9sDeNpfYbf11gDh61loDgCA+NBtFAdPO9sDRI55GRA526hV5QUAAHQP4SUO4dlGhqF2N2aMXPPli9oGNQfaW1cXAADEg/ASh3DlJZLXE+wqKigt0z//qsg8vuGdA7ps9WYVlJb1WPsAADiZEV7i4G5ncK030W1uvHi4uj7qPV9VnRY+VUKAAQDgBCC8xKG9mUEel6vTjRcladVLO+lCAgCgmwgvcWjdbZTgdundfV90ufFiWVWdivdW2Nw6AABOboSXOLhb3bWkBHfMGy/Geh4AAGgf4SUO7laVF2+Cm40XAQDoIYSXOLTuNkpKcLPxIgAAPYTwEofWs42SEtxsvAgAQA8hvMQpMoSEtwZg40UAAOzH3kZx8rhcag5Ngk5KaNnLiI0XAQCwF+ElTm63pObgnyO3A5DYeBEAADvRbRSnyEG7SQncRgAAegpP3ThFDtptXXkBAAD24akbp/YG7AIAAPvx1I1T5EJ13kRuIwAAPcW2p25FRYVmz56tlJQUpaWl6eabb9axY8c6Pf/73/++zj33XPXr10+jRo3SD37wA1VVVdnVxG6JDC9UXgAA6Dm2PXVnz56tDz74QJs2bdLLL7+sN954Q7fcckuH5x86dEiHDh3S/fffr9LSUj355JMqKCjQzTffbFcTuyUyrzBgFwCAnmPLVOldu3apoKBA77zzjqZMmSJJevTRR3XNNdfo/vvv14gRI9pcM378eP33f/+3+fOZZ56pe+65R3PmzFFTU5MSEnrXrG5mGwEA4AxbnrpFRUVKS0szg4sk5ebmyu12a+vWrTF/TlVVlVJSUjoNLvX19fL7/VGvnuCOGrDr6eRMAABwItkSXnw+n9LT06OOJSQkaMiQIfL5fDF9xtGjR3X33Xd32tUkSfn5+UpNTTVf2dnZcbfbisjZRgzYBQCg51h66i5btkwul6vT14cfftjtRvn9fl177bUaN26cfvrTn3Z67vLly1VVVWW+Dhw40O3vj4WHAbsAADjC0kCSH/7wh/rud7/b6TlnnHGGMjMzdfjw4ajjTU1NqqioUGZmZqfXV1dXa8aMGRo0aJCef/55JSYmdnq+1+uV1+uNqf0nUlS3EWNeAADoMZbCy/DhwzV8+PAuz8vJyVFlZaW2bdumyZMnS5I2b96sQCCgadOmdXid3+/X9OnT5fV69eKLLyo5ObnDc50Wuc8iK+wCANBzbHnqnnfeeZoxY4YWLFig4uJi/e1vf9PixYt1ww03mDONDh48qLFjx6q4uFhSMLhcffXVqqmp0W9+8xv5/X75fD75fD41Nzfb0cxuiVqkjvACAECPsW3+8dNPP63Fixfrqquuktvt1re//W098sgj5vuNjY3avXu3amtrJUklJSXmTKSzzjor6rP27t2r0aNH29XUuHjoNgIAwBG2hZchQ4bomWee6fD90aNHyzAM8+crrrgi6ufejvACAIAzeOrGKXp7ANZ5AQCgpxBe4kTlBQAAZ/DUjZOHAbsAADiCp26c3GzMCACAI3jqxoluIwAAnMFTN05utgcAAMARPHXjFBlektmYEQCAHsNTN05R3UZMlQYAoMcQXuIU1W3EmBcAAHoMT904eZhtBACAI3jqxonZRgAAOIOnbpzYVRoAAGfw1I1TuPLickkJEVUYAABgL8JLnMLbAyR53HK5CC8AAPQUwkucwoGF8S4AAPQsnrxxCs828iawxgsAAD2J8BKn8JgXBusCANCzePLGyU23EQAAjuDJG6dw5YVNGQEA6Fk8eeNE5QUAAGfw5I0TY14AAHAGT944hZd2qTreqKJPP1dzwHC2QQAAnCIIL3EoKC3T77fulyR9fPiYZq1/W5et3qyC0jKHWwYAwMmP8GJRQWmZFj5VopqG5qjjvqo6LXyqhAADAIDNCC8WNAcMrXppp9rrIAofW/XSTrqQAACwEeHFguK9FSqrquvwfUNSWVWdivdW9FyjAAA4xRBeLDhc3XFwiec8AABgHeHFgvRBySf0PAAAYB3hxYKpY4YoKzVZrg7ed0nKSk3W1DFDerJZAACcUggvFnjcLq2cOU6S2gSY8M8rZ44zF7ADAAAnHuHFohnjs7R2ziRlpkZ3DWWmJmvtnEmaMT7LoZYBAHBqSHC6AX3RjPFZ+uq4TBXvrdDh6jqlDwp2FVFxAQDAfoSXOHncLuWcOdTpZgAAcMqh2wgAAPQphBcAANCnEF4AAECfQngBAAB9CuEFAAD0KYQXAADQp9gWXioqKjR79mylpKQoLS1NN998s44dOxbTtYZh6Gtf+5pcLpdeeOEFu5oIAAD6INvCy+zZs/XBBx9o06ZNevnll/XGG2/olltuienahx56SC4XC74BAIC2bFmkbteuXSooKNA777yjKVOmSJIeffRRXXPNNbr//vs1YsSIDq/dsWOHHnjgAb377rvKymKpfQAAEM2W8FJUVKS0tDQzuEhSbm6u3G63tm7dqm9+85vtXldbW6sbb7xRa9asUWZmZkzfVV9fr/r6evPnqqoqSZLf7+/GbwAAAHpS+LltGEaX59oSXnw+n9LT06O/KCFBQ4YMkc/n6/C6pUuX6pJLLtE3vvGNmL8rPz9fq1atanM8Ozs79gYDAIBeobq6WqmpqZ2eYym8LFu2TKtXr+70nF27dln5SNOLL76ozZs3a/v27ZauW758ufLy8syfA4GAKioqNHTo0BM+bsbv9ys7O1sHDhxQSkrKCf3skxH3K3bcK2u4X9Zwv6zhfsXuRN4rwzBUXV3d6dCSMEvh5Yc//KG++93vdnrOGWecoczMTB0+fDjqeFNTkyoqKjrsDtq8ebM+/fRTpaWlRR3/9re/rcsvv1xbtmxp9zqv1yuv1xt1rPVnnGgpKSn8C20B9yt23CtruF/WcL+s4X7F7kTdq64qLmGWwsvw4cM1fPjwLs/LyclRZWWltm3bpsmTJ0sKhpNAIKBp06a1e82yZcv0ve99L+rYhAkT9B//8R+aOXOmlWYCAICTmC1jXs477zzNmDFDCxYs0Lp169TY2KjFixfrhhtuMMtBBw8e1FVXXaX//M//1NSpU5WZmdluVWbUqFEaM2aMHc0EAAB9kG3rvDz99NMaO3asrrrqKl1zzTW67LLL9Pjjj5vvNzY2avfu3aqtrbWrCSec1+vVypUr23RToX3cr9hxr6zhflnD/bKG+xU7p+6Vy4hlThIAAEAvwd5GAACgTyG8AACAPoXwAgAA+hTCCwAA6FMILzFas2aNRo8ereTkZE2bNk3FxcVON6lXyM/P18UXX6xBgwYpPT1d1113nXbv3h11Tl1dnRYtWqShQ4dq4MCB+va3v63y8nKHWtx73HfffXK5XLrtttvMY9yraAcPHtScOXM0dOhQ9evXTxMmTNC7775rvm8Yhu666y5lZWWpX79+ys3N1ccff+xgi53T3NysFStWaMyYMerXr5/OPPNM3X333VH7xJzK9+uNN97QzJkzNWLECLlcLr3wwgtR78dybyoqKjR79mylpKQoLS1NN998s44dO9aDv0XP6ex+NTY26vbbb9eECRM0YMAAjRgxQnPnztWhQ4eiPsPO+0V4icGGDRuUl5enlStXqqSkRBMnTtT06dPbrCJ8Knr99de1aNEivf3229q0aZMaGxt19dVXq6amxjxn6dKleumll/THP/5Rr7/+ug4dOqRvfetbDrbaee+8845+9atf6YILLog6zr1q8cUXX+jSSy9VYmKi/vznP2vnzp164IEHNHjwYPOcn//853rkkUe0bt06bd26VQMGDND06dNVV1fnYMudsXr1aq1du1aPPfaYdu3apdWrV+vnP/+5Hn30UfOcU/l+1dTUaOLEiVqzZk2778dyb2bPnq0PPvhAmzZt0ssvv6w33nhDt9xyS0/9Cj2qs/tVW1urkpISrVixQiUlJXruuee0e/duff3rX486z9b7ZaBLU6dONRYtWmT+3NzcbIwYMcLIz893sFW90+HDhw1Jxuuvv24YhmFUVlYaiYmJxh//+EfznF27dhmSjKKiIqea6ajq6mrj7LPPNjZt2mR8+ctfNpYsWWIYBveqtdtvv9247LLLOnw/EAgYmZmZxi9+8QvzWGVlpeH1eo3f//73PdHEXuXaa681/uVf/iXq2Le+9S1j9uzZhmFwvyJJMp5//nnz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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "def f(n: int):\n", + " return (-1)**(n) * (1/(2*n + 1))\n", + "\n", + "summ = 0\n", + "xi = []\n", + "for i in range(120):\n", + " fi = f(i)\n", + " summ += 4 * fi\n", + " #t = (fi, 0) if fi > 0 else (0, fi)\n", + " xi += [fi]\n", + "\n", + "xi = np.array(xi)\n", + "print(summ, xi.shape)\n", + "\n", + "plt.plot(xi, '-o')\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1. , 0. , 0.2 , 0. , 0.11111111,\n", + " 0. , 0.07692308, 0. , 0.05882353, 0. ,\n", + " 0.04761905, 0. , 0.04 , 0. , 0.03448276,\n", + " 0. , 0.03030303, 0. , 0.02702703, 0. ,\n", + " 0.02439024, 0. , 0.02222222, 0. , 0.02040816,\n", + " 0. , 0.01886792, 0. , 0.01754386, 0. ,\n", + " 0.01639344, 0. , 0.01538462, 0. , 0.01449275,\n", + " 0. , 0.01369863, 0. , 0.01298701, 0. ,\n", + " 0.01234568, 0. , 0.01176471, 0. , 0.01123596,\n", + " 0. , 0.01075269, 0. , 0.01030928, 0. ,\n", + " 0.00990099, 0. , 0.00952381, 0. , 0.00917431,\n", + " 0. , 0.00884956, 0. , 0.00854701, 0. ,\n", + " 0.00826446, 0. , 0.008 , 0. , 0.00775194,\n", + " 0. , 0.0075188 , 0. , 0.00729927, 0. ,\n", + " 0.0070922 , 0. , 0.00689655, 0. , 0.00671141,\n", + " 0. , 0.00653595, 0. , 0.00636943, 0. ,\n", + " 0.00621118, 0. , 0.00606061, 0. , 0.00591716,\n", + " 0. , 0.00578035, 0. , 0.00564972, 0. ,\n", + " 0.00552486, 0. , 0.00540541, 0. , 0.00529101,\n", + " 0. , 0.00518135, 0. , 0.00507614, 0. ,\n", + " 0.00497512, 0. , 0.00487805, 0. , 0.00478469,\n", + " 0. , 0.00469484, 0. , 0.00460829, 0. ,\n", + " 0.00452489, 0. , 0.00444444, 0. , 0.00436681,\n", + " 0. , 0.00429185, 0. , 0.00421941, 0. ])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xi[0]" + ] + }, { "cell_type": "code", "execution_count": null, @@ -324,7 +650,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.1" + "version": "3.12.5" } }, "nbformat": 4,