Local Open Scope quotient_scope.Let nz_p0 : p0 != 0. Proof. by rewrite monic_neq0 // p0_mon. Qed.ewrite map_polyZ rootE hornerZ (rootP pz0) mulr0.
Qed.ewrite (root_size_gt1 _ p0z0) ?map_poly_eq0.
Qed.Definition equiv_subfext x y := (iotaFz x == iotaFz y).Proof. by rewrite /equiv_subfext; split=> x // y w /eqP->. Qed.Canonical equiv_subfext_equiv := EquivRelPack equiv_subfext_is_equiv.
Canonical equiv_subfext_encModRel := defaultEncModRel equiv_subfext.Canonical subFExtend_eqQuotType := [eqQuotType equiv_subfext of subFExtend].ewrite -eqmodE reprK.
Qed.) x))) = iotaFz x.
Proof. by rewrite -/(iotaFz _) -!pi_subfx_inj reprK. Qed.Definition subfext0 := lift_cst subFExtend 0.ewrite /iotaFz !linearD /= !iotaPz_repr.
Qed.ewrite /iotaFz !linearN /= !iotaPz_repr.
Qed.Canonical pi_subfext_opp_morph := PiMorph1 pi_subfext_opp.Proof. by move=> x y t; rewrite -[x]reprK -[y]reprK -[t]reprK !piE addrA. Qed.Proof. by move=> x y; rewrite -[x]reprK -[y]reprK !piE addrC. Qed.Proof. by move=> x; rewrite -[x]reprK !piE add0r. Qed.t_add.
Proof. by move=> x; rewrite -[x]reprK !piE addNr. Qed.Definition subfext_zmodMixin :=  ZmodMixin addfxA addfxC add0fx addfxN.
Canonical subfext_zmodType :=: 'rV[F]_n :=
  poly_rV ((rVpoly x) * (rVpoly y) %% p0).ewrite /iotaFz !poly_rV_modp_K !iotaPz_modp !rmorphM /= !iotaPz_repr.
Qed.Canonical pi_subfext_mul_morph := PiMorph2 pi_subfext_mul.Definition subfext1 := lift_cst subFExtend (poly_rV 1).
Canonical subfext1_morph := PiConst subfext1.ewrite !poly_rV_modp_K [_ %% p0 * _]mulrC !modp_mul // mulrA mulrC.
Qed.lim/quotW=> x; elim/quotW=> y; rewrite !piE /subfx_mul_rep /= mulrC.
Qed.ewrite modp_small ?rVpolyK // (polySpred nz_p0) ltnS size_poly.
Qed.ewrite poly_rV_K ?rmorph1 ?oner_eq0 // size_poly1.
Qed.

Definition subfext_comRingMixin :=ComRingMixin mulfxA mulfxC mul1fx mulfx_addl nonzero1fx.Canonical subfext_Ring := Eval hnf in RingType subFExtend subfext_comRiu, v) := egcdp q r in
  ((u * q + v * r)`_0)^-1 *: u.V[F]_n :=
  poly_rV (subfx_poly_inv (rVpoly x) %% p0).ewrite 2!{1}poly_rV_modp_K 2!{1}iotaPz_modp !subfx_poly_invE iotaPz_repr.
Qed.Canonical pi_subfext_inv_morph := PiMorph1 pi_subfext_inv.

Fact subfx_fieldAxiom :ewrite iotaPz_modp rmorph1 rmorphM /= iotaPz_modp subfx_poly_invE mulVf.
Qed.ewrite /subfx_poly_inv rmorph0 eqxx mod0p !linear0.
Qed.Definition subfext_unitRingMixin := FieldUnitMixin subfx_fieldAxiom subfx_inv0.
Canonical subfext_unitRingType :=Canonical subfext_comUnitRing := Eval hnf in [comUnitRingType of subFExtend].Definition subfext_fieldMixin := @FieldMixin _ _ subfx_fieldAxiom subfx_inv0.
Definition subfext_idomainMixin := FieldIdomainMixin subfext_fieldMixin.
Canonical subfext_idomainType :=Eval hnf in IdomainType subFExtend subfext_idomainMixin.
Canonical subfext_fieldType :=Eval hnf in FieldType subFExtend subfext_fieldMixin.ewrite poly_rV_modp_K iotaPz_modp rmorphM.
Qed.Canonical subfx_inj_additive := Additive subfx_inj_is_rmorphism.Definition subfx_eval := lift_embed subFExtend (f

(* Specifications: *)