--- title: "Stereography, Algebraic, and Hyperspheres" description: | TODO format: html: html-math-method: katex jupyter: python3 date: "2026-09-11" categories: - algebra draft: true --- ```{python} #| echo: false import sympy from IPython.display import Markdown from tabulate import tabulate x, x1, z = sympy.symbols("x x_1 z") ``` The Algebra Part ---------------- Though I alluded to the ability of the stereoscopic circle to generate the Chebyshev polynomials, there is an important caveat which differs their use from typical spheres. To review, the stereoscopic definition of the circle is: $$ \begin{align*} o_1(t) &= {1 + it \over 1 - it} \\ &= c_1 + i s_1 = {1 - t^2 \over 1 + t^2} + i{2t \over 1 + t^2} \end{align*} $$ The second line decomposes the first into real and nonreal terms, which are each rational functions. We can further define terms for the numerator and denominator: $$ \begin{gather*} x_1 = 1 - t^2 \qquad y_1 = 2t \qquad d = 1 + t^2 = 2 - x_1 \\ o_1 = {z_1 \over d} = {x_1 \over d} + i{y_1 \over d} \end{gather*} $$ We have a recurrence relation for *o*, but it does not obey same relations as *z*: $$ \begin{align*} o_{n+2} &= 2c_1 o_{n+1} - o_n \\ z_{n+2} &\stackrel{✗}{=} 2x_1 z_{n+1} - z_n \end{align*} $$ Fortunately, the correction is simple. The denominator term $d^{n+2}$ can be multiplied through the top equation to produce: $$ z_{n+2} = 2x_1 z_{n+1} - z_n d^2 $$ The only term that changes is the term lagging two terms behind, so the generating function *Z* is: $$ \begin{align*} O(x; o_1) &= {1 + x(o_1 - 2 c_1) \over 1 - 2 c_1 x + x^2} \\[10pt] Z(x; z_1) &= {1 + x(z_1 - 2 x_1) \over 1 - 2 x_1 x + \textcolor{red}{d^2} x^2} \end{align*} $$ We can express *d* in terms of $x_1$, so the terms of the series, like the one for *F*, have - A real component which is a polynomial in $x_1$ (cf. $c_1$) - An imaginary component which is the product of $y_1$ (cf. $s_1$) and a polynomial in $x_1$ $$ Z(x; z_1) = X(x; x_1) + i y_1 Y(x; x_1) $$ Surprisingly, the polynomials in *Y* still factor cleanly, like the [Chebyshev *U* polynomials](../../chebyshev/1/#tbl-chebyshevu). ```{python} #| code-fold: true #| label: tbl-newupolynomials #| tbl-cap: "Table of numerator polynomials" #| classes: plain # cosine series X = ( 1 - x1*x ) / ( 1 - 2*x1*x + (2 - x1)**2*x**2 ) # sine series Y = x / ( 1 - 2*x1*x + (2 - x1)**2*x**2 ) def factor_sequence(polys, offset=0, symbol_name="p"): ret = [] symbols = [] for i, poly in enumerate(polys): new_poly = poly.copy() old_factor = 1 for old, symbol in zip(ret, symbols): q, r = sympy.div(new_poly, old) if r == 0: new_poly = q old_factor *= symbol if new_poly != 1: ret.append(new_poly) symbols.append(sympy.symbols(f"{symbol_name}_{i + offset}")) yield poly, old_factor*new_poly.factor() Markdown(tabulate( [ [ n+1, "$" + sympy.latex(poly) + "$", sympy.Poly(unfactored, z).as_list() ] for n, (unfactored, poly) in enumerate( factor_sequence( sorted( [ i.subs(x,1).subs(x1, z).expand().factor() for i in Y.series(x, n=11).args ][:-1], key=lambda x: sympy.degree(x, z) ), 1 ) ) ], headers=[ "*n*", "$[x^n]Y(x; z) = p_n(z)$", "Coefficients (descending powers)" ], numalign="left", stralign="left", )) ``` Unfortunately, the sequence formed by the coefficients of the polynomials does not appear in the OEIS. Their factorizations appear to have the following traits: - Like the Chebyshev *U* polynomials, they have "cyclotomic factoring" -- for the new term of index *n*, the factors can be separated into old factors at indices of factors of *n* and new factors. - If the index is even, then there is only one new monic, irreducible factor. - If the index is odd, then there are two new irreducible factors - If the index is prime or a prime power, the new factors are a monic and a non-monic whose leading coefficient is that prime. - Otherwise, the new factors are both monic. The characterization of the leading terms of the new factor corresponds to [OEIS A014963](https://oeis.org/A014963), which is related to cyclotomic polynomials. ### Similar Sequences In fact, for a polynomial $q(z)$, it seems to be the case that the terms of $$ Y(x; z) = {x \over 1 - 2 z x + q(z) x^2} $$ tend to factor similarly. Naturally, the *U* polynomials are the choice where *q = 1* and the new polynomials are the choice when $q = (2 - z)^2$. One can also write down a series for $z^n - 1$, which factor as the cyclotomic polynomials, and also end up being generated by an order-2 recurrence. $$ \begin{align*} N(x; z) &= \sum_n (z^n - 1)x^n = {x(z - 1) \over 1 - (z + 1)x + zx^2} \\ &= \sum_n \left ( x^n \prod_{d | n} \Phi_d(z) \right ) \end{align*} $$ Actually, this shouldn't be terribly surprising. For example, a simple result from generating functions tells us that a series for the integers is: $$ \begin{align*} F(z) &= {1 \over 1 - z} = \sum_n z^n && \text{All coefficients equal 1} \\ F'(z) &= {1 \over ( 1 - z )^2 } = \sum_n n z^{n - 1} && \text{Integers} \\ z F'(z) &= {z \over 1 - 2z + z^2} = \sum_n n z^n && \text{Integers matching powers} \end{align*} $$ The denominator being a quadratic polynomial means that the series terms *n*, the integers, obey an order-2 recurrence, and factor in a similar way. Obviously, the integers factor into primes by the fundamental theorem of arithmetic. There's still an important distinction to be made about the polynomials, though. Factoring a composite like 6 into 2 and 3 leaves an empty product behind, but for polynomials, nonprime indices end up accumulate an "extra" factor. Additionally (or rather, probably because of this), *all* factors of the index correspond to a factor in the factorization, rather than pairing off as in integers. For example, factoring 12 once gives either 3 and 4 or 2 and 6, but the polynomial at index 12 includes polynomials at indices of all factors: 2, 3, 4, 6, and 12. ### Higher-order Recurrences The integers also obey an order-3 recurrence: $$ \begin{align*} F(x) &= {x \over 1 - 2x + x^2} = {x(1 - x) \over (1 - 2x + x^2)(1 - x)} \\ &= {x - x^2 \over 1 - 3x + 3x^2 - x^3} \\[10pt] &\equiv a_{n+3} = 3a_{n+2} - 3a_{n+1} + a_n \end{align*} $$ Another sequence that obeys similar factoring rules rules to the integers is $$ G(x; z) = {x - x^2 \over 1 - z x + z x^2 - x^3} $$ ```{python} #| code-fold: true #| tbl-cap: "Table of G polynomials" #| classes: plain G = (x - x**2) / ( 1 - z*x + z*x**2 - x**3 ) Markdown(tabulate( [ [ n+1, "$" + sympy.latex(poly) + "$", sympy.Poly(unfactored, z).as_list() ] for n, (unfactored, poly) in enumerate( factor_sequence( sorted( [ i.subs(x,1).subs(x1, z).expand().factor() for i in G.series(x, n=11).args ][:-1], key=lambda x: sympy.degree(x, z) ), 1, "o" ) ) ], headers=[ "*n*", "$[x^n]G(x; z) = o_n(z)$", "Coefficients (descending powers)" ], numalign="left", stralign="left", )) ``` There are a couple of things to note here. Some of the factor polynomials here are the [minimal polynomials of cosine](/posts/math/chebyshev/1/#tbl-cosinepolynomials) The row where *n* = 5 is somewhat interesting. Namely, $x^2 - x - 1$ has $\varphi$ (the golden ratio) as a root. The other polynomial, $x^2 - 3x + 1$, has $\varphi^2$ as a root. This seems to indicate that the other polynomial has roots which are an algebraic expression of the other's, but I haven't bothered attempting a proof of this. Unfortunately, peppering polynomials into the denominator and hoping that the same factorization occurs isn't as easy as in the order-2 recurrence. In fact, higher-order recurrences become more and more restrictive as $x^\bullet$ terms are added to the numerator and denominator. If there is a rule to determine what relation must be obeyed between the coefficients for factorization to occur, it is not obvious, especially as the order grows.