import Mathlib import Definitions.Def_ModularCurve_KroneckerTransport noncomputable section open Polynomial namespace ModularCurve section FibrePoly variable {k : Type*} [Field k] def fibrePoly (Φ : Polynomial (Polynomial ℤ)) (a : k) : Polynomial k := Φ.map (Polynomial.eval₂RingHom (Int.castRingHom k) a) variable {ℓ : ℕ} [Fact ℓ.Prime] [CharP k ℓ] theorem eval₂RingHom_intCast_eq_comp (a : k) : Polynomial.eval₂RingHom (Int.castRingHom k) a = (Polynomial.eval₂RingHom (ZMod.castHom (dvd_refl ℓ) k) a).comp (Polynomial.mapRingHom (Int.castRingHom (ZMod ℓ))) := by refine Polynomial.ringHom_ext' (Subsingleton.elim _ _) ?_ rw [Polynomial.coe_eval₂RingHom, Polynomial.eval₂_X, RingHom.comp_apply, Polynomial.coe_mapRingHom, Polynomial.map_X, Polynomial.coe_eval₂RingHom, Polynomial.eval₂_X] theorem fibrePoly_eq_map_reduceModBivar (Φ : Polynomial (Polynomial ℤ)) (a : k) : fibrePoly Φ a = (reduceModBivar ℓ Φ).map (Polynomial.eval₂RingHom (ZMod.castHom (dvd_refl ℓ) k) a) := by rw [fibrePoly, eval₂RingHom_intCast_eq_comp (ℓ := ℓ), show reduceModBivar ℓ Φ = Φ.map (Polynomial.mapRingHom (Int.castRingHom (ZMod ℓ))) from rfl, Polynomial.map_map] end FibrePoly section Factorization variable {k : Type*} [Field k] {ℓ : ℕ} [Fact ℓ.Prime] [CharP k ℓ] [PerfectRing k ℓ] theorem C_sub_X_pow_eq_neg_pow (a : k) : Polynomial.C a - Polynomial.X ^ ℓ = -((Polynomial.X - Polynomial.C ((frobeniusEquiv k ℓ).symm a)) ^ ℓ) := by have hpoly : (Polynomial.X - Polynomial.C ((frobeniusEquiv k ℓ).symm a)) ^ ℓ = Polynomial.X ^ ℓ - Polynomial.C ((frobeniusEquiv k ℓ).symm a) ^ ℓ := sub_pow_expChar _ _ rw [hpoly, ← Polynomial.C_pow, frobeniusEquiv_symm_pow_p, neg_sub] end Factorization end ModularCurve