The Number Hiding Inside the Spirograph Part 2

For more introduction into the problem and a derivation of the Petal Numbers for finite values of see Part 1.

After the I published the first article about the Petal Numbers, I received two interesting responses on Reddit. Reddit user existentialpenguin commented that he did a search for the approximate form of as (4.603338) in the OEIS and found an entry that matched very closely. That entry lists that it is the solution of , derived from a different problem completely. Reddit user BruhcamoleNibberDick then sketched out a derivation of resulting in the same equation, which would in theory prove the two numbers are equal.

In this article we'll go over a derivation of inspired by BruhcamoleNibberDick's comment, prove that is indeed transcendental, and finally we'll provide an efficient method to compute .

Deriving as

From Part 1 recall the spirograph function and its derivative:

We want to constrain these equations to the points where the petals of the spirograph are tangent:

The spirograph when all petals are tengent to each other

The critical thing to observe is that at the points of tangency, , both the position and velocity vectors are parallel. This means that the tangent of their arguments (i.e. angle) are equal:

For the sake of space, let's simplify each side separately. First the left side:

Now let's simplify the right side of :

Now equate and per . Group terms:

Replace with per cosine angle sum formula:

With we have an expression that puts in terms of and . Since we are interested in solving for as , let's take the limit. Important to note that we assume exists as during these steps:

Since we have assumed that exists as it should be clear that but we keep it in this form because it will be necessary to evaluate another limit.

The second major thing to observe is that at the points of tangency, , where :

Now take the limit of as and replace with :

Use the identities and :

Use the small-angle approximations for , , and :

If we set then is exactly equal to the equation characterizing entry A328227 in the OEIS. Important to note that only the negative solutions of when are valid and only the positive solutions of when are valid.

As we mentioned in the previous article, different values of result in different solutions for . This is because the tangency condition is satisfied by multiple shapes of the spirograph. The number of distinct values of that result in unique shapes is and when , there are an infinite number of values for . To capture the fact that this is a family of numbers, we'll rename to and rephrase given the domain considerations in the previous paragraph. are the positive solutions of the following equation, for :

Proof That is Transcendental

Our original proof that is transcendental had an incorrect step. Reddit user existentialpenguin suggested a variation on the original proof which the following proof incorporates. This proof relies on the Lindemann–Weierstrass theorem which for our purposes implies that if is a algebraic number then must be a transcendental number or . Before engaging in the main proof, we first want to show that when then :

Now for the main proof, we'll put into a more convenient form:

shows that when then it is implied that . By the contrapositive that means that when then . Now let's use and proceed by contradiction:

Therefore must be transcendental.


Given our equation for there is no algebraically straightforward way to compute . Though maybe with a simple change of variables we can simplify the problem. Let's set :

Now let's replace using the identity :

We have reduced our original problem to the problem of finding the roots of , i.e. the fixed points of . The specific root we need for is the smallest root , which we call , because otherwise . The fixed points of are well-known numbers in themselves that have applications in many areas of math, science, and engineering. There are a few known methods for computing them already (you'll find one in the addendum to this article). You can find more info at MathWorld, including the first 6 roots. For our purposes it suffices to show the connections between the th fixed point of and .

The first connection is from our original change of variables:

We can derive the other connection by combining and :

The two different methods of converting between the fixed points of and is incredible and is a direct result of 's nature as both an argument and a result of .


So what is ? On a physical and geometrical basis, we can say that it's the secant of the right triangle whose tangent is equivalent in radians to the angle to which these ratios are relative. and the fixed points of are the shadows of these special triangles, of which there are an infinite amount. I have to imagine that the angles and ratios which characterize these special triangles show up in various problems. The spirograph just happened to be my window to them. shows up as the solution to this IBM challenge problem, about which Numberphile also made a video. May there be other problems where the other ratios of this special triangle are relevant, i.e. the sine, cosine, cosecant, or cotangent?

Given that have a well-understood connection to the fixed points of , I now think that the values of which correspond to finite values of that we derived in Part 1 are more enigmatic and interesting. In a way they could be understood as "intermediate solutions" toward the fixed points of . I find this fascinating and in a future article I may derive a series expansion for directly computing those intermediate solutions. They may reveal more structure and properties of the fixed points of .

Rian Hunter, 6/16/21

Addendum: Computing the Fixed Points of

To compute the roots of , we can apply its series reversion, , to to solve for . Unfortunately for the series reversion algorithm to work, we need the first-order term to be non-zero. The series expansion of is , so the expansion of is which is no good. To fix this, make a change of variables that takes advantage of the fact that and , i.e. , where results in a solution for the th fixed point of :

Yet there is another snag. Ideally we would use the Taylor series of about to derive the forward series coefficients but is not defined at . On the other hand is, so we'll use that instead:

At this stage the next step would be to find the derivatives of to get a formula for the series coefficients parameterized by a series index, e.g. , but unfortunately there is no easily discernable pattern of the value of the derivatives of at . The series reversion algorithm is also not very amenable to a compact notation. A Python script to compute the series reversion coefficients will be provided at the end of this section. Additionally the OEIS provides the numerators and the denominators. For the sake of simplicity we'll assume we have the series reversion coefficients readily available as and we'll define the reversion polynomial as :

We can then apply to :

Now back to the detail of computing , the following Python script shows how to compute and using them to compute :

import sympy as sp

import sys

    num_terms = int(sys.argv[1])
except IndexError:
    num_terms = 10

    num_fixed_points = int(sys.argv[2])
except IndexError:
    num_fixed_points = 10

x = sp.symbols('x', real=True)
y = 1 / (sp.cot(x) + x)
s = sp.series(y, x, 0, num_terms)

# this is necessary for the series reversion
# algorithm to work
assert not s.coeff(x, 0)
assert s.coeff(x, 1)

s = s.removeO()

y2 = sp.symbols('y', real=True)
coeffs = sp.symbols('a1:' + str(num_terms), real=True)
finv = sum(sym * y2 ** (i + 1) for (i, sym) in enumerate(coeffs))

newy = s.subs(x, finv).expand()

eqs = []
for i in range(0, num_terms - 1):
    val = newy.coeff(y2 ** (i+1))

    if not i:
        expected = 1
        expected = 0

    eqs.append(sp.Eq(val, expected))

sols = sp.solve(eqs)
if isinstance(sols, list):
    sols = sols[0]

print("Here are the first %d coefficients for the series reversion of 1/(cot(x) + x)" % (num_terms,))
print(0, 0)
for (k, sym) in enumerate(coeffs):
    print(k+1, sols[sym])


finv_real = sum(sols[sym] * y2 ** (i + 1) for (i, sym) in enumerate(coeffs))
print("Here are approximations for the first %d fixed points of tan(x)" % (num_fixed_points,))
for k in range(num_fixed_points):
    q = (2 * k + 1) * sp.pi/2
    print(k, (q - finv_real.subs(y2, 1/q)).evalf())
Copyright © 2021 Rian Hunter