A trailer for p-adic analysis, second half: Mahler coefficients

In the previous post we defined {p}-adic numbers. This post will state (mostly without proof) some more surprising results about continuous functions {f \colon \mathbb Z_p \rightarrow \mathbb Q_p}. Then we give the famous proof of the Skolem-Mahler-Lech theorem using {p}-adic analysis.

1. Digression on {\mathbb C_p}

Before I go on, I want to mention that {\mathbb Q_p} is not algebraically closed. So, we can take its algebraic closure {\overline{\mathbb Q_p}} — but this field is now no longer complete (in the topological sense). However, we can then take the completion of this space to obtain {\mathbb C_p}. In general, completing an algebraically closed field remains algebraically closed, and so there is a larger space {\mathbb C_p} which is algebraically closed and complete. This space is called the {p}-adic complex numbers.

We won’t need {\mathbb C_p} at all in what follows, so you can forget everything you just read.

2. Mahler coefficients: a description of continuous functions on {\mathbb Z_p}

One of the big surprises of {p}-adic analysis is that we can concretely describe all continuous functions {\mathbb Z_p \rightarrow \mathbb Q_p}. They are given by a basis of functions

\displaystyle  \binom xn \overset{\mathrm{def}}{=} \frac{x(x-1) \dots (x-(n-1))}{n!}

in the following way.

Theorem 1 (Mahler; see Schikhof Theorem 51.1 and Exercise 51.B)

Let {f \colon \mathbb Z_p \rightarrow \mathbb Q_p} be continuous, and define

\displaystyle  a_n = \sum_{k=0}^n \binom nk (-1)^{n-k} f(n).  \ \ \ \ \ (1)

Then {\lim_n a_n = 0} and

\displaystyle  f(x) = \sum_{n \ge 0} a_n \binom xn.

Conversely, if {a_n} is any sequence converging to zero, then {f(x) = \sum_{n \ge 0} a_n \binom xn} defines a continuous function satisfying (1).

The {a_i} are called the Mahler coefficients of {f}.

Exercise 2

Last post we proved that if {f \colon \mathbb Z_p \rightarrow \mathbb Q_p} is continuous and {f(n) = (-1)^n} for every {n \in \mathbb Z_{\ge 0}} then {p = 2}. Re-prove this using Mahler’s theorem, and this time show conversely that a unique such {f} exists when {p=2}.

You’ll note that these are the same finite differences that one uses on polynomials in high school math contests, which is why they are also called “Mahler differences”.

\displaystyle  \begin{aligned} a_0 &= f(0) \\ a_1 &= f(1) - f(0) \\ a_2 &= f(2) - 2f(1) - f(0) \\ a_3 &= f(3) - 3f(2) + 3f(1) - f(0). \end{aligned}

Thus one can think of {a_n \rightarrow 0} as saying that the values of {f(0)}, {f(1)}, \dots behave like a polynomial modulo {p^e} for every {e \ge 0}. Amusingly, this fact was used on a USA TST in 2011:

Exercise 3 (USA TST 2011/3)

Let {p} be a prime. We say that a sequence of integers {\{z_n\}_{n=0}^\infty} is a {p}-pod if for each {e \geq 0}, there is an {N \geq 0} such that whenever {m \geq N}, {p^e} divides the sum

\displaystyle  \sum_{k=0}^m (-1)^k \binom mk z_k.

Prove that if both sequences {\{x_n\}_{n=0}^\infty} and {\{y_n\}_{n=0}^\infty} are {p}-pods, then the sequence {\{x_n y_n\}_{n=0}^\infty} is a {p}-pod.

3. Analytic functions

We say that a function {f \colon \mathbb Z_p \rightarrow \mathbb Q_p} is analytic if it has a power series expansion

\displaystyle  \sum_{n \ge 0} c_n x^n \quad c_n \in \mathbb Q_p \qquad\text{ converging for } x \in \mathbb Z_p.

As before there is a characterization in terms of the Mahler coefficients:

Theorem 4 (Schikhof Theorem 54.4)

The function {f(x) = \sum_{n \ge 0} a_n \binom xn} is analytic if and only if

\displaystyle  \lim_{n \rightarrow \infty} \frac{a_n}{n!} = 0.

Just as holomorphic functions have finitely many zeros, we have the following result on analytic functions on {\mathbb Z_p}.

Theorem 5 (Strassmann’s theorem)

Let {f \colon \mathbb Z_p \rightarrow \mathbb Q_p} be analytic. Then {f} has finitely many zeros.

4. Skolem-Mahler-Lech

We close off with an application of the analyticity results above.

Theorem 6 (Skolem-Mahler-Lech)

Let {(x_i)_{i \ge 0}} be an integral linear recurrence. Then the zero set of {x_i} is eventually periodic.

Proof: According to the theory of linear recurrences, there exists a matrix {A} such that we can write {x_i} as a dot product

\displaystyle  x_i = \left< A^i u, v \right>.

Let {p} be a prime not dividing {\det A}. Let {T} be an integer such that {A^T \equiv \mathbf{1} \pmod p}.

Fix any {0 \le r < N}. We will prove that either all the terms

\displaystyle  f(n) = x_{nT+r} \qquad n = 0, 1, \dots

are zero, or at most finitely many of them are. This will conclude the proof.

Let {A^T = \mathbf{1} + pB} for some integer matrix {B}. We have

\displaystyle  \begin{aligned} f(n) &= \left< A^{nT+r} u, v \right> = \left< (\mathbf1 + pB)^n A^r u, v \right> \\ &= \sum_{k \ge 0} \binom nk \cdot p^n \left< B^n A^r u, v \right> \\ &= \sum_{k \ge 0} a_n \binom nk \qquad \text{ where } a_n = p^n \left< B^n A^r u, v \right> \in p^n \mathbb Z. \end{aligned}

Thus we have written {f} in Mahler form. Initially, we define {f \colon \mathbb Z_{\ge 0} \rightarrow \mathbb Z}, but by Mahler’s theorem (since {\lim_n a_n = 0}) it follows that {f} extends to a function {f \colon \mathbb Z_p \rightarrow \mathbb Q_p}. Also, we can check that {\lim_n \frac{a_n}{n!} = 0} hence {f} is even analytic.

Thus by Strassman’s theorem, {f} is either identically zero, or else it has finitely many zeros, as desired. \Box

Advertisements

A trailer for p-adic analysis, first half: USA TST 2003

I think this post is more than two years late in coming, but anywhow…

This post introduces the {p}-adic integers {\mathbb Z_p}, and the {p}-adic numbers {\mathbb Q_p}. The one-sentence description is that these are “integers/rationals carrying full mod {p^e} information” (and only that information).

The first four sections will cover the founding definitions culminating in a short solution to a USA TST problem.

In this whole post, {p} is always a prime. Much of this is based off of Chapter 3A from Straight from the Book.

1. Motivation

Before really telling you what {\mathbb Z_p} and {\mathbb Q_p} are, let me tell you what you might expect them to do.

In elementary/olympiad number theory, we’re already well-familiar with the following two ideas:

  • Taking modulo a prime {p} or prime {p^e}, and
  • Looking at the exponent {\nu_p}.

