The Kepler Bouwkamp Constant

I'm sure we're all familiar with the usual mathematical constants, but what the heck is the The Kepler Bouwkamp Constant? I'll save you the trouble of searching for the relevant Wikepedia Article and provide the first paragraph for reference.

In plane geometry, the Kepler–Bouwkamp constant (or polygon inscribing constant) is obtained as a limit of the following sequence. Take a circle of radius 1. Inscribe a regular triangle in this circle. Inscribe a circle in this triangle. Inscribe a square in it. Inscribe a circle, regular pentagon, circle, regular hexagon and so forth. The radius of the limiting circle is called the Kepler–Bouwkamp constant.

A Brief Computation

Here, we will re-discover the Kepler–Bouwkamp constant. We'll open by considering a \( k \)-regular polygon (in this particular case, an equilateral triangle) inscribed in a circle of radius \( r \). To keep the math nice and tidy, we'll center everything at the origin.

Your browser does not support SVG
Regular Polygon with Inradius in White

Our task is to compute the inradius of a \( k \)-regular polygon. To do so, we'll notice that the radial line is a perpendicular bisector of the corresponding side. This property ensures the incenter is equidistant from each side of the polygon. To formalize this observation, we'll express the first two vertices in rectangular coordinates.

\begin{align*} v_{\textcolor{var(--bright-accent)}{0}} = \left ( r \cos \left ( \frac{\pi}{2} + \frac{\textcolor{var(--bright-accent)}{0} \cdot 2\pi}{k} \right ), \hspace{0.5em} r \sin \left ( \frac{\pi}{2} + \frac{\textcolor{var(--bright-accent)}{0} \cdot 2\pi}{k} \right ) \right ) \\ v_{\color{var(--bright-accent)}{1}} = \left ( r \cos \left ( \frac{\pi}{2} + \frac{\textcolor{var(--bright-accent)}{1} \cdot 2\pi}{k} \right ), \hspace{0.5em} r \sin \left ( \frac{\pi}{2} + \frac{\textcolor{var(--bright-accent)}{1} \cdot 2\pi}{k} \right ) \right ) \end{align*}

We now compute the midpoint of these two vertices.

\[ v_{\text{mid}} = \frac{v_{0} + v_{1}}{2} \]

Notice that by construction the incenter is the origin. In effect, overloading the notation for vectors and points, we find \( r_{\text{inner}} = \Vert v_{\text{mid}} \Vert_{2} \) or its \( 2 \)-norm. Working through that computation (using the Pythagorean and Periodicity Identities among other tools), we arrive at the following:

\[ \Vert v_{\text{mid}} \Vert_{2} = \sqrt{\frac{r^{2} \left ( 1 + \cos \left ( \frac{2\pi}{k} \right ) \right )}{2} } = r \cos \left ( \frac{\pi}{k} \right ) \]

Since the process above is initiated with a circle of radius \( 1 \), we may express the Kepler–Bouwkamp constant as the following product.

\[ K' = \prod_{k=3}^{\infty} \cos \left( \frac{\pi}{k} \right) \approx 0.1149420448\dots \]

This expression has no known closed form solution.

Construction

To get a visual feel for what is going on here, we can whip up two helper functions to find get an inscribed Ngram and polygon.

To get an inscribed Ngram, we sample evenly spaced points on the circle.

                
                    def get_inscribed_Ngram(circle, n):
                        # get radius
                        radius = circle.radius

                        # get evenly spaced angles starting at 90°
                        steps = np.linspace(start=PI/2, stop=5*PI/2, num=n+1)
                        
                        # make vertices
                        vertices = [
                            (radius * np.cos(step), radius * np.sin(step), 0) \
                            for step in steps[:-1]
                        ]

                        # make polygon
                        polygon = Polygram(vertices)

                        return polygon
                
            

To get an inscribed circle, we can compute the radius using the formula derived above and center at the origin.

                
                    def get_inscribed_circle(polygon):
                        # get a pair of vertices
                        vertices = polygon.get_vertices()
                        start = vertices[0]
                        stop = vertices[1]

                        # find midpoint and radius
                        midpoint = (start + stop)/2
                        radius = np.linalg.norm(midpoint)

                        # make circle
                        circle = Circle(radius=radius)

                        return circle
                
            

We can now run the process an arbitrary number of iterations.

                
                    num_iterations = 5

                    for n in range(start = 3, stop = 3 + num_iterations):
                        polygon = get_inscribed_Ngram(circle, n)
                        circle = get_inscribed_circle(polygon)
                        n = n + 1
                        mobjects.append(polygon)
                        mobjects.append(circle)
                
            

Running through that workflow, I managed to create a 5th order depiction of the Kepler–Bouwkamp constant!

Your browser does not support SVG
5th Order Kepler–Bouwkamp Constant
Resources and References

If you're interested in further reading, I would recommend checking out Bouwkamp's original paper on the topic. While he does not prove the connection between the geometric construction and the infinite series (noting that it is "easy" to show), he does discuss alternative formulations involving the Zeta function. From there, you can move on to generalizations of the underlying idea.

Comment Section