From 72e2489e3cf448d3071e8d0cc02ebce786769aa1 Mon Sep 17 00:00:00 2001 From: queue-miscreant Date: Thu, 17 Jul 2025 04:37:10 -0500 Subject: [PATCH] initial revisions to finite.2 --- .../2/char_2_irreducibles_graphs.png | Bin 0 -> 92621 bytes posts/finite-field/2/index.qmd | 1128 +++++++++++------ 2 files changed, 715 insertions(+), 413 deletions(-) create mode 100644 posts/finite-field/2/char_2_irreducibles_graphs.png diff --git a/posts/finite-field/2/char_2_irreducibles_graphs.png b/posts/finite-field/2/char_2_irreducibles_graphs.png new file mode 100644 index 0000000000000000000000000000000000000000..281bd8bda92b7f6799571b464011d4e3e32d74cb GIT binary patch literal 92621 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

>Lvd=@B)7 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

    |gdeZQ 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 pPP7kxR9dA)J6 .red { color: red; } -.green { - color: green; -} -.blue { - color: blue; -} .orange { color: orange; } .yellow { color: yellow; } +.green { + color: green; +} +.blue { + color: blue; +} .purple { color: purple; } + -Exploring Finite Fields, Part 2: Matrix Boogaloo -================================================ - -In the [last post](), we discussed finite fields, polynomials and matrices over them, and the typical, symbolic way of extending fields with polynomials. This post will will focus on circumventing symbolic means with numeric ones. +In the [last post](../1), we discussed finite fields, polynomials and matrices over them, and the typical, + symbolic way of extending fields with polynomials. +This post will will focus on circumventing symbolic means with numeric ones. More about Matrices (and Polynomials) ------------------------------------- -Recall the definition of polynomial evaluation. Since a polynomial is defined with respect to a certain structure (e.g., the integers), we expect to only be able to evaluate the polynomial within that structure. +Recall the definition of polynomial evaluation. +Since a polynomial is defined with respect to a field or ring, we expect only to be able to evaluate the + polynomial at values *in* that field or ring. $$ -K[x] \times K \overset{\text{eval}}{\longrightarrow} K +\begin{gather*} + K[x] \times K \overset{\text{eval}}{\longrightarrow} K + \\ + (p(x), n) \overset{\text{eval}}{\mapsto} p(n) +\end{gather*} $$ -However, there's nothing wrong with evaluating polynomials with another polynomial, as long as they're defined over the same structure. After all, we can take powers of polynomials and scalar-multiply them with coefficients from *K*. The same holds for matrices, or any bigger structure *F* over *K* which has these properties. +However, there's nothing wrong with evaluating polynomials with another polynomial, + as long as they're defined over the same structure. +After all, we can take powers of polynomials, scalar-multiply them with coefficients from *K*, + and add them together. +The same holds for matrices, or any "collection" structure *F* over *K* which has those properties. $$ \begin{align*} -K[x] \times K[x] &\overset{\text{eval}_{poly}}{\longrightarrow} K[x] \\ ~ \\ -K[x] \times K^{n \times n} &\overset{\text{eval}_{mat}}{\longrightarrow} K^{n \times n} \\ ~ \\ -K[x] \times F(K) &\overset{\text{eval}_F}{\longrightarrow} F(K) + K[x] \times K[x] + &\overset{\text{eval}_{poly}}{\longrightarrow} K[x] + \\ + (p(x), q(x)) \mapsto p(q(x)) + \\[10pt] + K[x] \times K^{n \times n} + &\overset{\text{eval}_{mat}}{\longrightarrow} K^{n \times n} + (p(x), A) \overset{?}{\mapsto} p(A) + \\[10pt] + K[x] \times F(K) + &\overset{\text{eval}_F}{\longrightarrow} F(K) \end{align*} $$ -Essentially, this means we can extend a polynomial into new structures by evaluating it in certain ways: +Rather than redefining evaluation for each of these cases, + we should map our polynomial into a structure compatible with how we want to evaluate it. +Essentially, this means that from a polynomial in the base structure, + we can derive polynomials in these other structures. +In particular, we can either have a matrix of polynomials or a polynomial in matrices. + +:::: {layout-ncol="2"} +::: {} $$ \begin{align*} -& \phantom{I} \begin{align*} -p &: K[x] \\ -p(x) &= x^n + p_{n-1}x^{n-1} + ... + p_1 x + p_0 & -\end{align*} & -\text{$x$ is a scalar indeterminate} \\ ~ \\ -& \begin{align*} -P &: (K[x])^{m \times m} \\ -P(x I) &= (x I)^n + (p_{n-1})(x I)^{n-1} + ... & - \\ -\phantom{= p} & + p_1(x I)+ p_0 I -\end{align*} & -\begin{align*} - \text{$x$ is a scalar indeterminate,} \\ -\text{$P(x I)= p(x) I$ is a } \\ -\text{matrix of polynomials in $x$} -\end{align*} \\ -\\ -& \begin{align*} -\hat P &: K^{m \times m}[X] \\ -\hat P(X) &= X^n + (p_{n-1}I)X^{n-1} + ... \\ - & + (p_1 I) X + (p_0 I) -\end{align*} & -\begin{align*} -\text{$X$ is a matrix indeterminate} \\ -\hat P(X) \text{ is a polynomial over matrices} -\end{align*} + p &: K[x] + \\ + p(x) &= x^n + p_{n-1}x^{n-1} + ... + \\ + \phantom{= p} & + p_1 x + p_0 \end{align*} $$ +::: -Or by using types instead of the more abstract notation above, we can describe functions that convert p to P and $\hat P$. +::: {} +$x$ is a scalar indeterminate ```{.haskell} -asPolynomialMatrix :: Polynomial Int -> Matrix (Polynomial Int) -asMatrixPolynomial :: Polynomial Int -> Polynomial (Matrix Int) +p :: Polynomial K ``` +::: +:::: + +:::: {layout-ncol="2"} +::: {} +$$ +\begin{align*} + P &: (K[x])^{m \times m} + \\ + P(x I) &= (x I)^n + (p_{n-1})(x I)^{n-1} + ... + \\ + & + p_1(x I)+ p_0 I +\end{align*} +$$ +::: + +::: {} +$x$ is a scalar indeterminate, $P(x I)= p(x) I$ is a matrix of polynomials in $x$ + +```{.haskell} +asPolynomialMatrix + :: Polynomial K -> Matrix (Polynomial K) + +pMat :: Matrix (Polynomial K) +pMat = asPolynomialMatrix p +``` +::: +:::: + +:::: {layout-ncol="2"} +::: {} +$$ +\begin{align*} + \hat P &: K^{m \times m}[X] + \\ + \hat P(X) &= X^n + (p_{n-1}I)X^{n-1} + ... + \\ + & + (p_1 I) X + (p_0 I) +\end{align*} +$$ +::: + +::: {} +$X$ is a matrix indeterminate, $\hat P(X)$ is a polynomial over matrices + +```{.haskell} +asMatrixPolynomial + :: Polynomial K -> Polynomial (Matrix K) + +pHat :: Polynomial (Matrix K) +pHat = asMatrixPolynomial p +``` +::: +:::: + ### Cayley-Hamilton Theorem -When evaluating the characteristic polynomial of a matrix *with* that matrix, something strange happens. Continuing from the previous article, using $x^2 + x + 1$ and its companion matrix, we have: +When evaluating the characteristic polynomial of a matrix *with* that matrix, + something strange happens. +Continuing from the previous article, using $x^2 + x + 1$ and its companion matrix, we have: $$ -p(x) = x^2 + x + 1 \qquad C_{p} = C = -\left( \begin{matrix} -0 & 1 \\ --1 & -1 -\end{matrix} \right) \\ ~ \\ -\hat P(C) = C^2 + C + (1 \cdot I) = -\left( \begin{matrix} --1 & -1 \\ -1 & 0 -\end{matrix} \right) + -\left( \begin{matrix} -0 & 1 \\ --1 & -1 -\end{matrix} \right) + -\left( \begin{matrix} -1 & 0 \\ -0 & 1 -\end{matrix} \right) \\ ~ \\ -= \left( \begin{matrix} -0 & 0 \\ -0 & 0 -\end{matrix} \right) +\begin{gather*} + p(x) = x^2 + x + 1 \qquad C_{p} = C + = \left( \begin{matrix} + 0 & 1 \\ + -1 & -1 + \end{matrix} \right) + \\ \\ + \hat P(C) = C^2 + C + (1 \cdot I) + = \left( \begin{matrix} + -1 & -1 \\ + 1 & 0 + \end{matrix} \right) + + \left( \begin{matrix} + 0 & 1 \\ + -1 & -1 + \end{matrix} \right) + + \left( \begin{matrix} + 1 & 0 \\ + 0 & 1 + \end{matrix} \right) + \\ \\ + = \left( \begin{matrix} + 0 & 0 \\ + 0 & 0 + \end{matrix} \right) +\end{gather*} $$ -The result is the zero matrix. This tells us that, at least in this case, the matrix *C* is a root of its own characteristic polynomial. +The result is the zero matrix. +This tells us that, at least in this case, the matrix *C* is a root of its own characteristic polynomial. +By the [Cayley-Hamilton theorem](https://en.wikipedia.org/wiki/Cayley%E2%80%93Hamilton_theorem), + this is true in general, no matter the degree of *p*, no matter its coefficients, + and importantly, no matter the choice of field. -By the [Cayley-Hamilton theorem](https://en.wikipedia.org/wiki/Cayley%E2%80%93Hamilton_theorem), this is true in general, no matter the degree of *p*, no matter its coefficients, and importantly, no matter the choice of field. This is more powerful than it would otherwise seem. For one, factoring a polynomial "inside" a matrix turns out to give the same answer as factoring a polynomial over matrices. +This is more powerful than it would otherwise seem. +For one, factoring a polynomial "inside" a matrix turns out to give the same answer + as factoring a polynomial over matrices. -:::: {layout-ncol = "2"} +:::: {layout-ncol="2"} ::: {} + $$ -P(xI) = \left( \begin{matrix} -x^2 + x + 1 & 0 \\ -0 & x^2 + x + 1 -\end{matrix}\right) \\ ~ \\ = (xI - C)(xI - C') \\ ~ \\ -= -\left( \begin{matrix} -x & -1 \\ -1 & x + 1 -\end{matrix} \right) -\left( \begin{matrix} -x - a & -b \\ --c & x - d -\end{matrix} \right) \\ ~ \\ -\begin{align*} -x(x-a) + c &= x^2 + x + 1 \\ -\textcolor{green}{x(-b) - (x - d)} &\textcolor{green}{= 0} \\ -\textcolor{blue}{(x - a) + (x + 1)(-c)} &\textcolor{blue}{= 0} \\ -(-b) + (x + 1)(x - d) &= x^2 + x + 1 \\ -\end{align*} -\\ ~ \\ -\textcolor{green}{(-b -1)x +d = 0} \implies b = -1, ~ d = 0 \\ -\textcolor{blue}{(1 - c)x - a - c = 0} \implies c = 1, ~ a = -1 -\\ ~ \\ -C' = -\left( \begin{matrix} --1 &-1 \\ -1 & 0 -\end{matrix} \right) +\begin{gather*} + P(xI) = \left( \begin{matrix} + x^2 + x + 1 & 0 \\ + 0 & x^2 + x + 1 + \end{matrix}\right) + \\ \\ + = (xI - C)(xI - C') + \\ \\ + = \left( \begin{matrix} + x & -1 \\ + 1 & x + 1 + \end{matrix} \right) + \left( \begin{matrix} + x - a & -b \\ + -c & x - d + \end{matrix} \right) + \\ \\ + \begin{align*} + x(x - a) + c &= x^2 + x + 1 + \\ + \textcolor{green}{x(-b) - (x - d)} &\textcolor{green}{= 0} + \\ + \textcolor{blue}{(x - a) + (x + 1)(-c)} &\textcolor{blue}{= 0} + \\ + (-b) + (x + 1)(x - d) &= x^2 + x + 1 + \end{align*} + \\ \\ + \textcolor{green}{(-b -1)x +d = 0} \implies b = -1, ~ d = 0 \\ + \textcolor{blue}{(1 - c)x - a - c = 0} \implies c = 1, ~ a = -1 + \\ \\ + C' = + \left( \begin{matrix} + -1 & -1 \\ + 1 & 0 + \end{matrix} \right) +\end{gather*} $$ ::: ::: {} $$ -\hat P(X) = X^2 + X + 1I \\ ~ \\ -= (X - C)(X - C') \\ ~ \\ -= X^2 - (C + C')X + CC' -\\ ~ \\ \implies \\ ~\\ -C + C' = -I, ~ C' = -I - C \\ ~ \\ -CC' = I, ~ C^{-1} = C' \\ ~ \\ -C' = \left( \begin{matrix} --1 & -1 \\ -1 & 0 -\end{matrix} \right) +\begin{gather*} + \hat P(X) = X^2 + X + 1I + \\[10pt] + = (X - C)(X - C') + \\[10pt] + = X^2 - (C + C')X + CC' + \\[10pt] + \implies + \\[10pt] + C + C' = -I, ~ C' = -I - C + \\[10pt] + CC' = I, ~ C^{-1} = C' + \\[10pt] + C' = \left( \begin{matrix} + -1 & -1 \\ + 1 & 0 + \end{matrix} \right) +\end{gather*} $$ ::: :::: -It's important to not that a matrix factorization is not unique. *Any* matrix with a given characteristic polynomial can be used as a root of that polynomial. Of course, choosing one root affects the other matrix roots. +It's important to not that a matrix factorization is not unique. +*Any* matrix with a given characteristic polynomial can be used as a root of that polynomial. +Of course, choosing one root affects the other matrix roots. ### Moving Roots -All matrices commute with the identity and zero matrices. A less obvious fact is that all of the matrix roots *also* commute with one another. By the Fundamental Theorem of Algebra, [Vieta's formulas](https://en.wikipedia.org/wiki/Vieta%27s_formulas) state: +All matrices commute with the identity and zero matrices. +A less obvious fact is that all of the matrix roots *also* commute with one another. +By the Fundamental Theorem of Algebra, + [Vieta's formulas](https://en.wikipedia.org/wiki/Vieta%27s_formulas) state: $$ -\hat P(X) = -\prod_{[i]_n} (X - \Xi_i) = -(X - \Xi_0) (X - \Xi_1)...(X - \Xi_{n-1}) \\ -= \left\{ \begin{align*} & -\phantom{+} X^n \\ -& - (\Xi_0 + \Xi_1 + ... + \Xi_{n-1}) X^{n-1} \\ -& + (\Xi_0 \Xi_1+ \Xi_0 \Xi_2 + ... + \Xi_0 \Xi_{n-1} + \Xi_1 \Xi_2 + ... \Xi_{n-2} \Xi_{n-1})X^{n-2} \\ -& \qquad \vdots \\ -& + (-1)^n \Xi_0 \Xi_1 \Xi_2...\Xi_n -\end{align*} \right. -\\ -= X^n -\sigma_1([\Xi]_n)X^{n-1} + \sigma_2([\Xi]_n)X^{n-2} + ... + (-1)^n \sigma_n([\Xi]_n) +\begin{gather*} + \hat P(X) + = \prod_{[i]_n} (X - \Xi_i) + = (X - \Xi_0) (X - \Xi_1)...(X - \Xi_{n-1}) + \\ + = \left\{ \begin{align*} + & \phantom{+} X^n + \\ + & - (\Xi_0 + \Xi_1 + ... + \Xi_{n-1}) X^{n-1} + \\ + & + (\Xi_0 \Xi_1+ \Xi_0 \Xi_2 + ... + \Xi_0 \Xi_{n-1} + \Xi_1 \Xi_2 + ... + \Xi_{n-2} \Xi_{n-1})X^{n-2} + \\ + & \qquad \vdots + \\ + & + (-1)^n \Xi_0 \Xi_1 \Xi_2...\Xi_n + \end{align*} \right. + \\ + = X^n -\sigma_1([\Xi]_n)X^{n-1} + \sigma_2([\Xi]_n)X^{n-2} + ... + (-1)^n \sigma_n([\Xi]_n) +\end{gather*} $$ -The product range \[*i*\]~*n*~ means that the terms are ordered from 0 to *n* - 1 over the index given. On the bottom line, *σ* are [elementary symmetric polynomials](https://en.wikipedia.org/wiki/Elementary_symmetric_polynomial) and \[*Ξ*\]~*n*~ is the list of root matrices from *Ξ*~*0*~ to Ξ~*n-1*~. +The product range \[*i*\]~*n*~ means that the terms are ordered from 0 to *n* - 1 over the index given. +On the bottom line, *σ* are + [elementary symmetric polynomials](https://en.wikipedia.org/wiki/Elementary_symmetric_polynomial) + and \[*Ξ*\]~*n*~ is the list of root matrices from *Ξ*~*0*~ to Ξ~*n-1*~. -By factoring the matrix with the roots in a different order, we get another factorization. It suffices to only focus on *σ*~2~, which has all pairwise products. +By factoring the matrix with the roots in a different order, we get another factorization. +It suffices to only focus on *σ*~2~, which has all pairwise products. $$ -\pi \in S_n \\ \qquad -\pi \circ \hat P(X) = \prod_{\pi ([i]_n)} (X - \Xi_i) \\ ~ \\ -= X^n -- \sigma_1 \left(\pi ([\Xi]_n) \vphantom{^{1}} \right)X^{n-1} + -+ \sigma_2 \left(\pi ([\Xi]_n) \vphantom{^{1}} \right)X^{n-2} + ... -+ (-1)^n \sigma_n \left(\pi ([\Xi]_n) \vphantom{^{1}} \right) -\\ ~ \\ -\\ ~ \\ -(0 ~ 1) \circ \hat P(X) = (X - \Xi_{1}) (X - \Xi_0)(X - \Xi_2)...(X - \Xi_{n-1}) -\\ -= X^n + ... + \sigma_2(\Xi_1, \Xi_0, \Xi_2, ...,\Xi_{n-1})X^{n-2} + ... \\ -\\ ~ \\ ~ \\ -\begin{array}{} -e & (0 ~ 1) & (1 ~ 2) & ... & (n-2 ~~ n-1) \\ \hline -\textcolor{red}{\Xi_0 \Xi_1} & \textcolor{red}{\Xi_1 \Xi_0} & \Xi_0 \Xi_1 & & \Xi_0 \Xi_1\\ -\Xi_0 \Xi_2 & \Xi_0 \Xi_2 & \Xi_0 \Xi_2 & & \Xi_0 \Xi_2 \\ -\Xi_0 \Xi_3 & \Xi_0 \Xi_3 & \Xi_0 \Xi_3 & & \Xi_0 \Xi_3 \\ -\vdots & \vdots & \vdots & & \vdots \\ -\Xi_0 \Xi_{n-1} & \Xi_0 \Xi_{n-1} & \Xi_{0} \Xi_{n-1} & & \Xi_{n-1} \Xi_0\\ -\textcolor{green}{\Xi_1 \Xi_2} & \Xi_1 \Xi_2 & \textcolor{green}{\Xi_2 \Xi_1} & & \Xi_1 \Xi_2 \\ -\vdots & \vdots & \vdots & & \vdots \\ -\textcolor{blue}{\Xi_{n-2} \Xi_{n-1}} & \Xi_{n-2} \Xi_{n-1} & \Xi_{n-2} \Xi_{n-1} & & \textcolor{blue}{\Xi_{n-1} \Xi_{n-2}} \\ -\end{array} +\begin{gather*} + \pi \in S_n + \\ + \qquad + \pi \circ \hat P(X) = \prod_{\pi ([i]_n)} (X - \Xi_i) + \\ \\ + = X^n + - \sigma_1 \left(\pi ([\Xi]_n) \vphantom{^{1}} \right)X^{n-1} + + + \sigma_2 \left(\pi ([\Xi]_n) \vphantom{^{1}} \right)X^{n-2} + ... + + (-1)^n \sigma_n \left(\pi ([\Xi]_n) \vphantom{^{1}} \right) + \\ \\ + \\ \\ + (0 ~ 1) \circ \hat P(X) = (X - \Xi_{1}) (X - \Xi_0)(X - \Xi_2)...(X - \Xi_{n-1}) + \\ + = X^n + ... + \sigma_2(\Xi_1, \Xi_0, \Xi_2, ...,\Xi_{n-1})X^{n-2} + ... + \\ \\ \\ \\ + \begin{array}{} + e & (0 ~ 1) & (1 ~ 2) & ... & (n-2 ~~ n-1) + \\ \hline + \textcolor{red}{\Xi_0 \Xi_1} & \textcolor{red}{\Xi_1 \Xi_0} & \Xi_0 \Xi_1 & & \Xi_0 \Xi_1 + \\ + \Xi_0 \Xi_2 & \Xi_0 \Xi_2 & \Xi_0 \Xi_2 & & \Xi_0 \Xi_2 + \\ + \Xi_0 \Xi_3 & \Xi_0 \Xi_3 & \Xi_0 \Xi_3 & & \Xi_0 \Xi_3 + \\ + \vdots & \vdots & \vdots & & \vdots + \\ + \Xi_0 \Xi_{n-1} & \Xi_0 \Xi_{n-1} & \Xi_{0} \Xi_{n-1} & & \Xi_{n-1} \Xi_0 + \\ + \textcolor{green}{\Xi_1 \Xi_2} & \Xi_1 \Xi_2 & \textcolor{green}{\Xi_2 \Xi_1} & & \Xi_1 \Xi_2 + \\ + \vdots & \vdots & \vdots & & \vdots + \\ + \textcolor{blue}{\Xi_{n-2} \Xi_{n-1}} & \Xi_{n-2} \Xi_{n-1} & \Xi_{n-2} \Xi_{n-1} & & \textcolor{blue}{\Xi_{n-1} \Xi_{n-2}} + \end{array} +\end{gather*} $$ -The "[path swaps]()" shown commute only the adjacent elements. By contrast, the permutation (0 2) commutes *Ξ*~0~ past both *Ξ*~1~ and *Ξ*~2~. But since we already know *Ξ*~0~ and *Ξ*~1~ commute by the above list, we learn at this step that *Ξ*~0~ and *Ξ*~2~ commute. This can be repeated until we reach the permutation (0 *n*-1) to prove commutativity between all pairs. + +The "[path swaps]()" shown commute only the adjacent elements. +By contrast, the permutation (0 2) commutes *Ξ*~0~ past both *Ξ*~1~ and *Ξ*~2~. +But since we already know *Ξ*~0~ and *Ξ*~1~ commute by the above list, + we learn at this step that *Ξ*~0~ and *Ξ*~2~ commute. +This can be repeated until we reach the permutation (0 *n*-1) to prove commutativity between all pairs. ### Matrix Fields? -The above arguments tell us that if *p* is irreducible, we can take its companion matrix *C*~*p*~ and work with its powers in the same way we would a typical root. Irreducible polynomials cannot have a constant term 0, otherwise *x* could be factored out. The constant term is equal to the determinant of the companion matrix (up to sign), so *C*~*p*~ is invertible. We get commutativity for free, since it follows from associativity that all powers of *C*~*p*~ commute. +The above arguments tell us that if *p* is irreducible, we can take its companion matrix *C*~*p*~ + and work with its powers in the same way we would a typical root. +Irreducible polynomials cannot have a constant term 0, otherwise *x* could be factored out. +The constant term is equal to the determinant of the companion matrix (up to sign), + so *C*~*p*~ is invertible. +We get commutativity for free, since it follows from associativity + that all powers of *C*~*p*~ commute. -This narrows the ring of matrices to a full-on field. Importantly, it absolves us from the need to symbolically render elements using a power of the root. Instead, they can be adjoined by going from scalars to matrices. We can also find every element in the field arithmetically. Starting with a root, every element, produce new elements taking its matrix powers. Then, scalar-multiply them and add them to elements of the field which are already known. For finite fields, we can repeat this process with the new matrices until we have all *p*^*d*^ elements. +This narrows the ring of matrices to a full-on field. +Importantly, it absolves us from the need to symbolically render elements using a power of the root. +Instead, they can be adjoined by going from scalars to matrices. +We can also find every element in the field arithmetically. +Starting with a root, every element, produce new elements taking its matrix powers. +Then, scalar-multiply them and add them to elements of the field which are already known. +For finite fields, we can repeat this process with the new matrices + until we have all *p*^*d*^ elements. GF(8) ----- -This is all rather abstract, so let's look at an example before we proceed any further. The next smallest field of characteristic 2 is GF(8). We can construct this field from the two irreducible polynomials of degree 3 over GF(2): +This is all rather abstract, so let's look at an example before we proceed any further. +The next smallest field of characteristic 2 is GF(8). +We can construct this field from the two irreducible polynomials of degree 3 over GF(2): $$ -q(x) = x^3 + x + 1 = 1011_x \sim {}_2 11 \qquad -C_q = \left( \begin{matrix} -0 & 1 & 0 \\ -0 & 0 & 1 \\ -1 & 1 & 0 -\end{matrix} \right) \mod 2 \\ ~ \\ -r(x) = x^3 + x^2 + 1 =1101_x \sim {}_2 13 \qquad -C_r = \left( \begin{matrix} -0 & 1 & 0 \\ -0 & 0 & 1 \\ -1 & 0 & 1 -\end{matrix} \right) \mod 2 \\ +\begin{gather*} + q(x) = x^3 + x + 1 = 1011_x \sim {}_2 11 \qquad + C_q = \left( \begin{matrix} + 0 & 1 & 0 \\ + 0 & 0 & 1 \\ + 1 & 1 & 0 + \end{matrix} \right) \mod 2 + \\ \\ + r(x) = x^3 + x^2 + 1 =1101_x \sim {}_2 13 \qquad + C_r = \left( \begin{matrix} + 0 & 1 & 0 \\ + 0 & 0 & 1 \\ + 1 & 0 & 1 + \end{matrix} \right) \mod 2 +\end{gather*} $$ -Notice how the bit strings for either of these polynomials is the other, reversed. Arbitrarily, let's work with Cr. The powers of this matrix, mod 2, are as follows: +Notice how the bit strings for either of these polynomials is the other, reversed. +Arbitrarily, let's work with C~r~. +The powers of this matrix, mod 2, are as follows: $$ -(C_r)^1 = \left( \begin{matrix} -0 & 1 & 0 \\ -0 & 0 & 1 \\ -1 & 0 & 1 -\end{matrix} \right) -\quad -(C_r)^2 = \left( \begin{matrix} -0 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 1 & 1 -\end{matrix} \right) -\quad -(C_r)^3 = \left( \begin{matrix} -1 & 0 & 1 \\ -1 & 1 & 1 \\ -1 & 1 & 0 -\end{matrix} \right) -\\ -(C_r)^4 = \left( \begin{matrix} -1 & 1 & 1 \\ -1 & 1 & 0 \\ -0 & 1 & 1 -\end{matrix} \right) \quad -(C_r)^5 = \left( \begin{matrix} -1 & 1 & 0 \\ -0 & 1 & 1 \\ -1 & 0 & 0 -\end{matrix} \right) \quad -(C_r)^6 = \left( \begin{matrix} -0 & 1 & 1 \\ -1 & 0 & 0 \\ -0 & 1 & 0 -\end{matrix} \right) -\\ -(C_r)^7 = \left( \begin{matrix} -1 & 0 & 0 \\ -0 & 1 & 0 \\ -0 & 0 & 1 -\end{matrix} \right) = I = (C_r)^0 \quad -(C_r)^8 = \left( \begin{matrix} -0 & 1 & 0 \\ -0 & 0 & 1 \\ -1 & 0 & 1 -\end{matrix} \right) = C_r +\begin{gather*} + (C_r)^1 = \left( \begin{matrix} + 0 & 1 & 0 \\ + 0 & 0 & 1 \\ + 1 & 0 & 1 + \end{matrix} \right) + \quad + (C_r)^2 = \left( \begin{matrix} + 0 & 0 & 1 \\ + 1 & 0 & 1 \\ + 1 & 1 & 1 + \end{matrix} \right) + \quad + (C_r)^3 = \left( \begin{matrix} + 1 & 0 & 1 \\ + 1 & 1 & 1 \\ + 1 & 1 & 0 + \end{matrix} \right) + \\ + (C_r)^4 = \left( \begin{matrix} + 1 & 1 & 1 \\ + 1 & 1 & 0 \\ + 0 & 1 & 1 + \end{matrix} \right) \quad + (C_r)^5 = \left( \begin{matrix} + 1 & 1 & 0 \\ + 0 & 1 & 1 \\ + 1 & 0 & 0 + \end{matrix} \right) \quad + (C_r)^6 = \left( \begin{matrix} + 0 & 1 & 1 \\ + 1 & 0 & 0 \\ + 0 & 1 & 0 + \end{matrix} \right) + \\ + (C_r)^7 = \left( \begin{matrix} + 1 & 0 & 0 \\ + 0 & 1 & 0 \\ + 0 & 0 & 1 + \end{matrix} \right) = I + = (C_r)^0 \quad + (C_r)^8 = \left( \begin{matrix} + 0 & 1 & 0 \\ + 0 & 0 & 1 \\ + 1 & 0 & 1 + \end{matrix} \right) = C_r +\end{gather*} $$ -As a reminder, these matrices are taken mod 2, so the elements can only be 0 or 1. The seventh power of *C*~*r*~ is just the identity matrix, meaning that the eighth power is the original matrix. This means that *C*~*r*~ is cyclic of order 7 with respect to self-multiplication mod 2. Along with the zero matrix, this fully characterizes GF(8). +As a reminder, these matrices are taken mod 2, so the elements can only be 0 or 1. +The seventh power of *C*~*r*~ is just the identity matrix, + meaning that the eighth power is the original matrix. +This means that *C*~*r*~ is cyclic of order 7 with respect to self-multiplication mod 2. +Along with the zero matrix, this fully characterizes GF(8). -If we picked *C*~*q*~ instead, we would have gotten different matrices. I'll omit writing them here, but we get the same result: *C*~*q*~ is also cyclic of order 7. Since every nonzero element of the field can be written as a power of the root, the root (and the polynomial) is termed [primitive](https://en.wikipedia.org/wiki/Primitive_polynomial_%28field_theory%29). +If we picked *C*~*q*~ instead, we would have gotten different matrices. +I'll omit writing them here, but we get the same result: *C*~*q*~ is also cyclic of order 7. +Since every nonzero element of the field can be written as a power of the root, + the root (and the polynomial) is termed + [primitive](https://en.wikipedia.org/wiki/Primitive_polynomial_%28field_theory%29). ### Condensing -Working with matrices directly, as a human, is very cumbersome. While it makes computation explicit, it makes presentation difficult. One of the things in which we know we should be interested is the characteristic polynomial, since it is central to the definition and behavior of the matrices. Let's focus only on the characteristic polynomial for successive powers of *C*~*r*~ +Working with matrices directly, as a human, is very cumbersome. +While it makes computation explicit, it makes presentation difficult. +One of the things in which we know we should be interested is the characteristic polynomial, + since it is central to the definition and behavior of the matrices. +Let's focus only on the characteristic polynomial for successive powers of *C*~*r*~ $$ -C_r = \left( \begin{matrix} -0 & 1 & 0 \\ -0 & 0 & 1 \\ -1 & 0 & 1 -\end{matrix} \right) \mod 2 \\ ~ \\ -\begin{array}{} -\text{charpoly}((C_r)^1) &=& \color{blue} x^3 + x^2 + 1 &=& \color{blue} 1101_x \sim {}_2 13 = r -\\ -\text{charpoly}((C_r)^2) &=& \color{blue} x^3 + x^2 + 1 &=& \color{blue} 1101_x \sim {}_2 13 = r -\\ -\text{charpoly}((C_r)^3) &=& \color{red} x^3 + x + 1 &=& \color{red} 1011_x \sim {}_2 11 = q -\\ -\text{charpoly}((C_r)^4) &=& \color{blue} x^3 + x^2 + 1 &=& \color{blue} 1101_x \sim {}_2 13 = r -\\ -\text{charpoly}((C_r)^5) &=& \color{red} x^3 + x + 1 &=& \color{red} 1011_x \sim {}_2 11 = q -\\ -\text{charpoly}((C_r)^6) &=& \color{red} x^3 + x + 1 &=& \color{red} 1011_x \sim {}_2 11 = q -\\ -\text{charpoly}((C_r)^7) &=& x^3 + x^2 + x + 1 &=& 1111_x \sim {}_2 15 = (x+1)^3 -\end{array} +\begin{gather*} + C_r = \left( \begin{matrix} + 0 & 1 & 0 \\ + 0 & 0 & 1 \\ + 1 & 0 & 1 + \end{matrix} \right) \mod 2 + \\ ~ \\ + \begin{array}{} + \text{charpoly}((C_r)^1) + &=& \color{blue} x^3 + x^2 + 1 + &=& \color{blue} 1101_x \sim {}_2 13 = r + \\ + \text{charpoly}((C_r)^2) + &=& \color{blue} x^3 + x^2 + 1 + &=& \color{blue} 1101_x \sim {}_2 13 = r + \\ + \text{charpoly}((C_r)^3) + &=& \color{red} x^3 + x + 1 + &=& \color{red} 1011_x \sim {}_2 11 = q + \\ + \text{charpoly}((C_r)^4) + &=& \color{blue} x^3 + x^2 + 1 + &=& \color{blue} 1101_x \sim {}_2 13 = r + \\ + \text{charpoly}((C_r)^5) + &=& \color{red} x^3 + x + 1 + &=& \color{red} 1011_x \sim {}_2 11 = q + \\ + \text{charpoly}((C_r)^6) + &=& \color{red} x^3 + x + 1 + &=& \color{red} 1011_x \sim {}_2 11 = q + \\ + \text{charpoly}((C_r)^7) + &=& x^3 + x^2 + x + 1 + &=& 1111_x \sim {}_2 15 = (x+1)^3 + \end{array} +\end{gather*} $$ -Somehow, even though we start with one characteristic polynomial, the other manages to work its way in here. Both polynomials are of degree 3 and have 3 matrix roots (distinguished in red and blue). +Somehow, even though we start with one characteristic polynomial, the other manages to work its way in here. +Both polynomials are of degree 3 and have 3 matrix roots (distinguished in red and blue). -If we chose to use *C*~*q*~, we'd actually get the same sequence backwards (starting with ~2~11). It's beneficial to remember that 6, 5, and 3 can also be written as 7 - 1, 7 - 2, and 7 - 4. This makes it clear that the powers of 2 (the field characteristic) less than the 8 (the order of the field) play a role with respect to both the initial and terminal items. +If we chose to use *C*~*q*~, we'd actually get the same sequence backwards (starting with ~2~11). +It's beneficial to remember that 6, 5, and 3 can also be written as 7 - 1, 7 - 2, and 7 - 4. +This makes it clear that the powers of 2 (the field characteristic) less than the 8 (the order of the field) play a role with respect to both the initial and terminal items. ### Factoring -Intuitively, you may try using the roots to factor the matrix into powers of *C*~*r*~. This turns out to work: +Intuitively, you may try using the roots to factor the matrix into powers of *C*~*r*~. +This turns out to work: $$ -\hat R(X) \overset?= (X - C_r)(X - (C_r)^2)(X - (C_r)^4) \\ -\hat Q(X) \overset?= (X - (C_r)^3)(X - (C_r)^5)(X - (C_r)^6) \\ ~ \\ -\textcolor{red}{ \sigma_1([(C_r)^i]_{i \in [1,2,4]}) } = C_r + (C_r)^2 + (C_r)^4 = \textcolor{red}I \\ -\textcolor{brown}{ \sigma_1([(C_r)^i]_{i \in [3,5,6]}) } = (C_r)^3 + (C_r)^5 + (C_r)^6 = \textcolor{brown}0 \\ ~ \\ -\begin{align*} -\color{blue} \sigma_2([(C_r)^i]_{i \in [1,2,4]}) &= (C_r)(C_r)^2 + (C_r)(C_r)^4 + (C_r)^2(C_r)^4 \\ -&= (C_r)^3 + (C_r)^5 + (C_r)^6 = \color{blue}0 \\ -\color{cyan} \sigma_2([(C_r)^i]_{i \in [3,5,6]}) &= (C_r)^3(C_r)^5 + (C_r)^3(C_r)^6 + (C_r)^5(C_r)^6 \\ -&= (C_r)^8 + (C_r)^9 + (C_r)^{11} \\ -&= (C_r)^1 + (C_r)^2 + (C_r)^4 = \color{cyan} I \\ -\end{align*} -\\ ~ \\ -\textcolor{green}{ \sigma_3([(C_r)^i]_{i \in [1,2,4]}) } = (C_r)(C_r)^2(C_r)^4 = \textcolor{green}I \\ -\textcolor{lightgreen}{ \sigma_3([(C_r)^i]_{i \in [3,5,6]}) }= (C_r)^3(C_r)^5(C_r)^6 = \textcolor{lightgreen}I -\\ ~ \\ -\hat R(X) = X^3 + \textcolor{red}IX^2 + \textcolor{blue}0X + \textcolor{green}I \\ -\hat Q(X) = X^3 + \textcolor{brown}0X^2 + \textcolor{cyan}IX + \textcolor{lightgreen}I +\begin{gather*} + \hat R(X) \overset?= (X - C_r)(X - (C_r)^2)(X - (C_r)^4) + \\ + \hat Q(X) \overset?= (X - (C_r)^3)(X - (C_r)^5)(X - (C_r)^6) + \\ \\ + \textcolor{red}{ \sigma_1([(C_r)^i]_{i \in [1,2,4]}) } = C_r + (C_r)^2 + (C_r)^4 = \textcolor{red}I + \\ + \textcolor{brown}{ \sigma_1([(C_r)^i]_{i \in [3,5,6]}) } = (C_r)^3 + (C_r)^5 + (C_r)^6 = \textcolor{brown}0 + \\ \\ + \begin{align*} + \color{blue} \sigma_2([(C_r)^i]_{i \in [1,2,4]}) + &= (C_r)(C_r)^2 + (C_r)(C_r)^4 + (C_r)^2(C_r)^4 + \\ + &= (C_r)^3 + (C_r)^5 + (C_r)^6 = \color{blue}0 + \\ + \color{cyan} \sigma_2([(C_r)^i]_{i \in [3,5,6]}) + &= (C_r)^3(C_r)^5 + (C_r)^3(C_r)^6 + (C_r)^5(C_r)^6 + \\ + &= (C_r)^8 + (C_r)^9 + (C_r)^{11} + \\ + &= (C_r)^1 + (C_r)^2 + (C_r)^4 = \color{cyan} I + \end{align*} + \\ \\ + \textcolor{green}{ \sigma_3([(C_r)^i]_{i \in [1,2,4]}) } = (C_r)(C_r)^2(C_r)^4 = \textcolor{green}I + \\ + \textcolor{lightgreen}{ \sigma_3([(C_r)^i]_{i \in [3,5,6]}) }= (C_r)^3(C_r)^5(C_r)^6 = \textcolor{lightgreen}I + \\ \\ + \hat R(X) = X^3 + \textcolor{red}IX^2 + \textcolor{blue}0X + \textcolor{green}I + \\ + \hat Q(X) = X^3 + \textcolor{brown}0X^2 + \textcolor{cyan}IX + \textcolor{lightgreen}I +\end{gather*} $$ -We could have factored our polynomials differently if we used *C*~*q*~ instead. However, the effect of splitting both polynomials into monomial factors is the same. +We could have factored our polynomials differently if we used *C*~*q*~ instead. +However, the effect of splitting both polynomials into monomial factors is the same. GF(16) ------ -GF(8) is simple to study, but too simple to study the sequence of characteristic polynomials alone. Let's widen our scope to GF(16). There are three irreducible polynomials of degree 3 over GF(2). +GF(8) is simple to study, but too simple to study the sequence of characteristic polynomials alone. +Let's widen our scope to GF(16). +There are three irreducible polynomials of degree 3 over GF(2). $$ -s(x) = x^4 + x + 1 = 10011_x \sim {}_2 19 \quad -C_s = \left( \begin{matrix} -0 & 1 & 0 & 0 \\ -0 & 0 & 1 & 0 \\ -0 & 0 & 0 & 1 \\ -1 & 1 & 0 & 0 -\end{matrix} \right) \mod 2 -\\ -t(x) = x^4 + x^3 + 1 = 11001_x \sim {}_2 25 \quad -C_t = \left( \begin{matrix} -0 & 1 & 0 & 0 \\ -0 & 0 & 1 & 0 \\ -0 & 0 & 0 & 1 \\ -1 & 0 & 0 & 1 -\end{matrix} \right) \mod 2 -\\ -u(x) = x^4 + x^3 + x^2 + x + 1 = 11111_x \sim {}_2 31 \quad -C_u = \left( \begin{matrix} -0 & 1 & 0 & 0 \\ -0 & 0 & 1 & 0 \\ -0 & 0 & 0 & 1 \\ -1 & 1 & 1 & 1 -\end{matrix} \right) \mod 2 +\begin{gather*} + s(x) = x^4 + x + 1 = 10011_x \sim {}_2 19 \quad + C_s = \left( \begin{matrix} + 0 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 0 & 0 & 0 & 1 \\ + 1 & 1 & 0 & 0 + \end{matrix} \right) \mod 2 + \\ + t(x) = x^4 + x^3 + 1 = 11001_x \sim {}_2 25 \quad + C_t = \left( \begin{matrix} + 0 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 0 & 0 & 0 & 1 \\ + 1 & 0 & 0 & 1 + \end{matrix} \right) \mod 2 + \\ + u(x) = x^4 + x^3 + x^2 + x + 1 = 11111_x \sim {}_2 31 \quad + C_u = \left( \begin{matrix} + 0 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 0 & 0 & 0 & 1 \\ + 1 & 1 & 1 & 1 + \end{matrix} \right) \mod 2 +\end{gather*} $$ -Again, *s* and *t* form a pair under the reversal of their bit strings, while *u* is palindromic. Both *C*~*s*~ and *C*~*t*~ are cyclic of order 15, so *s* and *t* are primitive polynomials. Using *s* = ~2~19 to generate the field, the powers of its companion matrix *C*~*s*~ have the following characteristic polynomials: +Again, *s* and *t* form a pair under the reversal of their bit strings, while *u* is palindromic. +Both *C*~*s*~ and *C*~*t*~ are cyclic of order 15, so *s* and *t* are primitive polynomials. +Using *s* = ~2~19 to generate the field, the powers of its companion matrix *C*~*s*~ + have the following characteristic polynomials: ```{python} #| echo: false @@ -417,18 +630,26 @@ Markdown(tabulate( "charpoly((*C*~*s*~)^*m*^)", *[charpolyformat(charpoly) for charpoly in charpolys] ]], - headers=["*m*", *[i + 1 for i in range(15)]], + headers=["*m*", *[str(i + 1) for i in range(15)]], )) ``` -The polynomial ~2~19 occurs at positions 1, 2, 4, and 8. These are obviously powers of 2, the characteristic of the field. Similarly, the polynomial *t* = ~2~25 occurs at positions 14 (= 15 - 1), 13 (= 15 - 2), 11 (= 15 - 4), and 7 (= 15 - 8). We'd get the same sequence backwards if we used *C*~*t*~ instead, just like in GF(8). +The polynomial ~2~19 occurs at positions 1, 2, 4, and 8. +These are obviously powers of 2, the characteristic of the field. +Similarly, the polynomial *t* = ~2~25 occurs at positions 14 (= 15 - 1), 13 (= 15 - 2), + 11 (= 15 - 4), and 7 (= 15 - 8). +We'd get the same sequence backwards if we used *C*~*t*~ instead, just like in GF(8). ### Non-primitive -The polynomial *u* = ~2~31 occurs at positions 3, 6, 9, and 12 -- multiples of 3, which is a factor of *15*. It follows that the roots of *u* are cyclic of order 5, so this polynomial is irreducible, but *not* primitive. +The polynomial *u* = ~2~31 occurs at positions 3, 6, 9, and 12 + -- multiples of 3, which is a factor of *15*. +It follows that the roots of *u* are cyclic of order 5, so this polynomial is irreducible, + but *not* primitive. -Naturally, $\hat U(X)$ can be factored as powers of (*C*~*s*~)^3^. We can also factor it more naively as powers of *C*~*u*~. Either way, we get the same sequence. +Naturally, $\hat U(X)$ can be factored as powers of (*C*~*s*~)^3^. +We can also factor it more naively as powers of *C*~*u*~. Either way, we get the same sequence. :::: {layout-ncol = "2"} ::: {} @@ -444,52 +665,58 @@ Markdown(tabulate( "charpoly((*C*~*u*~)^*m*^)", *[f"~2~{upower}" for upower in upowers] ]], - headers=["*m*", *[i + 1 for i in range(5)]], + headers=["*m*", *[str(i + 1) for i in range(5)]], )) ``` -Both of the matrices in column 5 happen to be the identity matrix. It follows that this root is only cyclic of order 5. +Both of the matrices in column 5 happen to be the identity matrix. +It follows that this root is only cyclic of order 5. -The polynomials ~2~19 and ~2~25 are reversals of one another and the sequences that their companion matrices generate end one with another -- in this regard, they are dual. However, ~2~31 = 11111~x~ is a palindrome and its sequence ends where it begins, so it is self-dual. +The polynomials ~2~19 and ~2~25 are reversals of one another and the sequences that their companion matrices + generate end one with another -- in this regard, they are dual. +However, ~2~31 = 11111~*x*~ is a palindrome and its sequence ends where it begins, so it is self-dual. ::: ::: {width = "33%"} $$ -(C_u)^1 =\left( \begin{matrix} -0 & 1 & 0 & 0 \\ -0 & 0 & 1 & 0 \\ -0 & 0 & 0 & 1 \\ -1 & 1 & 1 & 1 -\end{matrix} \right) -\\ ~ \\ -(C_u)^2 =\left( \begin{matrix} -0 & 0 & 1 & 0 \\ -0 & 0 & 0 & 1 \\ -1 & 1 & 1 & 1 \\ -1 & 0 & 0 & 0 -\end{matrix} \right) -\\ ~ \\ -(C_u)^3 =\left( \begin{matrix} -0 & 0 & 0 & 1 \\ -1 & 1 & 1 & 1 \\ -1 & 0 & 0 & 0 \\ -0 & 1 & 0 & 0 -\end{matrix} \right) -\\ ~ \\ -(C_u)^4 =\left( \begin{matrix} -1 & 1 & 1 & 1 \\ -1 & 0 & 0 & 0 \\ -0 & 1 & 0 & 0 \\ -0 & 0 & 1 & 0 \\ -\end{matrix} \right) -\\ ~ \\ -(C_u)^5 =\left( \begin{matrix} -1 & 0 & 0 & 0 \\ -0 & 1 & 0 & 0 \\ -0 & 0 & 1 & 0 \\ -0 & 0 & 0 & 1 \\ -\end{matrix} \right) \\ -= I = (C_u)^0 +\begin{gather*} + (C_u)^1 =\left( \begin{matrix} + 0 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 0 & 0 & 0 & 1 \\ + 1 & 1 & 1 & 1 + \end{matrix} \right) + \\ \\ + (C_u)^2 =\left( \begin{matrix} + 0 & 0 & 1 & 0 \\ + 0 & 0 & 0 & 1 \\ + 1 & 1 & 1 & 1 \\ + 1 & 0 & 0 & 0 + \end{matrix} \right) + \\ \\ + (C_u)^3 =\left( \begin{matrix} + 0 & 0 & 0 & 1 \\ + 1 & 1 & 1 & 1 \\ + 1 & 0 & 0 & 0 \\ + 0 & 1 & 0 & 0 + \end{matrix} \right) + \\ \\ + (C_u)^4 =\left( \begin{matrix} + 1 & 1 & 1 & 1 \\ + 1 & 0 & 0 & 0 \\ + 0 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + \end{matrix} \right) + \\ \\ + (C_u)^5 =\left( \begin{matrix} + 1 & 0 & 0 & 0 \\ + 0 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 0 \\ + 0 & 0 & 0 & 1 \\ + \end{matrix} \right) + \\ + = I = (C_u)^0 +\end{gather*} $$ ::: :::: @@ -497,19 +724,31 @@ $$ ### Non-irreducible -In addition to the three irreducibles, a fourth polynomial, ~2~21 = 10101~x~, also appears in the sequence on entries 5 and 10 -- multiples of 5, which is also a factor of 15. Like ~2~31, this polynomial is palindromic. This polynomial is *not* irreducible mod 2, and factors as: +In addition to the three irreducibles, a fourth polynomial, ~2~21 = 10101~*x*~, + also appears in the sequence on entries 5 and 10 -- multiples of 5, which is also a factor of 15. +Like ~2~31, this polynomial is palindromic. +This polynomial is *not* irreducible mod 2, and factors as: $$ -{}_2 21 \sim 10101_x = x^4 + x^2 + 1 = (x^2 + x + 1)^2 \mod 2 \\ ~ \\ -(X - (C_s)^5)(X - (C_s)^{10}) = X^2 + ((C_s)^5 + (C_s)^{10})X + (C_s)^{15} \\ -= X^2 + IX + I +\begin{gather*} + {}_2 21 \sim 10101_x = x^4 + x^2 + 1 = (x^2 + x + 1)^2 \mod 2 + \\[10pt] + (X - (C_s)^5)(X - (C_s)^{10}) = X^2 + ((C_s)^5 + (C_s)^{10})X + (C_s)^{15} + \\ + = X^2 + IX + I +\end{gather*} $$ -Just like how the fields we construct are powers of a prime, this extra element is a power of a smaller irreducible. This is unexpected, but perhaps not surprising. +Just like how the fields we construct are powers of a prime, this extra element is a power + of a smaller irreducible. +This is unexpected, but perhaps not surprising. -Something a little more surprising is that the companion matrix is cyclic of degree *6*, rather than of degree 3 like the matrices encountered in GF(8). The powers of its companion matrix are: +Something a little more surprising is that the companion matrix is cyclic of degree *6*, + rather than of degree 3 like the matrices encountered in GF(8). +The powers of its companion matrix are: -We can think of the repeated sequence as ensuring that there are enough roots of ~2~21. The Fundamental Theorem of Algebra states that there must be 4 roots. For *numbers*, we'd allow duplicate roots with multiplicities greater than 1, but the matrix roots are all distinct. +We can think of the repeated sequence as ensuring that there are enough roots of ~2~21. +The Fundamental Theorem of Algebra states that there must be 4 roots. +For *numbers*, we'd allow duplicate roots with multiplicities greater than 1, but the matrix roots are all distinct. -Basic group theory tells us that as a cyclic group, the matrix's first and fifth powers (in red) are pairs of inverses. The constant term of the characteristic polynomial is the product of all four roots and, as a polynomial over matrices, must be some nonzero multiple of the identity matrix. Since the red roots are a pair of inverses, the blue roots are, too. +Basic group theory tells us that as a cyclic group, the matrix's first and fifth powers + (in red) are pairs of inverses. +The constant term of the characteristic polynomial is the product of all four roots and, + as a polynomial over matrices, must be some nonzero multiple of the identity matrix. +Since the red roots are a pair of inverses, the blue roots are, too. GF(32) ------ -GF(32) turns out to be special. There are six irreducible polynomials of degree 5 over GF(2). Picking one of them at random, ~2~37, and looking at the polynomial sequence it generates, we see: +GF(32) turns out to be special. +There are six irreducible polynomials of degree 5 over GF(2). +Picking one of them at random, ~2~37, and looking at the polynomial sequence it generates, we see: ```{python} #| echo: false @@ -550,7 +797,7 @@ Markdown(tabulate( "-", *[gf32format(gf32power) for gf32power in gf32powers[:15]] ]], - headers=["*m*", *[i for i in range(16 + 1)]], + headers=["*m*", *[str(i) for i in range(16 + 1)]], )) ``` ```{python} @@ -560,43 +807,67 @@ Markdown(tabulate( "charpoly((*C*~*u*~)^*m*^)", *[gf32format(gf32power) for gf32power in gf32powers[:-17:-1]] ]], - headers=["*m*", *[i for i in reversed(range(16, 32))]], + headers=["*m*", *[str(i) for i in reversed(range(16, 32))]], )) ``` -31 is prime, so we don't have any sub-patterns that appear on multiples of factors. In fact, all six irreducible polynomials are present in this table. The pairs in complementary colors form pairs under reversing the polynomials: -~2~37 and ~2~41, -~2~61 and ~2~47, -and ~2~55 and ~2~59. +31 is prime, so we don't have any sub-patterns that appear on multiples of factors. +In fact, all six irreducible polynomials are present in this table. +The pairs in complementary colors form pairs under reversing the polynomials: + ~2~37 and ~2~41, + ~2~61 and ~2~47, + and ~2~55 and ~2~59. -Since their roots have order 31, these polynomials are actually the distinct factors of *x*^31^ - 1 mod 2: +Since their roots have order 31, these polynomials are actually + the distinct factors of *x*^31^ - 1 mod 2: $$ -x^{31} -1 = (x-1)(x^{30} +x^{29} + ... + x + 1) \\ -(x^{30} +x^{29} + ... + x + 1) = \left\{ -\begin{align*} -&\phantom\cdot (x^5 + x^2 + 1) &\sim \quad {}_2 37 \\ -&\cdot (x^5 + x^3 + 1) &\sim \quad {}_2 41 \\ -&\cdot (x^5 + x^4 + x^3 + x^2 + 1) &\sim \quad {}_2 61 \\ -&\cdot (x^5 + x^3 + x^2 + x + 1) &\sim \quad {}_2 47 \\ -&\cdot (x^5 + x^4 + x^2 + x + 1) &\sim \quad {}_2 55 \\ -&\cdot (x^5 + x^4 + x^3 + x + 1) &\sim \quad {}_2 59 -\end{align*} -\right. +\begin{gather*} + x^{31} -1 = (x-1)(x^{30} +x^{29} + ... + x + 1) + \\ + (x^{30} +x^{29} + ... + x + 1) = + \left\{ \begin{align*} + &\phantom\cdot (x^5 + x^2 + 1) &\sim \quad {}_2 37 + \\ + &\cdot (x^5 + x^3 + 1) &\sim \quad {}_2 41 \\ + &\cdot (x^5 + x^4 + x^3 + x^2 + 1) &\sim \quad {}_2 61 + \\ + &\cdot (x^5 + x^3 + x^2 + x + 1) &\sim \quad {}_2 47 + \\ + &\cdot (x^5 + x^4 + x^2 + x + 1) &\sim \quad {}_2 55 + \\ + &\cdot (x^5 + x^4 + x^3 + x + 1) &\sim \quad {}_2 59 + \end{align*} \right. +\end{gather*} $$ -This is a feature special to fields of characteristic 2. 2 is the only prime number whose powers can be one more than another prime, since all other prime powers are one more than even numbers. 31 is a [Mersenne prime](https://en.wikipedia.org/wiki/Mersenne_prime), so all integers less than 31 are coprime to it. Thus, there is no room for the "extra" entries we observed in GF(16) which that occurred on factors of 15 = 16 - 1. No entry can be irreducible (but not primitive) or the power of an irreducible of lower degree. In other words, *only primitive polynomials exist of degree* p *if 2^p^ - 1 is a Mersenne prime*. +This is a feature special to fields of characteristic 2. +2 is the only prime number whose powers can be one more than another prime, + since all other prime powers are one more than even numbers. +31 is a [Mersenne prime](https://en.wikipedia.org/wiki/Mersenne_prime), + so all integers less than 31 are coprime to it. +Thus, there is no room for the "extra" entries we observed in GF(16) which occurred + on factors of 15 = 16 - 1. +No entry can be irreducible (but not primitive) or the power of an irreducible of lower degree. +In other words, *only primitive polynomials exist of degree* p *if 2^p^ - 1 is a Mersenne prime*. ### Counting Irreducibles -The remark about coprimes to 31 may inspire you to think of the [totient function](https://en.wikipedia.org/wiki/Euler%27s_totient_function). We have *φ*(2^5^ - 1) = 30 = 5⋅6, where 5 is the degree and 6 is the number of primitive polynomials. We also have *φ*(24 - 1) = 8 = 4⋅2 and *φ*(23 - 1) = 6 = 3⋅2. In general, it is true that there are *φ*(*pm* - 1) / *m* primitive polynomials of degree m over GF(p). +The remark about coprimes to 31 may inspire you to think of the + [totient function](https://en.wikipedia.org/wiki/Euler%27s_totient_function). +We have *φ*(2^5^ - 1) = 30 = 5⋅6, where 5 is the degree and 6 is the number of primitive polynomials. +We also have *φ*(24 - 1) = 8 = 4⋅2 and *φ*(23 - 1) = 6 = 3⋅2. +In general, it is true that there are *φ*(*pm* - 1) / *m* primitive polynomials of degree m over GF(p). Polynomial Reversal ------------------- -We've only been looking at fields of characteristic 2, where the meaning of "palindrome" and "reversed polynomial" is intuitive. Let's look at an example over characteristic 3. One primitive of degree 2 is ~3~14, which gives rise to the following sequence over GF(9): +We've only been looking at fields of characteristic 2, where the meaning of + "palindrome" and "reversed polynomial" is intuitive. +Let's look at an example over characteristic 3. +One primitive of degree 2 is ~3~14, which gives rise to the following sequence over GF(9): ```{python} #| echo: false @@ -608,87 +879,109 @@ Markdown(tabulate( "charpoly((*C*~*14*~)^*m*^)", *[gf9format(gf9power) for gf9power in gf9powers] ]], - headers=["*m*", *[i + 1 for i in range(8)]], + headers=["*m*", *[str(i + 1) for i in range(8)]], )) ``` -The table suggests that ~3~14 = 112~x~ = x^2^ + x + 2 and ~3~17 = 122~x~ = x^2^ + 2x + 2 are reversals of one another. More naturally, you'd think that 112~x~ reversed is 211~x~. But remember that we prefer to work with monic polynomials. By multiplying the polynomial by the multiplicative inverse of the leading coefficient (in this case, 2), we get 422~x~ ≡ 122~x~ mod 3. This is a rule that applies over larger characteristics in general. +The table suggests that ~3~14 = 112~*x*~ = *x*^2^ + *x* + 2 and ~3~17 = 122~*x*~ = *x*^2^ + 2*x* + 2 + are reversals of one another. +More naturally, you'd think that 112~*x*~ reversed is 211~*x*~. +But remember that we prefer to work with monic polynomials. +By multiplying the polynomial by the multiplicative inverse of the leading coefficient (in this case, 2), + we get 422~*x*~ ≡ 122~*x*~ mod 3. +This is a rule that applies over larger characteristics in general. -Note that ~3~16 is 121~x~ = x^2^ + 2x + 1 and ~3~13 = 111~x~ = x^2^ + x + 1 = x^2^ - 2x + 1, both of which have factors over GF(3). +Note that ~3~16 is 121~*x*~ = *x*^2^ + 2x + 1 and ~3~13 = 111~*x*~ = *x*^2^ + x + 1 = *x*^2^ - 2x + 1, + both of which have factors over GF(3). Power Graphs ------------ -We can study the interplay of primitives, irreducibles, and their powers by converting our sequences into (directed) graphs. Each node in the graph represents a characteristic polynomial that appears over the field; call the one under consideration *a*. If the sequence of polynomials generated by *C*~*a*~ contains contains another polynomial *b*, then there is an edge from *a* to *b*. +We can study the interplay of primitives, irreducibles, and their powers by converting + our sequences into (directed) graphs. +Each node in the graph represents a characteristic polynomial that appears over the field; + call the one under consideration *a*. +If the sequence of polynomials generated by *C*~*a*~ contains contains another polynomial *b*, + then there is an edge from *a* to *b*. -We can do this for every GF(*p*^*m*^). Let's start with the first few fields of characteristic 2. We get the following graphs: +We can do this for every GF(*p*^*m*^). +Let's start with the first few fields of characteristic 2. +We get the following graphs: -![]() +![](./char_2_irreducibles_graphs.png) -All nodes connect to the node corresponding to the identity matrix, since all roots are cyclic. Also, since all primitive polynomials are interchangeable with one another, they are all interconnected and form a [complete](https://en.wikipedia.org/wiki/Complete_graph) clique. This means that, excluding the identity node, the graphs for fields of order one more than a Mersenne prime are just the complete graphs. +All nodes connect to the node corresponding to the identity matrix, since all roots are cyclic. +Also, since all primitive polynomials are interchangeable with one another, + they are all interconnected and form a [complete](https://en.wikipedia.org/wiki/Complete_graph) clique. +This means that, excluding the identity node, the graphs for fields of order one more + than a Mersenne prime are just the complete graphs. -Since all of the graphs share the identity node as a feature -- a node with incoming edges from every other node -- its convenient to omit it. Here are a few more of these graphs after doing so, over fields of other characteristics: +Since all of the graphs share the identity node as a feature + -- a node with incoming edges from every other node -- its convenient to omit it. +Here are a few more of these graphs after doing so, over fields of other characteristics: -:::: {} -::: {} -![]() -GF(9) + +::: {layout="[[1,1], [1,1], [1,1,1]]"} +![ + GF(9) +]() + +![ + GF(25) +]() + +![ + GF(49) +]() + +![ + GF(121) +]() + +![ + GF(27) +]() + +![ + GF(125) +]() + +![ + GF(343) +]() ::: -::: {} -![]() -GF(25) -::: - -::: {} -![]() -GF(49) -::: - -::: {} -![]() -GF(121) -::: - -::: {} -![]() -GF(27) -::: - -::: {} -![]() -GF(125) -::: - -::: {} -![]() -GF(343) -::: -:::: - ### Spectra -Again, since visually interpreting graphs is difficult, we can study an invariant. From these graphs of polynomials, we can compute *their* characteristic polynomials (to add another layer to this algebraic cake) and look at their spectra. +Again, since visually interpreting graphs is difficult, we can study an invariant. +From these graphs of polynomials, we can compute *their* characteristic polynomials + (to add another layer to this algebraic cake) and look at their spectra. -It turns out that a removing a fully-connected node (like the one for the identity matrix) has a simple effect on characteristic polynomial of a graph: it just removes a factor of *x*. Here are a few of the (identity-reduced) spectra, arranged into a table. +It turns out that a removing a fully-connected node (like the one for the identity matrix) + has a simple effect on characteristic polynomial of a graph: it just removes a factor of *x*. +Here are a few of the (identity-reduced) spectra, arranged into a table. -| Characteristic | Order | Spectrum | Remark -| ---------------|-------|--------------------------------------|---------- -| 2 | 4 | 0 | -| | 8 | -1, 1 | Mersenne -| | 16 | 0^2^, -1, 1 | -| | 32 | -1^5^, 5 | Mersenne -| 3 | 9 | 0^2^, -1, 1 | -| | 27 | 0, -1^6^, 3^2^ | Pseudo-Mersenne? -| 5 | 25 | 0^3^, -1^6^, 1^3^, 3 | -| | 125 | 0, -1^38^, 1, 9^2^, 19 | Prime power in spectrum -| 7 | 49 | 0^2, -1^17^, 1^4^, 3^2^, 7 | -| | 343 | 0, -1^106^, 1^4^, 5^2^, 11^2^, 35^2^ | Composite in spectrum -| 11 | 121 | 0^4^, -1^49^, 1^2^, 3^6^, 7^2^, 15 | Composite in spectrum +| Characteristic | Order | Spectrum | Remark | +|----------------|-------|--------------------------------------|--------------------------| +| 2 | 4 | 0 | | +| | 8 | -1, 1 | Mersenne | +| | 16 | 0^2^, -1, 1 | | +| | 32 | -1^5^, 5 | Mersenne | +| 3 | 9 | 0^2^, -1, 1 | | +| | 27 | 0, -1^6^, 3^2^ | Pseudo-Mersenne? | +| 5 | 25 | 0^3^, -1^6^, 1^3^, 3 | | +| | 125 | 0, -1^38^, 1, 9^2^, 19 | Prime power in spectrum | +| 7 | 49 | 0^2, -1^17^, 1^4^, 3^2^, 7 | | +| | 343 | 0, -1^106^, 1^4^, 5^2^, 11^2^, 35^2^ | Composite in spectrum | +| 11 | 121 | 0^4^, -1^49^, 1^2^, 3^6^, 7^2^, 15 | Composite in spectrum | -Incredibly, all spectra shown are composed exclusively of integers, and thus, each of these graphs are integral graphs. Moreover, it does not appear that any integer sequences that one may try extracting from this table (for example, the multiplicity of -1) can be found in the [Online Encyclopedia of Integer Sequences](https://oeis.org/). +Incredibly, all spectra shown are composed exclusively of integers, and thus, + each of these graphs are integral graphs. +Moreover, it does not appear that any integer sequences that one may try extracting from this table + (for example, the multiplicity of -1) can be found in the + [Online Encyclopedia of Integer Sequences](https://oeis.org/). From what I was able to tell, the following subgraphs were *also* integral over the range I tested: @@ -702,8 +995,17 @@ Unfortunately, proving any such relationship is out of the scope of this post (a Closing ------- -This concludes the first foray into using matrices as elements of prime power fields. It is a subject which, using the tools of linear algebra, makes certain aspects of field theory more palatable and constructs some objects with fairly interesting properties. +This concludes the first foray into using matrices as elements of prime power fields. +It is a subject which, using the tools of linear algebra, makes certain aspects of field theory + more palatable and constructs some objects with fairly interesting properties. -One of the most intriguing parts to me is the sequence of polynomials generated by a companion matrix. Though I haven't proven it, I suspect that it suffices to study only the sequence generated by a primitive polynomial. It seems to be possible to get the non-primitive sequences by looking at the subsequences where the indices are multiples of a factor of the length of the sequence. But this means that the entire story about polynomials and finite fields can be foregone entirely, and the problem instead becomes one of number theory. +One of the most intriguing parts to me is the sequence of polynomials generated by a companion matrix. +Though I haven't proven it, I suspect that it suffices to study only the sequence generated + by a primitive polynomial. +It seems to be possible to get the non-primitive sequences by looking at the subsequences + where the indices are multiples of a factor of the length of the sequence. +But this means that the entire story about polynomials and finite fields can be foregone entirely, + and the problem instead becomes one of number theory. -The [next post]() will focus on an "application" of matrix roots to other areas of abstract algebra. Diagrams made with Geogebra and NetworkX (GraphViz). +The [next post](../3) will focus on an "application" of matrix roots to other areas of abstract algebra. +Diagrams made with Geogebra and NetworkX (GraphViz).