Let me expand on the first point. Suppose we have some Diophantine equation. In olympiad contexts, one can take an equation modulo {p} to gain something else to work with. Unfortunately, taking modulo {p} loses some information: (the reduction {\mathbb Z \twoheadrightarrow \mathbb Z/p} is far from injective).

If we want finer control, we could consider instead taking modulo {p^2}, rather than taking modulo {p}. This can also give some new information (cubes modulo {9}, anyone?), but it has the disadvantage that {\mathbb Z/p^2} isn’t a field, so we lose a lot of the nice algebraic properties that we got if we take modulo {p}.

One of the goals of {p}-adic numbers is that we can get around these two issues I described. The {p}-adic numbers we introduce is going to have the following properties:

  1. You can “take modulo {p^e} for all {e} at once”. In olympiad contexts, we are used to picking a particular modulus and then seeing what happens if we take that modulus. But with {p}-adic numbers, we won’t have to make that choice. An equation of {p}-adic numbers carries enough information to take modulo {p^e}.
  2. The numbers {\mathbb Q_p} form a field, the nicest possible algebraic structure: {1/p} makes sense. Contrast this with {\mathbb Z/p^2}, which is not even an integral domain.
  3. It doesn’t lose as much information as taking modulo {p} does: rather than the surjective {\mathbb Z \twoheadrightarrow \mathbb Z/p} we have an injective map {\mathbb Z \hookrightarrow \mathbb Z_p}.
  4. Despite this, you “ignore” some “irrelevant” data. Just like taking modulo {p}, you want to zoom-in on a particular type of algebraic information, and this means necessarily losing sight of other things. (To draw an analogy: the equation { a^2 + b^2 + c^2 + d^2 = -1} has no integer solutions, because, well, squares are nonnegative. But you will find that this equation has solutions modulo any prime {p}, because once you take modulo {p} you stop being able to talk about numbers being nonnegative. The same thing will happen if we work in {p}-adics: the above equation has a solution in {\mathbb Z_p} for every prime {p}.)

So, you can think of {p}-adic numbers as the right tool to use if you only really care about modulo {p^e} information, but normal {\mathbb Z/p^e} isn’t quite powerful enough.

To be more concrete, I’ll give a poster example now:

Example 1 (USA TST 2002/2)

For a prime {p}, show the value of

\displaystyle f_p(x) = \sum_{k=1}^{p-1} \frac{1}{(px+k)^2} \pmod{p^3}

does not depend on {x}.

Here is a problem where we clearly only care about {p^e}-type information. Yet it’s a nontrivial challenge to do the necessary manipulations mod {p^3} (try it!). The basic issue is that there is no good way to deal with the denominators modulo {p^3} (in part {\mathbb Z/p^3} is not even an integral domain).

However, with {p}-adic analysis we’re going to be able to overcome these limitations and give a “straightforward” proof by using the identity

\displaystyle \left( 1 + \frac{px}{k} \right)^{-2} = \sum_{n \ge 0} \binom{-2}{n} \left( \frac{px}{k} \right)^n.

Such an identity makes no sense over {\mathbb Q} or {\mathbb R} for converge reasons, but it will work fine over the {\mathbb Q_p}, which is all we need.

2. Algebraic perspective

We now construct {\mathbb Z_p} and {\mathbb Q_p}. I promised earlier that a {p}-adic integer will let you look at “all residues modulo {p^e}” at once. This definition will formalize this.

2.1. Definition of {\mathbb Z_p}

Definition 2 (Introducing {\mathbb Z_p})

A {p}-adic integer is a sequence

\displaystyle x = (x_1 \bmod p, \; x_2 \bmod{p^2}, \; x_3 \bmod{p^3}, \; \dots)

of residues {x_e} modulo {p^e} for each integer {e}, satisfying the compatibility relations {x_i \equiv x_j \pmod{p^i}} for {i < j}.

The set {\mathbb Z_p} of {p}-adic integers forms a ring under component-wise addition and multiplication.

Example 3 (Some {3}-adic integers)

Let {p=3}. Every usual integer {n} generates a (compatible) sequence of residues modulo {p^e} for each {e}, so we can view each ordinary integer as {p}-adic one:

\displaystyle 50 = \left( 2 \bmod 3, \; 5 \bmod 9, \; 23 \bmod{27}, \; 50 \bmod{81}, \; 50 \bmod{243}, \; \dots \right).

On the other hand, there are sequences of residues which do not correspond to any usual integer despite satisfying compatibility relations, such as

\displaystyle \left( 1 \bmod 3, \; 4 \bmod 9, \; 13 \bmod{27}, \; 40 \bmod{81}, \; \dots \right)

which can be thought of as {x = 1 + p + p^2 + \dots}.

In this way we get an injective map

\displaystyle \mathbb Z \hookrightarrow \mathbb Z_p \qquad n \mapsto \left( n \bmod p, n \bmod{p^2}, n \bmod{p^3}, \dots \right)

which is not surjective. So there are more {p}-adic integers than usual integers.

(Remark for experts: those of you familiar with category theory might recognize that this definition can be written concisely as

\displaystyle \mathbb Z_p \overset{\mathrm{def}}{=} \varprojlim \mathbb Z/p^e \mathbb Z

where the inverse limit is taken across {e \ge 1}.)

Exercise 4

Check that {\mathbb Z_p} is an integral domain.

2.2. Base {p} expansion

Here is another way to think about {p}-adic integers using “base {p}”. As in the example earlier, every usual integer can be written in base {p}, for example

\displaystyle 50 = \overline{1212}_3 = 2 \cdot 3^0 + 1 \cdot 3^1 + 2 \cdot 3^2 + 1 \cdot 3^3.

More generally, given any {x = (x_1, \dots) \in \mathbb Z_p}, we can write down a “base {p}” expansion in the sense that there are exactly {p} choices of {x_k} given {x_{k-1}}. Continuing the example earlier, we would write

\displaystyle \begin{aligned} \left( 1 \bmod 3, \; 4 \bmod 9, \; 13 \bmod{27}, \; 40 \bmod{81}, \; \dots \right) &= 1 + 3 + 3^2 + \dots \\ &= \overline{\dots1111}_3 \end{aligned}

and in general we can write

\displaystyle x = \sum_{k \ge 0} a_k p^k = \overline{\dots a_2 a_1 a_0}_p

where {a_k \in \{0, \dots, p-1\}}, such that the equation holds modulo {p^e} for each {e}. Note the expansion is infinite to the left, which is different from what you’re used to.

(Amusingly, negative integers also have infinite base {p} expansions: {-4 = \overline{\dots222212}_3}, corresponding to {(2 \bmod 3, \; 5 \bmod 9, \; 23 \bmod{27}, \; 77 \bmod{81} \dots)}.)

Thus you may often hear the advertisement that a {p}-adic integer is an “possibly infinite base {p} expansion”. This is correct, but later on we’ll be thinking of {\mathbb Z_p} in a more and more “analytic” way, and so I prefer to think of this as a “Taylor series with base {p}. Indeed, much of your intuition from generating functions {K[[X]]} (where {K} is a field) will carry over to {\mathbb Z_p}.

2.3. Constructing {\mathbb Q_p}

Here is one way in which your intuition from generating functions carries over:

