aboutsummaryrefslogtreecommitdiff
path: root/mathcomp/odd_order/PFsection10.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/PFsection10.v
Initial commit
Diffstat (limited to 'mathcomp/odd_order/PFsection10.v')
-rw-r--r--mathcomp/odd_order/PFsection10.v1215
1 files changed, 1215 insertions, 0 deletions
diff --git a/mathcomp/odd_order/PFsection10.v b/mathcomp/odd_order/PFsection10.v
new file mode 100644
index 0000000..d380e47
--- /dev/null
+++ b/mathcomp/odd_order/PFsection10.v
@@ -0,0 +1,1215 @@
+(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
+Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice.
+Require Import fintype tuple finfun bigop prime ssralg poly finset center.
+Require Import fingroup morphism perm automorphism quotient action finalg zmodp.
+Require Import gfunctor gproduct cyclic commutator gseries nilpotent pgroup.
+Require Import sylow hall abelian maximal frobenius.
+Require Import matrix mxalgebra mxrepresentation mxabelem vector.
+Require Import BGsection1 BGsection3 BGsection7 BGsection15 BGsection16.
+Require Import ssrnum algC classfun character integral_char inertia vcharacter.
+Require Import PFsection1 PFsection2 PFsection3 PFsection4.
+Require Import PFsection5 PFsection6 PFsection7 PFsection8 PFsection9.
+
+(******************************************************************************)
+(* This file covers Peterfalvi, Section 10: Maximal subgroups of Types III, *)
+(* IV and V. For defW : W1 \x W2 = W and MtypeP : of_typeP M U defW, and *)
+(* setting ptiW := FT_primeTI_hyp MtypeP, mu2_ i j := primeTIirr ptiW i j and *)
+(* delta_ j := primeTIsign j, we define here, for M of type III-V: *)
+(* FTtype345_TIirr_degree MtypeP == the common degree of the components of *)
+(* (locally) d the images of characters of irr W that don't have *)
+(* W2 in their kernel by the cyclicTI isometry to M. *)
+(* Thus mu2_ i j 1%g = d%:R for all j != 0. *)
+(* FTtype345_TIsign MtypeP == the common sign of the images of characters *)
+(* (locally) delta of characters of irr W that don't have W2 in *)
+(* their kernel by the cyclicTI isometry to M. *)
+(* Thus delta_ j = delta for all j != 0. *)
+(* FTtype345_ratio MtypeP == the ratio (d - delta) / #|W1|. Even though it *)
+(* (locally) n is always a positive integer we take n : algC. *)
+(* FTtype345_bridge MtypeP s i j == a virtual character that can be used to *)
+(* (locally) alpha_ i j bridge coherence between the mu2_ i j and other *)
+(* irreducibles of M; here s should be the index of *)
+(* an irreducible character of M induced from M^(1). *)
+(* := mu2_ i j - delta *: mu2_ i 0 -n *: 'chi_s. *)
+(******************************************************************************)
+
+Set Implicit Arguments.
+Unset Strict Implicit.
+Unset Printing Implicit Defensive.
+
+Import GroupScope GRing.Theory Num.Theory.
+
+Section Ten.
+
+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}.
+
+Local Notation "#1" := (inord 1) (at level 0).
+
+Section OneMaximal.
+
+(* These assumptions correspond to Peterfalvi, Hypothesis (10.1). *)
+(* We also declare the group U_M, even though it is not used in this section, *)
+(* because it is a parameter to the theorems and definitions of PFsection8 *)
+(* and PFsection9. *)
+Variables M U_M W W1 W2 : {group gT}.
+Hypotheses (maxM : M \in 'M) (defW : W1 \x W2 = W).
+Hypotheses (MtypeP : of_typeP M U_M defW) (notMtype2: FTtype M != 2).
+
+Local Notation "` 'M'" := (gval M) (at level 0, only parsing) : group_scope.
+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 M' := M^`(1)%G.
+Local Notation "` 'M''" := `M^`(1) (at level 0) : group_scope.
+Local Notation M'' := M^`(2)%G.
+Local Notation "` 'M'''" := `M^`(2) (at level 0) : group_scope.
+
+Let defM : M' ><| W1 = M. Proof. by have [[]] := MtypeP. Qed.
+Let nsM''M' : M'' <| M'. Proof. exact: (der_normal 1 M'). Qed.
+Let nsM'M : M' <| M. Proof. exact: (der_normal 1 M). Qed.
+Let sM'M : M' \subset M. Proof. exact: der_sub. Qed.
+Let nsM''M : M'' <| M. Proof. exact: der_normal 2 M. Qed.
+
+Let notMtype1 : FTtype M != 1%N. Proof. exact: FTtypeP_neq1 MtypeP. Qed.
+Let typeMgt2 : FTtype M > 2.
+Proof. by move: (FTtype M) (FTtype_range M) notMtype1 notMtype2=> [|[|[]]]. Qed.
+
+Let defA1 : 'A1(M) = M'^#. Proof. by rewrite /= -FTcore_eq_der1. Qed.
+Let defA : 'A(M) = M'^#. Proof. by rewrite FTsupp_eq1 ?defA1. Qed.
+Let defA0 : 'A0(M) = M'^# :|: class_support V M.
+Proof. by rewrite -defA (FTtypeP_supp0_def _ MtypeP). Qed.
+Let defMs : M`_\s :=: M'. Proof. exact: FTcore_type_gt2. Qed.
+
+Let pddM := FT_prDade_hyp maxM MtypeP.
+Let ptiWM : primeTI_hypothesis M M' defW := FT_primeTI_hyp MtypeP.
+Let ctiWG : cyclicTI_hypothesis G defW := pddM.
+Let ctiWM : cyclicTI_hypothesis M defW := prime_cycTIhyp ptiWM.
+
+Let ntW1 : W1 :!=: 1. Proof. by have [[]] := MtypeP. Qed.
+Let ntW2 : W2 :!=: 1. Proof. by have [_ _ _ []] := MtypeP. Qed.
+Let cycW1 : cyclic W1. Proof. by have [[]] := MtypeP. Qed.
+Let cycW2 : cyclic W2. Proof. by have [_ _ _ []] := MtypeP. Qed.
+
+Let w1 := #|W1|.
+Let w2 := #|W2|.
+Let nirrW1 : #|Iirr W1| = w1. Proof. by rewrite card_Iirr_cyclic. Qed.
+Let nirrW2 : #|Iirr W2| = w2. Proof. by rewrite card_Iirr_cyclic. Qed.
+Let NirrW1 : Nirr W1 = w1. Proof. by rewrite -nirrW1 card_ord. Qed.
+Let NirrW2 : Nirr W2 = w2. Proof. by rewrite -nirrW2 card_ord. Qed.
+
+Let w1gt2 : w1 > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
+Let w2gt2 : w2 > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
+
+Let coM'w1 : coprime #|M'| w1.
+Proof. by rewrite (coprime_sdprod_Hall_r defM); have [[]] := MtypeP. Qed.
+
+(* This is used both in (10.2) and (10.8). *)
+Let frobMbar : [Frobenius M / M'' = (M' / M'') ><| (W1 / M'')].
+Proof.
+have [[_ hallW1 _ _] _ _ [_ _ _ sW2M'' regM'W1 ] _] := MtypeP.
+apply: Frobenius_coprime_quotient => //.
+split=> [|w /regM'W1-> //]; apply: (sol_der1_proper (mmax_sol maxM)) => //.
+by apply: subG1_contra ntW2; apply: subset_trans sW2M'' (der_sub 1 M').
+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 ptiWM).
+Let mu2_ i j := primeTIirr ptiWM i j.
+Let mu_ := primeTIred ptiWM.
+Local Notation chi_ j := (primeTIres ptiWM j).
+
+Local Notation Idelta := (primeTI_Isign ptiWM).
+Local Notation delta_ j := (primeTIsign ptiWM j).
+
+Local Notation tau := (FT_Dade0 maxM).
+Local Notation "chi ^\tau" := (tau chi).
+
+Let calS0 := seqIndD M' M M`_\s 1.
+Let rmR := FTtypeP_coh_base maxM MtypeP.
+Let scohS0 : subcoherent calS0 tau rmR.
+Proof. exact: FTtypeP_subcoherent MtypeP. Qed.
+
+Let calS := seqIndD M' M M' 1.
+Let sSS0 : cfConjC_subset calS calS0.
+Proof. by apply: seqInd_conjC_subset1; rewrite /= ?defMs. Qed.
+
+Let mem_calS s : ('Ind 'chi[M']_s \in calS) = (s != 0).
+Proof.
+rewrite mem_seqInd ?normal1 ?FTcore_normal //=.
+by rewrite !inE sub1G subGcfker andbT.
+Qed.
+
+Let calSmu j : j != 0 -> mu_ j \in calS.
+Proof.
+move=> nz_j; rewrite -[mu_ j]cfInd_prTIres mem_calS -irr_eq1.
+by rewrite -(prTIres0 ptiWM) (inj_eq irr_inj) (inj_eq (prTIres_inj _)).
+Qed.
+
+Let tauM' : {subset 'Z[calS, M'^#] <= 'CF(M, 'A0(M))}.
+Proof. by rewrite defA0 => phi /zchar_on/(cfun_onS (subsetUl _ _))->. Qed.
+
+(* This is Peterfalvi (10.2). *)
+(* Note that this result is also valid for type II groups. *)
+Lemma FTtypeP_ref_irr :
+ {zeta | [/\ zeta \in irr M, zeta \in calS & zeta 1%g = w1%:R]}.
+Proof.
+have [_ /has_nonprincipal_irr[s nz_s] _ _ _] := Frobenius_context frobMbar.
+exists ('Ind 'chi_s %% M'')%CF; split.
+- exact/cfMod_irr/(irr_induced_Frobenius_ker (FrobeniusWker frobMbar)).
+- by rewrite -cfIndMod ?normal_sub // -mod_IirrE // mem_calS mod_Iirr_eq0.
+rewrite -cfIndMod ?cfInd1 ?normal_sub // -(index_sdprod defM) cfMod1.
+by rewrite lin_char1 ?mulr1 //; apply/char_abelianP/sub_der1_abelian.
+Qed.
+
+(* This is Peterfalvi (10.3), first assertion. *)
+Lemma FTtype345_core_prime : prime w2.
+Proof.
+have [S pairMS [xdefW [U StypeP]]] := FTtypeP_pair_witness maxM MtypeP.
+have [[_ _ maxS] _] := pairMS; rewrite {1}(negPf notMtype2) /= => Stype2 _ _.
+by have [[]] := compl_of_typeII maxS StypeP Stype2.
+Qed.
+Let w2_pr := FTtype345_core_prime.
+
+Definition FTtype345_TIirr_degree := truncC (mu2_ 0 #1 1%g).
+Definition FTtype345_TIsign := delta_ #1.
+Local Notation d := FTtype345_TIirr_degree.
+Local Notation delta := FTtype345_TIsign.
+Definition FTtype345_ratio := (d%:R - delta) / w1%:R.
+Local Notation n := FTtype345_ratio.
+
+(* This is the remainder of Peterfalvi (10.3). *)
+Lemma FTtype345_constants :
+ [/\ forall i j, j != 0 -> mu2_ i j 1%g = d%:R,
+ forall j, j != 0 -> delta_ j = delta,
+ (d > 1)%N
+ & n \in Cnat].
+Proof.
+have nz_j1 : #1 != 0 :> Iirr W2 by rewrite Iirr1_neq0.
+have invj j: j != 0 -> mu2_ 0 j 1%g = d%:R /\ delta_ j = delta.
+ move=> nz_j; have [k co_k_j1 Dj] := cfExp_prime_transitive w2_pr nz_j1 nz_j.
+ rewrite -(cforder_dprodr defW) -dprod_IirrEr in co_k_j1.
+ have{co_k_j1} [[u Dj1u] _] := cycTIiso_aut_exists ctiWM co_k_j1.
+ rewrite dprod_IirrEr -rmorphX -Dj /= -!dprod_IirrEr -!/(w_ _ _) in Dj1u.
+ rewrite truncCK ?Cnat_irr1 //.
+ have: delta_ j *: mu2_ 0 j == cfAut u (delta_ #1 *: mu2_ 0 #1).
+ by rewrite -!(cycTIiso_prTIirr pddM) -/ctiWM -Dj1u.
+ rewrite raddfZsign /= -prTIirr_aut eq_scaled_irr signr_eq0 /= /mu2_.
+ by case/andP=> /eqP-> /eqP->; rewrite prTIirr_aut cfunE aut_Cnat ?Cnat_irr1.
+have d_gt1: (d > 1)%N.
+ rewrite ltn_neqAle andbC -eqC_nat -ltC_nat truncCK ?Cnat_irr1 //.
+ rewrite irr1_gt0 /= eq_sym; apply: contraNneq nz_j1 => mu2_lin.
+ have: mu2_ 0 #1 \is a linear_char by rewrite qualifE irr_char /= mu2_lin.
+ by rewrite lin_irr_der1 => /(prTIirr0P ptiWM)[i /irr_inj/prTIirr_inj[_ ->]].
+split=> // [i j /invj[<- _] | _ /invj[//] | ]; first by rewrite prTIirr_1.
+have: (d%:R == delta %[mod w1])%C by rewrite truncCK ?Cnat_irr1 ?prTIirr1_mod.
+rewrite /eqCmod unfold_in -/n (negPf (neq0CG W1)) CnatEint => ->.
+rewrite divr_ge0 ?ler0n // [delta]signrE opprB addrA -natrD subr_ge0 ler1n.
+by rewrite -(subnKC d_gt1).
+Qed.
+
+Let o_mu2_irr zeta i j :
+ zeta \in calS -> zeta \in irr M -> '[mu2_ i j, zeta] = 0.
+Proof.
+case/seqIndP=> s _ -> irr_sM; rewrite -cfdot_Res_l cfRes_prTIirr cfdot_irr.
+rewrite (negPf (contraNneq _ (prTIred_not_irr ptiWM j))) // => Ds.
+by rewrite -cfInd_prTIres Ds.
+Qed.
+
+Let ZmuBzeta zeta j :
+ zeta \in calS -> zeta 1%g = w1%:R -> j != 0 ->
+ mu_ j - d%:R *: zeta \in 'Z[calS, M'^#].
+Proof.
+move=> Szeta zeta1w1 nz_j; have [mu1 _ _ _] := FTtype345_constants.
+rewrite -[d%:R](mulKf (neq0CiG M M')) mulrC -(mu1 0 j nz_j).
+rewrite -(cfResE _ sM'M) // cfRes_prTIirr -cfInd1 // cfInd_prTIres.
+by rewrite (seqInd_sub_lin_vchar _ Szeta) ?calSmu // -(index_sdprod defM).
+Qed.
+
+Let mu0Bzeta_on zeta :
+ zeta \in calS -> zeta 1%g = w1%:R -> mu_ 0 - zeta \in 'CF(M, 'A(M)).
+Proof.
+move/seqInd_on=> M'zeta zeta1w1; rewrite [mu_ 0]prTIred0 defA cfun_onD1.
+rewrite !cfunE zeta1w1 cfuniE // group1 mulr1 subrr rpredB ?M'zeta //=.
+by rewrite rpredZ ?cfuni_on.
+Qed.
+
+(* We need to prove (10.5) - (10.7) for an arbitrary choice of zeta, to allow *)
+(* part of the proof of (10.5) to be reused in that of (11.8). *)
+Variable zeta : 'CF(M).
+Hypotheses (irr_zeta : zeta \in irr M) (Szeta : zeta \in calS).
+Hypothesis (zeta1w1 : zeta 1%g = w1%:R).
+
+Let o_mu2_zeta i j : '[mu2_ i j, zeta] = 0. Proof. exact: o_mu2_irr. Qed.
+
+Let o_mu_zeta j : '[mu_ j, zeta] = 0.
+Proof. by rewrite cfdot_suml big1 // => i _; apply: o_mu2_zeta. Qed.
+
+Definition FTtype345_bridge i j := mu2_ i j - delta *: mu2_ i 0 - n *: zeta.
+Local Notation alpha_ := FTtype345_bridge.
+
+(* This is the first part of Peterfalvi (10.5), which does not depend on the *)
+(* coherence assumption that will ultimately be refuted by (10.8). *)
+Lemma supp_FTtype345_bridge i j : j != 0 -> alpha_ i j \in 'CF(M, 'A0(M)).
+Proof.
+move=> nz_j; have [Dd Ddelta _ _] := FTtype345_constants.
+have Dmu2 := prTIirr_id pddM.
+have W1a0 x: x \in W1 -> alpha_ i j x = 0.
+ move=> W1x; rewrite !cfunE; have [-> | ntx] := eqVneq x 1%g.
+ by rewrite Dd // prTIirr0_1 mulr1 zeta1w1 divfK ?neq0CG ?subrr.
+ have notM'x: x \notin M'.
+ apply: contra ntx => M'x; have: x \in M' :&: W1 by apply/setIP.
+ by rewrite coprime_TIg ?inE.
+ have /sdprod_context[_ sW1W _ _ tiW21] := dprodWsdC defW.
+ have abW2: abelian W2 := cyclic_abelian cycW2.
+ have Wx: x \in W :\: W2.
+ rewrite inE (contra _ ntx) ?(subsetP sW1W) // => W2x.
+ by rewrite -in_set1 -set1gE -tiW21 inE W2x.
+ rewrite !Dmu2 {Wx}// Ddelta // prTIsign0 scale1r !dprod_IirrE cfunE.
+ rewrite -!(cfResE _ sW1W) ?cfDprodKl_abelian // subrr.
+ have [s _ ->] := seqIndP Szeta.
+ by rewrite (cfun_on0 (cfInd_normal _ _)) ?mulr0 ?subrr.
+apply/cfun_onP=> x; rewrite !inE defA notMtype1 /= => /norP[notM'x].
+set pi := \pi(M'); have [Mx /= pi_x | /cfun0->//] := boolP (x \in M).
+have hallM': pi.-Hall(M) M' by rewrite Hall_pi -?(coprime_sdprod_Hall_l defM).
+have hallW1: pi^'.-Hall(M) W1 by rewrite -(compl_pHall _ hallM') sdprod_compl.
+have{pi_x} pi'x: pi^'.-elt x.
+ apply: contraR notM'x => not_pi'x; rewrite !inE (mem_normal_Hall hallM') //.
+ rewrite not_pi'x andbT negbK in pi_x.
+ by rewrite (contraNneq _ not_pi'x) // => ->; apply: p_elt1.
+have [|y My] := Hall_subJ (mmax_sol maxM) hallW1 _ pi'x; rewrite cycle_subG //.
+by case/imsetP=> z Wz ->; rewrite cfunJ ?W1a0.
+Qed.
+Local Notation alpha_on := supp_FTtype345_bridge.
+
+Lemma vchar_FTtype345_bridge i j : alpha_ i j \in 'Z[irr M].
+Proof.
+have [_ _ _ Nn] := FTtype345_constants.
+by rewrite !rpredB ?rpredZsign ?rpredZ_Cnat ?irr_vchar ?mem_zchar.
+Qed.
+Local Notation Zalpha := vchar_FTtype345_bridge.
+Local Hint Resolve Zalpha.
+
+Lemma vchar_Dade_FTtype345_bridge i j :
+ j != 0 -> (alpha_ i j)^\tau \in 'Z[irr G].
+Proof. by move=> nz_j; rewrite Dade_vchar // zchar_split Zalpha alpha_on. Qed.
+Local Notation Zalpha_tau := vchar_Dade_FTtype345_bridge.
+
+(* This covers the last paragraph in the proof of (10.5); it's isolated here *)
+(* because it is reused in the proof of (10.10) and (11.8). *)
+
+Lemma norm_FTtype345_bridge i j :
+ j != 0 -> '[(alpha_ i j)^\tau] = 2%:R + n ^+ 2.
+Proof.
+move=> nz_j; rewrite Dade_isometry ?alpha_on // cfnormBd ?cfnormZ; last first.
+ by rewrite cfdotZr cfdotBl cfdotZl !o_mu2_zeta !(mulr0, subr0).
+have [_ _ _ /Cnat_ge0 n_ge0] := FTtype345_constants.
+rewrite ger0_norm // cfnormBd ?cfnorm_sign ?cfnorm_irr ?irrWnorm ?mulr1 //.
+by rewrite cfdotZr (cfdot_prTIirr pddM) (negPf nz_j) andbF ?mulr0.
+Qed.
+Local Notation norm_alpha := norm_FTtype345_bridge.
+
+Implicit Type tau : {additive 'CF(M) -> 'CF(G)}.
+
+(* This exported version is adapted to its use in (11.8). *)
+Lemma FTtype345_bridge_coherence calS1 tau1 i j X Y :
+ coherent_with calS1 M^# tau tau1 -> (alpha_ i j)^\tau = X + Y ->
+ cfConjC_subset calS1 calS0 -> {subset calS1 <= irr M} ->
+ j != 0 -> Y \in 'Z[map tau1 calS1] -> '[Y, X] = 0 -> '[Y] = n ^+ 2 ->
+ X = delta *: (eta_ i j - eta_ i 0).
+Proof.
+move=> cohS1 Dalpha sS10 irrS1 nz_j S1_Y oYX nY_n2.
+have [[_ Ddelta _ Nn] [[Itau1 Ztau1] _]] := (FTtype345_constants, cohS1).
+have [|z Zz defY] := zchar_expansion _ S1_Y.
+ rewrite map_inj_in_uniq; first by case: sS10.
+ by apply: sub_in2 (Zisometry_inj Itau1); apply: mem_zchar.
+have nX_2: '[X] = 2%:R.
+ apply: (addrI '[Y]); rewrite -cfnormDd // addrC -Dalpha norm_alpha //.
+ by rewrite addrC nY_n2.
+have Z_X: X \in 'Z[irr G].
+ rewrite -[X](addrK Y) -Dalpha rpredB ?Zalpha_tau // defY big_map big_seq.
+ by apply: rpred_sum => psi S1psi; rewrite rpredZ_Cint // Ztau1 ?mem_zchar.
+apply: eq_signed_sub_cTIiso => // y Vy; rewrite -[X](addrK Y) -Dalpha -/delta.
+rewrite !cfunE !cycTIiso_restrict //; set rhs := delta * _.
+rewrite Dade_id ?defA0 //; last by rewrite setUC inE mem_class_support.
+have notM'y: y \notin M'.
+ by have:= subsetP (prDade_supp_disjoint pddM) y Vy; rewrite inE.
+have Wy: y \in W :\: W2 by move: Vy; rewrite !inE => /andP[/norP[_ ->]].
+rewrite !cfunE 2?{1}prTIirr_id // prTIsign0 scale1r Ddelta // cfunE -mulrBr.
+rewrite -/rhs (cfun_on0 (seqInd_on _ Szeta)) // mulr0 subr0.
+rewrite (ortho_cycTIiso_vanish ctiWG) ?subr0 // -/sigma.
+apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i1 [j1 ->]] ->].
+rewrite defY cfdot_suml big_map big1_seq //= => psi S1psi.
+by rewrite cfdotZl (coherent_ortho_cycTIiso MtypeP sS10) ?irrS1 ?mulr0.
+Qed.
+
+(* This is a specialization of the above, used in (10.5) and (10.10). *)
+Let def_tau_alpha calS1 tau1 i j :
+ coherent_with calS1 M^# tau tau1 -> cfConjC_subset calS1 calS0 ->
+ j != 0 -> zeta \in calS1 -> '[(alpha_ i j)^\tau, tau1 zeta] = - n ->
+ (alpha_ i j)^\tau = delta *: (eta_ i j - eta_ i 0) - n *: tau1 zeta.
+Proof.
+move=> cohS1 [_ sS10 ccS1] nz_j S1zeta alpha_zeta_n.
+have [[_ _ _ Nn] [[Itau1 _] _]] := (FTtype345_constants, cohS1).
+set Y := - (n *: _); apply: canRL (addrK _) _; set X := _ + _.
+have Dalpha: (alpha_ i j)^\tau = X + Y by rewrite addrK.
+have nY_n2: '[Y] = n ^+ 2.
+ by rewrite cfnormN cfnormZ norm_Cnat // Itau1 ?mem_zchar // irrWnorm ?mulr1.
+pose S2 := zeta :: zeta^*%CF; pose S2tau1 := map tau1 S2.
+have S2_Y: Y \in 'Z[S2tau1] by rewrite rpredN rpredZ_Cnat ?mem_zchar ?mem_head.
+have sS21: {subset S2 <= calS1} by apply/allP; rewrite /= ccS1 ?S1zeta.
+have cohS2 : coherent_with S2 M^# tau tau1 := subset_coherent_with sS21 cohS1.
+have irrS2: {subset S2 <= irr M} by apply/allP; rewrite /= cfAut_irr irr_zeta.
+rewrite (FTtype345_bridge_coherence cohS2 Dalpha) //; last first.
+ rewrite -[X]opprK cfdotNr opprD cfdotDr nY_n2 cfdotNl cfdotNr opprK cfdotZl.
+ by rewrite cfdotC alpha_zeta_n rmorphN conj_Cnat // mulrN addNr oppr0.
+split=> [|_ /sS21/sS10//|]; last first.
+ by apply/allP; rewrite /= !inE cfConjCK !eqxx orbT.
+by rewrite /= inE eq_sym; have [[_ /hasPn-> //]] := scohS0; apply: sS10.
+Qed.
+
+Section NonCoherence.
+
+(* We will ultimately contradict these assumptions. *)
+(* Note that we do not need to export any lemma save the final contradiction. *)
+Variable tau1 : {additive 'CF(M) -> 'CF(G)}.
+Hypothesis cohS : coherent_with calS M^# tau tau1.
+
+Local Notation "mu ^\tau1" := (tau1 mu%CF)
+ (at level 2, format "mu ^\tau1") : ring_scope.
+
+Let Dtau1 : {in 'Z[calS, M'^#], tau1 =1 tau}.
+Proof. by case: cohS => _; apply: sub_in1; apply: zchar_onS; apply: setSD. Qed.
+
+Let o_zeta_s: '[zeta, zeta^*] = 0.
+Proof. by rewrite (seqInd_conjC_ortho _ _ _ Szeta) ?mFT_odd /= ?defMs. Qed.
+
+Import ssrint rat.
+
+(* This is the second part of Peterfalvi (10.5). *)
+Let tau_alpha i j : j != 0 ->
+ (alpha_ i j)^\tau = delta *: (eta_ i j - eta_ i 0) - n *: zeta^\tau1.
+Proof.
+move=> nz_j; set al_ij := alpha_ i j; have [[Itau1 Ztau1] _] := cohS.
+have [mu1 Ddelta d_gt1 Nn] := FTtype345_constants.
+pose a := '[al_ij^\tau, zeta^\tau1] + n.
+have al_ij_zeta_s: '[al_ij^\tau, zeta^*^\tau1] = a.
+ apply: canRL (addNKr _) _; rewrite addrC -opprB -cfdotBr -raddfB.
+ have M'dz: zeta - zeta^*%CF \in 'Z[calS, M'^#] by apply: seqInd_sub_aut_zchar.
+ rewrite Dtau1 // Dade_isometry ?alpha_on ?tauM' //.
+ rewrite cfdotBr opprB cfdotBl cfdot_conjCr rmorphB linearZ /=.
+ rewrite -!prTIirr_aut !cfdotBl !cfdotZl !o_mu2_zeta o_zeta_s !mulr0.
+ by rewrite opprB !(subr0, rmorph0) add0r irrWnorm ?mulr1.
+have Zal_ij: al_ij^\tau \in 'Z[irr G] by apply: Zalpha_tau.
+have Za: a \in Cint.
+ by rewrite rpredD ?(Cint_Cnat Nn) ?Cint_cfdot_vchar ?Ztau1 ?(mem_zchar Szeta).
+have{al_ij_zeta_s} ub_da2: (d ^ 2)%:R * a ^+ 2 <= (2%:R + n ^+ 2) * w1%:R.
+ have [k nz_k j'k]: exists2 k, k != 0 & k != j.
+ have:= w2gt2; rewrite -nirrW2 (cardD1 0) (cardD1 j) !inE nz_j !ltnS lt0n.
+ by case/pred0Pn=> k /and3P[]; exists k.
+ have muk_1: mu_ k 1%g = (d * w1)%:R.
+ by rewrite (prTIred_1 pddM) mu1 // mulrC -natrM.
+ rewrite natrX -exprMn; have <-: '[al_ij^\tau, (mu_ k)^\tau1] = d%:R * a.
+ rewrite mulrDr mulr_natl -raddfMn /=; apply: canRL (addNKr _) _.
+ rewrite addrC -cfdotBr -raddfMn -raddfB -scaler_nat.
+ rewrite Dtau1 ?Dade_isometry ?alpha_on ?tauM' ?ZmuBzeta // cfdotBr cfdotZr.
+ rewrite rmorph_nat !cfdotBl !cfdotZl !o_mu2_zeta irrWnorm //.
+ rewrite !(cfdot_prTIirr_red pddM) cfdotC o_mu_zeta conjC0 !mulr0 mulr1.
+ by rewrite 2![_ == k](negPf _) 1?eq_sym // mulr0 -mulrN opprB !subr0 add0r.
+ have ZSmuk: mu_ k \in 'Z[calS] by rewrite mem_zchar ?calSmu.
+ have <-: '[al_ij^\tau] * '[(mu_ k)^\tau1] = (2%:R + n ^+ 2) * w1%:R.
+ by rewrite Itau1 // cfdot_prTIred eqxx mul1n norm_alpha.
+ by rewrite -Cint_normK ?cfCauchySchwarz // Cint_cfdot_vchar // Ztau1.
+suffices a0 : a = 0.
+ by apply: (def_tau_alpha _ sSS0); rewrite // -sub0r -a0 addrK.
+apply: contraTeq (d_gt1) => /(sqr_Cint_ge1 Za) a2_ge1.
+suffices: n == 0.
+ rewrite mulf_eq0 invr_eq0 orbC -implyNb neq0CG /= subr_eq0 => /eqP Dd.
+ by rewrite -ltC_nat -(normr_nat _ d) Dd normr_sign ltrr.
+suffices: n ^+ 2 < n + 1.
+ have d_dv_M: (d%:R %| #|M|)%C by rewrite -(mu1 0 j) // ?dvd_irr1_cardG.
+ have{d_dv_M} d_odd: odd d by apply: dvdn_odd (mFT_odd M); rewrite -dvdC_nat.
+ have: (2 %| n * w1%:R)%C.
+ rewrite divfK ?neq0CG // -signrN signrE addrA -(natrD _ d 1).
+ by rewrite rpredB // dvdC_nat dvdn2 ?odd_double // odd_add d_odd.
+ rewrite -(truncCK Nn) -mulrSr -natrM -natrX ltC_nat (dvdC_nat 2) pnatr_eq0.
+ rewrite dvdn2 odd_mul mFT_odd; case: (truncC n) => [|[|n1]] // _ /idPn[].
+ by rewrite -leqNgt (ltn_exp2l 1).
+apply: ltr_le_trans (_ : n * - delta + 1 <= _); last first.
+ have ->: n + 1 = n * `|- delta| + 1 by rewrite normrN normr_sign mulr1.
+ rewrite ler_add2r ler_wpmul2l ?Cnat_ge0 ?real_ler_norm //.
+ by rewrite rpredN ?rpred_sign.
+rewrite -(ltr_pmul2r (ltC_nat 0 2)) mulrDl mul1r -[rhs in rhs + _]mulrA.
+apply: ler_lt_trans (_ : n ^+ 2 * (w1%:R - 1) < _).
+ rewrite -(subnKC w1gt2) -(@natrB _ _ 1) // ler_wpmul2l ?leC_nat //.
+ by rewrite Cnat_ge0 ?rpredX.
+rewrite -(ltr_pmul2l (gt0CG W1)) -/w1 2!mulrBr mulr1 mulrCA -exprMn.
+rewrite mulrDr ltr_subl_addl addrCA -mulrDr mulrCA mulrA -ltr_subl_addl.
+rewrite -mulrBr mulNr opprK divfK ?neq0CG // mulr_natr addrA subrK -subr_sqr.
+rewrite sqrr_sign mulrC [_ + 2%:R]addrC (ltr_le_trans _ ub_da2) //.
+apply: ltr_le_trans (ler_wpmul2l (ler0n _ _) a2_ge1).
+by rewrite mulr1 ltr_subl_addl -mulrS -natrX ltC_nat.
+Qed.
+
+(* This is the first part of Peterfalvi (10.6)(a). *)
+Let tau1mu j : j != 0 -> (mu_ j)^\tau1 = delta *: \sum_i eta_ i j.
+Proof.
+move=> nz_j; have [[[Itau1 _] _] Smu_j] := (cohS, calSmu nz_j).
+have eta_mu i: '[delta *: (eta_ i j - eta_ i 0), (mu_ j)^\tau1] = 1.
+ have Szeta_s: zeta^*%CF \in calS by rewrite cfAut_seqInd.
+ have o_zeta_s_w k: '[eta_ i k, d%:R *: zeta^*^\tau1] = 0.
+ have o_S_eta_ := coherent_ortho_cycTIiso MtypeP sSS0 cohS.
+ by rewrite cfdotZr cfdotC o_S_eta_ ?conjC0 ?mulr0 // cfAut_irr.
+ pose psi := mu_ j - d%:R *: zeta^*%CF; rewrite (canRL (subrK _) (erefl psi)).
+ rewrite (raddfD tau1) raddfZnat cfdotDr addrC cfdotZl cfdotBl !{}o_zeta_s_w.
+ rewrite subr0 mulr0 add0r -(canLR (subrK _) (tau_alpha i nz_j)).
+ have Zpsi: psi \in 'Z[calS, M'^#].
+ by rewrite ZmuBzeta // cfunE zeta1w1 rmorph_nat.
+ rewrite cfdotDl cfdotZl Itau1 ?(zcharW Zpsi) ?mem_zchar // -cfdotZl Dtau1 //.
+ rewrite Dade_isometry ?alpha_on ?tauM' {Zpsi}// -cfdotDl cfdotBr cfdotZr.
+ rewrite subrK !cfdotBl !cfdotZl !cfdot_prTIirr_red eq_sym (negPf nz_j).
+ by rewrite !o_mu2_irr ?cfAut_irr // !(mulr0, subr0) eqxx.
+have [_ Ddel _ _] := FTtype345_constants.
+have [[d1 k] Dtau1mu] := FTtypeP_coherent_TIred sSS0 cohS irr_zeta Szeta Smu_j.
+case=> [[Dd1 Dk] | [_ Dk _]]; first by rewrite Dtau1mu Dd1 Dk [_ ^+ _]Ddel.
+have /esym/eqP/idPn[] := eta_mu 0; rewrite Dtau1mu Dk /= cfdotZl cfdotZr.
+rewrite cfdot_sumr big1 ?mulr0 ?oner_eq0 // => i _; rewrite -/sigma -/(w_ i _).
+rewrite cfdotBl !(cfdot_cycTIiso pddM) !(eq_sym 0) conjC_Iirr_eq0 -!irr_eq1.
+rewrite (eq_sym j) -(inj_eq irr_inj) conjC_IirrE.
+by rewrite odd_eq_conj_irr1 ?mFT_odd ?subrr.
+Qed.
+
+(* This is the second part of Peterfalvi (10.6)(a). *)
+Let tau1mu0 : (mu_ 0 - zeta)^\tau = \sum_i eta_ i 0 - zeta^\tau1.
+Proof.
+have [j nz_j] := has_nonprincipal_irr ntW2.
+have sum_al: \sum_i alpha_ i j = mu_ j - d%:R *: zeta - delta *: (mu_ 0 - zeta).
+ rewrite scalerBr opprD addrACA scaler_sumr !sumrB sumr_const; congr (_ + _).
+ by rewrite -opprD -scalerBl nirrW1 -scaler_nat scalerA mulrC divfK ?neq0CG.
+have ->: mu_ 0 - zeta = delta *: (mu_ j - d%:R *: zeta - \sum_i alpha_ i j).
+ by rewrite sum_al opprD addNKr opprK signrZK.
+rewrite linearZ linearB; apply: canLR (signrZK _) _; rewrite -/delta /=.
+rewrite linear_sum -Dtau1 ?ZmuBzeta //= raddfB raddfZnat addrAC scalerBr.
+rewrite (eq_bigr _ (fun i _ => tau_alpha i nz_j)) sumrB sumr_const nirrW1 opprD.
+rewrite -scaler_sumr sumrB scalerBr -tau1mu // opprD !opprK -!addrA addNKr.
+congr (_ + _); rewrite -scaler_nat scalerA mulrC divfK ?neq0CG //.
+by rewrite addrC -!scaleNr -scalerDl addKr.
+Qed.
+
+(* This is Peterfalvi (10.6)(b). *)
+Let zeta_tau1_coprime g :
+ g \notin 'A~(M) -> coprime #[g] w1 -> `|zeta^\tau1 g| >= 1.
+Proof.
+move=> notAg co_g_w1; have Amu0zeta := mu0Bzeta_on Szeta zeta1w1.
+have mu0_zeta_g: (mu_ 0 - zeta)^\tau g = 0.
+ have [ | ] := boolP (g \in 'A0~(M)); rewrite -FT_Dade0_supportE; last first.
+ by apply: cfun_on0; apply: Dade_cfunS.
+ case/bigcupP=> x A0x xRg; rewrite (DadeE _ A0x) // (cfun_on0 Amu0zeta) //.
+ apply: contra notAg => Ax; apply/bigcupP; exists x => //.
+ by rewrite -def_FTsignalizer0.
+have{mu0_zeta_g} zeta_g: zeta^\tau1 g = \sum_i eta_ i 0 g.
+ by apply/esym/eqP; rewrite -subr_eq0 -{2}mu0_zeta_g tau1mu0 !cfunE sum_cfunE.
+have Zwg i: eta_ i 0 g \in Cint.
+ have Lchi: 'chi_i \is a linear_char by apply: irr_cyclic_lin.
+ rewrite Cint_cycTIiso_coprime // dprod_IirrE irr0 cfDprod_cfun1r.
+ rewrite (coprime_dvdr _ co_g_w1) // dvdn_cforder.
+ rewrite -rmorphX cfDprodl_eq1 -dvdn_cforder; apply/dvdn_cforderP=> x W1x.
+ by rewrite -lin_charX // -expg_mod_order (eqnP (order_dvdG W1x)) lin_char1.
+have odd_zeta_g: (zeta^\tau1 g == 1 %[mod 2])%C.
+ rewrite zeta_g (bigD1 0) //= [w_ 0 0]cycTIirr00 cycTIiso1 cfun1E inE.
+ pose eW1 := [pred i : Iirr W1 | conjC_Iirr i < i]%N.
+ rewrite (bigID eW1) (reindex_inj (can_inj (@conjC_IirrK _ _))) /=.
+ set s1 := \sum_(i | _) _; set s2 := \sum_(i | _) _; suffices ->: s1 = s2.
+ by rewrite -mulr2n addrC -(mulr_natr _ 2) eqCmod_addl_mul ?rpred_sum.
+ apply/eq_big=> [i | i _].
+ rewrite (canF_eq (@conjC_IirrK _ _)) conjC_Iirr0 conjC_IirrK -leqNgt.
+ rewrite ltn_neqAle val_eqE -irr_eq1 (eq_sym i) -(inj_eq irr_inj) andbA.
+ by rewrite aut_IirrE odd_eq_conj_irr1 ?mFT_odd ?andbb.
+ rewrite -{1}conjC_Iirr0 [w_ _ _]cycTIirr_aut -cfAut_cycTIiso.
+ by rewrite cfunE conj_Cint ?Zwg.
+rewrite norm_Cint_ge1 //; first by rewrite zeta_g rpred_sum.
+apply: contraTneq odd_zeta_g => ->.
+by rewrite eqCmod_sym /eqCmod subr0 /= (dvdC_nat 2 1).
+Qed.
+
+(* This is Peterfalvi (10.7). *)
+Let Frob_der1_type2 S :
+ S \in 'M -> FTtype S == 2 -> [Frobenius S^`(1) with kernel S`_\F].
+Proof.
+move: S => L maxL /eqP Ltype2.
+have [S pairMS [xdefW [U StypeP]]] := FTtypeP_pair_witness maxM MtypeP.
+have [[_ _ maxS] _] := pairMS; rewrite {1}(negPf notMtype2) /= => Stype2 _.
+move/(_ L maxL)/implyP; rewrite Ltype2 /= => /setUP[] /imsetP[x0 _ defL].
+ by case/eqP/idPn: Ltype2; rewrite defL FTtypeJ.
+pose H := (S`_\F)%G; pose HU := (S^`(1))%G.
+suffices{L Ltype2 maxL x0 defL}: [Frobenius HU = H ><| U].
+ by rewrite defL derJ FcoreJ FrobeniusJker; apply: FrobeniusWker.
+have sHHU: H \subset HU by have [_ [_ _ _ /sdprodW/mulG_sub[]]] := StypeP.
+pose calT := seqIndD HU S H 1; pose tauS := FT_Dade0 maxS.
+have DcalTs: calT = seqIndD HU S S`_\s 1.
+ by congr (seqIndD _ _ _ _); apply: val_inj; rewrite /= FTcore_type2.
+have notFrobM: ~~ [Frobenius M with kernel M`_\F].
+ by apply/existsP=> [[U1 /Frobenius_of_typeF/(typePF_exclusion MtypeP)]].
+have{notFrobM} notSsupportM: ~~ [exists x, FTsupports M (S :^ x)].
+ apply: contra notFrobM => /'exists_existsP[x [y /and3P[Ay not_sCyM sCySx]]].
+ have [_ [_ /(_ y)uMS] /(_ y)] := FTsupport_facts maxM.
+ rewrite inE (subsetP (FTsupp_sub0 _)) //= in uMS *.
+ rewrite -(eq_uniq_mmax (uMS not_sCyM) _ sCySx) ?mmaxJ // FTtypeJ.
+ by case=> // _ _ _ [_ ->].
+have{notSsupportM} tiA1M_AS: [disjoint 'A1~(M) & 'A~(S)].
+ have notMG_S: gval S \notin M :^: G.
+ by apply: contraL Stype2 => /imsetP[x _ ->]; rewrite FTtypeJ.
+ by apply: negbNE; have [_ <- _] := FT_Dade_support_disjoint maxM maxS notMG_S.
+pose pddS := FT_prDade_hypF maxS StypeP; pose nu := primeTIred pddS.
+have{tiA1M_AS} oST phi psi:
+ phi \in 'Z[calS, M^#] -> psi \in 'Z[calT, S^#] -> '[phi^\tau, tauS psi] = 0.
+- rewrite zcharD1_seqInd // -[seqInd _ _]/calS => Sphi.
+ rewrite zcharD1E => /andP[Tpsi psi1_0].
+ rewrite -FT_Dade1E ?defA1 ?(zchar_on Sphi) //.
+ apply: cfdot_complement (Dade_cfunS _ _) _; rewrite FT_Dade1_supportE setTD.
+ rewrite -[tauS _]FT_DadeE ?(cfun_onS _ (Dade_cfunS _ _)) ?FT_Dade_supportE //.
+ by rewrite -disjoints_subset disjoint_sym.
+ have /subsetD1P[_ /setU1K <-] := FTsupp_sub S; rewrite cfun_onD1 {}psi1_0.
+ rewrite -Tpsi andbC -zchar_split {psi Tpsi}(zchar_trans_on _ Tpsi) //.
+ move=> psi Tpsi; rewrite zchar_split mem_zchar //=.
+ have [s /setDP[_ kerH's] ->] := seqIndP Tpsi.
+ by rewrite inE in kerH's; rewrite (prDade_Ind_irr_on pddS).
+have notStype5: FTtype S != 5 by rewrite (eqP Stype2).
+have [|[_ _ _ _ -> //]] := typeP_reducible_core_cases maxS StypeP notStype5.
+case=> t []; set lambda := 'chi_t => T0C'lam lam_1 _.
+have{T0C'lam} Tlam: lambda \in calT.
+ by apply: seqIndS T0C'lam; rewrite Iirr_kerDS ?sub1G.
+have{lam_1} [r [nz_r Tnu_r nu_r_1]]:
+ exists r, [/\ r != 0, nu r \in calT & nu r 1%g = lambda 1%g].
+- have [_] := typeP_reducible_core_Ind maxS StypeP notStype5.
+ set H0 := Ptype_Fcore_kernel _; set nuT := filter _ _; rewrite -/nu.
+ case/hasP=> nu_r nuTr _ /(_ _ nuTr)/imageP[r nz_r Dr] /(_ _ nuTr)[nu_r1 _ _].
+ have{nuTr} Tnu_r := mem_subseq (filter_subseq _ _) nuTr.
+ by exists r; rewrite -Dr nu_r1 (seqIndS _ Tnu_r) // Iirr_kerDS ?sub1G.
+pose T2 := [:: lambda; lambda^*; nu r; (nu r)^*]%CF.
+have [rmRS scohT]: exists rmRS, subcoherent calT tauS rmRS.
+ move: (FTtypeP_coh_base _ _) (FTtypeP_subcoherent maxS StypeP) => RS scohT.
+ by rewrite DcalTs; exists RS.
+have [lam_irr nu_red]: lambda \in irr S /\ nu r \notin irr S.
+ by rewrite mem_irr prTIred_not_irr.
+have [lam'nu lams'nu]: lambda != nu r /\ lambda^*%CF != nu r.
+ by rewrite -conjC_IirrE !(contraNneq _ nu_red) // => <-; apply: mem_irr.
+have [[_ nRT ccT] _ _ _ _] := scohT.
+have{ccT} sT2T: {subset T2 <= calT} by apply/allP; rewrite /= ?Tlam ?Tnu_r ?ccT.
+have{nRT} uccT2: cfConjC_subset T2 calT.
+ split; last 1 [by [] | by apply/allP; rewrite /= !inE !cfConjCK !eqxx !orbT].
+ rewrite /uniq /T2 !inE !negb_or -!(inv_eq (@cfConjCK _ S)) !cfConjCK.
+ by rewrite lam'nu lams'nu !(hasPn nRT).
+have scohT2 := subset_subcoherent scohT uccT2.
+have [tau2 cohT2]: coherent T2 S^# tauS.
+ apply: (uniform_degree_coherence scohT2); rewrite /= !cfunE nu_r_1 eqxx.
+ by rewrite conj_Cnat ?Cnat_irr1 ?eqxx.
+have [s nz_s] := has_nonprincipal_irr ntW2; have Smu_s := calSmu nz_s.
+pose alpha := mu_ s - d%:R *: zeta; pose beta := nu r - lambda.
+have Salpha: alpha \in 'Z[calS, M^#] by rewrite zcharD1_seqInd ?ZmuBzeta.
+have [T2lam T2nu_r]: lambda \in T2 /\ nu r \in T2 by rewrite !inE !eqxx !orbT.
+have Tbeta: beta \in 'Z[T2, S^#].
+ by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE nu_r_1 subrr.
+have /eqP/idPn[] := oST _ _ Salpha (zchar_subset sT2T Tbeta).
+have [[_ <- //] [_ <- //]] := (cohS, cohT2).
+rewrite !raddfB raddfZnat /= subr_eq0 !cfdotBl !cfdotZl.
+have [|[dr r'] -> _] := FTtypeP_coherent_TIred _ cohT2 lam_irr T2lam T2nu_r.
+ by rewrite -DcalTs.
+set sigS := cyclicTIiso _ => /=.
+have etaC i j: sigS (cyclicTIirr xdefW j i) = eta_ i j by apply: cycTIisoC.
+rewrite !cfdotZr addrC cfdot_sumr big1 => [|j _]; last first.
+ by rewrite etaC (coherent_ortho_cycTIiso _ sSS0) ?mem_irr.
+rewrite !mulr0 oppr0 add0r rmorph_sign.
+have ->: '[zeta^\tau1, tau2 lambda] = 0.
+ pose X1 := (zeta :: zeta^*)%CF; pose X2 := (lambda :: lambda^*)%CF.
+ pose Y1 := map tau1 X1; pose Y2 := map tau2 X2; have [_ _ ccS] := sSS0.
+ have [sX1S sX2T]: {subset X1 <= calS} /\ {subset X2 <= T2}.
+ by split; apply/allP; rewrite /= ?inE ?eqxx ?orbT // Szeta ccS.
+ have [/(sub_iso_to (zchar_subset sX1S) sub_refl)[Itau1 Ztau1] Dtau1L] := cohS.
+ have [/(sub_iso_to (zchar_subset sX2T) sub_refl)[Itau2 Ztau2] Dtau2] := cohT2.
+ have Z_Y12: {subset Y1 <= 'Z[irr G]} /\ {subset Y2 <= 'Z[irr G]}.
+ by rewrite /Y1 /Y2; split=> ? /mapP[xi /mem_zchar] => [/Ztau1|/Ztau2] ? ->.
+ have o1Y12: orthonormal Y1 && orthonormal Y2.
+ rewrite !map_orthonormal //.
+ by apply: seqInd_conjC_ortho2 Tlam; rewrite ?gFnormal ?mFT_odd.
+ by apply: seqInd_conjC_ortho2 Szeta; rewrite ?gFnormal ?mFT_odd ?mem_irr.
+ apply: orthonormal_vchar_diff_ortho Z_Y12 o1Y12 _; rewrite -2!raddfB.
+ have SzetaBs: zeta - zeta^*%CF \in 'Z[calS, M^#].
+ by rewrite zcharD1_seqInd // seqInd_sub_aut_zchar.
+ have T2lamBs: lambda - lambda^*%CF \in 'Z[T2, S^#].
+ rewrite sub_aut_zchar ?zchar_onG ?mem_zchar ?inE ?eqxx ?orbT //.
+ by move=> xi /sT2T/seqInd_vcharW.
+ by rewrite Dtau1L // Dtau2 // !Dade1 oST ?(zchar_subset sT2T) ?eqxx.
+have [[ds s'] /= -> _] := FTtypeP_coherent_TIred sSS0 cohS irr_zeta Szeta Smu_s.
+rewrite mulr0 subr0 !cfdotZl mulrA -signr_addb !cfdot_suml.
+rewrite (bigD1 r') //= cfdot_sumr (bigD1 s') //=.
+rewrite etaC cfdot_cycTIiso !eqxx big1 => [|j ne_s'_j]; last first.
+ by rewrite etaC cfdot_cycTIiso andbC eq_sym (negPf ne_s'_j).
+rewrite big1 => [|i ne_i_r']; last first.
+ rewrite cfdot_sumr big1 // => j _.
+ by rewrite etaC cfdot_cycTIiso (negPf ne_i_r').
+rewrite !addr0 mulr1 big1 ?mulr0 ?signr_eq0 // => i _.
+by rewrite -etaC cfdotC (coherent_ortho_cycTIiso _ _ cohT2) ?conjC0 -?DcalTs.
+Qed.
+
+(* This is the bulk of the proof of Peterfalvi (10.8); however the result *)
+(* will be restated below to avoid the quantification on zeta and tau1. *)
+Lemma FTtype345_noncoherence_main : False.
+Proof.
+have [S pairMS [xdefW [U StypeP]]] := FTtypeP_pair_witness maxM MtypeP.
+have [[_ _ maxS] _] := pairMS; rewrite {1}(negPf notMtype2) /= => Stype2 _ _.
+pose H := (S`_\F)%G; pose HU := (S^`(1))%G.
+have [[_ hallW2 _ defS] [_ _ nUW2 defHU] _ [_ _ sW1H _ _] _] := StypeP.
+have ntU: U :!=: 1%g by have [[]] := compl_of_typeII maxS StypeP Stype2.
+pose G01 := [set g : gT | coprime #[g] w1].
+pose G0 := ~: 'A~(M) :&: G01; pose G1 := ~: 'A~(M) :\: G01.
+pose chi := zeta^\tau1; pose ddAM := FT_Dade_hyp maxM; pose rho := invDade ddAM.
+have Suzuki:
+ #|G|%:R^-1 * (\sum_(g in ~: 'A~(M)) `|chi g| ^+ 2 - #|~: 'A~(M)|%:R)
+ + '[rho chi] - #|'A(M)|%:R / #|M|%:R <= 0.
+- pose A_ (_ : 'I_1) := ddAM; pose Atau i := Dade_support (A_ i).
+ have tiA i j : i != j -> [disjoint Atau i & Atau j] by rewrite !ord1.
+ have Nchi1: '[chi] = 1 by have [[->]] := cohS; rewrite ?mem_zchar ?irrWnorm.
+ have:= Dade_cover_inequality tiA Nchi1; rewrite /= !big_ord1 -/rho -addrA.
+ by congr (_ * _ + _ <= 0); rewrite FT_Dade_supportE setTD.
+have{Suzuki} ub_rho: '[rho chi] <= #|'A(M)|%:R / #|M|%:R + #|G1|%:R / #|G|%:R.
+ rewrite addrC -subr_le0 opprD addrCA (ler_trans _ Suzuki) // -addrA.
+ rewrite ler_add2r -(cardsID G01 (~: _)) (big_setID G01) -/G0 -/G1 /=.
+ rewrite mulrC mulrBr ler_subr_addl -mulrBr natrD addrK.
+ rewrite ler_wpmul2l ?invr_ge0 ?ler0n // -sumr_const ler_paddr //.
+ by apply: sumr_ge0 => g; rewrite exprn_ge0 ?normr_ge0.
+ apply: ler_sum => g; rewrite !inE => /andP[notAg] /(zeta_tau1_coprime notAg).
+ by rewrite expr_ge1 ?normr_ge0.
+have lb_M'bar: (w1 * 2 <= #|M' / M''|%g.-1)%N.
+ suffices ->: w1 = #|W1 / M''|%g.
+ rewrite muln2 -ltnS prednK ?cardG_gt0 //.
+ by rewrite (ltn_odd_Frobenius_ker frobMbar) ?quotient_odd ?mFT_odd.
+ have [_ sW1M _ _ tiM'W1] := sdprod_context defM.
+ apply/card_isog/quotient_isog; first exact: subset_trans (der_norm 2 M).
+ by apply/trivgP; rewrite -tiM'W1 setSI ?normal_sub.
+have lb_rho: 1 - w1%:R / #|M'|%:R <= '[rho chi].
+ have cohS_A: coherent_with calS M^# (Dade ddAM) tau1.
+ have [Itau1 _] := cohS; split=> // phi; rewrite zcharD1_seqInd // => Sphi.
+ by rewrite Dtau1 // FT_DadeE // defA (zchar_on Sphi).
+ rewrite {ub_rho}/rho [w1](index_sdprod defM); rewrite defA in (ddAM) cohS_A *.
+ have [||_ [_ _ [] //]] := Dade_Ind1_sub_lin cohS_A _ irr_zeta Szeta.
+ - by apply: seqInd_nontrivial Szeta; rewrite ?mem_irr ?mFT_odd.
+ - by rewrite -(index_sdprod defM).
+ rewrite -(index_sdprod defM) ler_pdivl_mulr ?ltr0n // -natrM.
+ rewrite -leC_nat in lb_M'bar; apply: ler_trans lb_M'bar _.
+ rewrite ler_subr_addl -mulrS prednK ?cardG_gt0 // leC_nat.
+ by rewrite dvdn_leq ?dvdn_quotient.
+have{lb_rho ub_rho}: 1 - #|G1|%:R/ #|G|%:R - w1%:R^-1 < w1%:R / #|M'|%:R :> algC.
+ rewrite -addrA -opprD ltr_subl_addr -ltr_subl_addl.
+ apply: ler_lt_trans (ler_trans lb_rho ub_rho) _; rewrite addrC ltr_add2l.
+ rewrite ltr_pdivr_mulr ?gt0CG // mulrC -(sdprod_card defM) natrM.
+ by rewrite mulfK ?neq0CG // defA ltC_nat (cardsD1 1%g M') group1.
+have frobHU: [Frobenius HU with kernel H] by apply: Frob_der1_type2.
+have tiH: normedTI H^# G S.
+ by have [_ _] := FTtypeII_ker_TI maxS Stype2; rewrite FTsupp1_type2.
+have sG1_HVG: G1 \subset class_support H^# G :|: class_support V G.
+ apply/subsetP=> x; rewrite !inE coprime_has_primes ?cardG_gt0 // negbK.
+ case/andP=> /hasP[p W1p]; rewrite /= mem_primes => /and3P[p_pr _ p_dv_x] _.
+ have [a x_a a_p] := Cauchy p_pr p_dv_x.
+ have nta: a != 1%g by rewrite -order_gt1 a_p prime_gt1.
+ have ntx: x != 1%g by apply: contraTneq x_a => ->; rewrite /= cycle1 inE.
+ have cxa: a \in 'C[x] by rewrite -cent_cycle (subsetP (cycle_abelian x)).
+ have hallH: \pi(H).-Hall(G) H by apply: Hall_pi; have [] := FTcore_facts maxS.
+ have{a_p} p_a: p.-elt a by rewrite /p_elt a_p pnat_id.
+ have piHp: p \in \pi(H) by rewrite (piSg _ W1p).
+ have [y _ Hay] := Hall_pJsub hallH piHp (subsetT _) p_a.
+ do [rewrite -cycleJ cycle_subG; set ay := (a ^ y)%g] in Hay.
+ rewrite -[x](conjgK y); set xy := (x ^ y)%g.
+ have caxy: xy \in 'C[ay] by rewrite cent1J memJ_conjg cent1C.
+ have [ntxy ntay]: xy != 1%g /\ ay != 1%g by rewrite !conjg_eq1.
+ have Sxy: xy \in S.
+ have H1ay: ay \in H^# by apply/setD1P.
+ by rewrite (subsetP (cent1_normedTI tiH H1ay)) ?setTI.
+ have [HUxy | notHUxy] := boolP (xy \in HU).
+ rewrite memJ_class_support ?inE ?ntxy //=.
+ have [_ _ _ regHUH] := Frobenius_kerP frobHU.
+ by rewrite (subsetP (regHUH ay _)) // inE ?HUxy // inE ntay.
+ suffices /imset2P[xyz z Vxzy _ ->]: xy \in class_support V S.
+ by rewrite -conjgM orbC memJ_class_support.
+ rewrite /V setUC -(FTsupp0_typeP maxS StypeP) !inE Sxy.
+ rewrite andb_orr andNb (contra (subsetP _ _) notHUxy) /=; last first.
+ by apply/bigcupsP=> z _; rewrite (eqP Stype2) setDE -setIA subsetIl.
+ have /Hall_pi hallHU: Hall S HU by rewrite (sdprod_Hall defS).
+ rewrite (eqP Stype2) -(mem_normal_Hall hallHU) ?gFnormal // notHUxy.
+ have /mulG_sub[sHHU _] := sdprodW defHU.
+ rewrite (contra (fun p'xy => pi'_p'group p'xy (piSg sHHU piHp))) //.
+ by rewrite pgroupE p'natE // cycleJ cardJg p_dv_x.
+have ub_G1: #|G1|%:R / #|G|%:R <= #|H|%:R / #|S|%:R + #|V|%:R / #|W|%:R :> algC.
+ rewrite ler_pdivr_mulr ?ltr0n ?cardG_gt0 // mulrC mulrDr !mulrA.
+ rewrite ![_ * _ / _]mulrAC -!natf_indexg ?subsetT //= -!natrM -natrD ler_nat.
+ apply: leq_trans (subset_leq_card sG1_HVG) _.
+ rewrite cardsU (leq_trans (leq_subr _ _)) //.
+ have unifJG B C: C \in B :^: G -> #|C| = #|B|.
+ by case/imsetP=> z _ ->; rewrite cardJg.
+ have oTI := card_uniform_partition (unifJG _) (partition_class_support _ _).
+ have{tiH} [ntH tiH /eqP defNH] := and3P tiH.
+ have [_ _ /and3P[ntV tiV /eqP defNV]] := ctiWG.
+ rewrite !oTI // !card_conjugates defNH defNV /= leq_add2r ?leq_mul //.
+ by rewrite subset_leq_card ?subsetDl.
+rewrite ler_gtF // addrAC ler_subr_addl -ler_subr_addr (ler_trans ub_G1) //.
+rewrite -(sdprod_card defS) -(sdprod_card defHU) addrC.
+rewrite -mulnA !natrM invfM mulVKf ?natrG_neq0 // -/w1 -/w2.
+have sW12_W: W1 :|: W2 \subset W by rewrite -(dprodWY defW) sub_gen.
+rewrite cardsD (setIidPr sW12_W) natrB ?subset_leq_card // mulrBl.
+rewrite divff ?natrG_neq0 // -!addrA ler_add2l.
+rewrite cardsU -(dprod_card defW) -/w1 -/w2; have [_ _ _ ->] := dprodP defW.
+rewrite cards1 natrB ?addn_gt0 ?cardG_gt0 // addnC natrD -addrA mulrDl mulrBl.
+rewrite {1}mulnC !natrM !invfM !mulVKf ?natrG_neq0 // opprD -addrA ler_add2l.
+rewrite mul1r -{1}[_^-1]mul1r addrC ler_oppr [- _]opprB -!mulrBl.
+rewrite -addrA -opprD ler_pdivl_mulr; last by rewrite natrG_gt0.
+apply: ler_trans (_ : 1 - (3%:R^-1 + 7%:R^-1) <= _); last first.
+ rewrite ler_add2l ler_opp2.
+ rewrite ler_add // lef_pinv ?qualifE ?gt0CG ?ltr0n ?ler_nat //.
+ have notStype5: FTtype S != 5 by rewrite (eqP Stype2).
+ have frobUW2 := Ptype_compl_Frobenius maxS StypeP notStype5.
+ apply: leq_ltn_trans (ltn_odd_Frobenius_ker frobUW2 (mFT_odd _)).
+ by rewrite (leq_double 3).
+apply: ler_trans (_ : 2%:R^-1 <= _); last by rewrite -!CratrE; compute.
+rewrite mulrAC ler_pdivr_mulr 1?gt0CG // ler_pdivl_mull ?ltr0n //.
+rewrite -!natrM ler_nat mulnA -(Lagrange (normal_sub nsM''M')) mulnC leq_mul //.
+ by rewrite subset_leq_card //; have [_ _ _ []] := MtypeP.
+by rewrite -card_quotient ?normal_norm // mulnC -(prednK (cardG_gt0 _)) leqW.
+Qed.
+
+End NonCoherence.
+
+(* This is Peterfalvi (10.9). *)
+Lemma FTtype345_Dade_bridge0 :
+ (w1 < w2)%N ->
+ {chi | [/\ (mu_ 0 - zeta)^\tau = \sum_i eta_ i 0 - chi,
+ chi \in 'Z[irr G], '[chi] = 1
+ & forall i j, '[chi, eta_ i j] = 0]}.
+Proof.
+move=> w1_lt_w2; set psi := mu_ 0 - zeta; pose Wsig := map sigma (irr W).
+have [X wsigX [chi [DpsiG _ o_chiW]]] := orthogonal_split Wsig psi^\tau.
+exists (- chi); rewrite opprK rpredN cfnormN.
+have o_chi_w i j: '[chi, eta_ i j] = 0.
+ by rewrite (orthoPl o_chiW) ?map_f ?mem_irr.
+have [Isigma Zsigma] := cycTI_Zisometry ctiWG.
+have o1Wsig: orthonormal Wsig by rewrite map_orthonormal ?irr_orthonormal.
+have [a_ Da defX] := orthonormal_span o1Wsig wsigX.
+have{Da} Da i j: a_ (eta_ i j) = '[psi^\tau, eta_ i j].
+ by rewrite DpsiG cfdotDl o_chi_w addr0 Da.
+have sumX: X = \sum_i \sum_j a_ (eta_ i j) *: eta_ i j.
+ rewrite pair_bigA defX big_map (big_nth 0) size_tuple big_mkord /=.
+ rewrite (reindex (dprod_Iirr defW)) /=.
+ by apply: eq_bigr => [[i j] /= _]; rewrite -tnth_nth.
+ by exists (inv_dprod_Iirr defW) => ij; rewrite (inv_dprod_IirrK, dprod_IirrK).
+have Zpsi: psi \in 'Z[irr M].
+ by rewrite rpredB ?irr_vchar ?(mem_zchar irr_zeta) ?char_vchar ?prTIred_char.
+have{Zpsi} M'psi: psi \in 'Z[irr M, M'^#].
+ by rewrite -defA zchar_split Zpsi mu0Bzeta_on.
+have A0psi: psi \in 'CF(M, 'A0(M)).
+ by apply: cfun_onS (zchar_on M'psi); rewrite defA0 subsetUl.
+have a_00: a_ (eta_ 0 0) = 1.
+ rewrite Da [w_ 0 0](cycTIirr00 defW) [sigma 1]cycTIiso1.
+ rewrite Dade_reciprocity // => [|x _ y _]; last by rewrite !cfun1E !inE.
+ rewrite rmorph1 /= -(prTIirr00 ptiWM) -/(mu2_ 0 0) cfdotC.
+ by rewrite cfdotBr o_mu2_zeta subr0 cfdot_prTIirr_red rmorph1.
+have n2psiG: '[psi^\tau] = w1.+1%:R.
+ rewrite Dade_isometry // cfnormBd ?o_mu_zeta //.
+ by rewrite cfnorm_prTIred irrWnorm // -/w1 mulrSr.
+have psiG_V0 x: x \in V -> psi^\tau x = 0.
+ move=> Vx; rewrite Dade_id ?defA0; last first.
+ by rewrite inE orbC mem_class_support.
+ rewrite (cfun_on0 (zchar_on M'psi)) // -defA.
+ suffices /setDP[]: x \in 'A0(M) :\: 'A(M) by [].
+ by rewrite (FTsupp0_typeP maxM MtypeP) // mem_class_support.
+have ZpsiG: psi^\tau \in 'Z[irr G].
+ by rewrite Dade_vchar // zchar_split (zcharW M'psi).
+have n2psiGsum: '[psi^\tau] = \sum_i \sum_j `|a_ (eta_ i j)| ^+ 2 + '[chi].
+ rewrite DpsiG addrC cfnormDd; last first.
+ by rewrite (span_orthogonal o_chiW) ?memv_span1.
+ rewrite addrC defX cfnorm_sum_orthonormal // big_map pair_bigA; congr (_ + _).
+ rewrite big_tuple /= (reindex (dprod_Iirr defW)) //.
+ by exists (inv_dprod_Iirr defW) => ij; rewrite (inv_dprod_IirrK, dprod_IirrK).
+have NCpsiG: (cyclicTI_NC ctiWG psi^\tau < 2 * minn w1 w2)%N.
+ apply: (@leq_ltn_trans w1.+1); last first.
+ by rewrite /minn w1_lt_w2 mul2n -addnn (leq_add2r w1 2) cardG_gt1.
+ pose z_a := [pred ij | a_ (eta_ ij.1 ij.2) == 0].
+ have ->: cyclicTI_NC ctiWG psi^\tau = #|[predC z_a]|.
+ by apply: eq_card => ij; rewrite !inE -Da.
+ rewrite -leC_nat -n2psiG n2psiGsum ler_paddr ?cfnorm_ge0 // pair_bigA.
+ rewrite (bigID z_a) big1 /= => [|ij /eqP->]; last by rewrite normCK mul0r.
+ rewrite add0r -sumr_const ler_sum // => [[i j] nz_ij].
+ by rewrite expr_ge1 ?norm_Cint_ge1 // Da Cint_cfdot_vchar ?Zsigma ?irr_vchar.
+have nz_psiG00: '[psi^\tau, eta_ 0 0] != 0 by rewrite -Da a_00 oner_eq0.
+have [a_i|a_j] := small_cycTI_NC psiG_V0 NCpsiG nz_psiG00.
+ have psiGi: psi^\tau = \sum_i eta_ i 0 + chi.
+ rewrite DpsiG sumX; congr (_ + _); apply: eq_bigr => i _.
+ rewrite big_ord_recl /= Da a_i -Da a_00 mul1r scale1r.
+ by rewrite big1 ?addr0 // => j1 _; rewrite Da a_i mul0r scale0r.
+ split=> // [||i j]; last by rewrite cfdotNl o_chi_w oppr0.
+ rewrite -(canLR (addKr _) psiGi) rpredD // rpredN rpred_sum // => j _.
+ by rewrite Zsigma ?irr_vchar.
+ apply: (addrI w1%:R); rewrite -mulrSr -n2psiG n2psiGsum; congr (_ + _).
+ rewrite -nirrW1 // -sumr_const; apply: eq_bigr => i _.
+ rewrite big_ord_recl /= Da a_i -Da a_00 mul1r normr1.
+ by rewrite expr1n big1 ?addr0 // => j1 _; rewrite Da a_i normCK !mul0r.
+suffices /idPn[]: '[psi^\tau] >= w2%:R.
+ rewrite odd_geq /= ?uphalf_half mFT_odd //= in w1_lt_w2.
+ by rewrite n2psiG leC_nat -ltnNge odd_geq ?mFT_odd.
+rewrite n2psiGsum exchange_big /= ler_paddr ?cfnorm_ge0 //.
+rewrite -nirrW2 -sumr_const; apply: ler_sum => i _.
+rewrite big_ord_recl /= Da a_j -Da a_00 mul1r normr1.
+by rewrite expr1n big1 ?addr0 // => j1 _; rewrite Da a_j normCK !mul0r.
+Qed.
+
+Local Notation H := M'.
+Local Notation "` 'H'" := `M' (at level 0) : group_scope.
+Local Notation H' := M''.
+Local Notation "` 'H''" := `M'' (at level 0) : group_scope.
+
+(* This is the bulk of the proof of Peterfalvi, Theorem (10.10); as with *)
+(* (10.8), it will be restated below in order to remove dependencies on zeta, *)
+(* U_M and W1. *)
+Lemma FTtype5_exclusion_main : FTtype M != 5.
+Proof.
+apply/negP=> Mtype5.
+suffices [tau1]: coherent calS M^# tau by case/FTtype345_noncoherence_main.
+have [[_ U_M_1] MtypeV] := compl_of_typeV maxM MtypeP Mtype5.
+have [_ [_ _ _ defH] _ [_ _ _ sW2H' _] _] := MtypeP.
+have{U_M_1 defH} defMF: M`_\F = H by rewrite /= -defH U_M_1 sdprodg1.
+have nilH: nilpotent `H by rewrite -defMF Fcore_nil.
+have scohS := subset_subcoherent scohS0 sSS0.
+have [|//|[[_]]] := (non_coherent_chief nsM'M (nilpotent_sol nilH) scohS) 1%G.
+ split; rewrite ?mFT_odd ?normal1 ?sub1G ?quotient_nil //.
+ by rewrite joingG1 (FrobeniusWker frobMbar).
+rewrite /= joingG1 -(index_sdprod defM) /= -/w1 -[H^`(1)%g]/`H' => ubHbar [p[]].
+rewrite -(isog_abelian (quotient1_isog H)) -(isog_pgroup p (quotient1_isog H)).
+rewrite subn1 => pH not_cHH /negP not_w1_dv_p'1.
+have ntH: H :!=: 1%g by apply: contraNneq not_cHH => ->; apply: abelian1.
+have [sH'H nH'H] := andP nsM''M'; have sW2H := subset_trans sW2H' sH'H.
+have def_w2: w2 = p by apply/eqP; have:= pgroupS sW2H pH; rewrite pgroupE pnatE.
+have [p_pr _ [e oH]] := pgroup_pdiv pH ntH.
+rewrite -/w1 /= defMF oH pi_of_exp {e oH}// /pi_of primes_prime // in MtypeV.
+have [tiHG | [_ /predU1P[->[]|]]// | [_ /predU1P[->|//] [oH w1p1 _]]] := MtypeV.
+ suffices [tau1 [Itau1 Dtau1]]: coherent (seqIndD H M H 1) M^# 'Ind[G].
+ exists tau1; split=> // phi Sphi; rewrite {}Dtau1 //.
+ rewrite zcharD1_seqInd // -subG1 -setD_eq0 -defA in Sphi tiHG ntH.
+ by have Aphi := zchar_on Sphi; rewrite -FT_DadeE // Dade_Ind.
+ apply: (@Sibley_coherence _ [set:_] M H W1); first by rewrite mFT_odd.
+ right; exists W2 => //; exists 'A0(M), W, defW.
+ by rewrite -defA -{2}(group_inj defMs).
+rewrite pcore_pgroup_id // in oH.
+have esH: extraspecial H.
+ by apply: (p3group_extraspecial pH); rewrite // oH pfactorK.
+have oH': #|H'| = p.
+ by rewrite -(card_center_extraspecial pH esH); have [[_ <-]] := esH.
+have defW2: W2 :=: H' by apply/eqP; rewrite eqEcard sW2H' oH' -def_w2 /=.
+have iH'H: #|H : H'|%g = (p ^ 2)%N by rewrite -divgS // oH oH' mulKn ?prime_gt0.
+have w1_gt0: (0 < w1)%N by apply: cardG_gt0.
+(* This is step (10.10.1). *)
+have{ubHbar} [def_p_w1 w1_lt_w2]: (p = 2 * w1 - 1 /\ w1 < w2)%N.
+ have /dvdnP[k def_p]: 2 * w1 %| p.+1.
+ by rewrite Gauss_dvd ?coprime2n ?mFT_odd ?dvdn2 //= -{1}def_w2 mFT_odd.
+ suffices k1: k = 1%N.
+ rewrite k1 mul1n in def_p; rewrite -ltn_double -mul2n -def_p -addn1 addnK.
+ by rewrite -addnS -addnn def_w2 leq_add2l prime_gt1.
+ have [k0 | k_gt0] := posnP k; first by rewrite k0 in def_p.
+ apply/eqP; rewrite eqn_leq k_gt0 andbT -ltnS -ltn_double -mul2n.
+ rewrite -[(2 * k)%N]prednK ?muln_gt0 // ltnS -ltn_sqr 3?leqW //=.
+ rewrite -subn1 sqrn_sub ?muln_gt0 // expnMn muln1 mulnA ltnS leq_subLR.
+ rewrite addn1 addnS ltnS -mulnSr leq_pmul2l // -(leq_subLR _ 1).
+ rewrite (leq_trans (leq_pmulr _ w1_gt0)) // -(leq_pmul2r w1_gt0).
+ rewrite -mulnA mulnBl mul1n -2!leq_double -!mul2n mulnA mulnBr -!expnMn.
+ rewrite -(expnMn 2 _ 2) mulnCA -def_p -addn1 leq_subLR sqrnD muln1.
+ by rewrite (addnC p) mulnDr addnA leq_add2r addn1 addnS -iH'H.
+(* This is step (10.10.2). *)
+pose S1 := seqIndD H M H H'.
+have sS1S: {subset S1 <= calS} by apply: seqIndS; rewrite Iirr_kerDS ?sub1G.
+have irrS1: {subset S1 <= irr M}.
+ move=> _ /seqIndP[s /setDP[kerH' ker'H] ->]; rewrite !inE in kerH' ker'H.
+ rewrite -(quo_IirrK _ kerH') // mod_IirrE // cfIndMod // cfMod_irr //.
+ rewrite (irr_induced_Frobenius_ker (FrobeniusWker frobMbar)) //.
+ by rewrite quo_Iirr_eq0 // -subGcfker.
+have S1w1: {in S1, forall xi : 'CF(M), xi 1%g = w1%:R}.
+ move=> _ /seqIndP[s /setDP[kerH' _] ->]; rewrite !inE in kerH'.
+ by rewrite cfInd1 // -(index_sdprod defM) lin_char1 ?mulr1 // lin_irr_der1.
+have sS10: cfConjC_subset S1 calS0.
+ by apply: seqInd_conjC_subset1; rewrite /= defMs.
+pose S2 := [seq mu_ j | j in predC1 0].
+have szS2: size S2 = p.-1.
+ by rewrite -def_w2 size_map -cardE cardC1 card_Iirr_abelian ?cyclic_abelian.
+have uS2: uniq S2 by apply/dinjectiveP; apply: in2W (prTIred_inj pddM).
+have redS2: {subset S2 <= [predC irr M]}.
+ by move=> _ /imageP[j _ ->]; apply: (prTIred_not_irr pddM).
+have sS2S: {subset S2 <= calS} by move=> _ /imageP[j /calSmu Smu_j ->].
+have S1'2: {subset S2 <= [predC S1]}.
+ by move=> xi /redS2; apply: contra (irrS1 _).
+have w1_dv_p21: w1 %| p ^ 2 - 1 by rewrite (subn_sqr p 1) addn1 dvdn_mull.
+have [j nz_j] := has_nonprincipal_irr ntW2.
+have [Dmu2_1 Ddelta_ lt1d Nn] := FTtype345_constants.
+have{lt1d} [defS szS1 Dd Ddel Dn]:
+ [/\ perm_eq calS (S1 ++ S2), size S1 = (p ^ 2 - 1) %/ w1,
+ d = p, delta = -1 & n = 2%:R].
+- pose X_ (S0 : seq 'CF(M)) := [set s | 'Ind[M, H] 'chi_s \in S0].
+ pose sumX_ cS0 := \sum_(s in X_ cS0) 'chi_s 1%g ^+ 2.
+ have defX1: X_ S1 = Iirr_kerD H H H'.
+ by apply/setP=> s; rewrite !inE mem_seqInd // !inE.
+ have defX: X_ calS = Iirr_kerD H H 1%g.
+ by apply/setP=> s; rewrite !inE mem_seqInd ?normal1 //= !inE.
+ have sumX1: sumX_ S1 = (p ^ 2)%:R - 1.
+ by rewrite /sumX_ defX1 sum_Iirr_kerD_square // iH'H indexgg mul1r.
+ have ->: size S1 = (p ^ 2 - 1) %/ w1.
+ apply/eqP; rewrite eqn_div // -eqC_nat mulnC [w1](index_sdprod defM).
+ rewrite (size_irr_subseq_seqInd _ (subseq_refl S1)) //.
+ rewrite natrB ?expn_gt0 ?prime_gt0 // -sumr_const -sumX1.
+ apply/eqP/esym/eq_bigr => s.
+ by rewrite defX1 !inE -lin_irr_der1 => /and3P[_ _ /eqP->]; rewrite expr1n.
+ have oX2: #|X_ S2| = p.-1.
+ by rewrite -(size_red_subseq_seqInd_typeP MtypeP uS2 sS2S).
+ have sumX2: (p ^ 2 * p.-1)%:R <= sumX_ S2 ?= iff (d == p).
+ rewrite /sumX_ (eq_bigr (fun _ => d%:R ^+ 2)) => [|s]; last first.
+ rewrite inE => /imageP[j1 nz_j1 Dj1]; congr (_ ^+ 2).
+ apply: (mulfI (neq0CiG M H)); rewrite -cfInd1 // -(index_sdprod defM).
+ by rewrite Dj1 (prTIred_1 pddM) Dmu2_1.
+ rewrite sumr_const oX2 mulrnA (mono_lerif (ler_pmuln2r _)); last first.
+ by rewrite -def_w2 -(subnKC w2gt2).
+ rewrite natrX (mono_in_lerif ler_sqr) ?rpred_nat // eq_sym lerif_nat.
+ apply/leqif_eq; rewrite dvdn_leq 1?ltnW //.
+ have: (mu2_ 0 j 1%g %| (p ^ 3)%N)%C.
+ by rewrite -(cfRes1 H) cfRes_prTIirr -oH dvd_irr1_cardG.
+ rewrite Dmu2_1 // dvdC_nat => /dvdn_pfactor[//|[_ d1|e _ ->]].
+ by rewrite d1 in lt1d.
+ by rewrite expnS dvdn_mulr.
+ pose S3 := filter [predC S1 ++ S2] calS.
+ have sumX3: 0 <= sumX_ S3 ?= iff nilp S3.
+ rewrite /sumX_; apply/lerifP.
+ have [-> | ] := altP nilP; first by rewrite big_pred0 // => s; rewrite !inE.
+ rewrite -lt0n -has_predT => /hasP[xi S3xi _].
+ have /seqIndP[s _ Dxi] := mem_subseq (filter_subseq _ _) S3xi.
+ rewrite (bigD1 s) ?inE -?Dxi //= ltr_spaddl ?sumr_ge0 // => [|s1 _].
+ by rewrite exprn_gt0 ?irr1_gt0.
+ by rewrite ltrW ?exprn_gt0 ?irr1_gt0.
+ have [_ /esym] := lerif_add sumX2 sumX3.
+ have /(canLR (addKr _)) <-: sumX_ calS = sumX_ S1 + (sumX_ S2 + sumX_ S3).
+ rewrite [sumX_ _](big_setID (X_ S1)); congr (_ + _).
+ by apply: eq_bigl => s; rewrite !inE andb_idl // => /sS1S.
+ rewrite (big_setID (X_ S2)); congr (_ + _); apply: eq_bigl => s.
+ by rewrite !inE andb_idl // => S2s; rewrite [~~ _]S1'2 ?sS2S.
+ by rewrite !inE !mem_filter /= mem_cat orbC negb_or andbA.
+ rewrite sumX1 /sumX_ defX sum_Iirr_kerD_square ?sub1G ?normal1 // indexgg.
+ rewrite addr0 mul1r indexg1 oH opprD addrACA addNr addr0 addrC.
+ rewrite (expnSr p 2) -[p in (_ ^ 2 * p)%:R - _]prednK ?prime_gt0 // mulnSr.
+ rewrite natrD addrK eqxx => /andP[/eqP Dd /nilP S3nil].
+ have uS12: uniq (S1 ++ S2).
+ by rewrite cat_uniq seqInd_uniq uS2 andbT; apply/hasPn.
+ rewrite uniq_perm_eq ?seqInd_uniq {uS12}// => [|xi]; last first.
+ apply/idP/idP; apply: allP xi; last by rewrite all_cat !(introT allP _).
+ by rewrite -(canLR negbK (has_predC _ _)) has_filter -/S3 S3nil.
+ have: (w1 %| d%:R - delta)%C.
+ by rewrite unfold_in pnatr_eq0 eqn0Ngt w1_gt0 rpred_Cnat.
+ rewrite /n Dd def_p_w1 /delta; case: (Idelta _) => [_|/idPn[] /=].
+ by rewrite opprK -(natrD _ _ 1) subnK ?muln_gt0 // natrM mulfK ?neq0CG.
+ rewrite mul2n -addnn -{1}(subnKC (ltnW w1gt2)) !addSn mulrSr addrK dvdC_nat.
+ by rewrite add0n dvdn_addl // -(subnKC w1gt2) gtnNdvd // leqW.
+have scohS1 := subset_subcoherent scohS0 sS10.
+have o1S1: orthonormal S1.
+ rewrite orthonormalE andbC; have [_ _ -> _ _] := scohS1.
+ by apply/allP=> xi /irrS1/irrP[t ->]; rewrite /= cfnorm_irr.
+have [tau1 cohS1]: coherent S1 M^# tau.
+ apply: uniform_degree_coherence scohS1 _; apply: all_pred1_constant w1%:R _ _.
+ by rewrite all_map; apply/allP=> xi /S1w1/= ->.
+have [[Itau1 Ztau1] Dtau1] := cohS1.
+have o1S1tau: orthonormal (map tau1 S1) by apply: map_orthonormal.
+have S1zeta: zeta \in S1.
+ by have:= Szeta; rewrite (perm_eq_mem defS) mem_cat => /orP[//|/redS2/negP].
+(* This is the main part of step 10.10.3; as the definition of alpha_ remains *)
+(* valid we do not need to reprove alpha_on. *)
+have Dalpha i (al_ij := alpha_ i j) :
+ al_ij^\tau = delta *: (eta_ i j - eta_ i 0) - n *: tau1 zeta.
+- have [Y S1_Y [X [Dal_ij _ oXY]]] := orthogonal_split (map tau1 S1) al_ij^\tau.
+ have [a_ Da_ defY] := orthonormal_span o1S1tau S1_Y.
+ have oXS1 lam : lam \in S1 -> '[X, tau1 lam] = 0.
+ by move=> S1lam; rewrite (orthoPl oXY) ?map_f.
+ have{Da_} Da_ lam : lam \in S1 -> a_ (tau1 lam) = '[al_ij^\tau, tau1 lam].
+ by move=> S1lam; rewrite Dal_ij cfdotDl oXS1 // addr0 Da_.
+ pose a := n + a_ (tau1 zeta); have [_ oS1S1] := orthonormalP o1S1.
+ have Da_z: a_ (tau1 zeta) = - n + a by rewrite addKr.
+ have Za: a \in Cint.
+ rewrite rpredD ?Dn ?rpred_nat // Da_ // Cint_cfdot_vchar ?Zalpha_tau //=.
+ by rewrite Ztau1 ?mem_zchar.
+ have Da_z' lam: lam \in S1 -> lam != zeta -> a_ (tau1 lam) = a.
+ move=> S1lam zeta'lam; apply: canRL (subrK _) _.
+ rewrite !Da_ // -cfdotBr -raddfB.
+ have S1dlam: lam - zeta \in 'Z[S1, M^#].
+ by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE !S1w1 ?subrr.
+ rewrite Dtau1 // Dade_isometry ?alpha_on ?tauM' //; last first.
+ by rewrite -zcharD1_seqInd ?(zchar_subset sS1S).
+ have o_mu2_lam k: '[mu2_ i k, lam] = 0 by rewrite o_mu2_irr ?sS1S ?irrS1.
+ rewrite !cfdotBl !cfdotZl !cfdotBr !o_mu2_lam !o_mu2_zeta !(subr0, mulr0).
+ by rewrite irrWnorm ?oS1S1 // eq_sym (negPf zeta'lam) !add0r mulrN1 opprK.
+ have lb_n2alij: (a - n) ^+ 2 + (size S1 - 1)%:R * a ^+ 2 <= '[al_ij^\tau].
+ rewrite Dal_ij cfnormDd; last first.
+ by rewrite cfdotC (span_orthogonal oXY) ?rmorph0 // memv_span1.
+ rewrite ler_paddr ?cfnorm_ge0 // defY cfnorm_sum_orthonormal //.
+ rewrite (big_rem (tau1 zeta)) ?map_f //= ler_eqVlt; apply/predU1P; left.
+ congr (_ + _).
+ by rewrite Da_z addrC Cint_normK 1?rpredD // rpredN Dn rpred_nat.
+ rewrite (eq_big_seq (fun _ => a ^+ 2)) => [|tau1lam]; last first.
+ rewrite rem_filter ?free_uniq ?orthonormal_free // filter_map.
+ case/mapP=> lam; rewrite mem_filter /= andbC => /andP[S1lam].
+ rewrite (inj_in_eq (Zisometry_inj Itau1)) ?mem_zchar // => zeta'lam ->.
+ by rewrite Da_z' // Cint_normK.
+ rewrite big_tnth sumr_const card_ord size_rem ?map_f // size_map.
+ by rewrite mulr_natl subn1.
+ have{lb_n2alij} ub_a2: (size S1)%:R * a ^+ 2 <= 2%:R * a * n + 2%:R.
+ rewrite norm_alpha // addrC sqrrB !addrA ler_add2r in lb_n2alij.
+ rewrite mulr_natl -mulrSr ler_subl_addl subn1 in lb_n2alij.
+ by rewrite -mulrA !mulr_natl; case: (S1) => // in S1zeta lb_n2alij *.
+ have{ub_a2} ub_8a2: 8%:R * a ^+ 2 <= 4%:R * a + 2%:R.
+ rewrite mulrAC Dn -natrM in ub_a2; apply: ler_trans ub_a2.
+ rewrite -Cint_normK // ler_wpmul2r ?exprn_ge0 ?normr_ge0 // leC_nat szS1.
+ rewrite (subn_sqr p 1) def_p_w1 subnK ?muln_gt0 // mulnA mulnK // mulnC.
+ by rewrite -subnDA -(mulnBr 2 _ 1%N) mulnA (@leq_pmul2l 4 2) ?ltn_subRL.
+ have Z_4a1: 4%:R * a - 1%:R \in Cint by rewrite rpredB ?rpredM ?rpred_nat.
+ have{ub_8a2} ub_4a1: `|4%:R * a - 1| < 3%:R.
+ rewrite -ltr_sqr ?rpred_nat ?qualifE ?normr_ge0 // -natrX Cint_normK //.
+ rewrite sqrrB1 exprMn -natrX -mulrnAl -mulrnA (natrD _ 8 1) ltr_add2r.
+ rewrite (natrM _ 2 4) (natrM _ 2 8) -!mulrA -mulrBr ltr_pmul2l ?ltr0n //.
+ by rewrite ltr_subl_addl (ler_lt_trans ub_8a2) // ltr_add2l ltr_nat.
+ have{ub_4a1} a0: a = 0.
+ apply: contraTeq ub_4a1 => a_nz; have:= norm_Cint_ge1 Za a_nz.
+ rewrite real_ltr_norml ?real_ler_normr ?Creal_Cint //; apply: contraL.
+ case/andP; rewrite ltr_subl_addr -(natrD _ 3 1) gtr_pmulr ?ltr0n //.
+ rewrite ltr_oppl opprB -mulrN => /ltr_le_trans/=/(_ _ (leC_nat 3 5)).
+ by rewrite (natrD _ 1 4) ltr_add2l gtr_pmulr ?ltr0n //; do 2!move/ltr_geF->.
+ apply: (def_tau_alpha cohS1 sS10 nz_j S1zeta).
+ by rewrite -Da_ // Da_z a0 addr0.
+have o_eta__zeta i j1: '[tau1 zeta, eta_ i j1] = 0.
+ by rewrite (coherent_ortho_cycTIiso _ sS10 cohS1) ?mem_irr.
+(* This is step (10.4), the final one. *)
+have Dmu0zeta: (mu_ 0 - zeta)^\tau = \sum_i eta_ i 0 - tau1 zeta.
+ have A0mu0tau: mu_ 0 - zeta \in 'CF(M, 'A0(M)).
+ rewrite /'A0(M) defA; apply: (cfun_onS (subsetUl _ _)).
+ rewrite cfun_onD1 [mu_ 0](prTIred0 pddM) !cfunE zeta1w1 cfuniE // group1.
+ by rewrite mulr1 subrr rpredB ?rpredZnat ?cfuni_on ?(seqInd_on _ Szeta) /=.
+ have [chi [Dmu0 Zchi n1chi o_chi_w]] := FTtype345_Dade_bridge0 w1_lt_w2.
+ have dirr_chi: chi \in dirr G by rewrite dirrE Zchi n1chi /=.
+ have dirr_zeta: tau1 zeta \in dirr G.
+ by rewrite dirrE Ztau1 ?Itau1 ?mem_zchar //= irrWnorm.
+ have: '[(alpha_ 0 j)^\tau, (mu_ 0 - zeta)^\tau] == - delta + n.
+ rewrite Dade_isometry ?alpha_on // !cfdotBl !cfdotZl !cfdotBr.
+ rewrite !o_mu2_zeta 2!cfdot_prTIirr_red (negPf nz_j) cfdotC o_mu_zeta.
+ by rewrite eqxx irrWnorm // conjC0 !(subr0, add0r) mulr1 mulrN1 opprK.
+ rewrite Dalpha // Dmu0 !{1}(cfdotBl, cfdotZl) !cfdotBr 2!{1}(cfdotC _ chi).
+ rewrite !o_chi_w conjC0 !cfdot_sumr big1 => [|i]; first last.
+ by rewrite (cfdot_cycTIiso pddM) (negPf nz_j) andbF.
+ rewrite (bigD1 0) //= cfdot_cycTIiso big1 => [|i nz_i]; first last.
+ by rewrite cfdot_cycTIiso eq_sym (negPf nz_i).
+ rewrite big1 // !subr0 !add0r addr0 mulrN1 mulrN opprK (can_eq (addKr _)).
+ rewrite {2}Dn -mulr_natl Dn (inj_eq (mulfI _)) ?pnatr_eq0 //.
+ by rewrite cfdot_dirr_eq1 // => /eqP->.
+have [] := uniform_prTIred_coherent pddM nz_j; rewrite -/sigma.
+have ->: uniform_prTIred_seq pddM j = S2.
+ congr (map _ _); apply: eq_enum => k; rewrite !inE -!/(mu_ _).
+ by rewrite andb_idr // => nz_k; rewrite 2!{1}prTIred_1 2?Dmu2_1.
+case=> _ _ ccS2 _ _ [tau2 Dtau2 cohS2].
+have{cohS2} cohS2: coherent_with S2 M^# tau tau2 by apply: cohS2.
+have sS20: cfConjC_subset S2 calS0.
+ by split=> // xi /sS2S Sxi; have [_ ->] := sSS0.
+rewrite perm_eq_sym perm_catC in defS; apply: perm_eq_coherent defS _.
+suffices: (mu_ j - d%:R *: zeta)^\tau = tau2 (mu_ j) - tau1 (d%:R *: zeta).
+ apply: (bridge_coherent scohS0 sS20 cohS2 sS10 cohS1) => [phi|].
+ by apply: contraL => /S1'2.
+ rewrite cfunD1E !cfunE zeta1w1 prTIred_1 mulrC Dmu2_1 // subrr.
+ by rewrite image_f // rpredZnat ?mem_zchar.
+have sumA: \sum_i alpha_ i j = mu_ j - delta *: mu_ 0 - (d%:R - delta) *: zeta.
+ rewrite !sumrB sumr_const /= -scaler_sumr; congr (_ - _ - _).
+ rewrite card_Iirr_abelian ?cyclic_abelian // -/w1 -scaler_nat.
+ by rewrite scalerA mulrC divfK ?neq0CG.
+rewrite scalerBl opprD opprK addrACA in sumA.
+rewrite -{sumA}(canLR (addrK _) sumA) opprD opprK -scalerBr.
+rewrite linearD linearZ linear_sum /= Dmu0zeta scalerBr.
+rewrite (eq_bigr _ (fun i _ => Dalpha i)) sumrB sumr_const nirrW1.
+rewrite -!scaler_sumr sumrB addrAC !addrA scalerBr subrK -addrA -opprD.
+rewrite raddfZnat Dtau2 Ddelta_ //; congr (_ - _).
+by rewrite addrC -scaler_nat scalerA mulrC divfK ?neq0CG // -scalerDl subrK.
+Qed.
+
+End OneMaximal.
+
+Implicit Type M : {group gT}.
+
+(* This is the exported version of Peterfalvi, Theorem (10.8). *)
+Theorem FTtype345_noncoherence M (M' := M^`(1)%G) (maxM : M \in 'M) :
+ (FTtype M > 2)%N -> ~ coherent (seqIndD M' M M' 1) M^# (FT_Dade0 maxM).
+Proof.
+rewrite ltnNge 2!leq_eqVlt => /norP[notMtype2 /norP[notMtype1 _]] [tau1 cohS].
+have [U W W1 W2 defW MtypeP] := FTtypeP_witness maxM notMtype1.
+have [zeta [irr_zeta Szeta zeta1w1]] := FTtypeP_ref_irr maxM MtypeP.
+exact: (FTtype345_noncoherence_main MtypeP _ irr_zeta Szeta zeta1w1 cohS).
+Qed.
+
+(* This is the exported version of Peterfalvi, Theorem (10.10). *)
+Theorem FTtype5_exclusion M : M \in 'M -> FTtype M != 5.
+Proof.
+move=> maxM; apply: wlog_neg; rewrite negbK => Mtype5.
+have notMtype2: FTtype M != 2 by rewrite (eqP Mtype5).
+have [U W W1 W2 defW [[MtypeP _] _]] := FTtypeP 5 maxM Mtype5.
+have [zeta [irr_zeta Szeta zeta1w1]] := FTtypeP_ref_irr maxM MtypeP.
+exact: (FTtype5_exclusion_main _ MtypeP _ irr_zeta).
+Qed.
+
+(* This the first assertion of Peterfalvi (10.11). *)
+Lemma FTtypeP_pair_primes S T W W1 W2 (defW : W1 \x W2 = W) :
+ typeP_pair S T defW -> prime #|W1| /\ prime #|W2|.
+Proof.
+move=> pairST; have [[_ maxS maxT] _ _ _ _] := pairST.
+have type24 maxM := compl_of_typeII_IV maxM _ (FTtype5_exclusion maxM).
+split; first by have [U /type24[]] := typeP_pairW pairST.
+have xdefW: W2 \x W1 = W by rewrite dprodC.
+by have [U /type24[]] := typeP_pairW (typeP_pair_sym xdefW pairST).
+Qed.
+
+Corollary FTtypeP_primes M U W W1 W2 (defW : W1 \x W2 = W) :
+ M \in 'M -> of_typeP M U defW -> prime #|W1| /\ prime #|W2|.
+Proof.
+move=> maxM MtypeP; have [T pairMT _] := FTtypeP_pair_witness maxM MtypeP.
+exact: FTtypeP_pair_primes pairMT.
+Qed.
+
+(* This is the remainder of Peterfalvi (10.11). *)
+Lemma FTtypeII_prime_facts M U W W1 W2 (defW : W1 \x W2 = W) (maxM : M \in 'M) :
+ of_typeP M U defW -> FTtype M == 2 ->
+ let H := M`_\F%G in let HU := M^`(1)%G in
+ let calS := seqIndD HU M H 1 in let tau := FT_Dade0 maxM in
+ let p := #|W2| in let q := #|W1| in
+ [/\ p.-abelem H, (#|H| = p ^ q)%N & coherent calS M^# tau].
+Proof.
+move=> MtypeP Mtype2 H HU calS tau p q.
+have Mnot5: FTtype M != 5 by rewrite (eqP Mtype2).
+have [_ cUU _ _ _] := compl_of_typeII maxM MtypeP Mtype2.
+have [q_pr p_pr]: prime q /\ prime p := FTtypeP_primes maxM MtypeP.
+have:= typeII_IV_core maxM MtypeP Mnot5; rewrite Mtype2 -/p -/q => [[_ oH]].
+have [] := Ptype_Fcore_kernel_exists maxM MtypeP Mnot5.
+have [_ _] := Ptype_Fcore_factor_facts maxM MtypeP Mnot5.
+rewrite -/H; set H0 := Ptype_Fcore_kernel _; set Hbar := (H / H0)%G.
+rewrite def_Ptype_factor_prime // -/p -/q => oHbar chiefHbar _.
+have trivH0: H0 :=: 1%g.
+ have [/maxgroupp/andP[/andP[sH0H _] nH0M] /andP[sHM _]] := andP chiefHbar.
+ apply: card1_trivg; rewrite -(setIidPr sH0H) -divg_index.
+ by rewrite -card_quotient ?(subset_trans sHM) // oHbar -oH divnn cardG_gt0.
+have abelHbar: p.-abelem Hbar.
+ have pHbar: p.-group Hbar by rewrite /pgroup oHbar pnat_exp pnat_id.
+ by rewrite -is_abelem_pgroup // (sol_chief_abelem _ chiefHbar) ?mmax_sol.
+rewrite /= trivH0 -(isog_abelem (quotient1_isog _)) in abelHbar.
+have:= Ptype_core_coherence maxM MtypeP Mnot5; rewrite trivH0.
+set C := _ MtypeP; have sCU: C \subset U by rewrite [C]unlock subsetIl.
+by rewrite (derG1P (abelianS sCU cUU)) [(1 <*> 1)%G]join1G.
+Qed.
+
+End Ten.