Jekyll2023-09-20T01:54:55-05:00https://benjamin-hackl.at/Benjamin HacklI am a mathematician currently employed at the University of Klagenfurt. This is my personal web space.New talk at AofA22, and a note on typesetting math with reveal.js2022-06-20T00:00:00-05:002022-06-20T00:00:00-05:00https://benjamin-hackl.at/blog/2022/06/AofA22-revealjs-and-latex<p>I had the pleasure of presenting recent joint work with <a href="http://info.tuwien.ac.at/panholzer/">Alois Panholzer</a> and <a href="https://katalog.uu.se/profile/?id=N19-23">Stephan Wagner</a> on the analysis of a stochastic process involving <a href="https://drops.dagstuhl.de/opus/volltexte/2022/16096">iteratively uncovering</a> the vertices and edges of labeled trees at <a href="https://www.math.aau.at/AofA2022/">AofA22</a>.</p> <p>While preparing the slides for my talk (see embed below), I stumbled over an interesting solution for a problem that has somewhat haunted me while using <a href="https://revealjs.com">reveal.js</a>, namely the missing ability to make parts of typeset math into <em>fragments</em> (which means that these parts can be faded in separately, think <code>\pause</code> in LaTeX-beamer).</p> <div> <div style="position:relative;padding-top:56.25%;"> <iframe style="position: absolute; top:0; left:0; width:100%; height:100%;" frameborder="0" src="/downloads/talks/2022-06-20-AofA22/index.html"> <p>Visit the slides <a href="/downloads/talks/2022-06-20-AofA22/">directly here</a> in case this embed does not load for you.</p> </iframe> </div> </div> <p>The solution I applied has been provided in <a href="https://github.com/hakimel/reveal.js/issues/1365">this GitHub issue</a>, with a working (recent) version of the proposal in the files provided in <a href="https://github.com/hakimel/reveal.js/issues/1365#issuecomment-727893637">this comment</a> by <a href="https://github.com/manuelbb-upb">@manuelbb-upb</a>. With the updated <code>math.js</code> provided there, reveal.js’ MathJaX plugin is extended (among other things) with a <code>\fragment{&lt;fragment-index&gt;}{&lt;fragment-content&gt;}</code> command that can be used like</p> <pre><code>$x^2 \fragment{1}{ + y^2} \fragment{2}{= z^2}$ </code></pre> <p>to produce a typeset equation that will be gradually uncovered to first show $x^2$, then $x^2 + y^2$, and then the full $x^2 + y^2 = z^2$.</p> <p>Unfortunately the order does not seem to combine well with nodes with set <code>data-fragment-index</code> outside of the math environment, but it is still nice to be able to use at least some <em>fragment-magic</em> in typeset math.</p>I had the pleasure of presenting recent joint work with Alois Panholzer and Stephan Wagner on the analysis of a stochastic process involving iteratively uncovering the vertices and edges of labeled trees at AofA22.From rolling dice to differential equations: a discussion of four generating function problems2022-06-03T05:00:00-05:002022-06-03T05:00:00-05:00https://benjamin-hackl.at/blog/2022/06/generating-functions-3b1b<p>In this <del>video</del> blog post, I want to discuss the four exercises that 3blue1brown left at the end of his latest video, plus some additional background and context from the point of view of someone who works with generating functions a lot.</p> <p><strong>Note:</strong> This article is, in a sense, the written counterpart to the <em>manimated</em> video I have produced for <a href="https://youtube.com/benjaminhackl">my YouTube channel</a>. Feel free to check it out and leave a like in case you enjoyed it or found it helpful! :-)</p> <div style="margin-bottom: 1em; max-width: 800px;"> <div class="embed-container"> <iframe src="https://www.youtube.com/embed/9SzwfM-S9sk" frameborder="0" allow="accelerometer; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe> </div> </div> <p>At the end of 3blue1brown’s <a href="https://youtu.be/bOXCLR3Wric">recent video on an innocent looking enumeration problem</a> (which I highly recommend watching), he left four exercise problems. I do <em>a lot</em> with generating functions in my mathematical life, so I thought it would be a fun idea to discuss these four problems from my point of view – and I’ll also throw in some bonus material on top.</p> <p>Before we jump into the problems, let me recommend some more literature: aside from <a href="https://books.google.com/books?id=XOPMBQAAQBAJ">Herbert Wilf’s <em>Generatingfunctionology</em></a> which Grant recommended in his video, I would also like to add to add <a href="https://books.google.com/books?id=pntQAAAAMAAJ"><em>Concrete Mathematics</em> by Graham, Knuth, and Patashnik</a> because I really like both the way how the book is written in general, as well as their approach of introducing generating functions in particular. And if you would like to see how the theory around generating functions can be developed further in a more analytical direction, I also want to recommend my favourite advanced book on that topic; the “purple bible”: <a href="http://algo.inria.fr/flajolet/Publications/book.pdf"><em>Analytic Combinatorics</em> by Flajolet and Sedgewick</a>. If there is interest – let me know in the YouTube comments below my video! – I’ll talk a bit more about the very powerful, systematic approach to counting with generating functions described there in a future video.</p> <p>Now, with that out of the way, let us discuss the four problems.</p> <hr /> <h2 id="problem-1-the-generating-function-and-the-expected-value">Problem 1: The Generating Function and the Expected Value</h2> <p><strong>Problem statement:</strong> Take the derivative of both sides of $\frac{1}{1-x} = \sum_{n\geq 0} x^n.$ How can you use this to compute the expected number of times you have to roll a fair six-sided die before seeing the number 1?</p> <p><strong>Solution:</strong> The instructions from the first part of the problem are a bit clearer if we take a look at the second part of the problem, the one about the expected value, first: to determine the expected number of times we have to roll the die until we roll 1, we need to think about probabilities: We have a probability of $1/6$ to roll 1 with our first throw, in which case we had to wait for 0 throws before. Otherwise we rolled a non-1 (which happened with a probability of $5/6$) and now have to roll the die again. With a probability of $1/6$ we roll the 1 in our second attempt (which means we had to wait for 1 throw before), and with a probability of $5/6$ we – again – fail to get 1.</p> <p style="text-align: center;"> <img src="/assets/img/2022-06/throw-diagram.webp" alt="State diagram of throws" style="max-width: 750px; height: auto; width: 100%;" /> </p> <p>With the help of this diagram it is also not too hard to see that in general, the probability that we have to wait $n$ times before rolling 1 for the first time is $(5/6)^n \cdot (1/6)$.</p> <p>To find the expected number of throws we have to wait for from there, we sum over all possible events (0 rolls before; 1 roll before; 2 rolls before, …) and multiply the number of times we had to wait with the corresponding probability. The sum we want to evaluate therefore is</p> <p>\begin{aligned} \mathbb{E} &amp;= 0\cdot \frac{1}{6} + 1\cdot \frac{5}{6} \cdot \frac{1}{6} + 2 \cdot \bigg(\frac{5}{6}\bigg)^2 \frac{1}{6} + \cdots \\ &amp; = \sum_{n\geq 0} n \cdot \bigg(\frac{5}{6}\bigg)^n \cdot \frac{1}{6}\\ &amp; = \frac{1}{6} \sum_{n\geq 0} n \cdot \bigg(\frac{5}{6}\bigg)^n. \end{aligned}</p> <p>This is as far as we can get at this point; let us now turn to the more “mechanical” part of the problem (taking derivatives) and then we will see how to combine the two parts.</p> <p>Let me add some bonus content though: the sum on the right is a so-called <em>geometric series</em>, and from an analytic point of view it holds for all real (or complex) $x$ with absolute value less than 1. The identity can be derived directly, let us take a look: let $S_n = 1 + x + x^2 + \cdots + x^n$ denote the geometric sum of the terms from $1$ to $x^n$. Simply multiplying both sides with $x$ yields $x S_n = x + x^2 + x^3 + \cdots + x^{n+1},$ a sum which shares almost all of its summands with the <em>original</em> $S_n$. And so, if we subtract $x S_n$ from $S_n$, we find \begin{aligned} S_n - x S_n &amp;= (1 + x + x^2 + \cdots + x^n) - (x + x^2 + \cdots + x^{n+1}) \\ &amp;= 1 - x^{n + 1} \end{aligned} If we factor out $S_n$ on the left-hand side, we are left with $S_n (1 - x) = 1 - x^{n+1}$, or, as long as $x\neq 1$, $S_n = \frac{1 - x^{n+1}}{1 - x}.$ If we consider what happens when $n$ grows large (<em>tends to infinity</em>), then as long as $|x| &lt; 1$, the term $x^{n+1}$ will tend to $0$. Everything else on the right-hand side does not depend on $n$, and such we have proved the identity for the geometric series, $1 + x + x^2 + x^3 + \cdots = \frac{1}{1 - x}.$ A technical thing to note: given that we are differentiating an identity; in particular, something that holds in an entire neighborhood of $x = 0$ and not just for one particular value of $x$, we are allowed to take the derivative on both sides and we will obtain a valid equation again.</p> <p>Differentiating the left-hand side gives (using the chain rule and the power rule): $\frac{\partial\,}{\partial x} \frac{1}{1 - x} = \frac{\partial\,}{\partial x} (1 - x)^{-1} = (-1)\cdot (1 - x)^{-2} \cdot (-1) = \frac{1}{(1 - x)^2},$ and differentiating the right-hand side yields (by moving the derivative inside of the sum and then applying the power rule) $\frac{\partial\,}{\partial x} \sum_{n\geq 0} x^n = \sum_{n\geq 0} \frac{\partial\,}{\partial x} x^n = \sum_{n\geq 0} n x^{n-1}.$ Combining the two sides then gives us the useful identity $\frac{1}{(1 - x)^2} = \sum_{n\geq 0} n x^{n - 1},$ which looks (unsurprisingly) familiar: if we multiply both sides with $x$ we arrive at $\frac{x}{(1 - x)^2} = \sum_{n\geq 0} n x^n,$ which helps us to evaluate the sum for the expected value $\mathbb{E}$ that we derived above: setting $x = 5/6$ gives, when reading from right to left, $\sum_{n\geq 0} n \cdot \bigg(\frac{5}{6}\bigg)^n = \frac{5/6}{(1 - 5/6)^2} = 30,$ and therefore we find that there are $\mathbb{E} = \frac{1}{6} \cdot 30 = 5$ expected throws before we roll a 1 with a fair die.</p> <p>Final note before we move on: the probability distribution that the number of throws before we hit 1 follows is the so-called <em>geometric distribution</em> (named like that because its probabilities form a <em>geometric sequence</em>).</p> <hr /> <h2 id="problem-2-a-binomial-sum">Problem 2: A binomial sum</h2> <p><strong>Problem statement:</strong> Compute the sum $\sum_{k=0}^n \binom{n}{k} 2^k.$</p> <p><strong>Solution:</strong> This is a problem that I personally like a lot, and I will share some bonus material about it after discussing the solution. To solve this with the <em>generating function approach</em>, we make use of the binomial theorem, which states that for any non-negative integer $n$ and numbers $a$ and $b$ we have $(a + b)^n = \sum_{k=0}^{n} \binom{n}{k} a^k b^{n - k}.$ Observe that if we set $a = x$, and $b = 1$, that we find $(x + 1)^n = \sum_{k=0}^{n} \binom{n}{k} x^k.$ The right-hand side here already resembles the sum from the problem statement a lot, all that remains to do is to set $x = 2$ and the equation reads, from right to left, $\sum_{k=0}^{n} \binom{n}{k} 2^k = (2 + 1)^n = 3^n.$</p> <h5 id="bonus-material-an-alternative-explanation">Bonus material: an alternative explanation</h5> <p>Identities like these are usually also an invitation to think about a more direct, combinatorial explanation. And it is not too hard to find one here: both sides of the equation $\sum_{k=0}^n \binom{n}{k} 2^k = 3^n$ express the number of possible colourings of the numbers from $1$ to $n$ with three colors (say red, green, blue):</p> <ul> <li>To arrive at the right-hand side, we go through all of the numbers one by one and pick one of the three possible colors for each of them. There are $n$ numbers with $3$ choices each, and therefore there are $3^n$ possible choices.</li> <li>And to obtain the left-hand side we first decide that $k$ of the numbers should either be red <em>or</em> green, then we choose these $k$ numbers in one of the $\binom{n}{k}$ possible ways, and decide for each of them whether it is red or green ($2$ choices for each of the $k$ numbers, thus $2^k$ possible choices). The remaining $n-k$ numbers that were not chosen are colored blue. For some specific $k$ we thus find $\binom{n}{k} 2^k$ possible colourings, and in order to obtain all possible colourings we have to sum over all possible values of $k$, from $k=0$ to $k=n$.</li> </ul> <p>The fact that these two strategies with their corresponding counts both yield all possible colourings of the numbers from $1$ to $n$ with three colors proves that the identity holds. (In combinatorics, this sort of argument is usually referred to as <em>double counting</em>.)</p> <hr /> <h2 id="problem-3-fibonacci-numbers-and-a-differential-equation">Problem 3: Fibonacci numbers and a differential equation</h2> <p><strong>Problem statement:</strong> Let $f_n$ be the $n$-th Fibonacci number and consider the generating function $F(x) = \sum_{n\geq 0} f_n \frac{x^n}{n!}.$ Explain why the differential equation $F^{\prime\prime}(x) = F’(x) + F(x)$ is true. For bonus points, solve this equation and use it to find a closed-form expression for $f_n$.</p> <p><strong>Solution:</strong> To find an explanation for the differential equation, we first investigate what happens if we differentiate a generating function of this particular shape; this is completely independent of $f_n$ being a Fibonacci number.</p> <p>A generating function with the particular shape of $F(x)$, i.e., with the $n$-th coefficient being normalized by $n!$, is called exponential generating function. This is because the exponential function, as you might know, has the series expansion $e^x = 1 + x + \frac{x^2}{2} + \frac{x^3}{6} + \cdots = \sum_{n\geq 0} 1\cdot \frac{x^n}{n!},$ that is, $e^x$ is the exponential generating function of the constant 1-sequence.</p> <p>For the derivative of $F(x)$, we find \begin{aligned} F’(x) &amp;= \frac{\partial\,}{\partial x} \sum_{n\geq 0} f_n \frac{x^n}{n!} \\ &amp;= \sum_{n\geq 0} \frac{\partial\,}{\partial x} f_n \frac{x^n}{n!} \\ &amp;= \sum_{n\geq 0} f_n \frac{n x^{n-1}}{n!} \\ &amp;= \sum_{n\geq 1} f_n \frac{x^{n-1}}{(n-1)!} \\ &amp;= \sum_{n\geq 0} f_{n+1} \frac{x^n}{n!}. \end{aligned} In other words, if $F(x)$ is the exponential generating function of the sequence $f_0, f_1, f_2, \dots$, then $F’(x)$ is the exponential generating function of the shifted sequence $f_1, f_2, f_3, \dots$ – and we can simply apply the same argument again to see that the second derivative then is the exponential generating function of $f_2, f_3, f_4, \dots$. This is one of the most useful properties of exponential generating functions.</p> <p>Now, back to our concrete situation where $f_n$ is the $n$-th Fibonacci number. By using the corresponding <em>Fibonacci recurrence</em>, $f_{n+2} = f_{n+1} + f_{n}$, we obtain \begin{aligned} F^{\prime\prime}(x) &amp;= \sum_{n\geq 0} f_{n+2} \frac{x^n}{n!} = \sum_{n\geq 0} (f_{n+1} + f_{n}) \frac{x^n}{n!}\\ &amp;= \sum_{n\geq 0} f_{n+1} \frac{x^n}{n!} + \sum_{n\geq 0} f_n \frac{x^n}{n!}\\ &amp;= F’(x) + F(x), \end{aligned} the differential equation we were asked to explain!</p> <p>In general, this is a problem for which generating functions are very useful for, recurrences for sequences can often be translated into functional equations of their corresponding generating functions; and with a bit of luck, these equations can be solved to then give explicit formulas for the elements in the sequence. A very neat trick!</p> <p>We also want to get full points from Grant, so let us solve the differential equation: without going into too much detail why this works, we use the Ansatz $F(x) = e^{\lambda x}$ (which means that we assume that the solution has a certain shape – you could say that we are just making an educated guess and then see how far we can take it), where $\lambda$ is a constant. Plugging it into the differential equation and bringing everything to one side gives $\lambda^2 e^{\lambda x} - \lambda e^{\lambda x} - e^{\lambda x} = 0.$ Now, because $e^{\lambda x}$ is never zero we may conclude that if our Ansatz should work, the equation $\lambda^2 - \lambda - 1 = 0$ has to hold – and indeed, we find that $\lambda_+ = \frac{1 + \sqrt{5}}{2}, \quad \lambda_- = \frac{1 - \sqrt{5}}{2}$ are solutions to the quadratic equation (and at this point we, obligatorily, have to point out that $\lambda_+$ is “coincidentally” $\varphi$, the golden ratio).</p> <p>You can convince yourself that we actually just found <em>some</em> solutions to the differential equation, both $x\mapsto e^{\lambda_+ x}$ as well as $x\mapsto e^{\lambda_- x}$ satisfy $F^{\prime\prime}(x) = F’(x) + F(x)$ – and so does a <em>linear combination</em> of the two, $x\mapsto c_+ e^{\lambda_+ x} + c_- e^{\lambda_- x}$ for constants $c_-$ and $c_+$; plug the functions into the differential equation and you will see that it all works out.</p> <p>However, we are not looking for <em>any</em> solution to the differential equation, we are looking for a fairly specific one: the solution should be the generating function for Fibonacci numbers, after all! To nail down the particular solution we are looking for, we have to use some information of the generating function – for example, that we want to have $F(0) = f_0 = 0$, the $0$-th Fibonacci number, and the derivative as the generating function of the shifted sequence should satisfy $F’(0) = f_1 = 1$.</p> <p>Plugging these conditions into the <em>general</em> solution, $F(x) = c_+ e^{\lambda_+ x} + c_- e^{\lambda_- x}$ translates to the equations $c_+ + c_- = 0$, and $c_+ \lambda_+ + c_- \lambda_- = 1$. Plugging $c_- = - c_+$ (from the first equation) into the second one yields $1 = c_+ \lambda_+ - c_+ \lambda_- = c_+ (\lambda_+ - \lambda_-),$ and a straightforward computation gives $\lambda_+ - \lambda_- = \sqrt{5}$ so that we arrive at $c_+ = 1/\sqrt{5}$ and $c_- = -1\sqrt{5}$.</p> <p>Overall, this implies $F(x) = \frac{1}{\sqrt{5}} e^{\lambda_+ x} - \frac{1}{\sqrt{5}} e^{\lambda_- x},$ and the explicit formula for $f_n$ can now be obtained by rewriting the exponential functions into their series representation, \begin{aligned} F(x) &amp;= \frac{1}{\sqrt{5}} \sum_{n\geq 0} \lambda_+^n \frac{x^n}{n!} - \frac{1}{\sqrt{5}} \sum_{n\geq 0} \lambda_-^n \frac{x^n}{n!} \\ &amp;= \sum_{n\geq 0} \frac{1}{\sqrt{5}} (\lambda_+^n - \lambda_-^n) \frac{x^n}{n!}. \end{aligned} This proves Binet’s explicit formula for the $n$-th Fibonacci number: $f_n = \frac{1}{\sqrt{5}} \bigg(\bigg(\frac{1 + \sqrt{5}}{2}\bigg)^n - \bigg(\frac{1 - \sqrt{5}}{2}\bigg)^n\bigg).$</p> <hr /> <h2 id="problem-4-a-useful-product">Problem 4: A useful product</h2> <p><strong>Problem statement:</strong> Suppose $f(x) = \sum_{n\geq 0} a_n x^n$. What do the coefficients of $\frac{f(x)}{1 - x}$ tell you?</p> <p><strong>Solution:</strong> This final problem is a bit shorter again, but invites us to prove a very useful sequence construction with many applications: for example, one can use this in the average case analysis of Quicksort (and if that has made you curious, let me know; I might discuss this in a future video … :-) ).</p> <p>Here is how we can tackle this: \begin{aligned} \frac{f(x)}{1 - x} &amp;= \frac{1}{1-x} \sum_{\ell\geq 0} a_{\ell} x^{\ell} = \sum_{\ell\geq 0} a_{\ell} \frac{x^{\ell}}{1 - x}\\ &amp;= \sum_{\ell\geq 0} a_{\ell} x^{\ell} (1 + x + x^2 + \cdots) \\ &amp;= \sum_{\ell\geq 0} a_{\ell} (x^{\ell} + x^{\ell+1} + x^{\ell+2} + \cdots) \\ &amp;= \sum_{\ell\geq 0} a_{\ell} \sum_{n\geq \ell} x^{n}. \end{aligned} The trick to make this expression nicer is to change the order of summation. The following image should help to visualize the situation:</p> <p style="text-align: center;"> <img src="/assets/img/2022-06/order-summation.webp" alt="Visualization of order of summation" style="max-width: 450px; height: auto; width: 100%;" /> </p> <p>In the grid, every cell corresponds to one summand. In the original sum, we first iterate over the columns ($\ell\geq 0$), and then sum over all cells once we have passed a certain threshold ($n \geq \ell$). If we change the order of summation, we first iterate over the rows ($n \geq 0$), and then over all cells <strong>up to</strong> a certain column threshold ($0\leq \ell\leq n$).</p> <p>Practically, this means that we rewrite $\sum_{\ell\geq 0} a_{\ell} \sum_{n\geq \ell} x^{n} = \sum_{n\geq 0} \bigg(\sum_{\ell = 0}^{n} a_{\ell} \bigg) x^{n},$ or alternatively, in the expanded form, $a_0 (1 + x + x^2 + x^3 + \cdots) + a_1 (x + x^2 + x^3 + \cdots) + a_2 (x^2 + x^3 + \cdots) + a_3 (x^3 + \cdots) + \cdots$ becomes $a_0 + (a_0 + a_1)x + (a_0 + a_1 + a_2)x^2 + (a_0 + a_1 + a_2 + a_3)x^3 + \cdots.$ This representation allows us to read off the coefficients of $f(x)/(1-x)$: if $f(x)$ is the generating function with coefficient sequence $a_0, a_1, a_2, \dots$, then $f(x)/(1-x)$ has coefficient sequence $a_0, a_0 + a_1, a_0 + a_1 + a_2, a_0 + a_1 + a_2 + a_3, \dots,$ that is, partial sums of the original sequence.</p> <hr /> <p>And this concludes the discussion of the solutions of the four problems. Let me know <a href="https://youtu.be/9SzwfM-S9sk">in the YouTube comments</a>: did you find this helpful? Are you curious about more generating function “magic”?</p> <p>Thank you very much for <del>watching</del> reading, and see you in the next <del>video</del> blog post!</p>In this video blog post, I want to discuss the four exercises that 3blue1brown left at the end of his latest video, plus some additional background and context from the point of view of someone who works with generating functions a lot.Manim on a Raspberry Pi2022-05-10T05:00:00-05:002022-05-10T05:00:00-05:00https://benjamin-hackl.at/blog/2022/05/manim-raspberry<p>Due to one of the libraries that Manim depends on (<a href="https://pypi.org/project/skia-pathops/"><code>skia-pathops</code></a>) not specifically supporting the architecture of Raspberry Pi, trying to install <code>manim</code> might lead to an error that reads along the lines of this:</p> <pre><code>Traceback (most recent call last): File "bin/fetch-gn", line 26, in &lt;module&gt; cpu = {'amd64': 'amd64', 'arm64': 'arm64', 'x86_64': 'amd64'}[platform.machine().lower()] KeyError: 'armv7l' &lt;...&gt; Command "/usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-_vcb3idb/skia-pathops/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-ziy4l3qx/install-record.txt --single-version-externally-managed --compile --user --prefix=" failed with error code 1 in /tmp/pip-install-_vcb3idb/skia-pathops/ </code></pre> <p>This is a problem outside of Manim, and can only be fully resolved when (if?) the maintainers of <code>skia-pathops</code> explicitly add support for other architectures. While this is unsatisfactory, there is little we (from the Manim community) can do about it directly. There is, however, a compromise: it is possible to install a version of the library which marks <code>skia-pathops</code> as an optional dependency. Assuming that the <code>pip</code> executable is linked to the appropriate Python 3.7+ installation (you might need to call, e.g., <code>pip3</code> instead) you can install the patched version by running</p> <pre><code>pip install git+https://github.com/behackl/manim@optional-pathops </code></pre> <p>instead of the usual <code>pip install manim</code>. With this version, if <code>skia-pathops</code> is unavailable, the classes in <a href="https://docs.manim.community/en/stable/reference/manim.mobject.geometry.boolean_ops.html">Manim’s <code>boolean_ops</code> module</a> will not be available (which you should also be notified of via a logged warning whenever you <code>import manim</code>).</p> <p>In case the installation of the patched version fails with a mention of a non-existing <code>setup.py</code> file, make sure to use a reasonably recent version of Python (3.7 and up), and make sure you are using an up-to-date version of <code>pip</code> by running <code>pip install -U pip</code>.</p> <p>Please note: this patched version was fabricated based on some commit on the development branch after the release of <code>v0.15.2</code> (in May 2022). If you need a different version, take a look at the changes I have made to <code>pyproject.toml</code> and <code>manim/__init__.py</code> in <a href="https://github.com/behackl/manim/commit/859deb56ff7d2e82ae08bf699c372d50e7a74e4d">this commit</a> and apply them to whichever version you require. The lockfile can be regenerated via <code>poetry lock</code>.</p> <p>If you feel particularly adventurous and would like to try to build Skia and the corresponding Python bindings fully yourself, check out <a href="https://gist.github.com/naveen521kk/8cce2ba129312cf38f4451d6d10d61ad">these (theoretical) instructions</a>; try at your own risk!</p> <p>In case anything about the incompatibility of <code>skia-pathops</code> changes, I’ll try to update this post accordingly.</p>Due to one of the libraries that Manim depends on (skia-pathops) not specifically supporting the architecture of Raspberry Pi, trying to install manim might lead to an error that reads along the lines of this:A Report from Uppsala2021-06-10T05:00:00-05:002021-06-10T05:00:00-05:00https://benjamin-hackl.at/blog/2021/06/report-from-uppsala<p>It’s time for an update! A <strong>lot</strong> of stuff has happened in the past few weeks, and I think my blog is a good space to keep track of it all (at least a bit 😅).</p> <h3 id="--">🇦🇹 → 🇸🇪</h3> <p>You would think that relocating during a global pandemic would be a rather complex endeavour – and well, you are right with that assumption. Nevertheless, I’ve been planning to join <a href="https://www.math.uu.se">Uppsala University</a> for a postdoc position for a while now, and I’m very happy that things finally worked out.</p> <blockquote class="twitter-tweet"> <p lang="en" dir="ltr">It probably doesn't get much more official than that: I'm excited and very happy to have joined the Mathematics dept. at <a href="https://twitter.com/UU_University?ref_src=twsrc%5Etfw">@UU_University</a>. :-) <a href="https://t.co/xZjH5vfgUG">pic.twitter.com/xZjH5vfgUG</a></p> <p>— Benjamin Hackl (@behackl) <a href="https://twitter.com/behackl/status/1391679614167171074?ref_src=twsrc%5Etfw">May 10, 2021</a></p> </blockquote> <p>The apartment that I’m renting together with my girlfriend is actually really nice (and by now also well-equipped with a more than suitable home office); I’m pretty sure that we’ve had a fair amount of luck with getting it, especially considering that formal procedures can be a bit complicated for people without a Swedish social security number. (Basically, without a <em>Personnummer</em>, you’re not a person. I can’t even get through in <a href="https://twitter.com/behackl/status/1390590021921656834">the hotline of my internet provider</a>, but well, that’s life. I hope to be a real person soon again.)</p> <p>From a mathematical point of view, I’m really looking forward to an exciting time in Uppsala.</p> <h3 id="maintaining-manim">Maintaining Manim</h3> <p>A bit less than a year ago, when <a href="/blog/2020/08/summerinterns-2020.html">I’ve supervised summer interns</a> together with my colleague <a href="https://www.math.aau.at/rissner/">Rosi Rissner</a>, I got interested in <a href="http://3blue1brown.com">Grant “3b1b” Sanderson’s</a> Python animation library <a href="https://www.manim.community">Manim</a>. I’ve always been interested in science communication, and Manim seemed like the right tool (videos!) at the right time (during a pandemic!) to pick up.</p> <p><img src="https://raw.githubusercontent.com/ManimCommunity/manim/main/logo/cropped.png" alt="The ManimCommunity logo" /></p> <p>In May 2020, a <a href="https://github.com/ManimCommunity/manim">small community</a> has decided to start maintaining the library that Grant generously made public. And well, a series of escalations (mainly caused by the fact that I like working on Open Source software <strong>way</strong> too much) have resulted in me becoming one of the maintainers / organization administrators for <em>ManimCommunity</em>.</p> <p>We have recently <a href="https://github.com/ManimCommunity/manim/releases/tag/v0.7.0">published a new release</a>, version <code>v0.7.0</code>, with an <a href="https://docs.manim.community/en/latest/changelog/0.7.0-changelog.html">impressive changelog</a> (especially considering that according to our release cycle we release once a month).</p> <blockquote class="twitter-tweet"> <p lang="en" dir="ltr">Manim Community v0.7.0 has been released! 🎉 This month's release includes new Mobjects and improvements to our documentation. See more at <a href="https://t.co/budgf0Zfbp">https://t.co/budgf0Zfbp</a> <a href="https://t.co/HkmBo7h3xE">pic.twitter.com/HkmBo7h3xE</a></p> <p>— Manim Community (@manim_community) <a href="https://twitter.com/manim_community/status/1400945857122340867?ref_src=twsrc%5Etfw">June 4, 2021</a></p> </blockquote> <p>If you have never seen Manim in action, I’d definitely like to point you towards our <a href="https://docs.manim.community/en/stable/examples.html">example gallery</a> – or just watch a few of <a href="https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw">Grant’s YouTube videos</a>! I think that Manim has a lot of potential for Mathematics and Science education in general. I’m curious to see where the community’s journey will lead, and I’m honored to, metaphorically, have my hands on the steering wheel.</p> <h3 id="orchestrating-outreach">Orchestrating Outreach</h3> <p>In celebration of the 1-year anniversary of the foundation of <em>ManimCommunity</em>, the community had the idea of organizing a weekend-long <em>hackathon</em> in which participants could submit short animations fitting to a general theme, including the opportunity to win prizes. The community aspect of <em>ManimCommunity</em> is pretty important to me, which is why I’ve been heavily involved in the organization of the event – <a href="https://www.reddit.com/r/manim/comments/nk5sk3/announcement_1st_manim_hackathon_june_5_june_6/">which took place during the last weekend</a>.</p> <p>The video presentation of the opening ceremony can be found <a href="https://www.twitch.tv/videos/1051297838">here on Twitch</a> (of course I’ve streamed it! 😄), and given that the presentation has some interesting numbers I’ll also embed it here.</p> <div class="embed-container"> <iframe frameborder="0" src="https://benjamin-hackl.at/downloads/talks/2021-06-04-manimhackathon/"></iframe> </div> <p>Given that we have done something like this for the first time, we were pretty overwhelmed by the <strong>more than 100 submissions from about 30 participants</strong> we received during the weekend. I’m pretty sure that we’ll organize more events like that in the future.</p> <h3 id="successfully-out-of-school">Successfully out of School…</h3> <p>Speaking of Twitch, I’ve recently also been live there for a different reason: it’s the season of the Austrian school leaving exams (<em>Matura</em>), and I once again streamed myself going through the Mathematics exams. The corresponding videos for two different school types (which have differing centralized exams) can be found <a href="https://www.youtube.com/watch?v=W9B-ovZZdX8">here for the AHS</a>, and <a href="https://youtu.be/Fy3vG8llrNA">here for the BHS (HTL 2)</a>. I enjoy streaming in that setting, and will likely continue to do so in the future as well. (I’m actually surprised how many people find these videos by now organically by searching for <em>Matura</em> on YouTube.)</p> <div style="margin-bottom: 1em; max-width: 800px;"> <div class="embed-container"> <iframe src="https://www.youtube.com/embed/W9B-ovZZdX8" frameborder="0" allow="accelerometer; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe> </div> </div> <h3 id="-and-into-a-mathematical-summer">… and into a Mathematical Summer</h3> <p>Yet another pretty big thing that happened recently: after being cancelled last year, the <a href="https://www.ams.org/programs/research-communities/2021MRC-CompGeom">Mathematics Research Community <em>Combinatorial Applications of Computational Geometry and Algebraic Topology</em></a> finally took place, and it was indeed a great (virtual) workshop that helped me to meet new people in/adjacent to my field as well as to pick up some new mathematical problems to work on.</p> <p><img src="https://www.sagemath.org/pix/logo_sagemath+icon_oldstyle.png" alt="SageMath" /></p> <p>During the week, I’ve been mainly working together with <a href="https://www.oeaw.ac.at/ricam/staff/elaine-wong">Elaine Wong</a> and <a href="https://www.math.umass.edu/directory/graduate-students/jesse-selover">Jesse Selover</a> to translate some Maple code for finding minimal critical points of multivariate combinatorial generating functions (it already sounds fancy!) from a <a href="https://arxiv.org/abs/1905.04187">recent publication by Steve Melczer and Bruno Salvy</a> to SageMath. Eventually, as soon as everything is polished enough, this should extend the currently existing module for computations with multivariate generating functions (see <a href="https://trac.sagemath.org/ticket/31908">trac ticket #31908</a>).</p> <p>And while we’re talking about SageMath: I’m very happy to report that this year, I’m mentoring the <a href="https://summerofcode.withgoogle.com/projects/#6096683240259584">project on including support for explicitly bounded error terms (B-Terms)</a> in this year’s edition of the <a href="https://summerofcode.withgoogle.com">Google Summer of Code</a>. Thomas has already been quite busy, and a basic prototype for an implementation of this feature in simple cases is already in reach (trac tickets <a href="https://trac.sagemath.org/ticket/31922">#31922</a> and <a href="https://trac.sagemath.org/ticket/31933">#31933</a>).</p> <p>As usual, the start of the summer is also conference season – in particular, the <a href="https://www.math.aau.at/AofA2021/">32nd International Conference on Probabilistic, Combinatorial and Asymptotic Methods for the Analysis of Algorithms (AofA2021)</a> will take place from June 14 to June 17. Due to the circumstances, the University of Klagenfurt was given the opportunity to host the event both in 2020 (which was converted to an <em>asynchronous</em> online conference) and in 2021 (which was converted to a <em>synchronous</em> online conference), but unfortunately in-presence conferences are still not a particularly great idea at the moment. I would have said that at least the organizers will have the opportunity to enjoy the Wörthersee during the week – but in my case that’s also not quite true. I’m not too sad about it though: I’ve been told that midsummer in Sweden isn’t too bad either. 😄</p> <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>It’s time for an update! A lot of stuff has happened in the past few weeks, and I think my blog is a good space to keep track of it all (at least a bit 😅).Goodbye, Summer interns of 2020!2020-08-07T03:42:00-05:002020-08-07T03:42:00-05:00https://benjamin-hackl.at/blog/2020/08/summerinterns-2020<p> For the past four weeks, my colleague <a href="https://www.math.aau.at/rissner/">Roswitha Rissner</a> and I supervised five young mathematicians who joined our department as summer interns. </p> <div class='jekyll-twitter-plugin'><blockquote class="twitter-tweet"><p lang="de" dir="ltr">Zweimal Blinzeln, und schon wieder ist ein Monat um: Heute ist der letzte Arbeitstag unserer Praktikant*innen an der <a href="https://twitter.com/alpenadriauni?ref_src=twsrc%5Etfw">@alpenadriauni</a> -- und sie haben wirklich großartige Arbeit geleistet! Die von ihnen produzierten Erklärvideos sind jetzt online: <a href="https://t.co/llMSYbb420">https://t.co/llMSYbb420</a> 🥳🥳🥳 <a href="https://t.co/JswolncZ94">pic.twitter.com/JswolncZ94</a></p>&mdash; Benjamin Hackl (@behackl) <a href="https://twitter.com/behackl/status/1291374065001943042?ref_src=twsrc%5Etfw">August 6, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </div> <p> Their task was to create short animated explanation videos for some elementary mathematical concepts they were interested in and for which we provided theoretical input. The videos produced by them turned out simply amazing and <a href="https://www.youtube.com/playlist?list=PLP96UIESN83-AjDAPqk7qNdB0vauJ9sdF">are now available on YouTube</a>! </p> <p> All of these animations were created using <a href="https://github.com/ManimCommunity/manim/">Manim</a>, with the exception of the animation of the background in the outro, which was created using <a href="https://www.blender.org/">Blender</a>. Furthermore, they used the royalty free music available from <a href="https://www.bensound.com/">Bensound</a>. </p> <p> Working with them was a very pleasant and invigorating experience. I hope they enjoy the remainder of their summer as much as they enjoyed their internship (or, ideally, even a bit more). ;-) </p>For the past four weeks, my colleague Roswitha Rissner and I supervised five young mathematicians who joined our department as summer interns.Mathematician tackles Austrian school leaving exam: BHS edition2020-06-07T03:42:00-05:002020-06-07T03:42:00-05:00https://benjamin-hackl.at/blog/2020/06/bhs-matura-2020<p>After a lot of positive feedback for <a href="/blog/2020/05/matura-2020-stream.html">my video regarding the school leaving exam</a>, I decided to do the same thing for the school leaving exam in mathematics for a different Austrian school type (BHS).</p> <p>And again, it was fun to stream on <a href="https://twitch.tv/behackl">my Twitch channel</a>, the resulting video can be found below.</p> <div class="embed-container"> <iframe src="https://www.youtube.com/embed/3o1VN16PU4M" frameborder="0" allow="accelerometer; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe> </div>After a lot of positive feedback for my video regarding the school leaving exam, I decided to do the same thing for the school leaving exam in mathematics for a different Austrian school type (BHS).Mathematician tackles Austrian school leaving exam2020-05-31T16:10:00-05:002020-05-31T16:10:00-05:00https://benjamin-hackl.at/blog/2020/05/matura-2020-stream<p>As there was some controversy regarding the difficulty of the Austrian school leaving exam in mathematics, I got interested and wanted to check things out for myself.</p> <p>I streamed the whole thing on <a href="https://twitch.tv/behackl">my Twitch channel</a>, and I’ve uploaded the whole thing (sorry, its in German!) <a href="https://youtu.be/CznXCkfcZrg">to YouTube</a>. It was the first time that I streamed some mathematics, but I found it to be really fun and enjoyable. At this point, I can really see myself doing something like this again in the future!</p> <div class="embed-container"> <iframe src="https://www.youtube.com/embed/CznXCkfcZrg" frameborder="0" allow="accelerometer; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe> </div> <p><em>Update (04.06.2020):</em> The Austrian newspaper DerStandard has included my video in <a href="https://www.derstandard.at/story/2000117865325/matura-2020-die-latte-in-mathe-lag-heuer-hoeher">this article</a> discussing the difficulty of the school leaving exam. This really exceeds any expectations I had for my stream (<em>none</em>). :-)</p>As there was some controversy regarding the difficulty of the Austrian school leaving exam in mathematics, I got interested and wanted to check things out for myself.Technology for Online Teaching during Social Distancing2020-04-29T00:42:00-05:002020-04-29T00:42:00-05:00https://benjamin-hackl.at/blog/2020/04/technology-covid19<blockquote> <p>For some reason, my students this semester are happy with what I have done to move my classes to online formats (which, of course, was neccessary due to COVID-19). A friend asked me to write an article containing my views and recommendations for online teaching for a magazine, resulting in the text below. The article did not appear yet – but as soon as it does, I’ll update this blog entry with a link to it.</p> </blockquote> <p>The current situation brought about by COVID-19 and social distancing measures, which have been implemented to fight its rapid spread, have put various education systems in countries all around the world to the test. Physical events – including in-person teaching sessions – are canceled almost everywhere. As a result, lecturers and teachers have been tasked to “move their classes online”. In Austria, for example, these measures were implemented at a very early stage and physical classes were canceled almost overnight.</p> <p>The <a href="https://www.aau.at">University of Klagenfurt</a> where I work has found ways to adapt to these new circumstances – and along the way we have learned several important lessons. I want to share some of them, and cast light on solutions that have worked well so far.</p> <p>First and foremost, the most important action during these extraordinary times is to keep in regular contact with your students by any means necessary. None of them should have the feeling that they are being left behind. The question of how to achieve that is not so easy to answer. Unfortunately, it strongly depends on available infrastructure. In terms of infrastructure, I first and foremost recommend using institution approved software, and the software suggestions that follow can be used where institutional software falls short.</p> <p>Something that works very well for our mathematics department is a dedicated <a href="https://discordapp.com/why-discord#study-groups">Discord</a> server for our students, which provides a very low-barrier way of contacting us. This server works better than platforms that lean more in the direction of forums (e.g., Moodle), or plain email - for many students, asking a short question in a chat feels a lot easier than typing up a reply to a forum post or email. Furthermore, discussions in chats usually move faster than in forums, which is especially an advantage if someone wants to get clarification on an exercise or something along those lines – and these are the type of questions we get most often. Moodle and similar e-learning platforms are indispensable when it comes to the distribution of teaching material, and so if your university uses such a platform it is recommended that you continue to use it.</p> <p>If you and your students have access to the Microsoft Office suite, then Microsoft Teams might work well for you. For settings that involve video calls, I can recommend <a href="https://jitsi.org/jitsi-meet/">Jitsi</a>, <a href="https://zoom.us/">Zoom</a> (avoid Zoom though, if possible; there are several <a href="https://www.theverge.com/2020/4/1/21202584/zoom-security-privacy-issues-video-conferencing-software-coronavirus-demand-response">major data protection concerns</a>) or – in case you administer a server yourself or want to recommend something to your local administrator – <a href="https://bigbluebutton.org/">BigBlueButton</a>. The latter option, BigBlueButton, is the solution that the University of Klagenfurt has made use of to create official classrooms, and it works very well for streaming my lectures via screen sharing. The aforementioned service, Discord, has a similar feature that allows sharing your screen to a group of up to 50 people, but for data protection reasons I prefer to stick to a local solution when it comes to streaming lectures. I do enjoy the Discord streaming feature for answering student questions outside of lectures, though!</p> <p>Such a teaching setting where you are able to share your screen or a webcam image to your students allows you not only to share prepared presentations, but also to share your handwriting with them. For this, I can recommend the open source software <a href="http://xournal.sourceforge.net/">Xournal</a> (or <a href="https://github.com/xournalpp/xournalpp">Xournalpp</a> – which is Xournal rewritten in C++) or <a href="https://www.microsoft.com/de-at/microsoft-365/onenote/digital-note-taking-app">Microsoft OneNote</a>, should you have access to it. Especially when it comes to lectures in mathematics, I believe that students profit more from developing theory together in a blackboard-type lecture than from having theory thrown at them from slides – which is why I highly recommend streaming your (digital) handwriting with a combination of one of the communication tools above together with Xournal / OneNote or a similar piece of software – if your infrastructure allows it, of course.</p> <p>The platforms mentioned above are helpful for communication with students from all disciplines, including formal sciences. Many questions that I discuss with my students are on a level where reading and discussing some pseudo-formatted formulas are sufficient. For more involved questions, it is always possible to exchange pictures of hand-written notes; something that is possible within all communication platforms mentioned above.</p> <p>Aside from these software suggestions, I have some further recommendations when it comes to distance teaching, apart from staying in contact. It might be a very rational first reflex to hand out a large collection of teaching material to your students so they can study it at their own pace – but try not to do that. The idea that students should learn at their own pace is a good one, but handing out too many assignments at once will certainly overwhelm some of your students. You are also very likely not the only lecturer or teacher students have that will do this; a recent survey among the students of the University of Klagenfurt has also pointed out that all students, independent of their chosen curriculum, feel that they have more to do nowadays than before moving classes online. Try even more than usual to assign a realistic amount of work to them – and keep in mind that due to the current situation, some of your students might be under severe psychological stress. People they care about or depend on might have even lost their jobs and/or be sick. For the very same reason, it is not a bad idea to be rather lenient when it comes to assignments your students have to hand in: you might get more late submissions than usual – and maybe also fewer submissions in total.</p> <p>Several students I have spoken to also asked me to keep my online lectures in the same time slots as they would be usually – because it provides a bit of rhythm and structure to their chaotic days. In addition, I still recommend recording your sessions and making the recordings available to the students as not all of them might be able to attend the regular times due to care duties or other reasons.</p> <p>Obviously, everyone will handle these extraordinary times in a different way. Neither teachers nor students should forget that this situation is new for everyone. Remember to show understanding if things do not immediately work out as planned. Feel free to try out some of my recommended software – or use something entirely different: whatever works, works!</p>For some reason, my students this semester are happy with what I have done to move my classes to online formats (which, of course, was neccessary due to COVID-19). A friend asked me to write an article containing my views and recommendations for online teaching for a magazine, resulting in the text below. The article did not appear yet – but as soon as it does, I’ll update this blog entry with a link to it.Workshops @ BRG Viktring: Von Büchern, Tauben und den Türmen von Hanoi2018-10-12T05:00:00-05:002018-10-12T05:00:00-05:00https://benjamin-hackl.at/blog/2018/10/workshops-viktring<p>Es war mir eine große Freude, wieder einmal in meine alte Schule, dem <a href="http://www.brg-viktring.at">Bundesrealgymnasium Klagenfurt-Viktring</a> zurückzukehren um Mathematik-Workshops mit allen siebenten Klassen abzuhalten.</p> <p><img src="/downloads/img/2018-10-11_workshop-viktring.jpg" class="img-fluid" /></p> <p>Die Workshops hatten das Ziel, die Schülerinnen und Schüler auf der einen Seite auf eine Reise durch mathematische Teilgebiete mitzunehmen, welche im Schulunterricht aufgrund der strikten Lehrpläne wenig oder keinen Platz finden – und zugleich Inspiration für Themen für die verpflichtenden Vorwissenschaftlichen Arbeiten zu bieten.</p> <p>Die Unterlagen zum Workshop, also die Folien sowie die zugehörigen Übungen, sind auf <a href="/talks/">meiner Vortrags-Seite</a> zu finden.</p>Es war mir eine große Freude, wieder einmal in meine alte Schule, dem Bundesrealgymnasium Klagenfurt-Viktring zurückzukehren um Mathematik-Workshops mit allen siebenten Klassen abzuhalten.Talk @ AofA18: Counting Ascents in Generalized Dyck Paths2018-07-02T02:00:00-05:002018-07-02T02:00:00-05:00https://benjamin-hackl.at/blog/2018/07/aofa18-uppsala<p>Last week I participated at <a href="http://math.uu.se/aofa2018">AofA18</a> in Uppsala, Sweden and gave a talk on Friday.</p> <p>The slides can be found on my <a href="/talks/">Talks page</a>.</p>Last week I participated at AofA18 in Uppsala, Sweden and gave a talk on Friday.