Proposition 5 (Non-multiples of {p} are all invertible)

The number {x \in \mathbb Z_p} is invertible if and only if {x_1 \ne 0}. In symbols,

\displaystyle x \in \mathbb Z_p^\times \iff x \not\equiv 0 \pmod p.

Contrast this with the corresponding statement for {K[ [ X ] ]}: a generating function {F \in K[ [ X ] ]} is invertible iff {F(0) \neq 0}.

Proof: If {x \equiv 0 \pmod p} then {x_1 = 0}, so clearly not invertible. Otherwise, {x_e \not\equiv 0 \pmod p} for all {e}, so we can take an inverse {y_e} modulo {p^e}, with {x_e y_e \equiv 1 \pmod{p^e}}. As the {y_e} are themselves compatible, the element {(y_1, y_2, \dots)} is an inverse. \Box

Example 6 (We have {-\frac{1}{2} = \overline{\dots1111}_3 \in \mathbb Z_3})

We claim the earlier example is actually

\displaystyle \begin{aligned} -\frac{1}{2} = \left( 1 \bmod 3, \; 4 \bmod 9, \; 13 \bmod{27}, \; 40 \bmod{81}, \; \dots \right) &= 1 + 3 + 3^2 + \dots \\ &= \overline{\dots1111}_3. \end{aligned}

Indeed, multiplying it by {-2} gives

\displaystyle \left( -2 \bmod 3, \; -8 \bmod 9, \; -26 \bmod{27}, \; -80 \bmod{81}, \; \dots \right) = 1.

(Compare this with the “geometric series” {1 + 3 + 3^2 + \dots = \frac{1}{1-3}}. We’ll actually be able to formalize this later, but not yet.)

Remark 7 ({\frac{1}{2}} is an integer for {p > 2})

The earlier proposition implies that {\frac{1}{2} \in \mathbb Z_3} (among other things); your intuition about what is an “integer” is different here! In olympiad terms, we already knew {\frac{1}{2} \pmod 3} made sense, which is why calling {\frac{1}{2}} an “integer” in the {3}-adics is correct, even though it doesn’t correspond to any element of {\mathbb Z}.

Fun (but trickier) exercise: rational numbers correspond exactly to eventually periodic base {p} expansions.

With this observation, here is now the definition of {\mathbb Q_p}.

Definition 8 (Introducing {\mathbb Q_p})

Since {\mathbb Z_p} is an integral domain, we let {\mathbb Q_p} denote its field of fractions. These are the {p}-adic numbers.

Continuing our generating functions analogy:

\displaystyle \mathbb Z_p \text{ is to } \mathbb Q_p \quad\text{as}\quad K[[X]] \text{ is to } K((X)).

This means {\mathbb Q_p} is “Laurent series with base {p}”, and in particular according to the earlier proposition we deduce:

Proposition 9 ({\mathbb Q_p} looks like formal Laurent series)

Every nonzero element of {\mathbb Q_p} is uniquely of the form

\displaystyle p^k u \qquad \text{ where } k \in \mathbb Z, \; u \in \mathbb Z_p^\times.

Thus, continuing our base {p} analogy, elements of {\mathbb Q_p} are in bijection with “Laurent series”

\displaystyle \sum_{k \ge -n} a_k p^k = \overline{\dots a_2 a_1 a_0 . a_{-1} a_{-2} \dots a_{-n}}_p

for {a_k \in \left\{ 0, \dots, p-1 \right\}}. So the base {p} representations of elements of {\mathbb Q_p} can be thought of as the same as usual, but extending infinitely far to the left (rather than to the right).

(Fair warning: the field {\mathbb Q_p} has characteristic zero, not {p}.)

Remark 10 (Warning on fraction field)

This result implies that you shouldn’t think about elements of {\mathbb Q_p} as {x/y} (for {x,y \in \mathbb Z_p}) in practice, even though this is the official definition (and what you’d expect from the name {\mathbb Q_p}). The only denominators you need are powers of {p}.

To keep pushing the formal Laurent series analogy, {K((X))} is usually not thought of as quotient of generating functions but rather as “formal series with some negative exponents”. You should apply the same intuition on {\mathbb Q_p}.

(At this point I want to make a remark about the fact {1/p \in \mathbb Q_p}, connecting it to the wish-list of properties I had before. In elementary number theory you can take equations modulo {p}, but if you do the quantity {n/p \bmod{p}} doesn’t make sense unless you know {n \bmod{p^2}}. You can’t fix this by just taking modulo {p^2} since then you need {n \bmod{p^3}} to get {n/p \bmod{p^2}}, ad infinitum. You can work around issues like this, but the nice feature of {\mathbb Z_p} and {\mathbb Q_p} is that you have modulo {p^e} information for “all {e} at once”: the information of {x \in \mathbb Q_p} packages all the modulo {p^e} information simultaneously. So you can divide by {p} with no repercussions.)

3. Analytic perspective

3.1. Definition

Up until now we’ve been thinking about things mostly algebraically, but moving forward it will be helpful to start using the language of analysis. Usually, two real numbers are considered “close” if they are close on the number of line, but for {p}-adic purposes we only care about modulo {p^e} information. So, we’ll instead think of two elements of {\mathbb Z_p} or {\mathbb Q_p} as “close” if they differ by a large multiple of {p^e}.

For this we’ll borrow the familiar {\nu_p} from elementary number theory.

Definition 11 ({p}-adic valuation and absolute value)

We define the {p}-adic valuation {\nu_p : \mathbb Q_p^\times \rightarrow \mathbb Z} in the following two equivalent ways:

  • For {x = (x_1, x_2, \dots) \in \mathbb Z_p} we let {\nu_p(x)} be the largest {e} such that {x_e \equiv 0 \pmod{p^e}} (or {e=0} if {x \in \mathbb Z_p^\times}). Then extend to all of {\mathbb Q_p^\times} by {\nu_p(xy) = \nu_p(x) + \nu_p(y)}.
  • Each {x \in \mathbb Q_p^\times} can be written uniquely as {p^k u} for {u \in \mathbb Z_p^\times}, {k \in \mathbb Z}. We let {\nu_p(x) = k}.

By convention we set {\nu_p(0) = +\infty}. Finally, define the {p}-adic absolute value {\left\lvert \bullet \right\rvert_p} by

\displaystyle \left\lvert x \right\rvert_p = p^{-\nu_p(x)}.

In particular {\left\lvert 0 \right\rvert_p = 0}.

This fulfills the promise that {x} and {y} are close if they look the same modulo {p^e} for large {e}; in that case {\nu_p(x-y)} is large and accordingly {\left\lvert x-y \right\rvert_p} is small.

3.2. Ultrametric space

In this way, {\mathbb Q_p} and {\mathbb Z_p} becomes a metric space with metric given by {\left\lvert x-y \right\rvert_p}.

Exercise 12

Suppose {f \colon \mathbb Z_p \rightarrow \mathbb Q_p} is continuous and {f(n) = (-1)^n} for every {n \in \mathbb Z_{\ge 0}}. Prove that {p = 2}.

In fact, these spaces satisfy a stronger form of the triangle inequality than you are used to from {\mathbb R}.

