aboutsummaryrefslogtreecommitdiff
path: root/mathcomp/odd_order/PFsection12.v
diff options
context:
space:
mode:
authorEnrico Tassi2015-03-09 11:07:53 +0100
committerEnrico Tassi2015-03-09 11:24:38 +0100
commitfc84c27eac260dffd8f2fb1cb56d599f1e3486d9 (patch)
treec16205f1637c80833a4c4598993c29fa0fd8c373 /mathcomp/odd_order/PFsection12.v
Initial commit
Diffstat (limited to 'mathcomp/odd_order/PFsection12.v')
-rw-r--r--mathcomp/odd_order/PFsection12.v1371
1 files changed, 1371 insertions, 0 deletions
diff --git a/mathcomp/odd_order/PFsection12.v b/mathcomp/odd_order/PFsection12.v
new file mode 100644
index 0000000..2b3a3e1
--- /dev/null
+++ b/mathcomp/odd_order/PFsection12.v
@@ -0,0 +1,1371 @@
+(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
+Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+Require Import fintype tuple finfun bigop prime ssralg finset center.
+Require Import fingroup morphism perm automorphism quotient action finalg zmodp.
+Require Import gfunctor gproduct cyclic commutator gseries nilpotent pgroup.
+Require Import sylow hall abelian maximal frobenius.
+Require Import matrix mxalgebra mxpoly mxrepresentation mxabelem vector.
+Require Import falgebra fieldext finfield.
+Require Import BGsection1 BGsection2 BGsection3 BGsection4 BGsection7.
+Require Import BGsection14 BGsection15 BGsection16.
+Require Import ssrnum ssrint algC cyclotomic algnum.
+Require Import classfun character inertia vcharacter.
+Require Import PFsection1 PFsection2 PFsection3 PFsection4 PFsection5.
+Require Import PFsection6 PFsection7 PFsection8 PFsection9 PFsection10.
+Require Import PFsection11.
+
+Set Implicit Arguments.
+Unset Strict Implicit.
+Unset Printing Implicit Defensive.
+
+Import GroupScope GRing.Theory FinRing.Theory Num.Theory.
+Local Open Scope ring_scope.
+
+Section PFTwelve.
+
+Variable gT : minSimpleOddGroupType.
+Local Notation G := (TheMinSimpleOddGroup gT).
+Implicit Types (p q : nat) (x y z : gT).
+Implicit Types H K L M N P Q R S T U V W : {group gT}.
+
+Section Twelve2.
+
+(* Hypothesis 12.1 *)
+Variable L : {group gT}.
+
+Hypotheses (maxL : L \in 'M) (Ltype1 : FTtype L == 1%N).
+
+Local Notation "` 'L'" := (gval L) (at level 0, only parsing) : group_scope.
+Local Notation H := `L`_\F%G.
+Local Notation "` 'H'" := `L`_\F (at level 0) : group_scope.
+
+Let nsHL : H <| L. Proof. exact: gFnormal. Qed.
+Let calS := seqIndD H L H 1%G.
+Let tau := FT_Dade maxL.
+Let S_ (chi : 'CF(L)) := [set i in irr_constt chi].
+Let calX : {set Iirr L} := Iirr_kerD L H 1%g.
+Let calI := [seq 'chi_i | i in calX].
+
+(* This does not actually use the Ltype1 assumption. *)
+Lemma FTtype1_ref_irr : exists2 phi, phi \in calS & phi 1%g = #|L : H|%:R.
+Proof.
+have [solH ntH] := (nilpotent_sol (Fcore_nil L), mmax_Fcore_neq1 maxL).
+have [s Ls nzs] := solvable_has_lin_char ntH solH.
+exists ('Ind 'chi_s); last by rewrite cfInd1 ?gFsub // lin_char1 ?mulr1.
+by rewrite mem_seqInd ?gFnormal ?normal1 // !inE sub1G subGcfker -irr_eq1 nzs.
+Qed.
+
+Let mem_calI i : i \in calX -> 'chi_i \in calI.
+Proof. by move=> i_Iirr; apply/imageP; exists i. Qed.
+
+Lemma FTtype1_irrP i :
+ reflect (exists2 chi, chi \in calS & i \in S_ chi) (i \in calX).
+Proof.
+have [sHL nHL] := andP nsHL; rewrite !inE sub1G andbT.
+apply/(iffP idP) => [kerH'i | [_ /seqIndC1P[t nz_t ->]]]; last first.
+ by rewrite inE => /sub_cfker_constt_Ind_irr <-; rewrite ?subGcfker.
+have [t] := constt_cfRes_irr H i; rewrite -constt_Ind_Res => tLi.
+rewrite -(sub_cfker_constt_Ind_irr tLi) // in kerH'i.
+suffices: 'Ind 'chi_t \in calS by exists ('Ind 'chi_t); rewrite // inE.
+by rewrite mem_seqInd ?normal1 // !inE sub1G kerH'i.
+Qed.
+
+Lemma FTtype1_irr_partition :
+ partition [set Si in [seq S_ chi | chi <- calS]] calX.
+Proof.
+apply/and3P; split; last 1 first.
+- rewrite inE; apply/mapP=> [[chi Schi /esym/setP S_0]].
+ have /eqP[] := seqInd_neq0 nsHL Schi.
+ rewrite [chi]cfun_sum_constt big1 // => i chi_i.
+ by have:= S_0 i; rewrite inE chi_i inE.
+- apply/eqP/setP=> i; apply/bigcupP/FTtype1_irrP=> [[S_chi] | [chi Schi Si]].
+ by rewrite inE => /mapP[chi Schi ->]; exists chi.
+ by exists (S_ chi); rewrite // inE map_f.
+apply/trivIsetP=> S_chi1 S_chi2.
+rewrite !inE => /mapP[chi1 Schi1 ->] /mapP[chi2 Schi2 ->] {S_chi1 S_chi2}chi2'1.
+apply/pred0P=> i; rewrite /= !inE; apply/andP=> [[chi1_i chi2_i]].
+suffices: '['chi_i] == 0 by rewrite cfnorm_irr oner_eq0.
+rewrite (constt_ortho_char (seqInd_char Schi1) (seqInd_char Schi2)) //.
+by rewrite (seqInd_ortho _ Schi1 Schi2) // (contraNneq _ chi2'1) // => ->.
+Qed.
+
+(* This is Peterfalvi (12.2)(a), first part *)
+Lemma FTtype1_seqInd_facts chi :
+ chi \in calS ->
+ [/\ chi = \sum_(i in S_ chi) 'chi_i,
+ constant [seq 'chi_i 1%g | i in S_ chi]
+ & {in S_ chi, forall i, 'chi_i \in 'CF(L, 1%g |: 'A(L))}].
+Proof.
+move=> calS_chi; have [t nz_t Dchi] := seqIndC1P calS_chi.
+pose T := 'I_L['chi_t]%g.
+have sTL: T \subset L by apply: Inertia_sub.
+have sHT: H \subset T by apply/sub_Inertia/gFsub.
+have sHL: H \subset L by apply: normal_sub.
+have hallH: Hall T H := pHall_Hall (pHall_subl sHT sTL (Fcore_Hall L)).
+have [U [LtypeF _]] := FTtypeP _ maxL Ltype1.
+have [[_ _ sdHU] [U1 inertU1] _] := LtypeF.
+have defT: H ><| 'I_U['chi_t] = T := sdprod_modl sdHU (sub_inertia 'chi_t).
+have abTbar : abelian (T / H).
+ have [_ _ /(_ _ _ inertU1 nz_t)sItU1] := typeF_context LtypeF.
+ by rewrite -(isog_abelian (sdprod_isog defT)) (abelianS sItU1); case: inertU1.
+have [DtL _ X_1] := cfInd_Hall_central_Inertia nsHL abTbar hallH.
+have Dchi_sum : chi = \sum_(i in S_ chi) 'chi_i.
+ by rewrite {1}Dchi DtL -Dchi; apply: eq_bigl => i; rewrite !inE.
+have lichi : constant [seq 'chi_i 1%g | i in S_ chi].
+ pose c := #|L : T|%:R * 'chi_t 1%g; apply: (@all_pred1_constant _ c).
+ by apply/allP=> _ /imageP[s tLs ->] /=; rewrite inE Dchi in tLs; rewrite X_1.
+split=> // j Schi_j /=; apply/cfun_onP=> y A'y.
+have [Ly | /cfun0->//] := boolP (y \in L).
+have CHy1: 'C_H[y] = 1%g.
+ apply: contraNeq A'y => /trivgPn[z /setIP[Hz cyz] ntz].
+ rewrite !inE -implyNb; apply/implyP=> nty; apply/bigcupP.
+ rewrite FTsupp1_type1 Ltype1 //=; exists z; first by rewrite !inE ntz.
+ by rewrite 3!inE nty Ly cent1C.
+have: j \in calX by apply/FTtype1_irrP; exists chi.
+by rewrite !inE => /andP[/not_in_ker_char0->].
+Qed.
+
+(* This is Peterfalvi (12.2)(a), second part. *)
+Lemma FPtype1_irr_isometry :
+ {in 'Z[calI, L^#], isometry tau, to 'Z[irr G, G^#]}.
+Proof.
+apply: (sub_iso_to _ _ (Dade_Zisometry _)) => // phi.
+rewrite zcharD1E => /andP[S_phi phi1_0].
+have /subsetD1P[_ /setU1K <-] := FTsupp_sub L; rewrite zcharD1 {}phi1_0 andbT.
+apply: zchar_trans_on phi S_phi => _ /imageP[i /FTtype1_irrP[j calSj Sj_i] ->].
+by rewrite zchar_split irr_vchar; have [_ _ ->] := FTtype1_seqInd_facts calSj.
+Qed.
+
+Lemma FPtype1_irr_subcoherent :
+ {R : 'CF(L) -> seq 'CF(G) | subcoherent calI tau R}.
+Proof.
+apply: irr_subcoherent; last exact: FPtype1_irr_isometry.
+ have UcalI: uniq calI by apply/dinjectiveP; apply: in2W irr_inj.
+ split=> // _ /imageP[i Ii ->]; rewrite !inE in Ii; first exact: mem_irr.
+ by apply/imageP; exists (conjC_Iirr i); rewrite ?inE conjC_IirrE ?cfker_aut.
+apply/hasPn=> psi; case/imageP => i; rewrite !inE => /andP[kerH'i _] ->.
+rewrite /cfReal odd_eq_conj_irr1 ?mFT_odd // irr_eq1 -subGcfker.
+by apply: contra kerH'i; apply: subset_trans; apply: gFsub.
+Qed.
+Local Notation R1gen := FPtype1_irr_subcoherent.
+
+(* This is Peterfalvi (12.2)(b). *)
+Lemma FPtype1_subcoherent (R1 := sval R1gen) :
+ {R : 'CF(L) -> seq 'CF(G) |
+ [/\ subcoherent calS tau R,
+ {in Iirr_kerD L H 1%G, forall i (phi := 'chi_i),
+ [/\ orthonormal (R1 phi),
+ size (R1 phi) = 2
+ & tau (phi - phi^*%CF) = \sum_(mu <- R1 phi) mu]}
+ & forall chi, R chi = flatten [seq R1 'chi_i | i in S_ chi]]}.
+Proof.
+have nrS: ~~ has cfReal calS by apply: seqInd_notReal; rewrite ?mFT_odd.
+have U_S: uniq calS by apply: seqInd_uniq.
+have ccS: conjC_closed calS by apply: cfAut_seqInd.
+have conjCS: cfConjC_subset calS (seqIndD H L H 1) by split.
+case: R1gen @R1 => /= R1 subc1.
+have [[chi_char nrI ccI] tau_iso oI h1 hortho] := subc1.
+pose R chi := flatten [seq R1 'chi_i | i in S_ chi].
+have memI phi i: phi \in calS -> i \in S_ phi -> 'chi_i \in calI.
+ by move=> Sphi Sphi_i; apply/image_f/FTtype1_irrP; exists phi.
+have aux phi psi i j mu nu:
+ phi \in calS -> psi \in calS -> i \in S_ phi -> j \in S_ psi ->
+ mu \in R1 'chi_i -> nu \in R1 'chi_j ->
+ orthogonal 'chi_i ('chi_j :: ('chi_j)^*%CF) -> '[mu, nu] = 0.
+- move=> Sphi Spsi Sphi_i Spsi_j R1i_mu R1i_nu o_ij.
+ apply: orthogonalP R1i_mu R1i_nu.
+ by apply: hortho o_ij; [apply: memI Spsi Spsi_j | apply: memI Sphi Sphi_i].
+exists R; split => //= => [| i Ii]; last first.
+ have mem_i := mem_calI Ii; have{h1} [Zirr oR1 tau_im] := h1 _ mem_i.
+ split=> //; apply/eqP; rewrite -eqC_nat -cfnorm_orthonormal // -{}tau_im.
+ have ?: 'chi_i - ('chi_i)^*%CF \in 'Z[calI, L^#].
+ have hchi : 'chi_i \in 'Z[calI, L] by rewrite mem_zchar_on // cfun_onG.
+ rewrite sub_aut_zchar ?cfAut_zchar // => _ /mapP[j _ ->]; exact: irr_vchar.
+ have [-> // _] := tau_iso; rewrite cfnormBd ?cfnorm_conjC ?cfnorm_irr //.
+ by have [_ ->] := pairwise_orthogonalP oI; rewrite ?ccI // eq_sym (hasPn nrI).
+have calS_portho : pairwise_orthogonal calS by apply: seqInd_orthogonal.
+have calS_char : {subset calS <= character} by apply: seqInd_char.
+have calS_chi_ortho :
+ {in calS &, forall phi psi i j,
+ i \in irr_constt phi -> j \in irr_constt psi ->
+ '[phi, psi] = 0 -> '['chi_i, 'chi_j] = 0}.
+- by move=> phi psi Sphi Spsi /= i j; apply: constt_ortho_char; apply/calS_char.
+have ZisoS_tau: {in 'Z[calS, L^#], isometry tau, to 'Z[irr G, G^#]}.
+ apply: (sub_iso_to _ _ (Dade_Zisometry _)) => // phi.
+ have /subsetD1P[_ /setU1K <-] := FTsupp_sub L.
+ rewrite zcharD1E zcharD1 => /andP[S_phi ->]; rewrite andbT.
+ apply: zchar_trans_on phi S_phi => psi calS_psi.
+ have [Dpsi _ hCF] := FTtype1_seqInd_facts calS_psi.
+ by rewrite zchar_split (seqInd_vcharW calS_psi) /= Dpsi rpred_sum.
+split=> {ZisoS_tau}//= [phi calS_phi | phi psi calS_phi calS_psi].
+ rewrite /R /[seq _ | i in _]; set e := enum _; have: uniq e := enum_uniq _.
+ have: all (mem (S_ phi)) e by apply/allP=> i; rewrite mem_enum.
+ have ->: phi - phi^*%CF = \sum_(i <- e) ('chi_i - ('chi_i)^*%CF).
+ rewrite big_filter sumrB -rmorph_sum.
+ by have [<-] := FTtype1_seqInd_facts calS_phi.
+ elim: e => /= [_ _ | i e IHe /andP[Si Se] /andP[e'i Ue]].
+ by rewrite !big_nil /tau linear0.
+ rewrite big_cons [tau _]linearD big_cat /= -/tau orthonormal_cat.
+ have{IHe Ue} [/allP Ze -> ->] := IHe Se Ue.
+ have{h1} /h1[/allP Z_R1i -> -> /=] := memI _ _ calS_phi Si.
+ split=> //; first by apply/allP; rewrite all_cat Z_R1i.
+ apply/orthogonalP=> mu nu R1i_mu /flatten_mapP[j e_j R1j_nu].
+ have /= Sj := allP Se j e_j; apply: (aux phi phi i j) => //.
+ rewrite /orthogonal /= !andbT !cfdot_irr mulrb ifN_eqC ?(memPn e'i) ?eqxx //=.
+ rewrite !inE in Si Sj; rewrite -conjC_IirrE; set k := conjC_Iirr j.
+ rewrite (calS_chi_ortho phi phi^*%CF) ?calS_char ?ccS //.
+ by rewrite irr_consttE conjC_IirrE cfdot_conjC fmorph_eq0.
+ by rewrite (seqInd_conjC_ortho _ _ _ calS_phi) ?mFT_odd.
+case/andP=> /and3P[/eqP opsi_phi /eqP opsi_phiC _] _; apply/orthogonalP.
+move=> nu mu /flatten_imageP[j Spsi_j R1j_nu] /flatten_imageP[i Sphi_i R1i_mu].
+apply: (aux psi phi j i) => //; rewrite /orthogonal /= !andbT -conjC_IirrE.
+rewrite !inE in Sphi_i Spsi_j; rewrite (calS_chi_ortho psi phi) ?calS_char //.
+rewrite (calS_chi_ortho psi phi^*%CF) ?calS_char ?ccS ?eqxx //.
+by rewrite irr_consttE conjC_IirrE cfdot_conjC fmorph_eq0.
+Qed.
+
+End Twelve2.
+
+Local Notation R1gen := FPtype1_irr_subcoherent.
+Local Notation Rgen := FPtype1_subcoherent.
+
+(* This is Peterfalvi (12.3) *)
+Lemma FTtype1_seqInd_ortho L1 L2 (maxL1 : L1 \in 'M) (maxL2 : L2 \in 'M)
+ (L1type1 : FTtype L1 == 1%N) (L2type1 : FTtype L2 == 1%N)
+ (H1 := L1`_\F%G) (H2 := L2`_\F%G)
+ (calS1 := seqIndD H1 L1 H1 1) (calS2 := seqIndD H2 L2 H2 1)
+ (R1 := sval (Rgen maxL1 L1type1)) (R2 := sval (Rgen maxL2 L2type1)) :
+ gval L2 \notin L1 :^: G ->
+ {in calS1 & calS2, forall chi1 chi2, orthogonal (R1 chi1) (R2 chi2)}.
+Proof.
+move=> notL1G_L2; without loss{notL1G_L2} disjointA1A:
+ L1 L2 maxL1 maxL2 L1type1 L2type1 @H1 @H2 @calS1 @calS2 @R1 @R2 /
+ [disjoint 'A1~(L2) & 'A~(L1)].
+- move=> IH_L; have [_ _] := FT_Dade_support_disjoint maxL1 maxL2 notL1G_L2.
+ by case=> /IH_L-oS12 chi1 chi2 *; first rewrite orthogonal_sym; apply: oS12.
+case: (Rgen _ _) @R1 => /= R1; set R1' := sval _ => [[subcoh1 hR1' defR1]].
+case: (Rgen _ _) @R2 => /= R2; set R2' := sval _ => [[subcoh2 hR2' defR2]].
+pose tau1 := FT_Dade maxL1; pose tau2 := FT_Dade maxL2.
+move=> chi1 chi2 calS1_chi1 calS2_chi2.
+have [_ _ _ /(_ chi1 calS1_chi1)[Z_R1 o1R1 dtau1_chi1] _] := subcoh1.
+have{o1R1} [uR1 oR1] := orthonormalP o1R1.
+apply/orthogonalP=> a b R1a R2b; pose psi2 := tau2 (chi2 - chi2^*%CF).
+have Z1a: a \in dirr G by rewrite dirrE Z_R1 //= oR1 ?eqxx.
+suffices{b R2b}: '[a, psi2] == 0.
+ apply: contraTeq => nz_ab; rewrite /psi2 /tau2.
+ have [_ _ _ /(_ chi2 calS2_chi2)[Z_R2 o1R2 ->] _] := subcoh2.
+ suffices [e ->]: {e | a = if e then - b else b}.
+ rewrite -scaler_sign cfdotC cfdotZr -cfdotZl scaler_sumr.
+ by rewrite cfproj_sum_orthonormal // conjCK signr_eq0.
+ have [_ oR2] := orthonormalP o1R2.
+ have Z1b: b \in dirr G by rewrite dirrE Z_R2 //= oR2 ?eqxx.
+ move/eqP: nz_ab; rewrite cfdot_dirr //.
+ by do 2?[case: eqP => [-> | _]]; [exists true | exists false | ].
+have [chi1D _ Achi1] := FTtype1_seqInd_facts maxL1 L1type1 calS1_chi1.
+pose S_chi1 := [set i0 in irr_constt chi1].
+pose bchi i := 'chi[_ : {set gT}]_i - ('chi_i)^*%CF.
+have [t S_chi1t et]: exists2 t, t \in S_chi1 & tau1 (bchi _ t) = a - a^*%CF.
+ suffices: ~~ [forall i in S_chi1, '[tau1 (bchi L1 i), a] <= 0].
+ rewrite negb_forall_in => /exists_inP[i Si tau1i_a]; exists i => //.
+ case/dIrrP: Z1a tau1i_a => ia ->.
+ have [k ->]: exists k, tau1 (bchi _ i) = bchi G k.
+ exact: Dade_irr_sub_conjC (mem_irr _) (Achi1 i Si).
+ have {1}->: bchi G k = dchi (false, k) + dchi (true, conjC_Iirr k).
+ by rewrite /dchi !scaler_sign conjC_IirrE.
+ rewrite cfdotDl !cfdot_dchi addrACA -opprD subr_le0 -!natrD leC_nat.
+ do 2?case: (_ =P ia) => [<-|] _ //; first by rewrite /dchi scale1r.
+ by rewrite /dchi scaleN1r conjC_IirrE rmorphN /= cfConjCK opprK addrC.
+ have: '[tau1 (chi1 - chi1^*%CF), a] == 1.
+ rewrite /tau1 dtau1_chi1 (bigD1_seq a) //= cfdotDl cfdot_suml oR1 // eqxx.
+ by rewrite big1_seq ?addr0 // => xi /andP[/negPf a'xi ?]; rewrite oR1 ?a'xi.
+ apply: contraL => /forall_inP tau1a_le0.
+ rewrite (ltr_eqF (ler_lt_trans _ ltr01)) // chi1D rmorph_sum /= -/S_chi1.
+ rewrite -sumrB [tau1 _]linear_sum /= -/tau1 cfdot_suml.
+ by rewrite -oppr_ge0 -sumrN sumr_ge0 // => i /tau1a_le0; rewrite oppr_ge0.
+clear Achi1 dtau1_chi1 uR1 defR1.
+suffices: '[a, psi2] == - '[a, psi2] by rewrite -addr_eq0 (mulrn_eq0 _ 2).
+have A1bchi2: chi2 - (chi2^*)%CF \in 'Z[calS2, 'A1(L2)].
+ by rewrite FTsupp1_type1 // seqInd_sub_aut_zchar ?gFnormal.
+have{t S_chi1t et} /eqP{2}->: '[a, psi2] == '[a^*%CF, psi2].
+ move/zchar_on in A1bchi2; rewrite -subr_eq0 -cfdotBl.
+ rewrite [psi2]FT_DadeE ?(cfun_onS (FTsupp1_sub _)) // -FT_Dade1E // -et.
+ rewrite (cfdot_complement (Dade_cfunS _ _)) ?(cfun_onS _ (Dade_cfunS _ _)) //.
+ by rewrite FT_Dade_supportE FT_Dade1_supportE setTD -disjoints_subset.
+rewrite -2!raddfN opprB /= cfdot_conjCl -Dade_conjC rmorphB /= cfConjCK -/tau2.
+rewrite conj_Cint ?Cint_cfdot_vchar ?(Z_R1 a) // Dade_vchar //.
+rewrite (zchar_onS (FTsupp1_sub _)) // (zchar_sub_irr _ A1bchi2) //.
+exact: seqInd_vcharW.
+Qed.
+
+Section Twelve_4_to_6.
+
+Variable L : {group gT}.
+Hypothesis maxL : L \in 'M .
+
+Local Notation "` 'L'" := (gval L) (at level 0, only parsing) : group_scope.
+Local Notation H := `L`_\F%G.
+Local Notation "` 'H'" := `L`_\F (at level 0) : group_scope.
+Local Notation H' := H^`(1)%G.
+Local Notation "` 'H''" := `H^`(1) (at level 0) : group_scope.
+
+Let calS := seqIndD H L H 1%G.
+Let tau := FT_Dade maxL.
+Let rho := invDade (FT_DadeF_hyp maxL).
+
+Section Twelve_4_5.
+
+Hypothesis Ltype1 : FTtype L == 1%N.
+
+Let R := sval (Rgen maxL Ltype1).
+Let S_ (chi : 'CF(L)) := [set i in irr_constt chi].
+
+(* This is Peterfalvi (12.4). *)
+Lemma FTtype1_ortho_constant (psi : 'CF(G)) x :
+ {in calS, forall phi, orthogonal psi (R phi)} -> x \in L :\: H ->
+ {in x *: H, forall y, psi y = psi x}%g.
+Proof.
+move=> opsiR /setDP[Lx H'x]; pose Rpsi := 'Res[L] psi.
+have nsHL: H <| L := gFnormal _ _; have [sHL _] := andP nsHL.
+have [U [[[_ _ sdHU] [U1 inertU1] _] _]] := FTtypeP 1 maxL Ltype1.
+have /= [_ _ TIsub]:= FTtypeI_II_facts maxL Ltype1 sdHU.
+pose ddL := FT_Dade_hyp maxL.
+have A1Hdef : 'A1(L) = H^# by apply: FTsupp1_type1.
+have dot_irr xi j : xi \in calS -> j \in S_ xi -> '['chi_j, xi] = 1.
+ move=> xi_calS Sj.
+ have -> : xi = \sum_(i <- enum (S_ xi)) 'chi_i.
+ by rewrite big_filter; have [] := FTtype1_seqInd_facts maxL Ltype1 xi_calS.
+ rewrite (bigD1_seq j) ?mem_enum ?enum_uniq //= cfdotDr cfdot_sumr cfnorm_irr.
+ by rewrite big1 ?addr0 // => k i'k; rewrite cfdot_irr eq_sym (negPf i'k).
+have {dot_irr} supp12B y xi j1 j2 : xi \in calS -> j1 \in S_ xi ->
+ j2 \in S_ xi -> y \notin ('A(L) :\: H^#) -> ('chi_j1 - 'chi_j2) y = 0.
+- move=> calS_xi Sj1 Sj2 yADHn.
+ have [xiD xi_cst sup_xi] := FTtype1_seqInd_facts maxL Ltype1 calS_xi.
+ have [Hy | H'y] := boolP (y \in H); last first.
+ suffices /cfun_on0->: y \notin 1%g |: 'A(L) by rewrite ?rpredB ?sup_xi.
+ by rewrite !inE negb_or negb_and (group1_contra H'y) ?H'y in yADHn *.
+ have [s _ xiIndD] := seqIndP calS_xi.
+ pose sum_sL := \sum_(xi_z <- ('chi_s ^: L)%CF) xi_z.
+ suffices Dxi: {in S_ xi, forall i, 'chi_i y = sum_sL y}.
+ by rewrite !cfunE !Dxi ?subrr.
+ move=> k Sk; pose phiH := 'Res[H] 'chi_k.
+ transitivity (phiH y); first by rewrite cfResE ?normal_sub.
+ have phiH_s_1: '[phiH, 'chi_s] = 1 by rewrite cfdot_Res_l -xiIndD dot_irr.
+ have phiH_s: s \in irr_constt phiH by rewrite irr_consttE phiH_s_1 oner_eq0.
+ by rewrite [phiH](Clifford_Res_sum_cfclass _ phiH_s) // phiH_s_1 scale1r.
+have {supp12B} oResD xi i1 i2 : xi \in calS -> i1 \in S_ xi -> i2 \in S_ xi ->
+ '['Res[L] psi, 'chi_i1 - 'chi_i2] = 0.
+- move=> calS_xi Si1 Si2; rewrite cfdotC Frobenius_reciprocity -cfdotC.
+ case: (altP (i1 =P i2))=> [-> | d12]; first by rewrite subrr linear0 cfdot0r.
+ have {supp12B} supp12B y: y \notin 'A(L) :\: H^# -> ('chi_i1 - 'chi_i2) y = 0.
+ exact: (supp12B _ xi _ _ calS_xi).
+ case: (FTtype1_seqInd_facts maxL Ltype1 calS_xi) => _ cst1 supA.
+ move/(_ _ Si1): (supA) => /cfun_onP s1; case/(constantP 0): (cst1) => [n].
+ move/all_pred1P /allP => nseqD; move/(_ _ Si2): (supA) => /cfun_onP s2.
+ have nchi11: 'chi_i1 1%g = n by apply/eqP/nseqD/image_f.
+ have{nseqD} nchi12: 'chi_i2 1%g = n by apply/eqP/nseqD/image_f.
+ have i12_1: 'chi_i1 1%g == 'chi_i2 1%g by rewrite nchi11 nchi12.
+ have sH1A: H^# \subset 'A(L) by rewrite Fcore_sub_FTsupp.
+ have nzAH: 'A(L) :\: H^# != set0.
+ apply: contra d12 => /eqP tADH; apply/eqP; apply: irr_inj; apply/cfunP=> w.
+ apply/eqP; rewrite -subr_eq0; have := supp12B w; rewrite !cfunE => -> //.
+ by rewrite tADH in_set0.
+ have{nzAH} tiH: normedTI ('A(L) :\: H^#) G L by rewrite -A1Hdef TIsub ?A1Hdef.
+ have{supp12B} supp12B : 'chi_i1 - 'chi_i2 \in 'CF(L, 'A(L) :\: H^#).
+ by apply/cfun_onP; apply: supp12B.
+ have [_ /subsetIP[_ nAHL] _] := normedTI_P tiH.
+ pose tau1 := restr_Dade ddL (subsetDl _ _) nAHL.
+ have tauInd: {in 'CF(L, 'A(L) :\: H^#), tau1 =1 'Ind} := Dade_Ind _ tiH.
+ rewrite -{}tauInd // [tau1 _]restr_DadeE {tau1 nAHL}//.
+ suffices Rtau12: Dade ddL ('chi_i1 - 'chi_i2) \in 'Z[R xi].
+ by rewrite (span_orthogonal (opsiR xi _)) ?memv_span1 ?(zchar_span Rtau12).
+ case: (Rgen _ _) @R => rR [scohS]; case: (R1gen _ _) => /= R1 scohI ? DrR.
+ rewrite -/calS in scohS; set calI := image _ _ in scohI.
+ have [Ii1 Ii2]: 'chi_i1 \in calI /\ 'chi_i2 \in calI.
+ by split; apply/image_f/FTtype1_irrP; exists xi.
+ have [calI2 [I2i1 I2i2 sI2I] []] := pair_degree_coherence scohI Ii1 Ii2 i12_1.
+ move=> tau2 cohI2; have [_ <-] := cohI2; last first.
+ by rewrite zcharD1E rpredB ?mem_zchar // 2!cfunE subr_eq0.
+ suffices R_I2 j: j \in S_ xi -> 'chi_j \in calI2 -> tau2 'chi_j \in 'Z[rR xi].
+ by rewrite raddfB rpredB ?R_I2.
+ move=> Sj /(mem_coherent_sum_subseq scohI sI2I cohI2)[e R1e ->].
+ rewrite DrR big_seq rpred_sum // => phi /(mem_subseq R1e) R1phi.
+ by apply/mem_zchar/flatten_imageP; exists j.
+suffices ResL: {in x *: H, forall y, Rpsi y = Rpsi x}%g.
+ move=> w xHw; case/lcosetP: xHw (ResL w xHw) => h Hh -> {w}.
+ by rewrite !cfResE ?subsetT ?groupM // ?(subsetP sHL).
+move=> _ /lcosetP[h Hh ->] /=; rewrite (cfun_sum_cfdot Rpsi).
+pose calX := Iirr_kerD L H 1%g; rewrite (bigID (mem calX) xpredT) /= !cfunE.
+set sumX := \sum_(i in _) _; suffices HsumX: sumX \in 'CF(L, H).
+ rewrite !(cfun_on0 HsumX) ?groupMr // !sum_cfunE.
+ rewrite !add0r; apply: eq_bigr => i;rewrite !inE sub1G andbT negbK => kerHi.
+ by rewrite !cfunE cfkerMr ?(subsetP kerHi).
+rewrite [sumX](set_partition_big _ (FTtype1_irr_partition L)) /=.
+apply: rpred_sum => A; rewrite inE => /mapP[xi calS_xi defA].
+have [-> | [j Achij]] := set_0Vmem A; first by rewrite big_set0 rpred0.
+suffices ->: \sum_(i in A) '[Rpsi, 'chi_i] *: 'chi_i = '[Rpsi, 'chi_j] *: xi.
+ by rewrite rpredZ // (seqInd_on _ calS_xi).
+have [-> _ _] := FTtype1_seqInd_facts maxL Ltype1 calS_xi; rewrite -defA.
+rewrite scaler_sumr; apply: eq_bigr => i Ai; congr (_ *: _); apply/eqP.
+by rewrite -subr_eq0 -cfdotBr (oResD xi) /S_ -?defA.
+Qed.
+
+(* This is Peterfalvi (12.5) *)
+Lemma FtypeI_invDade_ortho_constant (psi : 'CF(G)) :
+ {in calS, forall phi, orthogonal psi (R phi)} ->
+ {in H :\: H' &, forall x y, rho psi x = rho psi y}.
+Proof.
+have [nsH'H nsHL]: H' <| H /\ H <| L by rewrite !gFnormal.
+have [[sH'H _] [sHL _]] := (andP nsH'H, andP nsHL).
+case: (Rgen _ _) @R => /= rR [scohS _ _] opsiR; set rpsi := rho psi.
+have{rR scohS opsiR} o_rpsi_S xi1 xi2:
+ xi1 \in calS -> xi2 \in calS -> xi1 1%g = xi2 1%g -> '[rpsi, xi1 - xi2] = 0.
+- move=> Sxi1 Sxi2 /eqP deg12.
+ have [calS2 [S2xi1 S2xi2]] := pair_degree_coherence scohS Sxi1 Sxi2 deg12.
+ move=> ccsS2S [tau2 cohS2]; have [[_ Dtau2] [_ sS2S _]] := (cohS2, ccsS2S).
+ have{deg12} L1xi12: (xi1 - xi2) 1%g == 0 by rewrite !cfunE subr_eq0.
+ have{ccsS2S cohS2} tau2E := mem_coherent_sum_subseq scohS ccsS2S cohS2.
+ have o_psi_tau2 xi: xi \in calS2 -> '[psi, tau2 xi] = 0.
+ move=> S2xi; have [e /mem_subseq Re ->] := tau2E xi S2xi.
+ by rewrite cfdot_sumr big1_seq // => _ /Re/orthoPl->; rewrite ?opsiR ?sS2S.
+ have A1xi12: xi1 - xi2 \in 'CF(L, H^#).
+ by rewrite (@zchar_on _ _ calS) ?zcharD1 ?rpredB ?seqInd_zchar.
+ rewrite cfdotC -invDade_reciprocity // -cfdotC.
+ rewrite FT_DadeF_E -?FT_DadeE ?(cfun_onS (Fcore_sub_FTsupp maxL)) //.
+ rewrite -Dtau2; last by rewrite zcharD1E rpredB ?mem_zchar.
+ by rewrite !raddfB /= !o_psi_tau2 ?subrr.
+pose P_ i : {set Iirr H} := [set j in irr_constt ('Ind[H, H'] 'chi_i)].
+pose P : {set {set Iirr H}} := [set P_ i | i : Iirr H'].
+have tiP: trivIset P.
+ apply/trivIsetP=> _ _ /imsetP[i1 _ ->] /imsetP[i2 _ ->] chi2'1.
+ apply/pred0P=> j; rewrite !inE; apply: contraNF chi2'1 => /andP[i1Hj i2Hj].
+ case: ifP (cfclass_Ind_cases i1 i2 nsH'H) => _; first by rewrite /P_ => ->.
+ have NiH i: 'Ind[H,H'] 'chi_i \is a character by rewrite cfInd_char ?irr_char.
+ case/(constt_ortho_char (NiH i1) (NiH i2) i1Hj i2Hj)/eqP/idPn.
+ by rewrite cfnorm_irr oner_eq0.
+have coverP: cover P =i predT.
+ move=> j; apply/bigcupP; have [i jH'i] := constt_cfRes_irr H' j.
+ by exists (P_ i); [apply: mem_imset | rewrite inE constt_Ind_Res].
+have /(all_sig_cond 0)[lambda lambdaP] A: A \in P -> {i | A = P_ i}.
+ by case/imsetP/sig2_eqW=> i; exists i.
+pose theta A : Iirr H := odflt 0 [pick j in A :\ 0]; pose psiH := 'Res[H] rpsi.
+pose a_ A := '[psiH, 'chi_(theta A)] / '['Ind 'chi_(lambda A), 'chi_(theta A)].
+pose a := '[psiH, 1 - 'chi_(theta (pblock P 0))].
+suffices Da: {in H :\: H', rpsi =1 (fun=> a)} by move=> /= *; rewrite !Da.
+suffices DpsiH: psiH = \sum_(A in P) a_ A *: 'Ind 'chi_(lambda A) + a%:A.
+ move=> x /setDP[Hx notH'x]; transitivity (psiH x); first by rewrite cfResE.
+ rewrite DpsiH !cfunE sum_cfunE cfun1E Hx mulr1 big1 ?add0r // => A _.
+ by rewrite cfunE (cfun_onP (cfInd_normal _ _)) ?mulr0.
+apply: canRL (subrK _) _; rewrite [_ - _]cfun_sum_cfdot.
+rewrite -(eq_bigl _ _ coverP) big_trivIset //=; apply: eq_bigr => A P_A.
+rewrite {}/a_; set i := lambda A; set k := theta A; pose Ii := 'I_H['chi_i]%G.
+have /cfInd_central_Inertia[//|e _ [DiH _ DiH_1]]: abelian (Ii / H').
+ by rewrite (abelianS _ (der_abelian 0 H)) ?quotientS ?subsetIl.
+have defA: A = P_ i := lambdaP A P_A.
+have Ak: k \in A; last 1 [have iHk := Ak; rewrite defA inE in Ak].
+ have [j iHj] := constt_cfInd_irr i sH'H.
+ rewrite {}/k /theta; case: pickP => [k /setDP[]//| /(_ j)/=].
+ by rewrite defA !in_set iHj andbT => /negbFE/eqP <-.
+have{DiH} DiH: 'Ind 'chi_i = e *: \sum_(j in A) 'chi_j.
+ by congr (_ = _ *: _): DiH; apply: eq_bigl => j; rewrite [in RHS]defA !inE.
+rewrite {2}DiH; have{DiH} ->: e = '['Ind 'chi_i, 'chi_k].
+ rewrite DiH cfdotZl cfdot_suml (bigD1 k) //= cfnorm_irr big1 ?addr0 ?mulr1 //.
+ by move=> j /andP[_ k'j]; rewrite cfdot_irr (negPf k'j).
+rewrite scalerA scaler_sumr divfK //; apply: eq_bigr => j Aj; congr (_ *: _).
+rewrite cfdotBl cfdotZl -irr0 cfdot_irr mulr_natr mulrb eq_sym.
+apply/(canLR (addrK _))/(canRL (addNKr _)); rewrite addrC -cfdotBr.
+have [j0 | nzj] := altP eqP; first by rewrite j0 irr0 /a -j0 (def_pblock _ P_A).
+have iHj := Aj; rewrite defA inE in iHj; rewrite cfdot_Res_l linearB /=.
+do [rewrite o_rpsi_S ?cfInd1 ?DiH_1 //=; apply/seqIndC1P]; first by exists j.
+by exists k; rewrite // /k /theta; case: pickP => [? | /(_ j)] /setD1P[].
+Qed.
+
+End Twelve_4_5.
+
+Hypothesis frobL : [Frobenius L with kernel H].
+
+Lemma FT_Frobenius_type1 : FTtype L == 1%N.
+Proof.
+have [E /Frobenius_of_typeF LtypeF] := existsP frobL.
+by apply/idPn=> /FTtypeP_witness[]// _ _ _ _ _ /typePF_exclusion/(_ E).
+Qed.
+Let Ltype1 := FT_Frobenius_type1.
+
+Lemma FTsupp_Frobenius : 'A(L) = H^#.
+Proof.
+apply/eqP; rewrite eqEsubset Fcore_sub_FTsupp // andbT.
+apply/bigcupsP=> y; rewrite Ltype1 FTsupp1_type1 //= => H1y.
+by rewrite setSD //; have [_ _ _ ->] := Frobenius_kerP frobL.
+Qed.
+
+(* This is Peterfalvi (12.6). *)
+Lemma FT_Frobenius_coherence : {subset calS <= irr L} /\ coherent calS L^# tau.
+Proof.
+have irrS: {subset calS <= irr L}.
+ by move=> _ /seqIndC1P[s nz_s ->]; apply: irr_induced_Frobenius_ker.
+split=> //; have [U [MtypeF MtypeI]] := FTtypeP 1 maxL Ltype1.
+have [[ntH ntU defL] _ _] := MtypeF; have nsHL: H <| L := gFnormal _ L.
+have nilH: nilpotent H := Fcore_nil L; have solH := nilpotent_sol nilH.
+have frobHU: [Frobenius L = H ><| U] := set_Frobenius_compl defL frobL.
+pose R := sval (Rgen maxL Ltype1).
+have scohS: subcoherent calS tau R by case: (svalP (Rgen maxL Ltype1)).
+have [tiH | [cHH _] | [expUdvH1 _]] := MtypeI.
+- have /Sibley_coherence := And3 (mFT_odd L) nilH tiH.
+ case/(_ U)=> [|tau1 [IZtau1 Dtau1]]; first by left.
+ exists tau1; split=> // chi Schi; rewrite Dtau1 //.
+ by rewrite /tau Dade_Ind ?FTsupp_Frobenius ?(zcharD1_seqInd_on _ Schi).
+- apply/(uniform_degree_coherence scohS)/(@all_pred1_constant _ #|L : H|%:R).
+ apply/allP=> _ /mapP[_ /seqIndP[s _ ->] ->] /=.
+ by rewrite cfInd1 ?gFsub // lin_char1 ?mulr1 //; apply/char_abelianP.
+have isoHbar := quotient1_isog H.
+have /(_ 1%G)[|//|[_ [p [pH _] /negP[]]]] := non_coherent_chief nsHL solH scohS.
+ split; rewrite ?mFT_odd ?normal1 ?sub1G -?(isog_nil isoHbar) //= joingG1.
+ apply/existsP; exists (U / H')%G.
+ rewrite Frobenius_proper_quotient ?(sol_der1_proper solH) //.
+ exact: char_normal_trans (der_char 1 H) nsHL.
+rewrite -(isog_pgroup p isoHbar) in pH.
+have [pr_p p_dv_H _] := pgroup_pdiv pH ntH.
+rewrite subn1 -(index_sdprod defL).
+have [-> *] := typeF_context MtypeF; last by split; rewrite ?(sdprodWY defL).
+by rewrite expUdvH1 // mem_primes pr_p cardG_gt0.
+Qed.
+
+End Twelve_4_to_6.
+
+Section Twelve_8_to_16.
+
+Variable p : nat.
+
+(* Equivalent reformultaion of Hypothesis (12.8), avoiding quotients. *)
+Hypothesis IHp :
+ forall q M, (q < p)%N -> M \in 'M -> FTtype M == 1%N -> ('r_q(M) > 1)%N ->
+ q \in \pi(M`_\F).
+
+Variables M P0 : {group gT}.
+
+Let K := M`_\F%G.
+Let K' := K^`(1)%G.
+Let nsKM : K <| M. Proof. exact: gFnormal. Qed.
+
+Hypothesis maxM : M \in 'M.
+Hypothesis Mtype1 : FTtype M == 1%N.
+Hypothesis prankM : ('r_p(M) > 1)%N.
+Hypothesis p'K : p^'.-group K.
+
+Hypothesis sylP0 : p.-Sylow(M) P0.
+
+(* This is Peterfalvi (12.9). *)
+Lemma non_Frobenius_FTtype1_witness :
+ [/\ abelian P0, 'r_p(P0) = 2
+ & exists2 L, L \in 'M /\ P0 \subset L`_\s
+ & exists2 x, x \in 'Ohm_1(P0)^#
+ & [/\ ~~ ('C_K[x] \subset K'), 'N(<[x]>) \subset M & ~~ ('C[x] \subset L)]].
+Proof.
+have ntK: K :!=: 1%g := mmax_Fcore_neq1 maxM; have [sP0M pP0 _] := and3P sylP0.
+have hallK: \pi(K).-Hall(M) K := Fcore_Hall M.
+have K'p: p \notin \pi(K) by rewrite -p'groupEpi.
+have K'P0: \pi(K)^'.-group P0 by rewrite (pi_pgroup pP0).
+have [U hallU sP0U] := Hall_superset (mmax_sol maxM) sP0M K'P0.
+have sylP0_U: p.-Sylow(U) P0 := pHall_subl sP0U (pHall_sub hallU) sylP0.
+have{hallU} defM: K ><| U = M by apply/(sdprod_normal_p'HallP nsKM hallU).
+have{K'P0} coKP0: coprime #|K| #|P0| by rewrite coprime_pi'.
+have [/(_ _ _ sylP0_U)[abP0 rankP0] uCK _] := FTtypeI_II_facts maxM Mtype1 defM.
+have{rankP0} /eqP prankP0: 'r_p(P0) == 2.
+ by rewrite eqn_leq -{1}rank_pgroup // rankP0 (p_rank_Sylow sylP0).
+have piP0p: p \in \pi(P0) by rewrite -p_rank_gt0 prankP0.
+have [L maxL sP0Ls]: exists2 L, L \in 'M & P0 \subset L`_\s.
+ have [DpiG _ _ _] := FT_Dade_support_partition gT.
+ have:= piSg (subsetT P0) piP0p; rewrite DpiG => /exists_inP[L maxL piLs_p].
+ have [_ /Hall_pi hallLs _] := FTcore_facts maxL.
+ have [P sylP] := Sylow_exists p L`_\s; have [sPLs _] := andP sylP.
+ have sylP_G: p.-Sylow(G) P := subHall_Sylow hallLs piLs_p sylP.
+ have [y _ sP0_Py] := Sylow_subJ sylP_G (subsetT P0) pP0.
+ by exists (L :^ y)%G; rewrite ?mmaxJ // FTcoreJ (subset_trans sP0_Py) ?conjSg.
+split=> //; exists L => //; set P1 := 'Ohm_1(P0).
+have abelP1: p.-abelem P1 := Ohm1_abelem pP0 abP0.
+have [pP1 abP1 _] := and3P abelP1.
+have sP10: P1 \subset P0 := Ohm_sub 1 P0; have sP1M := subset_trans sP10 sP0M.
+have nKP1: P1 \subset 'N(K) by rewrite (subset_trans sP1M) ?gFnorm.
+have nK'P1: P1 \subset 'N(K') := char_norm_trans (der_char 1 K) nKP1.
+have{coKP0} coKP1: coprime #|K| #|P1| := coprimegS sP10 coKP0.
+have solK: solvable K := nilpotent_sol (Fcore_nil M).
+have isoP1: P1 \isog P1 / K'.
+ by rewrite quotient_isog // coprime_TIg ?(coprimeSg (der_sub 1 K)).
+have{ntK} ntKK': (K / K' != 1)%g.
+ by rewrite -subG1 quotient_sub1 ?gFnorm ?proper_subn ?(sol_der1_proper solK).
+have defKK': (<<\bigcup_(xbar in (P1 / K')^#) 'C_(K / K')[xbar]>> = K / K')%g.
+ rewrite coprime_abelian_gen_cent1 ?coprime_morph ?quotient_norms //.
+ by rewrite quotient_abelian.
+ rewrite -(isog_cyclic isoP1) (abelem_cyclic abelP1).
+ by rewrite -(p_rank_abelem abelP1) p_rank_Ohm1 prankP0.
+have [xb P1xb ntCKxb]: {xb | xb \in (P1 / K')^# & 'C_(K / K')[xb] != 1}%g.
+ apply/sig2W/exists_inP; rewrite -negb_forall_in.
+ apply: contra ntKK' => /eqfun_inP regKP1bar.
+ by rewrite -subG1 /= -defKK' gen_subG; apply/bigcupsP=> xb /regKP1bar->.
+have [ntxb /morphimP[x nK'x P1x Dxb]] := setD1P P1xb.
+have ntx: x != 1%g by apply: contraNneq ntxb => x1; rewrite Dxb x1 morph1.
+have ntCKx: ~~ ('C_K[x] \subset K').
+ rewrite -quotient_sub1 ?subIset ?gFnorm // -cent_cycle subG1 /=.
+ have sXP1: <[x]> \subset P1 by rewrite cycle_subG.
+ rewrite coprime_quotient_cent ?(coprimegS sXP1) ?(subset_trans sXP1) ?gFsub//.
+ by rewrite quotient_cycle ?(subsetP nK'P1) // -Dxb cent_cycle.
+have{uCK} UCx: 'M('C[x]) = [set M].
+ rewrite -cent_set1 uCK -?card_gt0 ?cards1 // ?sub1set ?cent_set1.
+ by rewrite !inE ntx (subsetP sP0U) ?(subsetP sP10).
+ by apply: contraNneq ntCKx => ->; rewrite sub1G.
+exists x; [by rewrite !inE ntx | split=> //].
+ rewrite (sub_uniq_mmax UCx) /= -?cent_cycle ?cent_sub //.
+ rewrite mFT_norm_proper ?cycle_eq1 //.
+ by rewrite mFT_sol_proper abelian_sol ?cycle_abelian.
+apply: contraL (leqW (p_rankS p sP0Ls)) => /(eq_uniq_mmax UCx)-> //.
+by rewrite prankP0 FTcore_type1 //= ltnS p_rank_gt0.
+Qed.
+
+Variables (L : {group gT}) (x : gT).
+Hypotheses (abP0 : abelian P0) (prankP0 : 'r_p(P0) = 2).
+Hypotheses (maxL : L \in 'M) (sP0_Ls : P0 \subset L`_\s).
+Hypotheses (P0_1s_x : x \in 'Ohm_1(P0)^#) (not_sCxK' : ~~ ('C_K[x] \subset K')).
+Hypotheses (sNxM : 'N(<[x]>) \subset M) (not_sCxL : ~~ ('C[x] \subset L)).
+
+Let H := L`_\F%G.
+Let nsHL : H <| L. Proof. exact: gFnormal. Qed.
+
+(* This is Peterfalvi (12.10). *)
+Let frobL : [Frobenius L with kernel H].
+Proof.
+have [sP0M pP0 _] := and3P sylP0.
+have [ntx /(subsetP (Ohm_sub 1 _))P0x] := setD1P P0_1s_x.
+have [Ltype1 | notLtype1] := boolP (FTtype L == 1)%N; last first.
+ have [U W W1 W2 defW LtypeP] := FTtypeP_witness maxL notLtype1.
+ suffices sP0H: P0 \subset H.
+ have [Hx notLtype5] := (subsetP sP0H x P0x, FTtype5_exclusion maxL).
+ have [_ _ _ tiFL] := compl_of_typeII_IV maxL LtypeP notLtype5.
+ have Fx: x \in 'F(L)^# by rewrite !inE ntx (subsetP (Fcore_sub_Fitting L)).
+ by have /idPn[] := cent1_normedTI tiFL Fx; rewrite setTI.
+ have [/=/FTcore_type2<- // | notLtype2] := boolP (FTtype L == 2).
+ have [_ _ [Ltype3 galL]] := FTtype34_structure maxL LtypeP notLtype2.
+ have cycU: cyclic U.
+ suffices regHU: Ptype_Fcompl_kernel LtypeP :=: 1%g.
+ rewrite (isog_cyclic (quotient1_isog U)) -regHU.
+ by have [|_ _ [//]] := typeP_Galois_P maxL _ galL; rewrite (eqP Ltype3).
+ rewrite /Ptype_Fcompl_kernel unlock /= astabQ /=.
+ have [_ _ ->] := FTtype34_Fcore_kernel_trivial maxL LtypeP notLtype2.
+ rewrite -morphpreIim -injm_cent ?injmK ?ker_coset ?norms1 //.
+ have [_ _ _ ->] := FTtype34_facts maxL LtypeP notLtype2.
+ by apply/derG1P; have [] := compl_of_typeIII maxL LtypeP Ltype3.
+ have sP0L': P0 \subset L^`(1) by rewrite -FTcore_type_gt2 ?(eqP Ltype3).
+ have [_ [_ _ _ defL'] _ _ _] := LtypeP.
+ have [nsHL' _ /mulG_sub[sHL' _] _ _] := sdprod_context defL'.
+ have hallH := pHall_subl sHL' (der_sub 1 L) (Fcore_Hall L).
+ have hallU: \pi(H)^'.-Hall(L^`(1)) U.
+ by rewrite -(compl_pHall U hallH) sdprod_compl.
+ rewrite (sub_normal_Hall hallH) // (pi_pgroup pP0) //.
+ have: ~~ cyclic P0; last apply: contraR => piK'p.
+ by rewrite abelian_rank1_cyclic // (rank_pgroup pP0) prankP0.
+ by have [|y _ /cyclicS->] := Hall_psubJ hallU piK'p _ pP0; rewrite ?cyclicJ.
+have sP0H: P0 \subset H by rewrite /= -FTcore_type1.
+have [U [LtypeF /= LtypeI]] := FTtypeP 1 maxL Ltype1.
+have [[_ _ defL] _ _] := LtypeF; have [_ sUL _ nHU _] := sdprod_context defL.
+have not_tiH: ~ normedTI H^# G L.
+ have H1x: x \in H^# by rewrite !inE ntx (subsetP sP0H).
+ by case/cent1_normedTI/(_ x H1x)/idPn; rewrite setTI.
+apply/existsP; exists U; have [_ -> _] := typeF_context LtypeF.
+apply/forall_inP=> Q /SylowP[q pr_q sylQ]; have [sQU qQ _] := and3P sylQ.
+rewrite (odd_pgroup_rank1_cyclic qQ) ?mFT_odd //.
+apply: wlog_neg; rewrite -ltnNge => /ltnW; rewrite p_rank_gt0 => piQq.
+have hallU: \pi(H)^'.-Hall(L) U.
+ by rewrite -(compl_pHall U (Fcore_Hall L)) sdprod_compl.
+have H'q := pnatPpi (pHall_pgroup hallU) (piSg sQU piQq).
+rewrite leqNgt; apply: contra (H'q) => qrankQ; apply: IHp => //; last first.
+ by rewrite (leq_trans qrankQ) ?p_rankS ?(subset_trans sQU).
+have piHp: p \in \pi(H) by rewrite (piSg sP0H) // -p_rank_gt0 prankP0.
+have pr_p: prime p by have:= piHp; rewrite mem_primes => /andP[].
+have piUq: q \in \pi(exponent U) by rewrite pi_of_exponent (piSg sQU).
+have [odd_p odd_q]: odd p /\ odd q.
+ rewrite !odd_2'nat !pnatE //.
+ by rewrite (pnatPpi _ piHp) ?(pnatPpi _ piQq) -?odd_2'nat ?mFT_odd.
+have pgt2 := odd_prime_gt2 odd_p pr_p.
+suffices [b dv_q_bp]: exists b : bool, q %| (b.*2 + p).-1.
+ rewrite -ltn_double (@leq_ltn_trans (p + b.*2).-1) //; last first.
+ by rewrite -!addnn -(subnKC pgt2) prednK // leq_add2l; case: (b).
+ rewrite -(subnKC pgt2) dvdn_leq // -mul2n Gauss_dvd ?coprime2n // -{1}subn1.
+ by rewrite dvdn2 odd_sub // subnKC // odd_add odd_p odd_double addnC.
+have [// | [cHH rankH] | [/(_ p piHp)Udvp1 _]] := LtypeI; last first.
+ exists false; apply: dvdn_trans Udvp1.
+ by have:= piUq; rewrite mem_primes => /and3P[].
+suffices: q %| p ^ 2 - 1 ^ 2.
+ rewrite subn_sqr addn1 subn1 Euclid_dvdM //.
+ by case/orP; [exists false | exists true].
+pose P := 'O_p(H); pose P1 := 'Ohm_1(P).
+have chP1H: P1 \char H := char_trans (Ohm_char 1 _) (pcore_char p H).
+have sylP: p.-Sylow(H) P := nilpotent_pcore_Hall p (Fcore_nil L).
+have [sPH pP _] := and3P sylP.
+have abelP1: p.-abelem P1 by rewrite Ohm1_abelem ?(abelianS sPH).
+have [pP1 _] := andP abelP1.
+have prankP1: 'r_p(P1) = 2.
+ apply/eqP; rewrite p_rank_Ohm1 eqn_leq -{1}rank_pgroup // -{1}rankH rankS //=.
+ by rewrite -prankP0 (p_rank_Sylow sylP) p_rankS.
+have ntP1: P1 != 1%g by rewrite -rank_gt0 (rank_pgroup pP1) prankP1.
+have [_ _ [U0 [sU0U expU0 frobHU0]]] := LtypeF.
+have nP1U0: U0 \subset 'N(P1).
+ by rewrite (char_norm_trans chP1H) ?(subset_trans sU0U).
+rewrite subn1 -prankP1 p_rank_abelem // -card_pgroup //.
+have frobP1U0 := Frobenius_subl ntP1 (char_sub chP1H) nP1U0 frobHU0.
+apply: dvdn_trans (Frobenius_dvd_ker1 frobP1U0).
+by have:= piUq; rewrite -expU0 pi_of_exponent mem_primes => /and3P[].
+Qed.
+
+Let Ltype1 : FTtype L == 1%N. Proof. exact: FT_Frobenius_type1 frobL. Qed.
+Let defAL : 'A(L) = H^#. Proof. exact: FTsupp_Frobenius frobL. Qed.
+Let sP0H : P0 \subset H. Proof. by rewrite /= -FTcore_type1. Qed.
+
+(* This is the first part of Peterfalvi (12.11). *)
+Let defM : K ><| (M :&: L) = M.
+Proof.
+have [ntx /(subsetP (Ohm_sub 1 _))P0x] := setD1P P0_1s_x.
+have Dx: x \in [set y in 'A0(L) | ~~ ('C[y] \subset L)].
+ by rewrite inE FTsupp0_type1 // defAL !inE ntx (subsetP sP0H).
+have [_ [_ /(_ x Dx)uCx] /(_ x Dx)[[defM _] _ _ _]] := FTsupport_facts maxL.
+rewrite /K /= setIC (eq_uniq_mmax uCx maxM) //= -cent_cycle.
+exact: subset_trans (cent_sub <[x]>) sNxM.
+Qed.
+
+(* This is the second part of Peterfalvi (12.11). *)
+Let sML_H : M :&: L \subset H.
+Proof.
+have [sP0M pP0 _] := and3P sylP0.
+rewrite (sub_normal_Hall (Fcore_Hall L)) ?subsetIr //.
+apply/pgroupP=> q pr_q /Cauchy[]// z /setIP[Mz Lz] oz; pose A := <[z]>%G.
+have z_gt1: (#[z] > 1)%N by rewrite oz prime_gt1.
+have sylP0_HM: p.-Sylow(H :&: M) P0.
+ by rewrite (pHall_subl _ _ sylP0) ?subsetIr // subsetI sP0H.
+have nP0A: A \subset 'N(P0).
+ have sylHp: p.-Sylow(H) 'O_p(H) := nilpotent_pcore_Hall p (Fcore_nil L).
+ have sP0Hp: P0 \subset 'O_p(H) by rewrite sub_Hall_pcore.
+ have <-: 'O_p(H) :&: M = P0.
+ rewrite [_ :&: _](sub_pHall sylP0_HM) ?setSI ?pcore_sub //.
+ by rewrite (pgroupS (subsetIl _ _)) ?pcore_pgroup.
+ by rewrite subsetI sP0Hp.
+ have chHpL: 'O_p(H) \char L := char_trans (pcore_char p H) (Fcore_char L).
+ by rewrite normsI ?(char_norm_trans chHpL) ?normsG // cycle_subG.
+apply: wlog_neg => piH'q.
+have coHQ: coprime #|H| #|A| by rewrite -orderE coprime_pi' // oz pnatE.
+have frobP0A: [Frobenius P0 <*> A = P0 ><| A].
+ have defHA: H ><| A = H <*> A.
+ by rewrite sdprodEY ?coprime_TIg // cycle_subG (subsetP (gFnorm _ _)).
+ have ltH_HA: H \proper H <*> A.
+ by rewrite /proper joing_subl -indexg_gt1 -(index_sdprod defHA).
+ have: [Frobenius H <*> A = H ><| A].
+ apply: set_Frobenius_compl defHA _.
+ by apply: Frobenius_kerS frobL; rewrite // join_subG gFsub cycle_subG.
+ by apply: Frobenius_subl => //; rewrite -rank_gt0 (rank_pgroup pP0) prankP0.
+have sP0A_M: P0 <*> A \subset M by rewrite join_subG sP0M cycle_subG.
+have nKP0a: P0 <*> A \subset 'N(K) := subset_trans sP0A_M (gFnorm _ _).
+have solK: solvable K := nilpotent_sol (Fcore_nil M).
+have [_ [/(compl_of_typeF defM) MtypeF _]] := FTtypeP 1 maxM Mtype1.
+have nreg_KA: 'C_K(A) != 1%g.
+ have [Kq | K'q] := boolP (q \in \pi(K)).
+ apply/trivgPn; exists z; rewrite -?order_gt1 //= cent_cycle inE cent1id.
+ by rewrite andbT (mem_normal_Hall (Fcore_Hall M)) // /p_elt oz pnatE.
+ have [defP0A ntP0 _ _ _] := Frobenius_context frobP0A.
+ have coK_P0A: coprime #|K| #|P0 <*> A|.
+ rewrite -(sdprod_card defP0A) coprime_mulr (p'nat_coprime p'K) //=.
+ by rewrite -orderE coprime_pi' // oz pnatE.
+ have: ~~ (P0 \subset 'C(K)); last apply: contraNneq.
+ have [[ntK _ _] _ [U0 [sU0ML expU0 frobKU0]]] := MtypeF.
+ have [P1 /pnElemP[sP1U0 abelP1 dimP1]] := p_rank_witness p U0.
+ have ntP1: P1 :!=: 1%g.
+ rewrite -rank_gt0 (rank_abelem abelP1) dimP1 p_rank_gt0 -pi_of_exponent.
+ rewrite expU0 pi_of_exponent (piSg (setIS M (Fcore_sub L))) //=.
+ by rewrite setIC -p_rank_gt0 -(p_rank_Sylow sylP0_HM) prankP0.
+ have frobKP1: [Frobenius K <*> P1 = K ><| P1].
+ exact: Frobenius_subr ntP1 sP1U0 frobKU0.
+ have sP1M: P1 \subset M.
+ by rewrite (subset_trans (subset_trans sP1U0 sU0ML)) ?subsetIl.
+ have [y My sP1yP0] := Sylow_Jsub sylP0 sP1M (abelem_pgroup abelP1).
+ apply: contra ntK => cP0K; rewrite -(Frobenius_trivg_cent frobKP1).
+ rewrite (setIidPl _) // -(conjSg _ _ y) (normsP _ y My) ?gFnorm //.
+ by rewrite -centJ centsC (subset_trans sP1yP0).
+ by have [] := Frobenius_Wielandt_fixpoint frobP0A nKP0a coK_P0A solK.
+have [_ [U1 [_ abU1 sCK_U1]] _] := MtypeF.
+have [ntx /(subsetP (Ohm_sub 1 _))P0x] := setD1P P0_1s_x.
+have cAx: A \subset 'C[x].
+ rewrite -cent_set1 (sub_abelian_cent2 abU1) //.
+ have [y /setIP[Ky cAy] nty] := trivgPn _ nreg_KA.
+ apply: subset_trans (sCK_U1 y _); last by rewrite !inE nty.
+ by rewrite subsetI sub_cent1 cAy cycle_subG !inE Mz Lz.
+ have [y /setIP[Ky cxy] notK'y] := subsetPn not_sCxK'.
+ apply: subset_trans (sCK_U1 y _); last by rewrite !inE (group1_contra notK'y).
+ rewrite sub1set inE cent1C cxy (subsetP _ x P0x) //.
+ by rewrite subsetI sP0M (subset_trans sP0H) ?gFsub.
+have [_ _ _ regHL] := Frobenius_kerP frobL.
+rewrite (piSg (regHL x _)) //; first by rewrite !inE ntx (subsetP sP0H).
+by rewrite mem_primes pr_q cardG_gt0 -oz cardSg // subsetI cycle_subG Lz.
+Qed.
+
+Let E := sval (sigW (existsP frobL)).
+Let e := #|E|.
+
+Let defL : H ><| E = L.
+Proof. by rewrite /E; case: (sigW _) => E0 /=/Frobenius_context[]. Qed.
+
+Let Ecyclic_le_p : cyclic E /\ (e %| p.-1) || (e %| p.+1).
+Proof.
+pose P := 'O_p(H)%G; pose T := 'Ohm_1('Z(P))%G.
+have sylP: p.-Sylow(H) P := nilpotent_pcore_Hall p (Fcore_nil L).
+have [[sPH pP _] [sP0M pP0 _]] := (and3P sylP, and3P sylP0).
+have sP0P: P0 \subset P by rewrite (sub_normal_Hall sylP) ?pcore_normal.
+have defP0: P :&: M = P0.
+ rewrite [P :&: M](sub_pHall sylP0 (pgroupS _ pP)) ?subsetIl ?subsetIr //.
+ by rewrite subsetI sP0P.
+have [ntx P01x] := setD1P P0_1s_x; have P0x := subsetP (Ohm_sub 1 P0) x P01x.
+have sZP0: 'Z(P) \subset P0.
+ apply: subset_trans (_ : 'C_P[x] \subset P0).
+ by rewrite -cent_set1 setIS ?centS // sub1set (subsetP sP0P).
+ by rewrite -defP0 setIS // (subset_trans _ sNxM) // cents_norm ?cent_cycle.
+have ntT: T :!=: 1%g.
+ rewrite Ohm1_eq1 center_nil_eq1 ?(pgroup_nil pP) // (subG1_contra sP0P) //.
+ by apply/trivgPn; exists x.
+have [_ sEL _ nHE tiHE] := sdprod_context defL.
+have charTP: T \char P := char_trans (Ohm_char 1 _) (center_char P).
+have{ntT} [V minV sVT]: {V : {group gT} | minnormal V E & V \subset T}.
+ apply: mingroup_exists; rewrite ntT (char_norm_trans charTP) //.
+ exact: char_norm_trans (pcore_char p H) nHE.
+have abelT: p.-abelem T by rewrite Ohm1_abelem ?center_abelian ?(pgroupS sZP0).
+have sTP := subset_trans (Ohm_sub 1 _) sZP0.
+have rankT: ('r_p(T) <= 2)%N by rewrite -prankP0 p_rankS.
+have [abelV /andP[ntV nVE]] := (abelemS sVT abelT, mingroupp minV).
+have pV := abelem_pgroup abelV; have [pr_p _ [n oV]] := pgroup_pdiv pV ntV.
+have frobHE: [Frobenius L = H ><| E] by rewrite /E; case: (sigW _).
+have: ('r_p(V) <= 2)%N by rewrite (leq_trans (p_rankS p sVT)).
+rewrite (p_rank_abelem abelV) // oV pfactorK // ltnS leq_eqVlt ltnS leqn0 orbC.
+have sVH := subset_trans sVT (subset_trans (char_sub charTP) sPH).
+have regVE: 'C_E(V) = 1%g.
+ exact: cent_semiregular (Frobenius_reg_compl frobHE) sVH ntV.
+case/pred2P=> dimV; rewrite {n}dimV in oV.
+ pose f := [morphism of restrm nVE (conj_aut V)].
+ have injf: 'injm f by rewrite ker_restrm ker_conj_aut regVE.
+ rewrite /e -(injm_cyclic injf) // -(card_injm injf) //.
+ have AutE: f @* E \subset Aut V by rewrite im_restrm Aut_conj_aut.
+ rewrite (cyclicS AutE) ?Aut_prime_cyclic ?oV // (dvdn_trans (cardSg AutE)) //.
+ by rewrite card_Aut_cyclic ?prime_cyclic ?oV // totient_pfactor ?muln1.
+have defV: V :=: 'Ohm_1(P0).
+ apply/eqP; rewrite eqEcard (subset_trans sVT) ?OhmS //= oV -prankP0.
+ by rewrite p_rank_abelian // -card_pgroup ?(pgroupS (Ohm_sub 1 _)).
+pose rE := abelem_repr abelV ntV nVE.
+have ffulE: mx_faithful rE by apply: abelem_mx_faithful.
+have p'E: [char 'F_p]^'.-group E.
+ rewrite (eq_p'group _ (charf_eq (char_Fp pr_p))) (coprime_p'group _ pV) //.
+ by rewrite coprime_sym (coprimeSg sVH) ?(Frobenius_coprime frobHE).
+have dimV: 'dim V = 2 by rewrite (dim_abelemE abelV) // oV pfactorK.
+have cEE: abelian E.
+ by rewrite dimV in (rE) ffulE; apply: charf'_GL2_abelian (mFT_odd E) ffulE _.
+have Enonscalar y: y \in E -> y != 1%g -> ~~ is_scalar_mx (rE y).
+ move=> Ey; apply: contra => /is_scalar_mxP[a rEy]; simpl in a.
+ have nXy: y \in 'N(<[x]>).
+ rewrite !inE -cycleJ cycle_subG; apply/cycleP; exists a.
+ have [Vx nVy]: x \in V /\ y \in 'N(V) by rewrite (subsetP nVE) ?defV.
+ apply: (@abelem_rV_inj p _ V); rewrite ?groupX ?memJ_norm ?morphX //=.
+ by rewrite zmodXgE -scaler_nat natr_Zp -mul_mx_scalar -rEy -abelem_rV_J.
+ rewrite -in_set1 -set1gE -tiHE inE (subsetP sML_H) //.
+ by rewrite inE (subsetP sEL) // (subsetP sNxM).
+have /trivgPn[y nty Ey]: E != 1%G by have [] := Frobenius_context frobHE.
+have cErEy: centgmx rE (rE y).
+ by apply/centgmxP=> z Ez; rewrite -!repr_mxM // (centsP cEE).
+have irrE: mx_irreducible rE by apply/abelem_mx_irrP.
+have charFp2: p \in [char MatrixGenField.gen_finFieldType irrE cErEy].
+ apply: (rmorph_char (MatrixGenField.gen_rmorphism irrE cErEy)).
+ exact: char_Fp.
+pose Fp2 := primeChar_finFieldType charFp2.
+pose n1 := MatrixGenField.gen_dim (rE y).
+pose rEp2 : mx_representation Fp2 E n1 := MatrixGenField.gen_repr irrE cErEy.
+have n1_gt0: (0 < n1)%N := MatrixGenField.gen_dim_gt0 irrE cErEy.
+have n1_eq1: n1 = 1%N.
+ pose d := degree_mxminpoly (rE y).
+ have dgt0: (0 < d)%N := mxminpoly_nonconstant _.
+ apply/eqP; rewrite eqn_leq n1_gt0 andbT -(leq_pmul2r dgt0).
+ rewrite (MatrixGenField.gen_dim_factor irrE cErEy) mul1n dimV.
+ by rewrite ltnNge mxminpoly_linear_is_scalar Enonscalar.
+have oFp2: #|Fp2| = (p ^ 2)%N.
+ rewrite card_sub card_matrix card_Fp // -{1}n1_eq1.
+ by rewrite (MatrixGenField.gen_dim_factor irrE cErEy) dimV.
+have [f rfK fK]: bijective (@scalar_mx Fp2 n1).
+ rewrite n1_eq1.
+ by exists (fun A : 'M_1 => A 0 0) => ?; rewrite ?mxE -?mx11_scalar.
+pose g z : {unit Fp2} := insubd (1%g : {unit Fp2}) (f (rEp2 z)).
+have val_g z : z \in E -> (val (g z))%:M = rEp2 z.
+ move=> Ez; rewrite insubdK ?fK //; have:= repr_mx_unit rEp2 Ez.
+ by rewrite -{1}[rEp2 z]fK unitmxE det_scalar !unitfE expf_eq0 n1_gt0.
+have ffulEp2: mx_faithful rEp2 by rewrite MatrixGenField.gen_mx_faithful.
+have gM: {in E &, {morph g: z1 z2 / z1 * z2}}%g.
+ move=> z1 z2 Ez1 Ez2 /=; apply/val_inj/(can_inj rfK).
+ rewrite {1}(val_g _ (groupM Ez1 Ez2)) scalar_mxM.
+ by rewrite {1}(val_g _ Ez1) (val_g _ Ez2) repr_mxM.
+have inj_g: 'injm (Morphism gM).
+ apply/injmP=> z1 z2 Ez1 Ez2 /(congr1 (@scalar_mx _ n1 \o val)).
+ by rewrite /= {1}(val_g _ Ez1) (val_g _ Ez2); apply: mx_faithful_inj.
+split; first by rewrite -(injm_cyclic inj_g) ?field_unit_group_cyclic.
+have: e %| #|[set: {unit Fp2}]|.
+ by rewrite /e -(card_injm inj_g) ?cardSg ?subsetT.
+rewrite card_finField_unit oFp2 -!subn1 (subn_sqr p 1) addn1.
+rewrite orbC Gauss_dvdr; first by move->.
+rewrite coprime_sym coprime_has_primes ?subn_gt0 ?prime_gt1 ?cardG_gt0 //.
+apply/hasPn=> r; rewrite /= !mem_primes subn_gt0 prime_gt1 ?cardG_gt0 //=.
+case/andP=> pr_r /Cauchy[//|z Ez oz]; rewrite pr_r /= subn1.
+apply: contra (Enonscalar z Ez _); last by rewrite -order_gt1 oz prime_gt1.
+rewrite -oz -(order_injm inj_g) // order_dvdn -val_eqE => /eqP gz_p1_eq1.
+have /vlineP[a Dgz]: val (g z) \in 1%VS.
+ rewrite Fermat's_little_theorem dimv1 card_Fp //=.
+ by rewrite -[(p ^ 1)%N]prednK ?prime_gt0 // exprS -val_unitX gz_p1_eq1 mulr1.
+apply/is_scalar_mxP; exists a; apply/row_matrixP=> i.
+apply: (can_inj ((MatrixGenField.in_genK irrE cErEy) _)).
+rewrite !rowE mul_mx_scalar MatrixGenField.in_genZ MatrixGenField.in_genJ //.
+rewrite -val_g // Dgz mul_mx_scalar; congr (_ *: _).
+rewrite -(natr_Zp a) scaler_nat.
+by rewrite -(rmorph_nat (MatrixGenField.gen_rmorphism irrE cErEy)).
+Qed.
+
+Let calS := seqIndD H L H 1.
+Notation tauL := (FT_Dade maxL).
+Notation tauL_H := (FT_DadeF maxL).
+Notation rhoL := (invDade (FT_DadeF_hyp maxL)).
+
+Section Twelve_13_to_16.
+
+Variables (tau1 : {additive 'CF(L) -> 'CF(G)}) (chi : 'CF(L)).
+Hypothesis cohS : coherent_with calS L^# tauL tau1.
+Hypotheses (Schi : chi \in calS) (chi1 : chi 1%g = e%:R).
+Let psi := tau1 chi.
+
+Let cohS_H : coherent_with calS L^# tauL_H tau1.
+Proof.
+have [? Dtau] := cohS; split=> // xi Sxi; have /zcharD1_seqInd_on Hxi := Sxi.
+by rewrite Dtau // FT_DadeF_E ?FT_DadeE ?(cfun_onS (Fcore_sub_FTsupp _)) ?Hxi.
+Qed.
+
+(* This is Peterfalvi (12.14). *)
+Let rhoL_psi : {in K, forall g, psi (x * g)%g = chi x} /\ rhoL psi x = chi x.
+Proof.
+have not_LGM: gval M \notin L :^: G.
+ apply: contraL p'K => /= /imsetP[z _ ->]; rewrite FcoreJ pgroupJ.
+ by rewrite p'groupEpi (piSg sP0H) // -p_rank_gt0 prankP0.
+pose rmR := sval (Rgen maxL Ltype1).
+have Zpsi: psi \in 'Z[rmR chi].
+ case: (Rgen _ _) @rmR => /= rmR []; rewrite -/calS => scohS _ _.
+ have sSS: cfConjC_subset calS calS by apply: seqInd_conjC_subset1.
+ have [B /mem_subseq sBR Dpsi] := mem_coherent_sum_subseq scohS sSS cohS Schi.
+ by rewrite [psi]Dpsi big_seq rpred_sum // => xi /sBR/mem_zchar->.
+have [ntx /(subsetP (Ohm_sub 1 P0))P0x] := setD1P P0_1s_x.
+have Mx: x \in M by rewrite (subsetP sNxM) // -cycle_subG normG.
+have psi_xK: {in K, forall g, psi (x * g)%g = psi x}.
+ move=> g Kg; have{Kg}: (x * g \in x *: K)%g by rewrite mem_lcoset mulKg.
+ apply: FTtype1_ortho_constant => [phi calMphi|].
+ apply/orthoPl=> nu /memv_span; apply: {nu}span_orthogonal (zchar_span Zpsi).
+ exact: FTtype1_seqInd_ortho.
+ rewrite inE -/K (contra _ ntx) // => Kx.
+ rewrite -(consttC p x) !(constt1P _) ?mulg1 ?(mem_p_elt p'K) //.
+ by rewrite p_eltNK (mem_p_elt (pHall_pgroup sylP0)).
+have H1x: x \in H^# by rewrite !inE ntx (subsetP sP0H).
+have rhoL_psi_x: rhoL psi x = psi x.
+ rewrite cfunElock mulrb def_FTsignalizerF H1x //=.
+ apply: canLR (mulKf (neq0CG _)) _; rewrite mulr_natl -sumr_const /=.
+ apply: eq_bigr => g; rewrite /'R_L (negPf not_sCxL) /= setIC => /setIP[cxz].
+ have Dx: x \in [set y in 'A0(L) | ~~ ('C[y] \subset L)].
+ by rewrite inE (subsetP (Fcore_sub_FTsupp0 _)).
+ have [_ [_ /(_ x Dx)defNx] _] := FTsupport_facts maxL.
+ rewrite (cent1P cxz) -(eq_uniq_mmax defNx maxM) => [/psi_xK//|].
+ by rewrite /= -cent_cycle (subset_trans (cent_sub _)).
+suffices <-: rhoL psi x = chi x by split=> // g /psi_xK->.
+have irrS: {subset calS <= irr L} by have [] := FT_Frobenius_coherence maxL.
+have irr_chi := irrS _ Schi.
+have Sgt1: (1 < size calS)%N by apply: seqInd_nontrivial Schi; rewrite ?mFT_odd.
+have De: #|L : H| = e by rewrite -(index_sdprod defL).
+have [] := Dade_Ind1_sub_lin cohS_H Sgt1 irr_chi Schi; rewrite ?De //.
+rewrite -/tauL_H -/calS -/psi /=; set alpha := 'Ind 1 - chi.
+case=> o_tau_1 tau_alpha_1 _ [Gamma [o_tau1_Ga _ [a Za tau_alpha] _] _].
+have [[Itau1 _] Dtau1] := cohS_H.
+have o1calS: orthonormal calS.
+ by rewrite (sub_orthonormal irrS) ?seqInd_uniq ?irr_orthonormal.
+have norm_alpha: '[tauL_H alpha] = e%:R + 1.
+ rewrite Dade_isometry ?(cfInd1_sub_lin_on _ Schi) ?De //.
+ rewrite cfnormBd; last by rewrite cfdotC (seqInd_ortho_Ind1 _ _ Schi) ?conjC0.
+ by rewrite cfnorm_Ind_cfun1 // De irrWnorm.
+pose h := #|H|; have ub_a: a ^+ 2 * ((h%:R - 1) / e%:R) - 2%:R * a <= e%:R - 1.
+ rewrite -[h%:R - 1](mulKf (neq0CiG L H)) -sum_seqIndC1_square // De -/calS.
+ rewrite -[lhs in lhs - 1](addrK 1) -norm_alpha -[tauL_H _](subrK 1).
+ rewrite cfnormDd; last by rewrite cfdotBl tau_alpha_1 cfnorm1 subrr.
+ rewrite cfnorm1 addrK [in '[_]]addrC {}tau_alpha -!addrA addKr addrCA addrA.
+ rewrite ler_subr_addr cfnormDd ?ler_paddr ?cfnorm_ge0 //; last first.
+ rewrite cfdotBl cfdotZl cfdot_suml (orthoPr o_tau1_Ga) ?map_f // subr0.
+ rewrite big1_seq ?mulr0 // => xi Sxi; rewrite cfdotZl.
+ by rewrite (orthoPr o_tau1_Ga) ?map_f ?mulr0.
+ rewrite cfnormB cfnormZ Cint_normK // cfdotZl cfproj_sum_orthonormal //.
+ rewrite cfnorm_sum_orthonormal // Itau1 ?mem_zchar // irrWnorm ?irrS // divr1.
+ rewrite chi1 divff ?neq0CG // mulr1 conj_Cint // addrAC mulr_natl.
+ rewrite !ler_add2r !(mulr_suml, mulr_sumr) !big_seq ler_sum // => xi Sxi.
+ rewrite irrWnorm ?irrS // !divr1 (mulrAC _^-1) -expr2 -!exprMn (mulrC _^-1).
+ by rewrite normf_div normr_nat norm_Cnat // (Cnat_seqInd1 Sxi).
+have [pr_p p_dv_M]: prime p /\ p %| #|M|.
+ have: p \in \pi(M) by rewrite -p_rank_gt0 ltnW.
+ by rewrite mem_primes => /and3P[].
+have odd_p: odd p by rewrite (dvdn_odd p_dv_M) ?mFT_odd.
+have pgt2: (2 < p)%N := odd_prime_gt2 odd_p pr_p.
+have ub_e: e%:R <= (p%:R + 1) / 2%:R :> algC.
+ rewrite ler_pdivl_mulr ?ltr0n // -natrM -mulrSr leC_nat muln2.
+ have [b e_dv_pb]: exists b : bool, e %| (b.*2 + p).-1.
+ by have [_ /orP[]] := Ecyclic_le_p; [exists false | exists true].
+ rewrite -ltnS (@leq_trans (b.*2 + p)) //; last first.
+ by rewrite (leq_add2r p _ 2) (leq_double _ 1) leq_b1.
+ rewrite dvdn_double_ltn ?mFT_odd //; first by rewrite odd_add odd_double.
+ by rewrite -(subnKC pgt2) !addnS.
+have lb_h: p%:R ^+ 2 <= h%:R :> algC.
+ rewrite -natrX leC_nat dvdn_leq ?pfactor_dvdn ?cardG_gt0 //.
+ by rewrite -prankP0 (leq_trans (p_rankS p sP0H)) ?p_rank_le_logn.
+have{ub_a ub_e} ub_a: p.-1.*2%:R * a ^+ 2 - 2%:R * a <= p.-1%:R / 2%:R :> algC.
+ apply: ler_trans (ler_trans ub_a _); last first.
+ rewrite -subn1 -subSS natrB ?ltnS ?prime_gt0 // mulrSr mulrBl.
+ by rewrite divff ?pnatr_eq0 ?ler_add2r.
+ rewrite ler_add2r mulrC -Cint_normK // -!mulrA !ler_wpmul2l ?normr_ge0 //.
+ rewrite ler_pdivl_mulr ?gt0CG // ler_subr_addr (ler_trans _ lb_h) //.
+ rewrite -muln2 natrM -mulrA -ler_subr_addr subr_sqr_1.
+ rewrite -(natrB _ (prime_gt0 pr_p)) subn1 ler_wpmul2l ?ler0n //.
+ by rewrite mulrC -ler_pdivl_mulr ?ltr0n.
+have a0: a = 0.
+ apply: contraTeq ub_a => nz_a; rewrite ltr_geF // ltr_pdivr_mulr ?ltr0n //.
+ rewrite mulrC -{1}mulr_natl -muln2 natrM -mulrA mulrBr mulrCA ltr_subr_addl.
+ rewrite -ltr_subr_addr -mulrBr mulr_natl mulrA -expr2 -exprMn.
+ apply: ltr_le_trans (_ : 2%:R * ((a *+ 2) ^+ 2 - 1) <= _); last first.
+ rewrite (mulr_natl a 2) ler_wpmul2r // ?subr_ge0.
+ by rewrite sqr_Cint_ge1 ?rpredMn // mulrn_eq0.
+ by rewrite leC_nat -subn1 ltn_subRL.
+ rewrite -(@ltr_pmul2l _ 2%:R) ?ltr0n // !mulrA -expr2 mulrBr -exprMn mulr1.
+ rewrite -natrX 2!mulrnAr -[in rhs in _ < rhs]mulrnAl -mulrnA.
+ rewrite ltr_subr_addl -ltr_subr_addr -(ltr_add2r 1) -mulrSr -sqrrB1.
+ rewrite -Cint_normK ?rpredB ?rpredM ?rpred_nat ?rpred1 //.
+ rewrite (@ltr_le_trans _ (3 ^ 2)%:R) ?ltC_nat // natrX.
+ rewrite ler_sqr ?qualifE ?ler0n ?normr_ge0 //.
+ rewrite (ler_trans _ (ler_sub_dist _ _)) // normr1 normrM normr_nat.
+ by rewrite ler_subr_addl -mulrS mulr_natl ler_pmuln2r ?norm_Cint_ge1.
+pose chi0 := 'Ind[L, H] 1.
+have defS1: perm_eq (seqIndT H L) (chi0 :: calS).
+ by rewrite [calS]seqIndC1_rem // perm_to_rem ?seqIndT_Ind1.
+have [c _ -> // _] := invDade_seqInd_sum (FT_DadeF_hyp maxL) psi defS1.
+have psi_alpha_1: '[psi, tauL_H alpha] = -1.
+ rewrite tau_alpha a0 scale0r addr0 addrC addrA cfdotBr cfdotDr.
+ rewrite (orthoPr o_tau_1) ?(orthoPr o_tau1_Ga) ?map_f // !add0r.
+ by rewrite Itau1 ?mem_zchar ?map_f // irrWnorm ?irrS.
+rewrite (bigD1_seq chi) ?seqInd_uniq //= big1_seq => [|xi /andP[chi'xi Sxi]].
+ rewrite addr0 -cfdotC chi1 cfInd1 ?gFsub // cfun11 mulr1 De divff ?neq0CG //.
+ rewrite scale1r -opprB linearN cfdotNr psi_alpha_1 opprK.
+ by rewrite irrWnorm ?irrS // divr1 mul1r.
+rewrite -cfdotC cfInd1 ?gFsub // cfun11 mulr1.
+rewrite /chi0 -(canLR (subrK _) (erefl alpha)) scalerDr opprD addrCA -scaleNr.
+rewrite linearD linearZ /= cfdotDr cfdotZr psi_alpha_1 mulrN1 rmorphN opprK.
+rewrite -/tauL_H -Dtau1 ?zcharD1_seqInd ?(seqInd_sub_lin_vchar _ Schi) ?De //.
+have [_ ooS] := orthonormalP o1calS.
+rewrite raddfB cfdotBr Itau1 ?mem_zchar // ooS // mulrb ifN_eqC // add0r.
+rewrite -De raddfZ_Cnat ?(dvd_index_seqInd1 _ Sxi) // De cfdotZr.
+by rewrite Itau1 ?mem_zchar ?ooS // eqxx mulr1 subrr !mul0r.
+Qed.
+
+Let rhoM := invDade (FT_DadeF_hyp maxM).
+
+Let rhoM_psi :
+ [/\ {in K^#, rhoM psi =1 psi},
+ {in K :\: K' &, forall g1 g2, psi g1 = psi g2}
+ & {in K :\: K', forall g, psi g \in Cint}].
+Proof.
+have pr_p: prime p.
+ by have:= ltnW prankM; rewrite p_rank_gt0 mem_primes => /andP[].
+have [sP0M pP0 _] := and3P sylP0; have abelP01 := Ohm1_abelem pP0 abP0.
+have not_frobM: ~~ [Frobenius M with kernel K].
+ apply: contraL prankM => /(set_Frobenius_compl defM)frobM.
+ rewrite -leqNgt -(p_rank_Sylow sylP0) -p_rank_Ohm1 p_rank_abelem //.
+ rewrite -abelem_cyclic // (cyclicS (Ohm_sub _ _)) //.
+ have sP0ML: P0 \subset M :&: L.
+ by rewrite subsetI sP0M (subset_trans sP0H) ?gFsub.
+ rewrite nil_Zgroup_cyclic ?(pgroup_nil pP0) // (ZgroupS sP0ML) //.
+ have [U [MtypeF _]] := FTtypeP 1 maxM Mtype1.
+ by have{MtypeF} /typeF_context[_ <- _] := compl_of_typeF defM MtypeF.
+pose rmR := sval (Rgen maxL Ltype1).
+have Zpsi: psi \in 'Z[rmR chi].
+ case: (Rgen _ _) @rmR => /= rmR []; rewrite -/calS => scohS _ _.
+ have sSS: cfConjC_subset calS calS by apply: seqInd_conjC_subset1.
+ have [B /mem_subseq sBR Dpsi] := mem_coherent_sum_subseq scohS sSS cohS Schi.
+ by rewrite [psi]Dpsi big_seq rpred_sum // => xi /sBR/mem_zchar->.
+have part1: {in K^#, rhoM psi =1 psi}.
+ move=> g K1g; rewrite /= cfunElock mulrb def_FTsignalizerF K1g //= /'R_M.
+ have [_ | sCg'M] := ifPn; first by rewrite cards1 big_set1 invr1 mul1r mul1g.
+ have Dg: g \in [set z in 'A0(M) | ~~ ('C[z] \subset M)].
+ by rewrite inE (subsetP (Fcore_sub_FTsupp0 _)).
+ have [_ [_ /(_ g Dg)maxN] /(_ g Dg)[_ _ ANg Ntype12]] := FTsupport_facts maxM.
+ have{maxN} [maxN sCgN] := mem_uniq_mmax maxN.
+ have{Ntype12} Ntype1: FTtype 'N[g] == 1%N.
+ have [] := Ntype12; rewrite -(mem_iota 1 2) !inE => /orP[// | Ntype2] frobM.
+ by have /negP[] := not_frobM; apply/frobM/Ntype2.
+ have not_frobN: ~~ [Frobenius 'N[g] with kernel 'N[g]`_\F].
+ apply/Frobenius_kerP=> [[_ _ _ regFN]].
+ have [/bigcupP[y]] := setDP ANg; rewrite FTsupp1_type1 Ntype1 //.
+ by move=> /regFN sCyF /setD1P[ntg cNy_g]; rewrite 2!inE ntg (subsetP sCyF).
+ have LG'N: gval 'N[g] \notin L :^: G.
+ by apply: contra not_frobN => /imsetP[y _ ->]; rewrite FcoreJ FrobeniusJker.
+ suff /(eq_bigr _)->: {in 'C_('N[g]`_\F)[g], forall z, psi (z * g)%g = psi g}.
+ by rewrite sumr_const -[psi g *+ _]mulr_natl mulKf ?neq0CG.
+ move=> z /setIP[Fz /cent1P cgz].
+ have{Fz cgz}: (z * g \in g *: 'N[g]`_\F)%g by rewrite cgz mem_lcoset mulKg.
+ apply: FTtype1_ortho_constant => [phi calMphi|].
+ apply/orthoPl=> nu /memv_span; apply: span_orthogonal (zchar_span Zpsi).
+ exact: FTtype1_seqInd_ortho.
+ have [/(subsetP (FTsupp_sub _))/setD1P[ntg Ng]] := setDP ANg.
+ by rewrite FTsupp1_type1 //= !inE ntg Ng andbT.
+have part2: {in K :\: K' &, forall g1 g2, psi g1 = psi g2}.
+ have /subsetP sK1_K: K :\: K' \subset K^# by rewrite setDS ?sub1G.
+ have LG'M: gval M \notin L :^: G.
+ apply: contra not_frobM => /imsetP[y _ /= ->].
+ by rewrite FcoreJ FrobeniusJker.
+ move=> g1 g2 Kg1 Kg2; rewrite /= -!part1 ?sK1_K //.
+ apply: FtypeI_invDade_ortho_constant => // phi calMphi.
+ apply/orthoPl=> nu /memv_span; apply: span_orthogonal (zchar_span Zpsi).
+ exact: FTtype1_seqInd_ortho.
+split=> // g KK'g; pose nKK' : algC := #|K :\: K'|%:R.
+pose nK : algC := #|K|%:R; pose nK' : algC := #|K'|%:R.
+have nzKK': nKK' != 0 by rewrite pnatr_eq0 cards_eq0; apply/set0Pn; exists g.
+have Dpsi_g: nK * '['Res[K] psi, 1] = nK' * '['Res[K'] psi, 1] + nKK' * psi g.
+ rewrite !mulVKf ?neq0CG // (big_setID K') (setIidPr (gFsub _ _)) /=.
+ rewrite mulr_natl -sumr_const; congr (_ + _); apply: eq_bigr => z K'z.
+ by rewrite !cfun1E !cfResE ?subsetT ?(subsetP (der_sub 1 K)) ?K'z.
+ have [Kz _] := setDP K'z; rewrite cfun1E Kz conjC1 mulr1 cfResE ?subsetT //.
+ exact: part2.
+have{Zpsi} Zpsi: psi \in 'Z[irr G] by have [[_ ->//]] := cohS; apply: mem_zchar.
+have Qpsi1 R: '['Res[R] psi, 1] \in Crat.
+ by rewrite rpred_Cint ?Cint_cfdot_vchar ?rpred1 ?cfRes_vchar.
+apply: Cint_rat_Aint (Aint_vchar g Zpsi).
+rewrite -[psi g](mulKf nzKK') -(canLR (addKr _) Dpsi_g) addrC mulrC.
+by rewrite rpred_div ?rpredB 1?rpredM ?rpred_nat ?Qpsi1.
+Qed.
+
+(* This is the main part of Peterfalvi (12.16). *)
+Lemma FTtype1_nonFrobenius_witness_contradiction : False.
+Proof.
+have pr_p: prime p.
+ by have:= ltnW prankM; rewrite p_rank_gt0 mem_primes => /andP[].
+have [sP0M pP0 _] := and3P sylP0; have abelP01 := Ohm1_abelem pP0 abP0.
+have [ntx P01x] := setD1P P0_1s_x.
+have ox: #[x] = p := abelem_order_p abelP01 P01x ntx.
+have odd_p: odd p by rewrite -ox mFT_odd.
+have pgt2 := odd_prime_gt2 odd_p pr_p.
+have Zpsi: psi \in 'Z[irr G] by have [[_ ->//]] := cohS; apply: mem_zchar.
+have lb_psiM: '[rhoM psi] >= #|K :\: K'|%:R / #|M|%:R * e.-1%:R ^+ 2.
+ have [g /setIP[Kg cxg] notK'g] := subsetPn not_sCxK'.
+ have KK'g: g \in K :\: K' by rewrite !inE notK'g.
+ have [rhoMid /(_ _ g _ KK'g)psiKK'_id /(_ g KK'g)Zpsig] := rhoM_psi.
+ rewrite -mulrA mulrCA ler_pmul2l ?invr_gt0 ?gt0CG // mulr_natl.
+ rewrite (big_setID (K :\: K')) (setIidPr _) ?subDset ?subsetU ?gFsub ?orbT //.
+ rewrite ler_paddr ?sumr_ge0 // => [z _|]; first exact: mul_conjC_ge0.
+ rewrite -sumr_const ler_sum // => z KK'z.
+ rewrite {}rhoMid ?(subsetP _ z KK'z) ?setDS ?sub1G // {}psiKK'_id {z KK'z}//.
+ rewrite -normCK ler_sqr ?qualifE ?ler0n ?normr_ge0 //.
+ have [eps prim_eps] := C_prim_root_exists (prime_gt0 pr_p).
+ have psi_xg: (psi (x * g)%g == e%:R %[mod 1 - eps])%A.
+ have [-> // _] := rhoL_psi; rewrite -[x]mulg1 -chi1.
+ rewrite (vchar_ker_mod_prim prim_eps) ?group1 ?(seqInd_vcharW Schi) //.
+ rewrite (subsetP _ _ P01x) // (subset_trans (Ohm_sub 1 _)) //.
+ by rewrite (subset_trans sP0H) ?gFsub.
+ have{psi_xg} /dvdCP[a Za /(canRL (subrK _))->]: (p %| psi g - e%:R)%C.
+ rewrite (int_eqAmod_prime_prim prim_eps) ?rpredB ?rpred_nat // eqAmod0.
+ apply: eqAmod_trans psi_xg; rewrite eqAmod_sym.
+ by rewrite (vchar_ker_mod_prim prim_eps) ?in_setT.
+ have [-> | nz_a] := eqVneq a 0.
+ by rewrite mul0r add0r normr_nat leC_nat leq_pred.
+ rewrite -[e%:R]opprK (ler_trans _ (ler_sub_dist _ _)) // normrN normrM.
+ rewrite ler_subr_addl !normr_nat -natrD.
+ apply: ler_trans (_ : 1 * p%:R <= _); last first.
+ by rewrite ler_wpmul2r ?ler0n ?norm_Cint_ge1.
+ rewrite mul1r leC_nat -subn1 addnBA ?cardG_gt0 // leq_subLR addnn -ltnS.
+ have [b e_dv_pb]: exists b : bool, e %| (b.*2 + p).-1.
+ by have [_ /orP[]] := Ecyclic_le_p; [exists false | exists true].
+ apply: (@leq_trans (b.*2 + p)); last first.
+ by rewrite (leq_add2r p _ 2) (leq_double b 1) leq_b1.
+ rewrite dvdn_double_ltn ?odd_add ?mFT_odd ?odd_double //.
+ by rewrite addnC -(subnKC pgt2).
+have irrS: {subset calS <= irr L} by have [] := FT_Frobenius_coherence maxL.
+have lb_psiL: '[rhoL psi] >= 1 - e%:R / #|H|%:R.
+ have irr_chi := irrS _ Schi.
+ have Sgt1: (1 < size calS)%N by apply: seqInd_nontrivial (mFT_odd _) _ _ Schi.
+ have De: #|L : H| = e by rewrite -(index_sdprod defL).
+ have [|_] := Dade_Ind1_sub_lin cohS_H Sgt1 irr_chi Schi; rewrite De //=.
+ by rewrite -De odd_Frobenius_index_ler ?mFT_odd // => -[_ _ []//].
+have tiA1_LM: [disjoint 'A1~(L) & 'A1~(M)].
+ apply: FT_Dade1_support_disjoint => //.
+ apply: contraL p'K => /= /imsetP[z _ ->]; rewrite FcoreJ pgroupJ.
+ by rewrite p'groupEpi (piSg sP0H) // -p_rank_gt0 prankP0.
+have{tiA1_LM} ub_rhoML: '[rhoM psi] + '[rhoL psi] < 1.
+ have [[Itau1 Ztau1] _] := cohS.
+ have n1psi: '[psi] = 1 by rewrite Itau1 ?mem_zchar ?irrWnorm ?irrS.
+ rewrite -n1psi (cfnormE (cfun_onG psi)) (big_setD1 1%g) ?group1 //=.
+ rewrite mulrDr ltr_spaddl 1?mulr_gt0 ?invr_gt0 ?gt0CG ?exprn_gt0 //.
+ have /dirrP[s [i ->]]: psi \in dirr G.
+ by rewrite dirrE Ztau1 ?mem_zchar ?n1psi /=.
+ by rewrite cfunE normrMsign normr_gt0 irr1_neq0.
+ rewrite (big_setID 'A1~(M)) mulrDr ler_add //=.
+ rewrite FTsupp1_type1 // -FT_DadeF_supportE.
+ by rewrite (setIidPr _) ?Dade_support_subD1 ?leC_cfnorm_invDade_support.
+ rewrite (big_setID 'A1~(L)) mulrDr ler_paddr //=.
+ rewrite mulr_ge0 ?invr_ge0 ?ler0n ?sumr_ge0 // => z _.
+ by rewrite exprn_ge0 ?normr_ge0.
+ rewrite (setIidPr _); last first.
+ by rewrite subsetD tiA1_LM -FT_Dade1_supportE Dade_support_subD1.
+ by rewrite FTsupp1_type1 // -FT_DadeF_supportE leC_cfnorm_invDade_support.
+have ubM: (#|M| <= #|K| * #|H|)%N.
+ by rewrite -(sdprod_card defM) leq_mul // subset_leq_card.
+have{lb_psiM lb_psiL ub_rhoML ubM} ubK: (#|K / K'|%g < 4)%N.
+ rewrite card_quotient ?gFnorm -?ltC_nat //.
+ rewrite -ltf_pinv ?qualifE ?gt0CiG ?ltr0n // natf_indexg ?gFsub //.
+ rewrite invfM invrK mulrC -(subrK #|K|%:R #|K'|%:R) mulrDl divff ?neq0CG //.
+ rewrite -opprB mulNr addrC ltr_subr_addl -ltr_subr_addr.
+ have /Frobenius_context[_ _ ntE _ _] := set_Frobenius_compl defL frobL.
+ have egt2: (2 < e)%N by rewrite odd_geq ?mFT_odd ?cardG_gt1.
+ have e1_gt0: 0 < e.-1%:R :> algC by rewrite ltr0n -(subnKC egt2).
+ apply: ltr_le_trans (_ : e%:R / e.-1%:R ^+ 2 <= _).
+ rewrite ltr_pdivl_mulr ?exprn_gt0 //.
+ rewrite -(@ltr_pmul2r _ #|H|%:R^-1) ?invr_gt0 ?gt0CG // mulrAC.
+ rewrite -(ltr_add2r 1) -ltr_subl_addl -addrA.
+ apply: ler_lt_trans ub_rhoML; rewrite ler_add //.
+ apply: ler_trans lb_psiM; rewrite -natrX ler_wpmul2r ?ler0n //.
+ rewrite cardsD (setIidPr _) ?gFsub // -natrB ?subset_leq_card ?gFsub //.
+ rewrite -mulrA ler_wpmul2l ?ler0n //.
+ rewrite ler_pdivr_mulr ?gt0CG // ler_pdivl_mull ?gt0CG //.
+ by rewrite ler_pdivr_mulr ?gt0CG // mulrC -natrM leC_nat.
+ rewrite -(ler_pmul2l (gt0CG E)) -/e mulrA -expr2 invfM -exprMn.
+ apply: ler_trans (_ : (1 + 2%:R^-1) ^+ 2 <= _).
+ rewrite ler_sqr ?rpred_div ?rpredD ?rpred1 ?rpredV ?rpred_nat //.
+ rewrite -{1}(ltn_predK egt2) mulrSr mulrDl divff ?gtr_eqF // ler_add2l.
+ rewrite ler_pdivr_mulr // ler_pdivl_mull ?ltr0n //.
+ by rewrite mulr1 leC_nat -(subnKC egt2).
+ rewrite -(@ler_pmul2r _ (2 ^ 2)%:R) ?ltr0n // {1}natrX -exprMn -mulrA.
+ rewrite mulrDl mulrBl !mul1r !mulVf ?pnatr_eq0 // (mulrSr _ 3) addrK.
+ by rewrite -mulrSr ler_wpmul2r ?ler0n ?ler_nat.
+have [U [MtypeF _]] := FTtypeP 1 maxM Mtype1.
+have{U MtypeF} [_ _ [U0 [sU0ML expU0 frobU0]]] := compl_of_typeF defM MtypeF.
+have [/sdprodP[_ _ nKU0 tiKU0] ntK _ _ _] := Frobenius_context frobU0.
+have nK'U0: U0 \subset 'N(K') := char_norm_trans (der_char 1 K) nKU0.
+have frobU0K': [Frobenius K <*> U0 / K' = (K / K') ><| (U0 / K')]%g.
+ have solK: solvable K by rewrite ?nilpotent_sol ?Fcore_nil.
+ rewrite Frobenius_proper_quotient ?(sol_der1_proper solK) // /(_ <| _).
+ by rewrite (subset_trans (der_sub 1 _)) ?joing_subl // join_subG gFnorm.
+have isoU0: U0 \isog U0 / K'.
+ by rewrite quotient_isog //; apply/trivgP; rewrite -tiKU0 setSI ?gFsub.
+have piU0p: p \in \pi(U0 / K')%g.
+ rewrite /= -(card_isog isoU0) -pi_of_exponent expU0 pi_of_exponent.
+ rewrite mem_primes pr_p cardG_gt0 /= -ox order_dvdG // (subsetP _ _ P01x) //.
+ rewrite (subset_trans (Ohm_sub 1 _)) // subsetI sP0M.
+ by rewrite (subset_trans sP0H) ?gFsub.
+have /(Cauchy pr_p)[z U0z oz]: p %| #|U0 / K'|%g.
+ by rewrite mem_primes in piU0p; case/and3P: piU0p.
+have frobKz: [Frobenius (K / K') <*> <[z]> = (K / K') ><| <[z]>]%g.
+ rewrite (Frobenius_subr _ _ frobU0K') ?cycle_subG //.
+ by rewrite cycle_eq1 -order_gt1 oz ltnW.
+have: p %| #|K / K'|%g.-1 by rewrite -oz (Frobenius_dvd_ker1 frobKz) //.
+have [_ ntKK' _ _ _] := Frobenius_context frobKz.
+rewrite -subn1 gtnNdvd ?subn_gt0 ?cardG_gt1 // subn1 prednK ?cardG_gt0 //.
+by rewrite -ltnS (leq_trans ubK).
+Qed.
+
+End Twelve_13_to_16.
+
+Lemma FTtype1_nonFrobenius_contradiction : False.
+Proof.
+have [_ [tau1 cohS]] := FT_Frobenius_coherence maxL frobL.
+have [chi] := FTtype1_ref_irr maxL; rewrite -(index_sdprod defL).
+exact: FTtype1_nonFrobenius_witness_contradiction cohS.
+Qed.
+
+End Twelve_8_to_16.
+
+(* This is Peterfalvi, Theorem (12.7). *)
+Theorem FTtype1_Frobenius M :
+ M \in 'M -> FTtype M == 1%N -> [Frobenius M with kernel M`_\F].
+Proof.
+set K := M`_\F => maxM Mtype1; have [U [MtypeF _]] := FTtypeP 1 maxM Mtype1.
+have hallU: \pi(K)^'.-Hall(M) U.
+ by rewrite -(compl_pHall U (Fcore_Hall M)) sdprod_compl; have [[]] := MtypeF.
+apply: FrobeniusWker (U) _ _; have{MtypeF} [_ -> _] := typeF_context MtypeF.
+apply/forall_inP=> P0 /SylowP[p _ sylP0].
+rewrite (odd_pgroup_rank1_cyclic (pHall_pgroup sylP0)) ?mFT_odd // leqNgt.
+apply/negP=> prankP0.
+have piUp: p \in \pi(U) by rewrite -p_rank_gt0 -(p_rank_Sylow sylP0) ltnW.
+have{piUp} K'p: p \in \pi(K)^' := pnatPpi (pHall_pgroup hallU) piUp.
+have{U hallU sylP0} sylP0: p.-Sylow(M) P0 := subHall_Sylow hallU K'p sylP0.
+have{P0 sylP0 prankP0} prankM: (1 < 'r_p(M))%N by rewrite -(p_rank_Sylow sylP0).
+case/negP: K'p => /=.
+elim: {p}_.+1 {-2}p M @K (ltnSn p) maxM Mtype1 prankM => // p IHp q M K.
+rewrite ltnS leq_eqVlt => /predU1P[->{q} | /(IHp q M)//] maxM Mtype1 prankM.
+apply/idPn; rewrite -p'groupEpi /= -/K => p'K.
+have [P0 sylP0] := Sylow_exists p M.
+have [] := non_Frobenius_FTtype1_witness maxM Mtype1 prankM p'K sylP0.
+move=> abP0 prankP0 [L [maxL sP0_Ls [x P01s_x []]]].
+exact: (FTtype1_nonFrobenius_contradiction IHp) P01s_x.
+Qed.
+
+(* This is Peterfalvi, Theorem (12.17). *)
+Theorem not_all_FTtype1 : ~~ all_FTtype1 gT.
+Proof.
+apply/negP=> allT1; pose k := #|'M^G|.
+have [partGpi coA1 _ [injA1 /(_ allT1)partG _]] := FT_Dade_support_partition gT.
+move/forall_inP in allT1.
+have [/subsetP maxMG _ injMG exMG] := mmax_transversalP gT.
+have{partGpi exMG} kge2: (k >= 2)%N.
+ have [L MG_L]: exists L, L \in 'M^G.
+ by have [L maxL] := any_mmax gT; have [x] := exMG L maxL; exists (L :^ x)%G.
+ have maxL := maxMG L MG_L; have Ltype1 := allT1 L maxL.
+ have /Frobenius_kerP[_ ltHL nsHL _] := FTtype1_Frobenius maxL Ltype1.
+ rewrite ltnNge; apply: contra (proper_subn ltHL) => leK1.
+ rewrite (sub_normal_Hall (Fcore_Hall L)) // (pgroupS (subsetT L)) //=.
+ apply: sub_pgroup (pgroup_pi _) => p; rewrite partGpi => /exists_inP[M maxM].
+ have /eqP defMG: [set L] == 'M^G by rewrite eqEcard sub1set MG_L cards1.
+ have [x] := exMG M maxM; rewrite -defMG => /set1P/(canRL (actK 'JG _))-> /=.
+ by rewrite FTcoreJ cardJg FTcore_type1.
+pose L (i : 'I_k) : {group gT} := enum_val i; pose H i := (L i)`_\F%G.
+have MG_L i: L i \in 'M^G by apply: enum_valP.
+have maxL i: L i \in 'M by apply: maxMG.
+have defH i: (L i)`_\s = H i by rewrite FTcore_type1 ?allT1.
+pose frobL_P i E := [Frobenius L i = H i ><| gval E].
+have /fin_all_exists[E frobHE] i: exists E, frobL_P i E.
+ by apply/existsP/FTtype1_Frobenius; rewrite ?allT1.
+have frobL i: [/\ L i \subset G, solvable (L i) & frobL_P i (E i)].
+ by rewrite subsetT mmax_sol.
+have{coA1} coH_ i j: i != j -> coprime #|H i| #|H j|.
+ move=> j'i; rewrite -!defH coA1 //; apply: contra j'i => /imsetP[x Gx defLj].
+ apply/eqP/enum_val_inj; rewrite -/(L i) -/(L j); apply: injMG => //.
+ by rewrite defLj; apply/esym/orbit_act.
+have tiH i: normedTI (H i)^# G (L i).
+ have ntA: (H i)^# != set0 by rewrite setD_eq0 subG1 mmax_Fcore_neq1.
+ apply/normedTI_memJ_P=> //=; rewrite subsetT; split=> // x z H1x Gz.
+ apply/idP/idP=> [H1xz | Lz]; last first.
+ by rewrite memJ_norm // (subsetP _ z Lz) // normD1 gFnorm.
+ have /subsetP sH1A0: (H i)^# \subset 'A0(L i) by apply: Fcore_sub_FTsupp0.
+ have [/(sub_in2 sH1A0)wccH1 [_ maxN] Nfacts] := FTsupport_facts (maxL i).
+ suffices{z Gz H1xz wccH1} sCxLi: 'C[x] \subset L i.
+ have /imsetP[y Ly defxz] := wccH1 _ _ H1x H1xz (mem_imset _ Gz).
+ rewrite -[z](mulgKV y) groupMr // (subsetP sCxLi) // !inE conjg_set1.
+ by rewrite conjgM defxz conjgK.
+ apply/idPn=> not_sCxM; pose D := [set y in 'A0(L i) | ~~ ('C[y] \subset L i)].
+ have Dx: x \in D by rewrite inE sH1A0.
+ have{maxN} /mem_uniq_mmax[maxN sCxN] := maxN x Dx.
+ have Ntype1 := allT1 _ maxN.
+ have [_ _ /setDP[/bigcupP[y NFy /setD1P[ntx cxy]] /negP[]]] := Nfacts x Dx.
+ rewrite FTsupp1_type1 Ntype1 // in NFy cxy *.
+ have /Frobenius_kerP[_ _ _ regFN] := FTtype1_Frobenius maxN Ntype1.
+ by rewrite 2!inE ntx (subsetP (regFN y NFy)).
+have /negP[] := no_coherent_Frobenius_partition (mFT_odd _) kge2 frobL tiH coH_.
+rewrite eqEsubset sub1set !inE andbT; apply/andP; split; last first.
+ apply/bigcupP=> [[i _ /imset2P[x y /setD1P[ntx _] _ Dxy]]].
+ by rewrite -(conjg_eq1 x y) -Dxy eqxx in ntx.
+rewrite subDset setUC -subDset -(cover_partition partG).
+apply/bigcupsP=> _ /imsetP[Li MG_Li ->]; pose i := enum_rank_in MG_Li Li.
+rewrite (bigcup_max i) //=; have ->: Li = L i by rewrite /L enum_rankK_in.
+rewrite -FT_Dade1_supportE //; apply/bigcupsP=> x A1x; apply: imset2S => //.
+move: (FT_Dade1_hyp _) (tiH i); rewrite -defH => _ /Dade_normedTI_P[_ -> //].
+by rewrite mul1g sub1set -/(H i) -defH.
+Qed.
+
+End PFTwelve.