Max von Hippel

Posted on

# Simple Number-Theoretic Insights with Python

Sometimes I learn about a new operator, or equivalence class, or some other such function from `ZxZ` to `Z`. Often looking at a grid of the numbers `0 - 9` on `x` and `y` axes illuminates interesting properties of such functionals. Here I will give some code with which to do just that.

Before I continue, here's a picture of `I/O` from the code I will be writing in this blog post / article / thing. I am including this at the start so that anyone who reads this knows what the goal of the code is to begin with.

First let's define a few functionals, or functions, or operations, or whatever. This way we can quickly see the utility of our `number_table` code once we get to that.

Here are mine, but I encourage you to write your own. Note that I am coding in `Python3`. The code is simple and I think could be fairly easily ported to your language of choice.

``````# Euclid's Algorithm for Greatest Common Denominator (GCD):
euclid = lambda a, b: a if b == 0 else euclid(b, a % b)

# Two numbers are called "relatively prime" if their gcd is 1
relatively_prime = lambda a, b: int(euclid(a,b) == 1)

modulo = lambda a, b: a % b

and_ab = lambda a, b: a & b

``````

Ok, now that we've got a couple cool little functions to investigate out of the way, let's get to the meat of making number grids. I like to colorize my number-grids by number, so I made a little function for coloring numbers in Python.

``````number_color = lambda n: "\033[1;3" + str(n) + ";40m " + str(n)
``````

It doesn't really do anything for numbers greater than 8, but that's ok because if this bothers you then you can find a clever way to fix it. (This does not bother me.) Also, if you're interested in numbers bigger than 9 you'll have to modify my code a bit anyway, because I don't currently take that into account in the spacing of my table.

Now, here's my `number_table` code:

``````def number_table(method):
# We assume method is defined
print("    " + " ".join([number_color(n) for n in range(1,10)]))
print("     _________________________")
for a in range(1, 10):
line = number_color(a) + ": "
for b in range(1, 10):
r = method(a, b)
line += number_color(r) + " "
print(line)

``````

... And here is some more `I/O`:

Hope this proves useful!