Ray Class Groups#
The ray divisor class group \({\operatorname{Cl}}_m\) modulo a divisor \(m\) of a global function field \(K\) is defined via the following exact sequence:
where \(O^*_m\) is the group of units in the “residue ring” mod \(m\), \(k\) is the exact constant field of \(K\) and \({\operatorname{Cl}}\) is the divisor class group of \(K\). This follows the methods outlined in [Heß et al., 1997].
- RayResidueRing(D): DivFunElt -> GrpAb, Map#
Let \(D = \sum n_iP_i\) be an effective divisor for some places \(P_i\) (so \(n_i>0\)). The ray residue ring \(R\) is the product of the unit groups of the local rings:
\[R = O^\times_m := \prod (O_{P_i}/P_i^{n^i})^\times\]where \(O_{P_i}\) is the valuation ring of \(P_i\).
The map returned as the second return value is from the ray residue ring \(R\) into the function field and admits a pointwise inverse for the computation of discrete logarithms.
- RayClassGroup(D): DivFunElt -> GrpAb, Map#
Let \(D\) be an effective (positive) divisor. The ray class group modulo \(D\) is a quotient of the group of divisors that are coprime to \(D\) modulo certain principal divisors. It may be computed using the exact sequence:
\[1 \to k^\times \to O^\times_m \to {\operatorname{Cl}}_m \to {\operatorname{Cl}}\to 1\]Note that in contrast to the number field case, the ray class group of a function field is infinite.
The map returned as the second return value is the map from the ray class group into the group of divisors and admits a pointwise inverse for the computation of discrete logarithms.
Since this function uses the class group of the function field in an essential way, it may be necessary for large examples to precompute the class group. Using
ClassGroupdirectly gives access to options that may be necessary for complicated fields.
- RayClassGroupDiscLog(y, D): DivFunElt, DivFunElt -> GrpAbElt#
- RayClassGroupDiscLog(y, D): PlcFunElt, DivFunElt -> GrpAbElt#
Return the discrete log of the place or divisor \(y\) in the ray class group modulo the divisor \(D\). This is a version of the pointwise inverse of the map returned by
RayClassGroup. The main difference is that using the intrinsics the values are cached, ie. if the same place (or divisor) is decomposed twice, the second time will be instantaneous.A disadvantage is that in situations where a great number of discrete logarithms is computed for pairwise different divisors, a great amount of memory is wasted.
- Example: Classfield Structures (ex-d6bc20)#
We will demonstrate the creation of some ray class and ray residue groups. First we have to create a function field:
> k<w> := GF(4); > kt<t> := PolynomialRing(k); > ktx<x> := PolynomialRing(kt); > K := FunctionField(x^3-w*t*x^2+x+t);
Now, to create some divisors:
> lp := Places(K, 2); > D1 := 4*lp[2]+2*lp[6]; > D2 := &+Support(D1);
And now the groups:
> G1, mG1 := RayResidueRing(D1); G1; Abelian Group isomorphic to Z/2 + Z/2 + Z/2 + Z/2 + Z/2 + Z/2 + Z/2 + Z/4 + Z/60 + Z/60 Defined on 10 generators Relations: 2*G1.1 = 0 2*G1.2 = 0 2*G1.3 = 0 2*G1.4 = 0 2*G1.5 = 0 2*G1.6 = 0 2*G1.7 = 0 4*G1.8 = 0 60*G1.9 = 0 60*G1.10 = 0 > G2, mG2 := RayResidueRing(D2); G2; Abelian Group isomorphic to Z/15 + Z/15 Defined on 2 generators Relations: 15*G2.1 = 0 15*G2.2 = 0
\(G_1 = O_{D_1}^\times\) should surject onto \(D_2 = O_{D_2}^\times\) since \(D_2 | D_1\):
> h := hom<G1 -> G2 | [G1.i@mG1@@mG2 : i in [1..Ngens(G1)]]>; > Image(h) eq G2; true > [ h(G1.i) : i in [1..Ngens(G1)]]; [ 0, 0, 0, 0, 0, 0, 0, 0, G2.2, G2.1 ]
Ray class groups are similar and can be mapped in the same way:
> R1, mR1 := RayClassGroup(D1); > R2, mR2 := RayClassGroup(D2); R2; Abelian Group isomorphic to Z/5 + Z/15 + Z Defined on 3 generators Relations: 5*R2.1 = 0 15*R2.2 = 0 > hR := hom<R1 -> R2 | [R1.i@mR1@@mR2 : i in [1..Ngens(R1)]]>; > Image(hR); Abelian Group isomorphic to Z/5 + Z/15 + Z Defined on 3 generators in supergroup R2: $.1 = R2.1 $.2 = R2.2 $.3 = R2.3 Relations: 5*$.1 = 0 15*$.2 = 0 > $1 eq R2; true
Note that the missing \(C_3\) part in comparing \(G_2\) and \(R_2\) corresponds to factoring by \(k^\times\). The free factor comes from the class group.
Now, let us investigate the defining exact sequence for \(R_2\):
> C, mC := ClassGroup(K); > h1 := map<K -> G2 | x :-> (K!x)@@mG2>; > h2 := hom<G2 -> R2 | [ G2.i@mG2@@mR2 : i in [1..Ngens(G2)]]>; > h3 := hom<R2 -> C | [ R2.i@mR2@@mC : i in [1..Ngens(R2)]]>; > sub<G2 | [h1(x) : x in k | x ne 0]> eq Kernel(h2); > Image(h2) eq Kernel(h3); > Image(h3) eq C;
So indeed, the exact sequence property holds.