@@ -572,18 +572,28 @@ def class_polynomial(self):
572572 ...
573573 ValueError: coefficients are not polynomials
574574 """
575+ # The algorithm is based on the following remark:
576+ # writing phi_T = g_0 + g_1*tau + ... + g_r*tau^r,
577+ # if s > deg(g_i/(q^i - 1)) - 1 for all i, then the
578+ # class module is equal to
579+ # H := E(Kinfty/A) / < T^(-s), T^(-s-1), ... >
580+ # where E(Kinfty/A) is Kinfty/A equipped with the
581+ # A-module structure coming from phi.
582+
575583 A = self .function_ring ()
576584 Fq = A .base_ring ()
577585 q = Fq .cardinality ()
578586 r = self .rank ()
579587
588+ # We compute the bound s
580589 gs = self .coefficients_in_function_ring (sparse = False )
581-
582590 s = max (gs [i ].degree () // (q ** i - 1 ) for i in range (1 , r + 1 ))
583591 if s == 0 :
584- # small case
585592 return A .one ()
586593
594+ # We compute the matrix of phi_T acting on the quotient
595+ # M := (Kinfty/A) / < T^(-s), T^(-s-1), ... >
596+ # (for the standard structure of A-module!)
587597 M = matrix (Fq , s )
588598 qk = 1
589599 for k in range (r + 1 ):
@@ -596,6 +606,12 @@ def class_polynomial(self):
596606 M [i , j ] += gs [k ][e ]
597607 qk *= q
598608
609+ # We compute the subspace of E(Kinfty/A) (for the twisted
610+ # structure of A-module!)
611+ # V = < T^(-s), T^(-s+1), ... >
612+ # It is also the phi_T-saturation of T^(-s+1) in M, i.e.
613+ # the Fq-vector space generated by the phi_T^i(T^(-s+1))
614+ # for i varying in NN.
599615 v = vector (Fq , s )
600616 v [s - 1 ] = 1
601617 vs = [v ]
@@ -605,6 +621,8 @@ def class_polynomial(self):
605621 V = matrix (vs )
606622 V .echelonize ()
607623
624+ # We compute the action of phi_T on H = M/V
625+ # as an Fq-linear map (encoded in the matrix N)
608626 dim = V .rank ()
609627 pivots = V .pivots ()
610628 j = ip = 0
@@ -613,6 +631,10 @@ def class_polynomial(self):
613631 j += 1
614632 ip += 1
615633 V [i ,j ] = 1
616-
617634 N = (V * M * ~ V ).submatrix (dim , dim )
635+
636+ # The class module is now H where the action of T
637+ # is given by the matrix N
638+ # The class polynomial is then the characteristic
639+ # polynomial of N
618640 return A (N .charpoly ())
0 commit comments