Proposition 13 ({\left\lvert \bullet \right\rvert_p} is an ultrametric)

For any {x,y \in \mathbb Z_p}, we have the strong triangle inequality

\displaystyle \left\lvert x+y \right\rvert_p \le \max \left\{ \left\lvert x \right\rvert_p, \left\lvert y \right\rvert_p \right\}.

Equality holds if (but not only if) {\left\lvert x \right\rvert_p \neq \left\lvert y \right\rvert_p}.

However, {\mathbb Q_p} is more than just a metric space: it is a field, with its own addition and multiplication. This means we can do analysis just like in {\mathbb R} or {\mathbb C}: basically, any notion such as “continuous function”, “convergent series”, et cetera has a {p}-adic analog. In particular, we can define what it means for an infinite sum to converge:

Definition 14 (Convergence notions)

Here are some examples of {p}-adic analogs of “real-world” notions.

  • A sequence {s_1}, \dots converges to a limit {L} if {\lim_{n \rightarrow \infty} \left\lvert s_n - L \right\rvert_p = 0}.
  • The infinite series {\sum_k x_k} converges if the sequence of partial sums {s_1 = x_1}, {s_2 = x_1 + x_2}, \dots, converges to some limit.
  • \dots et cetera \dots

With this definition in place, the “base {p}” discussion we had earlier is now true in the analytic sense: if {x = \overline{\dots a_2 a_1 a_0}_p \in \mathbb Z_p} then

\displaystyle \sum_{k=0}^\infty a_k p^k \quad\text{converges to } x.

Indeed, the {n}th partial sum is divisible by {p^n}, hence the partial sums approach {x} as {n \rightarrow \infty}.

While the definitions are all the same, there are some changes in properties that should be true. For example, in {\mathbb Q_p} convergence of partial sums is simpler:

Proposition 15 ({|x_k|_p \rightarrow 0} iff convergence of series)

A series {\sum_{k=1}^\infty x_k} in {\mathbb Q_p} converges to some limit if and only if {\lim_{k \rightarrow \infty} |x_k|_p = 0}.

Contrast this with {\sum \frac1n = \infty} in {\mathbb R}. You can think of this as a consequence of strong triangle inequality. Proof: By multiplying by a large enough power of {p}, we may assume {x_k \in \mathbb Z_p}. (This isn’t actually necessary, but makes the notation nicer.)

Observe that {x_k \pmod p} must eventually stabilize, since for large enough {n} we have {\left\lvert x_n \right\rvert_p < 1 \iff \nu_p(x_n) \ge 1}. So let {a_1} be the eventual residue modulo {p} of {\sum_{k=0}^N x_k \pmod p} for large {N}. In the same way let {a_2} be the eventual residue modulo {p^2}, and so on. Then one can check we approach the limit {a = (a_1, a_2, \dots)}. \Box

Here’s a couple exercises to get you used to thinking of {\mathbb Z_p} and {\mathbb Q_p} as metric spaces.

Exercise 16 ({\mathbb Z_p} is compact)

Show that {\mathbb Q_p} is not compact, but {\mathbb Z_p} is. (For the latter, I recommend using sequential continuity.)

Exercise 17 (Totally disconnected)

Show that both {\mathbb Z_p} and {\mathbb Q_p} are totally disconnected: there are no connected sets other than the empty set and singleton sets.

3.3. More fun with geometric series

While we’re at it, let’s finally state the {p}-adic analog of the geometric series formula.

Proposition 18 (Geometric series)

Let {x \in \mathbb Z_p} with {\left\lvert x \right\rvert_p < 1}. Then

\displaystyle \frac{1}{1-x} = 1 + x + x^2 + x^3 + \dots.

Proof: Note that the partial sums satisfy {1 + x + x^2 + \dots + x^n = \frac{1-x^n}{1-x}}, and {x^n \rightarrow 0} as {n \rightarrow \infty} since {\left\lvert x \right\rvert_p < 1}. \Box

So, {1 + 3 + 3^2 + \dots = -\frac{1}{2}} is really a correct convergence in {\mathbb Z_3}. And so on.

If you buy the analogy that {\mathbb Z_p} is generating functions with base {p}, then all the olympiad generating functions you might be used to have {p}-adic analogs. For example, you can prove more generally that:

Theorem 19 (Generalized binomial theorem)

If {x \in \mathbb Z_p} and {\left\lvert x \right\rvert_p < 1}, then for any {r \in \mathbb Q} we have the series convergence

\displaystyle \sum_{n \ge 0} \binom rn x^n = (1+x)^r.

(I haven’t defined {(1+x)^r}, but it has the properties you expect.) The proof is as in the real case; even the theorem statement is the same except for the change for the extra subscript of {p}. I won’t elaborate too much on this now, since {p}-adic exponentiation will be described in much more detail in the next post.

3.4. Completeness

Note that the definition of {\left\lvert \bullet \right\rvert_p} could have been given for {\mathbb Q} as well; we didn’t need {\mathbb Q_p} to introduce it (after all, we have {\nu_p} in olympiads already). The big important theorem I must state now is:

Theorem 20 ({\mathbb Q_p} is complete)

The space {\mathbb Q_p} is the completion of {\mathbb Q} with respect to {\left\lvert \bullet \right\rvert_p}.

This is the definition of {\mathbb Q_p} you’ll see more frequently; one then defines {\mathbb Z_p} in terms of {\mathbb Q_p} (rather than vice-versa) according to

\displaystyle \mathbb Z_p = \left\{ x \in \mathbb Q_p : \left\lvert x \right\rvert_p \le 1 \right\}.

(Remark for experts: {\mathbb Q_p} is a field with {\nu_p} a non-Arcihmedian valuation; then {\mathbb Z_p} is its valuation ring.)

Let me justify why this definition is philosophically nice.

Suppose you are a numerical analyst and you want to estimate the value of the sum

\displaystyle S = \frac{1}{1^2} + \frac{1}{2^2} + \dots + \frac{1}{10000^2}

to within {0.001}. The sum {S} consists entirely of rational numbers, so the problem statement would be fair game for ancient Greece. But it turns out that in order to get a good estimate, it really helps if you know about the real numbers: because then you can construct the infinite series {\sum_{n \ge 1} n^{-2} = \frac16 \pi^2}, and deduce that {S \approx \frac{\pi^2}{6}}, up to some small error term from the terms past {\frac{1}{10001^2}}, which can be bounded.

Of course, in order to have access to enough theory to prove that {S = \pi^2/6}, you need to have the real numbers; it’s impossible to do serious analysis in the non-complete space {\mathbb Q}, where e.g. the sequence {1}, {1.4}, {1.41}, {1.414}, \dots is considered “not convergent” because {\sqrt2 \notin \mathbb Q}. Instead, all analysis is done in the completion of {\mathbb Q}, namely {\mathbb R}.

Now suppose you are an olympiad contestant and want to estimate the sum

\displaystyle f_p(x) = \sum_{k=1}^{p-1} \frac{1}{(px+k)^2}

