Dickson Invariants

Dickson invariants \(Q_{n,s}\in \mathbb F_p[y_0,...,y_{n-1}]\) are generators for the invariant ring of the full linear group \(GL(n,\mathbb F_p)\), where \(s\) ranges from \(0\) to \(n\), setting \(Q_{n,n} = 1\), and \(p\) is a prime.


We choose the indices such that \(\deg(Q_{n,s}) = p^n-p^s\). There also occurs a different convention in the literature.



According to [Wilkerson], the Dickson invariants \(Q_{n,s}\) with \(s<n\) can be defined as follows:

  1. \(\prod_{v \in \mathbb F_p^n}(v+X) = X^{p^n} + \sum_{s=0}^{n-1} (-1)^{n-s} Q_{n,s} X^{p^s}\)

[Pham] provides the following recursion for \(Q_{n,s}\):

  • \(Q_{n,n} = 1\)
  • \(Q_{n,0} = (V_1\cdot \dots \cdot V_n)^{p-1}\)
  • \(Q_{n,s} = Q_{n-1,s}\cdot V_n^{p-1} + Q_{n-1,s-1}^p\)


  1. \(V_k = \prod_{\lambda_i\in\mathbb Z_p} (\lambda_0y_0 + ... + \lambda_{k-2}y_{k-2} + y_{k-1})\) for \(1\le k \le n\)

Apparently the definition of \(V_k\) is a stumbling block in the recursion, as it is a product of \(p^{k-1}\) polynomials. However, combining 1. and 2., one can express \(V_k\) using Dickson invariants \(Q_{n,s}\) of lower degrees. Namely, setting \(X = y_{k-1}\) in 1., 2. becomes

  • \(V_k = (y_{k-1}^{p^{k-1}} + \sum_{s=0}^{k-2} (-1)^{k-s-1}\cdot Q_{k-1,s} \cdot y_{k-1}^{p^{s}})\) (in particular, \(V_1 = y_0\)).

The preceding formula, together with [Pham]’s recursion, allows for a convenient computation of the Dickson invariants: One computes \(Q_{n,s}\) using \(Q_{n-1,s}\), \(Q_{n-1,s-1}\) and \(V_n\), and one computes \(V_n\) using \(Q_{n-1,0},...,Q_{n-1,n-2}\).

class pGroupCohomology.dickson.DICKSON(p)

A factory for computing Dickson invariants.

Let \(p\) be a prime number. Then, DICKSON(p) can compute the Dickson invariants over \(\mathbb F_p\). See dickson for the theoretical background.


sage: from pGroupCohomology.dickson import DICKSON
sage: D = DICKSON(3)
sage: d_3_1 = D(3,1)
sage: d_3_1
y0^18*y1^6 + y0^12*y1^12 + y0^6*y1^18 + y0^18*y1^4*y2^2 - y0^12*y1^10*y2^2 - y0^10*y1^12*y2^2 + y0^4*y1^18*y2^2 + y0^18*y1^2*y2^4 + y0^10*y1^10*y2^4 + y0^2*y1^18*y2^4 + y0^18*y2^6 + y0^12*y1^6*y2^6 + y0^6*y1^12*y2^6 + y1^18*y2^6 - y0^12*y1^2*y2^10 + y0^10*y1^4*y2^10 + y0^4*y1^10*y2^10 - y0^2*y1^12*y2^10 + y0^12*y2^12 - y0^10*y1^2*y2^12 + y0^6*y1^6*y2^12 - y0^2*y1^10*y2^12 + y1^12*y2^12 + y0^6*y2^18 + y0^4*y1^2*y2^18 + y0^2*y1^4*y2^18 + y1^6*y2^18
sage: d_3_1.parent()
Multivariate Polynomial Ring in y0, y1, y2 over Finite Field of size 3
sage: p_5_2 = D(5,2)
sage: p_5_2.degree() == 3^5-3^2
sage: len(p_5_2.coefficients())
V(k, P)

Compute [Pham]’s \(V_k\) polynomials.

See dickson for the theoretical background.


  • k, an integer
  • P, a polynomial ring over GF(p) with at least k generators.


sage: from pGroupCohomology.dickson import DICKSON
sage: D3 = DICKSON(3)
sage: D5 = DICKSON(5)
sage: P = PolynomialRing(GF(3), 4, 'y')
sage: D3.V(3, P)
y0^6*y1^2*y2 + y0^4*y1^4*y2 + y0^2*y1^6*y2 - y0^6*y2^3 - y0^4*y1^2*y2^3 - y0^2*y1^4*y2^3 - y1^6*y2^3 + y2^9
sage: D3.V(5, P)
Traceback (most recent call last):
ValueError: The first argument must not exceed the number of generators of the second argument
sage: D5.V(3, P)
Traceback (most recent call last):
ValueError: The base ring of the second argument does not match Finite Field of size 5 over which self is defined