@@ -907,6 +907,42 @@ def frobenius_trace(self, algorithm=None):
907
907
# If all fail, we raise an error
908
908
raise NotImplementedError (f'algorithm "{ algorithm } " not implemented' )
909
909
910
+ def frobenius_relative (self ):
911
+ r"""
912
+ Return the relative Frobenius of this Drinfeld module, that is
913
+ the isogeny of the form `\tau^d` with `d` minimal.
914
+
915
+ We note that `d` is the degree of `\gamma(T)` over the `\mathbb F_q`.
916
+
917
+ EXAMPLES::
918
+
919
+ sage: Fq = GF(5)
920
+ sage: A.<T> = Fq[]
921
+ sage: K.<z> = Fq.extension(3)
922
+ sage: phi = DrinfeldModule(A, [1, z, z])
923
+ sage: phi.frobenius_relative()
924
+ Drinfeld Module morphism:
925
+ From: Drinfeld module defined by T |--> z*t^2 + z*t + 1
926
+ To: Drinfeld module defined by T |--> (2*z^2 + 4*z + 4)*t^2 + (2*z^2 + 4*z + 4)*t + 1
927
+ Defn: t
928
+
929
+ When the constant coefficient generates the field `K`, the relative
930
+ Frobenius is the same as the Frobenius endomorphism::
931
+
932
+ sage: psi = DrinfeldModule(A, [z, z, 1])
933
+ sage: psi.frobenius_relative()
934
+ Endomorphism of Drinfeld module defined by T |--> t^2 + z*t + z
935
+ Defn: t^3
936
+ sage: psi.frobenius_endomorphism()
937
+ Endomorphism of Drinfeld module defined by T |--> t^2 + z*t + z
938
+ Defn: t^3
939
+ """
940
+ E = self .base_over_constants_field ()
941
+ z = E (self .constant_coefficient ())
942
+ d = z .minpoly ().degree ()
943
+ tau = self .ore_variable ()
944
+ return self .hom (tau ** d )
945
+
910
946
def invert (self , ore_pol ):
911
947
r"""
912
948
Return the preimage of the input under the Drinfeld module, if it
0 commit comments