to within mod {p^3} (i.e. to within {p^{-3}} in {\left\lvert \bullet \right\rvert_p}). Even though {f_p(x)} is a rational number, it still helps to be able to do analysis with infinite sums, and then bound the error term (i.e. take mod {p^3}). But the space {\mathbb Q} is not complete with respect to {\left\lvert \bullet \right\rvert_p} either, and thus it makes sense to work in the completion of {\mathbb Q} with respect to {\left\lvert \bullet \right\rvert_p}. This is exactly {\mathbb Q_p}.

4. Solving USA TST 2002/2

Let’s finally solve Example~1, which asks to compute

\displaystyle f_p(x) = \sum_{k=1}^{p-1} \frac{1}{(px+k)^2} \pmod{p^3}.

Armed with the generalized binomial theorem, this becomes straightforward.

\displaystyle \begin{aligned} f_p(x) &= \sum_{k=1}^{p-1} \frac{1}{(px+k)^2} = \sum_{k=1}^{p-1} \frac{1}{k^2} \left( 1 + \frac{px}{k} \right)^{-2} \\ &= \sum_{k=1}^{p-1} \frac{1}{k^2} \sum_{n \ge 0} \binom{-2}{n} \left( \frac{px}{k} \right)^{n} \\ &= \sum_{n \ge 0} \binom{-2}{n} \sum_{k=1}^{p-1} \frac{1}{k^2} \left( \frac{x}{k} \right)^{n} p^n \\ &\equiv \sum_{k=1}^{p-1} \frac{1}{k^2} - 2x \left( \sum_{k=1}^{p-1} \frac{1}{k^3} \right) p + 3x^2 \left( \sum_{k=1}^{p-1} \frac{1}{k^4} \right) p^2 \pmod{p^3}. \end{aligned}

Using the elementary facts that {p^2 \mid \sum_k k^{-3}} and {p \mid \sum k^{-4}}, this solves the problem.

 

A story of block-ascending permutations

I recently had a combinatorics paper appear in the EJC. In this post I want to brag a bit by telling the “story” of this paper: what motivated it, how I found the conjecture that I originally did, and the process that eventually led me to the proof, and so on.

This work was part of the Duluth REU 2017, and I thank Joe Gallian for suggesting the problem.

1. Background

Let me begin by formulating the problem as it was given to me. First, here is the definition and notation for a “block-ascending” permutation.

Definition 1

For nonnegative integers {a_1}, …, {a_n} an {(a_1, \dots, a_n)}-ascending permutation is a permutation on {\{1, 2, \dots, a_1 + \dots + a_n\}} whose descent set is contained in {\{a_1, a_1+a_2, \dots, a_1+\dots+a_{n-1}\}}. In other words the permutation ascends in blocks of length {a_1}, {a_2}, …, {a_n}, and thus has the form

\displaystyle \pi = \pi_{11} \dots \pi_{1a_1} | \pi_{21} \dots \pi_{2a_2} | \dots | \pi_{n1} \dots \pi_{na_n}

for which {\pi_{i1} < \pi_{i2} < \dots < \pi_{ia_i}} for all {i}.

It turns out that block-ascending permutations which also avoid an increasing subsequence of certain length have nice enumerative properties. To this end, we define the following notation.

Definition 2

Let {\mathcal L_{k+2}(a_1, \dots, a_n)} denote the set of {(a_1, \dots, a_n)}-ascending permutations which avoid the pattern {12 \dots (k+2)}.

(The reason for using {k+2} will be explained later.) In particular, {\mathcal L_{k+2}(a_1 ,\dots, a_n) = \varnothing} if {\max \{a_1, \dots, a_n\} \ge k+2}.

Example 3

Here is a picture of a permutation in {\mathcal L_7(3,2,4)} (but not in {\mathcal L_6(3,2,4)}, since one can see an increasing length {6} subsequence shaded). We would denote it {134|69|2578}.

Now on to the results. A 2011 paper by Joel Brewster Lewis (JBL) proved (among other things) the following result:

Theorem 4 (Lewis 2011)

The sets {\mathcal L_{k+2}(k,k,\dots,k)} and {\mathcal L_{k+2}(k+1,k+1,\dots,k+1)} are in bijection with Young tableau of shape {\left< (k+1)^n \right>}.

Remark 5

When {k=1}, this implies {\mathcal L_3(1,1,\dots,1)}, which is the set of {123}-avoiding permutations of length {n}, is in bijection with the Catalan numbers; so is {\mathcal L_3(2,\dots,2)} which is the set of {123}-avoiding zig-zag permutations.

Just before the Duluth REU in 2017, Mei and Wang proved that in fact, in Lewis’ result one may freely mix {k} and {k+1}‘s. To simplify notation,

Definition 6

Let {I \subseteq \left\{ 1,\dots,n \right\}}. Then {\mathcal L(n,k,I)} denotes {\mathcal L_{k+2}(a_1,\dots,a_n)} where

\displaystyle a_i = \begin{cases} k+1 & i \in I \\ k & i \notin I. \end{cases}

Theorem 7 (Mei, Wang 2017)

The {2^n} sets {\mathcal L(n,k,I)} are also in bijection with Young tableau of shape {\left< (k+1)^n \right>}.

The proof uses the RSK correspondence, but the authors posed at the end of the paper the following open problem:

Problem

Find a direct bijection between the {2^n} sets {\mathcal L(n,k,I)} above, not involving the RSK correspondence.

This was the first problem that I was asked to work on. (I remember I received the problem on Sunday morning; this actually matters a bit for the narrative later.)

At this point I should pause to mention that this {\mathcal L_{k+2}(\dots)} notation is my own invention, and did not exist when I originally started working on the problem. Indeed, all the results are restricted to the case where {a_i \in \{k,k+1\}} for each {i}, and so it was unnecessary to think about other possibilities for {a_i}: Mei and Wang’s paper use the notation {\mathcal L(n,k,I)}. So while I’ll continue to use the {\mathcal L_{k+2}(\dots)} notation in the blog post for readability, it will make some of the steps more obvious than they actually were.

2. Setting out

Mei and Wang’s paper originally suggested that rather than finding a bijection {\mathcal L(n,k,I) \rightarrow \mathcal L(n,k,J)} for any {I} and {J}, it would suffice to biject

\displaystyle \mathcal L(n,k,I) \rightarrow \mathcal L(n,k,\varnothing)

and then compose two such bijections. I didn’t see why this should be much easier, but it didn’t seem to hurt either.

As an example, they show how to do this bijection with {I = \{1\}} and {I = \{n\}}. Indeed, suppose {I = \{1\}}. Then {\pi_{11} < \pi_{12} < \dots < \pi_{1(k+1)}} is an increasing sequence of length {k+1} right at the start of {\pi}. So {\pi_{1(k+1)}} had better be the largest element in the permutation: otherwise later in {\pi} the biggest element would complete an ascending permutation of length {k+2} already! So removing {\pi_{1(k+1)}} gives a bijection between {\mathcal L(n,k,\{1\}) \rightarrow \mathcal L(n,k,\varnothing)}.

But if you look carefully, this proof does essentially nothing with the later blocks. The exact same proof gives:

Proposition 8

Suppose {1 \notin I}. Then there is a bijection

\displaystyle \mathcal L(n,k,I \cup \{1\}) \rightarrow \mathcal L(n,k,I)

by deleting the {(k+1)}st element of the permutation (which must be largest one).

