From 8d14c5b4146053771a2bedef100992eadeca71ed Mon Sep 17 00:00:00 2001 From: queue-miscreant Date: Sun, 3 Aug 2025 22:56:15 -0500 Subject: [PATCH] minor cleanups in finite-field.2 --- posts/finite-field/2/index.qmd | 52 ++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/posts/finite-field/2/index.qmd b/posts/finite-field/2/index.qmd index 0f73102..00e412f 100644 --- a/posts/finite-field/2/index.qmd +++ b/posts/finite-field/2/index.qmd @@ -400,7 +400,7 @@ fromIndices ns = columns (\(_, f) r -> f r) (\(c, _) -> Headed c) $ fromIndices' = (singleton (Headed "m") head <>) . fromIndices -- Symbolic representation of a power of a companion matrix (in Markdown) -compPowSymbolic "" m = "*f*((*C*)^*" ++ m ++ "*^)" +compPowSymbolic "" m = "*f*(*C*^*" ++ m ++ "*^)" compPowSymbolic x m = "*f*((*C*~*" ++ x ++ "*~)^*" ++ m ++ "*^)" -- Spans of a given color @@ -430,8 +430,9 @@ The polynomial *u* = ~2~31 occurs at positions 3, 6, 9, and 12 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, *u* (or a polynomial isomorphic to it) 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" layout-valign="center"} ::: {} @@ -680,8 +681,9 @@ leastDeg2Char3Poly = deg2Char3Polys !! 1 colorDeg3Char3 = colorByEval 3 [(14, "red"), (17, "blue")] -markdown $ markdownTable (fromIndices'[1..8]) [ - "":map colorDeg3Char3 (charPolyPows 3 leastDeg2Char3Poly) +markdown $ markdownTable (fromIndices' [1..8]) [ + compPowSymbolic "14" "m": + map colorDeg3Char3 (charPolyPows 3 leastDeg2Char3Poly) ] ``` @@ -697,15 +699,30 @@ Note that ${}_3 16 \sim 121_x = x^2 + 2x + 1$ and ${}_3 13 \sim 111_x = x^2 + x both of which have factors over GF(3). -Power Graphs ------------- +Irreducible 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*. +Each node in the graph will represent an irreducible polynomial over the field. +Call the one under consideration *a*. +If the sequence of characteristic polynomials generated by powers of *C*~*a*~ contains + contains another polynomial *b*, then there is an edge from *a* to *b*. + +```{haskell} +-- Convert a polynomial to the integer representing it in characteristic n +asPolyNum n = evalPoly n . fmap (`mod` n) + +irreducibleGraph d n = concatMap (\(x:xs) -> map (x,) xs) polyKinClasses where + -- All irreducible polynomials of degree d in characteristic n + irrsOfDegree' = irrsOfDegree d n + -- Get "kin" polynomials as integers -- all those who appear as characteristic + -- polynomials in the powers of its companion matrix + getKinPolys = map (asPolyNum n . charpoly) . matrixPowersMod n . companion + -- Kin classes corresponding to each irreducible polynomial, + -- which is the first entry + polyKinClasses = map (nub . take (n^d) . getKinPolys) irrsOfDegree' +``` We can do this for every GF(*p*^*m*^). Let's start with the first few fields of characteristic 2. @@ -728,19 +745,6 @@ Here are a few more of these graphs after doing so, over fields of other charact --| code-fold: true --| fig-cap: "GF(9)" --- Convert a polynomial to the integer representing it in characteristic n -asPolyNum n = evalPoly n . fmap (`mod` n) - -irreducibleGraph d n = concatMap (\(x:xs) -> map (x,) xs) polyKinClasses where - -- All irreducible polynomials of degree d in characteristic n - irrsOfDegree' = irrsOfDegree d n - -- Get "kin" polynomials as integers -- all those who appear as characteristic - -- polynomials in the powers of its companion matrix - getKinPolys = map (asPolyNum n . charpoly) . matrixPowersMod n . companion - -- Kin classes corresponding to each irreducible polynomial, - -- which is the first entry - polyKinClasses = map (nub . take (n^d) . getKinPolys) irrsOfDegree' - -- Characteristic polynomial of the identity matrix eyePoly d n = asPolyNum n $ charpoly $ eye d -- Remove edges directed toward the characteristic polynomial of the identity