How we illustrate the Prüfer-$3$ group elements on the unit circle?

71 Views Asked by At

I am trying to illustrate the Prüfer-$3$ group elements on the unit circle and I am not sure, if my approach is correct. It should be noted that I am mainly interested in the odd integers.

Let us refer to the Prüfer-$2$ group, which is well elaborated and illusrated: On a unit circle we label the vertices that are Prüfer-$2$ group elements as follows:

enter image description here

To achieve a visualization, I have written the following code, referring to the definition of the Prüfer-$2$ group. Hence the label of the elements $g_n^k$ (the vertices on the unit circle) are given by $g_n^k=2^n+k$:

import numpy as np
import math
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
from matplotlib.collections import LineCollection

def rotate(t):
    #rotate unit vector [0, 1] by "t"
    x = math.sin(t)
    y = math.cos(t)
    return (x, y)

def get_angle_2(x):
    if x == 1:
        return 0
    
    n = int(math.log2(x))
    k = x - 2**n
    return 2*np.pi - 2*np.pi*k/2**n

n_points = 18

x = np.empty([n_points])
y = np.empty([n_points])

for i in range(0, n_points):
    angle = get_angle_2(2*i+1) + np.pi/2
    rot_xy = rotate(angle)
    x[i] = rot_xy[0]
    y[i] = rot_xy[1]

fig = plt.figure(figsize=(8, 8))
plt.axis('off')
plt.scatter(x, y, s=2, c='#0000FF')

for i in range(0, n_points):
    plt.annotate(2*i+1, (x[i], y[i]))

circle = plt.Circle((0, 0), 1, color='b', fill=False)
plt.gca().add_patch(circle)

As a result I obtain the following plot (which seems to be consistent with the definition of the Prüfer-$2$ group):

enter image description here

My question: Analogously, how can I visualize the elements of the Prüfer-$3$ group on the unit circle?

My approach (about which I am really not sure):

I have implemented a slightly modified function called get_angle_3(x) which looks as follows:

def get_angle_3(x):
    if x == 1:
        return 0
    
    n = int(math.log(x, 3))
    k = x - 3**n
    return 2*np.pi - 2*np.pi*k/3**n

When drawing the vertices on the unit circle with:

n_points = 18

x = np.empty([n_points])
y = np.empty([n_points])

for i in range(0, n_points):
    angle = get_angle_3(2*i+1) + np.pi/2
    rot_xy = rotate(angle)
    x[i] = rot_xy[0]
    y[i] = rot_xy[1]

fig = plt.figure(figsize=(8, 8))
plt.axis('off')
plt.scatter(x, y, s=2, c='#0000FF')

for i in range(0, n_points):
    plt.annotate(2*i+1, (x[i], y[i]))

circle = plt.Circle((0, 0), 1, color='b', fill=False)
plt.gca().add_patch(circle)

we obtain the following plot:

enter image description here

Is this simply the way to do it? Are the elements of the Prüfer-$3$ group depicted on the unit circle correct?