aboutsummaryrefslogtreecommitdiff
path: root/mathcomp/odd_order/PFsection13.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/PFsection13.v
Initial commit
Diffstat (limited to 'mathcomp/odd_order/PFsection13.v')
-rw-r--r--mathcomp/odd_order/PFsection13.v2185
1 files changed, 2185 insertions, 0 deletions
diff --git a/mathcomp/odd_order/PFsection13.v b/mathcomp/odd_order/PFsection13.v
new file mode 100644
index 0000000..58e0142
--- /dev/null
+++ b/mathcomp/odd_order/PFsection13.v
@@ -0,0 +1,2185 @@
+(* (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 binomial ssralg poly finset.
+Require Import fingroup morphism perm automorphism quotient action finalg zmodp.
+Require Import gfunctor gproduct center cyclic commutator gseries nilpotent.
+Require Import pgroup sylow hall abelian maximal frobenius.
+Require Import matrix mxalgebra mxrepresentation mxabelem vector.
+Require Import BGsection1 BGsection3 BGsection7.
+Require Import BGsection14 BGsection15 BGsection16.
+Require Import ssrnum rat algC cyclotomic algnum.
+Require Import classfun character integral_char inertia vcharacter.
+Require Import PFsection1 PFsection2 PFsection3 PFsection4.
+Require Import PFsection5 PFsection6 PFsection7 PFsection8 PFsection9.
+Require Import PFsection10 PFsection11 PFsection12.
+
+(******************************************************************************)
+(* This file covers Peterfalvi, Section 13: The Subgroups S and T. *)
+(* The following definitions will be used in PFsection14: *)
+(* FTtypeP_bridge StypeP j == a virtual character of S that mixes characters *)
+(* (locally) beta_ j, betaS that do and do not contain P = S`_\F in their *)
+(* kernels, for StypeP : of_typeP S U defW. *)
+(* := 'Ind[S, P <*> W1] 1 - mu2_ 0 j. *)
+(* FTtypeP_bridge_gap StypeP == the difference between the image of beta_ j *)
+(* (locally) Gamma, GammaS under the Dade isometry for S, and its natural *)
+(* value, 1 - eta_ 0 j (this does not actually *)
+(* depend on j != 0). *)
+(* The following definitions are only used locally across sections: *)
+(* #1 == the irreducible index 1 (i.e., inord 1). *)
+(* irr_Ind_Fittinq S chi <=> chi is an irreducible character of S induced *)
+(* (locally) irrIndH from an irreducible character of 'F(S) (which *)
+(* will be linear here, as 'F(S) is abelian). *)
+(* typeP_TIred_coherent StypeP tau1 <=> tau1 maps the reducible induced *)
+(* characters mu_ j of a type P group S, which are *)
+(* the image under the cyclic TI isometry to S of *)
+(* row sums of irreducibles of W = W1 x W2, to *)
+(* the image of that sum under the cyclic TI *)
+(* isometry to G (except maybe for a sign change *)
+(* if p = #|W2| = 3). *)
+(******************************************************************************)
+
+Set Implicit Arguments.
+Unset Strict Implicit.
+Unset Printing Implicit Defensive.
+
+Import GroupScope GRing.Theory FinRing.Theory Num.Theory.
+
+Section Thirteen.
+
+Variable gT : minSimpleOddGroupType.
+Local Notation G := (TheMinSimpleOddGroup gT).
+Implicit Types (p q : nat) (x y z : gT).
+Implicit Types H K L N P Q R S T U W : {group gT}.
+
+Definition irr_Ind_Fitting S := [predI irr S & seqIndT 'F(S) S].
+
+Local Notation irrIndH := (irr_Ind_Fitting _).
+Local Notation "#1" := (inord 1) (at level 0).
+
+Section Thirteen_2_3_5_to_9.
+
+(* These assumptions correspond to the part of Peterfalvi, Hypothesis (13.1) *)
+(* that is used to prove (13.2-3) and (13.5-9). Because of the shortcomings *)
+(* of Coq's Section and Module features we will need to repeat most of these *)
+(* assumptions twice down this file to exploit the symmetry between S and T. *)
+(* We anticipate the use of the letter 'H' to designate the Fitting group *)
+(* of S, which Peterfalvi does only locally in (13.5-9), in order not to *)
+(* conflict with (13.17-19), where H denotes the F-core of a Frobenius group. *)
+(* This is not a problem for us, since these lemmas will only appear in the *)
+(* last section of this file, and we will have no use for H at that point *)
+(* since we will have shown in (13.12) that H coincides with P = S`_\F. *)
+
+Variables S U W W1 W2 : {group gT}.
+Hypotheses (maxS : S \in 'M) (defW : W1 \x W2 = W).
+Hypotheses (StypeP : of_typeP S U defW).
+
+Local Notation "` 'W1'" := (gval W1) (at level 0, only parsing) : group_scope.
+Local Notation "` 'W2'" := (gval W2) (at level 0, only parsing) : group_scope.
+Local Notation "` 'W'" := (gval W) (at level 0, only parsing) : group_scope.
+Local Notation V := (cyclicTIset defW).
+
+Local Notation "` 'S'" := (gval S) (at level 0, only parsing) : group_scope.
+Local Notation P := `S`_\F%G.
+Local Notation "` 'P'" := `S`_\F (at level 0) : group_scope.
+Local Notation PU := S^`(1)%G.
+Local Notation "` 'PU'" := `S^`(1) (at level 0) : group_scope.
+Local Notation "` 'U'" := (gval U) (at level 0, only parsing) : group_scope.
+Local Notation C := 'C_U(`P)%G.
+Local Notation "` 'C'" := 'C_`U(`P) (at level 0) : group_scope.
+Local Notation H := 'F(S)%G.
+Local Notation "` 'H'" := 'F(`S) (at level 0) : group_scope.
+
+Let defS : PU ><| W1 = S. Proof. by have [[]] := StypeP. Qed.
+Let defPU : P ><| U = PU. Proof. by have [_ []] := StypeP. Qed.
+Let defH : P \x C = H. Proof. by have [] := typeP_context StypeP. Qed.
+
+Let notStype1 : FTtype S != 1%N. Proof. exact: FTtypeP_neq1 StypeP. Qed.
+Let notStype5 : FTtype S != 5%N. Proof. exact: FTtype5_exclusion maxS. Qed.
+
+Let pddS := FT_prDade_hypF maxS StypeP.
+Let ptiWS : primeTI_hypothesis S PU defW := FT_primeTI_hyp StypeP.
+Let ctiWG : cyclicTI_hypothesis G defW := pddS.
+
+Let ntW1 : W1 :!=: 1. Proof. by have [[]] := StypeP. Qed.
+Let ntW2 : W2 :!=: 1. Proof. by have [_ _ _ []] := StypeP. Qed.
+Let cycW1 : cyclic W1. Proof. by have [[]] := StypeP. Qed.
+Let cycW2 : cyclic W2. Proof. by have [_ _ _ []] := StypeP. Qed.
+
+Let p := #|W2|.
+Let q := #|W1|.
+Let c := #|C|.
+Let u := #|U : C|.
+
+Let oU : #|U| = (u * c)%N. Proof. by rewrite mulnC Lagrange ?subsetIl. Qed.
+
+Let pr_p : prime p. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed.
+Let pr_q : prime q. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed.
+
+Let qgt2 : q > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
+Let pgt2 : p > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
+
+Let coPUq : coprime #|PU| q.
+Proof. by rewrite (coprime_sdprod_Hall_r defS); have [[]] := StypeP. Qed.
+
+Let nirrW1 : #|Iirr W1| = q. Proof. by rewrite card_Iirr_cyclic. Qed.
+Let nirrW2 : #|Iirr W2| = p. Proof. by rewrite card_Iirr_cyclic. Qed.
+Let NirrW1 : Nirr W1 = q. Proof. by rewrite -nirrW1 card_ord. Qed.
+Let NirrW2 : Nirr W2 = p. Proof. by rewrite -nirrW2 card_ord. Qed.
+
+Local Open Scope ring_scope.
+
+Let sigma := (cyclicTIiso ctiWG).
+Let w_ i j := (cyclicTIirr defW i j).
+Local Notation eta_ i j := (sigma (w_ i j)).
+
+Local Notation Imu2 := (primeTI_Iirr ptiWS).
+Let mu2_ i j := primeTIirr ptiWS i j.
+Let mu_ := primeTIred ptiWS.
+Local Notation chi_ j := (primeTIres ptiWS j).
+
+Local Notation Idelta := (primeTI_Isign ptiWS).
+Local Notation delta_ j := (primeTIsign ptiWS j).
+
+Local Notation tau := (FT_Dade0 maxS).
+Local Notation "chi ^\tau" := (tau chi).
+
+Let calS0 := seqIndD PU S S`_\s 1.
+Let rmR := FTtypeP_coh_base maxS StypeP.
+Let scohS0 : subcoherent calS0 tau rmR.
+Proof. exact: FTtypeP_subcoherent StypeP. Qed.
+
+Let calS := seqIndD PU S P 1.
+Let sSS0 : cfConjC_subset calS calS0.
+Proof. exact/seqInd_conjC_subset1/Fcore_sub_FTcore. Qed.
+
+Local Notation type34ker1 := (FTtype34_Fcore_kernel_trivial maxS StypeP).
+Local Notation type34facts := (FTtype34_structure maxS StypeP).
+Local Notation type2facts := (FTtypeII_prime_facts maxS StypeP).
+Local Notation compl2facts := (compl_of_typeII maxS StypeP).
+Local Notation compl3facts := (compl_of_typeIII maxS StypeP).
+
+Local Notation H0 := (Ptype_Fcore_kernel StypeP).
+
+Lemma Ptype_factor_prime : pdiv #|P / H0|%g = p.
+Proof. exact: def_Ptype_factor_prime. Qed.
+Local Notation pHbar_p := Ptype_factor_prime.
+
+Lemma Ptype_Fcore_kernel_trivial : H0 :=: 1%g.
+Proof.
+have [/type2facts[_ oP _]| /type34ker1[]//] := boolP (FTtype S == 2).
+have [/and3P[]] := Ptype_Fcore_kernel_exists maxS StypeP notStype5.
+case/maxgroupp/andP=> /proper_sub sH0P nH0S /subset_trans/(_ nH0S)nH0P _ _.
+apply: card1_trivg; rewrite -(divg_indexS sH0P) -card_quotient //.
+have [_ _ ->] := Ptype_Fcore_factor_facts maxS StypeP notStype5.
+by rewrite pHbar_p -{}oP divnn ?cardG_gt0.
+Qed.
+Local Notation H0_1 := Ptype_Fcore_kernel_trivial.
+
+Lemma Ptype_Fcompl_kernel_cent : Ptype_Fcompl_kernel StypeP :=: C.
+Proof.
+rewrite [Ptype_Fcompl_kernel StypeP]unlock /= (group_inj H0_1).
+by rewrite astabQ -morphpreIim -injm_cent ?injmK ?ker_coset ?norms1.
+Qed.
+Local Notation CHbar_C := Ptype_Fcompl_kernel_cent.
+
+(* This is Peterfalvi (13.2). *)
+Lemma FTtypeP_facts :
+ [/\ (*a*) [/\ pred2 2 3 (FTtype S), q < p -> FTtype S == 2,
+ [Frobenius U <*> W1 = U ><| W1] & abelian U],
+ (*b*) p.-abelem P /\ #|P| = p ^ q,
+ (*c*) u <= (p ^ q).-1 %/ p.-1,
+ (*d*) coherent calS S^# tau
+ & (*e*) normedTI 'A0(S) G S /\ {in 'CF(S, 'A0(S)), tau =1 'Ind}]%N.
+Proof.
+have type23: pred2 2 3 (FTtype S).
+ by rewrite /= -implyNb; apply/implyP=> /type34facts[_ _ [->]].
+have [_ ntU _ tiFS] := compl_of_typeII_IV maxS StypeP notStype5.
+have [_ /mulG_sub[_ sUPU] nPU tiPU] := sdprodP defPU.
+have cUU: abelian U by case/orP: type23 => [/compl2facts | /compl3facts] [_ ->].
+split.
+- split=> //; last exact: Ptype_compl_Frobenius StypeP _.
+ by rewrite ltnNge; apply: contraR => /type34facts[_ /ltnW].
+- by have [/type2facts[] | /type34ker1[]] := boolP (FTtype S == 2).
+- have ->: u = #|U / C|%g by rewrite card_quotient ?normsI ?normG ?norms_cent.
+ have p1gt0: (0 < p.-1)%N by rewrite -(subnKC pgt2).
+ have [/typeP_Galois_P[]| /typeP_Galois_Pn[]]// := boolP (typeP_Galois StypeP).
+ move=> _ _ [_ _]; rewrite pHbar_p CHbar_C // -/u -/q; apply: dvdn_leq.
+ by rewrite divn_gt0 // -!subn1 leq_sub2r // (leq_exp2l 1) ltnW // ltnW.
+ rewrite -/q CHbar_C pHbar_p => H1 [_ _ _ _ [agt1 a_dv_p1 _ [V /card_isog->]]].
+ apply: leq_trans (_ : p.-1 ^ q.-1 <= _)%N; last first.
+ have ltp1q: (p.-1 ^ q < p ^ q)%N by rewrite ltn_exp2r ?prednK // 2?ltnW.
+ by rewrite leq_divRL // -expnSr (ltn_predK qgt2) -ltnS (ltn_predK ltp1q).
+ rewrite dvdn_leq ?expn_gt0 ?p1gt0 // (dvdn_trans (cardSg (subsetT V))) //.
+ by rewrite cardsT card_matrix mul1n dvdn_exp2r //= card_ord Zp_cast.
+- have:= Ptype_core_coherence maxS StypeP notStype5; rewrite H0_1 CHbar_C.
+ by rewrite (derG1P (abelianS _ cUU)) ?subsetIl ?(group_inj (joing1G _)).
+have ntA0: 'A0(S) != set0 := FTsupp0_neq0 maxS.
+suffices tiA0: normedTI 'A0(S) G S by split=> //; apply: Dade_Ind.
+apply/normedTI_memJ_P=> //; rewrite subsetT; split=> // x g A0x Gg.
+apply/idP/idP=> [A0xg | /(subsetP (FTsupp0_norm S))/memJ_norm->//].
+apply/idPn=> S'g; have Dx: x \in [set y in 'A0(S) | ~~ ('C[y] \subset S)].
+ rewrite inE A0x; have [_ _ [_ _ _ wccA0 _] _] := pddS.
+ have /imsetP[y Sy Dxy]: x ^ g \in x ^: S by rewrite wccA0 // mem_orbit.
+ apply/subsetPn; exists (g * y^-1)%g; last by rewrite groupMr ?groupV.
+ by rewrite !inE conjg_set1 conjgM Dxy conjgK.
+have [_ [_ /(_ x Dx) defL] /(_ x Dx)[_ _]] := FTsupport_facts maxS.
+have{defL} [maxL _] := mem_uniq_mmax defL; set L := 'N[x] in maxL *.
+rewrite -mem_iota !inE => ALx [/orP[Ltype1 _ | Ltype2]]; last first.
+ by case/(_ _)/existsP=> // ? /Frobenius_of_typeF/(typePF_exclusion StypeP).
+have /Frobenius_kerP[_ _ _ regLF_L] := FTtype1_Frobenius maxL Ltype1.
+case/andP: ALx => A1'x /bigcupP[z A1z /setD1P[ntx cLz_z]]; case/negP: A1'x.
+rewrite ntx /'A1(L) -(Fcore_eq_FTcore _ _) ?(eqP Ltype1) //= in cLz_z A1z *.
+exact: subsetP (regLF_L z A1z) _ cLz_z.
+Qed.
+
+Lemma FTseqInd_TIred j : j != 0 -> mu_ j \in calS.
+Proof.
+move=> nz_j; rewrite -[mu_ j]cfInd_prTIres mem_seqInd ?gFnormal ?normal1 //=.
+by rewrite !inE sub1G (cfker_prTIres pddS).
+Qed.
+
+Lemma FTtypeP_Fitting_abelian : abelian H.
+Proof.
+rewrite -(dprodW defH) abelianM subsetIr.
+have [[_ _ _ cUU] [/abelem_abelian-> _] _ _ _] := FTtypeP_facts.
+by rewrite (abelianS _ cUU) ?subsetIl.
+Qed.
+Hint Resolve FTtypeP_Fitting_abelian.
+
+Local Notation calH := (seqIndT H S).
+
+Lemma FTtypeP_Ind_Fitting_1 lambda : lambda \in calH -> lambda 1%g = (u * q)%:R.
+Proof.
+case/seqIndP=> i _ ->; rewrite cfInd1 -?divgS ?gFsub //; set theta := 'chi_i.
+have Ltheta: theta \is a linear_char by apply/char_abelianP.
+rewrite -(sdprod_card defS) -(sdprod_card defPU) -/q -(dprod_card defH) oU.
+by rewrite -mulnA divnMl // mulnAC mulnK ?cardG_gt0 // lin_char1 ?mulr1.
+Qed.
+Local Notation calHuq := FTtypeP_Ind_Fitting_1.
+
+(* This is Peterfalvi (13.3)(a). *)
+Lemma FTprTIred_Ind_Fitting j : j != 0 -> mu_ j \in calH.
+Proof.
+move=> nz_j; have [//|_ _ _] := typeP_reducible_core_Ind maxS StypeP.
+rewrite (group_inj H0_1) CHbar_C -/q /= (dprodWY defH) -/calS => /(_ (mu_ j)).
+case=> [|_ _ [_ /lin_char_irr/irrP[r ->] ->]]; last exact: mem_seqIndT.
+by rewrite mem_filter /= prTIred_not_irr FTseqInd_TIred.
+Qed.
+Local Notation Hmu := FTprTIred_Ind_Fitting.
+
+Lemma FTprTIred1 j : j != 0 -> mu_ j 1%g = (u * q)%:R.
+Proof. by move/Hmu/calHuq. Qed.
+Local Notation mu1uq := FTprTIred1.
+
+(* This is the first assertion of Peterfalvi (13.3)(c). *)
+Lemma FTprTIsign j : delta_ j = 1.
+Proof.
+have [[_ _ frobUW1 cUU] _ _ cohS _] := FTtypeP_facts.
+have [-> | nz_j] := eqVneq j 0; first exact: prTIsign0.
+suffices: (1 == delta_ j %[mod q])%C.
+ rewrite signrE /eqCmod addrC opprB subrK dvdC_nat.
+ by case: (Idelta j); rewrite ?subr0 // gtnNdvd.
+apply: eqCmod_trans (prTIirr1_mod ptiWS 0 j); rewrite -/(mu2_ 0 j) -/q.
+have ->: mu2_ 0 j 1%g = u%:R.
+ by apply: (mulfI (neq0CG W1)); rewrite -prTIred_1 -/mu_ mu1uq // mulnC natrM.
+rewrite eqCmod_sym /eqCmod -(@natrB _ u 1) ?indexg_gt0 // subn1 dvdC_nat.
+have nC_UW1: U <*> W1 \subset 'N(C).
+ have /sdprodP[_ _ nPUW1 _] := Ptype_Fcore_sdprod StypeP.
+ by rewrite normsI ?norms_cent // join_subG normG; have [_ []] := StypeP.
+have coUq: coprime #|U| q by have /sdprod_context[_ /coprimeSg->] := defPU.
+have /Frobenius_dvd_ker1: [Frobenius U <*> W1 / C = (U / C) ><| (W1 / C)].
+ have [defUW1 _ _ _ _] := Frobenius_context frobUW1.
+ rewrite Frobenius_coprime_quotient // /normal ?subIset ?joing_subl //.
+ split=> [|x /(Frobenius_reg_ker frobUW1)->]; last exact: sub1G.
+ rewrite properEneq subsetIl -CHbar_C andbT.
+ by have [] := Ptype_Fcore_factor_facts maxS StypeP notStype5.
+have [nCU nCW1] := joing_subP nC_UW1; rewrite !card_quotient // -/u.
+by rewrite -indexgI setIC setIAC (coprime_TIg coUq) setI1g indexg1.
+Qed.
+Local Notation delta1 := FTprTIsign.
+
+(* This is Peterfalvi (13.3)(b). *)
+Lemma FTtypeP_no_Ind_Fitting_facts :
+ ~~ has irrIndH calS ->
+ [/\ typeP_Galois StypeP, `C = 1%g & u = (p ^ q).-1 %/ p.-1].
+Proof.
+move=> noIndH; have [[_ _ _ cUU] _ _ _ _] := FTtypeP_facts.
+have [[t []] | [->]] := typeP_reducible_core_cases maxS StypeP notStype5.
+ rewrite CHbar_C H0_1 (derG1P (abelianS _ cUU)) ?subsetIl //=.
+ rewrite (group_inj (joing1G 1)) -/calS /= (dprodWY defH) => calSt _.
+ case=> _ /lin_char_irr/irrP[r ->] Dt; case/hasP: noIndH.
+ by exists 'chi_t; rewrite //= mem_irr; apply/seqIndP; exists r; rewrite ?inE.
+rewrite /= pHbar_p H0_1 oU /c => frobPU _ <- _ /=.
+suffices /eqP->: C :==: 1%g by rewrite cards1 muln1.
+suffices: 'C_(U / 1)(P / 1) == 1%g.
+ by rewrite -injm_subcent ?morphim_injm_eq1 ?norms1 ?ker_coset.
+have [_ ntP _ _ _] := Frobenius_context frobPU.
+by rewrite (cent_semiregular (Frobenius_reg_compl frobPU)).
+Qed.
+
+(* Helper function for (13.3)(c). *)
+Let signW2 (b : bool) := iter b (@conjC_Iirr _ W2).
+
+Let signW2K b : involutive (signW2 b).
+Proof. by case: b => //; apply: conjC_IirrK. Qed.
+
+Let signW2_eq0 b : {mono signW2 b: j / j == 0}.
+Proof. by case: b => //; apply: conjC_Iirr_eq0. Qed.
+
+(* This is a reformulation of the definition condition part of (13.3)(c) that *)
+(* better fits its actual use in (13.7), (13.8) and (13.9) (note however that *)
+(* the p = 3 part will in fact not be used). *)
+Definition typeP_TIred_coherent tau1 :=
+ exists2 b : bool, b -> p = 3
+ & forall j, j != 0 -> tau1 (mu_ j) = (-1) ^+ b *: \sum_i eta_ i (signW2 b j).
+
+(* This is the main part of Peterfalvi (13.3)(c), using the definition above. *)
+(* Note that the text glosses over the quantifier inversion in the second use *)
+(* of (5.8) in the p = 3 case. We must rule out tau1 (mu_ k) = - tau1 (mu_ j) *)
+(* by using the isometry property of tau1 (alternatively, we could use (4.8) *)
+(* to compute tau1 (mu_ k) = tau (mu_ k - mu_ j) + tau1 (mu_ j) directly). *)
+Lemma FTtypeP_coherence :
+ exists2 tau1 : {additive 'CF(S) -> 'CF(G)},
+ coherent_with calS S^# tau tau1 & typeP_TIred_coherent tau1.
+Proof.
+have [redS|] := altP (@allP _ [predC irr S] calS).
+ have [k nz_k] := has_nonprincipal_irr ntW2.
+ have [_ [tau1 Dtau1]] := uniform_prTIred_coherent pddS nz_k.
+ set calT := uniform_prTIred_seq pddS k => cohT.
+ exists tau1; last by exists false => // j _; rewrite /= Dtau1 delta1.
+ apply: subset_coherent_with cohT => xi Sxi.
+ have [_ _ /(_ xi)] := typeP_reducible_core_Ind maxS StypeP notStype5.
+ rewrite (group_inj H0_1) mem_filter redS // => /(_ Sxi)/imageP[j nz_j ->] _.
+ by rewrite image_f // inE -/mu_ [~~ _]nz_j /= !mu1uq.
+rewrite all_predC negbK => /hasP[xi Sxi irr_xi].
+have [_ _ _ [tau1 cohS] _] := FTtypeP_facts; exists tau1 => //.
+have [|] := boolP [forall (j | j != 0), tau1 (mu_ j) == \sum_i eta_ i j].
+ by move/eqfun_inP=> Dtau1; exists false => // j /Dtau1; rewrite scale1r.
+rewrite negb_forall_in => /exists_inP[j nz_j /eqP tau1muj_neq_etaj].
+have:= FTtypeP_coherent_TIred sSS0 cohS irr_xi Sxi (FTseqInd_TIred _).
+rewrite -/mu_ -/sigma -/ptiWS => tau1mu; have [dk tau1muj Ddk] := tau1mu j nz_j.
+case: Ddk tau1muj => [][-> ->]{dk}; rewrite ?signrN delta1 ?scaleNr scale1r //.
+set k := conjC_Iirr j => Dmu tau1muj.
+have{Dmu} defIW2 l: l != 0 -> pred2 j k l.
+ by move=> nz_l; rewrite Dmu ?FTseqInd_TIred ?mu1uq.
+have [nz_k j'k]: k != 0 /\ k != j.
+ rewrite conjC_Iirr_eq0 nz_j -(inj_eq irr_inj) conjC_IirrE.
+ by rewrite odd_eq_conj_irr1 ?mFT_odd ?irr_eq1.
+have /eqP p3: p == 3.
+ rewrite -nirrW2 (cardD1 0) (cardD1 j) (cardD1 k) !inE nz_j nz_k j'k !eqSS.
+ by apply/pred0Pn=> [[l /and4P[k'l j'l /defIW2/norP[]]]].
+exists true => // _ /defIW2/pred2P[]->; first by rewrite scaler_sign.
+have [[[Itau1 _] _] [d t1muk Dd]] := (cohS, tau1mu k nz_k); move: Dd t1muk.
+case=> [][-> ->] => [|_]; rewrite ?signrN delta1 // scale1r.
+case/(congr1 (cfdotr (tau1 (mu_ j)) \o -%R))/eqP/idPn => /=.
+rewrite -tau1muj cfdotNl eq_sym !Itau1 ?mem_zchar ?FTseqInd_TIred //.
+by rewrite !cfdot_prTIred (negPf j'k) eqxx mul1n oppr0 neq0CG.
+Qed.
+
+(* We skip over (13.4), whose proof uses (13.2) and (13.3) for both groups of *)
+(* a type P pair. *)
+
+Let calS1 := seqIndD H S P 1.
+
+(* Some facts about calS1 used implicitly throughout (13.5-8). *)
+Let S1mu j : j != 0 -> mu_ j \in calS1.
+Proof.
+move=> nz_j; have /seqIndP[s _ Ds] := Hmu nz_j.
+rewrite Ds mem_seqInd ?gFnormal ?normal1 // !inE sub1G andbT.
+rewrite -(sub_cfker_Ind_irr s (gFsub _ _) (gFnorm _ _)) -Ds /=.
+rewrite -[mu_ j](cfInd_prTIres (FT_prDade_hypF maxS StypeP)).
+by rewrite sub_cfker_Ind_irr ?cfker_prTIres ?gFsub ?gFnorm.
+Qed.
+
+Let calSirr := [seq phi <- calS | phi \in irr S].
+Let S1cases zeta :
+ zeta \in calS1 -> {j | j != 0 & zeta = mu_ j} + (zeta \in 'Z[calSirr]).
+Proof.
+move=> S1zeta; have /sig2_eqW[t /setDP[_ kerP't] Dzeta] := seqIndP S1zeta.
+rewrite inE in kerP't; have /mulG_sub[sPH _] := dprodW defH.
+have [/andP[sPPU nPPU] sUPU _ _ _] := sdprod_context defPU.
+have sHPU: H \subset PU by rewrite /= -(dprodWC defH) mulG_subG subIset ?sUPU.
+have [/eqfunP mu'zeta|] := boolP [forall j, '['Ind 'chi_t, chi_ j] == 0].
+ right; rewrite Dzeta -(cfIndInd _ _ sHPU) ?gFsub //.
+ rewrite ['Ind 'chi_t]cfun_sum_constt linear_sum /= rpred_sum // => s tPUs.
+ rewrite linearZ rpredZ_Cnat ?Cnat_cfdot_char ?cfInd_char ?irr_char //=.
+ have [[j Ds] | [irr_zeta _]] := prTIres_irr_cases ptiWS s.
+ by case/eqP: tPUs; rewrite Ds mu'zeta.
+ rewrite mem_zchar // mem_filter irr_zeta mem_seqInd ?gFnormal ?normal1 //=.
+ by rewrite !inE sub1G andbT -(sub_cfker_constt_Ind_irr tPUs).
+rewrite negb_forall => /existsP/sigW[j].
+rewrite -irr_consttE constt_Ind_Res => jHt.
+have nz_j: j != 0; last do [left; exists j => //].
+ apply: contraTneq jHt => ->; rewrite prTIres0 rmorph1 -irr0 constt_irr.
+ by apply: contraNneq kerP't => ->; rewrite irr0 cfker_cfun1.
+have /pairwise_orthogonalP[_ ooS1]: pairwise_orthogonal calS1.
+ by rewrite seqInd_orthogonal ?gFnormal.
+rewrite -(cfRes_prTIirr _ 0) cfResRes ?gFsub //= in jHt.
+have muj_mu0j: Imu2 (0, j) \in irr_constt (mu_ j).
+ by rewrite irr_consttE cfdotC cfdot_prTIirr_red eqxx conjC1 oner_eq0.
+apply: contraNeq (constt_Res_trans (prTIred_char _ _) muj_mu0j jHt).
+by rewrite cfdot_Res_l /= -Dzeta eq_sym => /ooS1-> //; rewrite S1mu.
+Qed.
+
+Let sS1S : {subset calS1 <= 'Z[calS]}.
+Proof.
+move=> zeta /S1cases[[j nz_j ->]|]; first by rewrite mem_zchar ?FTseqInd_TIred.
+by apply: zchar_subset; apply: mem_subseq (filter_subseq _ _).
+Qed.
+
+(* This is Peterfalvi (13.5). *)
+(* We have adapted the statement to its actual use by replacing the Dade *)
+(* (partial) isometry by a (total) coherent isometry, and strengthening the *)
+(* orthogonality condition. This simplifies the assumptions as zeta0 is no *)
+(* longer needed. Note that this lemma is only used to establish various *)
+(* inequalities (13.6-8) that contribute to (13.10), so it does not need to *)
+(* be exported from this section. *)
+Let calS1_split1 (tau1 : {additive _}) zeta1 chi :
+ coherent_with calS S^# tau tau1 -> zeta1 \in calS1 -> chi \in 'Z[irr G] ->
+ {in calS1, forall zeta, zeta != zeta1 -> '[tau1 zeta, chi] = 0} ->
+ let a := '[tau1 zeta1, chi] in
+ exists2 alpha,
+ alpha \in 'Z[irr H] /\ {subset irr_constt alpha <= Iirr_ker H P} &
+ [/\ (*a*) {in H^#, forall x, chi x = a / '[zeta1] * zeta1 x + alpha x},
+ (*b*)
+ \sum_(x in H^#) `|chi x| ^+ 2 =
+ a ^+ 2 / '[zeta1] * (#|S|%:R - zeta1 1%g ^+ 2 / '[zeta1])
+ - 2%:R * a * (zeta1 1%g * alpha 1%g / '[zeta1])
+ + (\sum_(x in H^#) `|alpha x| ^+ 2)
+ & (*c*)
+ \sum_(x in H^#) `|alpha x| ^+ 2 >= #|P|.-1%:R * alpha 1%g ^+ 2].
+Proof.
+case=> _ Dtau1 S1zeta1 Zchi o_tau1S_chi a.
+have sW2P: W2 \subset P by have [_ _ _ []] := StypeP.
+have /mulG_sub[sPH _] := dprodW defH.
+have ntH: H :!=: 1%g by apply: subG1_contra ntW2; apply: subset_trans sPH.
+have sH1S: H^# \subset G^# by rewrite setSD ?subsetT.
+have[nsHS nsPS ns1S]: [/\ H <| S, P <| S & 1 <| S] by rewrite !gFnormal normal1.
+have [[sHS nHS] [sPS nPS]] := (andP nsHS, andP nsPS).
+have tiH: normedTI H^# G S by have [] := compl_of_typeII_IV maxS StypeP.
+have ddH := normedTI_Dade tiH sH1S; have [_ ddH_1] := Dade_normedTI_P ddH tiH.
+pose tauH := Dade ddH.
+have DtauH: {in 'CF(S, H^#), tauH =1 'Ind} := Dade_Ind ddH tiH.
+have sS1H: {subset calS1 <= calH} by apply: seqInd_subT.
+pose zeta0 := zeta1^*%CF.
+have S1zeta0: zeta0 \in calS1 by rewrite cfAut_seqInd.
+have zeta1'0: zeta0 != zeta1.
+ by rewrite (hasPn (seqInd_notReal _ _ _ _) _ S1zeta1) ?gFnormal ?mFT_odd.
+have Hzeta0 := sS1H _ S1zeta0.
+have dH_1 zeta: zeta \in calH -> (zeta - zeta0) 1%g == 0.
+ by move=> Tzeta; rewrite 2!cfunE !calHuq // subrr eqxx.
+have H1dzeta zeta: zeta \in calH -> zeta - zeta0 \in 'CF(S, H^#).
+ have HonH: {subset calH <= 'CF(S, H)} by exact: seqInd_on.
+ by move=> Hzeta; rewrite cfun_onD1 rpredB ?HonH ?dH_1.
+pose calH1 := rem zeta1 (rem zeta0 (filter [mem calS1] calH)).
+pose calH2 := filter [predC calS1] calH.
+have DcalH: perm_eq calH (zeta0 :: zeta1 :: calH1 ++ calH2).
+ rewrite -(perm_filterC [mem calS1]) -!cat_cons perm_cat2r.
+ rewrite (perm_eqlP (@perm_to_rem _ zeta0 _ _)) ?mem_filter /= ?S1zeta0 //.
+ rewrite perm_cons perm_to_rem // mem_rem_uniq ?filter_uniq ?seqInd_uniq //.
+ by rewrite !inE mem_filter /= eq_sym zeta1'0 S1zeta1 sS1H.
+have{DcalH} [a_ _ Dchi _] := invDade_seqInd_sum ddH chi DcalH.
+have Da_ zeta: zeta \in calH -> a_ zeta = '['Ind (zeta - zeta0), chi].
+ move=> Tzeta; rewrite /a_ !calHuq // divff ?scale1r; last first.
+ by rewrite pnatr_eq0 -lt0n muln_gt0 indexg_gt0 cardG_gt0.
+ by rewrite [Dade _ _]DtauH ?H1dzeta.
+have Za_ zeta: zeta \in calH -> a_ zeta \in Cint.
+ move=> Hzeta; rewrite Da_ // Cint_cfdot_vchar ?cfInd_vchar //.
+ by rewrite rpredB ?char_vchar ?(seqInd_char Hzeta) ?(seqInd_char Hzeta0).
+have{Da_} Da_ zeta: zeta \in calS1 -> a_ zeta = '[tau1 zeta, chi].
+ move=> S1zeta; have Hzeta := sS1H _ S1zeta.
+ rewrite Da_ //; have [_ _ _ _ [_ <-]] := FTtypeP_facts.
+ rewrite -Dtau1; last by rewrite zcharD1E rpredB ?sS1S ?dH_1.
+ by rewrite raddfB cfdotBl (o_tau1S_chi zeta0) ?subr0.
+ by rewrite (cfun_onS (Fitting_sub_FTsupp0 maxS)) ?H1dzeta.
+pose alpha := 'Res[H] (\sum_(zeta <- calH2) (a_ zeta)^* / '[zeta] *: zeta).
+have{Dchi} Dchi: {in H^#, forall x, chi x = a / '[zeta1] * zeta1 x + alpha x}.
+ move=> x H1x; have [_ Hx] := setD1P H1x.
+ transitivity (invDade ddH chi x).
+ by rewrite cfunElock ddH_1 // big_set1 H1x mul1g cards1 invr1 mul1r.
+ rewrite cfResE ?gFsub ?Dchi // big_cons conj_Cint ?Za_ ?Da_ ?sS1H //= -/a.
+ congr (_ + _); rewrite big_cat /= sum_cfunE big1_seq ?add0r //= => [|zeta].
+ by apply: eq_bigr => zeta; rewrite cfunE.
+ rewrite ?(mem_rem_uniq, inE) ?rem_uniq ?filter_uniq ?seqInd_uniq //=.
+ rewrite mem_filter => /and4P[/= zeta1'z _ S1zeta _].
+ by rewrite Da_ ?o_tau1S_chi // conjC0 !mul0r.
+have kerHalpha: {subset irr_constt alpha <= Iirr_ker H P}.
+ move=> s; apply: contraR => kerP's; rewrite [alpha]rmorph_sum cfdot_suml.
+ rewrite big1_seq // => psi; rewrite mem_filter /= andbC => /andP[].
+ case/seqIndP=> r _ ->; rewrite mem_seqInd // !inE sub1G andbT negbK => kerPr.
+ rewrite cfdot_Res_l cfdotZl mulrC cfdot_sum_irr big1 ?mul0r // => t _.
+ apply: contraNeq kerP's; rewrite mulf_eq0 fmorph_eq0 inE => /norP[rSt sSt].
+ by rewrite (sub_cfker_constt_Ind_irr sSt) -?(sub_cfker_constt_Ind_irr rSt).
+have Zalpha: alpha \in 'Z[irr H].
+ rewrite [alpha]rmorph_sum big_seq rpred_sum // => zeta; rewrite mem_filter /=.
+ case/andP=> S1'zeta Tzeta; rewrite linearZ /= -scalerA.
+ rewrite rpredZ_Cint ?conj_Cint ?Za_ //; have [s _ ->] := seqIndP Tzeta.
+ rewrite cfResInd_sum_cfclass ?reindex_cfclass -?cfnorm_Ind_irr //=.
+ rewrite scalerK ?cfnorm_eq0 ?cfInd_eq0 ?irr_neq0 ?irr_char ?gFsub //.
+ by apply: rpred_sum => i _; apply: irr_vchar.
+have{Da_ Za_} Za: a \in Cint by rewrite -[a]Da_ ?Za_ ?sS1H.
+exists alpha => //; split=> //.
+ set a1 := a / _ in Dchi; pose phi := a1 *: 'Res zeta1 + alpha.
+ transitivity (#|H|%:R * '[phi] - `|phi 1%g| ^+ 2).
+ rewrite (cfnormE (cfun_onG phi)) mulVKf ?neq0CG // addrC.
+ rewrite (big_setD1 _ (group1 H)) addKr; apply: eq_bigr => x H1x.
+ by have [_ Hx] := setD1P H1x; rewrite !cfunE cfResE // Dchi.
+ have Qa1: a1 \in Creal.
+ apply: rpred_div; first by rewrite rpred_Cint.
+ by rewrite rpred_Cnat // Cnat_cfdot_char ?(seqInd_char S1zeta1).
+ rewrite cfnormDd; last first.
+ rewrite [alpha]cfun_sum_constt cfdotZl cfdot_sumr big1 ?mulr0 // => s.
+ move/kerHalpha; rewrite inE cfdotZr mulrC cfdot_Res_l => kerPs.
+ have [r kerP'r ->] := seqIndP S1zeta1; rewrite cfdot_sum_irr big1 ?mul0r //.
+ move=> t _; apply: contraTeq kerP'r; rewrite !inE sub1G andbT negbK.
+ rewrite mulf_eq0 fmorph_eq0 => /norP[]; rewrite -!irr_consttE.
+ by move=> /sub_cfker_constt_Ind_irr-> // /sub_cfker_constt_Ind_irr <-.
+ rewrite cfnormZ 2!cfunE cfRes1 2?real_normK //; last first.
+ rewrite rpredD 1?rpredM // Creal_Cint ?Cint_vchar1 // ?char_vchar //.
+ by rewrite (seqInd_char S1zeta1).
+ rewrite mulrDr mulrCA sqrrD opprD addrACA; congr (_ + _); last first.
+ rewrite (cfnormE (cfun_onG _)) mulVKf ?neq0CG //.
+ by rewrite (big_setD1 1%g) // Cint_normK ?Cint_vchar1 // addrC addKr.
+ rewrite opprD addrA; congr (_ - _); last first.
+ rewrite -[_ * a * _]mulrA -mulr_natl; congr (_ * _).
+ by rewrite -[a1 * _]mulrA -(mulrA a); congr (_ * _); rewrite -mulrA mulrC.
+ rewrite mulrBr; congr (_ - _); last first.
+ by rewrite mulrACA -expr2 -!exprMn mulrAC.
+ rewrite -mulrA exprMn -mulrA; congr (_ * _); rewrite expr2 -mulrA.
+ congr (_ * _); apply: canLR (mulKf (cfnorm_seqInd_neq0 nsHS S1zeta1)) _.
+ rewrite (cfnormE (cfun_onG _)) mulVKf ?neq0CG // mulrC.
+ rewrite (cfnormE (seqInd_on nsHS S1zeta1)) mulVKf ?neq0CG //.
+ by apply: eq_bigr => x Hx; rewrite cfResE.
+rewrite -subn1 natrB // -Cint_normK ?Cint_vchar1 // mulrBl mul1r ler_subl_addl.
+apply: ler_trans (_ : \sum_(x in H) `|alpha x| ^+ 2 <= _); last first.
+ by rewrite (big_setD1 1%g).
+rewrite (big_setID P) /= (setIidPr sPH) ler_paddr ?sumr_ge0 // => [x _|].
+ by rewrite mulr_ge0 ?normr_ge0.
+rewrite mulr_natl -sumr_const ler_sum // => y Py.
+suffices ->: alpha y = alpha 1%g by apply: lerr.
+rewrite [alpha]cfun_sum_constt !sum_cfunE; apply: eq_bigr => i.
+by rewrite !cfunE => /kerHalpha; rewrite inE => /subsetP/(_ y Py)/cfker1->.
+Qed.
+
+Local Notation eta10 := (eta_ #1 0).
+Local Notation eta01 := (eta_ 0 #1).
+
+Let o_tau1_eta (tau1 : {additive _}) i j:
+ coherent_with calS S^# tau tau1 ->
+ {in 'Z[calSirr], forall zeta, '[tau1 zeta, eta_ i j] = 0}.
+Proof.
+move=> cohS _ /zchar_expansion[|z Zz ->].
+ by rewrite filter_uniq ?seqInd_uniq.
+rewrite raddf_sum cfdot_suml big1_seq //= => phi; rewrite mem_filter.
+case/andP=> irr_phi /(coherent_ortho_cycTIiso StypeP sSS0 cohS) o_phi_eta.
+by rewrite raddfZ_Cint {Zz}//= cfdotZl o_phi_eta ?mulr0.
+Qed.
+
+Let P1_int2_lb b : b \in Cint -> 2%:R * u%:R * b <= #|P|.-1%:R * b ^+ 2.
+Proof.
+move=> Zb; rewrite -natrM; apply: ler_trans (_ : (2 * u)%:R * b ^+ 2 <= _).
+ by rewrite ler_wpmul2l ?ler0n ?Cint_ler_sqr.
+rewrite ler_wpmul2r -?realEsqr ?Creal_Cint // leC_nat mulnC -leq_divRL //.
+have [_ [_ ->] /leq_trans-> //] := FTtypeP_facts.
+by rewrite leq_div2l // -subn1 ltn_subRL.
+Qed.
+
+(* This is Peterfalvi (13.6). *)
+Lemma FTtypeP_sum_Ind_Fitting_lb (tau1 : {additive _}) lambda :
+ coherent_with calS S^# tau tau1 -> lambda \in irrIndH -> lambda \in calS ->
+ \sum_(x in H^#) `|tau1 lambda x| ^+ 2 >= #|S|%:R - lambda 1%g ^+ 2.
+Proof.
+move=> cohS /andP[Ilam Hlam] Slam; have [[Itau1 Ztau1] _] := cohS.
+have Zlam1: tau1 lambda \in 'Z[irr G] by rewrite Ztau1 ?mem_zchar.
+have S1lam: lambda \in calS1.
+ have [[s kerP's Ds] [r _ Dr]] := (seqIndP Slam, seqIndP Hlam).
+ rewrite Dr mem_seqInd ?gFnormal ?normal1 // !inE !sub1G !andbT in kerP's *.
+ rewrite -(sub_cfker_Ind_irr r (gFsub _ _) (gFnorm _ _)) /= -Dr.
+ by rewrite Ds sub_cfker_Ind_irr ?gFsub ?gFnorm.
+have [|alpha [Zalpha kerPalpha]] := calS1_split1 cohS S1lam Zlam1.
+ move=> zeta S1zeta lam'zeta; rewrite Itau1 ?sS1S //.
+ suffices: pairwise_orthogonal calS1 by case/pairwise_orthogonalP=> _ ->.
+ by rewrite seqInd_orthogonal ?gFnormal.
+rewrite Itau1 ?mem_zchar // irrWnorm // expr1n !divr1 mul1r => [[Dlam ->]].
+rewrite mulr1 -ler_subl_addl addrC opprB subrK calHuq //; apply: ler_trans.
+have [[x W2x ntx] [y W1y nty]] := (trivgPn _ ntW2, trivgPn _ ntW1).
+have [_ _ _ [_ _ sW2P _ _] _] := StypeP; have Px := subsetP sW2P x W2x.
+have [eps pr_eps] := C_prim_root_exists (prime_gt0 pr_q).
+have{y W1y W2x nty} lamAmod: (tau1 lambda x == lambda x %[mod 1 - eps])%A.
+ have [_ /mulG_sub[_ sW1S] _ tiPUW1] := sdprodP defS.
+ have [_ /mulG_sub[sW1W sW2W] cW12 _] := dprodP defW.
+ have /mulG_sub[sPPU _] := sdprodW defPU.
+ have [o_y cxy]: #[y] = q /\ x \in 'C[y].
+ split; last by apply/cent1P; red; rewrite (centsP cW12).
+ by apply: nt_prime_order => //; apply/eqP; rewrite -order_dvdn order_dvdG.
+ have lam1yx: (tau1 lambda (y * x)%g == tau1 lambda x %[mod 1 - eps])%A.
+ by rewrite (vchar_ker_mod_prim pr_eps) ?in_setT.
+ have [Sx Sy] := (subsetP (gFsub _ _) x Px, subsetP sW1S y W1y).
+ have PUx := subsetP sPPU x Px.
+ have lam_yx: (lambda (y * x)%g == lambda x %[mod 1 - eps])%A.
+ by rewrite (vchar_ker_mod_prim pr_eps) ?char_vchar ?(seqInd_char Slam).
+ apply: eqAmod_trans lam_yx; rewrite eqAmod_sym; apply: eqAmod_trans lam1yx.
+ have PUlam: lambda \in 'CF(S, PU) by rewrite (seqInd_on _ Slam) ?gFnormal.
+ have PU'yx: (y * x)%g \notin PU.
+ by rewrite groupMr //= -[y \in PU]andbT -W1y -in_setI tiPUW1 !inE.
+ rewrite (cfun_on0 PUlam PU'yx) (ortho_cycTIiso_vanish pddS) //.
+ apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i [j ->]] ->].
+ by rewrite (coherent_ortho_cycTIiso StypeP sSS0).
+ rewrite !inE (groupMl x (subsetP sW1W y _)) // (subsetP sW2W) // andbT.
+ rewrite groupMl // -[x \in _]andTb -PUx -in_setI tiPUW1 !inE negb_or ntx /=.
+ by rewrite (contra _ PU'yx) // => /(subsetP sW2P)/(subsetP sPPU).
+have{x ntx Px lamAmod} alphaAmod: (alpha 1%g == 0 %[mod 1 - eps])%A.
+ have Hx: x \in H by have/mulG_sub[/subsetP->] := dprodW defH.
+ have:= lamAmod; rewrite -[lambda x]addr0 Dlam ?inE ?ntx // mul1r eqAmodDl.
+ rewrite cfker1 // [alpha]cfun_sum_constt (subsetP (cfker_sum _ _ _)) //.
+ rewrite !inE Hx (subsetP _ x Px) //; apply/bigcapsP=> i /kerPalpha.
+ by rewrite !inE => /subset_trans-> //; apply: cfker_scale.
+have /dvdCP[b Zb ->]: (q %| alpha 1%g)%C.
+ by rewrite (int_eqAmod_prime_prim pr_eps) // Cint_vchar1.
+rewrite natrM mulrACA exprMn !mulrA 2?ler_pmul2r ?gt0CG //.
+by rewrite -[_ * b * b]mulrA P1_int2_lb.
+Qed.
+
+(* This is Peterfalvi (13.7). *)
+Lemma FTtypeP_sum_cycTIiso10_lb : \sum_(x in H^#) `|eta10 x| ^+ 2 >= #|H^#|%:R.
+Proof.
+pose mu1 := mu_ #1; have S1mu1: mu1 \in calS1 by rewrite S1mu ?Iirr1_neq0.
+have Zeta10: eta10 \in 'Z[irr G] by rewrite cycTIiso_vchar.
+have [tau1 cohS [b _ Dtau1]] := FTtypeP_coherence.
+have{b Dtau1} oS1eta10: {in calS1, forall zeta, '[tau1 zeta, eta10] = 0}.
+ move=> zeta /S1cases[[j nz_j ->] | /o_tau1_eta-> //].
+ rewrite Dtau1 // cfdotZl cfdot_suml big1 ?mulr0 // => i _.
+ by rewrite cfdot_cycTIiso signW2_eq0 (negPf nz_j) andbF.
+have [_ /oS1eta10//|alpha [Zalpha kerPalpha]] := calS1_split1 cohS S1mu1 Zeta10.
+rewrite {}oS1eta10 // expr0n mulr0 !mul0r subrr add0r => [[Deta10 -> ub_alpha]].
+have{Deta10} Deta10: {in H^#, eta10 =1 alpha}.
+ by move=> x /Deta10; rewrite !mul0r add0r.
+set a1_2 := alpha 1%g ^+ 2 in ub_alpha.
+have Dsum_alpha: \sum_(x in H^#) `|alpha x| ^+ 2 = #|H|%:R * '[alpha] - a1_2.
+ rewrite (cfnormE (cfun_onG _)) mulVKf ?neq0CG // (big_setD1 _ (group1 H)) /=.
+ by rewrite addrC Cint_normK ?addKr ?Cint_vchar1.
+have [/mulG_sub[sPH _] [_ _ _ [_ _ sW2P _ _] _]] := (dprodW defH, StypeP).
+have nz_alpha: alpha != 0.
+ have [[x W2x ntx] [y W1y nty]] := (trivgPn _ ntW2, trivgPn _ ntW1).
+ have [eps pr_eps] := C_prim_root_exists (prime_gt0 pr_q).
+ have [_ mulW12 cW12 tiW12] := dprodP defW.
+ have [sW1W sW2W] := mulG_sub mulW12.
+ have [o_y cxy]: #[y] = q /\ x \in 'C[y].
+ split; last by apply/cent1P; red; rewrite (centsP cW12).
+ by apply: nt_prime_order => //; apply/eqP; rewrite -order_dvdn order_dvdG.
+ have eta10x: (eta10 x == eta10 (y * x)%g %[mod 1 - eps])%A.
+ by rewrite eqAmod_sym (vchar_ker_mod_prim pr_eps) ?in_setT.
+ have eta10xy: (eta10 (y * x)%g == 1 %[mod 1 - eps])%A.
+ rewrite cycTIiso_restrict; last first.
+ rewrite !inE -mulW12 mem_mulg // andbT groupMl ?groupMr // -[_ || _]andTb.
+ by rewrite andb_orr -{1}W2x -W1y andbC -!in_setI tiW12 !inE (negPf ntx).
+ have {2}<-: w_ #1 0 x = 1.
+ rewrite -[x]mul1g /w_ dprod_IirrE cfDprodE // irr0 cfun1E W2x mulr1.
+ by rewrite lin_char1 ?irr_cyclic_lin.
+ rewrite (vchar_ker_mod_prim pr_eps) ?(subsetP sW1W y) ?(subsetP sW2W) //.
+ by rewrite irr_vchar.
+ have: (alpha x == 1 %[mod 1 - eps])%A.
+ rewrite -Deta10; last by rewrite !inE ntx (subsetP sPH) ?(subsetP sW2P).
+ exact: eqAmod_trans eta10x eta10xy.
+ apply: contraTneq => ->; rewrite cfunE eqAmod_sym.
+ apply/negP=> /(int_eqAmod_prime_prim pr_eps pr_q (rpred1 _))/idPn[].
+ by rewrite (dvdC_nat q 1) -(subnKC qgt2).
+apply: wlog_neg => suma_lt_H.
+suffices{ub_alpha} lb_a1_2: a1_2 >= #|H^#|%:R.
+ have Pgt2: (2 < #|P|)%N by apply: leq_trans (subset_leq_card sW2P).
+ apply: ler_trans (ler_trans lb_a1_2 _) ub_alpha.
+ rewrite ler_pmull ?(ltr_le_trans _ lb_a1_2) ?ler1n ?ltr0n //.
+ by rewrite -(subnKC Pgt2).
+ have:= leq_trans (ltnW Pgt2) (subset_leq_card sPH).
+ by rewrite (cardsD1 1%g) group1.
+have /CnatP[n Dn]: '[alpha] \in Cnat by rewrite Cnat_cfnorm_vchar.
+have /CnatP[m Dm]: a1_2 \in Cnat by rewrite Cnat_exp_even ?Cint_vchar1.
+rewrite Dm leC_nat leqNgt; apply: contra suma_lt_H => a1_2_lt_H.
+rewrite {1}Dsum_alpha Dn Dm -natrM ler_subr_addl (cardsD1 1%g H) group1 /=.
+case Dn1: n => [|[|n1]]; first by rewrite -cfnorm_eq0 Dn Dn1 eqxx in nz_alpha.
+ have /dirrP[b [i Dalpha]]: alpha \in dirr H by rewrite dirrE Zalpha Dn Dn1 /=.
+ rewrite -Dm /a1_2 Dalpha cfunE exprMn sqrr_sign mul1r muln1 mulrS ler_add2r.
+ by rewrite lin_char1 ?expr1n //; apply/char_abelianP.
+rewrite -natrD leC_nat -add2n mulnDr (addnC 1%N) mulnDl -addnA.
+by apply: leq_trans (leq_addr _ _); rewrite muln2 -addnn leq_add2r ltnW.
+Qed.
+
+(* This is Peterfalvi (13.8). *)
+(* We have filled a logical gap in the textbook, which quotes (13.3.c) to get *)
+(* a j such that eta_01 is a component of mu_j^tau1, then asserts that the *)
+(* (orthogonality) assumptions of (13.5) have been checked, apparently *)
+(* implying that because for zeta in calS1 \ mu_j, zeta^tau1 is orthogonal to *)
+(* mu_j^tau1, as per the proof of (13.6), zeta^tau1 must be orthogonal to *)
+(* eta_01. This is wrong, because zeta^tau1, mu_j^tau1 and eta_01 are not *)
+(* characters, but virtual characters. We need to use a more careful line of *)
+(* reasoning, using the more precise characterization of calS1 in the lemma *)
+(* S1cases above (which does use the orthogonal-constituent argument, but *)
+(* for chi_j and Res_H zeta), and the decomposition given in (13.3.c) for all *)
+(* the mu_k. *)
+Lemma FTtypeP_sum_cycTIiso01_lb :
+ \sum_(x in H^#) `|eta01 x| ^+ 2 >= #|PU|%:R - (u ^ 2)%:R.
+Proof.
+have [tau1 cohS [b _ Dtau1]] := FTtypeP_coherence.
+have Zeta01: eta01 \in 'Z[irr G] by rewrite cycTIiso_vchar.
+pose j1 := signW2 b #1; pose d : algC := (-1) ^+ b; pose mu1 := mu_ j1.
+have nzj1: j1 != 0 by [rewrite signW2_eq0 ?Iirr1_neq0]; have S1mu1 := S1mu nzj1.
+have o_mu_eta01 j: j != 0 -> '[tau1 (mu_ j), eta01] = d *+ (j == j1).
+ move/Dtau1->; rewrite -/d cfdotZl cfdot_suml big_ord_recl /=.
+ rewrite cfdot_cycTIiso andTb (inv_eq (signW2K b)).
+ by rewrite big1 ?addr0 ?mulr_natr // => i _; rewrite cfdot_cycTIiso.
+have [zeta | alpha [Zalpha kerPalpha [_]]] := calS1_split1 cohS S1mu1 Zeta01.
+ case/S1cases=> [[j nz_j ->] | /o_tau1_eta-> //].
+ by rewrite o_mu_eta01 // (inj_eq (prTIred_inj _)) => /negPf->.
+rewrite o_mu_eta01 // eqxx mulrb => -> lb_alpha.
+rewrite -ler_subl_addl cfnorm_prTIred -/q mulrAC sqrr_sign mul1r.
+rewrite mu1uq // natrM exprMn (mulrAC _ q%:R) (mulrA _ q%:R) !mulfK ?neq0CG //.
+rewrite natrX -(sdprod_card defS) natrM -mulrBl mulfK ?neq0CG //.
+rewrite addrC opprB subrK mulrACA; apply: ler_trans lb_alpha.
+apply: ler_trans (P1_int2_lb _) _; first by rewrite rpredMsign Cint_vchar1.
+by rewrite exprMn sqrr_sign mul1r lerr.
+Qed.
+
+(* These are the assumptions for (13.9); K will be set to 'F(T) in the only *)
+(* application of this lemma, in the proof of (13.10). *)
+
+Variable K : {group gT}.
+Let G0 := ~: (class_support H G :|: class_support K G).
+
+Variables (tau1 : {additive 'CF(S) -> 'CF(G)}) (lambda : 'CF(S)).
+
+Hypothesis cohS : coherent_with calS S^# tau tau1.
+Hypothesis cohSmu : typeP_TIred_coherent tau1.
+
+Hypotheses (Slam : lambda \in calS) (irrHlam : irrIndH lambda).
+
+(* This is Peterfalvi (13.9)(a). *)
+(* As this part is only used to establish (13.9.b) it can be Section-local. *)
+Let cover_G0 : {in G0, forall x, tau1 lambda x != 0 \/ eta_ #1 0 x != 0}.
+Proof.
+have [[b _ Dtau1_mu] [/= Ilam Hlam]] := (cohSmu, andP irrHlam).
+pose sum_eta1 := (-1) ^+ b *: \sum_i eta_ i #1.
+have{Dtau1_mu} [j nz_j tau1muj]: exists2 j, j != 0 & tau1 (mu_ j) = sum_eta1.
+ pose j := signW2 b #1; have nz: j != 0 by rewrite signW2_eq0 Iirr1_neq0.
+ by exists j; rewrite // Dtau1_mu // signW2K.
+move=> x; rewrite !inE => /norP[H'x _].
+have{tau1muj} ->: tau1 lambda x = sum_eta1 x.
+ rewrite -[lambda](subrK (mu_ j)) raddfD cfunE tau1muj.
+ rewrite [tau1 _ x](cfun_on0 _ H'x) ?add0r {x H'x}//=.
+ have Hmuj: mu_ j \in calH := Hmu nz_j.
+ have dmu1: (lambda - mu_ j) 1%g == 0 by rewrite !cfunE !calHuq ?subrr.
+ have H1dmu: lambda - mu_ j \in 'CF(S, H^#).
+ by rewrite cfun_onD1 rpredB ?((seqInd_on (gFnormal _ _)) setT).
+ have [_ ->] := cohS; last first.
+ by rewrite zcharD1E ?rpredB ?mem_zchar ?FTseqInd_TIred /=.
+ have A0dmu := cfun_onS (Fitting_sub_FTsupp0 maxS) H1dmu.
+ have [_ _ _ _ [_ -> //]] := FTtypeP_facts.
+ by rewrite cfInd_on ?subsetT // (cfun_onS _ H1dmu) ?imset2Sl ?subsetDl.
+apply/nandP/andP=> [[/eqP sum_eta1x_0 /eqP eta1x_0]].
+have cycW: cyclic W by have [] := ctiWG.
+have W'x: x \notin class_support (cyclicTIset defW) G.
+ apply: contra_eqN eta1x_0 => /imset2P[{x H'x sum_eta1x_0}x g Wx Gg ->].
+ rewrite cfunJ {g Gg}// cycTIiso_restrict //.
+ by rewrite lin_char_neq0 ?irr_cyclic_lin //; case/setDP: Wx.
+have nz_i1 : #1 != 0 :> Iirr W1 by rewrite Iirr1_neq0.
+have eta_x_0 i: i != 0 -> eta_ i 0 x = 0.
+ rewrite /w_ dprod_IirrEl => /(cfExp_prime_transitive pr_q nz_i1)[k co_k_p ->].
+ have: coprime k #[w_ #1 0]%CF by rewrite /w_ dprod_IirrEl cforder_sdprod.
+ rewrite rmorphX /= -dprod_IirrEl => /(cycTIiso_aut_exists ctiWG)[[uu ->] _].
+ by rewrite cfunE /= -/sigma eta1x_0 rmorph0.
+have eta_i1 i: i != 0 -> eta_ i #1 x = eta_ 0 #1 x - 1.
+ move=> nz_i; apply/eqP; pose alpha := cfCyclicTIset defW i #1.
+ have Walpha: alpha \in 'CF(W, cyclicTIset defW).
+ by rewrite (cfCycTI_on ctiWG) ?Iirr1_neq0.
+ have: sigma alpha x == 0.
+ by rewrite cycTIiso_Ind // (cfun_on0 _ W'x) ?cfInd_on ?subsetT.
+ rewrite [alpha]cfCycTI_E linearD !linearB /= !cfunE cycTIiso1 cfun1E inE.
+ by rewrite {1}eta_x_0 //= subr0 addrC addr_eq0 opprB.
+have eta11x: eta_ #1 #1 x = - (q%:R)^-1.
+ rewrite -mulN1r; apply: canRL (mulfK (neq0CG W1)) _.
+ transitivity ((-1) ^+ b * sum_eta1 x - 1); last first.
+ by rewrite sum_eta1x_0 mulr0 add0r.
+ rewrite cfunE signrMK mulr_natr -/q -nirrW1 -sumr_const sum_cfunE.
+ by rewrite !(bigD1 0 isT) /= addrAC eta_i1 // (eq_bigr _ eta_i1).
+have: - eta_ #1 #1 x \in Cint.
+ rewrite rpredN Cint_rat_Aint ?Aint_vchar ?cycTIiso_vchar //.
+ by rewrite eta11x rpredN rpredV rpred_nat.
+case/norm_Cint_ge1/implyP/idPn; rewrite eta11x opprK invr_eq0 neq0CG /=.
+by rewrite normfV normr_nat invf_ge1 ?gt0CG // lern1 -ltnNge ltnW.
+Qed.
+
+(* This is Peterfalvi (13.9)(b). *)
+Lemma FTtypeP_sum_nonFitting_lb :
+ \sum_(x in G0) (`|tau1 lambda x| ^+ 2 + `|eta_ #1 0 x| ^+ 2) >= #|G0|%:R.
+Proof.
+pose A (xi : 'CF(G)) := [set x in G0 | xi x != 0].
+suffices A_ub xi: xi \in dirr G -> #|A xi|%:R <= \sum_(x in G0) `|xi x| ^+ 2.
+ apply: ler_trans (_ : (#|A (tau1 lambda)| + #|A (eta_ #1 0)|)%:R <= _).
+ rewrite leC_nat -cardsUI /A !setIdE -setIUr (leq_trans _ (leq_addr _ _)) //.
+ rewrite subset_leq_card // subsetIidl.
+ by apply/subsetP=> x /cover_G0/orP; rewrite !inE.
+ rewrite natrD big_split ler_add ?A_ub ?cycTIiso_dirr //.
+ have [[[Itau1 Ztau1] _] [Ilam _]] := (cohS, andP irrHlam).
+ by rewrite dirrE Ztau1 ?Itau1 ?mem_zchar //= irrWnorm.
+case/dirrP=> d [t Dxi]; rewrite (big_setID [set x | xi x != 0]) /= addrC.
+rewrite -setIdE -/(A _) big1 ?add0r => [|x]; last first.
+ by rewrite !inE negbK => /andP[/eqP-> _]; rewrite normr0 expr0n.
+rewrite -sum1_card !(partition_big_imset (@cycle _)) /= natr_sum.
+apply: ler_sum => _ /imsetP[x Ax ->].
+pose B := [pred y | generator <[x]> y]; pose phi := 'Res[<[x]>] 'chi_t.
+have defA: [pred y in A xi | <[y]> == <[x]>] =i B.
+ move=> y; rewrite inE /= eq_sym andb_idl // !inE => eq_xy.
+ have LGxy L (LG := class_support L G): x \notin LG -> y \notin LG.
+ rewrite /LG class_supportEr; apply: contra => /bigcupP[g Gg Lg_y].
+ apply/bigcupP; exists g => //; move: Lg_y.
+ by rewrite -!cycle_subG (eqP eq_xy).
+ move: Ax; rewrite !inE !negb_or -andbA => /and3P[/LGxy-> /LGxy->].
+ apply: contraNneq => chi_y_0.
+ have [k co_k_y ->]: exists2 k, coprime k #[y] & x = (y ^+ k)%g.
+ have Yx: generator <[y]> x by rewrite [generator _ _]eq_sym.
+ have /cycleP[k Dx] := cycle_generator Yx; exists k => //.
+ by rewrite coprime_sym -generator_coprime -Dx.
+ have Zxi: xi \in 'Z[irr G] by rewrite Dxi rpredZsign irr_vchar.
+ have [uu <- // _] := make_pi_cfAut [group of G] co_k_y.
+ by rewrite cfunE chi_y_0 rmorph0.
+have resB: {in B, forall y, `|xi y| ^+ 2 = `|phi y| ^+ 2}.
+ move=> y /cycle_generator Xy.
+ by rewrite Dxi cfunE normrMsign cfResE ?subsetT.
+rewrite !(eq_bigl _ _ defA) sum1_card (eq_bigr _ resB).
+apply: sum_norm2_char_generators => [|y By].
+ by rewrite cfRes_char ?irr_char.
+rewrite -normr_eq0 -sqrf_eq0 -resB // sqrf_eq0 normr_eq0.
+by move: By; rewrite -defA !inE -andbA => /and3P[].
+Qed.
+
+End Thirteen_2_3_5_to_9.
+
+Section Thirteen_4_10_to_16.
+
+(* These assumptions correspond to Peterfalvi, Hypothesis (13.1), most of *)
+(* which gets used to prove (13.4) and (13.9-13). *)
+
+Variables S U W W1 W2 : {group gT}.
+Hypotheses (maxS : S \in 'M) (defW : W1 \x W2 = W).
+Hypotheses (StypeP : of_typeP S U defW).
+
+Local Notation "` 'W1'" := (gval W1) (at level 0, only parsing) : group_scope.
+Local Notation "` 'W2'" := (gval W2) (at level 0, only parsing) : group_scope.
+Local Notation "` 'W'" := (gval W) (at level 0, only parsing) : group_scope.
+Local Notation V := (cyclicTIset defW).
+
+Local Notation "` 'S'" := (gval S) (at level 0, only parsing) : group_scope.
+Local Notation P := `S`_\F%G.
+Local Notation "` 'P'" := `S`_\F (at level 0) : group_scope.
+Local Notation PU := S^`(1)%G.
+Local Notation "` 'PU'" := `S^`(1) (at level 0) : group_scope.
+Local Notation "` 'U'" := (gval U) (at level 0, only parsing) : group_scope.
+Local Notation C := 'C_U(`P)%G.
+Local Notation "` 'C'" := 'C_`U(`P) (at level 0) : group_scope.
+Local Notation H := 'F(S)%G.
+Local Notation "` 'H'" := 'F(`S) (at level 0) : group_scope.
+
+Let defS : PU ><| W1 = S. Proof. by have [[]] := StypeP. Qed.
+Let defPU : P ><| U = PU. Proof. by have [_ []] := StypeP. Qed.
+Let defH : P \x C = H. Proof. by have [] := typeP_context StypeP. Qed.
+
+Let notStype1 : FTtype S != 1%N. Proof. exact: FTtypeP_neq1 StypeP. Qed.
+Let notStype5 : FTtype S != 5%N. Proof. exact: FTtype5_exclusion maxS. Qed.
+
+Let pddS := FT_prDade_hypF maxS StypeP.
+Let ptiWS : primeTI_hypothesis S PU defW := FT_primeTI_hyp StypeP.
+Let ctiWG : cyclicTI_hypothesis G defW := pddS.
+Local Notation Sfacts := (FTtypeP_facts maxS StypeP).
+
+Let ntW1 : W1 :!=: 1. Proof. by have [[]] := StypeP. Qed.
+Let ntW2 : W2 :!=: 1. Proof. by have [_ _ _ []] := StypeP. Qed.
+Let cycW1 : cyclic W1. Proof. by have [[]] := StypeP. Qed.
+Let cycW2 : cyclic W2. Proof. by have [_ _ _ []] := StypeP. Qed.
+
+Let p := #|W2|.
+Let q := #|W1|.
+
+Let pr_p : prime p. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed.
+Let pr_q : prime q. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed.
+
+Let qgt2 : q > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
+Let pgt2 : p > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
+
+Let coPUq : coprime #|PU| q.
+Proof. by rewrite (coprime_sdprod_Hall_r defS); have [[]] := StypeP. Qed.
+
+Let sW2P: W2 \subset P. Proof. by have [_ _ _ []] := StypeP. Qed.
+
+Let p'q : q != p.
+Proof.
+by rewrite -dvdn_prime2 -?prime_coprime -?(cyclic_dprod defW) //; case: ctiWG.
+Qed.
+
+Let nirrW1 : #|Iirr W1| = q. Proof. by rewrite card_Iirr_cyclic. Qed.
+Let nirrW2 : #|Iirr W2| = p. Proof. by rewrite card_Iirr_cyclic. Qed.
+Let NirrW1 : Nirr W1 = q. Proof. by rewrite -nirrW1 card_ord. Qed.
+Let NirrW2 : Nirr W2 = p. Proof. by rewrite -nirrW2 card_ord. Qed.
+
+Local Open Scope ring_scope.
+
+Let sigma := (cyclicTIiso ctiWG).
+Let w_ i j := (cyclicTIirr defW i j).
+Local Notation eta_ i j := (sigma (w_ i j)).
+
+Let mu_ := primeTIred ptiWS.
+Local Notation tau := (FT_Dade0 maxS).
+
+Let calS0 := seqIndD PU S S`_\s 1.
+Let rmR := FTtypeP_coh_base maxS StypeP.
+Let scohS0 : subcoherent calS0 tau rmR.
+Proof. exact: FTtypeP_subcoherent StypeP. Qed.
+
+Let calS := seqIndD PU S P 1.
+Let sSS0 : cfConjC_subset calS calS0.
+Proof. exact/seqInd_conjC_subset1/Fcore_sub_FTcore. Qed.
+
+Local Notation calH := (seqIndT H S).
+Local Notation calHuq := (FTtypeP_Ind_Fitting_1 maxS StypeP).
+
+Section Thirteen_10_to_13_15.
+
+(* This section factors the assumption that S contains an irreducible induced *)
+(* from a linear character of H. It does not actually export (13.4) and *)
+(* and (4.11) but instead uses them to carry out the bulk of the proofs of *)
+(* (4.12), (4.13) and (4.15). The combinatorial bound m is also local to this *)
+(* Section, but (4.10) has to be exported from an inner Section that factors *)
+(* facts about T, the typeP pair associate of S. *)
+(* Note that u and c are bound locally to this section; we will set u = #|U| *)
+(* after this section. *)
+
+Variable lambda : 'CF(S).
+Hypotheses (Slam : lambda \in calS) (irrHlam : irrIndH lambda).
+Let Hlam : lambda \in calH. Proof. by have [] := andP irrHlam. Qed.
+Let Ilam : lambda \in irr S. Proof. by have [] := andP irrHlam. Qed.
+
+Let c := #|C|.
+Let u := #|U : C|.
+Let oU : #|U| = (u * c)%N. Proof. by rewrite mulnC Lagrange ?subsetIl. Qed.
+
+Let m : algC := 1 - q.-1%:R^-1 - q.-1%:R / (q ^ p)%:R + (q.-1 * q ^ p)%:R^-1.
+
+Section Thirteen_4_10.
+
+(* This Section factors assumptions and facts about T, including Lemma (13.4) *)
+(* is local to this Section. *)
+
+Variables T V : {group gT}.
+Hypotheses (maxT : T \in 'M) (xdefW : W2 \x W1 = W).
+Hypothesis TtypeP : of_typeP T V xdefW.
+
+Local Notation Q := (gval T)`_\F.
+Local Notation D := 'C_(gval V)(Q).
+Local Notation K := 'F(gval T).
+Let v := #|V : D|.
+
+Local Notation calT := (seqIndD T^`(1) T (gval T)`_\F 1).
+
+(* This part of the proof of (13.4) is reused in (13.10). *)
+Let tiHK: class_support H^# G :&: class_support K^# G = set0.
+Proof.
+apply/eqP/set0Pn => [[_ /setIP[/imset2P[x g1 H1x _ ->] /imset2P[xg g2]]]].
+pose g := (g2 * g1^-1)%g => /setD1P[_ Kxg] _ Dxg.
+have{Kxg Dxg} Kgx: x \in K :^ g by rewrite conjsgM mem_conjgV Dxg memJ_conjg.
+have{Kgx} cxQg: Q :^ g \subset 'C[x].
+ rewrite sub_cent1 (subsetP _ _ Kgx) // centJ conjSg centsC.
+ have [/dprodW/mulG_sub[/subset_trans-> //=]] := typeP_context TtypeP.
+ exact: FTtypeP_Fitting_abelian TtypeP.
+have{cxQg} sQgS: Q :^ g \subset S.
+ have sH1A0 := subset_trans (Fitting_sub_FTsupp maxS) (FTsupp_sub0 S).
+ have{sH1A0} A0x: x \in 'A0(S) := subsetP sH1A0 x H1x.
+ have [_ _ _ _ [tiA0 _]] := Sfacts.
+ by have:= cent1_normedTI tiA0 A0x; rewrite setTI; apply: subset_trans.
+have /pHallP[_ eq_Sq_q]: q.-Hall(S) W1.
+ have qW1: q.-group W1 by rewrite /pgroup pnat_id.
+ have [|//] := coprime_mulGp_Hall (sdprodW defS) _ qW1.
+ by rewrite /pgroup p'natE // -prime_coprime // coprime_sym.
+have:= partn_dvd q (cardG_gt0 _) (cardSg sQgS).
+rewrite cardJg /= -eq_Sq_q => /(dvdn_leq_log q (cardG_gt0 _))/idPn[].
+have [_ [_ ->] _ _ _] := FTtypeP_facts maxT TtypeP.
+by rewrite -ltnNge p_part !pfactorK // logn_prime // eqxx ltnW.
+Qed.
+
+(* This is Peterfalvi (13.4). *)
+Let T_Galois : [/\ typeP_Galois TtypeP, D = 1%g & v = (q ^ p).-1 %/ q.-1].
+Proof.
+apply: FTtypeP_no_Ind_Fitting_facts => //; apply/hasPn=> theta Ttheta.
+apply/andP=> [[/= irr_theta Ktheta]]; set calK := seqIndT _ T in Ktheta.
+have [tau1S cohS [bS _ Dtau1Smu]] := FTtypeP_coherence maxS StypeP.
+have [tau1T cohT [bT _ Dtau1Tnu]] := FTtypeP_coherence maxT TtypeP.
+have [[[Itau1S Ztau1S] Dtau1S] [[Itau1T Ztau1T] Dtau1T]] := (cohS, cohT).
+have onF0 := cfun_onS (Fitting_sub_FTsupp0 _).
+pose HG := class_support H^# G; pose KG := class_support K^# G.
+have Hdlambda xi:
+ xi \in calH -> xi \in calS -> tau1S (lambda - xi) \in 'CF(G, HG).
+- move=> Hxi Sxi; have H1dxi: lambda - xi \in 'CF(S, H^#).
+ rewrite cfun_onD1 rpredB ?((seqInd_on (gFnormal _ _)) setT) //=.
+ by rewrite !cfunE !calHuq ?subrr.
+ rewrite Dtau1S ?zcharD1E ?rpredB ?mem_zchar ?(cfun_on0 H1dxi) ?inE ?eqxx //=.
+ by have [_ _ _ _ [_ ->]] := Sfacts; rewrite ?onF0 // cfInd_on ?subsetT.
+have Kdtheta xi:
+ xi \in calK -> xi \in calT -> tau1T (theta - xi) \in 'CF(G, KG).
+- move=> Kxi Txi; have K1dxi: theta - xi \in 'CF(T, K^#).
+ rewrite cfun_onD1 rpredB ?((seqInd_on (gFnormal _ _)) setT) //=.
+ by rewrite !cfunE !(FTtypeP_Ind_Fitting_1 _ TtypeP) ?subrr.
+ rewrite Dtau1T ?zcharD1E ?rpredB ?mem_zchar ?(cfun_on0 K1dxi) ?inE ?eqxx //=.
+ have [_ _ _ _ [_ ->]] := FTtypeP_facts maxT TtypeP; last exact: onF0.
+ by rewrite cfInd_on ?subsetT.
+have oHK alpha beta:
+ alpha \in 'CF(G, HG) -> beta \in 'CF(G, KG) -> '[alpha, beta] = 0.
+- by move=> Halpha Kbeta; rewrite (cfdotElr Halpha Kbeta) tiHK big_set0 mulr0.
+have o_lambda_theta: '[tau1S lambda, tau1T theta] = 0.
+ pose S1 := lambda :: lambda^*%CF; pose T1 := theta :: theta^*%CF.
+ have sS1S: {subset S1 <= calS} by apply/allP; rewrite /= Slam cfAut_seqInd.
+ have sT1T: {subset T1 <= calT} by apply/allP; rewrite /= Ttheta cfAut_seqInd.
+ have ooS1: orthonormal (map tau1S S1).
+ rewrite map_orthonormal //; first exact: (sub_in2 (zchar_subset sS1S)).
+ apply: seqInd_conjC_ortho2 Slam; rewrite ?gFnormal ?mFT_odd //.
+ by have /mulG_sub[] := sdprodW defPU.
+ have ooT1: orthonormal (map tau1T T1).
+ rewrite map_orthonormal //; first exact: (sub_in2 (zchar_subset sT1T)).
+ apply: seqInd_conjC_ortho2 Ttheta; rewrite ?gFnormal ?mFT_odd //.
+ by have [_ [_ _ _ /sdprodW/mulG_sub[]]] := TtypeP.
+ have /andP/orthonormal_vchar_diff_ortho := conj ooS1 ooT1; apply.
+ by split; apply/allP; rewrite /= ?Ztau1S ?Ztau1T ?mem_zchar ?cfAut_seqInd.
+ have on1'G M beta: beta \in 'CF(G, class_support M^# G) -> beta 1%g = 0.
+ move/cfun_on0->; rewrite // class_supportEr -cover_imset -class_supportD1.
+ by rewrite !inE eqxx.
+ rewrite -!raddfB; set alpha := tau1S _; set beta := tau1T _.
+ have [Halpha Kbeta]: alpha \in 'CF(G, HG) /\ beta \in 'CF(G, KG).
+ by rewrite Hdlambda ?Kdtheta ?cfAut_seqInd ?cfAut_seqIndT.
+ by rewrite oHK // {1}(on1'G _ _ Halpha) (on1'G _ _ Kbeta) !eqxx.
+pose ptiWT := FT_primeTI_hyp TtypeP; pose nu_ := primeTIred ptiWT.
+have etaC := cycTIisoC (FT_cyclicTI_hyp StypeP) (FT_cyclicTI_hyp TtypeP).
+have /idPn[]: '[tau1S (lambda - mu_ #1), tau1T (theta - nu_ #1)] == 0.
+ rewrite oHK //.
+ by rewrite Hdlambda ?FTseqInd_TIred ?FTprTIred_Ind_Fitting ?Iirr1_neq0.
+ by rewrite Kdtheta ?FTseqInd_TIred ?FTprTIred_Ind_Fitting ?Iirr1_neq0.
+rewrite !raddfB /= !cfdotBl o_lambda_theta Dtau1Smu ?Dtau1Tnu ?Iirr1_neq0 //.
+rewrite !cfdotZl !cfdotZr rmorph_sign !cfdot_suml big1 => [|i _]; last first.
+ rewrite cfdotC etaC (coherent_ortho_cycTIiso TtypeP _ cohT) ?conjC0 //.
+ by apply: seqInd_conjC_subset1; apply: Fcore_sub_FTcore.
+rewrite cfdot_sumr big1 ?mulr0 ?subr0 ?add0r ?opprK => [|j _]; last first.
+ by rewrite -etaC (coherent_ortho_cycTIiso StypeP _ cohS).
+set i1 := iter bT _ #1; set j1 := iter bS _ #1.
+rewrite !mulf_eq0 !signr_eq0 (bigD1 i1) //= addrC big1 => [|i i1'i]; last first.
+ rewrite etaC cfdot_sumr big1 // => j _; rewrite cfdot_cycTIiso.
+ by rewrite (negPf i1'i) andbF.
+rewrite etaC cfdot_sumr (bigD1 j1) //= cfdot_cycTIiso !eqxx addrCA.
+rewrite big1 ?addr0 ?oner_eq0 // => j j1'j; rewrite cfdot_cycTIiso.
+by rewrite eq_sym (negPf j1'j).
+Qed.
+
+(* This is Peterfalvi (13.10). *)
+Lemma FTtypeP_compl_ker_ratio_lb : m * (p ^ q.-1)%:R / q%:R < u%:R / c%:R.
+Proof.
+have [tau1 cohS cohSmu] := FTtypeP_coherence maxS StypeP.
+pose lam1 := tau1 lambda; pose eta10 := eta_ #1 0.
+pose H1G := class_support H^# G; pose K1G := class_support K^# G.
+pose G0 := ~: (class_support H G :|: class_support K G).
+pose invJ (f : gT -> algC) := forall y x, f (x ^ y) = f x.
+pose nm2 (chi : 'CF(G)) x := `|chi x| ^+ 2; pose g : algC := #|G|%:R.
+have injJnm2 chi: invJ (nm2 chi) by move=> y x; rewrite /nm2 cfunJ ?inE.
+have nm2_dirr chi: chi \in dirr G -> g^-1 <= nm2 chi 1%g / g.
+ case/dIrrP=> d ->; rewrite -{1}[g^-1]mul1r ler_pmul2r ?invr_gt0 ?gt0CG //.
+ rewrite expr_ge1 ?normr_ge0 // cfunE normrMsign.
+ by rewrite irr1_degree normr_nat ler1n irr_degree_gt0.
+pose mean (F M : {set gT}) (f : gT -> algC) := (\sum_(x in F) f x) / #|M|%:R.
+have meanTI M (F := 'F(gval M)^#) (FG := class_support F G) f:
+ M \in 'M -> normedTI F G M -> invJ f -> mean FG G f = mean F M f.
+- move=> maxM /and3P[ntF tiF /eqP defN] fJ; apply: canLR (mulfK (neq0CG _)) _.
+ rewrite (set_partition_big _ (partition_class_support ntF tiF)) /=.
+ rewrite mulrAC -mulrA -natf_indexg ?subsetT //=.
+ have ->: #|G : M| = #|F :^: G| by rewrite card_conjugates defN.
+ rewrite mulr_natr -sumr_const; apply: eq_bigr => _ /imsetP[y _ ->].
+ by rewrite (big_imset _ (in2W (conjg_inj _))) (eq_bigr _ (in1W (fJ y))).
+have{meanTI} meanG f :
+ invJ f -> mean G G f = f 1%g / g + mean H^# S f + mean K^# T f + mean G0 G f.
+- have type24 maxM := compl_of_typeII_IV maxM _ (FTtype5_exclusion maxM).
+ have tiH: normedTI H^# G S by have/type24[] := StypeP.
+ have{type24} tiK: normedTI K^# G T by have/type24[] := TtypeP.
+ move=> fJ; rewrite -!meanTI // {1}/mean (big_setD1 1%g) // (big_setID H1G) /=.
+ rewrite [in rhs in _ + (_ + rhs)](big_setID K1G) /= -/g -!mulrDl !addrA.
+ congr ((_ + _ + _ + _) / g); rewrite ?(setIidPr _) // /H1G /K1G.
+ + by rewrite class_supportEr -cover_imset -class_supportD1 setSD ?subsetT.
+ + rewrite subsetD -setI_eq0 setIC tiHK eqxx andbT.
+ by rewrite class_supportEr -cover_imset -class_supportD1 setSD ?subsetT.
+ rewrite !class_supportEr -!cover_imset -!class_supportD1.
+ apply: eq_bigl => x; rewrite !inE andbT -!negb_or orbCA orbA orbC.
+ by case: (x =P 1%g) => //= ->; rewrite mem_class_support ?group1.
+have lam1_ub: mean G0 G (nm2 lam1) <= lambda 1%g ^+ 2 / #|S|%:R - g^-1.
+ have [[Itau1 Ztau1] _] := cohS.
+ have{Itau1} n1lam1: '[lam1] = 1 by rewrite Itau1 ?mem_zchar ?irrWnorm.
+ have{Ztau1} Zlam1: lam1 \in 'Z[irr G] by rewrite Ztau1 ?mem_zchar.
+ rewrite -ler_opp2 opprB -(ler_add2l '[lam1]) {1}n1lam1 addrCA.
+ rewrite (cfnormE (cfun_onG _)) (mulrC g^-1) [_ / g](meanG (nm2 _)) // addrK.
+ rewrite -addrA ler_add ?nm2_dirr //; first by rewrite dirrE Zlam1 n1lam1 /=.
+ rewrite ler_paddr ?divr_ge0 ?ler0n //.
+ by apply: sumr_ge0 => x _; rewrite exprn_ge0 ?normr_ge0.
+ rewrite ler_pdivl_mulr ?gt0CG // mulrBl mul1r divfK ?neq0CG //.
+ by rewrite (FTtypeP_sum_Ind_Fitting_lb StypeP).
+pose ub_lam1 : algC := (#|T^`(1)%g|%:R - (v ^ 2)%:R - #|Q|.-1%:R) / #|T|%:R.
+have [_ D_1 Dv] := T_Galois.
+have defK : K = Q by have [<-] := typeP_context TtypeP; rewrite D_1 dprodg1.
+have eta10_ub: mean G0 G (nm2 (eta_ #1 0)) <= #|G0|%:R / g - ub_lam1.
+ rewrite -ler_opp2 opprB -(ler_add2l '[eta_ #1 0]) {2}(cfnormE (cfun_onG _)).
+ rewrite (mulrC g^-1) [_ / g in rhs in _ <= rhs](meanG (nm2 _)) // addrK.
+ have ->: '[eta_ #1 0] = mean G G (fun _ => 1).
+ by rewrite /mean sumr_const cfdot_cycTIiso eqxx divff ?neq0CG.
+ rewrite meanG // [in lhs in lhs <= _]/mean !sumr_const addrACA subrr addr0.
+ rewrite [lhs in lhs <= _]addrAC -addrA -mulrDl (cardsD1 1%g Q) group1 -defK.
+ rewrite mul1r subrK ?ler_add ?ler_pmul2r ?invr_gt0 ?gt0CG //.
+ - by rewrite nm2_dirr ?cycTIiso_dirr.
+ - exact: (FTtypeP_sum_cycTIiso10_lb _ StypeP).
+ congr (_ <= _): (FTtypeP_sum_cycTIiso01_lb maxT TtypeP).
+ by apply: eq_bigr => x _; congr (nm2 _ x); apply: cycTIisoC.
+have: ub_lam1 < lambda 1%g ^+ 2 / #|S|%:R.
+ rewrite -[_ / _](subrK g^-1) ltr_spaddr ?invr_gt0 ?gt0CG //.
+ rewrite -(ler_add2r (#|G0|%:R / g)) -ler_subr_addl -addrA.
+ apply: ler_trans (ler_add lam1_ub eta10_ub).
+ rewrite -mulrDl -big_split /= ler_pmul2r ?invr_gt0 ?gt0CG //.
+ exact: FTtypeP_sum_nonFitting_lb.
+rewrite calHuq // -/u -(sdprod_card defS) -/q -(sdprod_card defPU) oU mulnC.
+rewrite mulnCA mulnAC !natrM !invfM expr2 !mulrA !mulfK ?neq0CG ?neq0CiG //.
+rewrite mulrAC ltr_pdivl_mulr ?ltr_pdivr_mulr ?gt0CG //.
+congr (_ < _); last by rewrite -mulrA mulrC.
+have [_ [_ ->] _ _ _] := Sfacts; rewrite -/p -/q.
+rewrite -{1}(ltn_predK qgt2) expnS natrM mulrA; congr (_ * _).
+have /sdprod_card oT: T^`(1) ><| W2 = T by have [[]] := TtypeP.
+rewrite /ub_lam1 -{}oT natrM invfM mulrA divfK ?mulrBl ?divff ?neq0CG //.
+have /sdprod_card <-: Q ><| V = T^`(1)%g by have [_ []] := TtypeP.
+have ->: #|V| = v by rewrite /v D_1 indexg1.
+rewrite mulnC !natrM invfM mulrA mulfK ?neq0CiG //.
+have [_ [_ oQ] _ _ _] := FTtypeP_facts maxT TtypeP; rewrite -/p -/q /= in oQ.
+rewrite Dv natf_div ?dvdn_pred_predX // oQ.
+rewrite invfM invrK -mulrA -subn1 mulVKf ?gtr_eqF ?ltr0n //; last first.
+ by rewrite subn_gt0 -(exp1n p) ltn_exp2r ltnW // ltnW.
+rewrite -oQ natrB ?cardG_gt0 // !mulrBl mul1r mulrC mulKf ?neq0CG // -invfM.
+by rewrite -natrM oQ opprD opprK addrA addrAC.
+Qed.
+
+End Thirteen_4_10.
+
+(* This is (13.10) without the dependency on T. *)
+Let gen_lb_uc : m * (p ^ q.-1)%:R / q%:R < u%:R / c%:R.
+Proof.
+have [T pairST [xdefW [V TtypeP]]] := FTtypeP_pair_witness maxS StypeP.
+by apply: FTtypeP_compl_ker_ratio_lb TtypeP; have [[]] := pairST.
+Qed.
+
+Import ssrint.
+(* This is Peterfalvi (13.11). *)
+Let lb_m_cases :
+ [/\ (*a*) (q >= 7)%N -> m > 8%:R / 10%:R,
+ (*b*) (q >= 5)%N -> m > 7%:R / 10%:R
+ & (*c*) q = 3 ->
+ m > 49%:R / 100 %:R /\ u%:R / c%:R > (p ^ 2).-1%:R / 6%:R :> algC].
+Proof.
+pose mkrat b d := fracq (b, d%:Z).
+pose test r b d := 1 - mkrat 1 r.-1 - mkrat 1 (r ^ 2)%N > mkrat b%:Z d.
+have lb_m r b d: test r.+2 b d -> (q >= r.+2)%N -> m > b%:R / d%:R.
+ rewrite /test /mkrat !fracqE !CratrE /= => ub_bd le_r_q.
+ apply: ltr_le_trans ub_bd _; rewrite ler_paddr ?invr_ge0 ?ler0n //.
+ rewrite -!addrA ler_add2l -!opprD ler_opp2 ler_add //.
+ rewrite mul1r lef_pinv ?qualifE ?ltr0n //; last by rewrite -(subnKC qgt2).
+ by rewrite leC_nat -ltnS (ltn_predK qgt2).
+ rewrite -(ltn_predK pgt2) expnSr natrM invfM mulrA.
+ rewrite ler_pdivr_mulr ?gt0CG // mulrAC mul1r -subn1.
+ rewrite ler_pmul ?invr_ge0 ?ler0n ?leC_nat ?leq_subr //.
+ rewrite lef_pinv ?qualifE ?ltr0n ?leC_nat ?expn_gt0 ?(prime_gt0 pr_q) //.
+ apply: leq_trans (_ : q ^ 2 <= _)%N; first by rewrite leq_exp2r.
+ by rewrite -(subnKC qgt2) leq_pexp2l // -subn1 ltn_subRL.
+split=> [||q3]; try by apply: lb_m; compute.
+pose d r : algC := (3 ^ r.-1)%:R^-1; pose f r := (r ^ 2)%:R * d r.
+have Dm: m = (1 - d p) / 2%:R.
+ rewrite mulrBl mul1r -mulrN mulrC /m q3 /= addrAC -addrA natrM invfM -mulrBl.
+ rewrite -{1}(ltn_predK pgt2) expnS natrM invfM mulrA.
+ by congr (_ + _ / _); apply/eqP; rewrite -!CratrE; compute.
+split; last apply: ler_lt_trans gen_lb_uc.
+ apply: ltr_le_trans (_ : (1 - d 5) / 2%:R <= _).
+ by rewrite /d -!CratrE; compute.
+ rewrite Dm ler_pmul2r ?invr_gt0 ?ltr0n // ler_add2l ler_opp2.
+ rewrite lef_pinv ?qualifE ?ltr0n ?expn_gt0 // leC_nat leq_pexp2l //=.
+ by rewrite -subn1 ltn_subRL odd_geq ?mFT_odd //= ltn_neqAle pgt2 andbT -q3.
+rewrite -mulrA mulrCA Dm -mulrA -invfM -natrM mulrA q3 mulrBr mulr1.
+rewrite ler_pmul2r ?invr_gt0 ?ltr0n //= -subn1 natrB ?expn_gt0 ?prime_gt0 //.
+rewrite ler_add2l ler_opp2 -/(f p) -(subnKC pgt2).
+elim: (p - 3)%N => [|r]; first by rewrite /f /d -!CratrE; compute.
+apply: ler_trans; rewrite addnS /f /d; set x := (3 + r)%N.
+rewrite ler_pdivr_mulr ?ltr0n ?expn_gt0 // mulrAC (expnS 3) (natrM _ 3).
+rewrite mulrA mulfK ?gtr_eqF ?ltr0n ?expn_gt0 //.
+rewrite -ler_pdivr_mull ?ltr0n // !natrX -exprVn -exprMn.
+rewrite mulrS mulrDr mulr1 mulVf ?pnatr_eq0 //.
+apply: ler_trans (_ : (3%:R^-1 + 1) ^+ 2 <= _); last by rewrite -!CratrE.
+rewrite ler_sqr ?rpredD ?rpred1 ?rpredV ?rpred_nat // ler_add2r.
+by rewrite lef_pinv ?qualifE ?ltr0n ?leC_nat.
+Qed.
+
+(* This corollary of (13.11) is used in both (13.12) and (13.15). *)
+Let small_m_q3 : m < (q * p)%:R / (q.*2.+1 * p.-1)%:R -> q = 3 /\ (p >= 5)%N.
+Proof.
+move=> ub_m; have [lb7_m lb5_m _] := lb_m_cases.
+have [p3 | p_neq3] := eqVneq p 3.
+ have ub7_m: ~~ (8%:R / 10%:R < m).
+ rewrite ltr_gtF // (ltr_le_trans ub_m) // p3 /=.
+ apply: ler_trans (_ : 3%:R / 4%:R <= _); last first.
+ by rewrite -!CratrE; compute.
+ rewrite ler_pdivl_mulr ?ltr0n // mulrAC ler_pdivr_mulr ?ltr0n ?muln_gt0 //.
+ by rewrite -!natrM leC_nat mulnCA mulSn -muln2 -!mulnA leq_addl.
+ have{ub7_m} q5: q = 5.
+ apply: contraNeq ub7_m; rewrite neq_ltn odd_ltn ?mFT_odd //= ltnS leqNgt.
+ by rewrite ltn_neqAle qgt2 -{1}p3 eq_sym p'q -(odd_geq 7) ?mFT_odd.
+ have /implyP := ltr_trans (lb5_m _) ub_m.
+ by rewrite q5 p3 -!CratrE; compute.
+have pge5: (5 <= p)%N by rewrite odd_geq ?mFT_odd // ltn_neqAle eq_sym p_neq3.
+have ub5_m: ~~ (7%:R / 10%:R < m).
+ rewrite ltr_gtF // (ltr_le_trans ub_m) //.
+ apply: ler_trans (_ : 2%:R^-1 * (1 + 4%:R^-1) <= _); last first.
+ by rewrite -!CratrE; compute.
+ rewrite !natrM invfM mulrACA ler_pmul ?divr_ge0 ?ler0n //.
+ rewrite ler_pdivr_mulr ?ler_pdivl_mull ?ltr0n // -natrM mul2n leC_nat.
+ by rewrite ltnW.
+ rewrite -(subnKC pge5) [_%:R]mulrSr mulrDl divff ?pnatr_eq0 // ler_add2l.
+ by rewrite mul1r lef_pinv ?qualifE ?ltr0n // leC_nat.
+split=> //; apply: contraNeq ub5_m.
+by rewrite neq_ltn ltnNge qgt2 -(odd_geq 5) ?mFT_odd.
+Qed.
+
+(* A more usable form for (13.10). *)
+Let gen_ub_m : m < (q * u)%:R / (c * p ^ q.-1)%:R.
+Proof.
+rewrite !natrM invfM mulrA ltr_pdivl_mulr ?ltr0n ?expn_gt0 ?cardG_gt0 //.
+by rewrite -mulrA -ltr_pdivr_mull ?gt0CG // mulrC.
+Qed.
+
+(* This is the bulk of the proof of Peterfalvi (13.12). *)
+Lemma FTtypeP_Ind_Fitting_reg_Fcore : c = 1%N.
+Proof.
+apply/eqP/wlog_neg; rewrite eqn_leq cardG_gt0 andbT -ltnNge => c_gt1.
+have ub_m: m < (q * (p ^ q).-1)%:R / (c * p ^ q.-1 * p.-1)%:R.
+ rewrite 2!natrM invfM mulrACA mulrAC -natf_div ?dvdn_pred_predX // -natrM.
+ rewrite (ltr_le_trans gen_ub_m) // ler_pmul ?invr_ge0 ?ler0n // leC_nat.
+ by rewrite leq_mul //; case: Sfacts.
+have regCW1: semiregular C W1.
+ have [[_ _ /Frobenius_reg_ker regUW1 _] _ _ _] := FTtypeP_facts maxS StypeP.
+ by move=> _ y /regUW1 regUx; rewrite setIAC regUx setI1g.
+have{regCW1} dv_2q_c1: q.*2 %| c.-1.
+ rewrite -(subnKC c_gt1) -mul2n Gauss_dvd ?coprime2n ?dvdn2 ?mFT_odd //=.
+ rewrite odd_sub ?mFT_odd -?subSn // subn2 regular_norm_dvd_pred //.
+ have /mulG_sub[_ sW1S] := sdprodW defS.
+ apply: normsI; first by have [_ []] := StypeP.
+ by rewrite (subset_trans sW1S) ?norms_cent ?gFnorm.
+have [q3 pge5]: q = 3 /\ (p >= 5)%N.
+ apply: small_m_q3; apply: (ltr_le_trans ub_m).
+ rewrite !natrM -!mulrA ler_pmul2l ?gt0CG //.
+ rewrite !invfM !mulrA -(subnKC pgt2) ler_pmul2r ?invr_gt0 ?ltr0n //.
+ rewrite ler_pdivr_mulr ?ltr0n ?expn_gt0 // mulrAC -natrM -expnS.
+ rewrite prednK ?cardG_gt0 // ler_pmul ?invr_ge0 ?ler0n ?leC_nat ?leq_pred //.
+ rewrite lef_pinv ?qualifE ?gt0CG ?ltr0n // leC_nat.
+ by rewrite -(subnKC c_gt1) ltnS dvdn_leq //= -subSn ?subn2.
+have [_ _ [//|lb_m lb_uc]] := lb_m_cases.
+pose sum3 r : algC := (r.+1 ^ 2)%:R^-1 + r.+1%:R^-1 + 1.
+have [b Dc1] := dvdnP dv_2q_c1; rewrite q3 in Dc1.
+have [b0 | b_gt0] := posnP b; first by rewrite b0 -(subnKC c_gt1) in Dc1.
+have ub3_m r a: (r < p)%N -> (a <= b)%N -> m < 3%:R / (a * 6).+1%:R * sum3 r.
+ move=> lb_p lb_b; apply: ltr_le_trans ub_m _.
+ rewrite !natrM !invfM mulrACA -!mulrA q3 ler_pmul2l ?ltr0n //.
+ rewrite -(ltn_predK c_gt1) Dc1 ler_pmul ?mulr_ge0 ?invr_ge0 ?ler0n //.
+ by rewrite lef_pinv ?qualifE ?ltr0n // leC_nat ltnS leq_mul.
+ rewrite predn_exp mulnC natrM 2!big_ord_recl big_ord1 /= /bump /= expn1.
+ rewrite -(subnKC (ltnW pgt2)) add2n in lb_p *.
+ rewrite mulfK ?pnatr_eq0 // addnA 2!natrD 2!mulrDr mulr1 {-1}natrM invfM.
+ rewrite mulrA divfK ?mulVf ?pnatr_eq0 // ler_add2r.
+ by rewrite ler_add ?lef_pinv ?qualifE ?ltr0n ?leC_nat ?leq_sqr.
+have beq1: b = 1%N.
+ apply: contraTeq lb_m; rewrite neq_ltn ltnNge b_gt0 => /(ub3_m 4) ub41.
+ by rewrite ltr_gtF // (ltr_trans (ub41 _)) // /sum3 -!CratrE; compute.
+have c7: c = 7 by rewrite -(ltn_predK c_gt1) Dc1 beq1.
+have plt11: (p < 11)%N.
+ rewrite ltnNge; apply: contraL lb_m => /ub3_m/(_ b_gt0) ub100.
+ by rewrite ltr_gtF // (ltr_trans ub100) // /sum3 -!CratrE; compute.
+have{plt11} p5: p = 5.
+ suffices: p \in [seq r <- iota q.+1 7 | prime r & coprime r c].
+ by rewrite c7 q3 inE => /eqP.
+ rewrite mem_filter mem_iota ltn_neqAle p'q q3 pgt2 pr_p (coprimeSg sW2P) //.
+ by rewrite (coprimegS _ (Ptype_Fcore_coprime StypeP)) ?subIset ?joing_subl.
+have [galS | gal'S] := boolP (typeP_Galois StypeP); last first.
+ have [H1 [_ _ _ _ []]] := typeP_Galois_Pn maxS notStype5 gal'S.
+ case/pdivP=> r pr_r r_dv_a /(dvdn_trans r_dv_a)/idPn[].
+ rewrite Ptype_factor_prime // -/p p5 (Euclid_dvdM 2 2) // gtnNdvd //.
+ rewrite odd_prime_gt2 ?(dvdn_odd (dvdn_trans r_dv_a (dvdn_indexg _ _))) //.
+ by rewrite mFT_odd.
+have{galS} u_dv_31: u %| 31.
+ have [_ _ [_ _]] := typeP_Galois_P maxS notStype5 galS.
+ rewrite Ptype_factor_prime ?Ptype_Fcompl_kernel_cent // -/p -/q p5 q3.
+ rewrite card_quotient // normsI ?normG ?norms_cent //.
+ by have [] := sdprodP defPU.
+have hallH: Hall S H.
+ rewrite /Hall -divgS ?gFsub //= -(sdprod_card defS) -(sdprod_card defPU).
+ rewrite -(dprod_card defH) -mulnA divnMl ?cardG_gt0 // -/c oU mulnAC c7.
+ have [_ [_ ->] _ _ _] := FTtypeP_facts maxS StypeP.
+ by rewrite mulnK // -/q -/p q3 p5 coprime_mulr (coprime_dvdr u_dv_31).
+rewrite -(leq_pmul2l (cardG_gt0 P)) muln1 (dprod_card defH) subset_leq_card //.
+by rewrite (Fcore_max (Hall_pi hallH)) ?gFnormal ?Fitting_nil.
+Qed.
+Local Notation c1 := FTtypeP_Ind_Fitting_reg_Fcore.
+
+(* This is the main part of the proof of Peterfalvi (13.13). *)
+Lemma FTtypeP_Ind_Fitting_nonGalois_facts :
+ ~~ typeP_Galois StypeP -> q = 3 /\ #|U| = (p.-1./2 ^ 2)%N.
+Proof.
+have even_p1: 2 %| p.-1 by rewrite -subn1 -subSS dvdn_sub ?dvdn2 //= mFT_odd.
+move=> gal'S; have{gal'S} u_dv_p2q: u %| p.-1./2 ^ q.-1.
+ have [H1 [_ _ _ _ []]] := typeP_Galois_Pn maxS notStype5 gal'S.
+ rewrite Ptype_factor_prime ?Ptype_Fcompl_kernel_cent // -/p -/q.
+ set a := #|U : _| => a_gt1 a_dv_p1 _ [Uhat isoUhat].
+ have a_odd: odd a by rewrite (dvdn_odd (dvdn_indexg _ _)) ?mFT_odd.
+ have [_ _ nPU _] := sdprodP defPU.
+ rewrite /u -card_quotient ?normsI ?normG ?norms_cent // (card_isog isoUhat).
+ apply: dvdn_trans (cardSg (subsetT _)) _; rewrite cardsT card_matrix mul1n.
+ rewrite card_ord Zp_cast ?dvdn_exp2r // -(@Gauss_dvdl a _ 2) ?coprimen2 //.
+ by rewrite -divn2 divnK.
+have [_ lb5_m lb3_m] := lb_m_cases.
+pose f r : algC := r%:R / (2 ^ r.-1)%:R.
+have ub_m: m < f q.
+ apply: ltr_le_trans gen_ub_m _; rewrite c1 mul1n.
+ rewrite natrM ler_pdivr_mulr ?ltr0n ?expn_gt0 ?cardG_gt0 // -mulrA.
+ rewrite ler_wpmul2l ?ler0n // mulrC !natrX -expr_div_n.
+ apply: ler_trans (_ : (p.-1 %/ 2)%:R ^+ q.-1 <= _).
+ by rewrite -natrX leC_nat divn2 dvdn_leq // expn_gt0 -(subnKC pgt2).
+ rewrite -(subnKC qgt2) ler_pexpn2r ?rpred_div ?rpred_nat // natf_div //.
+ by rewrite ler_wpmul2r ?invr_ge0 ?ler0n // leC_nat leq_pred.
+have{ub_m} q3: q = 3.
+ apply: contraTeq ub_m; rewrite neq_ltn ltnNge qgt2 -(odd_geq 5) ?mFT_odd //=.
+ move=> qge5; rewrite ltr_gtF // -(subnKC qge5).
+ elim: (q - 5)%N => [|r]; last apply: ler_lt_trans.
+ by apply: ltr_trans (lb5_m qge5); rewrite /f -!CratrE; compute.
+ rewrite addnS ler_pdivr_mulr ?ltr0n ?expn_gt0 // natrM mulrACA mulrA.
+ by rewrite divfK ?pnatr_eq0 ?expn_eq0 // mulr_natr mulrS ler_add2r ler1n.
+have [[]] := dvdnP u_dv_p2q; rewrite q3; first by rewrite -(subnKC pgt2).
+case=> [|b] Du; first by rewrite oU c1 Du muln1 mul1n.
+have [_ /idPn[]] := lb3_m q3; rewrite c1 divr1 ler_gtF //.
+apply: ler_trans (_ : (p.-1 ^ 2)%:R / 8%:R <= _).
+ rewrite (natrX _ 2 3) exprSr invfM mulrA natrX -expr_div_n -natf_div // divn2.
+ by rewrite -natrX Du ler_pdivl_mulr ?ltr0n // mulrC -natrM leC_nat leq_mul.
+rewrite -!subn1 (subn_sqr p 1) !natrM -!mulrA ler_wpmul2l ?ler0n //.
+rewrite ler_pdivr_mulr 1?mulrAC ?ler_pdivl_mulr ?ltr0n // -!natrM leC_nat.
+rewrite (mulnA _ 3 2) (mulnA _ 4 2) leq_mul // mulnBl mulnDl leq_subLR.
+by rewrite addnCA (mulnSr p 3) -addnA leq_addr.
+Qed.
+
+(* This is the bulk of the proof of Peterfalvi (13.15). *)
+(* We improve slightly on the end of the argument by maing better use of the *)
+(* bound on u to get p = 5 directly. *)
+Lemma FTtypeP_Ind_Fitting_Galois_ub b :
+ (p ^ q).-1 %/ p.-1 = (b * u)%N -> (b <= q.*2)%N.
+Proof.
+move=> Dbu; have: U :!=: 1%g by have [[_ _ /Frobenius_context[]]] := Sfacts.
+rewrite trivg_card1 oU c1 muln1 leqNgt; apply: contra => bgt2q.
+have [|q3 pge5] := small_m_q3.
+ apply: ltr_le_trans gen_ub_m _; rewrite c1 mul1n !natrM -!mulrA.
+ rewrite ler_wpmul2l ?ler0n // ler_pdivr_mulr ?ltr0n ?expn_gt0 ?cardG_gt0 //.
+ rewrite mulrAC invfM -natrM -expnS prednK ?cardG_gt0 // mulrCA.
+ rewrite ler_pdivl_mull ?ltr0n // -natrM.
+ apply: ler_trans (_ : (b * u)%:R <= _); first by rewrite leC_nat leq_mul.
+ rewrite -Dbu natf_div ?dvdn_pred_predX // ler_wpmul2r ?invr_ge0 ?ler0n //.
+ by rewrite leC_nat leq_pred.
+have ub_p: ((p - 3) ^ 2 < 4 ^ 2)%N.
+ have [_ _ [] // _] := lb_m_cases; rewrite c1 divr1 ltr_pdivr_mulr ?ltr0n //.
+ rewrite -natrM ltC_nat prednK ?expn_gt0 ?cardG_gt0 // => /(leq_mul bgt2q).
+ rewrite mulnC mulnA -Dbu q3 predn_exp mulKn; last by rewrite -(subnKC pgt2).
+ rewrite 2!big_ord_recl big_ord1 /= /bump /= !mulnDl expn0 expn1.
+ rewrite addnA mulnS leq_add2r -(leq_add2r 9) (mulnCA p 2 3) -addnA addnCA.
+ by rewrite -leq_subLR -(sqrn_sub pgt2).
+have{ub_p pge5} p5: p = 5.
+ apply/eqP; rewrite eqn_leq pge5 andbT.
+ by rewrite ltn_sqr ltnS leq_subLR -ltnS odd_ltn ?mFT_odd in ub_p.
+have bgt1: (1 < b)%N by rewrite -(subnKC bgt2q) q3.
+rewrite -(eqn_pmul2l (ltnW bgt1)) muln1 eq_sym.
+by apply/eqP/prime_nt_dvdP; rewrite ?dvdn_mulr ?gtn_eqF // -Dbu q3 p5.
+Qed.
+
+End Thirteen_10_to_13_15.
+
+(* This is Peterfalvi (13.12). *)
+Lemma FTtypeP_reg_Fcore : C :=: 1%g.
+Proof.
+have [] := boolP (has irrIndH calS); last first.
+ by case/(FTtypeP_no_Ind_Fitting_facts maxS StypeP).
+by case/hasP=> lambda Slam /FTtypeP_Ind_Fitting_reg_Fcore/card1_trivg->.
+Qed.
+
+Lemma Ptype_Fcompl_kernel_trivial : Ptype_Fcompl_kernel StypeP :=: 1%g.
+Proof. by rewrite Ptype_Fcompl_kernel_cent ?FTtypeP_reg_Fcore. Qed.
+
+(* Since C is trivial, from here on u will denote #|U|. *)
+Let u := #|U|.
+Let ustar := (p ^ q).-1 %/ p.-1.
+
+(* This is Peterfalvi (13.13). *)
+Lemma FTtypeP_nonGalois_facts :
+ ~~ typeP_Galois StypeP -> q = 3 /\ u = (p.-1./2 ^ 2)%N.
+Proof.
+move=> gal'S; have: has irrIndH calS.
+ by apply: contraR gal'S => /(FTtypeP_no_Ind_Fitting_facts maxS StypeP)[].
+by case/hasP=> lambda Slam /FTtypeP_Ind_Fitting_nonGalois_facts; apply.
+Qed.
+
+Import FinRing.Theory.
+
+(* This is Peterfalvi (13.14). *)
+Lemma FTtypeP_primes_mod_cases :
+ [/\ odd ustar,
+ p == 1 %[mod q] -> q %| ustar
+ & p != 1 %[mod q] ->
+ [/\ coprime ustar p.-1, ustar == 1 %[mod q]
+ & forall b, b %| ustar -> b == 1 %[mod q]]].
+Proof.
+have ustar_mod r: p = 1 %[mod r] -> ustar = q %[mod r].
+ move=> pr1; rewrite -[q]card_ord -sum1_card /ustar predn_exp //.
+ rewrite -(subnKC pgt2) mulKn // subnKC //.
+ elim/big_rec2: _ => // i s1 s2 _ eq_s12.
+ by rewrite -modnDm -modnXm pr1 eq_s12 modnXm modnDm exp1n.
+have ustar_odd: odd ustar.
+ by apply: (can_inj oddb); rewrite -modn2 ustar_mod ?modn2 ?mFT_odd.
+split=> // [p1_q|p'1_q]; first by rewrite /dvdn ustar_mod ?modnn //; apply/eqP.
+have ustar_gt0: (ustar > 0)%N by rewrite odd_geq.
+have [p1_gt0 p_gt0]: (p.-1 > 0 /\ p > 0)%N by rewrite -(subnKC pgt2).
+have co_ustar_p1: coprime ustar p.-1.
+ rewrite coprime_pi' //; apply/pnatP=> //= r pr_r.
+ rewrite inE -subn1 -eqn_mod_dvd //= mem_primes pr_r ustar_gt0 => /eqP rp1.
+ rewrite /dvdn ustar_mod // [_ == _]dvdn_prime2 //.
+ by apply: contraNneq p'1_q => <-; apply/eqP.
+suffices ustar_mod_q b: b %| ustar -> b == 1 %[mod q].
+ by split; rewrite // ustar_mod_q.
+move=> b_dv_ustar; have b_gt0 := dvdn_gt0 ustar_gt0 b_dv_ustar.
+rewrite (prod_prime_decomp b_gt0) prime_decompE big_map /= big_seq.
+elim/big_rec: _ => // r s /(pi_of_dvd b_dv_ustar ustar_gt0).
+rewrite mem_primes -modnMml -modnXm => /and3P[pr_r _ r_dv_ustar].
+suffices{s} ->: r = 1 %[mod q] by rewrite modnXm modnMml exp1n mul1n.
+apply/eqP; rewrite eqn_mod_dvd ?prime_gt0 // subn1.
+have ->: r.-1 = #|[set: {unit 'F_r}]|.
+ rewrite card_units_Zp ?prime_gt0 ?pdiv_id //.
+ by rewrite -[r]expn1 totient_pfactor ?muln1.
+have pq_r: p%:R ^+ q == 1 :> 'F_r.
+ rewrite -subr_eq0 -natrX -(@natrB _ _ 1) ?expn_gt0 ?cardG_gt0 // subn1.
+ rewrite -(divnK (dvdn_pred_predX p q)) -Fp_nat_mod //.
+ by rewrite -modnMml (eqnP r_dv_ustar) mod0n.
+have Up_r: (p%:R : 'F_r) \is a GRing.unit.
+ by rewrite -(unitrX_pos _ (prime_gt0 pr_q)) (eqP pq_r) unitr1.
+congr (_ %| _): (order_dvdG (in_setT (FinRing.unit 'F_r Up_r))).
+apply/prime_nt_dvdP=> //; last by rewrite order_dvdn -val_eqE val_unitX.
+rewrite -dvdn1 order_dvdn -val_eqE /= -subr_eq0 -val_eqE -(@natrB _ p 1) //=.
+rewrite subn1 val_Fp_nat //; apply: contraFN (esym (mem_primes r 1)).
+by rewrite pr_r /= -(eqnP co_ustar_p1) dvdn_gcd r_dv_ustar.
+Qed.
+
+(* This is Peterfalvi (13.15). *)
+Lemma card_FTtypeP_Galois_compl :
+ typeP_Galois StypeP -> u = (if p == 1 %[mod q] then ustar %/ q else ustar).
+Proof.
+case/typeP_Galois_P=> //= _ _ [_ _ /dvdnP[b]]; rewrite Ptype_factor_prime //.
+rewrite -/ustar Ptype_Fcompl_kernel_trivial -(card_isog (quotient1_isog _)) -/u.
+move=> Dbu; have ub_b: (b <= q.*2)%N.
+ have [[lambda Slam irrHlam]| ] := altP (@hasP _ irrIndH calS).
+ apply: (FTtypeP_Ind_Fitting_Galois_ub Slam irrHlam).
+ by rewrite FTtypeP_reg_Fcore indexg1.
+ case/(FTtypeP_no_Ind_Fitting_facts maxS StypeP) => _ /= ->.
+ rewrite indexg1 -/ustar -(leq_pmul2r (cardG_gt0 U)) -/u => Du.
+ by rewrite -Dbu -Du -(subnKC qgt2) leq_pmull.
+have [ustar_odd p1_q p'1_q] := FTtypeP_primes_mod_cases.
+have b_odd: odd b by rewrite Dbu odd_mul mFT_odd andbT in ustar_odd.
+case: ifPn => [/p1_q q_dv_ustar | /p'1_q[_ _ /(_ b)]].
+ have /dvdnP[c Db]: q %| b.
+ rewrite Dbu Gauss_dvdl // coprime_sym in q_dv_ustar.
+ by apply: coprimeSg coPUq; have /mulG_sub[_ sUPU] := sdprodW defPU.
+ have c_odd: odd c by rewrite Db odd_mul mFT_odd andbT in b_odd.
+ suffices /eqP c1: c == 1%N by rewrite Dbu Db c1 mul1n mulKn ?prime_gt0.
+ rewrite eqn_leq odd_gt0 // andbT -ltnS -(odd_ltn 3) // ltnS.
+ by rewrite -(leq_pmul2r (ltnW (ltnW qgt2))) -Db mul2n.
+have Db: b = (b - 1).+1 by rewrite subn1 prednK ?odd_gt0.
+rewrite Dbu dvdn_mulr // eqn_mod_dvd Db // -Db => /(_ isT)/dvdnP[c Db1].
+have c_even: ~~ odd c by rewrite Db Db1 /= odd_mul mFT_odd andbT in b_odd.
+suffices /eqP->: b == 1%N by rewrite mul1n.
+have:= ub_b; rewrite Db Db1 -mul2n ltn_pmul2r ?cardG_gt0 //.
+by rewrite -ltnS odd_ltn //= !ltnS leqn0 => /eqP->.
+Qed.
+
+(* This is Peterfalvi (13.16). *)
+(* We have transposed T and Q here so that the lemma does not require *)
+(* assumptions on the associate group. *)
+Lemma FTtypeP_norm_cent_compl : P ><| W1 = 'N(W2) /\ P ><| W1 = 'C(W2).
+Proof.
+have [/mulG_sub[_ sW1S] /mulG_sub[sPPU sUPU]] := (sdprodW defS, sdprodW defPU).
+have nPW1: W1 \subset 'N(P) by rewrite (subset_trans sW1S) ?gFnorm.
+have [[_ _ frobUW1 cUU] [abelP _] _ _ _] := Sfacts.
+have [pP cPP _] := and3P abelP; have [_ _ cW12 tiW12] := dprodP defW.
+have cW2P: P \subset 'C(W2) by rewrite sub_abelian_cent.
+suffices sNPW2: 'N(W2) \subset P <*> W1.
+ have cW2PW1: P <*> W1 \subset 'C(W2) by rewrite join_subG cW2P centsC.
+ rewrite sdprodEY ?coprime_TIg ?(coprimeSg sPPU) //.
+ split; apply/eqP; rewrite eqEsubset ?(subset_trans cW2PW1) ?cent_sub //.
+ by rewrite (subset_trans (cent_sub _)).
+have tiP: normedTI P^# G S.
+ have [_ _ _] := compl_of_typeII_IV maxS StypeP notStype5.
+ by rewrite -defH FTtypeP_reg_Fcore dprodg1.
+have ->: 'N(W2) = 'N_S(W2).
+ apply/esym/setIidPr/subsetP=> y nW2y; have [x W2x ntx] := trivgPn _ ntW2.
+ have [_ _ tiP_J] := normedTI_memJ_P tiP.
+ by rewrite -(tiP_J x) ?inE ?conjg_eq1 // ntx (subsetP sW2P) ?memJ_norm.
+rewrite -{1}(sdprodW defS) setIC -group_modr ?cents_norm 1?centsC //=.
+rewrite mulG_subG joing_subr /= -(sdprodW defPU) setIC.
+rewrite -group_modl ?cents_norm //= mulG_subG joing_subl /= andbT.
+set K := 'N_U(W2).
+have nPKW1: K <*> W1 \subset 'N(P).
+ rewrite (subset_trans _ (gFnorm _ _)) // -(sdprodWY defS) genS ?setSU //.
+ by rewrite subIset ?sUPU.
+have nW2KW1: K <*> W1 \subset 'N(W2).
+ by rewrite join_subG subsetIr cents_norm // centsC.
+have coPKW1: coprime #|P| #|K <*> W1|.
+ by rewrite (coprimegS _ (Ptype_Fcore_coprime StypeP)) ?genS ?setSU ?subsetIl.
+have p'KW1: p^'.-group (K <*> W1).
+ by rewrite /pgroup p'natE // -prime_coprime ?(coprimeSg sW2P).
+have [Q1 defP nQ1KW1] := Maschke_abelem abelP p'KW1 sW2P nPKW1 nW2KW1.
+have [-> | ntK] := eqVneq K 1%g; first by rewrite sub1G.
+have frobKW1: [Frobenius K <*> W1 = K ><| W1].
+ apply: Frobenius_subl frobUW1; rewrite ?subsetIl //.
+ rewrite normsI ?norms_norm //; first by have [_ []] := StypeP.
+ by rewrite cents_norm // centsC.
+have regQ1W1: 'C_Q1(W1) = 1%g.
+ have [_ /mulG_sub[_ /setIidPl defQ1] _ tiW2Q1] := dprodP defP.
+ by rewrite -defQ1 -setIA (typeP_cent_core_compl StypeP) setIC.
+have cQ1K: K \subset 'C(Q1).
+ have /mulG_sub[_ sQ1P] := dprodW defP; have coQ1KW1 := coprimeSg sQ1P coPKW1.
+ have solQ1 := solvableS sQ1P (abelian_sol cPP).
+ by have [_ ->] := Frobenius_Wielandt_fixpoint frobKW1 nQ1KW1 coQ1KW1 solQ1.
+have /subsetIP[_ cW1K]: K \subset 'C_(K <*> W1)(W2).
+ have cCW1: W1 \subset 'C_(K <*> W1)(W2) by rewrite subsetI joing_subr centsC.
+ apply: contraR ntW1 => /(Frobenius_normal_proper_ker frobKW1) ltCK.
+ rewrite -subG1; have [/eqP/sdprodP[_ _ _ <-] _] := andP frobKW1.
+ rewrite subsetIidr (subset_trans cCW1) // proper_sub //.
+ rewrite ltCK //; last by rewrite norm_normalI ?norms_cent.
+ by rewrite (solvableS _ (abelian_sol cUU)) ?subsetIl.
+case/negP: ntK; rewrite -subG1 -FTtypeP_reg_Fcore subsetI subsetIl /=.
+by rewrite -(dprodW defP) centM subsetI cW1K.
+Qed.
+
+End Thirteen_4_10_to_16.
+
+Section Thirteen_17_to_19.
+
+(* These assumptions repeat the part of Peterfalvi, Hypothesis (13.1) used *)
+(* to prove (13.17-19). *)
+
+Variables S U W W1 W2 : {group gT}.
+Hypotheses (maxS : S \in 'M) (defW : W1 \x W2 = W).
+Hypotheses (StypeP : of_typeP S U defW).
+
+Local Notation "` 'W1'" := (gval W1) (at level 0, only parsing) : group_scope.
+Local Notation "` 'W2'" := (gval W2) (at level 0, only parsing) : group_scope.
+Local Notation "` 'W'" := (gval W) (at level 0, only parsing) : group_scope.
+Local Notation V := (cyclicTIset defW).
+
+Local Notation "` 'S'" := (gval S) (at level 0, only parsing) : group_scope.
+Local Notation P := `S`_\F%G.
+Local Notation "` 'P'" := `S`_\F (at level 0) : group_scope.
+Local Notation PU := S^`(1)%G.
+Local Notation "` 'PU'" := `S^`(1) (at level 0) : group_scope.
+Local Notation "` 'U'" := (gval U) (at level 0, only parsing) : group_scope.
+
+Let defS : PU ><| W1 = S. Proof. by have [[]] := StypeP. Qed.
+Let defPU : P ><| U = PU. Proof. by have [_ []] := StypeP. Qed.
+
+Let notStype1 : FTtype S != 1%N. Proof. exact: FTtypeP_neq1 StypeP. Qed.
+Let notStype5 : FTtype S != 5%N. Proof. exact: FTtype5_exclusion maxS. Qed.
+
+Let pddS := FT_prDade_hypF maxS StypeP.
+Let ptiWS : primeTI_hypothesis S PU defW := FT_primeTI_hyp StypeP.
+Let ctiWG : cyclicTI_hypothesis G defW := pddS.
+Local Notation Sfacts := (FTtypeP_facts maxS StypeP).
+
+Let ntW1 : W1 :!=: 1. Proof. by have [[]] := StypeP. Qed.
+Let ntW2 : W2 :!=: 1. Proof. by have [_ _ _ []] := StypeP. Qed.
+Let cycW1 : cyclic W1. Proof. by have [[]] := StypeP. Qed.
+Let cycW2 : cyclic W2. Proof. by have [_ _ _ []] := StypeP. Qed.
+
+Let p := #|W2|.
+Let q := #|W1|.
+
+Let pr_p : prime p. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed.
+Let pr_q : prime q. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed.
+
+Let qgt2 : q > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
+Let pgt2 : p > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
+
+Let coPUq : coprime #|PU| q.
+Proof. by rewrite (coprime_sdprod_Hall_r defS); have [[]] := StypeP. Qed.
+
+Let sW2P: W2 \subset P. Proof. by have [_ _ _ []] := StypeP. Qed.
+
+Let p'q : q != p.
+Proof.
+by rewrite -dvdn_prime2 -?prime_coprime -?(cyclic_dprod defW) //; case: ctiWG.
+Qed.
+
+Let nirrW1 : #|Iirr W1| = q. Proof. by rewrite card_Iirr_cyclic. Qed.
+Let nirrW2 : #|Iirr W2| = p. Proof. by rewrite card_Iirr_cyclic. Qed.
+Let NirrW1 : Nirr W1 = q. Proof. by rewrite -nirrW1 card_ord. Qed.
+Let NirrW2 : Nirr W2 = p. Proof. by rewrite -nirrW2 card_ord. Qed.
+
+Local Open Scope ring_scope.
+
+Let sigma := (cyclicTIiso ctiWG).
+Let w_ i j := (cyclicTIirr defW i j).
+Local Notation eta_ i j := (sigma (w_ i j)).
+
+Let mu_ := primeTIred ptiWS.
+Local Notation tau := (FT_Dade0 maxS).
+
+Let calS0 := seqIndD PU S S`_\s 1.
+Let rmR := FTtypeP_coh_base maxS StypeP.
+Let scohS0 : subcoherent calS0 tau rmR.
+Proof. exact: FTtypeP_subcoherent StypeP. Qed.
+
+Let calS := seqIndD PU S P 1.
+Let sSS0 : cfConjC_subset calS calS0.
+Proof. exact/seqInd_conjC_subset1/Fcore_sub_FTcore. Qed.
+
+(* This is Peterfalvi (13.17). *)
+Lemma FTtypeII_support_facts T L (Q := T`_\F) (H := L`_\F) :
+ FTtype S == 2 -> typeP_pair S T defW -> L \in 'M('N(U)) ->
+ [/\ (*a*) [Frobenius L with kernel H],
+ (*b*) U \subset H
+ & (*c*) H ><| W1 = L \/ (exists2 y, y \in Q & H ><| (W1 <*> W2 :^ y) = L)].
+Proof.
+move=> Stype2 pairST /setIdP[maxL sNU_L].
+have [pgt0 qgt0] := (ltnW (ltnW pgt2), ltnW (ltnW qgt2)).
+have [[_ _ maxT] _ _ _ allST] := pairST.
+have [[_ ntU _ _] _ not_sNU_S _ _] := compl_of_typeII maxS StypeP Stype2.
+have [[_ _ frobUW1 cUU] _ _ _ _] := Sfacts.
+have xdefW: W2 \x W1 = W by rewrite dprodC.
+have [V TtypeP] := typeP_pairW (typeP_pair_sym xdefW pairST).
+have [abelQ oQ]: q.-abelem Q /\ #|Q| = (q ^ p)%N.
+ by have [] := FTtypeP_facts maxT TtypeP.
+have sUL: U \subset L := subset_trans (normG U) sNU_L.
+have [/mulG_sub[sPPU sUPU] sPUS] := (sdprodW defPU, der_sub 1 S).
+have nUW1: W1 \subset 'N(U) by have [_ []] := StypeP.
+have sW1L := subset_trans nUW1 sNU_L.
+have Ltype1: FTtype L == 1%N.
+ apply: contraR not_sNU_S => /allST/setUP[]// /imsetP[y _ defL].
+ have hallU: \pi(U).-Hall(S) U.
+ have /Hall_pi/(subHall_Hall _ (piSg sUPU)): Hall PU U.
+ have /pHall_Hall:= pHall_subl sPPU sPUS (Fcore_Hall S).
+ by rewrite (sdprod_Hall defPU).
+ by apply; rewrite Hall_pi // -(coprime_sdprod_Hall_l defS).
+ have hallUy: \pi(U).-Hall(S) (U :^ y^-1).
+ by rewrite pHallE sub_conjgV -defL sUL /= cardJg -(card_Hall hallU).
+ have [x /conjGid <- ->] := Hall_trans (mmax_sol maxS) hallU hallUy.
+ by rewrite !normJ conjSg sub_conjgV -defL.
+ have oH: #|H| = (q ^ p)%N by rewrite /H defL FcoreJ cardJg.
+ have sW1H: W1 \subset H.
+ rewrite (sub_normal_Hall (Fcore_Hall L)) ?gFnormal //=.
+ by rewrite oH pi_of_exp ?prime_gt0 // pgroup_pi.
+ have regUW1: 'C_U(W1) = 1%g := Frobenius_trivg_cent frobUW1.
+ have /negP[] := ntU; rewrite -subG1 -regUW1 subsetIidl (sameP commG1P trivgP).
+ have /coprime_TIg <-: coprime #|U| #|H|.
+ by rewrite oH coprime_pexpr ?(coprimeSg sUPU).
+ rewrite commg_subI //; last by rewrite subsetI sW1H.
+ by rewrite subsetIidl (subset_trans sUL) ?gFnorm.
+have frobL := FTtype1_Frobenius maxL Ltype1.
+have solH: solvable H by rewrite nilpotent_sol ?Fcore_nil.
+have coHW1: coprime #|H| #|W1|.
+ rewrite -(coprime_pexpr _ _ pgt0) -oQ.
+ apply/(coprimegS (Fcore_sub_FTcore maxT))/(coprimeSg (Fcore_sub_FTcore maxL)).
+ have [_ -> //] := FT_Dade_support_partition gT.
+ have: FTtype T != 1%N := FTtypeP_neq1 maxT TtypeP.
+ by apply: contra => /imsetP[y _ ->] /=; rewrite FTtypeJ.
+have tiHW1: H :&: W1 = 1%g := coprime_TIg coHW1.
+have sUH: U \subset H; last split=> //.
+ have [ntH _ /andP[sHL nHL] regHL] := Frobenius_kerP frobL.
+ have regHE E: gval E != 1%g -> E \subset L -> H :&: E = 1%g -> 'C_H(E) = 1%g.
+ move=> ntE sEL tiHE; apply: contraNeq ntE => /trivgPn[x /setIP[Hx cEx] ntx].
+ rewrite -subG1 -tiHE subsetIidr (subset_trans _ (regHL x _)) ?inE ?ntx //.
+ by rewrite subsetI sEL sub_cent1.
+ suffices /trivgPn[x /setIP[Hx Ux] ntx]: H :&: U != 1%g.
+ apply: subset_trans (regHL x _); last by rewrite !inE ntx.
+ by rewrite subsetI sUL sub_cent1 (subsetP cUU).
+ apply: contraNneq (ntH) => tiHU; rewrite trivg_card1.
+ have [nHU nHW1] := (subset_trans sUL nHL, subset_trans sW1L nHL).
+ have nHUW1: U <*> W1 \subset 'N(H) by rewrite join_subG nHU.
+ have coHUW1: coprime #|H| #|U <*> W1|.
+ have [/eqP defUW1 _] := andP frobUW1.
+ rewrite (sdprodWY defUW1) -(sdprod_card defUW1) coprime_mulr coHW1 andbT.
+ have defHU: H ><| U = H <*> U by rewrite sdprodEY.
+ rewrite (coprime_sdprod_Hall_l defHU).
+ apply: pHall_Hall (pHall_subl (joing_subl _ _) _ (Fcore_Hall L)).
+ by rewrite join_subG sHL.
+ have [_ _] := Frobenius_Wielandt_fixpoint frobUW1 nHUW1 coHUW1 solH.
+ by move->; rewrite regHE // cards1 exp1n.
+have [E sW1E frobHE]: exists2 E, W1 \subset gval E & [Frobenius L = H ><| E].
+ have [E frobHE] := existsP frobL; have [/eqP defL _] := andP frobHE.
+ have hallE: \pi(H)^'.-Hall(L) E.
+ by rewrite -(compl_pHall E (Fcore_Hall L)) sdprod_compl.
+ have [|x Lx sW1Ex] := Hall_subJ (mmax_sol maxL) hallE sW1L.
+ by rewrite /pgroup -coprime_pi' ?cardG_gt0.
+ rewrite -(FrobeniusJ x) conjGid // (normsP (gFnorm _ _)) // in frobHE.
+ by exists (E :^ x)%G.
+have [defL ntH ntE _ _] := Frobenius_context frobHE.
+have [_ sEL _ nHE _] := sdprod_context defL.
+have solE := solvableS sEL (mmax_sol maxL).
+have [regHE regEH] := (Frobenius_reg_ker frobHE, Frobenius_reg_compl frobHE).
+have qW1: q.-group W1 by apply: pnat_id.
+have cycEr (r : nat) R: r.-group R -> R \subset E -> cyclic R.
+ move=> rR sRE; have nHR := subset_trans sRE nHE.
+ apply: odd_regular_pgroup_cyclic rR (mFT_odd _) ntH nHR _.
+ by move=> y /setD1P[nty Ry]; rewrite regHE // !inE nty (subsetP sRE).
+have /normal_norm nW1E: W1 <| E.
+ exact: prime_odd_regular_normal (mFT_odd E) _ _ _ (Frobenius_reg_ker frobHE).
+have defNW1: Q ><| W2 = 'N(W1).
+ by have [] := FTtypeP_norm_cent_compl maxT TtypeP.
+have [nsQN sW2N _ _ _] := sdprod_context defNW1.
+have sylQ: q.-Sylow('N(W1)) Q.
+ rewrite /pHall normal_sub // abelem_pgroup //=.
+ by rewrite -(index_sdprod defNW1) pnatE //= !inE eq_sym.
+have hallW2: q^'.-Hall('N(W1)) W2 by rewrite -(compl_pHall _ sylQ) sdprod_compl.
+pose Q1 := Q :&: E; have sylQ1: q.-Sylow(E) Q1 by apply: setI_normal_Hall nW1E.
+have defQ1: Q1 = W1.
+ have abelQ1: q.-abelem Q1 := abelemS (subsetIl Q E) abelQ.
+ have sW1Q: W1 \subset Q by have [_ _ _ []] := TtypeP.
+ have sW1Q1: W1 \subset Q1 by apply/subsetIP.
+ have ntQ1: Q1 != 1%g by apply: subG1_contra ntW1.
+ apply/esym/eqP; rewrite eqEcard sW1Q1 (cyclic_abelem_prime abelQ1) //=.
+ by rewrite (cycEr q) ?(pHall_pgroup sylQ1) ?subsetIr.
+have [P2 hallP2] := Hall_exists q^' solE; have [sP2E q'P2 _] := and3P hallP2.
+have defE: W1 ><| P2 = E.
+ apply/(sdprod_normal_p'HallP _ hallP2); rewrite /= -defQ1 //.
+ by rewrite /Q1 setIC norm_normalI // (subset_trans nW1E) ?normal_norm.
+have [P2_1 | ntP2] := eqsVneq P2 1%g.
+ by left; rewrite -defE P2_1 sdprodg1 in defL.
+have solNW1: solvable 'N(W1).
+ by rewrite mFT_sol ?mFT_norm_proper // mFT_sol_proper (solvableS sW1E).
+have [zy /=] := Hall_subJ solNW1 hallW2 (subset_trans sP2E nW1E) q'P2.
+rewrite -{1}(sdprodWC defNW1) => /mulsgP[z y W2z Qy ->{zy}].
+rewrite conjsgM (conjGid W2z) {z W2z} => sP2W2y.
+right; exists y => //; congr (_ ><| _ = _): defL.
+rewrite -(sdprodWY defE); congr (W1 <*> _).
+by apply/eqP; rewrite eqEsubset sP2W2y prime_meetG ?cardJg ?(setIidPr _).
+Qed.
+
+Local Notation Imu2 := (primeTI_Iirr ptiWS).
+Local Notation mu2_ i j := (primeTIirr ptiWS i j).
+
+Definition FTtypeP_bridge j := 'Ind[S, P <*> W1] 1 - mu2_ 0 j.
+Local Notation beta_ := FTtypeP_bridge.
+Definition FTtypeP_bridge_gap := tau (beta_ #1) - 1 + eta_ 0 #1.
+Local Notation Gamma := FTtypeP_bridge_gap.
+
+Let u := #|U|.
+
+(* This is Peterfalvi (13.18). *)
+(* Part (d) is stated with a slightly weaker hypothesis that fits better with *)
+(* the usage pattern in (13.19) and (14.9). *)
+Lemma FTtypeP_bridge_facts (V_S := class_support (cyclicTIset defW) S) :
+ [/\ (*a*) [/\ forall j, j != 0 -> beta_ j \in 'CF(S, 'A0(S))
+ & forall j, j != 0 -> beta_ j \in 'CF(S, P^# :|: V_S)],
+ (*b*) forall j, j != 0 -> '[beta_ j] = (u.-1 %/ q + 2)%:R,
+ (*c*) [/\ forall j, j != 0 -> tau (beta_ j) - 1 + eta_ 0 j = Gamma,
+ '[Gamma, 1] = 0 & cfReal Gamma],
+ (*d*) forall X Y : 'CF(G),
+ Gamma = X + Y -> '[X, Y] = 0 ->
+ orthogonal Y (map sigma (irr W)) ->
+ '[Y] <= (u.-1 %/ q)%:R
+ & q %| u.-1].
+Proof.
+have [_ sW1S _ nPUW1 tiPUW1] := sdprod_context defS.
+have /mulG_sub[sPPU sUPU] := sdprodW defPU.
+have sPW1S: P <*> W1 \subset S by rewrite join_subG gFsub.
+have /= defS_P := Ptype_Fcore_sdprod StypeP; have nsPS: P <| S := gFnormal _ _.
+have defPW1: P ><| W1 = P <*> W1 := sdprod_subr defS_P (joing_subr U W1).
+pose W1bar := (W1 / P)%g; pose Sbar := (S / P)%g; pose Ubar := (U / P)%g.
+pose gamma := 'Ind[Sbar, W1bar] 1.
+have Dgamma: 'Ind[S, P <*> W1] 1 = (gamma %% P)%CF.
+ rewrite -(rmorph1 _ : 1 %% P = 1)%CF cfIndMod ?joing_subl //.
+ by rewrite quotientYidl //; have [] := sdprodP defPW1.
+have gamma1: gamma 1%g = u%:R.
+ rewrite -cfMod1 -Dgamma cfInd1 // cfun11 -divgS // -(sdprod_card defPW1).
+ by rewrite mulr1 -(sdprod_card defS) -(sdprod_card defPU) divnMr // mulKn.
+have frobUW1: [Frobenius U <*> W1 = U ><| W1] by have [[]] := Sfacts.
+have q_dv_u1: q %| u.-1 := Frobenius_dvd_ker1 frobUW1.
+have [nP_UW1 /isomP[/=]] := sdprod_isom defS_P; set h := restrm _ _ => injh hS.
+have /joing_sub[sUUW1 sW1UW1] := erefl (U <*> W1).
+have [hU hW1]: h @* U = Ubar /\ h @* W1 = W1bar.
+ by rewrite !morphim_restrm /= !(setIidPr _).
+have{hS} frobSbar: [Frobenius Sbar = Ubar ><| W1bar].
+ by rewrite -[Sbar]hS -hU -hW1 injm_Frobenius.
+have tiW1bar: normedTI W1bar^# Sbar W1bar by have /and3P[] := frobSbar.
+have gammaW1 xbar: xbar \in W1bar^# -> gamma xbar = 1.
+ move=> W1xbar; have [ntxbar _] := setD1P W1xbar.
+ rewrite cfIndE ?quotientS //; apply: canLR (mulKf (neq0CG _)) _.
+ have ->: #|W1bar| = #|Sbar :&: W1bar| by rewrite (setIidPr _) ?quotientS.
+ rewrite mulr1 cardsE -sumr_const big_mkcondr; apply: eq_bigr => zbar Szbar.
+ have [_ _ W1bar_xJ] := normedTI_memJ_P tiW1bar.
+ by rewrite -mulrb -(W1bar_xJ xbar) // !inE conjg_eq1 ntxbar cfun1E.
+have PVSbeta j: j != 0 -> beta_ j \in 'CF(S, P^# :|: V_S).
+ move=> nzj; apply/cfun_onP=> z; rewrite !inE => /norP[P'z VS'z].
+ have [Sz | /cfun0->//] := boolP (z \in S); apply/eqP; rewrite !cfunE subr_eq0.
+ have [[_ mulW12 _ tiW12] C1] := (dprodP defW, FTtypeP_reg_Fcore maxS StypeP).
+ have [PUz {VS'z} | PU'z {P'z}] := boolP (z \in PU).
+ rewrite eq_sym -(cfResE _ _ PUz) ?gFsub // -['Res _](scalerK (neq0CG W1)).
+ rewrite cfRes_prTIirr -cfRes_prTIred -/q cfunE cfResE ?gFsub // mulrC.
+ case/nandP: P'z => [/negbNE/eqP-> | P'z].
+ rewrite Dgamma cfModE // morph1 gamma1 FTprTIred1 // C1 indexg1.
+ by rewrite natrM mulfK ?neq0CG.
+ have:= seqInd_on (Fitting_normal S) (FTprTIred_Ind_Fitting maxS StypeP nzj).
+ have [/= <- _ _ _] := typeP_context StypeP; rewrite C1 dprodg1 -/(mu_ j).
+ move/cfun_on0->; rewrite // mul0r (cfun_on0 (cfInd_on _ (cfun_onG _))) //.
+ rewrite -(sdprodW defPW1); apply: contra P'z => /imset2P[x t PW1x St Dz].
+ rewrite Dz !memJ_norm ?(subsetP (gFnorm _ _)) // in PUz *.
+ by rewrite -(mulg1 P) -tiPUW1 setIC group_modl // inE PW1x.
+ have /imset2P[x t /setD1P[ntx W1x] St ->]: z \in class_support W1^# S.
+ have /bigcupP[_ /rcosetsP[x W1x ->]]: z \in cover (rcosets PU W1).
+ by rewrite (cover_partition (rcosets_partition_mul _ _)) (sdprodW defS).
+ have [-> | ntx] := eqVneq x 1%g; first by rewrite mulg1 => /idPn[].
+ have nPUx: x \in 'N(PU) by rewrite (subsetP nPUW1).
+ have coPUx: coprime #|PU| #[x] by rewrite (coprime_dvdr (order_dvdG W1x)).
+ have [/cover_partition <- _] := partition_cent_rcoset nPUx coPUx.
+ have [_ _ _ [_ _ _ _ prPUW1] _] := StypeP; rewrite {}prPUW1 ?inE ?ntx //.
+ rewrite cover_imset => /bigcupP[t PUt /imsetP[_ /rcosetP[y W2y ->] Dz]].
+ have{PUt} St: t \in S by rewrite (subsetP _ _ PUt) ?der_sub.
+ have [y1 | nty] := eqVneq y 1%g.
+ by rewrite Dz y1 mul1g memJ_class_support // !inE ntx.
+ rewrite Dz memJ_class_support // !inE groupMr // groupMl // in VS'z.
+ rewrite -(dprodWC defW) mem_mulg // andbT; apply/norP.
+ by rewrite -!in_set1 -set1gE -tiW12 !inE W1x W2y andbT in ntx nty.
+ rewrite !cfunJ // Dgamma cfModE ?(subsetP sW1S) // gammaW1; last first.
+ by rewrite !inE (morph_injm_eq1 injh) ?(subsetP sW1UW1) ?ntx ?mem_quotient.
+ rewrite prTIirr_id ?FTprTIsign // ?scale1r ?dprod_IirrEr; last first.
+ rewrite -in_set1 -set1gE -tiW12 inE W1x /= in ntx.
+ by rewrite inE ntx -mulW12 (subsetP (mulG_subl W2 W1)).
+ by rewrite -[x]mulg1 cfDprodEr ?lin_char1 ?irr_prime_lin.
+have A0beta j: j != 0 -> beta_ j \in 'CF(S, 'A0(S)).
+ move/PVSbeta; apply: cfun_onS; rewrite (FTtypeP_supp0_def _ StypeP) //.
+ by rewrite setSU ?(subset_trans _ (FTsupp1_sub _)) ?setSD ?Fcore_sub_FTcore.
+have norm_beta j: j != 0 -> '[beta_ j] = (u.-1 %/ q + 2)%:R.
+ move=> nzj; rewrite cfnormBd ?Dgamma; last first.
+ apply: contraNeq (cfker_prTIres pddS nzj); rewrite -irr_consttE => S1_mu0j.
+ rewrite -(cfRes_prTIirr _ 0) sub_cfker_Res //.
+ rewrite (subset_trans _ (cfker_constt _ S1_mu0j)) ?cfker_mod //.
+ by rewrite -Dgamma cfInd_char ?rpred1.
+ have [[/eqP defUW1 _] [/eqP defSbar _]] := (andP frobUW1, andP frobSbar).
+ rewrite cfnorm_irr cfMod_iso //.
+ rewrite (cfnormE (cfInd_on _ (cfun_onG _))) ?quotientS // -/gamma.
+ rewrite card_quotient ?gFnorm // -(index_sdprod defS_P) -(sdprod_card defUW1).
+ rewrite -/u -/q (big_setD1 1%g) ?mem_class_support ?group1 //=.
+ have{tiW1bar} [_ tiW1bar /eqP defNW1bar] := and3P tiW1bar.
+ rewrite gamma1 normr_nat class_supportD1 big_trivIset //=.
+ rewrite (eq_bigr (fun xbar => #|W1bar|.-1%:R)) ?sumr_const; last first.
+ rewrite (cardsD1 1%g) group1 /= => _ /imsetP[tbar Stbar ->].
+ rewrite -sumr_const big_imset /=; last exact: in2W (conjg_inj tbar).
+ by apply: eq_bigr => xbar W1xbar; rewrite cfunJ ?gammaW1 // normr1 expr1n.
+ rewrite card_conjugates -divgS ?subsetIl //= -(sdprod_card defSbar) defNW1bar.
+ rewrite mulnK ?cardG_gt0 // -hU -hW1 ?card_injm // -/q -/u natrM invfM mulrC.
+ rewrite -[rhs in _ ^+ 2 + rhs]mulr_natr -mulrDl mulrA mulfK ?neq0CG //.
+ rewrite -subn1 natrB ?cardG_gt0 // addrCA mulrDl divff ?neq0CG //.
+ by rewrite -natrB ?cardG_gt0 // subn1 -natf_div // addrAC addrC natrD.
+have nzj1: #1 != 0 :> Iirr W2 by apply: Iirr1_neq0.
+have [_ _ _ _ [_ Dtau]] := Sfacts; pose eta01 := eta_ 0 #1.
+have oeta01_1: '[eta01, 1] = 0.
+ by rewrite -(cycTIiso1 ctiWG) -(cycTIirr00 defW) cfdot_cycTIiso (negPf nzj1).
+have Deta01s: eta01^*%CF = eta_ 0 (conjC_Iirr #1).
+ by rewrite cfAut_cycTIiso /w_ !dprod_IirrEr cfAutDprodr aut_IirrE.
+have oGamma1: '[Gamma, 1] = 0.
+ rewrite cfdotDl cfdotBl cfnorm1 oeta01_1 addr0 Dtau ?A0beta //.
+ rewrite -cfdot_Res_r rmorph1 cfdotBl -cfdot_Res_r rmorph1 cfnorm1.
+ by rewrite -(prTIirr00 ptiWS) cfdot_prTIirr (negPf nzj1) subr0 subrr.
+have defGamma j: j != 0 -> tau (beta_ j) - 1 + eta_ 0 j = Gamma.
+ move=> nzj; apply/eqP; rewrite -subr_eq0 opprD addrACA opprB !addrA subrK.
+ rewrite -linearB opprD addrACA subrr add0r -opprD linearN /=.
+ move/prDade_sub_TIirr: pddS => -> //; last first.
+ by apply: (mulfI (neq0CG W1)); rewrite -!prTIred_1 !FTprTIred1.
+ by rewrite -/sigma FTprTIsign // scale1r -addrA addNr.
+have GammaReal: cfReal Gamma.
+ rewrite /cfReal rmorphD rmorphB rmorph1 /= Deta01s Dtau ?A0beta // cfAutInd.
+ rewrite rmorphB /= cfAutInd rmorph1 -prTIirr_aut aut_Iirr0 -/(beta_ _).
+ by rewrite -Dtau ?A0beta ?defGamma ?aut_Iirr_eq0.
+split=> // X Y defXY oXY oYeta; pose a := '[Gamma, eta01].
+have Za: a \in Cint.
+ rewrite Cint_cfdot_vchar ?(rpredB, rpredD, rpred1, cycTIiso_vchar) //.
+ by rewrite Dtau ?A0beta // !(cfInd_vchar, rpredB) ?rpred1 ?irr_vchar.
+have{oYeta} oYeta j: '[Y, eta_ 0 j] = 0.
+ by rewrite (orthoPl oYeta) ?map_f ?mem_irr.
+have o_eta1s1: '[eta01^*, eta01] = 0.
+ rewrite Deta01s cfdot_cycTIiso /= -(inj_eq irr_inj) aut_IirrE.
+ by rewrite odd_eq_conj_irr1 ?mFT_odd // irr_eq1 (negPf nzj1).
+rewrite -(ler_add2r 2%:R) -natrD -(norm_beta #1) //.
+have ->: '[beta_ #1] = '[Gamma - eta01 + 1].
+ by rewrite addrK subrK Dade_isometry ?A0beta.
+rewrite addrA cfnormDd ?cfnorm1 ?ler_add2r; last first.
+ by rewrite cfdotBl oeta01_1 oGamma1 subrr.
+rewrite defXY addrAC addrC cfnormDd ?ler_add2r; last first.
+ by rewrite cfdotBl oXY cfdotC oYeta conjC0 subrr.
+have oXeta j: '[X, eta_ 0 j] = '[Gamma, eta_ 0 j].
+ by rewrite defXY cfdotDl oYeta addr0.
+pose X1 := X - a *: eta01 - a *: eta01^*%CF.
+have ->: X - eta01 = X1 + a *: eta01^*%CF + (a - 1) *: eta01.
+ by rewrite scalerBl scale1r addrA !subrK.
+rewrite cfnormDd; last first.
+ rewrite cfdotZr subrK cfdotBl oXeta -/a cfdotZl cfnorm_cycTIiso mulr1.
+ by rewrite subrr mulr0.
+rewrite cfnormDd; last first.
+ rewrite cfdotZr !cfdotBl !cfdotZl Deta01s cfnorm_cycTIiso oXeta -Deta01s.
+ rewrite !cfdot_conjCr o_eta1s1 conjC0 mulr0 ((_ =P Gamma) GammaReal) -/a.
+ by rewrite conj_Cint // mulr1 subr0 subrr mulr0.
+rewrite -addrA ler_paddl ?cfnorm_ge0 // !cfnormZ Deta01s !cfnorm_cycTIiso.
+rewrite !mulr1 !Cint_normK ?rpredB ?rpred1 // sqrrB1 !addrA -mulr2n.
+by rewrite -subr_ge0 addrK subr_ge0 ler_pmuln2r ?Cint_ler_sqr.
+Qed.
+
+(* The assumptions of Peterfalvi (13.19). *)
+(* We do not need to put these in a subsection as this is the last Lemma. *)
+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 e := #|L : H|.
+Let tauL := FT_DadeF maxL.
+Let calL := seqIndD H L H 1.
+
+Let frobL : [Frobenius L with kernel H]. Proof. exact: FTtype1_Frobenius. Qed.
+
+(* The coherence part of the preamble of (13.19). *)
+Lemma FTtype1_coherence : coherent calL L^# tauL.
+Proof.
+have [_ [tau1 [IZtau1 Dtau1]]] := FT_Frobenius_coherence maxL frobL.
+exists tau1; split=> // phi Sphi; rewrite ?Dtau1 //.
+move/(zcharD1_seqInd_on (Fcore_normal _)) in Sphi.
+by rewrite /tauL FT_DadeF_E ?FT_DadeE ?(cfun_onS (Fcore_sub_FTsupp _)).
+Qed.
+
+Lemma FTtype1_Ind_irr : {subset calL <= irr L}.
+Proof. by case: (FT_Frobenius_coherence maxL frobL). Qed.
+Let irrL := FTtype1_Ind_irr.
+
+(* We re-quantify over the witnesses so that the main part of the lemma can *)
+(* be used for Section variables in the very last part of Section 14. *)
+Variables (tau1 : {additive 'CF(L) -> 'CF(G)}) (phi : 'CF(L)).
+Hypothesis cohL : coherent_with calL L^# tauL tau1.
+Hypotheses (Lphi : phi \in calL) (phi1e : phi 1%g = e%:R).
+
+Let betaL := 'Ind[L, H] 1 - phi.
+Let betaS := beta_ #1.
+Let eta01 := eta_ 0 #1.
+
+(* This is Peterfalvi (13.19). *)
+Lemma FTtypeI_bridge_facts :
+ [/\ (*a*) 'A~(L) :&: (class_support P G :|: class_support W G) = set0,
+ (*b*) orthogonal (map tau1 calL) (map sigma (irr W)),
+ (*c*) forall j, j != 0 -> '[tauL betaL, eta_ 0 j] = '[tauL betaL, eta01]
+ & (*c1*) ('[tau betaS, tau1 phi] == 1 %[mod 2])%C
+ /\ #|H|.-1%:R / e%:R <= (u.-1 %/ q)%:R :> algC
+ \/ (*c2*) ('[tauL betaL, eta01] == 1 %[mod 2])%C /\ (p <= e)%N].
+Proof.
+have nsHL: H <| L := gFnormal _ L; have [sHL nHL] := andP nsHL.
+have coHr T r: T \in 'M -> FTtype T != 1%N -> r.-abelem T`_\F -> coprime #|H| r.
+ move=> maxT notTtype1 /andP[rR _].
+ have [_ _ [n oR]] := pgroup_pdiv rR (mmax_Fcore_neq1 maxT).
+ rewrite -(coprime_pexpr _ r (ltn0Sn n)) -oR /= -FTcore_type1 //.
+ apply: coprimegS (Fcore_sub_FTcore maxT) _.
+ have [_ -> //] := FT_Dade_support_partition gT.
+ by apply: contra notTtype1 => /imsetP[y _ ->] /=; rewrite FTtypeJ.
+have coHp: coprime #|H| p by apply: (coHr S) => //; have [_ []] := Sfacts.
+have{coHr} coHq: coprime #|H| q.
+ have [T pairST [xdefW [V TtypeP]]] := FTtypeP_pair_witness maxS StypeP.
+ have [[_ _ maxT] _ _ _ _] := pairST; have Ttype'1 := FTtypeP_neq1 maxT TtypeP.
+ by rewrite (coHr T) ?Ttype'1 //; have [_ []] := FTtypeP_facts maxT TtypeP.
+have defA: 'A(L) = H^# := FTsupp_Frobenius maxL frobL.
+set PWG := class_support P G :|: class_support W G.
+have tiA_PWG: 'A~(L) :&: PWG = set0.
+ apply/setP=> x; rewrite !inE; apply/andP=> [[Ax PWGx]].
+ suffices{Ax}: \pi(H)^'.-elt x.
+ have [y Ay /imset2P[_ t /rcosetP[z Rz ->] _ ->]] := bigcupP Ax => H'zyt.
+ do [rewrite -def_FTsignalizer //; set ddL := FT_Dade_hyp maxL] in Rz.
+ have /setD1P[nty Hy]: y \in H^# by rewrite -defA.
+ have /idPn[]: (z * y).`_\pi('C_H[y]) == 1%g.
+ rewrite (constt1P _) // -(p_eltJ _ _ t); apply: sub_in_pnat H'zyt => r _.
+ by apply: contra; apply: piSg; apply: subsetIl.
+ rewrite consttM; last first.
+ exact: cent1P (subsetP (Dade_signalizer_cent _ y) z Rz).
+ rewrite (constt1P (mem_p_elt _ Rz)) ?mul1g; last first.
+ rewrite /pgroup -coprime_pi' ?cardG_gt0 // coprime_sym.
+ by rewrite (coprimegS _ (Dade_coprime _ Ay Ay)) ?setSI.
+ by rewrite (constt_p_elt (mem_p_elt (pgroup_pi _) _)) // inE Hy cent1id.
+ suffices /pnat_dvd: #[x] %| #|P| * #|W|.
+ have [_ [_ ->] _ _ _] := Sfacts; rewrite -(dprod_card defW) -/p -/q.
+ by apply; rewrite !pnat_mul pnat_exp -!coprime_pi' ?cardG_gt0 ?coHp ?coHq.
+ case/orP: PWGx => /imset2P[y z PWy _ ->]; rewrite {z}orderJ.
+ by rewrite dvdn_mulr ?order_dvdG.
+ by rewrite dvdn_mull ?order_dvdG.
+have ZsubL psi: psi \in calL -> psi - psi^*%CF \in 'Z[calL, L^#].
+ have ZcalL: {subset calL <= 'Z[irr L]} by apply: seqInd_vcharW.
+ by move=> Lpsi; rewrite sub_aut_zchar ?zchar_onG ?mem_zchar ?cfAut_seqInd.
+have mem_eta j: eta_ 0 j \in map sigma (irr W) by rewrite map_f ?mem_irr.
+have otau1eta: orthogonal (map tau1 calL) (map sigma (irr W)).
+ apply/orthogonalP=> _ _ /mapP[psi Lpsi ->] /mapP[w irr_w ->].
+ have{w irr_w} [i [j ->]] := cycTIirrP defW irr_w; rewrite -/(w_ i j).
+ pose Psi := tau1 (psi - psi^*%CF); pose NC := cyclicTI_NC ctiWG.
+ have [[Itau1 Ztau1] Dtau1] := cohL.
+ have Lpsis: psi^*%CF \in calL by rewrite cfAut_seqInd.
+ have Z1dpsi := ZsubL _ Lpsi; have Zdpsi := zcharW Z1dpsi.
+ have{Dtau1} PsiV0: {in V, Psi =1 \0}.
+ move=> x /setDP[Wx _]; rewrite /Psi Dtau1 ?(cfun_on0 (Dade_cfunS _ _)) //.
+ rewrite FT_DadeF_supportE -defA; apply: contra_eqN tiA_PWG => Ax.
+ by apply/set0Pn; exists x; rewrite !inE Ax orbC mem_class_support.
+ have opsi: '[psi, psi^*] = 0 by apply: seqInd_conjC_ortho (mFT_odd _) _ Lpsi.
+ have n2Psi: '[Psi] = 2%:R.
+ by rewrite Itau1 ?cfnormBd // cfnorm_conjC ?irrWnorm ?irrL.
+ have NC_Psi: (NC Psi < minn q p)%N.
+ by rewrite (@leq_ltn_trans 2) ?leq_min ?qgt2 // cycTI_NC_norm ?Ztau1 ?n2Psi.
+ apply: contraTeq (NC_Psi) => t1psi_eta; rewrite -leqNgt cycTI_NC_minn //.
+ rewrite mul2n -addnn (leq_trans NC_Psi) ?leq_addl // andbT card_gt0.
+ suffices [b Deta]: exists b : bool, eta_ i j = (-1) ^+ b *: tau1 psi.
+ apply/set0Pn; exists (i, j); rewrite !inE /= /Psi raddfB cfdotBl {2}Deta.
+ by rewrite cfdotZr Itau1 ?mem_zchar // cfdot_conjCl opsi conjC0 mulr0 subr0.
+ exists (tau1 psi == - eta_ i j); apply: (canRL (signrZK _)).
+ move/eqP: t1psi_eta; rewrite cfdot_dirr ?cycTIiso_dirr //; last first.
+ by rewrite dirrE Itau1 ?Ztau1 ?mem_zchar //= irrWnorm ?irrL.
+ by rewrite scaler_sign; do 2!case: eqP => //.
+have [[A0beta PVbeta] n2beta [defGa Ga1 R_Ga] ubGa dvu] := FTtypeP_bridge_facts.
+have [_ _ _ _ [_ Dtau]] := Sfacts.
+have o_tauL_S zeta j: j != 0 -> '[tauL zeta, tau (beta_ j)] = 0.
+ move=> nzj; pose ABS := class_support (P^# :|: class_support V S) G.
+ have ABSbeta: tau (beta_ j) \in 'CF(G, ABS).
+ by rewrite Dtau ?A0beta // cfInd_on ?subsetT ?PVbeta.
+ have{ABSbeta} PWGbeta: tau (beta_ j) \in 'CF(G, PWG).
+ apply: cfun_onS ABSbeta; apply/subsetP=> _ /imset2P[x t PVSx _ ->].
+ case/setUP: PVSx => [/setD1P[_ Px] | /imset2P[y z /setDP[Wy _] _ ->]].
+ by rewrite inE memJ_class_support ?inE.
+ by rewrite -conjgM inE orbC memJ_class_support ?inE.
+ rewrite (cfdotElr (Dade_cfunS _ _) PWGbeta) big_pred0 ?mulr0 // => x.
+ by rewrite FT_DadeF_supportE -defA tiA_PWG inE.
+have betaLeta j: j != 0 -> '[tauL betaL, eta_ 0 j] = '[tauL betaL, eta01].
+ move=> nzj; apply/eqP; rewrite -subr_eq0 -cfdotBr.
+ rewrite (canRL (addKr _) (defGa j nzj)) !addrA addrK -addrA addrCA.
+ by rewrite opprD subrK cfdotBr !o_tauL_S ?subrr ?Iirr1_neq0.
+split=> //; have [[[Itau1 Ztau1] Dtau1] irr_phi] := (cohL, irrL Lphi).
+pose GammaL := tauL betaL - (1 - tau1 phi).
+have DbetaL: tauL betaL = 1 - tau1 phi + GammaL by rewrite addrC subrK.
+have RealGammaL: cfReal GammaL.
+ rewrite /cfReal -subr_eq0 !rmorphB rmorph1 /= !opprB !addrA subrK addrC.
+ rewrite -addrA addrCA addrA addr_eq0 opprB -Dade_aut -linearB /= -/tauL.
+ rewrite rmorphB /= cfAutInd rmorph1 addrC opprB addrA subrK.
+ by rewrite (cfConjC_Dade_coherent cohL) ?mFT_odd // -raddfB Dtau1 // ZsubL.
+have:= Dade_Ind1_sub_lin cohL _ irr_phi Lphi; rewrite -/betaL -/tauL -/calL.
+rewrite (seqInd_nontrivial _ _ _ irr_phi) ?odd_Frobenius_index_ler ?mFT_odd //.
+case=> // -[o_tauL_1 o_betaL_1 ZbetaL] ub_betaL _.
+have{o_tauL_1 o_betaL_1} o_GaL_1: '[GammaL, 1] = 0.
+ by rewrite !cfdotBl cfnorm1 o_betaL_1 (orthoPr o_tauL_1) ?map_f ?subr0 ?subrr.
+have Zt1phi: tau1 phi \in 'Z[irr G] by rewrite Ztau1 ?mem_zchar.
+have Zeta01: eta01 \in 'Z[irr G] by apply: cycTIiso_vchar.
+have ZbetaS: tau betaS \in 'Z[irr G].
+ rewrite Dade_vchar // zchar_split A0beta ?Iirr1_neq0 //.
+ by rewrite rpredB ?irr_vchar ?cfInd_vchar ?rpred1.
+have Z_Ga: Gamma \in 'Z[irr G] by rewrite rpredD ?rpredB ?rpred1.
+have Z_GaL: GammaL \in 'Z[irr G] by rewrite !rpredB ?rpred1.
+have{RealGammaL} Gamma_even: (2 %| '[GammaL, Gamma])%C.
+ by rewrite cfdot_real_vchar_even ?mFT_odd // o_GaL_1 (dvdC_nat 2 0).
+set bSphi := '[tau betaS, tau1 phi]; set bLeta := '[tauL betaL, eta01].
+have [ZbSphi ZbLeta]: bSphi \in Cint /\ bLeta \in Cint.
+ by rewrite !Cint_cfdot_vchar.
+have{Gamma_even} odd_bSphi_bLeta: (bSphi + bLeta == 1 %[mod 2])%C.
+ rewrite -(conj_Cint ZbSphi) -cfdotC /bLeta DbetaL cfdotDl cfdotBl.
+ have: '[tauL betaL, tau betaS] == 0 by rewrite o_tauL_S ?Iirr1_neq0.
+ have ->: tau betaS = 1 - eta01 + Gamma by rewrite addrCA !addrA !subrK.
+ rewrite !['[tau1 _, _]]cfdotDr 2!cfdotDr !cfdotNr DbetaL.
+ rewrite 2!cfdotDl 2!['[_, eta01]]cfdotDl 2!['[_, Gamma]]cfdotDl !cfdotNl.
+ rewrite cfnorm1 o_GaL_1 ['[1, Gamma]]cfdotC Ga1 conjC0 addr0 add0r.
+ have ->: 1 = eta_ 0 0 by rewrite /w_ cycTIirr00 cycTIiso1.
+ rewrite cfdot_cycTIiso mulrb ifN_eqC ?Iirr1_neq0 // add0r.
+ rewrite 2?(orthogonalP otau1eta _ _ (map_f _ _) (mem_eta _)) // oppr0 !add0r.
+ by rewrite addr0 addrA addrC addr_eq0 !opprB addrA /eqCmod => /eqP <-.
+have abs_mod2 a: a \in Cint -> {b : bool | a == b%:R %[mod 2]}%C.
+ move=> Za; pose n := truncC `|a|; exists (odd n).
+ apply: eqCmod_trans (eqCmod_addl_mul _ (rpred_nat _ n./2) _).
+ rewrite addrC -natrM -natrD muln2 odd_double_half truncCK ?Cnat_norm_Cint //.
+ rewrite -{1}[a]mul1r -(canLR (signrMK _) (CintEsign Za)) eqCmodMr // signrE.
+ by rewrite /eqCmod opprB addrC subrK dvdC_nat dvdn2 odd_double.
+have [[bL DbL] [bS DbS]] := (abs_mod2 _ ZbLeta, abs_mod2 _ ZbSphi).
+have{odd_bSphi_bLeta} xor_bS_bL: bS (+) bL.
+ rewrite eqCmod_sym in odd_bSphi_bLeta.
+ have:= eqCmod_trans odd_bSphi_bLeta (eqCmodD DbS DbL).
+ rewrite -natrD eqCmod_sym -(eqCmodDr _ 1) -mulrSr => xor_bS_bL.
+ have:= eqCmod_trans xor_bS_bL (eqCmodm0 _); rewrite /eqCmod subr0.
+ by rewrite (dvdC_nat 2 _.+1) dvdn2 /= negbK odd_add !oddb; case: (_ (+) _).
+have ?: (0 != 1 %[mod 2])%C by rewrite eqCmod_sym /eqCmod subr0 (dvdC_nat 2 1).
+case is_c1: bS; [left | right].
+ rewrite is_c1 in DbS; split=> //.
+ pose a_ (psi : 'CF(L)) := psi 1%g / e%:R.
+ have Na_ psi: psi \in calL -> a_ psi \in Cnat by apply: dvd_index_seqInd1.
+ have [X tau1X [D [dGa oXD oDtau1]]] := orthogonal_split (map tau1 calL) Gamma.
+ have oo_L: orthonormal calL.
+ by apply: sub_orthonormal (irr_orthonormal L); rewrite ?seqInd_uniq.
+ have oo_tau1L: orthonormal (map tau1 calL) by apply: map_orthonormal.
+ have defX: X = bSphi *: (\sum_(psi <- calL) a_ psi *: tau1 psi).
+ have [_ -> defX] := orthonormal_span oo_tau1L tau1X.
+ rewrite defX big_map scaler_sumr; apply: eq_big_seq => psi Lpsi.
+ rewrite scalerA; congr (_ *: _); apply/eqP; rewrite -subr_eq0 mulrC.
+ rewrite -[X](addrK D) -dGa cfdotBl (orthoPl oDtau1) ?map_f // subr0.
+ rewrite cfdotC cfdotDr cfdotBr -/betaS -/eta01.
+ have ->: 1 = eta_ 0 0 by rewrite /w_ cycTIirr00 cycTIiso1.
+ rewrite 2?(orthogonalP otau1eta _ _ (map_f _ _) (mem_eta _)) // subrK.
+ rewrite -cfdotC -(conj_Cnat (Na_ _ Lpsi)) -cfdotZr -cfdotBr.
+ rewrite -raddfZ_Cnat ?Na_ // -raddfB cfdotC.
+ rewrite Dtau1; last by rewrite zcharD1_seqInd ?seqInd_sub_lin_vchar.
+ by rewrite o_tauL_S ?Iirr1_neq0 ?conjC0.
+ have nz_bSphi: bSphi != 0 by apply: contraTneq DbS => ->.
+ have ub_a: \sum_(psi <- calL) a_ psi ^+ 2 <= (u.-1 %/ q)%:R.
+ apply: ler_trans (ubGa D X _ _ _); first 1 last; first by rewrite addrC.
+ - by rewrite cfdotC oXD conjC0.
+ - apply/orthoPl=> eta Weta; rewrite (span_orthogonal otau1eta) //.
+ exact: memv_span.
+ rewrite defX cfnormZ cfnorm_sum_orthonormal // mulr_sumr !big_seq.
+ apply: ler_sum => psi Lpsi; rewrite -{1}(norm_Cnat (Na_ _ _)) //.
+ by rewrite ler_pemull ?exprn_ge0 ?normr_ge0 // Cint_normK // sqr_Cint_ge1.
+ congr (_ <= _): ub_a; do 2!apply: (mulIf (neq0CiG L H)); rewrite -/e.
+ rewrite divfK ?neq0CiG // -mulrA -expr2 mulr_suml.
+ rewrite -subn1 natrB ?neq0CG // -indexg1 mulrC.
+ rewrite -(sum_seqIndD_square nsHL) ?normal1 ?sub1G // -/calL.
+ apply: eq_big_seq => psi Lpsi; rewrite irrWnorm ?irrL // divr1.
+ by rewrite -exprMn divfK ?neq0CiG.
+rewrite is_c1 /= in xor_bS_bL; rewrite xor_bS_bL in DbL; split=> //.
+have nz_bL: bLeta != 0 by apply: contraTneq DbL => ->.
+have{ub_betaL} [X [otau1X oX1 [a Za defX]] [//|_ ubX]] := ub_betaL.
+rewrite -/e in defX; rewrite -leC_nat -(ler_add2r (-1)); apply: ler_trans ubX.
+pose calX0 := [seq w_ 0 j | j in predC1 0].
+have ooX0: orthonormal calX0.
+ apply: sub_orthonormal (irr_orthonormal W).
+ by move=> _ /imageP[j _ ->]; apply: mem_irr.
+ by apply/dinjectiveP=> j1 j2 _ _ /irr_inj/dprod_Iirr_inj[].
+have Isigma: {in 'Z[calX0] &, isometry sigma}.
+ by apply: in2W; apply: cycTIisometry.
+rewrite -[X](subrK (bLeta *: (\sum_(xi <- calX0) sigma xi))).
+rewrite cfnormDd ?ler_paddl ?cfnorm_ge0 //; last first.
+ rewrite cfdotZr cfdot_sumr big1_seq ?mulr0 // => xi X0xi.
+ apply/eqP; rewrite cfdotBl scaler_sumr cfproj_sum_orthonormal // subr_eq0.
+ have {xi X0xi}[j nzj ->] := imageP X0xi; rewrite inE /= in nzj.
+ rewrite -[bLeta](betaLeta j nzj) defX cfdotDl -addrA cfdotDl.
+ have ->: 1 = eta_ 0 0 by rewrite /w_ cycTIirr00 cycTIiso1.
+ rewrite cfdot_cycTIiso mulrb (ifN_eqC _ _ nzj) add0r eq_sym -subr_eq0 addrK.
+ rewrite (span_orthogonal otau1eta) //; last by rewrite memv_span ?mem_eta.
+ rewrite big_seq rpredD ?(rpredN, rpredZ, rpred_sum) ?memv_span ?map_f //.
+ by move=> xi Lxi; rewrite rpredZ ?memv_span ?map_f.
+rewrite cfnormZ cfnorm_map_orthonormal // size_image cardC1 nirrW2.
+rewrite -(natrB _ (prime_gt0 pr_p)) Cint_normK // subn1.
+by rewrite ler_pemull ?ler0n ?sqr_Cint_ge1.
+Qed.
+
+End Thirteen_17_to_19.
+
+End Thirteen.
+