Once I found this proposition I rejected the initial suggestion of specializing {\mathcal L(n,k,I) \rightarrow \mathcal L(n,k,\varnothing)}. The “easy case” I had found told me that I could take a set {I} and delete the single element {1} from it. So empirically, my intuition from this toy example told me that it would be easier to find bijections {\mathcal L(n,k,I) \rightarrow \mathcal L(n,k,I')} whee {I'} and {I} were only “a little different”, and hope that the resulting bijection only changed things a little bit (in the same way that in the toy example, all the bijection did was delete one element). So I shifted to trying to find small changes of this form.

3. The fork in the road

3.1. Wishful thinking

I had a lucky break of wishful thinking here. In the notation {\mathcal L_{k+2}(a_1, \dots, a_n)} with {a_i \in \{k,k+1\}}, I had found that one could replace {a_1} with either {k} or {k+1} freely. (But this proof relied heavily on the fact the block really being on the far left.) So what other changes might I be able to make?

There were two immediate possibilities that came to my mind.

  • Deletion: We already showed {a_1} could be changed from {k+1} to {k} for any {i}. If we can do a similar deletion with {a_i} for any {i}, not just {i=1}, then we would be done.
  • Swapping: If we can show that two adjacent {a_i}‘s could be swapped, that would be sufficient as well. (It’s also possible to swap non-adjacent {a_i}‘s, but that would cause more disruption for no extra benefit.)

Now, I had two paths that both seemed plausible to chase after. How was I supposed to know which one to pick? (Of course, it’s possible neither work, but you have to start somewhere.)

Well, maybe the correct thing to do would have to just try both. But it was Sunday afternoon by the time I got to this point. Granted, it was summer already, but I knew that come Monday I would have doctor appointments and other trivial errands to distract me, so I decided I should pick one of them and throw the rest of the day into it. But that meant I had to pick one.

(I confess that I actually already had a prior guess: the deletion approach seemed less likely to work than the swapping approach. In the deletion approach, if {i} is somewhere in the middle of the permutation, it seemed like deleting an element could cause a lot of disruption. But the swapping approach preserved the total number of elements involved, and so seemed more likely that I could preserve structure. But really I was just grasping at straws.)

3.2. Enter C++

Yeah, I cheated. Sorry.

Those of you that know anything about my style of math know that I am an algebraist by nature — sort of. It’s more accurate to say that I depend on having concrete examples to function. True, I can’t do complexity theory for my life, but I also haven’t been able to get the hang of algebraic geometry, despite having tried to learn it three or four times by now. But enumerative combinatorics? OH LOOK EXAMPLES.

Here’s the plan: let {k=3}. Then using a C++ computer program:

  • Enumerate all the permutations in {S = \mathcal L_{k+2}(3,4,3,4)}.
  • Enumerate all the permutations in {A = \mathcal L_{k+2}(3,3,3,4)}.
  • Enumerate all the permutations in {B = \mathcal L_{k+2}(3,3,4,4)}.

If the deletion approach is right, then I would hope {S} and {A} look pretty similar. On the flip side, if the swapping approach is right, then {S} and {B} should look close to each other instead.

It’s moments like this where my style of math really shines. I don’t have to make decisions like the above off gut-feeling: do the “data science” instead.

3.3. A twist of fate

Except this isn’t actually what I did, since there was one problem. Computing the longest increasing subsequence of a length {N} permutation takes {O(N \log N)} time, and there are {N!} or so permutations. But when {N = 3+4+3+4=14}, we have {N! \cdot N \log N \approx 3 \cdot 10^{12}}, which is a pretty big number. Unfortunately, my computer is not really that fast, and I didn’t really have the patience to implement the “correct” algorithms to bring the runtime down.

The solution? Use {N = 1+4+3+2 = 10} instead.

In a deep irony that I didn’t realize at the time, it was this moment when I introduced the {\mathcal L_{k+2}(a_1, \dots, a_n)} notation, and for the first time allowed the {a_i} to not be in {\{k,k+1\}}. My reasoning was that since I was only doing this for heuristic reasons, I could instead work with {S = \mathcal L_{k+2}(2,4,3,2)} and probably not change much about the structure of the problem, while replacing {N = 2 + 4 + 3 + 2 = 11}, which would run {1000} times faster. This was okay since all I wanted to do was see how much changing the “middle” would disrupt the structure.

And so the new plan was:

  • Enumerate all the permutations in {S = \mathcal L_{k+2}(1,4,3,2)}.
  • Enumerate all the permutations in {A = \mathcal L_{k+2}(1,3,3,2)}.
  • Enumerate all the permutations in {B = \mathcal L_{k+2}(1,3,4,2)}.

I admit I never actually ran the enumeration with {A}, because the route with {S} and {B} turned out to be even more promising than I expected. When I compared the empirical data for the sets {S} and {B}, I found that the number of permutations with any particular triple {(\pi_1, \pi_9, \pi_{10})} were equal. In other words, the outer blocks were preserved: the bijection

\displaystyle \mathcal L_{k+2}(1,4,3,2) \rightarrow \mathcal L_{k+2}(1,3,4,2)

does not tamper with the outside blocks of length {1} and {2}.

This meant I was ready to make the following conjecture. Suppose {a_i = k}, {a_{i+1} = k+1}. There is a bijection

\displaystyle \mathcal L_{k+2}(a_1, \dots, a_i, a_{i+1}, \dots, a_n) \rightarrow \mathcal L_{k+2}(a_1, \dots, a_{i+1}, a_{i}, \dots, a_n)

which only involves rearranging the elements of the {i}th and {(i+1)}st blocks.

4. Rooting out the bijection

At this point I was in a quite good position. I had pinned down the problem to a finding a particular bijection that I was confident had to exist, since it was showing up to the empirical detail.

Let’s call this mythical bijection {\mathbf W}. How could I figure out what it was?

4.1. Hunch: {\mathbf W} preserves order-isomorphism

Let me quickly introduce a definition.

Definition 9

We say two words {a_1 \dots a_m} and {b_1 \dots b_m} are order-isomorphic if {a_i < a_j} if and only {b_i < b_j}. Then order-isomorphism gives equivalence classes, and there is a canonical representative where the letters are {\{1,2,\dots,m\}}; this is called a reduced word.

Example 10

The words {13957}, {12846} and {12534} are order-isomorphic; the last is reduced.

Now I guessed one more property of {\mathbf W}: this {\mathbf W} should order-isomorphism.

What do I mean by this? Suppose in one context {139 | 57} changed to {39 | 157}; then we would expect that in another situation we should have {124 | 68} changing to {24 | 168}. Indeed, we expect {\mathbf W} (empirically) to not touch surrounding outside blocks, and so it would be very strange if {\mathbf W} behaved differently due to far-away numbers it wasn’t even touching.

So actually I’ll just write

\displaystyle \mathbf W(123|45) = 23|145

for this example, reducing the words in question.

4.2. Keep cheating

With this hunch it’s possible to cheat with C++ again. Here’s how.

Let’s for concreteness suppose {k=2} and the particular sets

\displaystyle \mathcal L_{k+2}(1,3,2,1) \rightarrow \mathcal L_{k+2}(1,2,3,1).

Well, it turns out if you look at the data:

  • The only element of {\mathcal L_{k+2}(1,3,2,1)} which starts with {2} and ends with {5} is {2|147|36|5}.
  • The only element of {\mathcal L_{k+2}(1,2,3,1)} which starts with {2} and ends with {5} is {2|47|136|5}.

So that means that {147 | 36} is changed to {47 | 136}. Thus the empirical data shows that

\displaystyle \mathbf W(135|24) = 35|124.

In general, it might not be that clear cut. For example, if we look at the permutations starting with {2} and {4}, there is more than one.

  • {2 | 1 5 7 | 3 6 | 4} and {2 | 1 6 7 | 3 5 | 4} are both in {\mathcal L_{k+2}(1,3,2,1)}.
  • {2 | 5 7 | 1 3 6 | 4} and {2 | 6 7 | 1 3 5 | 4} are both in in {\mathcal L_{k+2}(1,2,3,1)}.

Thus

\displaystyle \mathbf W( \{135|24, 145|23\} ) = \{35|124, 45|123\}

but we can’t tell which one goes to which (although you might be able to guess).

Fortunately, there is lots of data. This example narrowed {135|24} down to two values, but if you look at other places you might have different data on {135|24}. Since we think {\mathbf W} is behaving the same “globally”, we can piece together different pieces of data to get narrower sets. Even better, {\mathbf W} is a bijection, so once we match either of {135|24} or {145|23}, we’ve matched the other.

You know what this sounds like? Perfect matchings.

So here’s the experimental procedure.

  • Enumerate all permutations in {\mathcal L_{k+2}(2,3,4,2)} and {\mathcal L_{k+2}(2,4,3,2)}.
  • Take each possible tuple {(\pi_1, \pi_2, \pi_{10}, \pi_{11})}, and look at the permutations that start and end with those particular four elements. Record the reductions of {\pi_3\pi_4\pi_5|\pi_6\pi_7\pi_8\pi_9} and {\pi_3\pi_4\pi_5\pi_6|\pi_7\pi_8\pi_9} for all these permutations. We call these input words and output words, respectively. Each output word is a “candidate” of {\mathbf W} for a input word.
  • For each input word {a_1a_2a_3|b_1b_2b_3b_4} that appeared, take the intersection of all output words that appeared. This gives a bipartite graph {G}, with input words being matched to their candidates.
  • Find perfect matchings of the graph.

And with any luck that would tell us what {\mathbf W} is.

4.3. Results

Luckily, the bipartite graph is quite sparse, and there was only one perfect matching.

246|1357 => 2467|135
247|1356 => 2457|136
256|1347 => 2567|134
257|1346 => 2357|146
267|1345 => 2367|145
346|1257 => 3467|125
347|1256 => 3457|126
356|1247 => 3567|124
357|1246 => 1357|246
367|1245 => 1367|245
456|1237 => 4567|123
457|1236 => 1457|236
467|1235 => 1467|235
567|1234 => 1567|234

If you look at the data, well, there are some clear patterns. Exactly one number is “moving” over from the right half, each time. Also, if {7} is on the right half, then it always moves over.

Anyways, if you stare at this for an hour, you can actually figure out the exact rule:

Claim 11

Given an input {a_1a_2a_3|b_1b_2b_3b_4}, move {b_{i+1}} if {i} is the largest index for which {a_i < b_{i+1}}, or {b_1 = 1} if no such index exists.

And indeed, once I have this bijection, it takes maybe only another hour of thinking to verify that this bijection works as advertised, thus solving the original problem.

Rather than writing up what I had found, I celebrated that Sunday evening by playing Wesnoth for 2.5 hours.

5. Generalization

5.1. Surprise

On Monday morning I was mindlessly feeding inputs to the program I had worked on earlier and finally noticed that in fact {\mathcal L_6(1,3,5,2)} and {\mathcal L_6(1,5,3,2)} also had the same cardinality. Huh.

It seemed too good to be true, but I played around some more, and sure enough, the cardinality of {\#\mathcal L_{k+2}(a_1, \dots, a_n)} seemed to only depend on the order of the {a_i}‘s. And so at last I stumbled upon the final form the conjecture, realizing that all along the assumption {a_i \in \{k,k+1\}} that I had been working with was a red herring, and that the bijection was really true in much vaster generality. There is a bijection

\displaystyle \mathcal L_{k+2}(a_1, \dots, a_i, a_{i+1}, \dots, a_n) \rightarrow \mathcal L_{k+2}(a_1, \dots, a_{i+1}, a_{i}, \dots, a_n)

which only involves rearranging the elements of the {i}th and {(i+1)}st blocks.

It also meant I had more work to do, and so I was now glad that I hadn’t written up my work from yesterday night.

5.2. More data science

I re-ran the experiment I had done before, now with {\mathcal L_7(2,3,5,2) \rightarrow \mathcal L_7(2,5,3,2)}. (This was interesting, because the {8} elements in question could now have either longest increasing subsequence of length {5}, or instead of length {6}.)

The data I obtained was:

246|13578 => 24678|135
247|13568 => 24578|136
248|13567 => 24568|137
256|13478 => 25678|134
257|13468 => 23578|146
258|13467 => 23568|147
267|13458 => 23678|145
268|13457 => 23468|157
278|13456 => 23478|156
346|12578 => 34678|125
347|12568 => 34578|126
348|12567 => 34568|127
356|12478 => 35678|124
357|12468 => 13578|246
358|12467 => 13568|247
367|12458 => 13678|245
368|12457 => 13468|257
378|12456 => 13478|256
456|12378 => 45678|123
457|12368 => 14578|236
458|12367 => 14568|237
467|12358 => 14678|235
468|12357 => 12468|357
478|12356 => 12478|356
567|12348 => 15678|234
568|12347 => 12568|347
578|12346 => 12578|346
678|12345 => 12678|345

Okay, so it looks like:

  • exactly two numbers are moving each time, and
  • the length of the longest run is preserved.

Eventually, I was able to work out the details, but they’re more involved than I want to reproduce here. But the idea is that you can move elements “one at a time”: something like

\displaystyle \mathcal L_{k+2}(7,4) \rightarrow \mathcal L_{k+2}(6,5) \rightarrow \mathcal L_{k+2}(5,6) \rightarrow \mathcal L_{k+2}(4,7)

while preserving the length of increasing subsequences at each step.

So, together with the easy observation from the beginning, this not only resolves the original problem, but also gives an elegant generalization. I had now proved:

Theorem 12

For any {a_1}, …, {a_n}, the cardinality

\displaystyle \# \mathcal L_{k+2}(a_1, \dots, a_n)

does not depend on the order of the {a_i}‘s.

6. Discovered vs invented

Whenever I look back on this, I can’t help thinking just how incredibly lucky I got on this project.

There’s this perpetual debate about whether mathematics is discovered or invented. I think it’s results like this which make the case for “discovered”. I did not really construct the bijection {\mathbf W} myself: it was “already there” and I found it by examining the data. In another world where {\mathbf W} did not exist, all the creativity in the world wouldn’t have changed anything.

So anyways, that’s the behind-the-scenes tour of my favorite combinatorics paper.

DNSCrypt Setup with PDNSD

Here are notes for setting up DNSCrypt on Arch Linux, using pdnsd as a DNS cache, assuming the use of NetworkManager. I needed it one day since the network I was using blocked traffic to external DNS servers (parental controls), and the DNS server provided had an outdated entry for hmmt.co. (My dad then pointed out to me I could have just hard-coded the necessary IP address in /etc/hosts, oops.)

For the whole process, useful commands to test with are:

  • nslookup hmmt.co will tell you the IP used and the server from which it came.
  • dig http://www.hmmt.co gives much more detailed information to this effect. (From bind-tools.)
  • dig @127.0.0.1 http://www.hmmt.co lets you query a specific DNS server (in this case 127.0.0.1).
  • drill @127.0.0.1 http://www.hmmt.co behaves similarly.

First, pacman -S pdnsd dnscrypt-proxy (with sudo ostensibly, but I’ll leave that out here and henceforth).

Run systemctl edit dnscrypt-proxy.socket and fill in override.conf with

[Socket]
ListenStream=
ListenDatagram=
ListenStream=127.0.0.1:40
ListenDatagram=127.0.0.1:40

Optionally, one can also specify which server which DNS serve to use with systemctl edit dnscrypt-proxy.service. For example for cs-uswest I write

[Service]
ExecStart=
ExecStart=/usr/bin/dnscrypt-proxy \
      -R cs-uswest

The empty ExecStart= is necessary, since otherwise systemctl will complain about multiple ExecStart commands.

This thus configures dnscrypt-proxy to listen on 127.0.0.1, port 40.

Now we configure pdnsd to listen on port 53 (default) for cache, and relay cache misses to dnscrypt-proxy. This is accomplished by using the following for /etc/pdnsd.conf:

global {
    perm_cache = 1024;
    cache_dir = "/var/cache/pdnsd";
    run_as = "pdnsd";
    server_ip = 127.0.0.1;
    status_ctl = on;
    query_method = udp_tcp;
    min_ttl = 15m;       # Retain cached entries at least 15 minutes.
    max_ttl = 1w;        # One week.
    timeout = 10;        # Global timeout option (10 seconds).
    neg_domain_pol = on;
    udpbufsize = 1024;   # Upper limit on the size of UDP messages.
}

server {
    label = "dnscrypt-proxy";
    ip = 127.0.0.1;
    port = 40;
    timeout = 4;
    proxy_only = on;
}

source {
    owner = localhost;
    file = "/etc/hosts";
}

Now it remains to change the DNS server from whatever default is used into 127.0.0.1. For NetworkManager users, it is necessary to edit /etc/NetworkManager/NetworkManager.conf to prevent it from overriding this file:

[main]
...
dns=none

This will cause resolv.conf to be written as an empty file by NetworkManager: in this case, the default 127.0.0.1 is used as the nameserver, which is what we want.

Needless to say, one finishes with

systemctl enable dnscrypt-proxy
systemctl start dnscrypt-proxy
systemctl enable pdnsd
systemctl start pdnsd

Shifting PDF’s using gs

Some time ago I was reading the 18.785 analytic NT notes
to try and figure out some sections of Davenport that I couldn’t understand.
These notes looked nice enough that I decided I should probably print them out,
But much to my annoyance, I found that almost all the top margins were too tiny, and the bottom margins too big.
(I say “almost all” since the lectures 19 and 24 (Bombieri proof and elliptic curves) were totally fine, for inexplicable reasons).

Thus, instead of reading Davenport like I told myself to, I ended up learning enough GhostScript flags to write the following short script,
which I’m going to share today so that other people can find better things to do with their time.

    #!/bin/bash
    for file in $@
    do
        echo "Shifting $file ..."
        gs \
            -sDEVICE=pdfwrite \
            -o shifted-$file \
            -dPDFSETTINGS=/prepress \
            -c "<</PageOffset [0 -36]>>; setpagedevice" \
            -f $file
    done
    

The arguments 0 and -36 indicate to not change the left/right margins, but to shift the content vertically downwards by 36pt (a half inch).
Of course, they can and should be adjusted depending on specific task.
Invocation is the standard ./script-name.sh *.pdf (or whatever).

(Aside: ironically, this decreased the file sizes of the affected PDF’s.)

Git Aliases

For Git users:

I’ve recently discovered the joy that is git aliases, courtesy of this blog post. To return to the favor, I thought I’d share the ones that I came up with.

For those of you that don’t already know, Git allows you to make aliases — shortcuts for commands. Specifically, if you add the following lines to your .gitconfig:

[alias]
    cm = commit
    co = checkout
    br = branch

Then running git cm will expand as git commit, and git co master is git checkout master, and so on. You can see how this might make you happy because it could save a few keystrokes. But I think it’s more useful than that — let me share what I did.

The first thing I did was add

pu = pull origin
psh = push origin

and permanently save myself the frustration of forgetting to type origin. Not bad. Even more helpful was the command

undo = reset --soft HEAD~1

Thus if I make a commit and then decide I want to undo it, rather than having to remember (or Google) what the correct incantations were, I just have to type git undo. It’s really an undo button!

Now for the fun part — some of Git’s useful commands are pretty verbose and take up lots of space. For example, here’s what git status looks like:
git-status

Kind of verbose if you ask me, and by now I know what “git pull” does. Fortunately, it turns out that there are some options you can run to make this look nicer. All you have to do is say git status -s -b, or in the context of this post, set the alias

ss = status -s -b

Then you get
git-alias-ss

which is much cooler.

Similarly, git log takes up a lot of space. I have the following format, which I’ve edited from the above blog post to suit my own tastes.

ls = log -n 16 --pretty=format:"%C(yellow)%h\\ %C(cyan)[%cn]\\ %C(reset)%s\\ %C(red)%d" --decorate 
ll = log -n 6 --pretty=format:"%C(yellow)%h\\ %C(cyan)[%cn]\\ %C(reset)%s\\ %C(red)%ad" --decorate --date=short --stat

These give in my opinion the much more readable format
git-alias-l

If you’re on a branch that does merges, you might also have fun with

tree = log -n 16 --pretty=format:"%C(yellow)%h\\ %C(cyan)[%cn]\\ %C(reset)%s\\ %C(red)%d" --decorate --graph

which will put these into a graphical tree for your viewing pleasure.

And finally a few more that I find nice, some again taken directly from the link above:

fail = commit --amend # to avoid stupid "oops typo" commits
rb = rebase
rbc = rebase --continue
bis = bisect
dc = checkout --
assume = update-index --assume-unchanged
unassume = update-index --no-assume-unchanged
assumed = "!git ls-files -v | grep ^h | cut -c 3-"

(Here “dc” is short for “discard”, since git dc file discards the changes to that file.) And that’s just the beginning of what you can do!

Pre-emptive answer: I’m also using git-completion (for tab-completing in git) and git-prompt with the line

export PS1='\[33[0;32m\]${debian_chroot:+($debian_chroot)}\u@\h \[33[0;33m\]\w$(__git_ps1 " \[33[1;31m\]#%s")\n\[33[0m\]\$ '

in my bashrc. That’s where the branch indicators are coming from. The terminal is XFCE4.