Jekyll2023-10-12T15:01:30+00:00https://jenshemelaer.com/atom.xmlJens HemelaerJens Hemelaerjens.hemelaer@uantwerpen.beThe Collatz topos2023-07-26T00:00:00+00:002023-07-26T00:00:00+00:00https://jenshemelaer.com/2023/07/26/collatz-topos<p>The topos-theoretic formula in the previous blogpost can be very practical in concrete calculations.
Here is a fun example featuring the Collatz conjecture. To be clear, the ideas in this blog post will not help in solving the Collatz conjecture. But the example might help to gain intuition about toposes.</p>
<h2 id="the-collatz-conjecture">The Collatz conjecture</h2>
<p>Starting with a nonzero natural number \(n\), we follow this particular process: if \(n\) is even, we replace \(n\) with \(n/2\); if \(n\) is odd, we replace it with \(3n + 1\). The question is now: do we eventually reach \(1\)? Thanks to computer calculations, we now know at least that the answer is yes for all numbers with at most 20 digits. Once you reach \(1\), you are stuck in the cycle \(1,4,2,1,4,2,1,4,2,\dots\) The Collatz conjecture famously says that we eventually reach \(1\) for all starting values.</p>
<p>The Collatz conjecture is due to Lothar Collatz, who called it the \((3n+1)\)-conjecture. In a <a href="http://www.cecm.sfu.ca/organics/papers/lagarias/paper/goodies/ubersetzung/html/ubersetzung.html">1980 letter to Mays</a>, Collatz mentions that he first thought about the problem in the early 1930’s. However, his first own article about the problem only appeared in the 1980’s, when his conjecture was already widely known. In this article, Collatz writes:</p>
<blockquote>
<p>Since I could not solve the problem, I have not published the conjecture. I have mentioned the problem at many meetings and in many talks. In 1952, when I came to Hamburg, I explained the problem to my colleague Prof. Dr. Helmut Hasse. He was also interested in it. He has explained it in talks in other cities.</p>
</blockquote>
<p>The paper is called “On the Motivation and Origin of the \((3n+1)\)-problem”, and appears as part of the book “The Ultimate Challenge: The \(3x+1\) Problem”, with Lagarias as editor. I believe that the writing style with rather short sentences is a result of the translation history of the paper: it was first translated to Chinese (probably from German), then back to German, and then to English. I enjoyed reading the paper (it is only 5 pages, including pictures).</p>
<p>Another quote:</p>
<blockquote>
<p>I have experimented with many numbers. Before 1950 computers were not as well-developed as they are today. Therefore I could not try any large numbers.</p>
</blockquote>
<p>Part of the appeal of the Collatz conjecture is that a counterexample would be extremely large (at least 21 digits), but this was not known yet in in the 1950’s when the problem became popular. With computers becoming more programmable and more powerful, the numbers up to 2 billion were checked by 1981 (now 40 years later, it took my laptop 1 hour to check the first 2 billion numbers, using Python code without any tricky optimizations).</p>
<h2 id="the-collatz-mathbbn-set">The Collatz \(\mathbb{N}\)-set</h2>
<p>The process described above is a discrete dynamical system, that we can model as a set \(X\) together with an action of the monoid \(\mathbb{N}\) of natural numbers under addition. First we take \(X\) to be the set of nonzero natural numbers. Now we define the function \(f\) as</p>
\[f(n) = \begin{cases} n/2 & \text{if }n \text{ is even}; \\ 3n+1 & \text{if }n \text{ is odd.}\end{cases}\]
<p>and then we define \(n\cdot x\) to be the element that you get by starting with \(x \in X\) and then applying \(f\) precisely \(n\) times.</p>
<p>We can draw (part of) the Cayley graph of the \(\mathbb{N}\)-set \(X\) as:</p>
<p><img src="/images/collatz-spiral.png" alt="Cayley graph of the Collatz function for starting values smaller than 10" /></p>
<p>This is the standard way of associating a graph to the function \(f\). The Collatz conjecture equivalently says that this Cayley graph is connected.</p>
<p>Collatz was originally looking for a simple arithmetic function \(f\) that has an interesting Cayley graph containing a loop. So his original problem was solved: we don’t know how many loops there are, but there is at least one.</p>
<h2 id="the-collatz-topos">The Collatz topos</h2>
<p>If \(\mathbb{N}\) is the monoid of natural numbers under addition, then the category of \(\mathbb{N}\)-sets is a topos, namely the topos of presheaves \(\mathbf{PSh}(\mathbb{N})\) where we think of \(\mathbb{N}\) as a category with one object. We can also think of this as the topos of discrete dynamical systems.</p>
<p>For the \(\mathbb{N}\)-set \(X\) as above, we could then define the Collatz topos as the slice topos \(\mathbf{PSh}(\mathbb{N})/X\). Alternatively, this is the topos of presheaves \(\mathbf{PSh}(\int_\mathbb{N} X)\) where \(\int_\mathbb{N} X\) is the category with as objects the elements of \(X\), and as morphisms \(x \to y\) the elements \(n \in \mathbb{N}\) such that \(x = y\cdot n\).</p>
<p>In this way, we can represent this dynamical system in a geometric way. This is very similar to the Cayley graph construction above.
Similar to how the Cayley graph is a disjoint union of connected components, the Collatz topos is also a disjoint union of connected components, and the Collatz conjecture holds precisely if the topos is <a href="https://ncatlab.org/nlab/show/connected+topos">connected</a>.</p>
<h2 id="isnt-this-a-bit-pointless">Isn’t this a bit pointless?</h2>
<p>Yes, building this “Collatz topos” is pointless, if your goal is proving the Collatz conjecture. Topos theory has a history of providing useful insights in mathematical problems, but in this case it is unlikely (maybe even impossible) that the construction of this Collatz topos will be of any help. On the other hand, when learning about toposes, this Collatz topos could be a fun example.</p>
<p>Unrelatedly, there is the concept of point of a topos. In this mathematical sense, the Collatz topos is the complete opposite of pointless: it has <a href="https://ncatlab.org/nlab/show/point+of+a+topos#of_toposes_with_enough_points">enough points</a>.</p>
<p>Points are geometric morphisms from \(\mathbf{Sets}\) to our topos. To compute these, we can look at the formula</p>
\[\mathbf{Geom}(\mathcal{F},\mathcal{E}/X) ~\simeq~ \int^{f \in \mathbf{Geom}(\mathcal{F},\mathcal{E})} \mathrm{Hom}_{\mathcal{F}}(1,f^*(X)).\]
<p>In our case, we get</p>
\[\mathbf{Geom}(\mathbf{Sets},\mathbf{PSh}(\mathbb{N})/X) ~\simeq~ \int^{f \in \mathbf{Geom}(\mathbf{Sets},\mathbf{PSh}(\mathbb{N}))} \mathrm{Hom}_{\mathbf{Sets}}(1,f^*(X)) ~\simeq~ \int^{f \in \mathbf{Geom}(\mathbf{Sets},\mathbf{PSh}(\mathbb{N}))} f^*(X).\]
<p>If the notation doesn’t make any sense, you can have a look at the part about the Yoneda notation in the previous post.</p>
<p>All that remains now is to determine \(f^*(X)\) for every \(f\) in \(\mathbf{Geom}(\mathbf{Sets},\mathbf{PSh}(\mathbb{N}))\). Here some work needs to be done, and I’ll just mention the end result of the calculations.</p>
<p>Up to isomorphism, the points of the Collatz topos are given as follows:</p>
<ul>
<li>there is a point for each natural number \(n\), corresponding to a “state” in the Collatz sequence;</li>
<li>there is a “point at infinity” for every connected component in the Cayley graph.</li>
</ul>
<p>The points corresponding to a natural number do not have nontrivial automorphisms. For the points corresponding to connected components, it depends on whether or not the connected component ends in a loop. If it does, then the automorphism group is isomorphic to the group of integers; if not, then the automorphism group is trivial.</p>Jens Hemelaerjens.hemelaer@uantwerpen.beThe topos-theoretic formula in the previous blogpost can be very practical in concrete calculations. Here is a fun example featuring the Collatz conjecture. To be clear, the ideas in this blog post will not help in solving the Collatz conjecture. But the example might help to gain intuition about toposes.Geometric morphisms to slice toposes2021-07-27T00:00:00+00:002021-07-27T00:00:00+00:00https://jenshemelaer.com/2021/07/27/geometric-morphisms-to-slice-toposes<p>One of the main results about sheaves on a topological space \(X\) is that they correspond to étale spaces over \(X\), so to local homeomorphisms \(Y \to X\). This can be turned into an equivalence of categories between the category of sheaves on \(X\) and the category of local homeomorphisms \(Y \to X.\) The generalization of this statement to toposes (rather than topological spaces) is well-known among topos theorists, but it took me a really long time to find this statement in the literature. It turns out the result was in SGA4… I could have seen this coming.</p>
<p><img src="/images/bures-sur-yvette.jpg" alt="Bures-sur-Yvette" /></p>
<p>The result from SGA4 is much more general (no surprises here) and gives a method of determining the geometric morphisms \(\mathcal{F} \to \mathcal{E}/X\) in terms of geometric morphisms \(\mathcal{F} \to \mathcal{E}\). Here \(\mathcal{E}/X\) denotes the <a href="https://ncatlab.org/nlab/show/over-topos">slice topos</a> over the object \(X\) in \(\mathcal{E}\). It’s a really interesting result, and with this blogpost, I will try to make it a bit more well-known.</p>
<p>After stating the result in full detail, we will see how to make sense of the result using Yoneda’s notation for discrete opfibrations. Then we derive from the SGA4 result the correspondence between sheaves and local homeomorphisms, for arbitrary toposes (this is left as an exercise in SGA4, because all the hard work is in the more general result).</p>
<p>A detailed proof of the SGA4 result is given in the accompanying pdf <a href="/slice-toposes.pdf">here</a>. The method is the same as in SGA4.</p>
<p>While writing this blog post, I was influenced and encouraged by interesting discussions about this with Morgan Rogers and Steve Vickers. I also would like to mention the <a href="https://arxiv.org/abs/2107.04417v1">recent paper</a> by Caramello and Zanfa, which features a short proof of the correspondence between sheaves and local homeomorphisms over a Grothendieck topos (see Lemma 6.1.2), and puts it in a much wider context.</p>
<p>EDIT (November 2021): The result from SGA4 that I discuss here also appears as Lemma 4.59 in the paper <a href="https://arxiv.org/abs/1906.08737">“Denseness conditions, morphisms and equivalences of toposes”</a> (2020) by Olivia Caramello. So the result from SGA4 has some applications in recent topos theory literature. It is very likely that I first read the result in Caramello’s paper, but then forgot about it until I found it in SGA4.</p>
<h2 id="statement-in-sga4">Statement in SGA4</h2>
<p>The statement in SGA4 says that the geometric morphisms \(g : \mathcal{F} \to \mathcal{E}/X\) correspond to the pairs \((f,a)\) where \(f : \mathcal{F} \to \mathcal{E}\) is a geometric morphism and \(a : 1 \to f^*(X)\) is a global element of \(f^*(X)\).</p>
<p><img src="/images/diagram-slice.png" alt="Geometric morphism to the slice topos is a pair (f,a)" /></p>
<p>Further, suppose that \(g,g' : \mathcal{F} \to \mathcal{E}/X\) are two geometric morphisms corresponding to the pairs \((f,a)\) respectively \((f',a')\). Then the geometric transformations \(g \to g'\) correspond to the natural transformations \(\eta : f^* \to (f')^*\) such that \(\eta_X \circ a = a'\).</p>
<p><img src="/images/diagram-geometric-transformation-slice.png" alt="Commuting triangle for geometric transformation" /></p>
<p>Here we use the convention that a geometric morphism \(g \to g'\) is a natural transformation \(g^* \to (g')^*\). Nowadays, this is the standard convention, but unfortunately SGA4 uses the opposite convention that a morphism \(g \to g'\) is a natural transformation \(g_* \to (g')_*\) or equivalently a natural transformation \((g')^* \to g^*\).</p>
<p>Before I forget, I should give the full reference: the general result I am referring to is SGA4, Tome 1, Exposé IV, Proposition 5.12. The description of geometric morphisms \(\mathcal{E}/Y \to \mathcal{E}/X\) over \(\mathcal{E}\) is a special case; so it is left as Exercise 5.14 in the same section. SGA4 has multiple authors; this particular Exposé is attributed to Grothendieck and Verdier. The relevant part of SGA4 was pointed out to me by the reference section of the <a href="https://ncatlab.org/nlab/show/over-topos">nLab page on slice toposes</a>.</p>
<p>I think one of the reasons why I didn’t find the relevant section in SGA4 earlier, is that I typically used the non-searchable scans. From now on, I want to use the searchable pdf versions, put together by Laszlo (<a href="http://www.math.polytechnique.fr/~laszlo/sga4/SGA4-1/sga41.pdf">Tome 1</a>, <a href="http://www.math.polytechnique.fr/~laszlo/sga4/SGA4-2/sga42.pdf">Tome 2</a>, <a href="http://www.math.polytechnique.fr/~laszlo/sga4/SGA4-3/sga43.pdf">Tome 3</a>). An overview of Grothendieck’s writings is made on Carmona’s website <a href="https://agrothendieck.github.io/">Thèmes pour une Harmonie</a>.</p>
<h2 id="yonedas-notation-and-discrete-opfibrations">Yoneda’s notation and discrete opfibrations</h2>
<p>I spelled out the result in detail above, but in order to make it easy to remember we have to “condense” the result in simpler but more abstract terms. Then the result is this:</p>
<p>\(\mathbf{Geom}(\mathcal{F},\mathcal{E}/X) ~\simeq~ \int^{f \in \mathbf{Geom}(\mathcal{F},\mathcal{E})} \mathrm{Hom}_\mathcal{F}(1,f^*(X)).\)</p>
<p>Here \(\mathbf{Geom}(\mathcal{T},\mathcal{T}')\) denotes the category of geometric morphisms from \(\mathcal{T}\) to \(\mathcal{T'}\) (and geometric transformations between them), for any two toposes \(\mathcal{T}\) and \(\mathcal{T}'\).</p>
<p>The idea behind the notation with integral sign is to look at the projection functor \(\xi : \mathbf{Geom}(\mathcal{F},\mathcal{E}/X) \to \mathbf{Geom}(\mathcal{F},\mathcal{E})\) given by composition with the projection \(\mathcal{E}/X \to \mathcal{E}\). Then the SGA4 result mentioned above says that \(\xi\) is a discrete opfibration on \(\mathbf{Geom}(\mathcal{F},\mathcal{E})\); more precisely, it is the discrete opfibration corresponding to the functor \(\mathbf{Geom}(\mathcal{F},\mathcal{E}) \to \mathbf{Sets}\) that sends \(f\) to \(\mathrm{Hom}_{\mathcal{F}}(1,f^*(X))\).</p>
<p>The notation with integral signs for discrete (op)fibrations is <a href="https://mathoverflow.net/a/188536/">due to Yoneda</a>. For a functor \(F : \mathcal{C} \to \mathbf{Sets}\), there are two possible notations for the discrete opfibration associated to \(F\), namely \(\int^{c \in \mathcal{C}} F(c)\) or the shorter \(\int^\mathcal{C} F\). The result above is a good example of a situation where the longer notation (with a “variable”) makes things clearer.</p>
<p><img src="/images/gare-du-nord-1959.jpg" alt="Gare du Nord, 1959" /></p>
<p><em>Above: Gare du Nord in the fifties, where <a href="http://www.neverendingbooks.org/le-lemme-de-la-gare-du-nord">the Yoneda Lemma was born</a>.</em></p>
<p>Spelled out, \(\int^{c \in \mathcal{C}} F(c)\) is the category with</p>
<ul>
<li>as objects the pairs \((c,a)\) with \(c\) an object in \(\mathcal{C}\) and \(a \in F(c)\) an element;</li>
<li>as morphisms \((c,a) \to (c',a')\) the morphisms \(h : c \to c'\) in \(\mathcal{C}\) such that \(F(h)(a) = a'\).</li>
</ul>
<p>Sometimes, the notation \(\int F\) is used, but this is ambiguous. There is a dual notation \(\int_\mathcal{D} G\) to denote the discrete <em>fibration</em> associated to a <em>contravariant</em> functor \(G : \mathcal{D}^\mathrm{op} \to \mathbf{Sets}\). So when you see \(\int F\) it can mean both \(\int^\mathcal{C} F\) or \(\int_{\mathcal{C}^\mathrm{op}} F\), and these are different (the morphisms go in opposite directions).</p>
<h2 id="morphisms-between-slice-toposes">Morphisms between slice toposes</h2>
<p>As a special case of the result above, we can look at geometric morphisms between two slice toposes (which is the result I was originally interested in).</p>
<p>Let \(\mathcal{E}\) be a (Grothendieck) topos and let \(X\) and \(Y\) be objects in \(\mathcal{E}\). We consider the slice toposes \(\mathcal{E}/X\) and \(\mathcal{E}/Y\), and we write \(x : \mathcal{E}/X \to \mathcal{E}\) respectively \(y : \mathcal{E}/Y \to \mathcal{E}\) for the projection geometric morphisms.</p>
<p><img src="/images/slice-geometric-morphism.png" alt="Geometric morphism between slice categories" /></p>
<p>For every \(\phi : X \to Y\) in \(\mathcal{E}\) there is a corresponding induced geometric morphism \(f: \mathcal{E}/X \to \mathcal{E}/Y\) such that \(y \circ f \simeq x\). This is the geometric morphism with inverse image functor \(f^*\) given by pullback along \(\phi : X \to Y\).</p>
<p>The question is now: if \(f : \mathcal{E}/X \to \mathcal{E}/Y\) is a geometric morphism with \(y \circ f \simeq x\), then is it always induced by some map \(\phi : X \to Y\) in \(\mathcal{E}\) ? The answer turns out to be yes!</p>
<p>Why is this important? The reason is that, by definition, local homeomorphisms with codomain \(\mathcal{E}\) are precisely the geometric morphisms of the form \(\mathcal{E}/X \to \mathcal{E}\) for some object \(X\) in \(\mathcal{E}\). So by definition, “sheaves” (i.e. objects of \(\mathcal{E}\)) correspond to local homeomorphisms to \(\mathcal{E}\). But if we want to turn this into an equivalence of categories, we need that morphisms \(\phi : X \to Y\) in \(\mathcal{E}\) correspond precisely to the geometric morphisms \(\mathcal{E}/X \to \mathcal{E}/Y\) over \(\mathcal{E}\).</p>
<p>In the special case where \(\mathcal{E} = \mathbf{Sh}(L)\) for some topological space or locale \(L\), we know that the local homeomorphisms with codomain \(\mathbf{Sh}(L)\) are precisely the geometric morphisms \(\mathbf{Sh}(L') \to \mathbf{Sh}(L)\) induced by local homeomorphisms \(L' \to L.\) Starting from this, the equivalence of categories between sheaves on \(\mathbf{Sh}(L)\) and local homeomorphisms to \(L\) then follows from the general correspondence between geometric morphisms \(\mathcal{E}/X \to \mathcal{E}/Y\) over \(\mathcal{E}\) and maps \(X \to Y\) in \(\mathcal{E}.\)</p>
<h2 id="morphisms-between-slice-toposes-proof">Morphisms between slice toposes: proof</h2>
<p>To prove the correspondence, we use the result from SGA4 and some general results about discrete opfibrations.</p>
<p>We saw that \(\mathbf{Geom}(\mathcal{E}/X, \mathcal{E}/Y) ~\simeq~ \int^{h \in \mathbf{Geom}(\mathcal{E}/X,\mathcal{E})} \mathrm{Hom}_{\mathcal{E}/X}(1,h^*(X))\). I changed the “variable” to \(h\) rather than \(f\) because we are already using \(f\) to denote a map \(\mathcal{E}/X \to \mathcal{E}/Y\).</p>
<p>We are interested in the category \(\mathbf{Geom}_\mathcal{E}(\mathcal{E}/X,\mathcal{E}/Y)\) consisting of the geometric morphisms \(f : \mathcal{E}/X \to \mathcal{E}/Y\) such that \(y \circ f \simeq x\), and as morphisms the geometric transformations \(\eta : f \to f'\) such that \(y \circ \eta\) is the identity geometric transformation from \(x\) to itself.</p>
<p>In the terminology from discrete opfibrations, \(\mathbf{Geom}_\mathcal{E}(\mathcal{E}/X,\mathcal{E}/Y)\) is precisely the <em>fiber</em> of the discrete opfibration</p>
\[\mathbf{Geom}(\mathcal{E}/X, \mathcal{E}/Y) \longrightarrow \mathbf{Geom}(\mathcal{E}/X, \mathcal{E})\]
<p>above the geometric morphism \(x : \mathcal{E}/X \to \mathcal{E}\). Now we can use a general procedure. For a discrete opfibration \(\int^{c \in \mathcal{C}} F(c)\), the fiber above an object \(c_0\) of \(\mathcal{C}\) is precisely given by \(F(c_0)\). More precisely, the objects of the fiber are the elements of \(F(c_0)\), and there are no morphisms (other than the identity morphisms). This means that the fibers are all discrete categories, as the name ‘discrete opfibration’ suggests.</p>
<p>If we apply this to our case, we see that the fiber \(\mathbf{Geom}_\mathcal{E}(\mathcal{E}/X,\mathcal{E}/Y)\) is the discrete category corresponding to the set \(\mathrm{Hom}_{\mathcal{E}/X}(1,x^*(Y))\). The functor \(x^*\) has a left adjoint \(x_!\), so we compute</p>
\[\mathbf{Geom}_\mathcal{E}(\mathcal{E}/X,\mathcal{E}/Y) ~\simeq~ \mathrm{Hom}_{\mathcal{E}/X}(1,x^*(Y)) ~\simeq~ \mathrm{Hom}_\mathcal{E}(x_!(1),Y).\]
<p>The functor \(x_!\) sends an object \(\alpha : A \to X\) of \(\mathcal{E}/X\) to the object \(A\) of \(\mathcal{E}\). The terminal object \(1\) in \(\mathcal{E}/X\) is given by the identity \(X \to X\), so we see that \(x_!(1) \simeq X\). In this way, we find:</p>
\[\mathrm{Hom}_\mathcal{E}(x_!(1),Y) ~\simeq~ \mathrm{Hom}_\mathcal{E}(X,Y).\]
<p>We conclude that:</p>
\[\mathbf{Geom}_\mathcal{E}(\mathcal{E}/X,\mathcal{E}/Y) ~\simeq~ \mathrm{Hom}_\mathcal{E}(X,Y).\]
<p><img src="/images/morphisms-over-E-as-fiber.png" alt="Morphisms over the base as a fiber" /></p>
<p>So geometric morphisms \(f : \mathcal{E}/X \to \mathcal{E}/Y\) over \(\mathcal{E}\) correspond precisely to the maps \(X \to Y\) in \(\mathcal{E}\). Further, we also get a lot of information about the geometric transformations. Suppose that \(f, f' : \mathcal{E}/X \to \mathcal{E}/Y\) are two geometric morphisms over \(\mathcal{E}\), corresponding to the maps \(\phi, \phi' : X \to Y\) in \(\mathcal{E}\). Then there is at most one geometric transformation \(\eta : f \to f'\) such that \(y \circ f\) is the identity geometric transformation on \(x\). This geometric transformation is always an isomorphism, and it exists if and only if \(\phi = \phi'\).</p>
<p>A direct proof is also possible, see e.g. the recent paper here by Caramello and Zanfa. There the equivalence \(\mathbf{Geom}_\mathcal{E}(\mathcal{E}/X,\mathcal{E}/Y) \simeq \mathrm{Hom}_\mathcal{E}(X,Y)\) appears as Lemma 6.1.2. The underlying idea of the proof is similar to the proof of the more general statement in SGA4.</p>
<h2 id="the-situation-for-infty1-toposes">The situation for \((\infty,1)\)-toposes</h2>
<p>With \(\mathbf{Topos}_\mathcal{E}^\text{ét}\) we denote the 2-category with as objects the toposes of the form \(\mathcal{E}/X\) (equipped with their projection geometric morphism to \(\mathcal{E}\)), as morphisms the geometric morphisms over \(\mathcal{E}\), and as 2-morphisms the geometric transformations \(f \to f'\) relative over \(\mathcal{E}\), i.e. geometric transformations such that after postcomposing with the projection you get the identity geometric transformation.</p>
<p>Then we can summarize the result proved in the previous section as \(\mathbf{Topos}_\mathcal{E}^\text{ét} \simeq \mathcal{E}\). In particular, \(\mathbf{Topos}_\mathcal{E}^\text{ét}\) is equivalent to a 1-category, so there are essentially no nontrivial 2-morphisms.</p>
<p>A similar equivalence \(\mathbf{Topos}^\text{ét}_\mathcal{E} \simeq \mathcal{E}\) appears for \((\infty,1)\)-toposes in Lurie’s <a href="https://arxiv.org/abs/math/0608040v4">“Higher Topos Theory”</a> (Remark 6.3.5.10). In <a href="https://arxiv.org/abs/1312.2204v3">“Higher Orbifolds and Deligne-Mumford Stacks as Structured Infinity-Topoi”</a> (Corollary 3.2.1) Lurie’s result is used by Carchedi to show that the result holds for \(n\)-toposes for arbitrary \(n\), in particular for (1-)toposes.</p>
<p>I thought for some time that this proof via higher toposes was the only one that appears in detail in the literature, and I mentioned this <a href="https://youtu.be/1GI7HLX_ed0?t=421">during my talk</a> at Toposes Online. This is before I noticed the proof in SGA4, and before Caramello and Zanfa put their manuscript on the arXiv.</p>Jens Hemelaerjens.hemelaer@uantwerpen.beOne of the main results about sheaves on a topological space \(X\) is that they correspond to étale spaces over \(X\), so to local homeomorphisms \(Y \to X\). This can be turned into an equivalence of categories between the category of sheaves on \(X\) and the category of local homeomorphisms \(Y \to X.\) The generalization of this statement to toposes (rather than topological spaces) is well-known among topos theorists, but it took me a really long time to find this statement in the literature. It turns out the result was in SGA4… I could have seen this coming.Topos fundamental group of the shrinking wedge of circles2020-12-08T00:00:00+00:002020-12-08T00:00:00+00:00https://jenshemelaer.com/2020/12/08/topos-fundamental-group-swoc<p>In September, I wrote about the <a href="https://jhemelae.github.io/2020/09/10/fundamental-group-topos.html">fundamental group of a topos</a>, but I didn’t yet give an example of how to compute this fundamental group for toposes of the form \(\mathbf{Sh}(X)\) for \(X\) a topological space. If \(X\) is a CW-complex, then the fundamental group of \(\mathbf{Sh}(X)\) agrees with the (discrete) group \(\pi_1(X)\). On the other hand, if \(X\) is the shrinking wedge of circles, then the fundamental group of \(\mathbf{Sh}(X)\) is not discrete, so this is an interesting example to look at.</p>
<p>Note: I have changed the terminology in this blogpost from “Hawaiian earring” to “shrinking wedge of circles”, following Hawaiian mathematicians and others who spoke out against the harmful terminology.</p>
<p>Before starting the computation…</p>
<h2 id="can-the-fundamental-group-of-mathbfshx-be-mathrmgalbarmathbbqmathbbq">Can the fundamental group of \(\mathbf{Sh}(X)\) be \(\mathrm{Gal}(\bar{\mathbb{Q}}/\mathbb{Q})\)?</h2>
<p>I now (almost) know the solution to one of the questions that I had earlier. The question was: given a profinite group \(G\), can we find a connected, locally connected topological space \(X\) such that \(G\) is the fundamental group of \(\mathbf{Sh}(X)\)? Here \(X\) cannot be a “nice” space like a CW-complex, otherwise the fundamental group of \(\mathbf{Sh}(X)\) is the discrete group \(\pi_1(X)\).</p>
<p>A solution is given by Brazas in <a href="https://arxiv.org/abs/1009.3972">“The fundamental group as a topological group”</a>, Theorem 4.10. There it is shown that <em>any</em> topological group arises as \(\pi_1^\tau(X)\) of some topological space \(X\), where \(\pi_1^\tau(X)\) is \(\pi_1(X)\) equipped with a natural topology related to the compact-open topology on the space of loops.</p>
<p>If \(X\) is connected, locally connected, we can recover the fundamental group of \(\mathbf{Sh}(X)\) from \(\pi_1^\tau(X)\). The underlying group is \(\pi_1(X)\), and the basic open subsets are cosets of open <em>normal</em> subgroups in \(\pi_1^\tau(X)\). The fundamental group of a topos is only determined up to Morita equivalence though, so there can be non-isomorphic topological groups that both qualify as fundamental group for \(\mathbf{Sh}(X)\).</p>
<p>Back to the question… Suppose that \(G\) is a profinite group. Take a space \(X\) such that \(\pi_1^\tau(X) = G\). Because \(G\) is profinite, the open sets are already unions of cosets of open normal subgroups. So \(G\) is the fundamental group of \(\mathbf{Sh}(X)\).</p>
<p>There’s a small caveat here. For topos-theoretic purposes, the space \(X\) should be locally connected, which is not necessarily the case if applying Theorem 4.10 of <a href="https://arxiv.org/abs/1009.3972">“The fundamental group as a topological group”</a>. But probably the argument can be modified to make sure that \(X\) is locally connected. Another way around this is to define fundamental groups for toposes that are not necessarily locally connected, but I don’t know yet if/why that makes sense.</p>
<p>I am thankful to Jeremy Brazas (<a href="https://twitter.com/jtbrazas">@jtbrazas</a>) for helping me understand his paper. If you want to know more about this, I can also recommend his paper <a href="https://arxiv.org/abs/1108.3021">“Semicoverings: a generalization of covering space theory”</a> and his blog <a href="https://wildtopology.wordpress.com/">Wild Topology</a>.</p>
<h2 id="covering-spaces-of-the-shrinking-wedge-of-circles">Covering spaces of the shrinking wedge of circles</h2>
<p>Now, let’s have a look at how to compute the fundamental group of \(\mathbf{Sh}(X)\), for \(X\) the shrinking wedge of circles. We will do this by explicitly classifying the covering spaces of \(X\). Then we will construct a topological group \(G\) such that the connected covering spaces of \(X\) correspond to the transitive group actions of \(G\). It follows that \(G\) is the fundamental group of \(\mathbf{Sh}(X)\).</p>
<p>The fundamental group of \(\mathbf{Sh}(X)\) is not determined up to isomorphism, but only up to Morita equivalence. As described above, you could equivalently find a fundamental group of \(\mathbf{Sh}(X)\) by equipping \(\pi_1(X)\) with a suitable topology. But if \(X\) is the shrinking wedge of circles, then \(\pi_1(X)\) is uncountable. On the other hand, the fundamental group of \(\mathbf{Sh}(X)\) that we will construct below is countable. Conclusion: if two topological groups are Morita equivalent, this doesn’t mean that they have the same cardinality.</p>
<p>Here is the shrinking wedge of circles:</p>
<p><img src="/images/swoc.png" alt="shrinking wedge of circles" /></p>
<p>It is the union of infinitely many circles: for each nonzero natural number \(n\), it contains a circle of radius \(\tfrac{1}{n}\) that goes through the origin. The topology is the subspace topology from \(\mathbb{R}^2\).</p>
<p>Suppose that \(\pi : Y \to X\) is a covering space, with \(X\) the shrinking wedge of circles. Then there is some open covering \(\{U_i\}_{i \in I}\) of \(X\), such that for each \(i \in I\) the map \(\pi^{-1}(U_i) \to U_i\) is a trivial covering space. Here “trivial covering space” means that \(\pi^{-1}(U_i) = \bigsqcup_{j \in S} U_i\) for some index set \(S\), and that the projection \(\pi^{-1}(U_i)\) is the identity on each component.</p>
<p><img src="/images/trivial-covering.png" alt="Trivial covering space" /></p>
<p>One of these open sets \(U_i\) above must contain the origin. But then it contains everyting within some distance \(\varepsilon\) from the origin, so it contains all circles of the shrinking wedge of circles, except maybe finitely many of them.</p>
<p>This part \(U_i\) of the shrinking wedge of circles, close to the origin and containing almost all circles, is the most difficult part… and we now know that nothing interesting happens with this part, in the sense that \(\pi^{-1}(U_i) \to U_i\) is a trivial covering space. So we can ignore this part, and pretend that the shrinking wedge of circles is just a union of finitely many circles.</p>
<p><img src="/images/wedge-of-circles.png" alt="Rose with 4 petals" /></p>
<p>This subspace consisting of finitely many circles is called a <a href="https://en.wikipedia.org/wiki/Rose_(topology)">rose</a>, and each circle is called a petal (so the image above is the rose with four petals). Because a rose is a semilocally simply connected space, we know that the covering spaces correspond to sets with an action of the fundamental group. This means that if \(R\) is the rose with \(n\) petals, then to reconstruct a covering map \(\pi : Q \to R\) we only need to remember the fiber \(F= \pi^{-1}(x_0)\), where \(x_0\) is the center of the rose, and the action of \(\pi_1(R)\) on \(F\).</p>
<p><img src="/images/roses.png" alt="Rose with 5 petals" /></p>
<p>In our case, \(\pi_1(R)\) is the free group on \(n\) variables. So a covering space is equivalently a set \(F\), together with for each \(i \in \{1,\dots,n\}\) an automorphism \(\alpha_i : F \to F\). Each \(\alpha_i\) corresponds to a loop \(\gamma_i\) that goes around exactly one petal.</p>
<p>If one of the automorphisms \(\alpha_i\) is the identity, then this means that nothing happens with the corresponding loop \(\gamma_i\). In other words, the restriction to \(\gamma_i\) of the covering map \(\pi : Q \to R\), given by \(\pi^{-1}(\gamma_i) \to \gamma_i\), is a trivial covering map.</p>
<p>If this is the case, then we can ignore \(\gamma_i\), just like how we ignored most petals/circles for the shrinking wedge of circles.</p>
<p>We can go in the other direction as well. Each covering space for the rose with \(n\) petals gives a covering space for the rose with \(n+1\) petals. It’s just that nothing happens with the \((n+1)\)-th petal. In terms of the set \(F\) with action of the fundamental group, we have that the permutation \(\alpha_{n+1} : F \to F\) is trivial.</p>
<p>Going back to the shrinking wedge of circles \(X\), this means that a covering space \(\pi : Y \to X\) is given by a set \(F\) together with infinitely many automorphisms/permutations \(\alpha_1, \alpha_2, \alpha_3, \dots\) of \(F\), one for each circle, with the special property that only finitely many of these automorphisms are nontrivial.</p>
<h2 id="topos-fundamental-group-of-the-shrinking-wedge-of-circles">Topos fundamental group of the shrinking wedge of circles</h2>
<p>We now know that a covering space of the shrinking wedge of circles corresponds to a set \(F\) with infinitely permutations \(\alpha_1,\alpha_2,\alpha_3,\dots\) such that only finitely many of them are nontrivial.</p>
<p>The fundamental group \(G\) of the associated topos will have as underlying group the free group on infinitely many generators \(\gamma_1, \gamma_2, \gamma_3, \dots\) Further, we need to equip \(G\) with a topology with the special property that a transitive action of \(G\) on a set \(F\) is continuous if and only if only finitely many \(\gamma_i\)’s act nontrivially.</p>
<p>Let’s try to construct such a topology. We define a subset \(U \subseteq G\) to be open if and only if it has the following property: for all \(h \in U\), there is some natural number \(N\) such that \(h\gamma_n \in U\) and \(h\gamma_n^{-1}\in U\) for all \(n \geq N.\) It is not so difficult to check that this satisfies the axioms for a topology. With some more work, you can check that the topology is compatible with the group structure.</p>
<p>With this topology, a subgroup is open if and only if it contains all elements \(\gamma_n\), except maybe finitely many of them. So the transitive group actions are precisely the ones such that almost all elements \(\gamma_n\) act trivially.</p>
<p>So the topological group \(G\) that we constructed is the fundamental group of \(\mathbf{Sh}(X)\) , the topos of sheaves on the shrinking wedge of circles. In particular, there is a (connected) geometric morphism \(\mathbf{Sh}(X) \longrightarrow \mathbf{Cont}(G)\) to the topos of continuous \(G\)-sets. The inverse image functor sends a set with transitive, continuous \(G\)-action to its corresponding covering space of the shrinking wedge of circles.</p>Jens Hemelaerjens.hemelaer@uantwerpen.beIn September, I wrote about the fundamental group of a topos, but I didn’t yet give an example of how to compute this fundamental group for toposes of the form \(\mathbf{Sh}(X)\) for \(X\) a topological space. If \(X\) is a CW-complex, then the fundamental group of \(\mathbf{Sh}(X)\) agrees with the (discrete) group \(\pi_1(X)\). On the other hand, if \(X\) is the shrinking wedge of circles, then the fundamental group of \(\mathbf{Sh}(X)\) is not discrete, so this is an interesting example to look at.Cayley graphs of torus knot groups2020-09-18T00:00:00+00:002020-09-18T00:00:00+00:00https://jenshemelaer.com/2020/09/18/cayley-graphs-knot-groups<p>Knot groups are the groups that appear as fundamental groups of \(\mathbb{R}^3-K\) where \(K \subseteq \mathbb{R}^3\) is a knot. At the moment, I am most interested in the case where \(K\) is the trefoil knot, because in this case the knot group is isomorphic to the <a href="https://en.wikipedia.org/wiki/Braid_group">braid group</a> on 3 strands. I want to show some pictures of the <a href="https://en.wikipedia.org/wiki/Cayley_graph">Cayley graphs</a> for knot groups, and share the <a href="https://mybinder.org/v2/gh/jhemelae/notebooks/master?filepath=cayley-graphs-knot-groups.ipynb">Python code</a> that I used to generate them.</p>
<p>Here is a picture of the trefoil knot:</p>
<p><img src="/images/trefoil-left.png" alt="Left-handed trefoil knot" /></p>
<p>Sometimes it makes sense to distinguish this trefoil knot from its mirror image below:</p>
<p><img src="/images/trefoil-right.png" alt="Right-handed trefoil knot" /></p>
<p>But up to homeomorphism \(\mathbb{R}^3-K\) is independent of whether you take \(K\) to be the left-handed or right-handed version of the trefoil knot. So the knot group \(\pi_1(\mathbb{R}^3-K)\) is also independent of this choice, which is why for our purposes the two trefoil knots are the same.</p>
<h2 id="torus-knots">Torus knots</h2>
<p>The algorithm for drawing the Cayley graphs works not only for the trefoil knot, but more generally for torus knots.</p>
<p><img src="/images/torus-knot-3-8.png" alt="(3-8)-torus knot" /></p>
<p>If \(n\) and \(m\) are two coprime natural numbers, then the \((n,m)\)-torus knot is the knot that you get by winding a string around a donut, in such a way that you go through the donut hole \(n\) times, while at the same time circling <em>around</em> the hole \(m\) times. In symbols, you take the map \(S^1 \to S^1 \times S^1,~ z \mapsto (z^n, z^m)\) and then you embed \(S^1 \times S^1\) into \(\mathbb{R}^3\) in the standard way.</p>
<p>For example, the trefoil knot is the \((3,2)\)-torus knot.</p>
<p>If \(K\) is an \((n,m)\)-torus knot, then you can show that the knot group \(\pi_1(\mathbb{R}^3-K)\) has two generators, say \(x\) and \(y\), with one relation between the generators: \(x^n = y^m\). This is shown in Hatcher’s <a href="https://pi.math.cornell.edu/~hatcher/AT/AT.pdf">Algebraic Topology</a>, Example 1.24. For the special case of the trefoil knot, you can look at the references <a href="https://math.stackexchange.com/q/1774198">here</a>.</p>
<h2 id="cayley-graph-for-the-trefoil-knot-group">Cayley graph for the trefoil knot group</h2>
<p>Now some pictures of the Cayley graphs of knot groups.</p>
<p>First we look at the trefoil knot group:</p>
<p><img src="/images/cayley23f.png" alt="Cayley graph of the trefoil knot group" /></p>
<p>The elements of the group that are pictured are the ones that can be written as a word with the letters \(x\) and \(y\) and of length at most 5. The elements for which you need \(x^{-1}\) or \(y^{-1}\) are ignored.</p>
<p>Each time you multiply by \(x\) or \(y\), you follow one of the “spirals” upstairs. If you choose \(x\), then you follow an arc of angle \(120^\circ\) until you arrive at the next element of the group. If you choose \(y\), then you follow an arc of angle \(180^\circ\) to get to the next element.</p>
<p><img src="/images/spiral-staircase.png" alt="Spiral staircase" /></p>
<p>If my description is not too confusing, you should be able to see the relation \(x^3 = y^2\) in the Cayley graph.</p>
<p>Here is a picture of the same Cayley graph, as seen from above:</p>
<p><img src="/images/cayley23b.png" alt="Cayley graph of the trefoil knot group from above" /></p>
<p>Each of the circles corresponds to a spiral staircase that keeps going up, corresponding to a sequence \(g\), \(gx\), \(gx^2\), \(gx^3\), \(gx^4\), \(\dots\) or a sequence \(g\), \(gy\), \(gy^2\), \(gy^3\), \(gy^4\), \(\dots\) in the Cayley graph.</p>
<h2 id="cayley-graphs-for-torus-knot-groups">Cayley graphs for torus knot groups</h2>
<p>Seen from above, the Cayley graphs of the \((n,m)\)-torus knot group always look a bit similar. Here are the Cayley graphs for \((n,m) = (4,3)\) and \((n,m)=(7,5)\), from above.</p>
<p><img src="/images/cayley34b.png" alt="Cayley graph of the (4,3)-torus knot group from above" /></p>
<p><img src="/images/cayley57b.png" alt="Cayley graph of the (7,5)-torus knot group from above" /></p>
<p>The Cayley graphs seem to get more complicated as \(n\) and \(m\) get larger. For example, here is the Cayley graph \((n,m) = (7,5)\), seen from the front.</p>
<p><img src="/images/cayley57f.png" alt="Cayley graph of the (7,5)-torus knot group" /></p>
<h2 id="references">References</h2>
<p>The idea to construct the Cayley graphs in this way is from Hatcher’s <a href="https://pi.math.cornell.edu/~hatcher/AT/AT.pdf">Algebraic Topology</a>, Example 1.35. But my original motivation to try to draw the Cayley graph comes from <a href="https://math.stackexchange.com/q/3580213">this StackExchange question</a>. There the “OP” draws the Cayley graph of the 3-strand braid group, in a very clear and beautiful way. The question is whether the drawing is correct (unanswered at the moment). The 3-strand braid group \(\langle a,b : aba = bab \rangle\) is isomorphic to the trefoil knot group via the substitutions \(x = ab\) and \(y = aba\).</p>
<h2 id="python-code">Python code</h2>
<p>You can view, edit and run the Python code <a href="https://mybinder.org/v2/gh/jhemelae/notebooks/master?filepath=cayley-graphs-knot-groups.ipynb">here</a>.</p>
<p>If this does not work, you can also download the code <a href="/cayley-graphs-knot-groups-code.ipynb">here</a>, and run it using your own installation of Jupyter notebook with Python 3.</p>
<p>To get the Cayley graph for the \((n,m)\)-torus knot group, set <code class="language-plaintext highlighter-rouge">N_x</code> to \(n\) and <code class="language-plaintext highlighter-rouge">N_y</code> to \(m\), or vice versa. Aside from <code class="language-plaintext highlighter-rouge">N_x</code> and <code class="language-plaintext highlighter-rouge">N_y</code> the most important parameter is <code class="language-plaintext highlighter-rouge">depth</code>. The number of arrows that are drawn is equal to \(2^{\mathtt{depth}+1}\). With my laptop and my patience, <code class="language-plaintext highlighter-rouge">depth=10</code> is the maximum.</p>Jens Hemelaerjens.hemelaer@uantwerpen.beKnot groups are the groups that appear as fundamental groups of \(\mathbb{R}^3-K\) where \(K \subseteq \mathbb{R}^3\) is a knot. At the moment, I am most interested in the case where \(K\) is the trefoil knot, because in this case the knot group is isomorphic to the braid group on 3 strands. I want to show some pictures of the Cayley graphs for knot groups, and share the Python code that I used to generate them.The fundamental group of a topos2020-09-10T00:00:00+00:002020-09-10T00:00:00+00:00https://jenshemelaer.com/2020/09/10/fundamental-group-topos<p>This is a follow-up post of the <a href="https://jhemelae.github.io/2020/09/09/fundamental-group-monoid.html">one yesterday</a> about the fundamental group of a monoid. There we looked at the covering spaces of the free monoid on two generators, and covering spaces of categories in general. From there it is a small(ish) step towards defining covering spaces of toposes, which in turn can be used to make sense of what the fundamental group of a topos should be.</p>
<p>The idea is that toposes are a common “playground” for many geometrical concepts. In order to study a scheme we can look at its étale topos, or to study a topological space we can look at the topos of local homeomorphisms to it. Defining a fundamental group for general toposes means that you can talk about fundamental groups in very different settings, and you can start comparing situations that were otherwise completely foreign to each other (I try to give a concrete example at the end).</p>
<h2 id="covering-spaces-of-a-topos">Covering spaces of a topos</h2>
<p>A topos is a category satisfying some technical axioms. Fortunately, you don’t need these axioms in order to do computations with toposes, for example if you want to compute the fundamental group of a topos.</p>
<p>Every topos has a terminal object \(1\) which means that for every object \(E\) in the topos there is a unique morphism \(E \to 1\). The idea is that \(1\) is the “base space” and each morphism \(E \to 1\) can be interpreted as a local homeomorphism to the base space. For example, if \(X\) is a topological space, then the local homeomorphisms \(Y \to X\) form a topos, and the terminal object is the trivial local homeomorphism \(X \to X\) (the “base space”).</p>
<p><img src="/images/sheaves.png" alt="Sheaves" /></p>
<p>What is a covering space of a topos? Can we just pretend it is an ordinary category and compute the covering spaces in this sense?</p>
<p>This doesn’t work: if a category \(\mathcal{C}\) has a terminal object, then its fundamental groupoid is equivalent to the trivial group. So all discrete fibrations are of the form \(\mathcal{D} \to \mathcal{C}\) where \(\mathcal{D}\) is the disjoint union of some copies of \(\mathcal{C}\).</p>
<p>To get a meaningful notion of fundamental group for a topos, we need to take into account the “canonical Grothendieck topology” on the topos, as follows. We say that a family of morphisms \(\{f_i: E_i \to E\}_{i \in I}\) <em>covers</em> the target \(E\) if and only if \(\bigcup_{i \in I} f_i(E_i)=E\). The axioms for toposes make sure that this expression makes sense.</p>
<p>The definition of a covering space of a topos \(\mathcal{E}\) is now as follows. It is a discrete fibration \(\pi : \mathcal{E'} \to \mathcal{E}\) which is a covering space of categories <em>locally</em>. More precisely, we need that there is a full subcategory \(\mathcal{U} \subseteq \mathcal{E}\) such that:</p>
<ul>
<li>all objects in \(\mathcal{E}\) can be covered by objects in \(\mathcal{U}\), and</li>
<li>each \(f : X \to X'\) in \(\mathcal{U}\) and object \(Y'\) in \(\mathcal{E}'\) with \(\pi(Y') = X'\), there is a unique \(\tilde{f} : Y'' \to Y'\) with \(\pi(\tilde{f}) = f\).</li>
</ul>
<p>In fact, if \(\mathcal{U} \subseteq \mathcal{E}\) is a full subcategory such that every object of \(\mathcal{E}\) is covered by the objects in \(\mathcal{U}\), then any covering space of categories \(\mathcal{U}' \to \mathcal{U}\) extends to a covering space of toposes \(\mathcal{E}' \to \mathcal{E}\).</p>
<p>Why is the above the right definition for a covering space of a topos? One reason is that it extends the definition of covering space for topological spaces. For a connected, locally connected topological space \(X\), we can look at the topos \(\mathcal{E}\) consisting of the local homeomorphisms \(Y \to X\) with fixed target \(X\). In this case, the covering spaces of the topos are all of the form \(\mathcal{E'} \to \mathcal{E}\) where \(\mathcal{E}'\) is the topos associated to a covering space \(Y\) of \(X\).</p>
<h2 id="fundamental-group-of-a-topos">Fundamental group of a topos</h2>
<p>After defining covering spaces for toposes \(\mathcal{E}\), it remains to find a group \(G\) such that covering spaces of \(\mathcal{E}\) correspond precisely to sets with a \(G\)-action. This can go wrong in various ways.</p>
<p>The problem already appears for topological spaces. Take for example the <a href="https://en.wikipedia.org/wiki/Hawaiian_earring">shrinking wedge of circles</a>:</p>
<p><img src="/images/swoc.png" alt="Shrinking wedge of circles" /></p>
<p>Suppose that you have a family of covering space \(Y_i \to X\) with as base space \(X\) the shrinking wedge of circles. Then the disjoint union \(\bigsqcup_{i \in I} Y_i \to X\) is not necessarily a covering space anymore. The reason is that, while for each covering space you can find an open cover \(X = \bigcup_{j \in J} U_j\) that trivializes \(Y_i\), it is not possible to find a common open covering that works for all covering spaces at once.</p>
<p>This is in contrast to what happens what happens for sets with a \(G\)-action, for \(G\) a group: for any family of sets \(S_i\), each equipped with a \(G\)-action, the disjoint union \(\bigsqcup_{i \in I} S_i\) is still a set with a \(G\)-action.</p>
<p>So something has to go wrong in the correspondence between covering spaces of \(X\) and sets with a \(G\)-action, regardless of what group \(G\) you pick.</p>
<p>One possible solution is to settle for less, and try to find a group \(G\) such that at least the “connected” covering spaces of the topos \(\mathcal{E}\) are the same as sets with a <em>transitive</em> \(G\)-action.</p>
<p>Even this is not always possible. For example, if \(\mathcal{E}\) is the small étale topos associated to the field of rational numbers \(\mathbb{Q}\) then connected covering spaces \(\mathcal{E}' \to \mathcal{E}\) correspond to finite field extensions of \(\mathbb{Q}\). And there is no (discrete) group \(G\) such that the finite field extensions of \(\mathbb{Q}\) correspond to the sets with transitive \(G\)-action.</p>
<p>But in this case there is a <em>profinite</em> group \(G\) such that sets with a continuous, transitive \(G\)-action correspond to finite field extensions of \(\mathbb{Q}\), namely the absolute Galois group \(G=\mathrm{Gal}(\bar{\mathbb{Q}}/\mathbb{Q})\).</p>
<p>For an arbitrary connected, locally connected topos, you can similarly construct a <em>pro-group</em> that functions as a fundamental group. Pro-groups are <a href="https://ncatlab.org/nlab/show/progroup">very technical</a>, but it is the best that can be done at this level of generality. Moerdijk in <a href="https://repository.ubn.ru.nl/bitstream/handle/2066/129084/129084.pdf?sequence=1">“Prodiscrete groups and Galois toposes”</a> shows that pro-groups can be seen as a special kind of localic group, similar to how profinite groups are a special kind of topological group.</p>
<h2 id="questions">Questions</h2>
<p>Every connected, locally connected topos has a fundamental group. Sometimes it is a discrete group, sometimes it is a profinite group or even a pro-group. We can now start wondering about whether two completely different toposes can have the same fundamental group. For example, if \(M\) is the free monoid on two generators, then the topos of sets with an \(M\)-action has the same fundamental group as the topos of local homeomorphisms to the figure eight space.</p>
<p>Here are some questions that I think are interesting:</p>
<ul>
<li>If \(\mathcal{E}\) is the topos of local homeomorphisms to a topological space \(X\), then how does the fundamental group of \(\mathcal{E}\) relate to the fundamental group of \(X\) (defined in terms of paths in \(X\))?</li>
<li>For a given profinite group \(G\), let’s say \(G = \mathrm{Gal}(\bar{\mathbb{Q}}/\mathbb{Q})\), can we find a topological space \(X\) such that the topos associated to \(X\) has \(G\) as fundamental group? Here \(X\) should be a pathological topological space like the shrinking wedge of circles, as otherwise the fundamental group of the topos is discrete.</li>
</ul>Jens Hemelaerjens.hemelaer@uantwerpen.beThis is a follow-up post of the one yesterday about the fundamental group of a monoid. There we looked at the covering spaces of the free monoid on two generators, and covering spaces of categories in general. From there it is a small(ish) step towards defining covering spaces of toposes, which in turn can be used to make sense of what the fundamental group of a topos should be.The fundamental group of a monoid2020-09-09T00:00:00+00:002020-09-09T00:00:00+00:00https://jenshemelaer.com/2020/09/09/fundamental-group-monoid<p>For a monoid \(M\), we can look at the group \(G\) that approximates \(M\) in the best way. If you have a presentation of \(M\) in terms of generators and relations, then \(G\) has the same presentation, but as a group rather than as a monoid. In other words, \(G\) is the group you get after formally adding inverses to the elements of \(M\). For example, if \(M\) is the monoid of natural numbers under addition, then \(G\) is the group of integers.</p>
<p>Usually, \(G\) is called the <em>groupification</em> of \(M\). Sometimes it is also called the Grothendieck group, but for some reason this name is only used when \(M\) is commutative.</p>
<p>Last week I found another name for the same construction, in Olivier Leroy’s thesis <a href="https://github.com/agrothendieck/agrothendieck.github.io/raw/master/galoispoincaregrothendieck/leroy/leroy.pdf">“Groupoïde fondamental et théorème de van Kampen en théorie des topos”</a>. The construction there is more general: it associates a groupoid to a category, and Leroy calls this groupoid the <em>fundamental groupoid</em> of the category. Monoids are categories with one object, so taking Leroy’s terminology a bit further, the group associated to a monoid is its <em>fundamental group</em>.</p>
<p>It is an interesting name, because it suggests a relationship between this construction and covering spaces in topology, which is explained in Leroy’s thesis. I will give an example to show how this works.</p>
<h2 id="the-free-monoid-on-two-generators">The free monoid on two generators</h2>
<p>We will have a look at the free monoid \(M\) on two generators. So the elements are words using only the letters \(x\) and \(y\), and the multiplication is given by concatenation of words. We can draw \(M\) as follows:</p>
<p><img src="/images/figure-8-loops.png" alt="Figure eigth loops" /></p>
<p>What would be a good notion of covering space over \(M\)? The number of points should correspond to the degree of the covering map (the number of “sheets”). And each of these points should be “locally isomorphic to \(M\)”, in the sense that there should be precisely one blue arrow entering and one leaving, and similarly, there should be precisely one red arrow entering and one leaving.</p>
<p>Here is an example of a covering space in this sense:</p>
<p><img src="/images/figure-8-action.png" alt="Example of a group action" /></p>
<p>There is an action of the monoid \(M\) on the five points in the diagram. We can say that \(x\) acts by following the blue arrows on the left, and \(y\) acts by following the red arrows on the right. If we name the points \(v_1, \dots, v_5\) (from top to bottom), then we find for example that \(x\cdot v_1 = v_2\), \(x\cdot v_2 = v_3\), \(y \cdot v_1 = v_1\).</p>
<p>Every set with an \(M\)-action can be drawn as above, and the drawings that you get have the property that in each point there are exactly one blue arrow and one red arrow that <em>leave</em> this point. However, for an arbitrary set with \(M\)-action, we do not necessarily have exactly one blue arrow and one red arrow <em>entering</em> each point. Here is a counterexample:</p>
<p><img src="/images/figure-8-counterexample.png" alt="Counterexample of an M-action that does not qualify as covering space" /></p>
<p>What are the sets with \(M\)-action such that, if we draw them, there is precisely one blue arrow and one red arrow entering in each point? These are the sets for which \(M\) acts by permutations, and in turn these are precisely the ones such that the \(M\)-action extends to a \(G\)-action, where \(G\) is the free group on two generators, i.e. the groupification or fundamental group of \(M\).</p>
<p>So we see that covering spaces of \(M\) correspond to sets with a \(G\)-action. This is very similar to what happens in topology: for a connected, locally connected, semilocally connected topological space \(X\), we also have that covering spaces of \(X\) correspond to sets with an action of the fundamental group of \(X\).</p>
<h2 id="the-figure-eight-space">The figure eight space</h2>
<p>The topological space that most resembles the free monoid on two generators is probably the figure eight space (also known as two-petaled rose, lemniscate or infinity symbol).</p>
<p><img src="/images/figure-8.png" alt="Figure eight" /></p>
<p>Its fundamental group is the free group on two generators \(G\), so the monoid and the topological space even have the same fundamental group.</p>
<p>I claim that you can go from covering spaces of the monoid \(M\) almost instantly to covering spaces of the figure eight space. Let’s go back to the example:</p>
<p><img src="/images/figure-8-action.png" alt="Example of a covering space of M" /></p>
<p>We can rearrange the covering space to make it look more like a topological space.</p>
<p><img src="/images/rearranged.png" alt="Rearranged covering space" /></p>
<p>To get the actual topological space, all we have to do is replace the arrows by line segments.</p>
<p><img src="/images/figure-8-covering.png" alt="Arrows replaced by line segments" /></p>
<p>If we use \(X\) for the figure eight space, and \(Y\) for this covering space, then we also need to specify the covering map \(\pi : Y \to X\). You can do this by sending each line segment to the line segment of the same color in the base space.</p>
<p>However, it is not clear from this last drawing how to do this, because for each line segment there are two ways you can send it to the corresponding line segment in the base space (clockwise and counterclockwise, so to speak).</p>
<p>This means that in order to construct the covering map, you still need to remember the direction of the arrows.</p>
<h2 id="covering-spaces-of-a-category">Covering spaces of a category</h2>
<p>The definition of covering space that we gave for the free monoid on two generators, is a special case of the notion of covering space for categories. The idea is that monoids are precisely the (small) categories that have one object. The arrows are the elements of the monoid.</p>
<p>Let’s see what the right notion of covering space is for a category.</p>
<p>The first step is generalizing the monoid action. For a fixed category \(\mathcal{C}\), we can look at the functors \(\pi : \mathcal{D} \to \mathcal{C}\) with the property that for each arrow \(f: C \to C'\) in \(\mathcal{C}\) and each object \(D\) in \(\mathcal{D}\) with \(F(D)=C\), there is a unique “lifted arrow” \(\tilde{f} : D \to D'\) such that \(\pi(\tilde{f}) = f\). This is analogous to lifting paths in topology. It is also analogous to monoid actions: in some sense \(\mathcal{C}\) has a partially defined left action on the objects of \(\mathcal{D}\), via \(f \cdot D = D'\).</p>
<p>Functors \(\pi : \mathcal{D} \to \mathcal{C}\) like this are called <a href="https://ncatlab.org/nlab/show/discrete+fibration">discrete opfibrations</a>. If you carefully compare the definitions, you see that they are the same thing as presheaves on the opposite category \(\mathcal{C}^\mathrm{op}\). <em>(Technical comment: for this to work, we need that \(\pi^{-1}(C)\) is small enough to be a set, for every object \(C\) in \(\mathcal{C}\).)</em></p>
<p>When do discrete opfibrations (a.k.a. presheaves) qualify as covering spaces? In each object, we already have the right amount of arrows leaving, but we also need to specify how many arrows are entering. So we need that for each arrow \(f : C \to C'\) in \(\mathcal{C}\) and for each object \(D'\) in \(\mathcal{D}\) with \(\pi(D')=C'\), there is a unique \(\tilde{f}: D'' \to D'\) with \(\pi(\tilde{f})=f\).</p>
<p>In category theory jargon, in order to qualify as covering space, \(\pi\) should be a <a href="https://ncatlab.org/nlab/show/discrete+fibration">discrete fibration</a> in addition to being a discrete opfibration.</p>
<p>Here is an example of a covering space (above) over some base category (below):</p>
<p><img src="/images/discrete-fibration.png" alt="Example of a discrete fibration" /></p>
<p>With the definition as above, the covering spaces on a category \(\mathcal{C}\) are the same thing as actions of the fundamental groupoid of \(\mathcal{C}\), i.e. the groupoid that you get by adding inverses to each arrow. If the category is connected, then the fundamental groupoid is equivalent to a group \(G\), and in this case covering spaces of \(\mathcal{C}\) correspond precisely to sets with a \(G\)-action.</p>
<h2 id="swept-under-the-rug">Swept under the rug</h2>
<p>As a category, the free monoid on two generators has one object and infinitely many arrows. Each arrow corresponds to an element of the free monoid, i.e. a word using the letters \(x\) and \(y\).</p>
<p>In my drawing of this free monoid, I only drew arrows for the generators, and ignored all other elements.</p>
<p><img src="/images/figure-8-loops.png" alt="Figure eigth loops" /></p>
<p>Why do we get away with this?</p>
<p>The reason is not easy to write out in detail, but it is more or less the following. For each directed graph \(\Gamma\) we can look at the category \(P(\Gamma)\) that has as objects the vertices of \(\Gamma\), and as morphisms \(v \to w\) the directed paths that start in \(v\) and end in \(w\).</p>
<p>Our definition of covering spaces works for directed graphs as well, and then you can show that a covering space \(\Gamma' \to \Gamma\) of a directed graph \(\Gamma\) extends in a unique way to a covering space \(P(\Gamma') \to P(\Gamma)\), and that all covering spaces of \(P(\Gamma)\) arise in this way.</p>
<p>We can then interpret the free monoid on two generators as the category \(P(\Gamma)\) where \(\Gamma\) is the directed graph with one vertex and two loops. So any covering space of this monoid can be described using a covering space of directed graphs \(\Gamma' \to \Gamma\).</p>Jens Hemelaerjens.hemelaer@uantwerpen.beFor a monoid \(M\), we can look at the group \(G\) that approximates \(M\) in the best way. If you have a presentation of \(M\) in terms of generators and relations, then \(G\) has the same presentation, but as a group rather than as a monoid. In other words, \(G\) is the group you get after formally adding inverses to the elements of \(M\). For example, if \(M\) is the monoid of natural numbers under addition, then \(G\) is the group of integers.Riemann surfaces2020-08-14T00:00:00+00:002020-08-14T00:00:00+00:00https://jenshemelaer.com/2020/08/14/riemann-surfaces<p>I’m still trying to improve my understanding of algebraic extensions of \(\mathbb{C}(t)\). It’s a problem that’s connected to a lot of interesting mathematical ideas, like Riemann surfaces, the étale fundamental group, dessins d’enfants and modular curves.</p>
<p>The connection to Riemann surfaces is as follows: algebraic extensions of \(\mathbb{C}(t)\) correspond to maps \(\pi:\Sigma \to \mathbb{P}_\mathbb{C}^1\) where \(\Sigma\) is a Riemann surface, \(\mathbb{P}^1_\mathbb{C}\) is the complex projective line, and \(\pi\) is a local homeomorphism except in a few so-called ramifications points \(x_1,\dots,x_r \in \Sigma\).</p>
<h2 id="what-is-a-riemann-surface">What is a Riemann surface?</h2>
<p>A big “bottleneck” in my understanding was that I didn’t really know the definition of a Riemann surface. I would have guessed that it was an oriented Riemannian manifold of dimension 2 or maybe a Kähler manifold of real dimension 2. It turns out that these two definitions are equivalent (see Remark 4 <a href="http://indico.ictp.it/event/a09153/session/4/contribution/2/material/0/1.pdff">here</a>). But both are wrong.</p>
<p>The actual definition: a Riemann surface is a <a href="https://en.wikipedia.org/wiki/Riemann_surface#Definitions">1-dimensional complex manifold</a>. You can always construct a Riemannian metric that is compatible with the complex structure, but this Riemannian metric is only unique up to <em>conformal equivalence</em>. This means that for two such metrics \(g\) and \(g'\) there is a positive real function \(\lambda\) such that \(g' = \lambda g\). The underlying reason is that, locally, holomorphic maps are precisely the smooth maps that are angle-preserving and orientation-preserving. You can look up the details <a href="https://math.stackexchange.com/a/3569334/81217">here</a>.</p>
<p>Every oriented Riemannian 2-manifold has an underlying Riemann surface (by considering the metric up to conformal equivalence). This is because, as mentioned above, a 2-manifold like this can always be made into Kähler manifold, in a unique way. In other words, there is automatically a complex manifold structure on it that is compatible with the metric. This is a bit crazy, and it certainly doesn’t happen for oriented Riemanian manifolds in higher dimensions…</p>
<p>As an example, take the donut:</p>
<p><img src="/images/donut.png" alt="donut" /></p>
<p>By “donut” I mean a <a href="https://en.wikipedia.org/wiki/Torus">torus</a> that is curved like a real donut, so it is equipped with the Riemannian metric that it inherits from the embedding in \(\mathbb{R}^3\). You can turn this donut into a complex manifold such that the complex structure and the Riemannian metric are compatible. This is new to me, because I thought only flat tori (quotients of \(\mathbb{C}\) by a lattice) could be equipped with a compatible structure of complex manifold.</p>
<h2 id="elliptic-parabolic-hyperbolic">Elliptic, parabolic, hyperbolic</h2>
<p>The metric on a Riemann surface is only determined up to conformal equivalence. However, some metrics are considered to be ‘better’ than others, and this changes the way geometers talk about Riemann surfaces. For example, some people might say that donuts are flat (zero curvature), and as you can see on the picture this is not necessarily true. What is meant is that on a donut every Riemannian metric is conformally equivalent to a flat metric, and this flat metric is considered to be <em>the</em> metric that you should look at.</p>
<p>Another example is a complex plane with some points removed. The complex plane with the Euclidean metric is flat, and after removing a few points, the restriction of this metric is still flat. However, this is not <em>the</em> metric. The metric that complex geometers see, after removing at least two points, is an hyperbolic metric (conformally equivalent to the flat one).</p>
<p><img src="/images/gamma-function.png" alt="Gamma function" /></p>
<p>The hyperbolic metric that you get is complete, and the removed points are called cusps or cusp singularities (not to be confused with cusps in algebraic geometry).</p>
<p>The kind of metric that is preferred depends on the universal cover of the Riemann surface. The universal cover is again a complex surface and the covering map is a local isomorphism (or local biholomorphism in complex analysis terminology). It turns out that there are only three possibilities for the universal cover:</p>
<ul>
<li>The complex projective line \(\mathbb{P}_\mathbb{C}^1\) (the parabolic case).</li>
<li>The complex plane \(\mathbb{C}\) (the elliptic case).</li>
<li>The unit disk \(D(0,1) = \{ z \in \mathbb{C} : \lvert z \rvert < 1 \}\) (the hyperbolic case).</li>
</ul>
<p>In order to make these three into Riemann surfaces, you need to specify the structure of complex manifold in each case. For \(\mathbb{P}_\mathbb{C}^1\) this is the usual construction, for \(\mathbb{C}\) this is trivial, and \(D(0,1)\) inherits the one from \(\mathbb{C}\) by being an open subset of it.</p>
<p>For each of these three Riemann surfaces, there is a “favorite” metric that is compatible with the complex structure.</p>
<ul>
<li>On \(\mathbb{P}^1_\mathbb{C}\) you can construct a metric with constant curvature, called the <a href="https://en.wikipedia.org/wiki/Fubini%E2%80%93Study_metric">Fubini—Study metric</a>. The complex projective line is homeomorphic to a sphere, and the Fubini—Study metric is the usual metric you get from the embedding of the sphere in \(\mathbb{R}^3\). The constant curvature is positive, so after rescaling you can assume it to be \(1\).</li>
<li>The complex plane \(\mathbb{C}\) is an open subset of \(\mathbb{P}^1_\mathbb{C}\) but the restriction of the Fubini—Study metric is no longer complete. However, the Euclidean metric is complete. It is also of constant curvature, this time of constant curvature \(0\).</li>
<li>The unit disk \(D(0,1)\) is an open subset of \(\mathbb{C}\) but the restriction of the Euclidean measure is no longer complete (and neither is the restriction of the Fubini—Study metric). However, there is another metric, the <a href="https://en.wikipedia.org/wiki/Poincar%C3%A9_metric#Metric_and_volume_element_on_the_Poincar%C3%A9_disk">Poincaré metric</a>, which is complete and has constant curvature. The constant curvature is negative, so after rescaling you can assume it to be \(-1\).</li>
</ul>
<p><img src="/images/sphere.png" alt="sphere" /></p>
<p>If you have a Riemann surface \(\Sigma\), you can look at the universal cover \(\widetilde{\Sigma}\), and put the corresponding “favorite” metric on it. Now something weird happens… this metric always descends to a metric on \(\Sigma\).</p>
<p>The reason why is explained well <a href="https://math.stackexchange.com/a/1729742/81217">here</a>, but I’ll repeat the argument. You can write \(\Sigma\) as the quotient \(\widetilde{\Sigma}/\Gamma\) where the discrete group \(\Gamma\) has a holomorphic group action on \(\widetilde{\Sigma}\) that is free and properly discontinuous. In order for the metric on \(\widetilde{\Sigma}\) to descend to a metric on \(\Sigma\), we need that the group \(\Gamma\) acts by isometries. So the action of \(\Gamma\) should not only preserve angles but also areas. Let us look at why this is the case in the three cases:</p>
<ul>
<li>On \(\mathbb{P}^1_\mathbb{C}\) the holomorphic self-maps are maps \(z \mapsto \frac{az+b}{cz+d}\) with \(\begin{pmatrix} a & b \\ c & d \end{pmatrix} \in \mathrm{PGL}_2(\mathbb{C})\). These all have a fixpoint, so there are no free holomorphic group actions on \(\mathbb{P}^1_\mathbb{C}\). The only Riemann surface with \(\mathbb{P}^1_\mathbb{C}\) as universal cover is \(\mathbb{P}^1_\mathbb{C}\) itself.</li>
<li>On \(\mathbb{C}\) the holomorphic self-maps are the same maps \(z \mapsto \frac{az+b}{cz+d}\) but now they have to fix the point at infinity. By l’Hôpital’s rule this means that \(\tfrac{a}{c}=\infty\) or in other words \(a \neq 0\) and \(c = 0\). So the holomorphic self-maps are of the form \(z \mapsto az + b\) for \(a,b \in \mathbb{C}\). If there are no fixpoints, then necessarily \(a = 1\), otherwise there is a solution to \(z = az+b\). So the holomorphic self-maps without fixpoints are the translations, and these are all isometries.</li>
<li>For the unit disk \(D(0,1)\) every holomorphic self-map is an isometry, see Theorem 1.5 of Bowman’s <a href="http://pi.math.cornell.edu/~bowman/metrics.pdf">lectures notes on hyperbolic geometry</a>.</li>
</ul>
<p>So the special metrics on the universal cover \(\widetilde{\Sigma}\) always descend to a metric on the original Riemann surface \(\Sigma\), so that the covering map is a local isometry. This implies that the metric on \(\Sigma\) is again complete and of constant curvature \(-1\), \(0\) or \(1\).</p>
<p>A complete metric of constant curvature on \(\Sigma\) lifts to a complete metric of constant curvature on \(\widetilde{\Sigma}\). This can only be the special metric described above. So on each Riemann surface, there is a unique complete metric of constant curvature, up to scaling.</p>
<h2 id="ricci-flow">Ricci flow</h2>
<p>In 2003, Grigori Perelman proved the Poincaré Conjecture. Essential to his work was the so-called Ricci flow: a Riemannian metric \(g_{ij}(t)\) on a fixed manifold varying in function of a time parameter \(t\) such that a certain differential equation is satisfied. When awarded the Clay Millenium Prize, Perelman claimed that his contribution was no greater than that of Richard Hamilton, who introduced the Ricci flow.</p>
<p>For compact Riemann surfaces, the Ricci flow is extremely well-behaved. If you choose an initial Riemannian metric, compatible with the complex structure, then throughout the Ricci flow the Riemannian metric \(g_{ij}(t)\) is still compatible with the complex structure, i.e. conformally equivalent to the initial one.</p>
<p>Further, the Ricci flow converges to a metric of constant curvature. This was proved by Hamilton in 1988 (in “The Ricci flow on surfaces”), except in the case of a sphere that has regions where the curvature is negative, as in the picture below.</p>
<p><img src="/images/ricci.png" alt="ricci" /></p>
<p>Bennett Chow (in “The Ricci flow on the 2-sphere”) later showed that for any initial metric on the sphere, the curvature becomes positive at each point, after some time in the Ricci flow. This is as illustrated above: at first there are regions of negative curvature but they are gone in the last two stages. And then it starts converging to a constant curvature metric because of Hamilton’s results.</p>
<p>For surfaces that are not compact, the research is more recent. Giesen and Topping showed that, for general hyperbolic Riemann surfaces, the Ricci flow exists and converges locally to the complete hyperbolic metric of constant curvature. The caveat is that at certain points in the Ricci flow there are points on the surface with infinite curvature. The transition from incomplete metric to complete metric is instantaneous, in the sense that the metric is complete for all \(t > 0\). A good overview is in “Ricci flows with bursts of unbounded curvature” by Giesen and Topping, <a href="https://arxiv.org/abs/1302.5686">arXiv:1302.5686</a>.</p>
<p>Now there are only two cases left. Noncompact Riemann surfaces that are not hyperbolic are either isomorphic to \(\mathbb{C}\) or isomorphic to \(\mathbb{C}^* = \mathbb{C}-\{0\}\). The first case is considered by Li Ma in “Convergence of Ricci flow on \(R^2\) to the plane”, and it is shown that additional assumptions are needed in order to have some convergence to the Euclidean metric. The case \(\mathbb{C}^*\) seems to be the case for which the least is known, but I might have missed things.</p>Jens Hemelaerjens.hemelaer@uantwerpen.beI’m still trying to improve my understanding of algebraic extensions of \(\mathbb{C}(t)\). It’s a problem that’s connected to a lot of interesting mathematical ideas, like Riemann surfaces, the étale fundamental group, dessins d’enfants and modular curves.Algebraic extensions and supernatural numbers2020-08-06T00:00:00+00:002020-08-06T00:00:00+00:00https://jenshemelaer.com/2020/08/06/algebraic-extensions<p>The field \(\mathbb{F}_p\) with \(p\) elements has a finite extension of degree \(n\) for each natural number \(n\). <a href="https://twitter.com/syzygay1/status/1290861985639411712">On Twitter, @syzygay1 asked</a> if this can be extended to infinite field extensions of \(\mathbb{F}_p\) for a generalized notion of “degree”. For the field \(\mathbb{F}_p\), this leads to the concept of supernatural numbers, which are <a href="https://arxiv.org/abs/1602.01627">connected</a> to the <a href="https://arxiv.org/abs/1405.4527">Arithmetic Site</a> of Connes and Consani. It is interesting to see what happens for other fields as well, and this is what led me to write the notes below.</p>
<p>After looking at the case of the field \(\mathbb{F}_p\), we discuss the Pontryagin dual of the absolute Galois group, what this has to do with the field with one element, and how we could classify algebraic extensions for fields other than \(\mathbb{F}_p\).</p>
<h2 id="supernatural-numbers">Supernatural numbers</h2>
<p>The problem was first studied by Ernst Steinitz in his 1910 paper <a href="http://resolver.sub.uni-goettingen.de/purl?GDZPPN002167042">“Algebraische Theorie der Körper”</a> (“Algebraic Theory of Fields”). He showed that the algebraic extensions of \(\mathbb{F}_p\) correspond to what are now called the <em>supernatural numbers</em> or <em>Steinitz numbers</em>. The idea behind it was rediscovered by @syzygay1 on Twitter. Each algebraic extension \(K/\mathbb{F}_p\) is the union of its finite subfields, so we have to keep tracks of which finite subfields occur. If \(K\) contains \(\mathbb{F}_{p^n}\), the (unique) field extension of \(\mathbb{F}_p\) that has degree \(n\), then \(K\) also has to contain all subfields of \(\mathbb{F}_{p^n}\). These are precisely the fields \(\mathbb{F}_{p^m}\) for \(m\) a divisor of \(n\). Further, if \(K\) contains two fields \(\mathbb{F}_{p^k}\) and \(\mathbb{F}_{p^r}\) of degree \(k\) and \(r\), then it also contains the union of these two fields, which is \(\mathbb{F}_{p^l}\) for \(l\) the least common multiple of \(k\) and \(r\).</p>
<p><img src="/images/steinitz.jpg" alt="Ernst Steinitz" /></p>
<p>There is an analogy with divisors here. If a natural number \(s\) is divisible by \(n\), then it is also divisible by each \(m\) as long as \(m\) divides \(n\). And if \(s\) is divisible by \(k\) and \(r\), then it is also divisible by the least common multiple of \(k\) and \(r\).</p>
<p>So we can define a supernatural number as a subset \(S \subseteq \{1,2,3,\dots\}\) such that:</p>
<ol>
<li>if \(n\in S\) and \(m\) divides \(n\) then \(m \in S\);</li>
<li>if \(k, r \in S\) then the least common multiple of \(k\) and \(r\) is also in \(S\).</li>
</ol>
<p>Then each supernatural number \(S\) defines a field extension \(\bigcup_{n \in S} \mathbb{F}_{p^n}\) and every algebraic extension is of this form.</p>
<p>One problem: with this definition supernatural numbers don’t look like numbers. The remedy is that you can think of each supernatural number \(S \subseteq \{1,2,3,\dots \}\) as the set of divisors of a formal product \(\prod_p p^{n_p}\), where the product is over all primes, and each exponent \(n_p\) is in \(\{0,1,2,3,\dots\}\cup\{\infty\}\). This is how supernatural numbers are usually defined.</p>
<h2 id="similar-base-fields">Similar base fields</h2>
<p>Steinitz managed to give a very precise classification of the algebraic extensions of the finite field \(\mathbb{F}_p\). Can we do something similar for other base fields?</p>
<p>The only property of \(\mathbb{F}_p\) that was used is that \(\mathbb{F}_p\) has a unique extension of degree \(n\) for each natural number \(n\), and that the extension of degree \(m\) is contained in the extension of degree \(n\) if and only if \(m\) divides \(n\).</p>
<p>This property holds for other fields as well, for example for any finite field (with cardinality a prime power and not necessarily a prime).</p>
<p>We can also use Steinitz’s classification to find an infinite field with this property. Take for example \(S\) the set of squarefree natural numbers. This corresponds to the formal product \(s=\prod_p p\) over all primes \(p\). In this case, there is also a unique extension of degree \(n\), namely the one corresponding to the product \(n\cdot s\). So for this field, the algebraic extensions are again classified by the supernatural numbers.</p>
<p>We also don’t have to restrict ourselves to field extensions. If \(\mathrm{M}_n(\mathbb{C})\) is the ring of \(n\times n\) matrices over the complex numbers, then there is a ring morphism \(\mathrm{M}_m(\mathbb{C}) \to \mathrm{M}_n(\mathbb{C})\) if and only if \(m\) divides \(n\). This is exactly the same situation as with field extensions… So for a supernatural number \(s\) we can look at the union of a sequence \(\mathrm{M}_{n_1}(\mathbb{C}) \subseteq \mathrm{M}_{n_2}(\mathbb{C}) \subseteq \dots\) where \(n_1, n_2,\dots\) are divisors of \(s\), each one dividing the next one, such that \(n_i\) “converges” to \(s\). Modulo some analysis, these infinite unions are precisely the UHF-algebras. So UHF-algebras can also be classified using supernatural numbers.</p>
<h2 id="visualizing-the-supernatural-numbers">Visualizing the supernatural numbers</h2>
<p>All this is a good excuse for me to bring up the visualizations that I made of the supernatural numbers, see the <a href="https://jhemelae.github.io/2019/10/29/big-cell.html">previous post</a>. Here is one of them:</p>
<p><img src="/images/bigcell-32.gif" alt="Big cell" /></p>
<p>The red dots represent finite extensions, and they converge in \(\mathbb{R}^2\) to supernatural numbers that represent algebraic extensions.</p>
<h2 id="relation-to-the-galois-group">Relation to the Galois group</h2>
<p>Algebraic extensions correspond to closed subgroups of the absolute Galois group, according to the <a href="https://ncatlab.org/nlab/show/main+theorem+of+classical+Galois+theory">fundamental theorem of Galois theory</a>. For \(\mathbb{F}_p\), the absolute Galois group is isomorphic to the additive group of profinite integers \(\hat{\mathbb{Z}}\). The closed subgroups of finite index are the subgroups \(n\hat{\mathbb{Z}} \subseteq \hat{\mathbb{Z}}\) for \(n\) a natural number. The more general subgroups can be written as an intersection of closed subgroups of finite index.</p>
<p>To determine the closed subgroups, you can also use Pontryagin duality. There is a bijective correspondence between closed subgroups of an abelian topological group \(G\), and closed subgroups of the Pontryagin dual group \(G^*\), see <a href="https://mathoverflow.net/a/191315/37368">here</a>.</p>
<p>In the case of the field \(\mathbb{F}_p\), the absolute Galois group is \(\hat{\mathbb{Z}}\) and this has as Pontryagin dual \(\mathbb{Q}/\mathbb{Z}\), with the discrete topology. (Galois groups are compact so they always have a discrete group as Pontryagin dual.) So algebraic extensions of \(\mathbb{F}_p\) correspond to subgroups of \(\mathbb{Q}/\mathbb{Z}\), or in other words, subgroups of \(\mathbb{Q}\) that contain \(\mathbb{Z}\).</p>
<p>It follows that the subgroups of \(\mathbb{Q}\) that contain \(\mathbb{Z}\) are also classified by the supernatural numbers. The subgroup corresponding to the supernatural number \(s\) contains precisely the fractions such that (in reduced form) the denominator is a divisor of \(s\).</p>
<h2 id="the-field-with-one-element">The field with one element</h2>
<p>To get a bit of intuition for Pontryagin duality, it is good to take a look at the (conjectural) field with one element \(\mathbb{F}_1\). There is no fixed definition of what \(\mathbb{F}_1\) is exactly, but there are a lot of properties that it should satisfy. For example, since the absolute Galois group of \(\mathbb{F}_p\) is isomorphic to \(\hat{\mathbb{Z}}\) for all primes \(p\), we can say that, by analogy, the absolute Galois group of \(\mathbb{F}_1\) is also isomorphic to \(\hat{\mathbb{Z}}\). This means in particular that \(\mathbb{F}_1\) has a unique extension of degree \(n\) for each natural number \(n\).</p>
<p>One definition of \(\mathbb{F}_1\) is that \(\mathbb{F}_1\) is the trivial monoid, and that ring extensions of \(\mathbb{F}_1\) are arbitrary commutative monoids. The idea is that we forget addition and only look at multiplication. The multiplicative group of a finite field is cyclic, so the finite field extensions of \(\mathbb{F}_1\) should be the finite cyclic groups. Fortunately, there is a unique cyclic group of order \(n\) for each natural number \(n\), so the field extensions are how we want them.</p>
<p>Pontryagin duality shows up here in an interesting way: the algebraic closure of \(\mathbb{F}_1\), in the above definition, is the group \(\mathbb{Q}/\mathbb{Z}\), which is precisely the Pontryagin dual of the absolute Galois group.</p>
<h2 id="more-general-base-fields">More general base fields</h2>
<p>Can we classify the algebraic extensions of a general field \(K\), similarly to how we classified the algebraic extensions of \(\mathbb{F}_p\)? The answer is probably no, because Galois theory is too difficult for general fields. A first obstruction is that in general the absolute Galois group is not abelian. So we cannot use Pontryagin duality, and as an alternative we probably have to look at \(n\)-dimensional representations of the Galois group, and these are very complicated.</p>
<p>So we’ll have a look at two examples with abelian Galois group.</p>
<p>The first example that springs to mind is to look at the abelian extensions of \(\mathbb{Q}\). These are the Galois extensions of \(\mathbb{Q}\) that have abelian Galois group. Alternatively, these are the extensions of \(\mathbb{Q}\) that are contained in the <em>maximal abelian extension</em> \(\mathbb{Q}^\mathrm{ab}\). By the <a href="https://ncatlab.org/nlab/show/main+theorem+of+classical+Galois+theory">fundamental theorem of Galois theory</a>, we now know that the abelian extensions of \(\mathbb{Q}\) correspond to the closed subgroups of the Galois group \(\mathrm{Gal}(\mathbb{Q}^\mathrm{ab}/\mathbb{Q})\).</p>
<p>This Galois group can be computed using Kronecker-Weber theorem: up to isomorphism you get \(\hat{\mathbb{Z}} \times \prod_n \mathbb{Z}/n\mathbb{Z}\), where the product is over all integers \(n\) (see e.g. Lenstra’s <a href="http://websites.math.leidenuniv.nl/algebra/Lenstra-Profinite.pdf">notes on profinite groups</a>). For the Pontryagin dual we then find \(\mathbb{Q}/\mathbb{Z} \times \bigoplus_n \mathbb{Z}/n\mathbb{Z}\). So abelian extensions of \(\mathbb{Q}\) correspond to subgroups of \(\mathbb{Q}/\mathbb{Z} \times \bigoplus_n \mathbb{Z}/n\mathbb{Z}\) . At the moment, I have no idea how to describe the subgroups of a group like this in a nice way. It is already difficult to describe the subgroups of \(G \times H\) if you know the subgroups of \(G\) and the subgroups of \(H\), see the explanation <a href="https://math.stackexchange.com/a/488222/81217">here</a>. For infinite products or infinite direct sums this seems impossible. The difficulty does not appear for \(\hat{\mathbb{Z}}=\prod_p \mathbb{Z}_p\) because the orders of finite quotients of \(\mathbb{Z}_p\) are coprime to the orders of finite quotients of \(\mathbb{Z}_q\), for \(p \neq q\).</p>
<p>We can simplify the situation a lot by looking at the field \(\mathbb{Q}(\sqrt{\mathbb{Q}})\). This is the notation I borrowed from Hendrik Lenstra’s <a href="http://websites.math.leidenuniv.nl/algebra/GSchemes.pdf">book on Galois theory for schemes</a>. As the notation suggests, it is the extension of \(\mathbb{Q}\) that you get by adjoining all elements \(\sqrt{a}\) for \(a \in \mathbb{Q}\). The Galois group of \(\mathbb{Q}(\sqrt{\mathbb{Q}})\) over \(\mathbb{Q}\) is isomorphic to \(\prod_{i \in I} \mathbb{Z}/2\mathbb{Z}\) for some countably infinite set \(I\) (this is Exercise 2.14 of Lenstra’s book). So the Pontryagin dual is \(\bigoplus_{i \in I} \mathbb{Z}/2\mathbb{Z}\). Its subgroups are complicated, but not extremely complicated. We can interpret \(\bigoplus_{i \in I} \mathbb{Z}/2\mathbb{Z}\) as a vector space of countably infinite dimension over \(\mathbb{F}_2\), and then the subgroups are precisely the vector subspaces.</p>
<p>I would be interested in a classification of certain algebraic extensions of \(\mathbb{C}(t)\) as well. The absolute Galois group of \(\mathbb{C}(t)\) is the profinite completion of the free group with \(\kappa\) many generators, where \(\kappa\) is the cardinality of the complex numbers. The Pontryagin dual is then the product \(\prod_J \mathbb{Q}/\mathbb{Z}\) over an index set \(J\) of cardinality \(\kappa\). So the abelian extensions of \(\mathbb{C}(t)\) should correspond to the subgroups of \(\prod_J \mathbb{Q}/\mathbb{Z}\). This does not seem like a very useful description. Maybe we can simplify the situation by allowing only abelian extensions that are ramified at a prescribed set of points. But I don’t really understand how this works… let me know if you have some ideas!</p>Jens Hemelaerjens.hemelaer@uantwerpen.beThe field \(\mathbb{F}_p\) with \(p\) elements has a finite extension of degree \(n\) for each natural number \(n\). On Twitter, @syzygay1 asked if this can be extended to infinite field extensions of \(\mathbb{F}_p\) for a generalized notion of “degree”. For the field \(\mathbb{F}_p\), this leads to the concept of supernatural numbers, which are connected to the Arithmetic Site of Connes and Consani. It is interesting to see what happens for other fields as well, and this is what led me to write the notes below.Animated GIFs of Conway’s big cell2019-10-29T00:00:00+00:002019-10-29T00:00:00+00:00https://jenshemelaer.com/2019/10/29/big-cell<p>Let’s take the natural numbers (without zero) and order them under the division relation. So we completely forget the usual inequality \(\leq\) between natural numbers, and we now say that \(a \leq b\) whenever \(a\) divides \(b\). So \(1\) is the smallest element and we have chains like \(1 \leq 2 \leq 4 \leq 16 \leq \dots\). The result is called the <em>big cell</em> (a terminology first used by John Horton Conway). How can we best visualize this big cell? Let’s make some animated GIFs.</p>
<p>Lieven Le Bruyn proved in <a href="https://arxiv.org/abs/1602.01627">“Covers of the Arithmetic Site”</a> (Theorem 1) that the big cell is a Diaconescu cover for the <a href="https://arxiv.org/abs/1405.4527">Arithmetic Site</a> by Connes and Consani. The topological space corresponding to the big cell is the space \(\mathbb{S}\) of <em>supernatural numbers</em>, with the localic topology. The problem is that this topology is not Hausdorff. So for intuition and visualization, it makes more sense to look at the <em>patch topology</em>, generated by the compact opens for the original topology and their complements. By replacing the original topology with the patch topology, we now get a compact metric space.</p>
<p>In fact, we can see the supernatural numbers with the patch topology as a closed subset of the <a href="https://en.wikipedia.org/wiki/Cantor_set">Cantor set</a>, but this “visualization” is not very insightful:</p>
<p><img src="/images/cantor.png" alt="Embedding in Cantor Set" /></p>
<p>So we take a different approach: each prime number will be plotted in a different angle relative to the origin, and the powers \(1,p,p^2,p^3,\dots\) of a fixed prime \(p\) will be drawn on a line. As distance between \(1\) and \(p^k\) we take \(\sqrt{\sum_{i=1}^k p^{-is}}\), where \(s\) is a free parameter. To make sure that the induced topology is the patch topology, we have to take \(s > 2\).</p>
<p>The result depends on the way that you pick the angles for each prime number. Here is a first possibility, using an arctangent function.</p>
<p><img src="/images/bigcell-32.gif" alt="Big Cell" /></p>
<p>And here another one where the angles “follow a Bell curve”.</p>
<p><img src="/images/bigcell-22.gif" alt="Big Cell" /></p>
<p>The topological space that we are interested in, is the space consisting of the red dots. The blue lines show the divisibility relation.</p>
<p>As formula for the distance between \(1\) and \(p^k\) I originally used \(\sum_{i=1}^k p^{-is}\), without the square root. This comes closer to how I wrote it down in <a href="https://bitbucket.org/jhemelae/thesis/raw/ef6ff7c90fb7489925443dfc501a64585ed37a25/thesis-jens-hemelaer.pdf">my thesis</a>, but the GIFs are less interesting… here are some of them:</p>
<p><img src="/images/bigcell-11.gif" alt="Big Cell" /></p>
<p><img src="/images/bigcell-21.gif" alt="Big Cell" /></p>
<p><img src="/images/bigcell-31.gif" alt="Big Cell" /></p>
<p>And here is the Python code that I used. Make sure to edit the last line with the location where you want to save the GIF. I execute the code as two cells in a <a href="https://jupyter.org/">Jupyter notebook</a>, and for me it takes 1 or 2 minutes to generate one of the GIFs. For the animations above, the choices for (f,g) are (f3,g2), (f2,g2), (f1,g1), (f2,g1) and (f3,g1), in this order.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">primefac</span> <span class="kn">import</span> <span class="n">factorint</span><span class="p">,</span><span class="n">primes</span>
<span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">cos</span><span class="p">,</span><span class="n">sin</span><span class="p">,</span><span class="n">log</span><span class="p">,</span><span class="n">pi</span><span class="p">,</span><span class="n">e</span><span class="p">,</span><span class="n">sqrt</span><span class="p">,</span><span class="n">exp</span><span class="p">,</span><span class="n">atan</span>
<span class="c1"># Lower is better but slower.
</span><span class="n">precision</span> <span class="o">=</span> <span class="mf">0.01</span>
<span class="c1"># Only consider prime numbers < prime_bound.
# Larger primes would be plotted close to the origin anyway.
</span><span class="n">prime_bound</span> <span class="o">=</span> <span class="mi">100</span>
<span class="n">prime_list</span> <span class="o">=</span> <span class="n">primes</span><span class="p">(</span><span class="n">prime_bound</span><span class="p">)</span>
<span class="c1"># Only plot integers < integer_bound.
</span><span class="n">integer_bound</span> <span class="o">=</span> <span class="mi">1000</span>
<span class="c1"># Functions converting a prime number to an angle.
# For each prime, it gives an angle in radians
# with respect to the origin.
# Plot makes more sense if difference between two angles
# is at most pi.
</span><span class="k">def</span> <span class="nf">f1</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">return</span> <span class="n">log</span><span class="p">(</span><span class="mf">2.0</span><span class="p">)</span><span class="o">/</span><span class="n">log</span><span class="p">(</span><span class="n">n</span><span class="p">)</span><span class="o">*</span><span class="n">pi</span>
<span class="k">def</span> <span class="nf">f2</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="n">x</span> <span class="o">=</span> <span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span><span class="o">*</span><span class="mf">0.1</span>
<span class="n">b</span> <span class="o">=</span> <span class="o">-</span><span class="mf">0.5</span><span class="o">*</span><span class="nb">pow</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
<span class="k">return</span> <span class="n">exp</span><span class="p">(</span><span class="n">b</span><span class="p">)</span><span class="o">*</span><span class="n">pi</span>
<span class="k">def</span> <span class="nf">f3</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">return</span> <span class="mi">2</span><span class="o">*</span><span class="n">atan</span><span class="p">((</span><span class="n">n</span><span class="o">-</span><span class="mf">2.0</span><span class="p">)</span><span class="o">/</span><span class="mi">20</span><span class="p">)</span>
<span class="c1"># Pick one of the angle functions above.
</span><span class="n">f</span> <span class="o">=</span> <span class="n">f1</span>
<span class="c1"># Functions rescaling the lengths of the edges, default=g1.
# Only for aesthetic reasons.
# Note: together with s, this affects whether or not the result
# corresponds to a totally bounded subset of the real plane.
</span>
<span class="k">def</span> <span class="nf">g1</span><span class="p">(</span><span class="n">r</span><span class="p">):</span> <span class="c1"># result is bounded for s > 1
</span> <span class="k">return</span> <span class="n">r</span>
<span class="k">def</span> <span class="nf">g2</span><span class="p">(</span><span class="n">r</span><span class="p">):</span> <span class="c1"># result is bounded for s > 2
</span> <span class="k">return</span> <span class="nb">pow</span><span class="p">(</span><span class="n">r</span><span class="p">,</span><span class="mf">0.5</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">g3</span><span class="p">(</span><span class="n">r</span><span class="p">):</span> <span class="c1"># result is bounded for s > .5
</span> <span class="k">return</span> <span class="nb">pow</span><span class="p">(</span><span class="n">r</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># Pick one of the rescaling functions above.
</span><span class="n">g</span> <span class="o">=</span> <span class="n">g1</span>
<span class="c1"># Adding two vectors.
</span><span class="k">def</span> <span class="nf">tuple_add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">item1</span> <span class="o">+</span> <span class="n">item2</span> <span class="k">for</span> <span class="n">item1</span><span class="p">,</span> <span class="n">item2</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">))</span>
<span class="c1"># Translating a line along a vector.
</span><span class="k">def</span> <span class="nf">translate</span><span class="p">(</span><span class="n">line</span><span class="p">,</span><span class="n">point</span><span class="p">):</span>
<span class="n">new_line</span> <span class="o">=</span> <span class="p">[</span> <span class="n">tuple_add</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">point</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">line</span> <span class="p">]</span>
<span class="k">return</span> <span class="n">new_line</span>
<span class="c1"># Length of the line going from 1 to p^k,
# before rescaling with g above.
</span><span class="k">def</span> <span class="nf">l</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">s</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">pow</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="o">-</span><span class="n">s</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="mf">1.0</span><span class="o">-</span><span class="nb">pow</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="o">-</span><span class="n">k</span><span class="o">*</span><span class="n">s</span><span class="p">))</span><span class="o">/</span><span class="p">(</span><span class="mf">1.0</span><span class="o">-</span><span class="nb">pow</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="o">-</span><span class="n">s</span><span class="p">))</span>
<span class="c1"># Dictionary associating to each prime the corresponding angle.
</span><span class="n">alpha</span> <span class="o">=</span> <span class="p">{</span> <span class="n">p</span><span class="p">:</span><span class="n">f</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">prime_list</span> <span class="p">}</span>
<span class="c1"># Location of p^infinity in the real plane.
# Rescaled using g above.
# Note: vertex(p^k,s) -> vertex_infinity(p,s) for k -> infinity.
</span><span class="k">def</span> <span class="nf">vertex_infinity</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="n">s</span><span class="p">):</span>
<span class="n">r</span> <span class="o">=</span> <span class="mf">1.0</span><span class="o">/</span><span class="p">(</span><span class="nb">pow</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="n">s</span><span class="p">)</span><span class="o">-</span><span class="mf">1.0</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">alpha</span><span class="p">[</span><span class="n">p</span><span class="p">]</span>
<span class="k">return</span> <span class="p">(</span><span class="n">g</span><span class="p">(</span><span class="n">r</span><span class="p">)</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">a</span><span class="p">),</span><span class="n">g</span><span class="p">(</span><span class="n">r</span><span class="p">)</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
<span class="c1"># Dictionary associating to each prime p the line segment
# from 1 to p^infinity.
# For each n that is coprime with p, we can translate this line
# segment to get the line from n to n*p^infinity.
</span><span class="k">def</span> <span class="nf">rays</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
<span class="k">return</span> <span class="p">{</span> <span class="n">p</span><span class="p">:[(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span><span class="n">vertex_infinity</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="n">s</span><span class="p">)]</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">prime_list</span> <span class="p">}</span>
<span class="c1"># Location of the natural number n in the real plane.
# Rescaled using g above.
# If n = p_1^e_1 * p_2^e_2 * ... * p_k^e_k, then
# vertex(n,s) is the sum of all the vertex(p_i^e_i,s)
# for i from 1 to k.
</span><span class="k">def</span> <span class="nf">vertex</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">s</span><span class="p">):</span>
<span class="n">v</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="n">fac</span> <span class="o">=</span> <span class="n">factorint</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
<span class="k">for</span> <span class="n">p</span><span class="p">,</span><span class="n">k</span> <span class="ow">in</span> <span class="n">fac</span><span class="p">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">p</span> <span class="o"><</span> <span class="n">prime_bound</span><span class="p">:</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">alpha</span><span class="p">[</span><span class="n">p</span><span class="p">]</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">l</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">s</span><span class="p">)</span>
<span class="n">w</span> <span class="o">=</span> <span class="p">(</span><span class="n">g</span><span class="p">(</span><span class="n">r</span><span class="p">)</span><span class="o">*</span><span class="n">cos</span><span class="p">(</span><span class="n">a</span><span class="p">),</span><span class="n">g</span><span class="p">(</span><span class="n">r</span><span class="p">)</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">tuple_add</span><span class="p">(</span><span class="n">v</span><span class="p">,</span><span class="n">w</span><span class="p">)</span>
<span class="k">return</span> <span class="n">v</span>
<span class="c1"># For each n, add the rays from n to n*p^infinity,
# for all primes p coprime to n.
# Note: if p divides n, then we do not have to draw
# the ray from n to n*p^infinity, since it is already
# contained in the ray from m to m*p^infinity for some
# integer m coprime to p.
</span><span class="k">def</span> <span class="nf">add_rays</span><span class="p">(</span><span class="n">collection</span><span class="p">,</span><span class="n">n</span><span class="p">,</span><span class="n">s</span><span class="p">):</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">vertex</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">s</span><span class="p">)</span>
<span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">prime_list</span><span class="p">:</span>
<span class="k">if</span> <span class="n">n</span> <span class="o">%</span> <span class="n">p</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">rays</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="n">ray</span> <span class="o">=</span> <span class="n">r</span><span class="p">[</span><span class="n">p</span><span class="p">]</span>
<span class="n">collection</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">translate</span><span class="p">(</span><span class="n">ray</span><span class="p">,</span><span class="n">v</span><span class="p">))</span>
<span class="k">return</span> <span class="n">collection</span>
</code></pre></div></div>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Thanks to:
# https://stackoverflow.com/a/21357666 (Plotting Line Segments)
# https://ndres.me/post/matplotlib-animated-gifs-easily (Animated GIF)
</span><span class="o">%</span><span class="n">matplotlib</span> <span class="n">inline</span>
<span class="c1"># Removing the line above breaks the code, for some reason.
</span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">from</span> <span class="nn">matplotlib</span> <span class="kn">import</span> <span class="n">collections</span> <span class="k">as</span> <span class="n">mc</span>
<span class="kn">import</span> <span class="nn">imageio</span>
<span class="k">def</span> <span class="nf">big_cell</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
<span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">integer_bound</span><span class="p">):</span> <span class="c1"># add rays flowing out of n
</span> <span class="n">lines</span> <span class="o">=</span> <span class="n">add_rays</span><span class="p">(</span><span class="n">lines</span><span class="p">,</span><span class="n">n</span><span class="p">,</span><span class="n">s</span><span class="p">)</span>
<span class="n">lines_array</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">array</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span>
<span class="n">vertices</span> <span class="o">=</span> <span class="p">[</span><span class="n">vertex</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">s</span><span class="p">)</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">integer_bound</span><span class="p">)]</span> <span class="c1"># coordinates of each integer n
</span> <span class="n">x</span> <span class="o">=</span> <span class="p">[</span> <span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">vertices</span> <span class="p">]</span> <span class="c1"># x-coordinates
</span> <span class="n">y</span> <span class="o">=</span> <span class="p">[</span> <span class="n">v</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">vertices</span> <span class="p">]</span> <span class="c1"># y-coordinates
</span> <span class="n">sizes</span> <span class="o">=</span> <span class="p">[</span><span class="mi">20</span><span class="o">*</span><span class="nb">pow</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="o">-</span><span class="mf">0.6</span><span class="p">)</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">integer_bound</span><span class="p">)]</span> <span class="c1"># size of the red dot for each n
</span>
<span class="n">lc</span> <span class="o">=</span> <span class="n">mc</span><span class="p">.</span><span class="n">LineCollection</span><span class="p">(</span><span class="n">lines_array</span><span class="p">,</span> <span class="n">linewidths</span><span class="o">=</span><span class="mf">0.05</span><span class="p">)</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="p">.</span><span class="n">subplots</span><span class="p">()</span>
<span class="n">ax</span><span class="p">.</span><span class="n">add_collection</span><span class="p">(</span><span class="n">lc</span><span class="p">)</span>
<span class="n">ax</span><span class="p">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">c</span><span class="o">=</span><span class="s">'red'</span><span class="p">,</span><span class="n">s</span><span class="o">=</span><span class="n">sizes</span><span class="p">,</span><span class="n">zorder</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span> <span class="c1"># places the red dots on top
</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">20</span><span class="p">):</span>
<span class="n">ax</span><span class="p">.</span><span class="n">annotate</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">),</span> <span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]),</span><span class="n">color</span><span class="o">=</span><span class="s">'black'</span><span class="p">,</span><span class="n">size</span><span class="o">=</span><span class="mi">20</span><span class="o">*</span><span class="nb">pow</span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="o">-</span><span class="mf">0.5</span><span class="p">),</span><span class="n">zorder</span><span class="o">=</span><span class="mi">11</span><span class="p">)</span>
<span class="n">ax</span><span class="p">.</span><span class="n">autoscale</span><span class="p">()</span>
<span class="n">ax</span><span class="p">.</span><span class="nb">set</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">"s="</span><span class="o">+</span><span class="p">(</span><span class="s">'%.2f'</span> <span class="o">%</span> <span class="n">s</span><span class="p">))</span> <span class="c1"># display value of s
</span>
<span class="n">fig</span><span class="p">.</span><span class="n">canvas</span><span class="p">.</span><span class="n">draw</span><span class="p">()</span> <span class="c1"># draw the canvas, cache the renderer,
</span> <span class="n">image</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">frombuffer</span><span class="p">(</span><span class="n">fig</span><span class="p">.</span><span class="n">canvas</span><span class="p">.</span><span class="n">tostring_rgb</span><span class="p">(),</span> <span class="n">dtype</span><span class="o">=</span><span class="s">'uint8'</span><span class="p">)</span>
<span class="n">image</span> <span class="o">=</span> <span class="n">image</span><span class="p">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">fig</span><span class="p">.</span><span class="n">canvas</span><span class="p">.</span><span class="n">get_width_height</span><span class="p">()[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="mi">3</span><span class="p">,))</span>
<span class="n">plt</span><span class="p">.</span><span class="n">close</span><span class="p">(</span><span class="s">'all'</span><span class="p">)</span>
<span class="k">return</span> <span class="n">image</span>
<span class="n">kwargs_write</span> <span class="o">=</span> <span class="p">{</span><span class="s">'fps'</span><span class="p">:</span><span class="mf">1.0</span><span class="p">,</span> <span class="s">'quantizer'</span><span class="p">:</span><span class="s">'nq'</span><span class="p">}</span>
<span class="c1"># Saves GIF to disk. Choose a file location, a duration of each frame, and the s-value for each frame.
</span><span class="n">imageio</span><span class="p">.</span><span class="n">mimsave</span><span class="p">(</span><span class="s">'~/Desktop/bigcell.gif'</span><span class="p">,</span> <span class="p">[</span><span class="n">big_cell</span><span class="p">(</span><span class="mf">0.05</span><span class="o">*</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">40</span><span class="p">)],</span> <span class="n">duration</span><span class="o">=</span><span class="mf">0.10</span><span class="p">)</span>
</code></pre></div></div>Jens Hemelaerjens.hemelaer@uantwerpen.beLet’s take the natural numbers (without zero) and order them under the division relation. So we completely forget the usual inequality \(\leq\) between natural numbers, and we now say that \(a \leq b\) whenever \(a\) divides \(b\). So \(1\) is the smallest element and we have chains like \(1 \leq 2 \leq 4 \leq 16 \leq \dots\). The result is called the big cell (a terminology first used by John Horton Conway). How can we best visualize this big cell? Let’s make some animated GIFs.Patterns made by the reducible quadratic polynomials modulo n2019-10-04T00:00:00+00:002019-10-04T00:00:00+00:00https://jenshemelaer.com/2019/10/04/reducibles<p>Take a natural number \(n \geq 2\). Then we can create an interesting pattern as follows: we draw a dot with coordinates \((b,c)\) if the polynomial \(x^2+bx+c\) is reducible modulo \(n\). In other words, we draw a dot on \((b,c)\) if we can find natural numbers \(x_1\) and \(x_2\) such that \(b-x_1-x_2\) and \(c-x_1 x_2\) are both divisible by \(n\). This pattern repeats itself vertically and horizontally.</p>
<p>This is the result for \(n=5\):</p>
<p><img src="/images/reducibles-5-25.png" alt="reducibles-5-25" /></p>
<p>And for \(n=7\) we get:</p>
<p><img src="/images/reducibles-7-25.png" alt="reducibles-7-25" /></p>
<p>In both cases, the pattern is repeated 25 times, and Python automatically draws each block in a different color (for the code, scroll down to the end of the post).</p>
<p>Here are the patterns for all numbers \(n\) starting at \(n=2\) and ending with \(n=199\) (with one “block” per pattern). It seems that the prime numbers have the most chaotic patterns…</p>
<div style="display: flex;align-items: center;justify-content: center;flex-wrap: wrap;margin-left: auto;margin-right: auto;width: 100%;">
<figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-2.png" alt="Pattern for n=2" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=2$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-3.png" alt="Pattern for n=3" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=3$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-4.png" alt="Pattern for n=4" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=4$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-5.png" alt="Pattern for n=5" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=5$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-6.png" alt="Pattern for n=6" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=6$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-7.png" alt="Pattern for n=7" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=7$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-8.png" alt="Pattern for n=8" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=8$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-9.png" alt="Pattern for n=9" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=9$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-10.png" alt="Pattern for n=10" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=10$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-11.png" alt="Pattern for n=11" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=11$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-12.png" alt="Pattern for n=12" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=12$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-13.png" alt="Pattern for n=13" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=13$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-14.png" alt="Pattern for n=14" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=14$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-15.png" alt="Pattern for n=15" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=15$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-16.png" alt="Pattern for n=16" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=16$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-17.png" alt="Pattern for n=17" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=17$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-18.png" alt="Pattern for n=18" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=18$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-19.png" alt="Pattern for n=19" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=19$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-20.png" alt="Pattern for n=20" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=20$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-21.png" alt="Pattern for n=21" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=21$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-22.png" alt="Pattern for n=22" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=22$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-23.png" alt="Pattern for n=23" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=23$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-24.png" alt="Pattern for n=24" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=24$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-25.png" alt="Pattern for n=25" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=25$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-26.png" alt="Pattern for n=26" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=26$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-27.png" alt="Pattern for n=27" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=27$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-28.png" alt="Pattern for n=28" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=28$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-29.png" alt="Pattern for n=29" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=29$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-30.png" alt="Pattern for n=30" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=30$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-31.png" alt="Pattern for n=31" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=31$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-32.png" alt="Pattern for n=32" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=32$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-33.png" alt="Pattern for n=33" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=33$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-34.png" alt="Pattern for n=34" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=34$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-35.png" alt="Pattern for n=35" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=35$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-36.png" alt="Pattern for n=36" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=36$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-37.png" alt="Pattern for n=37" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=37$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-38.png" alt="Pattern for n=38" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=38$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-39.png" alt="Pattern for n=39" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=39$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-40.png" alt="Pattern for n=40" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=40$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-41.png" alt="Pattern for n=41" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=41$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-42.png" alt="Pattern for n=42" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=42$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-43.png" alt="Pattern for n=43" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=43$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-44.png" alt="Pattern for n=44" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=44$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-45.png" alt="Pattern for n=45" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=45$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-46.png" alt="Pattern for n=46" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=46$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-47.png" alt="Pattern for n=47" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=47$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-48.png" alt="Pattern for n=48" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=48$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-49.png" alt="Pattern for n=49" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=49$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-50.png" alt="Pattern for n=50" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=50$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-51.png" alt="Pattern for n=51" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=51$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-52.png" alt="Pattern for n=52" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=52$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-53.png" alt="Pattern for n=53" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=53$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-54.png" alt="Pattern for n=54" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=54$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-55.png" alt="Pattern for n=55" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=55$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-56.png" alt="Pattern for n=56" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=56$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-57.png" alt="Pattern for n=57" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=57$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-58.png" alt="Pattern for n=58" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=58$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-59.png" alt="Pattern for n=59" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=59$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-60.png" alt="Pattern for n=60" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=60$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-61.png" alt="Pattern for n=61" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=61$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-62.png" alt="Pattern for n=62" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=62$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-63.png" alt="Pattern for n=63" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=63$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-64.png" alt="Pattern for n=64" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=64$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-65.png" alt="Pattern for n=65" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=65$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-66.png" alt="Pattern for n=66" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=66$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-67.png" alt="Pattern for n=67" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=67$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-68.png" alt="Pattern for n=68" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=68$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-69.png" alt="Pattern for n=69" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=69$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-70.png" alt="Pattern for n=70" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=70$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-71.png" alt="Pattern for n=71" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=71$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-72.png" alt="Pattern for n=72" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=72$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-73.png" alt="Pattern for n=73" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=73$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-74.png" alt="Pattern for n=74" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=74$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-75.png" alt="Pattern for n=75" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=75$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-76.png" alt="Pattern for n=76" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=76$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-77.png" alt="Pattern for n=77" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=77$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-78.png" alt="Pattern for n=78" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=78$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-79.png" alt="Pattern for n=79" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=79$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-80.png" alt="Pattern for n=80" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=80$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-81.png" alt="Pattern for n=81" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=81$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-82.png" alt="Pattern for n=82" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=82$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-83.png" alt="Pattern for n=83" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=83$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-84.png" alt="Pattern for n=84" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=84$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-85.png" alt="Pattern for n=85" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=85$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-86.png" alt="Pattern for n=86" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=86$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-87.png" alt="Pattern for n=87" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=87$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-88.png" alt="Pattern for n=88" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=88$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-89.png" alt="Pattern for n=89" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=89$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-90.png" alt="Pattern for n=90" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=90$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-91.png" alt="Pattern for n=91" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=91$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-92.png" alt="Pattern for n=92" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=92$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-93.png" alt="Pattern for n=93" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=93$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-94.png" alt="Pattern for n=94" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=94$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-95.png" alt="Pattern for n=95" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=95$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-96.png" alt="Pattern for n=96" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=96$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-97.png" alt="Pattern for n=97" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=97$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-98.png" alt="Pattern for n=98" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=98$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-99.png" alt="Pattern for n=99" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=99$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-100.png" alt="Pattern for n=100" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=100$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-101.png" alt="Pattern for n=101" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=101$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-102.png" alt="Pattern for n=102" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=102$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-103.png" alt="Pattern for n=103" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=103$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-104.png" alt="Pattern for n=104" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=104$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-105.png" alt="Pattern for n=105" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=105$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-106.png" alt="Pattern for n=106" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=106$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-107.png" alt="Pattern for n=107" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=107$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-108.png" alt="Pattern for n=108" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=108$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-109.png" alt="Pattern for n=109" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=109$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-110.png" alt="Pattern for n=110" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=110$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-111.png" alt="Pattern for n=111" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=111$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-112.png" alt="Pattern for n=112" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=112$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-113.png" alt="Pattern for n=113" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=113$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-114.png" alt="Pattern for n=114" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=114$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-115.png" alt="Pattern for n=115" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=115$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-116.png" alt="Pattern for n=116" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=116$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-117.png" alt="Pattern for n=117" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=117$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-118.png" alt="Pattern for n=118" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=118$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-119.png" alt="Pattern for n=119" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=119$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-120.png" alt="Pattern for n=120" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=120$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-121.png" alt="Pattern for n=121" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=121$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-122.png" alt="Pattern for n=122" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=122$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-123.png" alt="Pattern for n=123" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=123$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-124.png" alt="Pattern for n=124" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=124$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-125.png" alt="Pattern for n=125" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=125$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-126.png" alt="Pattern for n=126" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=126$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-127.png" alt="Pattern for n=127" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=127$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-128.png" alt="Pattern for n=128" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=128$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-129.png" alt="Pattern for n=129" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=129$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-130.png" alt="Pattern for n=130" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=130$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-131.png" alt="Pattern for n=131" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=131$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-132.png" alt="Pattern for n=132" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=132$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-133.png" alt="Pattern for n=133" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=133$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-134.png" alt="Pattern for n=134" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=134$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-135.png" alt="Pattern for n=135" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=135$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-136.png" alt="Pattern for n=136" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=136$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-137.png" alt="Pattern for n=137" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=137$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-138.png" alt="Pattern for n=138" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=138$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-139.png" alt="Pattern for n=139" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=139$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-140.png" alt="Pattern for n=140" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=140$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-141.png" alt="Pattern for n=141" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=141$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-142.png" alt="Pattern for n=142" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=142$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-143.png" alt="Pattern for n=143" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=143$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-144.png" alt="Pattern for n=144" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=144$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-145.png" alt="Pattern for n=145" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=145$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-146.png" alt="Pattern for n=146" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=146$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-147.png" alt="Pattern for n=147" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=147$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-148.png" alt="Pattern for n=148" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=148$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-149.png" alt="Pattern for n=149" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=149$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-150.png" alt="Pattern for n=150" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=150$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-151.png" alt="Pattern for n=151" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=151$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-152.png" alt="Pattern for n=152" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=152$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-153.png" alt="Pattern for n=153" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=153$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-154.png" alt="Pattern for n=154" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=154$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-155.png" alt="Pattern for n=155" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=155$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-156.png" alt="Pattern for n=156" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=156$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-157.png" alt="Pattern for n=157" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=157$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-158.png" alt="Pattern for n=158" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=158$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-159.png" alt="Pattern for n=159" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=159$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-160.png" alt="Pattern for n=160" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=160$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-161.png" alt="Pattern for n=161" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=161$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-162.png" alt="Pattern for n=162" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=162$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-163.png" alt="Pattern for n=163" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=163$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-164.png" alt="Pattern for n=164" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=164$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-165.png" alt="Pattern for n=165" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=165$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-166.png" alt="Pattern for n=166" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=166$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-167.png" alt="Pattern for n=167" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=167$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-168.png" alt="Pattern for n=168" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=168$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-169.png" alt="Pattern for n=169" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=169$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-170.png" alt="Pattern for n=170" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=170$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-171.png" alt="Pattern for n=171" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=171$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-172.png" alt="Pattern for n=172" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=172$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-173.png" alt="Pattern for n=173" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=173$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-174.png" alt="Pattern for n=174" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=174$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-175.png" alt="Pattern for n=175" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=175$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-176.png" alt="Pattern for n=176" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=176$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-177.png" alt="Pattern for n=177" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=177$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-178.png" alt="Pattern for n=178" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=178$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-179.png" alt="Pattern for n=179" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=179$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-180.png" alt="Pattern for n=180" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=180$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-181.png" alt="Pattern for n=181" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=181$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-182.png" alt="Pattern for n=182" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=182$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-183.png" alt="Pattern for n=183" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=183$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-184.png" alt="Pattern for n=184" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=184$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-185.png" alt="Pattern for n=185" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=185$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-186.png" alt="Pattern for n=186" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=186$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-187.png" alt="Pattern for n=187" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=187$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-188.png" alt="Pattern for n=188" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=188$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-189.png" alt="Pattern for n=189" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=189$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-190.png" alt="Pattern for n=190" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=190$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-191.png" alt="Pattern for n=191" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=191$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-192.png" alt="Pattern for n=192" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=192$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-193.png" alt="Pattern for n=193" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=193$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-194.png" alt="Pattern for n=194" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=194$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-195.png" alt="Pattern for n=195" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=195$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-196.png" alt="Pattern for n=196" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=196$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-197.png" alt="Pattern for n=197" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=197$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-198.png" alt="Pattern for n=198" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=198$$</figcaption></figure> <figure style="margin-top:0px;margin-bottom:0px;"><img src="/images/reducibles-199.png" alt="Pattern for n=199" width="144" style="vertical-align: middle;" /><figcaption style="line-height:0px;margin-top:-20px;margin-bottom:0px;">$$n=199$$</figcaption></figure>
</div>
<p>And here is the Python code. I run this inside a <a href="https://jupyter.org/">Jupyter notebook</a>.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">%</span><span class="n">matplotlib</span> <span class="n">inline</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">product</span>
<span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">200</span><span class="p">):</span>
<span class="n">N1</span><span class="o">=</span><span class="mi">1</span> <span class="c1"># number of times the pattern is repeated horizontally
</span> <span class="n">N2</span><span class="o">=</span><span class="mi">1</span> <span class="c1"># number of times the pattern is repeated vertically
</span> <span class="n">numberofdots</span> <span class="o">=</span> <span class="n">N1</span><span class="o">*</span><span class="n">N2</span><span class="o">*</span><span class="p">(</span><span class="n">n</span><span class="o">*</span><span class="n">n</span> <span class="o">+</span> <span class="n">n</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span> <span class="c1"># estimate (!) of number of dots
</span> <span class="n">d</span> <span class="o">=</span> <span class="mf">1.1</span>
<span class="n">s0</span> <span class="o">=</span> <span class="mf">10000.0</span><span class="o">/</span><span class="nb">pow</span><span class="p">(</span><span class="n">numberofdots</span><span class="p">,</span><span class="n">d</span><span class="p">)</span> <span class="c1"># area of each dot should decrease for larger number of dots
</span> <span class="n">l</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">))</span> <span class="c1"># list of numbers modulo p
</span>
<span class="n">b_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">x_1</span><span class="o">+</span><span class="n">x_2</span> <span class="k">for</span> <span class="n">x_1</span><span class="p">,</span><span class="n">x_2</span> <span class="ow">in</span> <span class="n">product</span><span class="p">(</span><span class="n">l</span><span class="p">,</span><span class="n">l</span><span class="p">)]</span> <span class="c1"># b-coefficients of reducible polynomials
</span> <span class="n">c_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">x_1</span><span class="o">*</span><span class="n">x_2</span> <span class="k">for</span> <span class="n">x_1</span><span class="p">,</span><span class="n">x_2</span> <span class="ow">in</span> <span class="n">product</span><span class="p">(</span><span class="n">l</span><span class="p">,</span><span class="n">l</span><span class="p">)]</span> <span class="c1"># c-coefficients of reducible polynomials
</span>
<span class="c1"># convert to numpy arrays
</span> <span class="n">b</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">b_list</span><span class="p">)</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">c_list</span><span class="p">)</span>
<span class="c1"># plot layout
</span> <span class="n">axes</span> <span class="o">=</span> <span class="n">plt</span><span class="p">.</span><span class="n">gca</span><span class="p">()</span>
<span class="n">axes</span><span class="p">.</span><span class="n">set_aspect</span><span class="p">(</span><span class="s">'equal'</span><span class="p">,</span><span class="s">'box'</span><span class="p">)</span>
<span class="n">axes</span><span class="p">.</span><span class="n">set_xlim</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span><span class="n">N1</span><span class="o">*</span><span class="n">n</span><span class="p">])</span>
<span class="n">axes</span><span class="p">.</span><span class="n">set_ylim</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span><span class="n">N2</span><span class="o">*</span><span class="n">n</span><span class="p">])</span>
<span class="n">plt</span><span class="p">.</span><span class="n">xticks</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span><span class="n">n</span><span class="p">])</span>
<span class="n">plt</span><span class="p">.</span><span class="n">yticks</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span><span class="n">n</span><span class="p">])</span>
<span class="c1"># scatter plotting all dots, each with the correct size
</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N1</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N2</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span>
<span class="n">plt</span><span class="p">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">n</span><span class="o">*</span><span class="n">i</span> <span class="o">+</span> <span class="n">b</span> <span class="o">%</span> <span class="n">n</span><span class="p">,</span> <span class="n">n</span><span class="o">*</span><span class="n">j</span> <span class="o">+</span> <span class="n">c</span> <span class="o">%</span> <span class="n">n</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="n">s0</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">show</span><span class="p">()</span>
</code></pre></div></div>
<p>To estimate the number of dots in each “block” of the pattern, I use the formula \((n^2+n)/2\). This is the exact number of dots if \(n\) is a prime number, but an overestimate otherwise. As a result, the patterns for prime numbers are more “dense”.</p>
<p>The number of dots per block for the first few patterns are 3,6,8,15,18 and 28 (you can count them in the images above). So we search for “3,6,8,15,18,28” in <a href="https://oeis.org">The On-Line Encyclopedia of Integer Sequences (OEIS)</a>. The sequence that we need is <a href="https://oeis.org/A261928">Sequence A261928</a>. We could use this to “repair” the estimate in the code, but I don’t think that would make the pictures more interesting.</p>Jens Hemelaerjens.hemelaer@uantwerpen.beTake a natural number \(n \geq 2\). Then we can create an interesting pattern as follows: we draw a dot with coordinates \((b,c)\) if the polynomial \(x^2+bx+c\) is reducible modulo \(n\). In other words, we draw a dot on \((b,c)\) if we can find natural numbers \(x_1\) and \(x_2\) such that \(b-x_1-x_2\) and \(c-x_1 x_2\) are both divisible by \(n\). This pattern repeats itself vertically and horizontally.