aboutsummaryrefslogtreecommitdiff
path: root/mathcomp/odd_order/BGsection14.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/BGsection14.v
Initial commit
Diffstat (limited to 'mathcomp/odd_order/BGsection14.v')
-rw-r--r--mathcomp/odd_order/BGsection14.v2513
1 files changed, 2513 insertions, 0 deletions
diff --git a/mathcomp/odd_order/BGsection14.v b/mathcomp/odd_order/BGsection14.v
new file mode 100644
index 0000000..493f634
--- /dev/null
+++ b/mathcomp/odd_order/BGsection14.v
@@ -0,0 +1,2513 @@
+(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
+Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div path fintype.
+Require Import bigop finset prime fingroup morphism perm automorphism quotient.
+Require Import action gproduct gfunctor pgroup cyclic center commutator.
+Require Import gseries nilpotent sylow abelian maximal hall frobenius.
+Require Import ssralg ssrnum ssrint rat.
+Require Import BGsection1 BGsection3 BGsection4 BGsection5 BGsection6.
+Require Import BGsection7 BGsection9 BGsection10 BGsection12 BGsection13.
+
+(******************************************************************************)
+(* This file covers B & G, section 14, starting with the definition of the *)
+(* sigma-decomposition of elements, sigma-supergroups, and basic categories *)
+(* of maximal subgroups: *)
+(* sigma_decomposition x == the set of nontrivial constituents x.`_\sigma(M), *)
+(* with M ranging over maximal sugroups of G. *)
+(* (x is the product of these). *)
+(* \ell_\sigma[x] == #|sigma_decomposition x|. *)
+(* 'M_\sigma(X) == the set of maximal subgroups M such that X is a *)
+(* a subset of M`_\sigma. *)
+(* 'M_\sigma[x] := 'M_\sigma(<[x]>) *)
+(* \kappa(M) == the set of primes p in \tau1(M) or \tau3(M), such *)
+(* that 'C_(M`_\sigma)(P) != 1 for some subgroup of *)
+(* M of order p, i.e., the primes for which M fails *)
+(* to be a Frobenius group. *)
+(* kappa_complement M U K <-> U and K are respectively {kappa, sigma}'- and *)
+(* kappa-Hall subgroups of M, whose product is a *)
+(* sigma-complement of M. This corresponds to the *)
+(* notation introduced at the start of section 15 in *)
+(* B & G, but is needed here to capture the use of *)
+(* bound variables of 14.2(a) in the statement of *)
+(* Lemma 14.12. *)
+(* 'M_'F == the set of maximal groups M for which \kappa(M) *)
+(* is empty, i.e., the maximal groups of Frobenius *)
+(* type (in the final classification, this becomes *)
+(* Type I). *)
+(* 'M_'P == the complement to 'M_'F in 'M, i.e., the set of M *)
+(* for which at least E1 has a proper prime action *)
+(* on M`_\sigma. *)
+(* 'M_'P1 == the set of maximal subgroups M such that \pi(M) *)
+(* is the disjoint union of \sigma(M) and \kappa(M), *)
+(* i.e., for which the entire complement acts in a *)
+(* prime manner (this troublesome subset of 'M_'P is *)
+(* ultimately refined into Types III-V in the final *)
+(* classification). *)
+(* 'M_'P2 == the complement to 'M_'P1 in 'M_'P; this becomes *)
+(* Type II in the final classification. *)
+(* 'N[x] == if x != 1 and 'M_\sigma[x] > 1, the unique group *)
+(* in 'M('C[x]) (see B & G, Theorem 14.4), and the *)
+(* trivial group otherwise. *)
+(* 'R[x] := 'C_('N[x]`_\sigma)[x]; if \ell_\sigma[x] == 1, *)
+(* this is the normal Hall subgroup of 'C[x] that *)
+(* acts sharply transitively by conjugagtion on *)
+(* 'M`_\sigma[x] (again, by Theorem 14.4). *)
+(* M^~~ == the union of all the cosets x *: 'R[x], with x *)
+(* ranging over (M`_\sigma)^#. This will become the *)
+(* support set for the Dade isometry for M in the *)
+(* character theory part of the proof. *)
+(* It seems 'R[x] and 'N[x]`_\sigma play a somewhat the role of a signalizer *)
+(* functor in the FT proof; in particular 'R[x] will be used to construct the *)
+(* Dade isometry in the character theory part of the proof. *)
+(******************************************************************************)
+
+Set Implicit Arguments.
+Unset Strict Implicit.
+Unset Printing Implicit Defensive.
+
+Local Open Scope ring_scope.
+Local Open Scope nat_scope.
+Import GRing.Theory Num.Theory GroupScope.
+
+Section Definitons.
+
+Variable gT : minSimpleOddGroupType.
+Implicit Type x : gT.
+Implicit Type M X : {set gT}.
+
+Definition sigma_decomposition x :=
+ [set x.`_\sigma(M) | M : {group gT} in 'M]^#.
+Definition sigma_length x := #|sigma_decomposition x|.
+
+Definition sigma_mmax_of X := [set M in 'M | X \subset M`_\sigma].
+
+Definition FT_signalizer_base x :=
+ if #|sigma_mmax_of <[x]>| > 1 then odflt 1%G (pick (mem 'M('C[x]))) else 1%G.
+
+Definition FT_signalizer x := 'C_((FT_signalizer_base x)`_\sigma)[x].
+
+Definition sigma_cover M := \bigcup_(x in (M`_\sigma)^#) x *: FT_signalizer x.
+
+Definition tau13 M := [predU \tau1(M) & \tau3(M)].
+
+Fact kappa_key : unit. Proof. by []. Qed.
+Definition kappa_def M : nat_pred :=
+ [pred p in tau13 M | [exists P in 'E_p^1(M), 'C_(M`_\sigma)(P) != 1]].
+Definition kappa := locked_with kappa_key kappa_def.
+Canonical kappa_unlockable := [unlockable fun kappa].
+
+Definition sigma_kappa M := [predU \sigma(M) & kappa M].
+
+Definition kappa_complement (M U K : {set gT}) :=
+ [/\ (sigma_kappa M)^'.-Hall(M) U, (kappa M).-Hall(M) K & group_set (U * K)].
+
+Definition TypeF_maxgroups := [set M in 'M | (kappa M)^'.-group M].
+
+Definition TypeP_maxgroups := 'M :\: TypeF_maxgroups.
+
+Definition TypeP1_maxgroups :=
+ [set M in TypeP_maxgroups | (sigma_kappa M).-group M].
+
+Definition TypeP2_maxgroups := TypeP_maxgroups :\: TypeP1_maxgroups.
+
+End Definitons.
+
+Notation "\ell_ \sigma ( x )" := (sigma_length x)
+ (at level 8, format "\ell_ \sigma ( x )") : group_scope.
+
+Notation "''M_' \sigma ( X )" := (sigma_mmax_of X)
+ (at level 8, format "''M_' \sigma ( X )") : group_scope.
+
+Notation "''M_' \sigma [ x ]" := (sigma_mmax_of <[x]>)
+ (at level 8, format "''M_' \sigma [ x ]") : group_scope.
+
+Notation "''N' [ x ]" := (FT_signalizer_base x)
+ (at level 8, format "''N' [ x ]") : group_scope.
+
+Notation "''R' [ x ]" := (FT_signalizer x)
+ (at level 8, format "''R' [ x ]") : group_scope.
+
+Notation "M ^~~" := (sigma_cover M)
+ (at level 2, format "M ^~~") : group_scope.
+
+Notation "\tau13 ( M )" := (tau13 M)
+ (at level 8, format "\tau13 ( M )") : group_scope.
+
+Notation "\kappa ( M )" := (kappa M)
+ (at level 8, format "\kappa ( M )") : group_scope.
+
+Notation "\sigma_kappa ( M )" := (sigma_kappa M)
+ (at level 8, format "\sigma_kappa ( M )") : group_scope.
+
+Notation "''M_' ''F'" := (TypeF_maxgroups _)
+ (at level 2, format "''M_' ''F'") : group_scope.
+
+Notation "''M_' ''P'" := (TypeP_maxgroups _)
+ (at level 2, format "''M_' ''P'") : group_scope.
+
+Notation "''M_' ''P1'" := (TypeP1_maxgroups _)
+ (at level 2, format "''M_' ''P1'") : group_scope.
+
+Notation "''M_' ''P2'" := (TypeP2_maxgroups _)
+ (at level 2, format "''M_' ''P2'") : group_scope.
+
+Section Section14.
+
+Variable gT : minSimpleOddGroupType.
+Local Notation G := (TheMinSimpleOddGroup gT).
+Implicit Types p q q_star r : nat.
+Implicit Types x y z : gT.
+Implicit Types A E H K L M Mstar N P Q Qstar R S T U V W X Y Z : {group gT}.
+
+(* Basic properties of the sigma decomposition. *)
+Lemma mem_sigma_decomposition x M (xM := x.`_\sigma(M)) :
+ M \in 'M -> xM != 1 -> xM \in sigma_decomposition x.
+Proof. by move=> maxM nt_xM; rewrite !inE nt_xM; apply: mem_imset. Qed.
+
+Lemma sigma_decompositionJ x z :
+ sigma_decomposition (x ^ z) = sigma_decomposition x :^ z.
+Proof.
+rewrite conjD1g -[_ :^ z]imset_comp; congr _^#.
+by apply: eq_in_imset => M maxM; rewrite /= consttJ.
+Qed.
+
+Lemma ell_sigmaJ x z : \ell_\sigma(x ^ z) = \ell_\sigma(x).
+Proof. by rewrite /sigma_length sigma_decompositionJ cardJg. Qed.
+
+Lemma sigma_mmaxJ M (X : {set gT}) z :
+ ((M :^ z)%G \in 'M_\sigma(X :^ z)) = (M \in 'M_\sigma(X)).
+Proof. by rewrite inE mmaxJ MsigmaJ conjSg !inE. Qed.
+
+Lemma card_sigma_mmaxJ (X : {set gT}) z :
+ #|'M_\sigma(X :^ z)| = #|'M_\sigma(X)|.
+Proof.
+rewrite -(card_setact 'JG _ z^-1) setactVin ?inE //.
+by apply: eq_card => M; rewrite inE sigma_mmaxJ.
+Qed.
+
+Lemma sigma_decomposition_constt' x M (sM := \sigma(M)) :
+ M \in 'M -> sigma_decomposition x.`_sM^' = sigma_decomposition x :\ x.`_sM.
+Proof.
+move=> maxM; apply/setP=> y; rewrite !inE andbCA; apply: andb_id2l => nty.
+apply/imsetP/andP=> [ | [neq_y_xM /imsetP]] [L maxL def_y].
+ have not_sMy: ~~ sM.-elt y.
+ apply: contra nty => sMy; rewrite -order_eq1 (pnat_1 sMy) // def_y.
+ by apply: p_eltX; apply: p_elt_constt.
+ split; first by apply: contraNneq not_sMy => ->; apply: p_elt_constt.
+ have notMGL: gval L \notin M :^: G.
+ apply: contra not_sMy; rewrite def_y; case/imsetP=> z _ ->.
+ by rewrite (eq_constt _ (sigmaJ M z)) p_elt_constt.
+ apply/imsetP; exists L; rewrite // def_y sub_in_constt // => p _ sLp.
+ by apply: contraFN (sigma_partition maxM maxL notMGL p) => sMp; apply/andP.
+exists L; rewrite ?sub_in_constt // => p _ sLp.
+suffices notMGL: gval L \notin M :^: G.
+ by apply: contraFN (sigma_partition maxM maxL notMGL p) => sMp; apply/andP.
+apply: contra neq_y_xM; rewrite def_y => /imsetP[z _ ->].
+by rewrite (eq_constt _ (sigmaJ M z)).
+Qed.
+
+(* General remarks about the sigma-decomposition, p. 105 of B & G. *)
+Remark sigma_mmax_exists p :
+ p \in \pi(G) -> {M : {group gT} | M \in 'M & p \in \sigma(M)}.
+Proof.
+move=> piGp; have [P sylP] := Sylow_exists p [set: gT].
+have ntP: P :!=: 1 by rewrite -rank_gt0 (rank_Sylow sylP) p_rank_gt0.
+have ltPG: P \proper G := mFT_pgroup_proper (pHall_pgroup sylP).
+have [M maxNM] := mmax_exists (mFT_norm_proper ntP ltPG).
+have{maxNM} [maxM sNM] := setIdP maxNM; have sPM := subset_trans (normG P) sNM.
+have{sylP} sylP := pHall_subl sPM (subsetT M) sylP.
+by exists M => //; apply/exists_inP; exists P.
+Qed.
+
+Lemma ell_sigma0P x : reflect (x = 1) (\ell_\sigma(x) == 0).
+Proof.
+rewrite cards_eq0 setD_eq0.
+apply: (iffP idP) => [x1 | ->]; last first.
+ by apply/subsetP=> _ /imsetP[M _ ->]; rewrite constt1 inE.
+rewrite -(prod_constt x) big1_seq //= => p _; apply: contraTeq x1 => nt_xp.
+have piXp: p \in \pi(#[x]) by rewrite -p_part_gt1 -order_constt order_gt1.
+have [M maxM sMp] := sigma_mmax_exists (piSg (subsetT _) piXp).
+apply/subsetPn; exists (x.`_(\sigma(M))); first exact: mem_imset.
+by rewrite (sameP set1P constt1P); apply: contraL sMp => /pnatPpi; apply.
+Qed.
+
+Remark sigma_decomposition_subG x H :
+ x \in H -> sigma_decomposition x \subset H.
+Proof.
+by move=> Hx; apply/subsetP=> _ /setD1P[_ /imsetP[M _ ->]]; apply: groupX.
+Qed.
+
+Remark prod_sigma_decomposition x :
+ \prod_(x_sM in sigma_decomposition x) x_sM = x.
+Proof.
+rewrite -big_filter filter_index_enum; set e := enum _.
+have: uniq e := enum_uniq _; have: e =i sigma_decomposition x := mem_enum _.
+elim: {x}e (x) => [|y e IHe] x def_e /= Ue.
+ by rewrite big_nil (ell_sigma0P x _) //; apply/pred0P; apply: fsym.
+have{Ue} [not_e_y Ue] := andP Ue.
+have [nty] := setD1P (etrans (fsym def_e y) (mem_head _ _)).
+case/imsetP=> M maxM def_y; rewrite big_cons -(consttC \sigma(M) x) -def_y.
+congr (y * _); apply: IHe Ue => z; rewrite sigma_decomposition_constt' //.
+rewrite -def_y inE -def_e !inE andb_orr andNb andb_idl //.
+by apply: contraTneq => ->.
+Qed.
+
+Lemma ell1_decomposition x :
+ \ell_\sigma(x) == 1%N -> sigma_decomposition x = [set x].
+Proof.
+case/cards1P=> y sdx_y.
+by rewrite -{2}[x]prod_sigma_decomposition sdx_y big_set1.
+Qed.
+
+Lemma Msigma_ell1 M x :
+ M \in 'M -> x \in (M`_\sigma)^# -> \ell_\sigma(x) == 1%N.
+Proof.
+move=> maxM /setD1P[ntx Ms_x]; apply/cards1P.
+have sMx: \sigma(M).-elt x := mem_p_elt (pcore_pgroup _ _) Ms_x.
+have def_xM: x.`_(\sigma(M)) = x := constt_p_elt sMx.
+exists x; apply/eqP; rewrite eqEsubset sub1set !inE ntx -setD_eq0 /=.
+rewrite -{2 3}def_xM -sigma_decomposition_constt' // (constt1P _) ?p_eltNK //.
+by rewrite -cards_eq0 (sameP (ell_sigma0P 1) eqP) eqxx; apply: mem_imset.
+Qed.
+
+Remark ell_sigma1P x :
+ reflect (x != 1 /\ 'M_\sigma[x] != set0) (\ell_\sigma(x) == 1%N).
+Proof.
+apply: (iffP idP) => [ell1x | [ntx]]; last first.
+ case/set0Pn=> M /setIdP[maxM]; rewrite cycle_subG => Ms_x.
+ by rewrite (Msigma_ell1 maxM) // in_setD1 ntx.
+have sdx_x: x \in sigma_decomposition x by rewrite ell1_decomposition ?set11.
+have{sdx_x} [ntx sdx_x] := setD1P sdx_x; split=> //; apply/set0Pn.
+have{sdx_x} [M maxM def_x] := imsetP sdx_x; rewrite // -cycle_eq1 in ntx.
+have sMx: \sigma(M).-elt x by rewrite def_x p_elt_constt.
+have [[z sXzMs] _] := sigma_Jsub maxM sMx ntx.
+by exists (M :^ z^-1)%G; rewrite inE mmaxJ maxM MsigmaJ -sub_conjg.
+Qed.
+
+Remark ell_sigma_le1 x :(\ell_\sigma(x) <= 1) = ('M_\sigma[x] != set0).
+Proof.
+rewrite -[_ <= 1](mem_iota 0 2) !inE (sameP (ell_sigma0P x) eqP).
+rewrite (sameP (ell_sigma1P x) andP); case: eqP => //= ->; symmetry.
+have [M max1M] := mmax_exists (mFT_pgroup_proper (@pgroup1 gT 2)).
+have [maxM _] := setIdP max1M; apply/set0Pn; exists M.
+by rewrite inE maxM cycle1 sub1G.
+Qed.
+
+(* Basic properties of \kappa and the maximal group subclasses. *)
+Lemma kappaJ M x : \kappa(M :^ x) =i \kappa(M).
+Proof.
+move=> p; rewrite unlock 3!{1}inE /= tau1J tau3J; apply: andb_id2l => _.
+apply/exists_inP/exists_inP=> [] [P EpP ntCMsP].
+ rewrite -(conjsgK x M); exists (P :^ x^-1)%G; first by rewrite pnElemJ.
+ by rewrite MsigmaJ centJ -conjIg -subG1 sub_conjg conjs1g subG1.
+exists (P :^ x)%G; first by rewrite pnElemJ.
+by rewrite MsigmaJ centJ -conjIg -subG1 sub_conjg conjs1g subG1.
+Qed.
+
+Lemma kappa_tau13 M p : p \in \kappa(M) -> (p \in \tau1(M)) || (p \in \tau3(M)).
+Proof. by rewrite unlock => /andP[]. Qed.
+
+Lemma kappa_sigma' M : {subset \kappa(M) <= \sigma(M)^'}.
+Proof. by move=> p /kappa_tau13/orP[] /andP[]. Qed.
+
+Remark rank_kappa M p : p \in \kappa(M) -> 'r_p(M) = 1%N.
+Proof. by case/kappa_tau13/orP=> /and3P[_ /eqP]. Qed.
+
+Lemma kappa_pi M : {subset \kappa(M) <= \pi(M)}.
+Proof. by move=> p kMp; rewrite -p_rank_gt0 rank_kappa. Qed.
+
+Remark kappa_nonregular M p P :
+ p \in \kappa(M) -> P \in 'E_p^1(M) -> 'C_(M`_\sigma)(P) != 1.
+Proof.
+move=> kMp EpP; have rpM := rank_kappa kMp.
+have [sPM abelP oP] := pnElemPcard EpP; have [pP _] := andP abelP.
+have [Q EpQ nregQ]: exists2 Q, Q \in 'E_p^1(M) & 'C_(M`_\sigma)(Q) != 1.
+ by apply/exists_inP; rewrite unlock in kMp; case/andP: kMp.
+have [sQM abelQ oQ] := pnElemPcard EpQ; have [pQ _] := andP abelQ.
+have [S sylS sQS] := Sylow_superset sQM pQ; have [_ pS _] := and3P sylS.
+have [x Mx sPxS] := Sylow_Jsub sylS sPM pP.
+rewrite -(inj_eq (@conjsg_inj _ x)) conjs1g conjIg -centJ.
+rewrite (normsP (normal_norm (pcore_normal _ _))) // (subG1_contra _ nregQ) //.
+rewrite setIS ?centS // -(cardSg_cyclic _ sPxS sQS) ?cardJg ?oP ?oQ //.
+by rewrite (odd_pgroup_rank1_cyclic pS) ?mFT_odd // (p_rank_Sylow sylS) rpM.
+Qed.
+
+Lemma ex_kappa_compl M K :
+ M \in 'M -> \kappa(M).-Hall(M) K ->
+ exists U : {group gT}, kappa_complement M U K.
+Proof.
+move=> maxM hallK; have [sKM kK _] := and3P hallK.
+have s'K: \sigma(M)^'.-group K := sub_pgroup (@kappa_sigma' M) kK.
+have [E hallE sKE] := Hall_superset (mmax_sol maxM) sKM s'K.
+pose sk' := \sigma_kappa(M)^'.
+have [U hallU] := Hall_exists sk' (sigma_compl_sol hallE).
+exists U; split=> //.
+ by apply: subHall_Hall hallE _ hallU => p; case/norP.
+suffices ->: U * K = E by apply: groupP.
+have [[sUE sk'U _] [sEM s'E _]] := (and3P hallU, and3P hallE).
+apply/eqP; rewrite eqEcard mulG_subG sUE sKE /= coprime_cardMg; last first.
+ by apply: p'nat_coprime (sub_pgroup _ sk'U) kK => p; case/norP.
+rewrite -(partnC \kappa(M) (cardG_gt0 E)) -{2}(part_pnat_id s'E) mulnC.
+rewrite -(card_Hall (pHall_subl sKE sEM hallK)) leq_mul // -partnI.
+by rewrite -(@eq_partn sk') -?(card_Hall hallU) // => p; apply: negb_or.
+Qed.
+
+Lemma FtypeP M : reflect (M \in 'M /\ \kappa(M) =i pred0) (M \in 'M_'F).
+Proof.
+do [apply: (iffP setIdP) => [] [maxM k'M]; split] => // [p|].
+ by apply/idP=> /= kMp; case/negP: (pnatPpi k'M (kappa_pi kMp)).
+by apply/pgroupP=> p _ _; rewrite inE /= k'M.
+Qed.
+
+Lemma PtypeP M : reflect (M \in 'M /\ exists p, p \in \kappa(M)) (M \in 'M_'P).
+Proof.
+apply: (iffP setDP) => [[maxM kM] | [maxM [p kMp]]]; split => //.
+ rewrite inE maxM !negb_and cardG_gt0 /= all_predC negbK in kM.
+ by have [p _ kMp] := hasP kM; exists p.
+by apply/FtypeP=> [[_ kM0]]; rewrite kM0 in kMp.
+Qed.
+
+Lemma trivg_kappa M K :
+ M \in 'M -> \kappa(M).-Hall(M) K -> (K :==: 1) = (M \in 'M_'F).
+Proof.
+by move=> maxM hallK; rewrite inE maxM trivg_card1 (card_Hall hallK) partG_eq1.
+Qed.
+
+(* Could go in Section 10. *)
+Lemma not_sigma_mmax M : M \in 'M -> ~~ \sigma(M).-group M.
+Proof.
+move=> maxM; apply: contraL (mmax_sol maxM); rewrite negb_forall_in => sM.
+apply/existsP; exists M; rewrite mmax_neq1 // subsetIidl andbT.
+apply: subset_trans (Msigma_der1 maxM).
+by rewrite (sub_Hall_pcore (Msigma_Hall maxM)).
+Qed.
+
+Lemma trivg_kappa_compl M U K :
+ M \in 'M -> kappa_complement M U K -> (U :==: 1) = (M \in 'M_'P1).
+Proof.
+move=> maxM [hallU _ _]; symmetry.
+rewrite 3!inE maxM /= trivg_card1 (card_Hall hallU) partG_eq1 pgroupNK andbT.
+apply: andb_idl => skM; apply: contra (not_sigma_mmax maxM).
+by apply: sub_in_pnat => p /(pnatPpi skM)/orP[] // kMp /negP.
+Qed.
+
+Lemma FtypeJ M x : ((M :^ x)%G \in 'M_'F) = (M \in 'M_'F).
+Proof. by rewrite inE mmaxJ pgroupJ (eq_p'group _ (kappaJ M x)) !inE. Qed.
+
+Lemma PtypeJ M x : ((M :^ x)%G \in 'M_'P) = (M \in 'M_'P).
+Proof. by rewrite !in_setD mmaxJ FtypeJ. Qed.
+
+Lemma P1typeJ M x : ((M :^ x)%G \in 'M_'P1) = (M \in 'M_'P1).
+Proof.
+rewrite inE PtypeJ pgroupJ [M \in 'M_'P1]inE; congr (_ && _).
+by apply: eq_pgroup => p; rewrite inE /= kappaJ sigmaJ.
+Qed.
+
+Lemma P2typeJ M x : ((M :^ x)%G \in 'M_'P2) = (M \in 'M_'P2).
+Proof. by rewrite in_setD PtypeJ P1typeJ -in_setD. Qed.
+
+(* This is B & G, Lemma 14.1. *)
+Lemma sigma'_kappa'_facts M p S (A := 'Ohm_1(S)) (Ms := M`_\sigma) :
+ M \in 'M -> p.-Sylow(M) S ->
+ [&& p \in \pi(M), p \notin \sigma(M) & p \notin \kappa(M)] ->
+ [/\ M \in 'M_'F :|: 'M_'P2, logn p #|A| <= 2, 'C_Ms(A) = 1 & nilpotent Ms].
+Proof.
+move=> maxM sylS /and3P[piMp sM'p kM'p]; have [sSM pS _] := and3P sylS.
+rewrite 8!(maxM, inE) /= !andbT negb_and orb_andr orbN andbT negbK.
+rewrite (contra (fun skM => pnatPpi skM piMp)) ?orbT; last exact/norP.
+rewrite partition_pi_mmax // (negPf sM'p) orbF orbCA in piMp.
+have{piMp} [t2p | t13p] := orP piMp.
+ rewrite (tau2_Msigma_nil maxM t2p); have [_ rpM] := andP t2p.
+ have{rpM} rS: 2 <= 'r_p(S) by rewrite (p_rank_Sylow sylS) (eqP rpM).
+ have [B EpB] := p_rank_geP rS; have{EpB} [sBS abelB dimB] := pnElemP EpB.
+ have EpB: B \in 'E_p^2(M) by rewrite !inE abelB dimB (subset_trans sBS).
+ have [defB _ regB _ _] := tau2_context maxM t2p EpB.
+ by rewrite /A -dimB; have [_ [|->]] := defB S sylS.
+have [ntS cycS]: S :!=: 1 /\ cyclic S.
+ rewrite (odd_pgroup_rank1_cyclic pS) ?mFT_odd // (p_rank_Sylow sylS).
+ apply/andP; rewrite -rank_gt0 (rank_Sylow sylS) -eqn_leq eq_sym.
+ by rewrite -2!andb_orr orNb andbT inE /= sM'p in t13p.
+have [p_pr _ _] := pgroup_pdiv pS ntS.
+have oA: #|A| = p by rewrite (Ohm1_cyclic_pgroup_prime cycS pS).
+have sAM: A \subset M := subset_trans (Ohm_sub 1 S) sSM.
+have regA: 'C_Ms(A) = 1.
+ apply: contraNeq kM'p => nregA; rewrite unlock; apply/andP; split=> //.
+ by apply/exists_inP; exists [group of A]; rewrite ?p1ElemE // !inE sAM oA /=.
+have defMsA: Ms ><| A = Ms <*> A.
+ rewrite sdprodEY ?coprime_TIg ?(subset_trans sAM) ?gFnorm // oA.
+ by rewrite (pnat_coprime (pcore_pgroup _ _)) ?pnatE.
+rewrite (prime_Frobenius_sol_kernel_nil defMsA) ?oA ?(pfactorK 1) //.
+by rewrite (solvableS _ (mmax_sol maxM)) // join_subG pcore_sub.
+Qed.
+
+Lemma notP1type_Msigma_nil M :
+ (M \in 'M_'F) || (M \in 'M_'P2) -> nilpotent M`_\sigma.
+Proof.
+move=> notP1maxM; suffices [maxM]: M \in 'M /\ ~~ \sigma_kappa(M).-group M.
+ rewrite negb_and cardG_gt0 => /allPn[p piMp /norP[s'p k'p]].
+ by have [S /sigma'_kappa'_facts[] //] := Sylow_exists p M; apply/and3P.
+have [/setIdP[maxM k'M] | /setDP[PmaxM]] := orP notP1maxM; last first.
+ by rewrite inE PmaxM; case/setDP: PmaxM.
+split=> //; apply: contra (not_sigma_mmax maxM).
+by apply: sub_in_pnat => p piMp /orP[] // /idPn[]; exact: (pnatPpi k'M).
+Qed.
+
+(* This is B & G, Proposition 14.2. *)
+Proposition Ptype_structure M K (Ms := M`_\sigma) (Kstar := 'C_Ms(K)) :
+ M \in 'M_'P -> \kappa(M).-Hall(M) K ->
+ [/\ (*a*) exists2 U : {group gT},
+ kappa_complement M U K /\ Ms ><| (U ><| K) = M
+ & [/\ abelian U, semiprime Ms K & semiregular U K],
+ (*b*) (*1.2*) K \x Kstar = 'N_M(K)
+ /\ {in 'E^1(K), forall X,
+ (*1.1*) 'N_M(X) = 'N_M(K)
+ /\ (*2*) {in 'M('N(X)), forall Mstar, X \subset Mstar`_\sigma}},
+ (*c*) Kstar != 1 /\ {in 'E^1(Kstar), forall X, 'M('C(X)) = [set M]},
+ [/\ (*d*) {in ~: M, forall g, Kstar :&: M :^ g = 1}
+ /\ {in M :\: 'N_M(K), forall g, K :&: K :^ g = 1},
+ (*e*) {in \pi(Kstar), forall p S,
+ p.-Sylow(M) S -> 'M(S) = [set M] /\ ~~ (S \subset Kstar)}
+ & (*f*) forall Y, \sigma(M).-group Y -> Y :&: Kstar != 1 -> Y \subset Ms]
+ & (*g*) M \in 'M_'P2 ->
+ [/\ \sigma(M) =i \beta(M), prime #|K|, nilpotent Ms
+ & normedTI Ms^# G M]].
+Proof.
+move: @Kstar => Ks PmaxM hallK; have [maxM notFmaxM] := setDP PmaxM.
+have sMs: \sigma(M).-group M`_\sigma := pcore_pgroup _ M.
+have{notFmaxM} ntK: K :!=: 1 by rewrite (trivg_kappa maxM).
+have [sKM kK _] := and3P hallK; have s'K := sub_pgroup (@kappa_sigma' M) kK.
+have solM := mmax_sol maxM; have [E hallE sKE] := Hall_superset solM sKM s'K.
+have [[sEM s'E _] [_ [E3 hallE3]]] := (and3P hallE, ex_tau13_compl hallE).
+have [F1 hallF1] := Hall_exists \tau1(M) (solvableS sKM solM).
+have [[sF1K t1F1 _] solE] := (and3P hallF1, sigma_compl_sol hallE).
+have [E1 hallE1 sFE1] := Hall_superset solE (subset_trans sF1K sKE) t1F1.
+have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
+have [[_ nsE3E] _ [cycE1 _] [defEl defE] _] := sigma_compl_context maxM complEi.
+have [sE1E t1E1 _] := and3P hallE1; have sE1M := subset_trans sE1E sEM.
+have [sE3E t3E3 _] := and3P hallE3; have sE3M := subset_trans sE3E sEM.
+set part_a := exists2 U, _ & _; pose b1_hyp := {in 'E^1(K), forall X, X <| K}.
+have [have_a nK1K ntE1 sE1K]: [/\ part_a, b1_hyp, E1 :!=: 1 & E1 \subset K].
+ have [t1K | not_t1K] := boolP (\tau1(M).-group K).
+ have sKE1: K \subset E1 by rewrite (sub_pHall hallF1 t1K).
+ have prE1 := tau1_primact_Msigma maxM hallE hallE1.
+ have st1k: {subset \tau1(M) <= \kappa(M)}.
+ move=> p t1p; rewrite unlock 3!inE /= t1p /=.
+ have [X]: exists X, X \in 'E_p^1(E1).
+ apply/p_rank_geP; rewrite p_rank_gt0 /= (card_Hall hallE1).
+ by rewrite pi_of_part // inE /= (partition_pi_sigma_compl maxM) ?t1p.
+ rewrite -(setIidPr sE1M) pnElemI -setIdE => /setIdP[EpX sXE1].
+ pose q := pdiv #|K|; have piKq: q \in \pi(K) by rewrite pi_pdiv cardG_gt1.
+ have /p_rank_geP[Y]: 0 < 'r_q(K) by rewrite p_rank_gt0.
+ rewrite -(setIidPr sKM) pnElemI -setIdE => /setIdP[EqY sYK].
+ have ntCMsY := kappa_nonregular (pnatPpi kK piKq) EqY.
+ have [ntY sYE1] := (nt_pnElem EqY isT, subset_trans sYK sKE1).
+ apply/exists_inP; exists X; rewrite ?(subG1_contra _ ntCMsY) //=.
+ by rewrite (cent_semiprime prE1 sYE1 ntY) ?setIS ?centS.
+ have defK := sub_pHall hallK (sub_pgroup st1k t1E1) sKE1 sE1M.
+ split=> [|X||]; rewrite ?defK //; last first.
+ rewrite -defK; case/nElemP=> p /pnElemP[sXE1 _ _].
+ by rewrite char_normal // sub_cyclic_char.
+ have [[U _ defU _] _ _ _] := sdprodP defE; rewrite defU in defE.
+ have [nsUE _ mulUE1 nUE1 _] := sdprod_context defE.
+ have [[_ V _ defV] _] := sdprodP defEl; rewrite defV.
+ have [_ <- nE21 _] := sdprodP defV => /mulGsubP[nE32 nE31] _.
+ have regUK: semiregular U K.
+ move=> y /setD1P[]; rewrite -cycle_subG -cent_cycle -order_gt1.
+ rewrite -pi_pdiv; move: (pdiv _) => p pi_y_p Ky.
+ have piKp := piSg Ky pi_y_p; have t1p := pnatPpi t1K piKp.
+ move: pi_y_p; rewrite -p_rank_gt0 => /p_rank_geP[Y] /=.
+ rewrite -{1}(setIidPr (subset_trans Ky sKE)) pnElemI -setIdE.
+ case/setIdP=> EpY sYy; have EpMY := subsetP (pnElemS _ _ sEM) Y EpY.
+ apply: contraNeq (kappa_nonregular (pnatPpi kK piKp) EpMY).
+ move/(subG1_contra (setIS U (centS sYy))).
+ have{y sYy Ky} sYE1 := subset_trans sYy (subset_trans Ky sKE1).
+ have ntY: Y :!=: 1 by apply: (nt_pnElem EpY).
+ rewrite -subG1 /=; have [_ <- _ tiE32] := sdprodP defU.
+ rewrite -subcent_TImulg ?subsetI ?(subset_trans sYE1) // mulG_subG.
+ rewrite !subG1 /= => /nandP[nregE3Y | nregE2Y].
+ have pr13 := cent_semiprime (tau13_primact_Msigma maxM complEi _).
+ rewrite pr13 ?(subset_trans sYE1) ?joing_subr //; last first.
+ by move/cent_semiregular=> regE31; rewrite regE31 ?eqxx in nregE3Y.
+ pose q := pdiv #|'C_E3(Y)|.
+ have piE3q: q \in \pi(E3).
+ by rewrite (piSg (subsetIl E3 'C(Y))) // pi_pdiv cardG_gt1.
+ have /p_rank_geP[X]: 0 < 'r_q(M :&: E3).
+ by rewrite (setIidPr sE3M) p_rank_gt0.
+ rewrite pnElemI -setIdE => /setIdP[EqX sXE3].
+ rewrite -subG1 -(_ : 'C_Ms(X) = 1) ?setIS ?centS //.
+ by rewrite (subset_trans sXE3) ?joing_subl.
+ apply: contraTeq (pnatPpi t3E3 piE3q) => nregMsX; apply: tau3'1.
+ suffices kq: q \in \kappa(M).
+ rewrite (pnatPpi t1K) //= (card_Hall hallK) pi_of_part //.
+ by rewrite inE /= kappa_pi.
+ rewrite unlock 3!inE /= (pnatPpi t3E3 piE3q) orbT /=.
+ by apply/exists_inP; exists X.
+ pose q := pdiv #|'C_E2(Y)|; have [sE2E t2E2 _] := and3P hallE2.
+ have piCE2Yq: q \in \pi('C_E2(Y)) by rewrite pi_pdiv cardG_gt1.
+ have [X]: exists X, X \in 'E_q^1(E :&: 'C_E2(Y)).
+ by apply/p_rank_geP; rewrite /= setIA (setIidPr sE2E) p_rank_gt0.
+ rewrite pnElemI -setIdE => /setIdP[EqX sXcE2Y].
+ have t2q:= pnatPpi t2E2 (piSg (subsetIl _ _) piCE2Yq).
+ have [A Eq2A _] := ex_tau2Elem hallE t2q.
+ have [[_ defEq1] _ _ _] := tau2_compl_context maxM hallE t2q Eq2A.
+ rewrite (tau12_regular maxM hallE t1p EpY t2q Eq2A) //.
+ rewrite (subG1_contra _ (nt_pnElem EqX _)) // subsetI.
+ rewrite defEq1 in EqX; case/pnElemP: EqX => -> _ _.
+ by rewrite (subset_trans sXcE2Y) ?subsetIr.
+ have [defM [sUE _]] := (sdprod_sigma maxM hallE, andP nsUE).
+ have hallU: \sigma_kappa(M)^'.-Hall(M) U.
+ suffices: [predI \sigma(M)^' & \kappa(M)^'].-Hall(M) U.
+ by apply: etrans; apply: eq_pHall=> p; rewrite inE /= negb_or.
+ apply: subHall_Hall hallE _ _ => [p|]; first by case/andP.
+ rewrite pHallE partnI (part_pnat_id s'E) -pHallE.
+ have hallK_E: \kappa(M).-Hall(E) K := pHall_subl sKE sEM hallK.
+ by apply/(sdprod_normal_pHallP nsUE hallK_E); rewrite -defK.
+ exists U; [rewrite -{2}defK defE | rewrite -{1}defK]; split=> //.
+ by split; rewrite // -defK mulUE1 groupP.
+ apply: abelianS (der_mmax_compl_abelian maxM hallE).
+ rewrite -(coprime_cent_prod nUE1) ?(solvableS sUE) //.
+ by rewrite {2}defK (cent_semiregular regUK) // mulg1 commgSS.
+ by rewrite (coprime_sdprod_Hall_r defE); apply: pHall_Hall hallE1.
+ move: not_t1K; rewrite negb_and cardG_gt0 => /allPn[p piKp t1'p].
+ have kp := pnatPpi kK piKp; have t3p := kappa_tau13 kp.
+ rewrite [p \in _](negPf t1'p) /= in t3p.
+ have [X]: exists X, X \in 'E_p^1(K) by apply/p_rank_geP; rewrite p_rank_gt0.
+ rewrite -{1}(setIidPr sKM) pnElemI -setIdE => /setIdP[EpX sXK].
+ have sXE3: X \subset E3.
+ rewrite (sub_normal_Hall hallE3) ?(subset_trans sXK) ?(pi_pgroup _ t3p) //.
+ by case/pnElemP: EpX => _ /andP[].
+ have [nregX ntX] := (kappa_nonregular kp EpX, nt_pnElem EpX isT).
+ have [regE3|ntE1 {defE}defE prE nE1_E] := tau13_nonregular maxM complEi.
+ by case/eqP: nregX; rewrite (cent_semiregular regE3).
+ have defK: E :=: K.
+ apply: (sub_pHall hallK _ sKE sEM); apply/pgroupP=> q q_pr q_dv_E.
+ have{q_dv_E} piEq: q \in \pi(E) by rewrite mem_primes q_pr cardG_gt0.
+ rewrite unlock; apply/andP; split=> /=.
+ apply: pnatPpi piEq; rewrite -pgroupE -(sdprodW defE).
+ rewrite pgroupM (sub_pgroup _ t3E3) => [|r t3r]; last by apply/orP; right.
+ by rewrite (sub_pgroup _ t1E1) // => r t1r; apply/orP; left.
+ have:= piEq; rewrite -p_rank_gt0 => /p_rank_geP[Y].
+ rewrite -{1}(setIidPr sEM) pnElemI -setIdE => /setIdP[EqY sYE].
+ rewrite (cent_semiprime prE) ?(subset_trans sXK) // in nregX.
+ apply/exists_inP; exists Y => //; apply: subG1_contra nregX.
+ by rewrite setIS ?centS.
+ have defM := sdprod_sigma maxM hallE.
+ rewrite /b1_hyp -defK; split=> //; exists 1%G; last first.
+ by split; [exact: abelian1 | rewrite -defK | exact: semiregular1l].
+ rewrite sdprod1g; do 2?split=> //; rewrite ?mul1g ?groupP -?defK //.
+ rewrite pHallE sub1G cards1 eq_sym partG_eq1 pgroupNK /=.
+ have{defM} [_ defM _ _] := sdprodP defM; rewrite -{2}defM defK pgroupM.
+ rewrite (sub_pgroup _ sMs) => [|r sr]; last by apply/orP; left.
+ by rewrite (sub_pgroup _ kK) // => r kr; apply/orP; right.
+set part_b := _ /\ _; set part_c := _ /\ _; set part_d := _ /\ _.
+have [U [complUK defM] [cUU prMsK regUK]] := have_a.
+have [hallU _ _] := complUK; have [sUM sk'U _] := and3P hallU.
+have have_b: part_b.
+ have coMsU: coprime #|Ms| #|U|.
+ by rewrite (pnat_coprime sMs (sub_pgroup _ sk'U)) // => p; case/norP.
+ have{defM} [[_ F _ defF]] := sdprodP defM; rewrite defF.
+ have [_ <- nUK _] := sdprodP defF; rewrite mulgA mulG_subG => defM.
+ case/andP=> nMsU nMsK _.
+ have coMsU_K: coprime #|Ms <*> U| #|K|.
+ rewrite norm_joinEr // (p'nat_coprime _ kK) // -pgroupE.
+ rewrite pgroupM // (sub_pgroup _ sMs) => [|r]; last first.
+ by apply: contraL; apply: kappa_sigma'.
+ by apply: sub_pgroup _ sk'U => r /norP[].
+ have defNK X: X <| K -> X :!=: 1 -> 'N_M(X) = Ks * K.
+ case/andP=> sXK nXK ntX; rewrite -defM -(norm_joinEr nMsU).
+ rewrite setIC -group_modr // setIC.
+ rewrite coprime_norm_cent ?(subset_trans sXK) ?normsY //; last first.
+ by rewrite (coprimegS sXK).
+ rewrite /= norm_joinEr -?subcent_TImulg ?(coprime_TIg coMsU) //; last first.
+ by rewrite subsetI !(subset_trans sXK).
+ by rewrite (cent_semiregular regUK) // mulg1 (cent_semiprime prMsK).
+ rewrite /part_b dprodE ?subsetIr //; last first.
+ rewrite setICA setIA (coprime_TIg (coprimeSg _ coMsU_K)) ?setI1g //.
+ by rewrite joing_subl.
+ rewrite -centC ?subsetIr // defNK //; split=> // X Eq1X.
+ have [q EqX] := nElemP Eq1X; have ntX := nt_pnElem EqX isT.
+ have:= EqX; rewrite -{1}(setIidPr sKE) pnElemI -setIdE.
+ case/setIdP=> EqEX sXK; split; first by rewrite defNK ?nK1K.
+ have [_ abelX dimX] := pnElemP EqX; have [qX _] := andP abelX.
+ have kq: q \in \kappa(M).
+ by rewrite (pnatPpi kK (piSg sXK _)) // -p_rank_gt0 p_rank_abelem ?dimX.
+ have nregX := kappa_nonregular kq (subsetP (pnElemS _ _ sEM) _ EqEX).
+ have sq := tau13_nonregular_sigma maxM hallE EqEX (kappa_tau13 kq) nregX.
+ move=> H maxNH; have [maxH sNXH] := setIdP maxNH.
+ rewrite (sub_Hall_pcore (Msigma_Hall maxH)) ?(subset_trans (normG X)) //.
+ exact: pi_pgroup qX (sq H maxNH).
+have have_c: part_c.
+ pose p := pdiv #|E1|; have piE1p: p \in \pi(E1) by rewrite pi_pdiv cardG_gt1.
+ have:= piE1p; rewrite -p_rank_gt0 => /p_rank_geP[Y].
+ rewrite -(setIidPr sE1M) pnElemI -setIdE => /setIdP[EpY sYE1].
+ have [sYK ntY] := (subset_trans sYE1 sE1K, nt_pnElem EpY isT).
+ split=> [|X /nElemP[q]].
+ rewrite /Ks -(cent_semiprime prMsK sYK) //.
+ exact: kappa_nonregular (pnatPpi kK (piSg sE1K piE1p)) EpY.
+ rewrite /= -(cent_semiprime prMsK sYK) // => EqX.
+ by have [] := cent_cent_Msigma_tau1_uniq maxM hallE hallE1 sYE1 ntY EqX.
+have [[defNK defK1] [_ uniqKs]] := (have_b, have_c).
+have have_d: part_d.
+ split=> g.
+ rewrite inE; apply: contraNeq; rewrite -rank_gt0.
+ case/rank_geP=> X; rewrite nElemI -setIdE -groupV => /setIdP[EpX sXMg].
+ have [_ sCXMs] := mem_uniq_mmax (uniqKs _ EpX).
+ case/nElemP: EpX => p /pnElemP[/subsetIP[sXMs _] abelX dimX].
+ have [[pX _] sXM] := (andP abelX, subset_trans sXMs (pcore_sub _ _)).
+ have piXp: p \in \pi(X) by rewrite -p_rank_gt0 p_rank_abelem ?dimX.
+ have sp := pnatPpi sMs (piSg sXMs piXp).
+ have [def_g _ _] := sigma_group_trans maxM sp pX.
+ have [|c cXc [m Mm ->]] := def_g g^-1 sXM; first by rewrite sub_conjgV.
+ by rewrite groupM // (subsetP sCXMs).
+ case/setDP=> Mg; apply: contraNeq; rewrite -rank_gt0 /=.
+ case/rank_geP=> X; rewrite nElemI -setIdE => /setIdP[EpX sXKg].
+ have [<- _] := defK1 X EpX; rewrite 2!inE Mg /=.
+ have{EpX} [p EpX] := nElemP EpX; have [_ abelX dimX] := pnElemP EpX.
+ have defKp1: {in 'E_p^1(K), forall Y, 'Ohm_1('O_p(K)) = Y}.
+ move=> Y EpY; have E1K_Y: Y \in 'E^1(K) by apply/nElemP; exists p.
+ have piKp: p \in \pi(K) by rewrite -p_rank_gt0; apply/p_rank_geP; exists Y.
+ have [pKp sKpK] := (pcore_pgroup p K, pcore_sub p K).
+ have cycKp: cyclic 'O_p(K).
+ rewrite (odd_pgroup_rank1_cyclic pKp) ?mFT_odd //.
+ by rewrite -(rank_kappa (pnatPpi kK piKp)) p_rankS ?(subset_trans sKpK).
+ have [sYK abelY oY] := pnElemPcard EpY; have [pY _] := andP abelY.
+ have sYKp: Y \subset 'O_p(K) by rewrite pcore_max ?nK1K.
+ apply/eqP; rewrite eq_sym eqEcard -{1}(Ohm1_id abelY) OhmS //= oY.
+ rewrite (Ohm1_cyclic_pgroup_prime cycKp pKp) ?(subG1_contra sYKp) //=.
+ exact: nt_pnElem EpY _.
+ rewrite sub_conjg -[X :^ _]defKp1 ?(defKp1 X) //.
+ by rewrite !inE sub_conjgV sXKg abelemJ abelX cardJg dimX.
+split=> {part_a part_b part_c have_a have_b have_c}//; first split=> //.
+- move=> q; rewrite /Ks -(cent_semiprime prMsK sE1K ntE1) => picMsE1q.
+ have sq := pnatPpi (pcore_pgroup _ M) (piSg (subsetIl _ _) picMsE1q).
+ move: picMsE1q; rewrite -p_rank_gt0; case/p_rank_geP=> y EqY S sylS.
+ have [sSM qS _] := and3P sylS.
+ have sSMs: S \subset M`_\sigma.
+ by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) ?(pi_pgroup qS).
+ have sylS_Ms: q.-Sylow(M`_\sigma) S := pHall_subl sSMs (pcore_sub _ M) sylS.
+ have [_]:= cent_cent_Msigma_tau1_uniq maxM hallE hallE1 (subxx _) ntE1 EqY.
+ move/(_ S sylS_Ms) => uniqS; split=> //; rewrite subsetI sSMs /=.
+ pose p := pdiv #|E1|; have piE1p: p \in \pi(E1) by rewrite pi_pdiv cardG_gt1.
+ have [s'p _] := andP (pnatPpi t1E1 piE1p).
+ have [P sylP] := Sylow_exists p E1; have [sPE1 pP _] := and3P sylP.
+ apply: contra (s'p) => cE1S; apply/exists_inP; exists P.
+ exact: subHall_Sylow s'p (subHall_Sylow hallE1 (pnatPpi t1E1 piE1p) sylP).
+ apply: (sub_uniq_mmax uniqS); first by rewrite cents_norm // (centsS sPE1).
+ apply: mFT_norm_proper (mFT_pgroup_proper pP).
+ by rewrite -rank_gt0 (rank_Sylow sylP) p_rank_gt0.
+- move=> Y sY ntYKs; have ntY: Y :!=:1 := subG1_contra (subsetIl _ _) ntYKs.
+ have [[x sYxMs] _] := sigma_Jsub maxM sY ntY; rewrite sub_conjg in sYxMs.
+ suffices Mx': x^-1 \in M by rewrite (normsP _ _ Mx') ?gFnorm in sYxMs.
+ rewrite -(setCK M) inE; apply: contra ntYKs => M'x'.
+ rewrite setIC -(setIidPr sYxMs) -/Ms -[Ms](setIidPr (pcore_sub _ _)).
+ by rewrite conjIg !setIA; have [-> // _] := have_d; rewrite !setI1g.
+rewrite inE PmaxM andbT -(trivg_kappa_compl maxM complUK) => ntU.
+have [regMsU nilMs]: 'C_Ms(U) = 1 /\ nilpotent Ms.
+ pose p := pdiv #|U|; have piUp: p \in \pi(U) by rewrite pi_pdiv cardG_gt1.
+ have sk'p := pnatPpi sk'U piUp.
+ have [S sylS] := Sylow_exists p U; have [sSU _] := andP sylS.
+ have sylS_M := subHall_Sylow hallU sk'p sylS.
+ rewrite -(setIidPr (centS (subset_trans (Ohm_sub 1 S) sSU))) setIA.
+ have [|_ _ -> ->] := sigma'_kappa'_facts maxM sylS_M; last by rewrite setI1g.
+ by rewrite -negb_or (piSg sUM).
+have [[_ F _ defF] _ _ _] := sdprodP defM; rewrite defF in defM.
+have hallMs: \sigma(M).-Hall(M) Ms by apply: Msigma_Hall.
+have hallF: \sigma(M)^'.-Hall(M) F by apply/(sdprod_Hall_pcoreP hallMs).
+have frF: [Frobenius F = U ><| K] by apply/Frobenius_semiregularP.
+have ntMs: Ms != 1 by apply: Msigma_neq1.
+have prK: prime #|K|.
+ have [solF [_ _ nMsF _]] := (sigma_compl_sol hallF, sdprodP defM).
+ have solMs: solvable Ms := solvableS (pcore_sub _ _) (mmax_sol maxM).
+ have coMsF: coprime #|Ms| #|F|.
+ by rewrite (coprime_sdprod_Hall_r defM) (pHall_Hall hallF).
+ by have [] := Frobenius_primact frF solF nMsF solMs ntMs coMsF prMsK.
+have eq_sb: \sigma(M) =i \beta(M).
+ suffices bMs: \beta(M).-group Ms.
+ move=> p; apply/idP/idP=> [sp|]; last exact: beta_sub_sigma.
+ rewrite (pnatPpi bMs) //= (card_Hall (Msigma_Hall maxM)) pi_of_part //.
+ by rewrite inE /= sigma_sub_pi.
+ have [H hallH cHF'] := der_compl_cent_beta' maxM hallF.
+ rewrite -pgroupNK -partG_eq1 -(card_Hall hallH) -trivg_card1 -subG1.
+ rewrite -regMsU subsetI (pHall_sub hallH) centsC (subset_trans _ cHF') //.
+ have [solU [_ mulUK nUK _]] := (abelian_sol cUU, sdprodP defF).
+ have coUK: coprime #|U| #|K|.
+ rewrite (p'nat_coprime (sub_pgroup _ (pHall_pgroup hallU)) kK) // => p.
+ by case/norP.
+ rewrite -(coprime_cent_prod nUK) // (cent_semiregular regUK) // mulg1.
+ by rewrite -mulUK commgSS ?mulG_subl ?mulG_subr.
+split=> //; apply/normedTI_P; rewrite setD_eq0 subG1 setTI normD1 gFnorm.
+split=> // g _; rewrite -setI_eq0 conjD1g -setDIl setD_eq0 subG1 /= -/Ms.
+have [_ _ b'MsMg] := sigma_compl_embedding maxM hallE.
+apply: contraR => notMg; have{b'MsMg notMg} [_ b'MsMg _] := b'MsMg g notMg.
+rewrite -{2}(setIidPr (pHall_sub hallMs)) conjIg setIA coprime_TIg // cardJg.
+by apply: p'nat_coprime b'MsMg _; rewrite -(eq_pnat _ eq_sb).
+Qed.
+
+(* This is essentially the skolemized form of 14.2(a). *)
+Lemma kappa_compl_context M U K :
+ M \in 'M -> kappa_complement M U K ->
+ [/\ \sigma(M)^'.-Hall(M) (U <*> K),
+ M`_\sigma ><| (U ><| K) = M,
+ semiprime M`_\sigma K,
+ semiregular U K
+ & K :!=: 1 -> abelian U].
+Proof.
+move=> maxM [hallU hallK gsetUK]; set E := U <*> K.
+have mulUK: U * K = E by rewrite -(gen_set_id gsetUK) genM_join.
+have [[sKM kK _] [sUM sk'U _]] := (and3P hallK, and3P hallU).
+have tiUK: U :&: K = 1.
+ by apply: coprime_TIg (p'nat_coprime (sub_pgroup _ sk'U) kK) => p; case/norP.
+have hallE: \sigma(M)^'.-Hall(M) E.
+ rewrite pHallE /= -/E -mulUK mul_subG //= TI_cardMg //.
+ rewrite -(partnC \kappa(M) (part_gt0 _ _)) (partn_part _ (@kappa_sigma' M)).
+ apply/eqP; rewrite -partnI -(card_Hall hallK) mulnC; congr (_ * _)%N.
+ by rewrite (card_Hall hallU); apply: eq_partn => p; apply: negb_or.
+have [K1 | ntK] := altP (K :=P: 1).
+ rewrite K1 sdprodg1 -{1}(mulg1 U) -{1}K1 mulUK sdprod_sigma //.
+ by split=> //; first apply: semiregular_prime; apply: semiregular1r.
+have PmaxM: M \in 'M_'P by rewrite inE maxM -(trivg_kappa maxM hallK) andbT.
+have [[V [complV defM] [cVV prK regK]] _ _ _ _] := Ptype_structure PmaxM hallK.
+have [[_ F _ defF] _ _ _] := sdprodP defM; rewrite defF in defM.
+have hallF: \sigma(M)^'.-Hall(M) F.
+ exact/(sdprod_Hall_pcoreP (Msigma_Hall maxM)).
+have [a Ma /= defFa] := Hall_trans (mmax_sol maxM) hallE hallF.
+have [hallV _ _] := complV; set sk' := \sigma_kappa(M)^' in hallU hallV sk'U.
+have [nsVF sKF _ _ _] := sdprod_context defF.
+have [[[sVF _] [sFM _]] [sEM _]] := (andP nsVF, andP hallF, andP hallE).
+have hallV_F: sk'.-Hall(F) V := pHall_subl sVF sFM hallV.
+have hallU_E: sk'.-Hall(E) U := pHall_subl (joing_subl _ _) sEM hallU.
+have defV: 'O_sk'(F) = V := normal_Hall_pcore hallV_F nsVF.
+have hallEsk': sk'.-Hall(E) 'O_sk'(E).
+ by rewrite [E]defFa pcoreJ pHallJ2 /= defV.
+have defU: 'O_sk'(E) = U by rewrite (eq_Hall_pcore hallEsk' hallU_E).
+have nUE: E \subset 'N(U) by rewrite -defU gFnorm.
+have hallK_E: \kappa(M).-Hall(E) K := pHall_subl (joing_subr _ _) sEM hallK.
+have hallK_F: \kappa(M).-Hall(F) K := pHall_subl sKF sFM hallK.
+have hallKa_E: \kappa(M).-Hall(E) (K :^ a) by rewrite [E]defFa pHallJ2.
+have [b Eb /= defKab] := Hall_trans (sigma_compl_sol hallE) hallK_E hallKa_E.
+have defVa: V :^ a = U by rewrite -defV -pcoreJ -defFa defU.
+split=> // [| x Kx | _]; last by rewrite -defVa abelianJ.
+ by rewrite [U ><| K]sdprodEY ?sdprod_sigma //; case/joing_subP: nUE.
+rewrite -(conjgKV (a * b) x) -(normsP nUE b Eb) -defVa -conjsgM.
+rewrite -cent_cycle cycleJ centJ -conjIg cent_cycle regK ?conjs1g //.
+by rewrite -mem_conjg conjD1g conjsgM -defKab.
+Qed.
+
+(* This is B & G, Corollary 14.3. *)
+Corollary pi_of_cent_sigma M x x' :
+ M \in 'M -> x \in (M`_\sigma)^# ->
+ x' \in ('C_M[x])^# -> \sigma(M)^'.-elt x' ->
+ (*1*) \kappa(M).-elt x' /\ 'C[x] \subset M
+ \/ (*2*) [/\ \tau2(M).-elt x', \ell_\sigma(x') == 1%N & 'M('C[x']) = [set M]].
+Proof.
+move: x' => y maxM /setD1P[ntx Ms_x] /setD1P[nty cMxy] s'y.
+have [My cxy] := setIP cMxy.
+have [t2y | not_t2y] := boolP (\tau2(M).-elt y); [right | left].
+ have uniqCy: 'M('C[y]) = [set M]; last split=> //.
+ apply: cent1_nreg_sigma_uniq; rewrite // ?inE ?nty //.
+ by apply/trivgPn; exists x; rewrite // inE Ms_x cent1C.
+ pose p := pdiv #[y]; have piYp: p \in \pi(#[y]) by rewrite pi_pdiv order_gt1.
+ have t2p := pnatPpi t2y piYp; have [E hallE] := ex_sigma_compl maxM.
+ have [A Ep2A _] := ex_tau2Elem hallE t2p.
+ have pA: p.-group A by case/pnElemP: Ep2A => _ /andP[].
+ have ntA: A :!=: 1 by rewrite (nt_pnElem Ep2A).
+ have [H maxNH] := mmax_exists (mFT_norm_proper ntA (mFT_pgroup_proper pA)).
+ have [st2MsH _ _] := primes_norm_tau2Elem maxM hallE t2p Ep2A maxNH.
+ have [maxH _] := setIdP maxNH.
+ have sHy: \sigma(H).-elt y by apply: sub_p_elt t2y => q /st2MsH/andP[].
+ rewrite /sigma_length (cardsD1 y.`_(\sigma(H))).
+ rewrite mem_sigma_decomposition //; last by rewrite constt_p_elt.
+ rewrite eqSS -sigma_decomposition_constt' //.
+ by apply/ell_sigma0P; rewrite (constt1P _) ?p_eltNK.
+have{not_t2y} [p piYp t2'p]: exists2 p, p \in \pi(#[y]) & p \notin \tau2(M).
+ by apply/allPn; rewrite negb_and cardG_gt0 in not_t2y.
+have sYM: <[y]> \subset M by rewrite cycle_subG.
+have piMp: p \in \pi(M) := piSg sYM piYp.
+have t13p: p \in [predU \tau1(M) & \tau3(M)].
+ move: piMp; rewrite partition_pi_mmax // (negPf t2'p) /= orbA.
+ by case/orP=> // sMy; case/negP: (pnatPpi s'y piYp).
+have [X]: exists X, X \in 'E_p^1(<[y]>) by apply/p_rank_geP; rewrite p_rank_gt0.
+rewrite -(setIidPr sYM) pnElemI -setIdE => /setIdP[EpX sXy].
+have kp: p \in \kappa(M).
+ rewrite unlock; apply/andP; split=> //; apply/exists_inP; exists X => //.
+ apply/trivgPn; exists x; rewrite // inE Ms_x (subsetP (centS sXy)) //.
+ by rewrite cent_cycle cent1C.
+have [sXM abelX dimX] := pnElemP EpX; have [pX _] := andP abelX.
+have [K hallK sXK] := Hall_superset (mmax_sol maxM) sXM (pi_pgroup pX kp).
+have PmaxM: M \in 'M_'P.
+ by rewrite 2!inE maxM andbT; apply: contraL kp => k'M; exact: (pnatPpi k'M).
+have [_ [defNK defNX] [_ uniqCKs] _ _] := Ptype_structure PmaxM hallK.
+have{defNX} sCMy_nMK: 'C_M[y] \subset 'N_M(K).
+ have [|<- _] := defNX X.
+ by apply/nElemP; exists p; rewrite !inE sXK abelX dimX.
+ by rewrite setIS // cents_norm // -cent_cycle centS.
+have [[sMK kK _] [_ mulKKs cKKs _]] := (and3P hallK, dprodP defNK).
+have s'K: \sigma(M)^'.-group K := sub_pgroup (@kappa_sigma' M) kK.
+have sMs: \sigma(M).-group M`_\sigma := pcore_pgroup _ M.
+have sKs: \sigma(M).-group 'C_(M`_\sigma)(K) := pgroupS (subsetIl _ _) sMs.
+have{s'K sKs} [hallK_N hallKs] := coprime_mulGp_Hall mulKKs s'K sKs.
+split.
+ rewrite (mem_p_elt kK) // (mem_normal_Hall hallK_N) ?normal_subnorm //.
+ by rewrite (subsetP sCMy_nMK) // inE My cent1id.
+have Mx: x \in M := subsetP (pcore_sub _ _) x Ms_x.
+have sxKs: <[x]> \subset 'C_(M`_\sigma)(K).
+ rewrite cycle_subG (mem_normal_Hall hallKs) ?(mem_p_elt sMs) //=.
+ by rewrite -mulKKs /normal mulG_subr mulG_subG normG cents_norm // centsC.
+ by rewrite (subsetP sCMy_nMK) // inE Mx cent1C.
+have /rank_geP[Z]: 0 < 'r(<[x]>) by rewrite rank_gt0 cycle_eq1.
+rewrite /= -(setIidPr sxKs) nElemI -setIdE => /setIdP[E1KsZ sZx].
+have [_ sCZM] := mem_uniq_mmax (uniqCKs Z E1KsZ).
+by rewrite (subset_trans _ sCZM) // -cent_cycle centS.
+Qed.
+
+(* This is B & G, Theorem 14.4. *)
+(* We are omitting the first half of part (a), since we have taken it as our *)
+(* definition of 'R[x]. *)
+Theorem FT_signalizer_context x (N := 'N[x]) (R := 'R[x]) :
+ \ell_\sigma(x) == 1%N ->
+ [/\ [/\ [transitive R, on 'M_\sigma[x] | 'JG],
+ #|R| = #|'M_\sigma[x]|,
+ R <| 'C[x]
+ & Hall 'C[x] R]
+ & #|'M_\sigma[x]| > 1 ->
+ [/\ 'M('C[x]) = [set N],
+ (*a*) R :!=: 1,
+ (*c1*) \tau2(N).-elt x,
+ (*f*) N \in 'M_'F :|: 'M_'P2
+ & {in 'M_\sigma[x], forall M,
+ [/\ (*b*) R ><| 'C_(M :&: N)[x] = 'C[x],
+ (*c2*) {subset \tau2(N) <= \sigma(M)},
+ (*d*) {subset [predI \pi(M) & \sigma(N)] <= \beta(N)}
+ & (*e*) \sigma(N)^'.-Hall(N) (M :&: N)]}]].
+Proof.
+rewrite {}/N {}/R => ell1x; have [ntx ntMSx] := ell_sigma1P x ell1x.
+have [M MSxM] := set0Pn _ ntMSx; have [maxM Ms_x] := setIdP MSxM.
+rewrite cycle_subG in Ms_x; have sMx := mem_p_elt (pcore_pgroup _ M) Ms_x.
+have Mx: x \in M := subsetP (pcore_sub _ _) x Ms_x.
+have [MSx_le1 | MSx_gt1] := leqP _ 1.
+ rewrite /'R[x] /'N[x] ltnNge MSx_le1 (trivgP (pcore_sub _ _)) setI1g normal1.
+ have <-: [set M] = 'M_\sigma[x].
+ by apply/eqP; rewrite eqEcard sub1set MSxM cards1.
+ by rewrite /Hall atrans_acts_card ?imset_set1 ?cards1 ?sub1G ?coprime1n.
+have [q pi_x_q]: exists q, q \in \pi(#[x]).
+ by exists (pdiv #[x]); rewrite pi_pdiv order_gt1.
+have{sMx} sMq: q \in \sigma(M) := pnatPpi sMx pi_x_q.
+have [X EqX]: exists X, X \in 'E_q^1(<[x]>).
+ by apply/p_rank_geP; rewrite p_rank_gt0.
+have [sXx abelX dimX] := pnElemP EqX; have [qX cXX _] := and3P abelX.
+have ntX: X :!=: 1 := nt_pnElem EqX isT.
+have sXM: X \subset M by rewrite (subset_trans sXx) ?cycle_subG.
+have [N maxNX_N] := mmax_exists (mFT_norm_proper ntX (mFT_pgroup_proper qX)).
+have [maxN sNX_N] := setIdP maxNX_N; pose R := 'C_(N`_\sigma)[x]%G.
+have sCX_N: 'C(X) \subset N := subset_trans (cent_sub X) sNX_N.
+have sCx_N: 'C[x] \subset N by rewrite -cent_cycle (subset_trans (centS sXx)).
+have sMSx_MSX: 'M_\sigma[x] \subset 'M_\sigma(X).
+ apply/subsetP=> M1 /setIdP[maxM1 sxM1].
+ by rewrite inE maxM1 (subset_trans sXx).
+have nsRCx: R <| 'C[x] by rewrite /= setIC (normalGI sCx_N) ?pcore_normal.
+have hallR: \sigma(N).-Hall('C[x]) R.
+ exact: setI_normal_Hall (pcore_normal _ _) (Msigma_Hall maxN) sCx_N.
+have transCX: [transitive 'C(X), on 'M_\sigma(X) | 'JG].
+ have [_ trCX _ ] := sigma_group_trans maxM sMq qX.
+ case/imsetP: trCX => _ /setIdP[/imsetP[y _ ->] sXMy] trCX.
+ have maxMy: (M :^ y)%G \in 'M by rewrite mmaxJ.
+ have sXMys: X \subset (M :^ y)`_\sigma.
+ by rewrite (sub_Hall_pcore (Msigma_Hall _)) // (pi_pgroup qX) ?sigmaJ.
+ apply/imsetP; exists (M :^ y)%G; first exact/setIdP.
+ apply/setP=> Mz; apply/setIdP/imsetP=> [[maxMz sXMzs] | [z cXz -> /=]].
+ suffices: gval Mz \in orbit 'Js 'C(X) (M :^ y).
+ by case/imsetP=> z CXz /group_inj->; exists z.
+ rewrite -trCX inE andbC (subset_trans sXMzs) ?pcore_sub //=.
+ apply/idPn => /(sigma_partition maxM maxMz)/=/(_ q)/idP[].
+ rewrite inE /= sMq (pnatPpi (pgroupS sXMzs (pcore_pgroup _ _))) //.
+ by rewrite -p_rank_gt0 p_rank_abelem ?dimX.
+ by rewrite mmaxJ -(normP (subsetP (cent_sub X) z cXz)) MsigmaJ conjSg.
+have MSX_M: M \in 'M_\sigma(X) := subsetP sMSx_MSX M MSxM.
+have not_sCX_M: ~~ ('C(X) \subset M).
+ apply: contraL MSx_gt1 => sCX_M.
+ rewrite -leqNgt (leq_trans (subset_leq_card sMSx_MSX)) //.
+ rewrite -(atransP transCX _ MSX_M) card_orbit astab1JG.
+ by rewrite (setIidPl (normsG sCX_M)) indexgg.
+have neqNM: N :!=: M by apply: contraNneq not_sCX_M => <-.
+have maxNX'_N: N \in 'M('N(X)) :\ M by rewrite 2!inE neqNM.
+have [notMGN _] := sigma_subgroup_embedding maxM sMq sXM qX ntX maxNX'_N.
+have sN'q: q \notin \sigma(N).
+ by apply: contraFN (sigma_partition maxM maxN notMGN q) => sNq; exact/andP.
+rewrite (negPf sN'q) => [[t2Nq s_piM_bN hallMN]].
+have defN: N`_\sigma ><| (M :&: N) = N.
+ exact/(sdprod_Hall_pcoreP (Msigma_Hall maxN)).
+have Nx: x \in N by rewrite (subsetP sCx_N) ?cent1id.
+have MNx: x \in M :&: N by rewrite inE Mx.
+have sN'x: \sigma(N)^'.-elt x by rewrite (mem_p_elt (pHall_pgroup hallMN)).
+have /andP[sNsN nNsN]: N`_\sigma <| N := pcore_normal _ _.
+have nNs_x: x \in 'N(N`_\sigma) := subsetP nNsN x Nx.
+have defCx: R ><| 'C_(M :&: N)[x] = 'C[x].
+ rewrite -{2}(setIidPr sCx_N) /= -cent_cycle (subcent_sdprod defN) //.
+ by rewrite subsetI andbC normsG ?cycle_subG.
+have transR: [transitive R, on 'M_\sigma[x] | 'JG].
+ apply/imsetP; exists M => //; apply/setP=> L.
+ apply/idP/imsetP=> [MSxL | [u Ru ->{L}]]; last first.
+ have [_ cxu] := setIP Ru; rewrite /= -cent_cycle in cxu.
+ by rewrite -(normsP (cent_sub _) u cxu) sigma_mmaxJ.
+ have [u cXu defL] := atransP2 transCX MSX_M (subsetP sMSx_MSX _ MSxL).
+ have [_ mulMN nNsMN tiNsMN] := sdprodP defN.
+ have:= subsetP sCX_N u cXu; rewrite -mulMN -normC //.
+ case/imset2P=> v w /setIP[Mv _] Ns_w def_u; exists w => /=; last first.
+ by apply: group_inj; rewrite defL /= def_u conjsgM (conjGid Mv).
+ rewrite inE Ns_w -groupV (sameP cent1P commgP) -in_set1 -set1gE -tiNsMN.
+ rewrite setICA setIC (setIidPl sNsN) inE groupMl ?groupV //.
+ rewrite memJ_norm // groupV Ns_w /= -(norm_mmax maxM) inE sub_conjg.
+ rewrite invg_comm -(conjSg _ _ w) -{2}(conjGid Mx) -!conjsgM -conjg_Rmul.
+ rewrite -conjgC conjsgM -(conjGid Mv) -(conjsgM M) -def_u.
+ rewrite -[M :^ u](congr_group defL) conjGid // -cycle_subG.
+ by have [_ Ls_x] := setIdP MSxL; rewrite (subset_trans Ls_x) ?pcore_sub.
+have oR: #|R| = #|'M_\sigma[x]|.
+ rewrite -(atransP transR _ MSxM) card_orbit astab1JG (norm_mmax maxM).
+ rewrite -setIAC /= -{3}(setIidPl sNsN) -(setIA _ N) -(setIC M).
+ by have [_ _ _ ->] := sdprodP defN; rewrite setI1g indexg1.
+have ntR: R :!=: 1 by rewrite -cardG_gt1 oR.
+have [y Ns_y CNy_x]: exists2 y, y \in (N`_\sigma)^# & x \in ('C_N[y])^#.
+ have [y Ry nty] := trivgPn _ ntR; have [Ns_y cxy] := setIP Ry.
+ by exists y; rewrite 2!inE ?nty // inE Nx cent1C ntx.
+have kN'q: q \notin \kappa(N).
+ rewrite (contra (@kappa_tau13 N q)) // negb_or (contraL (@tau2'1 _ _ _)) //.
+ exact: tau3'2.
+have [[kNx _] | [t2Nx _ uniqN]] := pi_of_cent_sigma maxN Ns_y CNy_x sN'x.
+ by case/idPn: (pnatPpi kNx pi_x_q).
+have defNx: 'N[x] = N.
+ apply/set1P; rewrite -uniqN /'N[x] MSx_gt1.
+ by case: pickP => // /(_ N); rewrite uniqN /= set11.
+rewrite /'R[x] {}defNx -(erefl (gval R)) (pHall_Hall hallR).
+split=> // _; split=> // [|L MSxL].
+ rewrite !(maxN, inE) /=; case: (pgroup _ _) => //=; rewrite andbT.
+ apply: contra kN'q => skN_N; have:= pnatPpi (mem_p_elt skN_N Nx) pi_x_q.
+ by case/orP=> //=; rewrite (negPf sN'q).
+have [u Ru ->{L MSxL}] := atransP2 transR MSxM MSxL; rewrite /= cardJg.
+have [Ns_u cxu] := setIP Ru; have Nu := subsetP sNsN u Ns_u.
+rewrite -{1}(conjGid Ru) -(conjGid cxu) -{1 6 7}(conjGid Nu) -!conjIg pHallJ2.
+split=> // [|p t2Np].
+ rewrite /= -(setTI 'C[x]) -!(setICA setT) -!morphim_conj.
+ exact: injm_sdprod (subsetT _) (injm_conj _ _) defCx.
+have [A Ep2A _] := ex_tau2Elem hallMN t2Np.
+have [[nsAMN _] _ _ _] := tau2_compl_context maxN hallMN t2Np Ep2A.
+have{Ep2A} Ep2A: A \in 'E_p^2(M) by move: Ep2A; rewrite pnElemI; case/setIP.
+have rpM: 'r_p(M) > 1 by apply/p_rank_geP; exists A.
+have: p \in \pi(M) by rewrite -p_rank_gt0 ltnW.
+rewrite sigmaJ partition_pi_mmax // !orbA; case/orP=> //.
+rewrite orbAC -2!andb_orr -(subnKC rpM) andbF /= => t2Mp.
+case/negP: ntX; rewrite -subG1 (subset_trans sXx) //.
+have [_ _ <- _ _] := tau2_context maxM t2Mp Ep2A.
+have [[sAM abelA _] [_ nAMN]] := (pnElemP Ep2A, andP nsAMN).
+rewrite -coprime_norm_cent ?(subset_trans sAM) ?gFnorm //.
+ by rewrite cycle_subG inE Ms_x (subsetP nAMN).
+have [[sM'p _] [pA _]] := (andP t2Mp, andP abelA).
+exact: pnat_coprime (pcore_pgroup _ _) (pi_pgroup pA sM'p).
+Qed.
+
+(* A useful supplement to Theorem 14.4. *)
+Lemma cent1_sub_uniq_sigma_mmax x M :
+ #|'M_\sigma[x]| == 1%N -> M \in 'M_\sigma[x] -> 'C[x] \subset M.
+Proof.
+move: M => M0 /cards1P[M defMSx] MS_M0; move: MS_M0 (MS_M0).
+rewrite {1}defMSx => /set1P->{M0} MSxM; have [maxM _] := setIdP MSxM.
+rewrite -(norm_mmax maxM); apply/normsP=> y cxy; apply: congr_group.
+by apply/set1P; rewrite -defMSx -(mulKg y x) (cent1P cxy) cycleJ sigma_mmaxJ.
+Qed.
+
+Remark cent_FT_signalizer x : x \in 'C('R[x]).
+Proof. by rewrite -sub_cent1 subsetIr. Qed.
+
+(* Because the definition of 'N[x] uses choice, we can only prove it commutes *)
+(* with conjugation now that we have established that the choice is unique. *)
+Lemma FT_signalizer_baseJ x z : 'N[x ^ z] :=: 'N[x] :^ z.
+Proof.
+case MSx_gt1: (#|'M_\sigma[x]| > 1); last first.
+ by rewrite /'N[x] /'N[_] cycleJ card_sigma_mmaxJ MSx_gt1 conjs1g.
+have [x1 | ntx] := eqVneq x 1.
+ rewrite x1 conj1g /'N[1] /= norm1.
+ case: pickP => [M maxTM | _]; last by rewrite if_same conjs1g.
+ by have [maxM] := setIdP maxTM; case/idPn; rewrite proper_subn ?mmax_proper.
+apply: congr_group; apply/eqP; rewrite eq_sym -in_set1.
+have ell1xz: \ell_\sigma(x ^ z) == 1%N.
+ by rewrite ell_sigmaJ; apply/ell_sigma1P; rewrite -cards_eq0 -lt0n ltnW.
+have [_ [|<- _ _ _ _]] := FT_signalizer_context ell1xz.
+ by rewrite cycleJ card_sigma_mmaxJ.
+rewrite -conjg_set1 normJ mmax_ofJ; rewrite ell_sigmaJ in ell1xz.
+by have [_ [//|-> _ _ _ _]] := FT_signalizer_context ell1xz; apply: set11.
+Qed.
+
+Lemma FT_signalizerJ x z : 'R[x ^ z] :=: 'R[x] :^ z.
+Proof.
+by rewrite /'R[x] /'R[_] FT_signalizer_baseJ MsigmaJ -conjg_set1 normJ conjIg.
+Qed.
+
+Lemma sigma_coverJ x z : x ^ z *: 'R[x ^ z] = (x *: 'R[x]) :^ z.
+Proof. by rewrite FT_signalizerJ conjsMg conjg_set1. Qed.
+
+Lemma sigma_supportJ M z : (M :^ z)^~~ = M^~~ :^ z.
+Proof.
+rewrite -bigcupJ /_^~~ MsigmaJ -conjD1g (big_imset _ (in2W (act_inj 'J z))) /=.
+by apply: eq_bigr => x _; rewrite sigma_coverJ.
+Qed.
+
+(* This is the remark imediately above B & G, Lemma 14.5; note the adjustment *)
+(* allowing for the case x' = 1. *)
+Remark sigma_cover_decomposition x x' :
+ \ell_\sigma(x) == 1%N -> x' \in 'R[x] ->
+ sigma_decomposition (x * x') = x |: [set x']^#.
+Proof.
+move=> ell1x Rx'; have [-> | ntx'] := eqVneq x' 1.
+ by rewrite mulg1 setDv setU0 ell1_decomposition.
+rewrite setDE (setIidPl _) ?sub1set ?inE // setUC.
+have ntR: #|'R[x]| > 1 by rewrite cardG_gt1; apply/trivgPn; exists x'.
+have [Ns_x' cxx'] := setIP Rx'; move/cent1P in cxx'.
+have [[_ <- _ _] [//| maxN _ t2Nx _ _]] := FT_signalizer_context ell1x.
+have{maxN} [maxN _] := mem_uniq_mmax maxN.
+have sNx' := mem_p_elt (pcore_pgroup _ _) Ns_x'.
+have sN'x: \sigma('N[x])^'.-elt x by apply: sub_p_elt t2Nx => p /andP[].
+have defx': (x * x').`_\sigma('N[x]) = x'.
+ by rewrite consttM // (constt1P sN'x) mul1g constt_p_elt.
+have sd_xx'_x': x' \in sigma_decomposition (x * x').
+ by rewrite 2!inE ntx' -{1}defx'; apply: mem_imset.
+rewrite -(setD1K sd_xx'_x') -{3}defx' -sigma_decomposition_constt' ?consttM //.
+by rewrite constt_p_elt // (constt1P _) ?p_eltNK ?mulg1 // ell1_decomposition.
+Qed.
+
+(* This is the simplified form of remark imediately above B & G, Lemma 14.5. *)
+Remark nt_sigma_cover_decomposition x x' :
+ \ell_\sigma(x) == 1%N -> x' \in 'R[x]^# ->
+ sigma_decomposition (x * x') = [set x; x'].
+Proof.
+move=> ell1x /setD1P[ntx' Rx']; rewrite sigma_cover_decomposition //.
+by rewrite setDE (setIidPl _) ?sub1set ?inE // setUC.
+Qed.
+
+Remark mem_sigma_cover_decomposition x g :
+ \ell_\sigma(x) == 1%N -> g \in x *: 'R[x] -> x \in sigma_decomposition g.
+Proof.
+by move=> ell1x /lcosetP[x' Rx' ->]; rewrite sigma_cover_decomposition ?setU11.
+Qed.
+
+Remark ell_sigma_cover x g :
+ \ell_\sigma(x) == 1%N -> g \in x *: 'R[x] -> \ell_\sigma(g) <= 2.
+Proof.
+move=> ell1x /lcosetP[x' Rx' ->].
+rewrite /(\ell_\sigma(_)) sigma_cover_decomposition // cardsU1.
+by rewrite (leq_add (leq_b1 _)) // -(cards1 x') subset_leq_card ?subsetDl.
+Qed.
+
+Remark ell_sigma_support M g : M \in 'M -> g \in M^~~ -> \ell_\sigma(g) <= 2.
+Proof.
+by move=> maxM /bigcupP[x Msx]; apply: ell_sigma_cover; apply: Msigma_ell1 Msx.
+Qed.
+
+(* This is B & G, Lemma 14.5(a). *)
+Lemma sigma_cover_disjoint x y :
+ \ell_\sigma(x) == 1%N -> \ell_\sigma(y) == 1%N -> x != y ->
+ [disjoint x *: 'R[x] & y *: 'R[y]].
+Proof.
+move=> ell1x ell1y neq_xy; apply/pred0P=> g /=.
+have [[ntx _] [nty _]] := (ell_sigma1P x ell1x, ell_sigma1P y ell1y).
+apply: contraNF (ntx) => /andP[/lcosetP[x' Rxx' ->{g}] /= yRy_xx'].
+have def_y: y = x'.
+ apply: contraTeq (mem_sigma_cover_decomposition ell1y yRy_xx') => neq_yx'.
+ by rewrite sigma_cover_decomposition // !inE negb_or nty eq_sym neq_xy.
+have [[_ <- _ _] [|uniqCx _ _ _ _]] := FT_signalizer_context ell1x.
+ by rewrite cardG_gt1; apply/trivgPn; exists x'; rewrite // -def_y.
+have{uniqCx} [maxNx sCxNx] := mem_uniq_mmax uniqCx.
+have Rx_y: y \in 'R[x] by [rewrite def_y]; have [Nxs_y cxy] := setIP Rx_y.
+have Ry_x: x \in 'R[y].
+ by rewrite -def_y -(cent1P cxy) mem_lcoset mulKg in yRy_xx'.
+have MSyNx: 'N[x] \in 'M_\sigma[y] by rewrite inE maxNx cycle_subG.
+have [[_ <- _ _] [|uniqCy _ _ _]] := FT_signalizer_context ell1y.
+ by rewrite cardG_gt1; apply/trivgPn; exists x.
+have{uniqCy} [_ sCyNy] := mem_uniq_mmax uniqCy.
+case/(_ 'N[x] MSyNx)=> /sdprodP[_ _ _ tiRyNx] _ _ _.
+rewrite -in_set1 -set1gE -tiRyNx -setIA (setIidPr sCyNy) inE Ry_x /=.
+by rewrite inE cent1C cxy (subsetP sCxNx) ?cent1id.
+Qed.
+
+(* This is B & G, Lemma 14.5(b). *)
+Lemma sigma_support_disjoint M1 M2 :
+ M1 \in 'M -> M2 \in 'M -> gval M2 \notin M1 :^: G -> [disjoint M1^~~ & M2^~~].
+Proof.
+move=> maxM1 maxM2 notM1GM2; rewrite -setI_eq0 -subset0 big_distrl.
+apply/bigcupsP=> x M1s_x; rewrite big_distrr; apply/bigcupsP=> y M2s_y /=.
+have [ell1x ell1y] := (Msigma_ell1 maxM1 M1s_x, Msigma_ell1 maxM2 M2s_y).
+rewrite subset0 setI_eq0 sigma_cover_disjoint //.
+have{M1s_x M2s_y}[[ntx M1s_x] [_ M2s_y]] := (setD1P M1s_x, setD1P M2s_y).
+pose p := pdiv #[x]; have pixp: p \in \pi(#[x]) by rewrite pi_pdiv order_gt1.
+apply: contraFN (sigma_partition maxM1 maxM2 notM1GM2 p) => eq_xy.
+rewrite inE /= (pnatPpi (mem_p_elt (pcore_pgroup _ _) M1s_x)) //=.
+by rewrite (pnatPpi (mem_p_elt (pcore_pgroup _ _) M2s_y)) -?(eqP eq_xy).
+Qed.
+
+(* This is B & G, Lemma 14.5(c). *)
+Lemma card_class_support_sigma M :
+ M \in 'M -> #|class_support M^~~ G| = (#|M`_\sigma|.-1 * #|G : M|)%N.
+Proof.
+move=> maxM; rewrite [#|M`_\sigma|](cardsD1 1) group1 /=.
+set MsG := class_support (M`_\sigma)^# G; pose P := [set x *: 'R[x] | x in MsG].
+have ellMsG x: x \in MsG -> \ell_\sigma(x) == 1%N.
+ by case/imset2P=> y z My _ ->; rewrite ell_sigmaJ (Msigma_ell1 maxM).
+have tiP: trivIset P.
+ apply/trivIsetP=> _ _ /imsetP[x MsGx ->] /imsetP[y MsGy ->] neq_xRyR.
+ by rewrite sigma_cover_disjoint ?ellMsG //; apply: contraNneq neq_xRyR => ->.
+have->: class_support M^~~ G = cover P.
+ apply/setP=> az; apply/imset2P/bigcupP=> [[a z] | [xRz]].
+ case/bigcupP=> x Ms_x xRa Gz ->; exists (x ^ z *: 'R[x ^ z]).
+ by apply: mem_imset; exact: mem_imset2.
+ by rewrite sigma_coverJ memJ_conjg.
+ case/imsetP=> _ /imset2P[x z Ms_x Gz ->] ->; rewrite sigma_coverJ.
+ by case/imsetP=> a xRa ->; exists a z => //; apply/bigcupP; exists x.
+rewrite -(eqnP tiP) big_imset /= => [|x y MsGx MsGy eq_xyR]; last first.
+ have: x *: 'R[x] != set0 by rewrite -cards_eq0 -lt0n card_lcoset cardG_gt0.
+ rewrite -[x *: _]setIid {2}eq_xyR setI_eq0.
+ by apply: contraNeq => neq_xy; rewrite sigma_cover_disjoint ?ellMsG.
+rewrite -{2}(norm_mmax maxM) -astab1JG -indexgI -card_orbit.
+set MG := orbit _ G M; rewrite mulnC -sum_nat_const.
+transitivity (\sum_(Mz in MG) \sum_(x in (Mz`_\sigma)^#) 1); last first.
+ apply: eq_bigr => _ /imsetP[z _ ->]; rewrite sum1_card MsigmaJ.
+ by rewrite -conjD1g cardJg.
+rewrite (exchange_big_dep (mem MsG)) /= => [|Mz xz]; last first.
+ case/imsetP=> z Gz ->; rewrite MsigmaJ -conjD1g => /imsetP[x Ms_x ->{xz}].
+ exact: mem_imset2.
+apply: eq_bigr => x MsGx; rewrite card_lcoset sum1dep_card.
+have ell1x := ellMsG x MsGx; have [ntx _] := ell_sigma1P x ell1x.
+have [[transRx -> _ _] _] := FT_signalizer_context ell1x.
+apply: eq_card => Mz; rewrite 2!inE cycle_subG in_setD1 ntx /=.
+apply: andb_id2r => Mzs_x.
+apply/idP/imsetP=> [maxMz | [z _ ->]]; last by rewrite mmaxJ.
+have [y t Ms_y _ def_x] := imset2P MsGx; have{Ms_y} [_ Ms_y] := setD1P Ms_y.
+have [MSxMz MSxMt]: Mz \in 'M_\sigma[x] /\ (M :^ t)%G \in 'M_\sigma[x].
+ by rewrite {2}def_x cycleJ sigma_mmaxJ inE maxMz inE maxM !cycle_subG.
+have [z _ ->] := atransP2 transRx MSxMt MSxMz.
+by exists (t * z); rewrite ?inE ?actM.
+Qed.
+
+(* This is B & G, Lemma 14.6. *)
+Lemma sigma_decomposition_dichotomy (g : gT) :
+ g != 1 ->
+ [exists (x | \ell_\sigma(x) == 1%N), x^-1 * g \in 'R[x]]
+ (+) [exists (y | \ell_\sigma(y) == 1%N),
+ let y' := y^-1 * g in
+ [exists M in 'M_\sigma[y], (y' \in ('C_M[y])^#) && \kappa(M).-elt y']].
+Proof.
+move=> ntg; have [[x ell1x Rx'] | ] := altP exists_inP.
+ rewrite /= negb_exists_in; apply/forall_inP=> y ell1y.
+ set y' := y^-1 * g; set x' := x^-1 * g in Rx'.
+ apply/existsP=> -[M /and3P[MSyM CMy_y' kMy']].
+ have [maxM Ms_y] := setIdP MSyM; rewrite cycle_subG in Ms_y.
+ have [nty'] := setD1P CMy_y'; case/setIP=> My'; move/cent1P=> cyy'.
+ have [[nty _] sMy]:= (ell_sigma1P y ell1y, mem_p_elt (pcore_pgroup _ _) Ms_y).
+ have sM'y': \sigma(M)^'.-elt y' := sub_p_elt (@kappa_sigma' M) kMy'.
+ have t2M'y': \tau2(M)^'.-elt y'.
+ apply: sub_p_elt kMy' => p; move/kappa_tau13.
+ by case/orP; [apply: tau2'1 | apply: contraL; apply: tau3'2].
+ have xx'_y: y \in pred2 x x'.
+ suffices: y \in x |: [set x']^# by rewrite !inE nty.
+ rewrite -sigma_cover_decomposition // mulKVg 2!inE nty /=.
+ apply/imsetP; exists M => //; rewrite -(mulKVg y g) -/y' consttM //.
+ by rewrite (constt_p_elt sMy) (constt1P sM'y') mulg1.
+ have nt_x': x' != 1 by case/pred2P: xx'_y; rewrite /x' => <-.
+ have maxCY_M: M \in 'M('C[y]).
+ have Ms1_y: y \in (M`_\sigma)^# by apply/setD1P.
+ rewrite inE maxM; case/pi_of_cent_sigma: CMy_y' => // [[//] | [t2y']].
+ by rewrite -order_eq1 (pnat_1 t2y' t2M'y') in nty'.
+ have [[_ <- _ _] [|uniqNx _ t2Nx _ _]] := FT_signalizer_context ell1x.
+ by rewrite cardG_gt1; apply/trivgPn; exists x'.
+ rewrite -order_gt1 (pnat_1 sMy _) // -/(_.-elt _) in nty.
+ have{xx'_y} [eq_yx | eq_yx']: y = x \/ y = x' := pred2P xx'_y.
+ rewrite eq_yx uniqNx in maxCY_M *; rewrite (set1P maxCY_M).
+ by apply: sub_p_elt t2Nx => p; case/andP.
+ have eq_xy': x = y' by apply: (mulIg y); rewrite cyy' {1}eq_yx' !mulKVg.
+ have [[z _ defM] | notMGNx] := altP (@orbitP _ _ _ 'Js G 'N[x] M).
+ rewrite -order_eq1 (pnat_1 _ t2M'y') // in nty'.
+ by rewrite -defM (eq_pnat _ (tau2J _ _)) -eq_xy'.
+ have Ns_y: y \in 'N[x]`_\sigma by rewrite eq_yx'; case/setIP: Rx'.
+ apply: sub_p_elt (mem_p_elt (pcore_pgroup _ _) Ns_y) => p sNp.
+ have [maxN _] := mem_uniq_mmax uniqNx.
+ by apply: contraFN (sigma_partition _ _ notMGNx p) => // sMp; apply/andP.
+rewrite negb_exists_in => /forall_inP not_sign_g.
+apply: wlog_neg; rewrite negb_exists_in => /forall_inP not_kappa_g.
+have s'g M: M \in 'M -> g \in M -> g.`_\sigma(M) = 1.
+ move=> maxM; set x := g.`_\sigma(M); pose x' := g.`_(\sigma(M))^'.
+ have def_x': x^-1 * g = x' by rewrite -(consttC \sigma(M) g) mulKg.
+ apply: contraTeq => ntx.
+ have ell1x: \ell_\sigma(x) == 1%N.
+ rewrite /sigma_length (cardsD1 x.`_\sigma(M)).
+ rewrite -sigma_decomposition_constt' // mem_sigma_decomposition //.
+ by apply/ell_sigma0P; apply/constt1P; rewrite p_eltNK p_elt_constt.
+ by rewrite sub_in_constt // => ?.
+ apply: contra (not_sign_g _ ell1x) => Mg; rewrite def_x'.
+ have [-> | ntx'] := eqVneq x' 1; first exact: group1.
+ have cxx': x \in 'C[x'] by apply/cent1P; apply: commuteX2.
+ have cMx_x': x' \in ('C_M[x])^# by rewrite 3!inE ntx' cent1C cxx' groupX.
+ have Ms_x: x \in M`_\sigma.
+ by rewrite (mem_Hall_pcore (Msigma_Hall maxM)) ?p_elt_constt ?groupX.
+ have Ms1x: x \in (M`_\sigma)^# by apply/setD1P.
+ have sM'x': (\sigma(M))^'.-elt x' := p_elt_constt _ _.
+ have [[kMx' _] | [_ ell1x' uniqM]] := pi_of_cent_sigma maxM Ms1x cMx_x' sM'x'.
+ case/existsP: (not_kappa_g _ ell1x); exists M; rewrite def_x' cMx_x' /=.
+ by rewrite inE maxM cycle_subG Ms_x.
+ have MSx'_gt1: #|'M_\sigma[x']| > 1.
+ have [_ ntMSx'] := ell_sigma1P _ ell1x'.
+ rewrite ltn_neqAle lt0n cards_eq0 ntMSx' andbT eq_sym.
+ apply: contra ntx' => MSx'_eq1; rewrite -order_eq1 (pnat_1 _ sM'x') //.
+ have [N MSx'N] := set0Pn _ ntMSx'; have [maxN Ns_x'] := setIdP MSx'N.
+ rewrite -(eq_uniq_mmax uniqM maxN) ?cent1_sub_uniq_sigma_mmax //.
+ exact: pgroupS Ns_x' (pcore_pgroup _ _).
+ have defNx': 'N[x'] = M.
+ by apply: set1_inj; case/FT_signalizer_context: ell1x' => _ [|<-].
+ case/negP: (not_sign_g _ ell1x').
+ by rewrite -(consttC \sigma(M)^' g) mulKg consttNK inE defNx' Ms_x.
+have [x sg_x]: exists x, x \in sigma_decomposition g.
+ by apply/set0Pn; rewrite -cards_eq0 (sameP (ell_sigma0P g) eqP).
+have{sg_x} [ntx /imsetP[M maxM def_x]] := setD1P sg_x.
+wlog MSxM: M maxM def_x / M \in 'M_\sigma[x].
+ have sMx: \sigma(M).-elt x by rewrite def_x p_elt_constt.
+ have [|[z Ms_xz] _] := sigma_Jsub maxM sMx; first by rewrite cycle_eq1.
+ move/(_ (M :^ z^-1)%G)->; rewrite ?mmaxJ ?(eq_constt _ (sigmaJ M _)) //.
+ by rewrite inE mmaxJ maxM MsigmaJ -sub_conjg.
+have ell1x: \ell_\sigma(x) == 1%N.
+ by apply/ell_sigma1P; split=> //; apply/set0Pn; exists M.
+have notMg: g \notin M by apply: contra ntx; rewrite def_x; move/s'g->.
+have cxg: g \in 'C[x] by rewrite cent1C def_x groupX ?cent1id.
+have MSx_gt1: #|'M_\sigma[x]| > 1.
+ rewrite ltnNge; apply: contra notMg => MSx_le1; apply: subsetP cxg.
+ have [_ ntMSx] := ell_sigma1P _ ell1x.
+ by rewrite cent1_sub_uniq_sigma_mmax // eqn_leq MSx_le1 lt0n cards_eq0.
+have [_ [//|defNx _ _ _]] := FT_signalizer_context ell1x.
+case/(_ M)=> // _ _ _ hallMN; have [maxN sCxN] := mem_uniq_mmax defNx.
+have Ng: <[g]> \subset 'N[x] by rewrite cycle_subG (subsetP sCxN).
+have sN'g: \sigma('N[x])^'.-elt g by apply/constt1P; rewrite s'g // -cycle_subG.
+have [z _ MNgz] := Hall_subJ (mmax_sol maxN) hallMN Ng sN'g.
+case/eqP: ntx; rewrite def_x -(eq_constt _ (sigmaJ M z)) s'g ?mmaxJ //.
+by move: MNgz; rewrite conjIg cycle_subG => /setIP[].
+Qed.
+
+Section PTypeEmbedding.
+Implicit Types Mi Mj : {group gT}.
+Implicit Type Ks : {set gT}.
+
+(* This is B & G, Theorem 14.7. *)
+(* This theorem provides the basis for the maximal subgroup classification, *)
+(* the main output of the local analysis. Note that we handle differently the *)
+(* two separate instances of non-structural proof (by analogy) that occur in *)
+(* the textbook, p. 112, l. 7 and p. 113, l. 22. For the latter we simply use *)
+(* global induction on the size of the class support of the TI-set \hat{Z} *)
+(* (for this reason we have kept the assertion that this is greater than half *)
+(* of the size of G, even though this is not used later in the proof; we did *)
+(* drop the more precise lower bound). For the former we prove a preliminary *)
+(* lemma that summarizes the four results of the beginning of the proof that *)
+(* used after p. 112, l. 7 -- note that this also gets rid of a third non *)
+(* structural argument (on p. 112, l. 5). *)
+(* Also, note that the direct product decomposition of Z and the K_i, and *)
+(* its direct relation with the sigma-decomposition of elements of Z (p. 112, *)
+(* l. 13-19) is NOT materially used in the rest of the argument, though it *)
+(* does obviously help a human reader forge a mental picture of the situation *)
+(* at hand. Only the first remark, l. 13, is used to prove the alternative *)
+(* definition of T implicit in the remarks l. 22-23. Accordingly, we have *)
+(* suppressed most of these intermediate results: we have only kept the proof *)
+(* that Z is the direct product of the K_i^*, though we discard this result *)
+(* immediately (its 24-line proof just nudges the whole proof size slightyly *)
+(* over the 600-line bar). *)
+Theorem Ptype_embedding M K :
+ M \in 'M_'P -> \kappa(M).-Hall(M) K ->
+ exists2 Mstar, Mstar \in 'M_'P /\ gval Mstar \notin M :^: G
+ & let Kstar := 'C_(M`_\sigma)(K) in
+ let Z := K <*> Kstar in let Zhat := Z :\: (K :|: Kstar) in
+ [/\ (*a*) {in 'E^1(K), forall X, 'M('C(X)) = [set Mstar]},
+ (*b*) \kappa(Mstar).-Hall(Mstar) Kstar /\ \sigma(M).-Hall(Mstar) Kstar,
+ (*c*) 'C_(Mstar`_\sigma)(Kstar) = K /\ \kappa(M) =i \tau1(M),
+ (*d*) [/\ cyclic Z, M :&: Mstar = Z,
+ {in K^#, forall x, 'C_M[x] = Z},
+ {in Kstar^#, forall y, 'C_Mstar[y] = Z}
+ & {in K^# & Kstar^#, forall x y, 'C[x * y] = Z}]
+& [/\ (*e*) [/\ normedTI Zhat G Z, {in ~: M, forall g, [disjoint Zhat & M :^ g]}
+ & (#|G|%:R / 2%:R < #|class_support Zhat G|%:R :> rat)%R ],
+ (*f*) M \in 'M_'P2 /\ prime #|K| \/ Mstar \in 'M_'P2 /\ prime #|Kstar|,
+ (*g*) {in 'M_'P, forall H, gval H \in M :^: G :|: Mstar :^: G}
+ & (*h*) M^`(1) ><| K = M]].
+Proof.
+pose isKi Ks M K := [&& M \in 'M_'P, \kappa(M).-Hall(M) K & Ks \subset K].
+move: M K; have Pmax_sym M K X (Ks := 'C_(M`_\sigma)(K)) (Z := K <*> Ks) Mi :
+ M \in 'M_'P -> \kappa(M).-Hall(M) K -> X \in 'E^1(K) -> Mi \in 'M('N(X)) ->
+ [/\ Z \subset Mi, gval Mi \notin M :^: G, exists Ki, isKi Ks Mi Ki
+ & {in 'E^1(Ks), forall Xs, Z \subset 'N_Mi(gval Xs)}].
+- move=> PmaxM hallK E1X maxNMi.
+ have [[_ maxM] [maxMi sNXMi]] := (setIdP PmaxM, setIdP maxNMi).
+ have [_ [defNK defNX] [ntKs uniqCKs] _ _] := Ptype_structure PmaxM hallK.
+ rewrite -/Ks in defNK ntKs uniqCKs; have [_ mulKKs cKKs _] := dprodP defNK.
+ have{mulKKs} defZ: 'N_M(K) = Z by rewrite -mulKKs -cent_joinEr.
+ have sZMi: Z \subset Mi.
+ by rewrite -defZ; have [<- _] := defNX X E1X; rewrite setIC subIset ?sNXMi.
+ have [sKMi sKsMi] := joing_subP sZMi.
+ have sXMis: X \subset Mi`_\sigma by have [_ ->] := defNX X E1X.
+ have sMiX: \sigma(Mi).-group X := pgroupS sXMis (pcore_pgroup _ _).
+ have [q EqX] := nElemP E1X; have [sXK abelX dimX] := pnElemP EqX.
+ have piXq: q \in \pi(X) by rewrite -p_rank_gt0 p_rank_abelem ?dimX.
+ have notMGMi: gval Mi \notin M :^: G.
+ apply: contraL (pnatPpi sMiX piXq); case/imsetP=> a _ ->; rewrite sigmaJ.
+ exact: kappa_sigma' (pnatPpi (pHall_pgroup hallK) (piSg sXK piXq)).
+ have kMiKs: \kappa(Mi).-group Ks.
+ apply/pgroupP=> p p_pr /Cauchy[] // xs Ks_xs oxs.
+ pose Xs := <[xs]>%G; have sXsKs: Xs \subset Ks by rewrite cycle_subG.
+ have EpXs: Xs \in 'E_p^1(Ks) by rewrite p1ElemE // !inE sXsKs -oxs /=.
+ have sMi'Xs: \sigma(Mi)^'.-group Xs.
+ rewrite /pgroup /= -orderE oxs pnatE //=.
+ apply: contraFN (sigma_partition maxM maxMi notMGMi p) => /= sMi_p.
+ rewrite inE /= sMi_p -pnatE // -oxs andbT.
+ exact: pgroupS sXsKs (pgroupS (subsetIl _ _) (pcore_pgroup _ _)).
+ have uniqM: 'M('C(Xs)) = [set M] by apply: uniqCKs; apply/nElemP; exists p.
+ have [x Xx ntx] := trivgPn _ (nt_pnElem EqX isT).
+ have Mis_x: x \in (Mi`_\sigma)^# by rewrite !inE ntx (subsetP sXMis).
+ have CMix_xs: xs \in ('C_Mi[x])^#.
+ rewrite 2!inE -order_gt1 oxs prime_gt1 // inE -!cycle_subG.
+ rewrite (subset_trans sXsKs) //= sub_cent1 (subsetP _ x Xx) //.
+ by rewrite centsC (centSS sXsKs sXK).
+ have{sMi'Xs} [|[_ _]] := pi_of_cent_sigma maxMi Mis_x CMix_xs sMi'Xs.
+ by case; rewrite /p_elt oxs pnatE.
+ case/mem_uniq_mmax=> _ sCxsMi; case/negP: notMGMi.
+ by rewrite -(eq_uniq_mmax uniqM maxMi) ?orbit_refl //= cent_cycle.
+ have{kMiKs} [Ki hallKi sKsKi] := Hall_superset (mmax_sol maxMi) sKsMi kMiKs.
+ have{ntKs} PmaxMi: Mi \in 'M_'P.
+ rewrite !(maxMi, inE) andbT /= -partG_eq1 -(card_Hall hallKi) -trivg_card1.
+ exact: subG1_contra sKsKi ntKs.
+ have [_ [defNKi defNXs] _ _ _] := Ptype_structure PmaxMi hallKi.
+ split=> //= [|Xs]; first by exists Ki; apply/and3P.
+ rewrite -{1}[Ks](setIidPr sKsKi) nElemI -setIdE => /setIdP[E1Xs sXsKs].
+ have{defNXs} [defNXs _] := defNXs _ E1Xs; rewrite join_subG /= {2}defNXs.
+ by rewrite !subsetI sKMi sKsMi cents_norm ?normsG ?(centsS sXsKs) // centsC.
+move=> M K PmaxM hallK /=; set Ks := 'C_(M`_\sigma)(K); set Z := K <*> Ks.
+move: {2}_.+1 (ltnSn #|class_support (Z :\: (K :|: Ks)) G|) => nTG.
+elim: nTG => // nTG IHn in M K PmaxM hallK Ks Z *; rewrite ltnS => leTGn.
+have [maxM notFmaxM]: M \in 'M /\ M \notin 'M_'F := setDP PmaxM.
+have{notFmaxM} ntK: K :!=: 1 by rewrite (trivg_kappa maxM).
+have [_ [defNK defNX] [ntKs uniqCKs] _ _] := Ptype_structure PmaxM hallK.
+rewrite -/Ks in defNK ntKs uniqCKs; have [_ mulKKs cKKs _] := dprodP defNK.
+have{mulKKs} defZ: 'N_M(K) = Z by rewrite -mulKKs -cent_joinEr.
+pose MNX := \bigcup_(X in 'E^1(K)) 'M('N(X)); pose MX := M |: MNX.
+have notMG_MNX: {in MNX, forall Mi, gval Mi \notin M :^: G}.
+ by move=> Mi /bigcupP[X E1X /(Pmax_sym M K)[]].
+have MX0: M \in MX := setU11 M MNX.
+have notMNX0: M \notin MNX by apply/negP=> /notMG_MNX; rewrite orbit_refl.
+pose K_ Mi := odflt K [pick Ki | isKi Ks Mi Ki].
+pose Ks_ Mi := 'C_(Mi`_\sigma)(K_ Mi).
+have K0: K_ M = K.
+ rewrite /K_; case: pickP => // K1 /and3P[_ /and3P[_ kK1 _] sKsK1].
+ have sM_Ks: \sigma(M).-group Ks := pgroupS (subsetIl _ _) (pcore_pgroup _ _).
+ rewrite -(setIid Ks) coprime_TIg ?eqxx ?(pnat_coprime sM_Ks) // in ntKs.
+ exact: sub_pgroup (@kappa_sigma' M) (pgroupS sKsK1 kK1).
+have Ks0: Ks_ M = Ks by rewrite /Ks_ K0.
+have K_spec: {in MNX, forall Mi, isKi Ks Mi (K_ Mi)}.
+ move=> Mi /bigcupP[X _ /(Pmax_sym M K)[] // _ _ [Ki Ki_ok] _].
+ by rewrite /K_; case: pickP => // /(_ Ki)/idP.
+have PmaxMX: {in MX, forall Mi, Mi \in 'M_'P /\ \kappa(Mi).-Hall(Mi)(K_ Mi)}.
+ by move=> Mi /setU1P[-> | /K_spec/and3P[]//]; rewrite K0.
+have ntKsX: {in MX, forall Mi, Ks_ Mi != 1}.
+ by move=> Mi /PmaxMX[MX_Mi /Ptype_structure[] // _ _ []].
+pose co_sHallK Mi Zi :=
+ let sMi := \sigma(Mi) in sMi^'.-Hall(Zi) (K_ Mi) /\ sMi.-Hall(Zi) (Ks_ Mi).
+have hallK_Zi: {in MX, forall Mi, co_sHallK Mi (K_ Mi \x Ks_ Mi)}.
+ move=> Mi MXi; have [PmaxMi hallKi] := PmaxMX _ MXi.
+ have [_ [defNKs _] _ _ _] := Ptype_structure PmaxMi hallKi.
+ have [_ mulKKs _ _] := dprodP defNKs; rewrite defNKs.
+ have sMi_Kis: _.-group (Ks_ Mi) := pgroupS (subsetIl _ _) (pcore_pgroup _ _).
+ have sMi'Ki := sub_pgroup (@kappa_sigma' _) (pHall_pgroup hallKi).
+ exact: coprime_mulGp_Hall mulKKs sMi'Ki sMi_Kis.
+have{K_spec} defZX: {in MX, forall Mi, K_ Mi \x Ks_ Mi = Z}.
+ move=> Mi MXi; have [-> | MNXi] := setU1P MXi; first by rewrite K0 Ks0 defNK.
+ have /and3P[PmaxMi hallKi sKsKi] := K_spec _ MNXi.
+ have [X E1X maxNMi] := bigcupP MNXi.
+ have{defNX} [defNX /(_ Mi maxNMi) sXMis] := defNX X E1X.
+ have /rank_geP[Xs E1Xs]: 0 < 'r(Ks) by rewrite rank_gt0.
+ have [_ [defNi defNXi] _ _ _] := Ptype_structure PmaxMi hallKi.
+ have [defNXs _] := defNXi _ (subsetP (nElemS 1 sKsKi) _ E1Xs).
+ have [_ hallKis] := hallK_Zi _ MXi; rewrite defNi in hallKis.
+ have sZNXs: Z \subset 'N_Mi(Xs) by case/(Pmax_sym M K): maxNMi => // _ _ _ ->.
+ apply/eqP; rewrite eqEsubset andbC {1}defNi -defNXs sZNXs.
+ have [_ _ cKiKis tiKiKis] := dprodP defNi; rewrite dprodEY // -defZ -defNX.
+ have E1KiXs: Xs \in 'E^1(K_ Mi) := subsetP (nElemS 1 sKsKi) Xs E1Xs.
+ have [|_ _ _ -> //] := Pmax_sym Mi _ Xs M PmaxMi hallKi E1KiXs.
+ have [p EpXs] := nElemP E1Xs; have [_] := pnElemP EpXs; case/andP=> pXs _ _.
+ rewrite inE maxM (sub_uniq_mmax (uniqCKs _ E1Xs)) ?cent_sub //=.
+ exact: mFT_norm_proper (nt_pnElem EpXs isT) (mFT_pgroup_proper pXs).
+ have [q /pnElemP[sXK abelX dimX]] := nElemP E1X.
+ apply/nElemP; exists q; apply/pnElemP; split=> //.
+ have nKisZi: Ks_ Mi <| 'N_Mi(K_ Mi) by case/dprod_normal2: defNi.
+ rewrite (sub_normal_Hall hallKis) ?(pgroupS sXMis (pcore_pgroup _ _)) //=.
+ by rewrite -defNXs (subset_trans sXK) // (subset_trans (joing_subl _ Ks)).
+have{hallK_Zi} hallK_Z: {in MX, forall Mi, co_sHallK Mi Z}.
+ by move=> Mi MXi; rewrite -(defZX _ MXi); apply: hallK_Zi.
+have nsK_Z: {in MX, forall Mi, K_ Mi <| Z /\ Ks_ Mi <| Z}.
+ by move=> Mi /defZX; apply: dprod_normal2.
+have tiKs: {in MX &, forall Mi Mj, gval Mi != gval Mj -> Ks_ Mi :&: Ks_ Mj = 1}.
+ move=> Mi Mj MXi MXj; apply: contraNeq; rewrite -rank_gt0.
+ case/rank_geP=> X E1X; move: E1X (E1X); rewrite /= {1}setIC {1}nElemI.
+ case/setIP=> E1jX _; rewrite nElemI => /setIP[E1iX _].
+ have [[maxKi hallKi] [maxKj hallKj]] := (PmaxMX _ MXi, PmaxMX _ MXj).
+ have [_ _ [_ uniqMi] _ _] := Ptype_structure maxKi hallKi.
+ have [_ _ [_ uniqMj] _ _] := Ptype_structure maxKj hallKj.
+ by rewrite val_eqE -in_set1 -(uniqMj _ E1jX) (uniqMi _ E1iX) set11.
+have sKsKX: {in MX &, forall Mi Mj, Mj != Mi -> Ks_ Mj \subset K_ Mi}.
+ move=> Mi Mj MXi MXj /= neqMji; have [hallKi hallKsi] := hallK_Z _ MXi.
+ have [[_ nsKsjZ] [nsKiZ _]] := (nsK_Z _ MXj, nsK_Z _ MXi).
+ rewrite (sub_normal_Hall hallKi) ?(normal_sub nsKsjZ) // -partG_eq1.
+ by rewrite -(card_Hall (Hall_setI_normal _ hallKsi)) //= setIC tiKs ?cards1.
+have exMNX X: X \in 'E^1(K) -> exists2 Mi, Mi \in MNX & X \subset Mi`_\sigma.
+ move=> E1X; have [p EpX] := nElemP E1X; have [_ abelX _] := pnElemP EpX.
+ have ltXG: X \proper G := mFT_pgroup_proper (abelem_pgroup abelX).
+ have [Mi maxNMi] := mmax_exists (mFT_norm_proper (nt_pnElem EpX isT) ltXG).
+ have MNXi: Mi \in MNX by apply/bigcupP; exists X.
+ by exists Mi => //; have [_ ->] := defNX X E1X.
+have dprodKs_eqZ: \big[dprod/1]_(Mi in MX) Ks_ Mi = Z; last clear dprodKs_eqZ.
+ have sYKs_KX Mi:
+ Mi \in MX -> <<\bigcup_(Mj in MX | Mj != Mi) Ks_ Mj>> \subset K_ Mi.
+ - move=> MXi; rewrite gen_subG.
+ by apply/bigcupsP=> Mj /= /andP[]; apply: sKsKX.
+ transitivity <<\bigcup_(Mi in MX) Ks_ Mi>>; apply/eqP.
+ rewrite -bigprodGE; apply/bigdprodYP => Mi MXi; rewrite bigprodGE.
+ apply: subset_trans (sYKs_KX _ MXi) _; apply/dprodYP.
+ have [_ defZi cKiKs tiKiKs] := dprodP (defZX _ MXi).
+ by rewrite dprodC joingC dprodEY.
+ rewrite eqEsubset {1}(bigD1 M) //= Ks0 setUC -joingE -joing_idl.
+ rewrite genS ?setSU ?big_setU1 //=; last by rewrite -K0 sYKs_KX.
+ rewrite setUC -joingE -joing_idl Ks0 genS ?setSU // -(Sylow_gen K) gen_subG.
+ apply/bigcupsP=> P; case/SylowP=> p p_pr /=; case/and3P=> sPK pP _.
+ have [-> | ] := eqsVneq P 1; first exact: sub1G.
+ rewrite -rank_gt0 (rank_pgroup pP); case/p_rank_geP=> X EpX.
+ have EpKX: X \in 'E_p^1(K) := subsetP (pnElemS p 1 sPK) X EpX.
+ have{EpKX} E1X: X \in 'E^1(K) by apply/nElemP; exists p.
+ have [Mi MNXi sXMis] := exMNX X E1X; have MXi: Mi \in MX by rewrite setU1r.
+ have [[_ nsKsi] [_ hallKsi]] := (nsK_Z _ MXi, hallK_Z _ MXi).
+ have sPZ: P \subset Z := subset_trans sPK (joing_subl _ _).
+ rewrite sub_gen ?(bigcup_max Mi) // (sub_normal_Hall hallKsi) //.
+ rewrite (pi_pgroup pP) // (pnatPpi (pcore_pgroup _ _) (piSg sXMis _)) //.
+ by have [_ ? dimX] := pnElemP EpX; rewrite -p_rank_gt0 p_rank_abelem ?dimX.
+pose PZ := [set (Ks_ Mi)^# | Mi in MX]; pose T := Z^# :\: cover PZ.
+have defT: \bigcup_(Mi in MX) (Ks_ Mi)^# * (K_ Mi)^# = T.
+ apply/setP=> x; apply/bigcupP/setDP=> [[Mi MXi] | [Zx notZXx]].
+ case/mulsgP=> y y' /setD1P[nty Ks_y] /setD1P[nty' Ky'] defx.
+ have [_ defZi cKsKi tiKsKi] := dprodP (defZX _ MXi).
+ rewrite 2!inE -[Z]defZi -(centC cKsKi) andbC {1}defx mem_mulg //=.
+ have notKx: x \notin K_ Mi.
+ by rewrite -in_set1 -set1gE -tiKsKi inE Ks_y andbT defx groupMr in nty *.
+ split; first exact: group1_contra notKx.
+ rewrite cover_imset; apply/bigcupP=> [[Mj MXj /setD1P[_ Ksj_x]]].
+ rewrite (subsetP (sKsKX Mi Mj _ _ _)) // in notKx.
+ apply: contraNneq nty' => eqMji; rewrite -in_set1 -set1gE -tiKsKi inE Ky'.
+ by rewrite -(groupMl _ Ks_y) -defx -eqMji.
+ have{Zx} [ntx Zx] := setD1P Zx.
+ have [Mi MXi notKi_x]: exists2 Mi, Mi \in MX & x \notin K_ Mi.
+ have [Kx | notKx] := boolP (x \in K); last by exists M; rewrite ?K0.
+ pose p := pdiv #[x]; have xp: p \in \pi(#[x]) by rewrite pi_pdiv order_gt1.
+ have /p_rank_geP[X EpX]: 0 < 'r_p(<[x]>) by rewrite p_rank_gt0.
+ have [sXx abelX dimX] := pnElemP EpX.
+ have piXp: p \in \pi(X) by rewrite -p_rank_gt0 p_rank_abelem ?dimX.
+ have sXK: X \subset K by rewrite (subset_trans sXx) ?cycle_subG.
+ have E1X: X \in 'E^1(K) by apply/nElemP; exists p; apply/pnElemP.
+ have [Mi MNXi sXMis] := exMNX X E1X; have MXi: Mi \in MX := setU1r M MNXi.
+ have sXZ: X \subset Z := subset_trans sXK (joing_subl _ _).
+ have sMip: p \in \sigma(Mi) := pnatPpi (pcore_pgroup _ _) (piSg sXMis piXp).
+ have [hallKi _] := hallK_Z _ MXi.
+ exists Mi => //; apply: contraL sMip => Ki_x.
+ exact: pnatPpi (mem_p_elt (pHall_pgroup hallKi) Ki_x) xp.
+ have [_ defZi cKisKi _] := dprodP (defZX _ MXi).
+ rewrite -[Z]defZi -(centC cKisKi) in Zx.
+ have [y y' Kis_y Ki_y' defx] := mulsgP Zx.
+ have Kis1y: y \in (Ks_ Mi)^#.
+ rewrite 2!inE Kis_y andbT; apply: contraNneq notKi_x => y1.
+ by rewrite defx y1 mul1g.
+ exists Mi; rewrite // defx mem_mulg // 2!inE Ki_y' andbT.
+ apply: contraNneq notZXx => y'1; rewrite cover_imset.
+ by apply/bigcupP; exists Mi; rewrite // defx y'1 mulg1.
+have oT: #|T| = #|Z| + #|MNX| - (\sum_(Mi in MX) #|Ks_ Mi|).
+ have tiTPZ Kis: Kis \in PZ -> [disjoint T & Kis].
+ move=> Z_Kis; rewrite -setI_eq0 setIDAC setD_eq0.
+ by rewrite (bigcup_max Kis) ?subsetIr.
+ have notPZset0: set0 \notin PZ.
+ apply/imsetP=> [[Mi MXi]]; apply/eqP; rewrite /= eq_sym setD_eq0 subG1.
+ exact: ntKsX.
+ have [| tiPZ injKs] := trivIimset _ notPZset0.
+ move=> Mi Mj MXi MXj /= neqMji.
+ by rewrite -setI_eq0 -setDIl setD_eq0 setIC tiKs.
+ have{tiPZ} [tiPZ notPZ_T] := trivIsetU1 tiTPZ tiPZ notPZset0.
+ rewrite (eq_bigr (fun Mi : {group gT} => 1 + #|(Ks_ Mi)^#|)%N); last first.
+ by move=> Mi _; rewrite (cardsD1 1) group1.
+ rewrite big_split sum1_card cardsU1 notMNX0 (cardsD1 1 Z) group1 /=.
+ have ->: Z^# = cover (T |: PZ).
+ rewrite -(setID Z^# (cover PZ)) setUC (setIidPr _) /cover ?big_setU1 //=.
+ apply/bigcupsP=> _ /imsetP[Mi MXi ->]; apply: setSD.
+ by case/nsK_Z: MXi => _ /andP[].
+ by rewrite addnAC subnDl -(eqnP tiPZ) big_setU1 // big_imset //= addnK.
+have tiTscov: {in 'M, forall H, [disjoint T & H^~~]}.
+ move=> H maxH; apply/pred0P=> t; apply/andP=> [[/= Tt scovHt]].
+ have ntt: t != 1 by have [/setD1P[]] := setDP Tt.
+ have [x Hs_x xR_y] := bigcupP scovHt; have ell1x := Msigma_ell1 maxH Hs_x.
+ have:= sigma_decomposition_dichotomy ntt.
+ rewrite (introT existsP) /=; last by exists x; rewrite ell1x -mem_lcoset.
+ rewrite -defT in Tt; have [Mi MXi Zi_t] := bigcupP Tt.
+ case/mulsgP: Zi_t => y y' /setD1P[nty Ks_y] /setD1P[nty' Ky'] ->.
+ case/existsP; exists y; rewrite mulKg.
+ have [[Mis_y cKy] [PmaxMi hallKi]] := (setIP Ks_y, PmaxMX _ MXi).
+ have [[maxMi _] [sKiMi kMiKi _]] := (setDP PmaxMi, and3P hallKi).
+ rewrite (Msigma_ell1 maxMi) ?inE ?nty //=; apply/existsP; exists Mi.
+ rewrite inE maxMi cycle_subG Mis_y 3!inE nty' (subsetP sKiMi) //=.
+ by rewrite (subsetP _ _ Ky') ?sub_cent1 // (mem_p_elt kMiKi).
+have nzT: T != set0.
+ have [[y Ksy nty] [y' Ky' nty']] := (trivgPn _ ntKs, trivgPn _ ntK).
+ apply/set0Pn; exists (y * y'); rewrite -defT; apply/bigcupP.
+ by exists M; rewrite ?MX0 // K0 Ks0 mem_mulg 2?inE ?nty ?nty'.
+have ntiT: normedTI T G Z.
+ have sTZ: {subset T <= Z} by apply/subsetP; rewrite 2!subDset setUA subsetUr.
+ have nTZ: Z \subset 'N(T).
+ rewrite normsD ?norms_bigcup ?normD1 ?normG //.
+ apply/bigcapsP=> _ /imsetP[Mi MXi ->]; rewrite normD1.
+ by case/nsK_Z: MXi => _ /andP[].
+ apply/normedTI_P; rewrite setTI /= -/Z.
+ split=> // a _ /pred0Pn[t /andP[/= Tt]]; rewrite mem_conjg => Tta.
+ have{Tta} [Zt Zta] := (sTZ t Tt, sTZ _ Tta).
+ move: Tt; rewrite -defT => /bigcupP[Mi MXi].
+ case/mulsgP=> y y' /setD1P[nty Kisy] /setD1P[nty' Kiy'] def_yy'.
+ have [[hallKi hallKis] [nsKiZ _]] := (hallK_Z _ MXi, nsK_Z _ MXi).
+ have [[PmaxMi hallKiMi] defZi] := (PmaxMX _ MXi, defZX _ MXi).
+ have [_ [defNKi _] _ [[]]] := Ptype_structure PmaxMi hallKiMi.
+ rewrite -defNKi defZi -/(Ks_ _) => tiKsi tiKi _ _ _.
+ have [defy defy']: y = t.`_\sigma(Mi) /\ y' = t.`_\sigma(Mi)^'.
+ have [_ cKiy] := setIP Kisy; have cy'y := centP cKiy _ Kiy'.
+ have sMi_y := mem_p_elt (pHall_pgroup hallKis) Kisy.
+ have sMi'y' := mem_p_elt (pHall_pgroup hallKi) Kiy'.
+ rewrite def_yy' !consttM // constt_p_elt // 2?(constt1P _) ?p_eltNK //.
+ by rewrite mulg1 mul1g constt_p_elt.
+ have: a \in Mi.
+ apply: contraR nty; rewrite -in_setC -in_set1 -set1gE; move/tiKsi <-.
+ rewrite inE Kisy mem_conjg defy -consttJ groupX ?(subsetP _ _ Zta) //.
+ by rewrite -defZi defNKi subsetIl.
+ apply/implyP; apply: contraR nty'; rewrite negb_imply andbC -in_setD.
+ rewrite -in_set1 -set1gE => /tiKi <-; rewrite inE Kiy' defy' mem_conjg.
+ by rewrite -consttJ (mem_normal_Hall hallKi nsKiZ) ?p_elt_constt ?groupX.
+have [_ tiT /eqP defNT] := and3P ntiT; rewrite setTI in defNT.
+pose n : rat := #|MNX|%:R; pose g : rat := #|G|%:R.
+pose z : rat := #|Z|%:R; have nz_z: z != 0%R := natrG_neq0 _ _.
+pose k_ Mi : rat := #|K_ Mi|%:R.
+have nz_ks: #|Ks_ _|%:R != 0%R :> rat := natrG_neq0 _ _.
+pose TG := class_support T G.
+have oTG: (#|TG|%:R = (1 + n / z - \sum_(Mi in MX) (k_ Mi)^-1) * g)%R.
+ rewrite /TG class_supportEr -cover_imset -(eqnP tiT).
+ rewrite (eq_bigr (fun _ => #|T|)) => [|_ /imsetP[x _ ->]]; last first.
+ by rewrite cardJg.
+ rewrite sum_nat_const card_conjugates setTI defNT.
+ rewrite natrM natf_indexg ?subsetT //= -/z -mulrA mulrC; congr (_ * _)%R.
+ rewrite oT natrB; last by rewrite ltnW // -subn_gt0 lt0n -oT cards_eq0.
+ rewrite mulrC natrD -/n -/z natr_sum /=.
+ rewrite mulrBl mulrDl big_distrl divff //=; congr (_ - _)%R.
+ apply: eq_bigr => Mi MXi; have defZi := defZX _ MXi.
+ by rewrite /z -(dprod_card defZi) natrM invfM mulrC divfK.
+have neMNX: MNX != set0.
+ move: ntK; rewrite -rank_gt0 => /rank_geP[X /exMNX[Mi MNXi _]].
+ by apply/set0Pn; exists Mi.
+have [Mi MXi P2maxMi]: exists2 Mi, Mi \in MX & Mi \in 'M_'P2.
+ apply/exists_inP; apply: negbNE; rewrite negb_exists_in.
+ apply/forall_inP=> allP1; pose ssup Mi := class_support (gval Mi)^~~ G.
+ have{allP1} min_ssupMX Mi:
+ Mi \in MX -> (#|ssup Mi|%:R >= ((k_ Mi)^-1 - (z *+ 2)^-1) * g)%R.
+ - move=> MXi; have [PmaxMi hallKi] := PmaxMX _ MXi.
+ have [[U [complU defMi] _]] := Ptype_structure PmaxMi hallKi.
+ case=> defZi _ _ _ _; have [maxMi _] := setDP PmaxMi.
+ have{complU} U1: U :==: 1; last rewrite {U U1}(eqP U1) sdprod1g in defMi.
+ rewrite (trivg_kappa_compl maxMi complU).
+ by apply: contraR (allP1 _ MXi) => ?; apply/setDP.
+ rewrite card_class_support_sigma // natrM natf_indexg ?subsetT // -/g.
+ rewrite mulrCA mulrC ler_wpmul2r ?ler0n // -subn1 natrB ?cardG_gt0 //.
+ rewrite mulr1n mulrBl -{1}(sdprod_card defMi) natrM invfM.
+ rewrite mulVKf ?natrG_neq0 // ler_add2l ler_opp2 -(mulr_natr _ 2) invfM.
+ rewrite ler_pdivr_mulr ?natrG_gt0 // mulrC mulrA.
+ have sZM: Z \subset M by rewrite -defZ subsetIl.
+ have sZMi: Z \subset Mi by rewrite -(defZX _ MXi) defZi subsetIl.
+ rewrite -natf_indexg //= -/Z ler_pdivl_mulr ?(ltr0Sn _ 1) // mul1r ler_nat.
+ rewrite indexg_gt1 /= -/Z subEproper /proper sZMi andbF orbF.
+ apply: contraNneq notMNX0 => defMiZ; have [Mj MNXj] := set0Pn _ neMNX.
+ have maxZ: [group of Z] \in 'M by rewrite !inE defMiZ in maxMi *.
+ have eqZ := group_inj (eq_mmax maxZ _ _); rewrite -(eqZ M) //.
+ have [Xj E1Xj maxNMj] := bigcupP MNXj; have [maxMj _] := setIdP maxNMj.
+ by rewrite (eqZ Mj) //; case/(Pmax_sym M K): maxNMj.
+ pose MXsup := [set ssup Mi | Mi in MX].
+ have notMXsup0: set0 \notin MXsup.
+ apply/imsetP=> [[Mi /PmaxMX[/setDP[maxMi _] _] /esym/eqP/set0Pn[]]].
+ have [x Mis_x ntx] := trivgPn _ (Msigma_neq1 maxMi).
+ exists (x ^ 1); apply: mem_imset2; rewrite ?inE //.
+ by apply/bigcupP; exists x; rewrite ?inE ?ntx // lcoset_refl.
+ have [Mi Mj MXi MXj /= neqMij | tiMXsup inj_ssup] := trivIimset _ notMXsup0.
+ apply/pred0Pn=> [[_ /andP[/imset2P[x y1 signMi_x _ ->]]]] /=.
+ rewrite /ssup class_supportEr /= => /bigcupP[y2 _].
+ rewrite -mem_conjgV -conjsgM -sigma_supportJ; set H := Mj :^ _ => Hx.
+ suffices: [disjoint Mi^~~ & H^~~].
+ by case/pred0Pn; exists x; rewrite /= {1}signMi_x Hx.
+ have [[PmaxMi _] [PmaxMj _]] := (PmaxMX _ MXi, PmaxMX _ MXj).
+ have [[maxMi _] [maxMj _]] := (setDP PmaxMi, setDP PmaxMj).
+ apply: sigma_support_disjoint; rewrite ?mmaxJ //.
+ rewrite (orbit_transr _ (mem_orbit _ _ _)) ?inE //=.
+ apply: contra (ntKsX _ MXi); case/imsetP=> y _ /= defMj; rewrite -/(Ks_ _).
+ have sKisKj: Ks_ Mi \subset K_ Mj by rewrite sKsKX // eq_sym.
+ rewrite -(setIidPl sKisKj) coprime_TIg //.
+ have [[_ hallKis] [hallKj _]] := (hallK_Z _ MXi, hallK_Z _ MXj).
+ apply: pnat_coprime (pHall_pgroup hallKj).
+ by rewrite defMj -pgroupE (eq_pgroup _ (sigmaJ _ _)) (pHall_pgroup hallKis).
+ have [|tiPG notMXsupTG]: _ /\ TG \notin _ := trivIsetU1 _ tiMXsup notMXsup0.
+ move=> _ /imsetP[Mi /PmaxMX[/setDP[maxMi _] _] ->].
+ apply/pred0Pn=> [[_ /andP[/imset2P[x y1 Tx _ ->]]]] /=.
+ rewrite /ssup class_supportEr => /bigcupP[y2 _].
+ rewrite -mem_conjgV -conjsgM -sigma_supportJ; set H := Mi :^ _ => Hx.
+ have maxH: [group of H] \in 'M by rewrite mmaxJ.
+ by case/andP: (pred0P (tiTscov _ maxH) x).
+ suffices: (g <= #|cover (TG |: MXsup)|%:R)%R.
+ rewrite ler_nat (cardsD1 1 G) group1 ltnNge subset_leq_card //.
+ apply/bigcupsP=> _ /setU1P[|/imsetP[Mi /PmaxMX[/setDP[maxMi _] _]]] ->.
+ rewrite /TG class_supportEr; apply/bigcupsP=> x _.
+ rewrite sub_conjg (normP _) ?normD1 ?(subsetP (normG _)) ?inE //.
+ by rewrite subDset setUC subsetU // setSD ?subsetT.
+ rewrite /ssup class_supportEr; apply/bigcupsP=> x _.
+ rewrite subsetD1 subsetT mem_conjg conj1g {x}/=.
+ move/ell_sigma0P: (@erefl gT 1); rewrite cards_eq0.
+ apply: contraL => /bigcupP[x Mis_x xR1]; apply/set0Pn; exists x.
+ exact: mem_sigma_cover_decomposition (Msigma_ell1 maxMi Mis_x) xR1.
+ rewrite -(eqnP tiPG) big_setU1 ?big_imset //= natrD natr_sum.
+ suffices: (g <= #|TG|%:R + \sum_(i in MX) ((k_ i)^-1 - (z *+ 2)^-1) * g)%R.
+ by move/ler_trans->; rewrite // ler_add2l ler_sum.
+ rewrite -big_distrl /= oTG -/g -mulrDl big_split /= sumr_const.
+ rewrite addrA subrK -(mulr_natl _ 2) -[_ *+ _]mulr_natl invfM mulrN.
+ rewrite mulrA -addrA -mulrBl -{1}(mul1r g) ler_wpmul2r ?ler0n //.
+ rewrite ler_addl -(mul0r z^-1)%R ler_wpmul2r ?invr_ge0 ?ler0n //.
+ rewrite subr_ge0 ler_pdivr_mulr ?(ltr0Sn _ 1) // -natrM ler_nat.
+ by rewrite muln2 -addnn cardsU1 leq_add2r notMNX0 lt0n cards_eq0.
+have [prKi nilMis]: prime #|K_ Mi| /\ nilpotent Mi`_\sigma.
+ by have [PmaxMi /Ptype_structure[] // _ _ _ _ []] := PmaxMX _ MXi.
+have [Mj MXj neqMji]: exists2 Mj, Mj \in MX & Mj :!=: Mi.
+ have [Mj |] := pickP (mem ((MX) :\ Mi)); first by case/setD1P; exists Mj.
+ move/eq_card0/eqP; rewrite -(eqn_add2l true) -{1}MXi -cardsD1 cardsU1.
+ by rewrite notMNX0 eqSS cards_eq0 (negPf neMNX).
+have defKjs: Ks_ Mj = K_ Mi.
+ have sKjsKi: Ks_ Mj \subset K_ Mi by rewrite sKsKX.
+ apply/eqP; rewrite eqEcard sKjsKi (prime_nt_dvdP _ _ (cardSg sKjsKi)) //=.
+ by rewrite -trivg_card1 ntKsX.
+have defMXij: MX = [set Mi; Mj].
+ symmetry; rewrite -(setD1K MXi); congr (_ |: _); apply/eqP.
+ rewrite eqEcard sub1set cards1 (cardsD1 Mj) 2!inE neqMji MXj /= ltnS leqn0.
+ apply/pred0Pn=> [[Mk /setD1P[neMkj /setD1P[neMki MXk]]]].
+ have sKskKsj: Ks_ Mk \subset Ks_ Mj by rewrite defKjs sKsKX.
+ by case/negP: (ntKsX _ MXk); rewrite -(setIidPl sKskKsj) tiKs.
+have defKsi: Ks_ Mi = K_ Mj.
+ apply/eqP; rewrite eqEcard sKsKX 1?eq_sym //=.
+ rewrite -(@leq_pmul2r #|Ks_ Mj|) ?cardG_gt0 // (dprod_card (defZX _ MXj)).
+ by rewrite defKjs mulnC (dprod_card (defZX _ MXi)).
+have{nilMis} cycZ: cyclic Z.
+ have cycKi := prime_cyclic prKi.
+ apply: nil_Zgroup_cyclic.
+ apply/forall_inP=> S /SylowP[p _ /and3P[sSZ pS _]].
+ have [[hallKi hallKis] [nsKi nsKis]] := (hallK_Z _ MXi, nsK_Z _ MXi).
+ have [sMi_p | sMi'p] := boolP (p \in \sigma(Mi)); last first.
+ by rewrite (cyclicS _ cycKi) // (sub_normal_Hall hallKi) ?(pi_pgroup pS).
+ have sSKj: S \subset K_ Mj.
+ by rewrite -defKsi (sub_normal_Hall hallKis) ?(pi_pgroup pS).
+ rewrite (odd_pgroup_rank1_cyclic pS) ?mFT_odd //.
+ apply: wlog_neg; rewrite -ltnNge ltn_neqAle p_rank_gt0 => /andP[_ piSp].
+ have [_ /and3P[sKjMj kKj _]] := PmaxMX _ MXj.
+ rewrite -(rank_kappa (pnatPpi kKj (piSg sSKj piSp))) p_rankS //.
+ exact: subset_trans sSKj sKjMj.
+ rewrite (dprod_nil (defZX _ MXi)) abelian_nil ?cyclic_abelian //=.
+ exact: (nilpotentS (subsetIl _ _)) nilMis.
+have cycK: cyclic K := cyclicS (joing_subl _ _) cycZ.
+have defM: M^`(1) ><| K = M.
+ have [U complU] := ex_kappa_compl maxM hallK; have [hallU _ _] := complU.
+ have [_ defM _ regUK _] := kappa_compl_context maxM complU.
+ have{hallU} [[sUM _] [sKM kK _]] := (andP hallU, and3P hallK).
+ case/sdprodP: defM => [[_ E _ defE]]; rewrite defE.
+ case/sdprodP: defE => _ <-{E} nUK _ defM /mulGsubP[nMsU nMsK] tiMsUK.
+ pose MsU := M`_\sigma <*> U; have nMsUK: K \subset 'N(MsU) by rewrite normsY.
+ have defMl: MsU * K = M by rewrite [MsU]norm_joinEr // -mulgA.
+ have coUK := regular_norm_coprime nUK regUK.
+ have ->: M^`(1) = MsU.
+ apply/eqP; rewrite eqEsubset; apply/andP; split; last first.
+ have solU := solvableS sUM (mmax_sol maxM).
+ rewrite join_subG Msigma_der1 //= -(coprime_cent_prod nUK coUK solU).
+ by rewrite (cent_semiregular regUK) // mulg1 commgSS.
+ apply: der1_min; first by rewrite -{1}defMl mulG_subG normG.
+ by rewrite -{2}defMl quotientMidl quotient_abelian ?cyclic_abelian.
+ rewrite sdprodE ?coprime_TIg //= norm_joinEr //.
+ rewrite (coprime_dvdl (dvdn_cardMg _ _)) // coprime_mull coUK.
+ rewrite (pnat_coprime (pcore_pgroup _ _) (sub_pgroup _ kK)) //.
+ exact: kappa_sigma'.
+have{neMNX} [Mstar MNX'star] := set0Pn _ neMNX.
+have defMNX: MNX = [set Mstar].
+ apply/eqP; rewrite eq_sym eqEcard sub1set MNX'star /= -(leq_add2l true).
+ by rewrite -{1}notMNX0 -cardsU1 -/MX defMXij setUC cards2 neqMji !cards1.
+have MXstar: Mstar \in MX by rewrite setU1r.
+have [[PmaxMstar hallKstar] defZstar] := (PmaxMX _ MXstar, defZX _ MXstar).
+have [maxMstar _] := setDP PmaxMstar.
+have notMGMstar := notMG_MNX _ MNX'star; exists Mstar => //.
+have [defKs defKs_star]: Ks = K_ Mstar /\ Ks_ Mstar = K.
+ rewrite /Ks /Ks_ -K0; rewrite /MX defMNX 3!inE val_eqE in neqMji MXj MXi.
+ by case/set2P: MXi (negPf neqMji) MXj => <- ->; rewrite ?orbF /= => /eqP <-.
+have hallKs: \sigma(M).-Hall(Mstar) Ks.
+ have sKsMstar: Ks \subset Mstar by rewrite defKs (pHall_sub hallKstar).
+ have sM_Ks: \sigma(M).-group Ks := pgroupS (subsetIl _ _) (pcore_pgroup _ _).
+ have [Y hallY sKsY] := Hall_superset (mmax_sol maxMstar) sKsMstar sM_Ks.
+ have [sYMstar sM_Y _] := and3P hallY; apply: etrans hallY; congr pHall.
+ have sYMs: Y \subset M`_\sigma.
+ case/Ptype_structure: hallK => // _ _ _ [_ _ -> //].
+ by rewrite (setIidPr sKsY).
+ apply/eqP; rewrite eqEsubset sKsY subsetI sYMs (sameP commG1P trivgP) /=.
+ have <-: M`_\sigma :&: Mstar`_\sigma = 1.
+ rewrite coprime_TIg // (pnat_coprime (pcore_pgroup _ _)) //.
+ apply: sub_pgroup (pcore_pgroup _ _) => q sM1q.
+ apply: contraFN (sigma_partition maxM maxMstar notMGMstar q) => sMq.
+ exact/andP.
+ rewrite commg_subI //.
+ by rewrite subsetI sYMs (subset_trans sYMstar) ?gFnorm.
+ rewrite subsetI -{1}defKs_star subsetIl.
+ by rewrite (subset_trans (pHall_sub hallK)) ?gFnorm.
+have oTGgt_g2: (g / 2%:R < #|TG|%:R)%R.
+ rewrite oTG big_setU1 //= /n defMNX big_set1 cards1 mulrC mul1r.
+ rewrite ltr_pmul2r ?(ltr_nat _ 0) ?cardG_gt0 // /k_ K0 -defKs.
+ rewrite /z -defZ -(dprod_card defNK) natrM invfM opprD.
+ pose hm u : rat := (1 - u%:R^-1)%R; set lhs := (_^-1)%R.
+ suffices: (lhs < hm #|K| * hm #|Ks|)%R.
+ by rewrite mulrBl !mulrBr !mul1r mulr1 opprB addrAC !addrA.
+ have hm_inc u v: 0 < u <= v -> (hm u <= hm v)%R.
+ case/andP=> u_gt0 le_uv; rewrite ler_add2l ler_opp2.
+ have v_gt0 := leq_trans u_gt0 le_uv.
+ rewrite -(mul1r _^-1)%R ler_pdivr_mulr ?ltr0n //.
+ by rewrite ler_pdivl_mull ?ltr0n // mulr1 ler_nat.
+ have le_pdiv H: 0 < pdiv #|H| <= #|H| by rewrite pdiv_gt0 dvdn_leq ?pdiv_dvd.
+ have{le_pdiv} hm_pdiv := hm_inc _ _ (le_pdiv _).
+ have hm_ge0 u: (0 <= hm u)%R.
+ by case: u => // u; rewrite subr_ge0 invf_le1 ?ltr0Sn ?(ler_nat _ 1).
+ do 2![rewrite mulrC (ltr_le_trans _ (ler_wpmul2r (hm_ge0 _) (hm_pdiv _))) //].
+ set p := pdiv #|K|; set q := pdiv #|Ks|.
+ have [odd_p odd_q]: odd p /\ odd q.
+ by split; apply: dvdn_odd (pdiv_dvd _) (mFT_odd _).
+ without loss [lt1p ltpq]: p q odd_p odd_q / 1 < p /\ p < q.
+ have [p_pr q_pr]: prime p /\ prime q by rewrite !pdiv_prime ?cardG_gt1.
+ have [ltpq | ltqp | eqpq] := ltngtP p q.
+ - by apply; rewrite ?prime_gt1.
+ - by rewrite mulrC; apply; rewrite ?prime_gt1.
+ have [] := hallK_Z _ MX0.
+ rewrite K0 Ks0 => /and3P[_ sM'K _] /and3P[_ sMKs _].
+ case/negP: (pgroupP sM'K _ p_pr (pdiv_dvd _)); rewrite eqpq.
+ exact: pgroupP sMKs _ q_pr (pdiv_dvd _).
+ have p_gt2: 2 < p by rewrite odd_geq.
+ apply: ltr_le_trans (isT : lhs < hm 3 * hm 5)%R _.
+ by rewrite ler_pmul ?hm_inc ?hm_ge0 //= odd_geq ?(leq_trans _ ltpq).
+have defZhat: Z :\: (K :|: Ks) = T.
+ rewrite /T cover_imset big_setU1 //= defMNX big_set1 defKs_star Ks0.
+ by rewrite -setDUl setDDl setUC setD1K // inE group1.
+rewrite defZhat {1}defKs; split; first 2 [by split].
+- by rewrite -defKs_star; case/Ptype_structure: hallKstar => // _ _ [].
+- split=> [|p]; first by rewrite -defKs_star defKs.
+ apply/idP/idP=> [kMp | t1p].
+ have /orP[// | /and3P[_ _ p_dv_M']] := kappa_tau13 kMp.
+ have hallM': \kappa(M)^'.-Hall(M) M^`(1).
+ exact/(sdprod_normal_pHallP (der_normal 1 M) hallK).
+ have piMp: p \in \pi(M) by rewrite kappa_pi.
+ case/idPn: kMp; apply: (pnatPpi (pHall_pgroup hallM')).
+ by move: piMp; rewrite !mem_primes !cardG_gt0 /= => /andP[->].
+ apply: (pnatPpi (pHall_pgroup hallK)); have [_ _ not_p_dv_M'] := and3P t1p.
+ have: p \in \pi(M) by rewrite (partition_pi_mmax maxM) t1p ?orbT.
+ rewrite !mem_primes !cardG_gt0 /= => /andP[p_pr].
+ by rewrite p_pr -(sdprod_card defM) Euclid_dvdM // (negPf not_p_dv_M').
+- split=> // [| x | y | x y K1_x Ks1_y].
+ + have defMsMstar: M`_\sigma :&: Mstar = Ks.
+ apply: sub_pHall hallKs _ _ (subsetIr _ _).
+ exact: pgroupS (subsetIl _ _) (pcore_pgroup _ _).
+ by rewrite subsetI subsetIl /= -/Ks defKs (pHall_sub hallKstar).
+ have nKsMMstar: M :&: Mstar \subset 'N(Ks).
+ by rewrite -defMsMstar normsIG ?gFnorm.
+ have [_ [defNKs _] _ _ _] := Ptype_structure PmaxMstar hallKstar.
+ rewrite -(setIidPl nKsMMstar) -setIA defKs -defNKs defZstar.
+ by rewrite -defZ setIA setIid.
+ + case/setD1P; rewrite -cycle_eq1 -cycle_subG -cent_cycle => ntx sxK.
+ apply/eqP; rewrite eqEsubset andbC subsetI -{1}defZ subsetIl.
+ rewrite sub_abelian_cent ?cyclic_abelian //=; last first.
+ by rewrite (subset_trans sxK) ?joing_subl.
+ move: ntx; rewrite -rank_gt0 /= -{1}(setIidPr sxK) => /rank_geP[X].
+ rewrite nElemI -setIdE -defZ => /setIdP[E1X sXx].
+ by have [<- _] := defNX _ E1X; rewrite setIS ?cents_norm ?centS.
+ + case/setD1P; rewrite -cycle_eq1 -cycle_subG -cent_cycle => nty syKs.
+ have [_ [defNKs defNY] _ _ _] := Ptype_structure PmaxMstar hallKstar.
+ rewrite defZstar -defKs in defNKs defNY.
+ apply/eqP; rewrite eqEsubset andbC subsetI {1}defNKs subsetIl.
+ rewrite sub_abelian_cent ?cyclic_abelian //=; last first.
+ by rewrite (subset_trans syKs) ?joing_subr.
+ move: nty; rewrite -rank_gt0 /= -{1}(setIidPr syKs) => /rank_geP[Y].
+ rewrite nElemI -setIdE defNKs => /setIdP[E1Y sYy].
+ by have [<- _] := defNY _ E1Y; rewrite setIS ?cents_norm ?centS.
+ have [[_ K_x] [_ Ks_y]] := (setD1P K1_x, setD1P Ks1_y).
+ apply/eqP; rewrite eqEsubset sub_cent1 -(centsP cKKs) //.
+ have Tyx: y * x \in T by rewrite -defT big_setU1 //= inE Ks0 K0 mem_mulg.
+ rewrite (subset_trans _ (cent1_normedTI ntiT Tyx)) ?setTI //.
+ rewrite (subsetP _ _ Tyx) // -defZhat setDE subIset //.
+ by rewrite -abelianE cyclic_abelian.
+split=> // [||H PmaxH].
+- split=> // a notMa.
+ have{tiKs} [_ _ _ [[tiKs _] _ _] _] := Ptype_structure PmaxM hallK.
+ rewrite -defT big_setU1 //= defMNX big_set1 -defKs defKs_star Ks0 K0.
+ rewrite centC ?(centSS _ _ cKKs) ?subsetDl // setUid.
+ apply/pred0Pn=> [[_ /andP[/mulsgP[x y K1_x Ks1_y ->] /= Ma_xy]]].
+ have [[_ K_x] [nty Ks_y]] := (setD1P K1_x, setD1P Ks1_y); case/negP: nty.
+ rewrite -in_set1 -set1gE -(tiKs a notMa) inE Ks_y.
+ suffices ->: y = (x * y).`_\sigma(M) by rewrite groupX.
+ rewrite consttM; last by red; rewrite -(centsP cKKs).
+ have sM'K := sub_pgroup (@kappa_sigma' M) (pHall_pgroup hallK).
+ rewrite (constt1P (mem_p_elt sM'K K_x)) mul1g constt_p_elt //.
+ exact: mem_p_elt (pHall_pgroup hallKs) Ks_y.
+- have:= set21 Mi Mj; rewrite -defMXij /MX defMNX defKs -K0.
+ by case/set2P=> <-; [left | right].
+have [maxH _] := setDP PmaxH.
+have{maxH}[L hallL] := Hall_exists \kappa(H) (mmax_sol maxH).
+pose Ls := 'C_(H`_\sigma)(L); pose S := (L <*> Ls) :\: (L :|: Ls).
+have{IHn} oSGgt_g2: (g / 2%:R < #|class_support S G|%:R)%R.
+ have [|nTG_leS] := ltnP #|class_support S G| nTG.
+ by case/IHn=> // Sstar _ [_ _ _ _ [[_ _ -> //]]].
+ apply: ltr_le_trans oTGgt_g2 _; rewrite ler_nat /TG -defZhat.
+ exact: leq_trans leTGn nTG_leS.
+have{oSGgt_g2 oTGgt_g2} meetST: ~~ [disjoint TG & class_support S G].
+ rewrite -leq_card_setU; apply: contraTneq (leqnn #|G|) => tiTGS.
+ rewrite -ltnNge -(ltr_nat [realFieldType of rat]) -/g.
+ rewrite -{1}[g](@divfK _ 2%:R) // mulr_natr.
+ apply: ltr_le_trans (ltr_add oTGgt_g2 oSGgt_g2) _.
+ by rewrite -natrD -tiTGS ler_nat cardsT max_card.
+have{meetST} [x Tx [a Sx]]: exists2 x, x \in T & exists a, x \in S :^ a.
+ have [_ /andP[/imset2P[x a1 Tx _ ->]]] := pred0Pn meetST.
+ rewrite class_supportEr => /bigcupP[a2 _ Sa2_xa1].
+ by exists x => //; exists (a2 * a1^-1); rewrite conjsgM mem_conjgV.
+rewrite {}/S {}/Ls in Sx; without loss a1: a H L PmaxH hallL Sx / a = 1.
+ move/(_ 1 (H :^ a)%G (L :^ a)%G); rewrite conjsg1 PtypeJ PmaxH pHallJ2.
+ rewrite (eq_pHall _ _ (kappaJ H a)) hallL MsigmaJ centJ.
+ rewrite -conjIg -conjYg -conjUg -conjDg Sx !inE.
+ by rewrite !(orbit_transr _ (mem_orbit _ _ _)) ?inE //; exact.
+have [_ [defNL _] [_ uniqH] _ _] := Ptype_structure PmaxH hallL.
+do [rewrite {a}a1 conjsg1; set Ls := 'C_(_)(L)] in Sx defNL.
+have{x Sx Tx} [Mk MXk ntLsMks]: exists2 Mk, Mk \in MX & Ls :&: Ks_ Mk != 1.
+ have [_ _ cLLs tiLLs] := dprodP defNL.
+ pose W := L <*> Ls; pose y := x.`_\sigma(H); pose ys := y.`_\sigma(Mi).
+ have Zy: y \in Z by apply: groupX; case/setDP: Tx; case/setD1P=> _ ->.
+ have{hallL} [hallL hallLs]: \sigma(H)^'.-Hall(W) L /\ \sigma(H).-Hall(W) Ls.
+ apply: coprime_mulGp_Hall; first by rewrite /= cent_joinEr.
+ exact: sub_pgroup (@kappa_sigma' H) (pHall_pgroup hallL).
+ exact: pgroupS (subsetIl _ _) (pcore_pgroup _ _).
+ have [nsLW nsLsW]: L <| W /\ Ls <| W := cprod_normal2 (cprodEY cLLs).
+ have{Sx} [Ls_y nty]: y \in Ls /\ y != 1.
+ move: Sx; rewrite 2!inE negb_or -andbA -/W; case/and3P=> notLx _ Wx.
+ split; first by rewrite (mem_normal_Hall hallLs) ?p_elt_constt ?groupX.
+ by rewrite (sameP eqP constt1P) -(mem_normal_Hall hallL).
+ have [[hallKi hallKis] [nsKi nsKis]] := (hallK_Z _ MXi, nsK_Z _ MXi).
+ have [/constt1P sM'y | ntys] := altP (ys =P 1).
+ exists Mj; rewrite // defKjs.
+ by apply/trivgPn; exists y; rewrite // inE Ls_y (mem_normal_Hall hallKi).
+ exists Mi => //; apply/trivgPn; exists ys; rewrite // inE groupX //=.
+ by rewrite (mem_normal_Hall hallKis) ?p_elt_constt // groupX.
+suffices ->: H = Mk.
+ by move: MXk; rewrite /MX defMNX => /set2P[]->; rewrite inE orbit_refl ?orbT.
+move: ntLsMks; rewrite -rank_gt0 => /rank_geP[Y E1Y].
+have:= E1Y; rewrite nElemI => /setIP[E1LsY _].
+apply: set1_inj; rewrite -(uniqH _ E1LsY).
+have [PmaxMk hallKk] := PmaxMX _ MXk.
+have [_ _ [_ -> //]] := Ptype_structure PmaxMk hallKk.
+by rewrite /= setIC nElemI in E1Y; case/setIP: E1Y.
+Qed.
+
+End PTypeEmbedding.
+
+(* This is the first part of B & G, Corollary 14.8. *)
+Corollary P1type_trans : {in 'M_'P1 &, forall M H, gval H \in M :^: G}.
+Proof.
+move=> M H P1maxM P1maxH; have [PmaxM _] := setIdP P1maxM.
+have [[maxM _] [PmaxH _]] := (setDP PmaxM, setIdP P1maxH).
+have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
+have [Mstar _ [_ _ _ _ [_ [|]]]] := Ptype_embedding PmaxM hallK.
+ by case; rewrite inE P1maxM.
+case=> /setDP[_ /negP notP1maxMstar] _.
+case/(_ H PmaxH)/setUP=> // /imsetP[a _ /group_inj defH].
+by rewrite defH P1typeJ in P1maxH.
+Qed.
+
+(* This is the second part of B & G, Corollary 14.8. *)
+Corollary Ptype_trans : {in 'M_'P, forall M,
+ exists2 Mstar, Mstar \in 'M_'P /\ gval Mstar \notin M :^: G
+ & {in 'M_'P, forall H, gval H \in M :^: G :|: Mstar :^: G}}.
+Proof.
+move=> M PmaxM; have [maxM _] := setDP PmaxM.
+have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
+have [Mstar PmaxMstar [_ _ _ _ [_ _ inMMs _]]] := Ptype_embedding PmaxM hallK.
+by exists Mstar.
+Qed.
+
+(* This is B & G, Corollary 14.9. *)
+Corollary mFT_partition :
+ let Pcover := [set class_support M^~~ G | M : {group gT} in 'M] in
+ [/\ (*1*) 'M_'P == set0 :> {set {group gT}} -> partition Pcover G^#
+ & (*2*) forall M K, M \in 'M_'P -> \kappa(M).-Hall(M) K ->
+ let Ks := 'C_(M `_\sigma)(K) in let Z := K <*> Ks in
+ let Zhat := Z :\: (K :|: Ks) in
+ let ClZhat := class_support Zhat G in
+ partition (ClZhat |: Pcover) G^# /\ ClZhat \notin Pcover].
+Proof.
+move=> Pcover; have notPcover0: set0 \notin Pcover.
+ apply/imsetP=> [[M maxM]]; apply/eqP; rewrite eq_sym; apply/set0Pn.
+ have [x Ms_x ntx] := trivgPn _ (Msigma_neq1 maxM); exists x.
+ rewrite class_supportEl; apply/bigcupP; exists x; last exact: class_refl.
+ by apply/bigcupP; exists x; [apply/setD1P | apply: lcoset_refl].
+have tiPcover: trivIset Pcover.
+ apply/trivIsetP=> _ _ /imsetP[M maxM ->] /imsetP[H maxH ->] notMGH.
+ rewrite -setI_eq0 !{1}class_supportEr big_distrr big1 //= => a Ga.
+ rewrite big_distrl big1 //= => b Gb; apply/eqP.
+ rewrite -!{1}sigma_supportJ setI_eq0 sigma_support_disjoint ?mmaxJ //.
+ apply: contra notMGH; rewrite {a Ga}(orbit_transr _ (mem_orbit _ _ Ga)).
+ rewrite {b Gb}(orbit_transl (mem_orbit _ _ Gb))=> /imsetP[c Gc ->] /=.
+ by rewrite sigma_supportJ class_supportGidl.
+have ntPcover: cover Pcover \subset G^#.
+ apply/bigcupsP=> _ /imsetP[M maxM ->]; rewrite class_supportEr.
+ apply/bigcupsP=> a _; rewrite subsetD1 subsetT mem_conjg conj1g {a}//=.
+ move/ell_sigma0P: (@erefl gT 1); rewrite cards_eq0; apply: contraL.
+ case/bigcupP=> x Ms_x xR1; apply/set0Pn; exists x.
+ exact: mem_sigma_cover_decomposition (Msigma_ell1 maxM Ms_x) xR1.
+split=> [MP0 | M K PmaxM hallK Ks Z Zhat ClZhat].
+ rewrite /partition eqEsubset ntPcover tiPcover notPcover0 !andbT /=.
+ apply/subsetP=> x; rewrite !inE andbT => ntx.
+ have:= sigma_decomposition_dichotomy ntx.
+ have [[y ell1y yRx] _ | _] := exists_inP.
+ have [nty /set0Pn[M /setIdP[maxM Ms_y]]] := ell_sigma1P _ ell1y.
+ apply/bigcupP; exists (class_support M^~~ G); first exact: mem_imset.
+ rewrite -(conjg1 x) mem_imset2 ?inE //.
+ apply/bigcupP; exists y; last by rewrite mem_lcoset.
+ by rewrite !inE nty -cycle_subG.
+ case/exists_inP=> y _; move: (_ * x) => y' /existsP[M].
+ case/and3P => /setIdP[maxM _] /setD1P[nty' /setIP[My' _]] kMy' {y}.
+ case/set0Pn: MP0; exists M; rewrite 2!inE maxM andbT.
+ apply: contra nty' => kM'M; rewrite -order_eq1 (pnat_1 kMy') //.
+ exact: mem_p_elt kM'M My'.
+have [_ [defNK _] [ntKs _] _ _] := Ptype_structure PmaxM hallK.
+have [Mst [PmaxMst _] [_ [hallKst _] [defK _]]] := Ptype_embedding PmaxM hallK.
+rewrite -/Ks -/Z -/Zhat in ntKs hallKst * => _ [_ _ conjMMst _].
+have [_ _ [ntK _] _ _] := Ptype_structure PmaxMst hallKst.
+have [maxM _] := setDP PmaxM; rewrite defK in ntK.
+have [|//|tiZPcover notPcovZ]: _ /\ ClZhat \notin _ := trivIsetU1 _ tiPcover _.
+ move=> HcovG; case/imsetP=> H maxH ->{HcovG}.
+ rewrite -setI_eq0 /ClZhat !class_supportEr big_distrr big1 //= => a _.
+ rewrite big_distrl big1 //= => b _; apply/eqP; rewrite -cards_eq0.
+ rewrite -(cardJg _ b^-1) conjIg conjsgK -conjsgM -sigma_supportJ cards_eq0.
+ wlog ->: a b H maxH / H :^ (a * b^-1) = H.
+ by move/(_ a a (H :^ (a * b^-1))%G); rewrite mmaxJ mulgV act1 => ->.
+ rewrite setIC big_distrl big1 //= => y Hs_y; apply/setP=> x; rewrite in_set0.
+ rewrite 3!inE mem_lcoset negb_or -andbA; apply/and4P=> [[yRx notKx notKs_x]].
+ rewrite /Z cent_joinEr ?subsetIr //; case/mulsgP=> z z' Kz Ks_z' defx.
+ have:= sigma_decomposition_dichotomy (group1_contra notKx).
+ rewrite (introT exists_inP) /=; last first.
+ by exists y; rewrite // (Msigma_ell1 maxH).
+ have [Ms_z' cKz'] := setIP Ks_z'; case/exists_inP; exists z'.
+ rewrite (Msigma_ell1 maxM) ?inE // Ms_z' andbT.
+ by apply: contraNneq notKx => z'1; rewrite defx z'1 mulg1.
+ apply/existsP; exists M; rewrite inE maxM cycle_subG Ms_z'.
+ rewrite defx -(centP cKz') // mulKg (mem_p_elt (pHall_pgroup hallK)) //=.
+ rewrite 3!inE (subsetP (pHall_sub hallK)) //= cent1C !andbT.
+ rewrite andbC cent1C (subsetP _ _ Kz) ?sub_cent1 //=.
+ by apply: contraNneq notKs_x => z1; rewrite defx z1 mul1g.
+split=> //; rewrite /partition eqEsubset 2!inE {}tiZPcover negb_or notPcover0.
+rewrite /cover big_setU1 {notPcovZ}//= subUset ntPcover subsetD1 subsetT.
+rewrite {}/ClZhat {}/Zhat !andbT /= andbC; apply/and3P; split.
+- have [[y Ks_y nty] [y' Ky' nty']] := (trivgPn _ ntKs, trivgPn _ ntK).
+ rewrite eq_sym; apply/set0Pn; exists ((y' * y) ^ 1).
+ apply: mem_imset2; rewrite 2?inE // groupMl // groupMr // -/Ks negb_or.
+ have [_ _ _ tiKKs] := dprodP defNK.
+ rewrite -[Z]genM_join ?mem_gen ?mem_mulg //= andbT; apply/andP; split.
+ by apply: contra nty => Ky; rewrite -in_set1 -set1gE -tiKKs inE Ky.
+ by apply: contra nty' => Ks_y'; rewrite -in_set1 -set1gE -tiKKs inE Ky'.
+- rewrite class_supportEr; apply/bigcupP=> [[a _]].
+ by rewrite mem_conjg conj1g 2!inE !group1.
+apply/subsetP=> x; case/setD1P=> ntx _; apply/setUP.
+case: exists_inP (sigma_decomposition_dichotomy ntx) => [[y ell1y yRx] _ | _].
+ have [nty] := ell_sigma1P _ ell1y; case/set0Pn=> H; case/setIdP=> maxH Hs_y.
+ right; apply/bigcupP; exists (class_support H^~~ G); first exact: mem_imset.
+ rewrite -[x]conjg1 mem_imset2 ?inE //; apply/bigcupP.
+ by exists y; rewrite ?mem_lcoset // !inE nty -cycle_subG.
+case/exists_inP=> y ell1y /existsP[H]; set y' := y^-1 * x.
+case/and3P=> /setIdP[maxH Hs_y] /setD1P[nty' /setIP[Hy' cyy']] kHy'.
+rewrite {ntK ntKs maxM defNK}/Z /Ks; left.
+wlog{Ks Mst PmaxMst hallKst conjMMst defK maxH} defH: M K PmaxM hallK / H :=: M.
+ move=> IH; have PmaxH: H \in 'M_'P.
+ apply/PtypeP; split=> //; exists (pdiv #[y']).
+ by rewrite (pnatPpi kHy') // pi_pdiv order_gt1.
+ have [|] := setUP (conjMMst H PmaxH); case/imsetP=> a Ga defH.
+ have:= IH _ (K :^ a)%G _ _ defH.
+ rewrite (eq_pHall _ _ (kappaJ _ _)) pHallJ2 PtypeJ MsigmaJ centJ.
+ by rewrite -conjIg -conjUg -conjYg -conjDg class_supportGidl //; apply.
+ have:= IH _ [group of Ks :^ a] _ _ defH.
+ rewrite (eq_pHall _ _ (kappaJ _ _)) pHallJ2 PtypeJ MsigmaJ centJ.
+ rewrite -conjIg -conjUg -conjYg -conjDg setUC joingC defK.
+ by rewrite class_supportGidl //; apply.
+have /andP[sMsM nMsM]: M`_\sigma <| M := pcore_normal _ M.
+have{Hs_y} Ms_y: y \in M`_\sigma by rewrite -defH -cycle_subG.
+wlog{H defH Hy' kHy'} Ky': K hallK / y' \in K.
+ have [maxM _] := setDP PmaxM; rewrite -cycle_subG defH in Hy' kHy'.
+ have [a Ma Ka_y'] := Hall_subJ (mmax_sol maxM) hallK Hy' kHy'.
+ move/(_ (K :^ a)%G); rewrite pHallJ // -cycle_subG.
+ rewrite -{1 2}(normsP nMsM a Ma) centJ -conjIg -conjYg -conjUg -conjDg.
+ by rewrite class_supportGidl ?inE //; apply.
+rewrite -[x]conjg1 mem_imset2 ?group1 //.
+have [Mst _ [_ _ _ [cycZ _ defZ _ _] _]] := Ptype_embedding PmaxM hallK.
+rewrite -(mulKVg y x) -/y' 2!inE negb_or andbC.
+do [set Ks := 'C_(_)(K); set Z := K <*> _] in cycZ defZ *.
+have Ks_y: y \in Ks.
+ have cKZ := sub_abelian_cent (cyclic_abelian cycZ) (joing_subl K Ks).
+ rewrite inE Ms_y (subsetP cKZ) // -(defZ y'); last by rewrite !inE nty'.
+ by rewrite inE cent1C (subsetP sMsM).
+have [_ [defNK _] _ _ _] := Ptype_structure PmaxM hallK.
+have{defNK} [_ _ cKKs tiKKs] := dprodP defNK.
+rewrite [Z]joingC cent_joinEl // mem_mulg // groupMr // groupMl //= -/Ks.
+apply/andP; split.
+ have [nty _] := ell_sigma1P _ ell1y.
+ by apply: contra nty => Ky; rewrite -in_set1 -set1gE -tiKKs inE Ky.
+by apply: contra nty' => Ks_y'; rewrite -in_set1 -set1gE -tiKKs inE Ky'.
+Qed.
+
+(* This is B & G, Corollary 14.10. *)
+Corollary ell_sigma_leq_2 x : \ell_\sigma(x) <= 2.
+Proof.
+have [/ell_sigma0P/eqP-> // | ntx] := eqVneq x 1.
+case sigma_x: (x \in cover [set class_support M^~~ G | M : {group gT} in 'M]).
+ case/bigcupP: sigma_x => _ /imsetP[M maxM ->].
+ case/imset2P=> x0 a /bigcupP[y Ms_y yRx0] _ ->; rewrite ell_sigmaJ.
+ exact: ell_sigma_cover (Msigma_ell1 maxM Ms_y) yRx0.
+have G1x: x \in G^# by rewrite !inE andbT.
+have [FpartG1 PpartG1] := mFT_partition.
+have [/eqP/FpartG1 partG1 | [M PmaxM]] := set_0Vmem ('M_'P : {set {group gT}}).
+ by rewrite -(cover_partition partG1) sigma_x in G1x.
+have [maxM _] := setDP PmaxM.
+have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
+have{PpartG1} [/cover_partition defG1 notZsigma] := PpartG1 M K PmaxM hallK.
+rewrite -{}defG1 /cover big_setU1 {notZsigma}// inE {}sigma_x orbF in G1x.
+case/imset2P: G1x => x0 a /setDP[].
+have [Mst [PmaxMst _] [_ _ [defK _] _ _]] := Ptype_embedding PmaxM hallK.
+rewrite cent_joinEr ?subsetIr // => /mulsgP[y' y Ky' /= Ks_y ->].
+rewrite inE; have [-> | nty] := eqVneq y 1; first by rewrite mulg1 Ky'.
+have [-> | nty' _ _ ->] := eqVneq y' 1; first by rewrite mul1g Ks_y orbT.
+have [Ms_y cKy] := setIP Ks_y; set Ks := 'C_(_)(_) in Ks_y defK.
+have Msts_y': y' \in Mst`_\sigma by move: Ky'; rewrite -defK => /setIP[].
+have kMy': \kappa(M).-elt y' := mem_p_elt (pHall_pgroup hallK) Ky'.
+have{kMy'} sM'y': \sigma(M)^'.-elt y' := sub_pgroup (@kappa_sigma' _) kMy'.
+rewrite ell_sigmaJ /sigma_length (cardsD1 (y' * y).`_\sigma(M)).
+rewrite (leq_add (leq_b1 _)) // -sigma_decomposition_constt' //.
+rewrite consttM /commute ?(centP cKy) // constt_p_elt //.
+rewrite (constt1P _) ?p_eltNK ?(mem_p_elt (pcore_pgroup _ _) Ms_y) // mulg1.
+have [maxMst _] := setDP PmaxMst; rewrite leq_eqVlt (Msigma_ell1 maxMst) //.
+by rewrite !inE nty' Msts_y'.
+Qed.
+
+(* This is B & G, Lemma 14.11. *)
+Lemma primes_non_Fitting_Ftype M E q Q :
+ M \in 'M_'F -> \sigma(M)^'.-Hall(M) E ->
+ Q \in 'E_q^1(E) -> ~~ (Q \subset 'F(E)) ->
+ exists2 Mstar, Mstar \in 'M &
+ [\/ (*1*) q \in \tau2(Mstar) /\ 'M('C(Q)) = [set Mstar]
+ | (*2*) q \in \kappa(Mstar) /\ Mstar \in 'M_'P1 ].
+Proof.
+move=> FmaxM hallE EqQ notsFE_Q; have [maxM k'M] := FtypeP _ FmaxM.
+have [sQE abelQ dimQ] := pnElemP EqQ; have [qQ _] := andP abelQ.
+have [q_pr oQ] := (pnElem_prime EqQ, card_pnElem EqQ : #|Q| = q).
+have t1Mq: q \in \tau1(M).
+ have: q \in \pi(E) by rewrite -p_rank_gt0; apply/p_rank_geP; exists Q.
+ rewrite (partition_pi_sigma_compl maxM hallE) => /or3P[// | t2q | t3q].
+ have [A EqA _] := ex_tau2Elem hallE t2q.
+ have [[nsAE defA1] _ _ _] := tau2_compl_context maxM hallE t2q EqA.
+ have sQA: Q \subset A by move: EqQ; rewrite defA1 => /pnElemP[].
+ rewrite (subset_trans sQA) ?Fitting_max // ?abelian_nil // in notsFE_Q.
+ by have [_ abelA _] := pnElemP EqA; apply: abelem_abelian abelA.
+ have [[E1 hallE1] [E3 hallE3]] := ex_tau13_compl hallE.
+ have [E2 _ complEi] := ex_tau2_compl hallE hallE1 hallE3.
+ have [[_ nsE3E] _ [_ cycE3] _ _] := sigma_compl_context maxM complEi.
+ have sQE3: Q \subset E3 by rewrite (sub_normal_Hall hallE3) ?(pi_pgroup qQ).
+ rewrite (subset_trans sQE3) ?Fitting_max ?abelian_nil // in notsFE_Q.
+ exact: cyclic_abelian cycE3.
+have q'FE: q^'.-group 'F(E).
+ have [R sylR sQR] := Sylow_superset sQE qQ; have [sRE qR _] := and3P sylR.
+ have cycR: cyclic R.
+ rewrite (odd_pgroup_rank1_cyclic qR) ?mFT_odd // (p_rank_Sylow sylR) //.
+ by move: t1Mq; rewrite (tau1E maxM hallE) eqn_leq; case/and4P.
+ rewrite -partG_eq1 -(card_Hall (Hall_setI_normal (Fitting_normal E) sylR)).
+ have sRFER: R :&: 'F(E) \subset R := subsetIl _ _.
+ apply: contraR notsFE_Q; rewrite -trivg_card1 => ntRFE.
+ rewrite (subset_trans _ (subsetIr R _)) // -(cardSg_cyclic cycR) // oQ.
+ by have [] := pgroup_pdiv (pgroupS sRFER qR) ntRFE.
+have cE'E': abelian E^`(1) := der_mmax_compl_abelian maxM hallE.
+pose K := [~: E, Q]; have cKK: abelian K by rewrite (abelianS (commgS E sQE)).
+have nsKE: K <| E by rewrite /normal commg_norml comm_subG.
+have q'K: q^'.-group K by rewrite (pgroupS _ q'FE) // Fitting_max ?abelian_nil.
+have [sKE nKE] := andP nsKE; have nKQ := subset_trans sQE nKE.
+have defKQ: [~: K, Q] = K.
+ have nsKQ_E: K <*> Q <| E.
+ rewrite -(quotientGK nsKE) -(quotientYK nKQ) cosetpre_normal /= -/K.
+ by rewrite /normal quotientS // cents_norm // quotient_cents2r.
+ have [_ sylQ] := coprime_mulGp_Hall (esym (norm_joinEr nKQ)) q'K qQ.
+ have defE: K * 'N_E(Q) = E.
+ rewrite -{2}(Frattini_arg nsKQ_E sylQ) /= norm_joinEr //= -/K -mulgA.
+ by congr (K * _); rewrite mulSGid // subsetI sQE normG.
+ have cQ_NEQ: [~: 'N_E(Q), Q] = 1.
+ apply/trivgP; rewrite -(coprime_TIg (pnat_coprime qQ q'K)) subsetI.
+ by rewrite commg_subr subsetIr commSg ?subsetIl.
+ by rewrite {2}/K -defE commMG ?cQ_NEQ ?mulg1 1?normsR ?subsetIr ?subIset ?nKE.
+have [sEM s'E _] := and3P hallE; have sQM := subset_trans sQE sEM.
+have [sKM s'K] := (subset_trans sKE sEM, pgroupS sKE s'E).
+have regQ: 'C_(M`_\sigma)(Q) = 1.
+ apply/eqP; apply: contraFT (k'M q) => nregQ.
+ have EqQ_M: Q \in 'E_q^1(M) by apply/pnElemP.
+ by rewrite unlock 3!inE /= t1Mq; apply/exists_inP; exists Q.
+have nsKM: K <| M.
+ have [s'q _] := andP t1Mq.
+ have EqQ_NK: Q \in 'E_q^1('N_M(K)) by apply/pnElemP; rewrite subsetI sQM.
+ have:= commG_sigma'_1Elem_cyclic maxM sKM s'K s'q EqQ_NK regQ q'K cKK.
+ by rewrite defKQ; case.
+have ntK: K != 1.
+ apply: contraNneq notsFE_Q => /commG1P cQE.
+ by rewrite Fitting_max ?(pgroup_nil qQ) // /normal sQE cents_norm.
+pose p := pdiv #|K|; have p_pr: prime p by rewrite pdiv_prime ?cardG_gt1.
+have piKp: p \in \pi(K) by rewrite pi_pdiv cardG_gt1.
+have t2Mp: p \in \tau2(M).
+ have s'p := pnatPpi s'K piKp.
+ have sylKp: p.-Sylow(K) 'O_p(K) := nilpotent_pcore_Hall p (abelian_nil cKK).
+ rewrite inE /= s'p ?(sigma'_norm_mmax_rank2 maxM s'p (pHall_pgroup sylKp)) //.
+ rewrite (mmax_normal maxM) ?(char_normal_trans (pcore_char _ _)) //.
+ by rewrite -rank_gt0 (rank_Sylow sylKp) p_rank_gt0.
+have [A EpA _] := ex_tau2Elem hallE t2Mp.
+have [sAE] := pnElemP EpA; case/andP=> pA _ dimA.
+have [[nsAE _] _ _ _] := tau2_compl_context maxM hallE t2Mp EpA.
+have nAQ := subset_trans sQE (normal_norm nsAE).
+have [S sylS sAS]:= Sylow_superset (subsetT A) pA.
+have not_cSS: ~~ abelian S.
+ apply: contra notsFE_Q => cSS; rewrite Fitting_max ?(pgroup_nil qQ) //.
+ have solE := sigma_compl_sol hallE.
+ have [E1 hallE1 sQE1] := Hall_superset solE sQE (pi_pgroup qQ t1Mq).
+ have [_ [E3 hallE3]] := ex_tau13_compl hallE.
+ have [E2 _ complEi] := ex_tau2_compl hallE hallE1 hallE3.
+ have [_ _ _ sQZ] := abelian_tau2 maxM complEi t2Mp EpA sylS sAS cSS.
+ by rewrite sub_center_normal ?{}sQZ //; apply/nElemP; exists q; apply/pnElemP.
+have [] := nonabelian_tau2 maxM hallE t2Mp EpA (pHall_pgroup sylS) not_cSS.
+set A0 := 'C_A(M`_\sigma)%G => _ [oA0 defFM] _ _.
+have defA0: A0 :=: K.
+ have sA0E: A0 \subset E by rewrite subIset ?sAE.
+ have sKA0: K \subset A0.
+ have [_ _ _ tiMsE] := sdprodP (sdprod_sigma maxM hallE).
+ rewrite -(mul1g A0) -tiMsE setIC group_modr // subsetI sKE.
+ by have [_ -> _ _] := dprodP defFM; rewrite Fitting_max ?abelian_nil.
+ by apply/eqP; rewrite eqEsubset prime_meetG ?(setIidPr sKA0) ?oA0.
+have ntA: A :!=: 1 := nt_pnElem EpA isT.
+have [H maxNH] := mmax_exists (mFT_norm_proper ntA (mFT_pgroup_proper pA)).
+have [maxH sNH] := setIdP maxNH; have sQH := subset_trans nAQ sNH.
+exists H => //.
+have: p \in [predD \sigma(H) & \beta(H)] /\ q \in [predU \tau1(H) & \tau2(H)].
+ have [-> // piAb _] := primes_norm_tau2Elem maxM hallE t2Mp EpA maxNH.
+ rewrite (pnatPpi piAb) // (piSg (quotientS _ sQE)) //=.
+ have piQq: q \in \pi(Q) by rewrite -p_rank_gt0 p_rank_abelem ?dimQ.
+ rewrite /= card_quotient ?normsI ?norms_cent // ?normsG //.
+ rewrite -indexgI setIA (setIidPl sQE) prime_TIg ?indexg1 // ?oQ //.
+ rewrite (sameP commG1P eqP) (subG1_contra _ ntK) //= -/K -defKQ commGC.
+ by rewrite -defA0 commgS ?subsetIl.
+case=> /andP[/= b'Hp sHP] t12Hq.
+have nregQHs: 'C_(H`_\sigma)(Q) != 1.
+ apply: subG1_contra (setSI _ _) (_ : 'C_A(Q) != 1).
+ rewrite (sub_Hall_pcore (Msigma_Hall maxH)) ?(pi_pgroup pA) //.
+ exact: subset_trans (normG A) sNH.
+ apply: contraTneq (leqnn 1) => regQA; rewrite -ltnNge -dimA.
+ rewrite -(leq_exp2l _ _ (prime_gt1 p_pr)) -card_pgroup // -oA0 defA0.
+ have coAQ := pnat_coprime (pi_pnat pA t2Mp) (pi_pnat qQ (tau2'1 t1Mq)).
+ rewrite subset_leq_card // -(coprime_cent_prod nAQ) ?(pgroup_sol pA) //.
+ by rewrite regQA mulg1 commSg.
+have{t12Hq} [/= t1Hq | /= t2Hq] := orP t12Hq.
+ have EqQ_H: Q \in 'E_q^1(H) by apply/pnElemP.
+ have kHq: q \in \kappa(H).
+ by rewrite unlock 3!inE /= t1Hq; apply/exists_inP; exists Q.
+ right; split=> //; apply: contraR b'Hp => notP1maxH.
+ have PmaxH: H \in 'M_'P by apply/PtypeP; split=> //; exists q.
+ have [L hallL] := Hall_exists \kappa(H) (mmax_sol maxH).
+ by have [_ _ _ _ [|<- //]] := Ptype_structure PmaxH hallL; apply/setDP.
+left; split=> //.
+have [x defQ]: exists x, Q :=: <[x]> by apply/cyclicP; rewrite prime_cyclic ?oQ.
+rewrite defQ cent_cycle in nregQHs *; rewrite (cent1_nreg_sigma_uniq maxH) //.
+ by rewrite 2!inE -cycle_eq1 -cycle_subG -defQ (nt_pnElem EqQ).
+by rewrite /p_elt /order -defQ oQ pnatE.
+Qed.
+
+(* This is B & G, Lemma 14.12. *)
+(* Note that the assumption M \in 'M_'P2 could be weakened to M \in 'M_'P, *)
+(* since the assumption H \in 'M('N(R)) implies H != 1, and hence U != 1. *)
+Lemma P2type_signalizer M Mstar U K r R H :
+ M \in 'M_'P2 -> kappa_complement M U K -> Mstar \in 'M('C(K)) ->
+ r.-Sylow(U) R -> H \in 'M('N(R)) ->
+ [/\ H \in 'M_'F, U \subset H`_\sigma, U <*> K = M :&: H
+ & [/\ ~~ ('N_H(U) \subset M), K \subset 'F(H :&: Mstar)
+ & \sigma(H)^'.-Hall(H) (H :&: Mstar)]].
+Proof.
+move=> P2maxM complU maxCMstar sylR maxNH; have [hallU hallK _] := complU.
+have [PmaxM notP1maxM] := setDP P2maxM; have [maxM notFmaxM] := setDP PmaxM.
+have [[sUM sk'M_U _] [sKM kK _]] := (and3P hallU, and3P hallK).
+have{notFmaxM} ntK: K :!=: 1 by rewrite (trivg_kappa maxM).
+have [hallE defM _ regK /(_ ntK)cUU] := kappa_compl_context maxM complU.
+case/sdprodP: defM => [[_ E _ defE] _ _ _].
+have [nsUE sKE mulUK nUK tiUK] := sdprod_context defE.
+rewrite (norm_joinEr nUK) mulUK in hallE *.
+have [Mst [PmaxMst notMGMst] [uniqMst []]] := Ptype_embedding PmaxM hallK.
+set Ks := 'C_(_)(K) => hallKs; case/and3P=> sKsMst sM_Ks _ [defK _].
+case=> cycZ ziMMst _ _ _ [_ _ defPmax _].
+have [_ [defNK _] [ntKs _] _ [//|_ q_pr _ _]] := Ptype_structure PmaxM hallK.
+set q := #|K| in q_pr.
+have{uniqMst} uniqMst: 'M('C(K)) = [set Mst].
+ by apply: uniqMst; apply/nElemP; exists q; rewrite p1ElemE // !inE subxx /=.
+have{maxCMstar} ->: Mstar = Mst by [apply/set1P; rewrite -uniqMst] => {Mstar}.
+have [maxH sNRH] := setIdP maxNH.
+have ntR: R :!=: 1.
+ by apply: contraTneq sNRH => ->; rewrite norm1 proper_subn ?mmax_proper.
+have piUr: r \in \pi(U) by rewrite -p_rank_gt0 -(rank_Sylow sylR) rank_gt0.
+have r_pr: prime r by move: piUr; rewrite mem_primes; case/andP.
+have sylR_M := subHall_Sylow hallU (pnatPpi sk'M_U piUr) sylR.
+have [/= s'Mr k'Mr] := norP (pnatPpi sk'M_U piUr).
+have [sRH [sRM rR _]] := (subset_trans (normG R) sNRH, and3P sylR_M).
+have notMGH: gval H \notin M :^: G.
+ apply: contra s'Mr; case/imsetP=> a _ defH.
+ rewrite -(sigmaJ _ a) -defH; apply/exists_inP; exists R => //.
+ by rewrite pHallE sRH /= (card_Hall sylR_M) defH cardJg.
+have sK_uniqMst a: K \subset Mst :^ a -> a \in Mst.
+ move=> sKMa; apply: contraR ntK; rewrite -in_setC => Mst'a.
+ have [_ _ _ [[tiK_MstG _] _ _] _] := Ptype_structure PmaxMst hallKs.
+ by rewrite -(tiK_MstG a) // defK (setIidPl sKMa).
+have [_ _] := dprodP defNK; rewrite -/Ks => cKKs tiKKs.
+have snK_sMst L: K <|<| L -> L \subset Mst.
+ elim: {L}_.+1 {-2}L (ltnSn #|L|) => // n IHn A leAn.
+ case/subnormalEr=> [<- | [L [snKL nsLA ltLA]]].
+ by rewrite -defK subIset // pcore_sub.
+ have [sKL sLMst]: K \subset L /\ L \subset Mst.
+ by rewrite subnormal_sub // IHn // (leq_trans (proper_card ltLA)).
+ apply/subsetP=> a Aa; rewrite -groupV sK_uniqMst // (subset_trans sKL) //.
+ by rewrite -sub_conjg (normsP (normal_norm nsLA)).
+have sEH: E \subset H.
+ apply: subset_trans (char_norm_trans _ (normal_norm nsUE)) sNRH.
+ by rewrite (nilpotent_Hall_pcore (abelian_nil cUU) sylR) pcore_char.
+have [sUH sKH]: U \subset H /\ K \subset H by apply/mulGsubP; rewrite mulUK.
+have notMstGH: gval H \notin Mst :^: G.
+ apply: contra ntR => /imsetP[a _ defH].
+ have{a defH} defH: H :=: Mst by rewrite -(conjGid (sK_uniqMst a _)) -?defH.
+ rewrite -(setIidPl sRH) -(setIidPl sRM) -setIA defH ziMMst coprime_TIg //=.
+ rewrite cent_joinEr // TI_cardMg //= coprime_mulr -/Ks.
+ rewrite (p'nat_coprime (pi_pnat rR _) kK) //=.
+ exact: p'nat_coprime (pi_pnat rR _) sM_Ks.
+have FmaxH: H \in 'M_'F.
+ suffices: H \notin 'M_'P by rewrite inE maxH andbT negbK.
+ by apply: (contra (defPmax H)); rewrite inE; apply/norP.
+have sKMsts: K \subset Mst`_\sigma by rewrite -defK subsetIl.
+have s'H_K: \sigma(H)^'.-group K.
+ apply/pgroupP=> p p_pr p_dv_K; have [maxMst _] := setDP PmaxMst.
+ apply: contraFN (sigma_partition maxMst maxH notMstGH p) => /= sHp.
+ by rewrite inE /= (pgroupP (pgroupS sKMsts _)) ?pcore_pgroup.
+have [D hallD sKD] := Hall_superset (mmax_sol maxH) sKH s'H_K.
+have piKq: q \in \pi(K) by rewrite pi_of_prime ?inE.
+have sK_FD: K \subset 'F(D).
+ have EqK: K \in 'E_q^1(D) by rewrite p1ElemE // !inE sKD /=.
+ have sMst_q: q \in \sigma(Mst).
+ by rewrite (pnatPpi (pcore_pgroup _ _) (piSg sKMsts _)).
+ apply: contraR notP1maxM => not_sKFD.
+ have [L _ ] := primes_non_Fitting_Ftype FmaxH hallD EqK not_sKFD.
+ case=> [[t2Lq ]|[kLq P1maxL]].
+ rewrite uniqMst => /set1_inj defL.
+ by rewrite -defL 3!inE sMst_q in t2Lq.
+ have [PmaxL _] := setIdP P1maxL.
+ case/setUP: (defPmax L PmaxL) => /imsetP[a _ defL].
+ by rewrite (group_inj defL) P1typeJ in P1maxL.
+ move: kLq; rewrite defL kappaJ unlock 3!inE /=.
+ by rewrite -andb_orr inE /= sMst_q.
+have sDMst: D \subset Mst.
+ apply: snK_sMst (subnormal_trans _ (normal_subnormal (Fitting_normal D))).
+ exact: nilpotent_subnormal (Fitting_nil D) sK_FD.
+have defUK: [~: U, K] = U.
+ rewrite -{2}(coprime_cent_prod nUK) ?abelian_sol //; last first.
+ by apply: p'nat_coprime (sub_pgroup _ sk'M_U) kK => ? /norP[].
+ by rewrite (cent_semiregular regK) ?mulg1.
+have qK: q.-group K := pnat_id q_pr.
+have sUHs: U \subset H`_\sigma.
+ have [nsHsH _ mulHsD nHsD _] := sdprod_context (sdprod_sigma maxH hallD).
+ have nHsDq := subset_trans (pcore_sub q D) nHsD.
+ pose HsDq := H`_\sigma <*> 'O_q(D).
+ have defHsDq: H`_\sigma * 'O_q(D) = HsDq by rewrite -norm_joinEr.
+ have hallHs_HsDq: q^'.-Hall(HsDq) H`_\sigma.
+ have [|//] := coprime_mulGp_Hall defHsDq _ (pcore_pgroup _ _).
+ rewrite p'groupEpi; apply: (contra (pnatPpi (pcore_pgroup _ _))).
+ exact: pnatPpi s'H_K piKq.
+ have sK_HsDq: K \subset HsDq.
+ rewrite sub_gen ?subsetU // orbC -p_core_Fitting.
+ by rewrite (sub_Hall_pcore (nilpotent_pcore_Hall _ (Fitting_nil _))) ?qK.
+ have [|sHsDq_H nHsDq_H] := andP (_ : HsDq <| H).
+ rewrite -(quotientGK nsHsH) -[HsDq]quotientYK //= cosetpre_normal //.
+ by rewrite -{3}mulHsD quotientMidl quotient_normal // pcore_normal.
+ have sU_HsDq: U \subset HsDq.
+ by rewrite -defUK (subset_trans (commgSS sUH sK_HsDq)) // commg_subr.
+ rewrite (sub_normal_Hall hallHs_HsDq) //.
+ rewrite p'groupEpi; apply: (contraL (pnatPpi sk'M_U)) => /=.
+ by rewrite inE /= orbC (pnatPpi kK).
+ exact: normalS (joing_subl _ _) _ (pcore_normal _ _).
+have defNMU: 'N_M(U) = E.
+ have [_ mulHsE nHsE _] := sdprodP (sdprod_sigma maxM hallE).
+ have [sUE nUE] := andP nsUE; rewrite -mulHsE -normC // -group_modl //=.
+ rewrite coprime_norm_cent ?(subset_trans sUE) //; last first.
+ exact: coprimegS sUE (coprime_sigma_compl hallE).
+ have sR1U: 'Ohm_1(R) \subset U := subset_trans (Ohm_sub 1 R) (pHall_sub sylR).
+ rewrite (trivgP (subset_trans (setIS _ (centS sR1U)) _)) ?mulg1 //.
+ have [|_ _ -> //] := sigma'_kappa'_facts maxM sylR_M.
+ by rewrite s'Mr (piSg sUM).
+have sHsFH: H`_\sigma \subset 'F(H).
+ rewrite Fitting_max ?pcore_normal //.
+ have [S] := Sylow_exists q H; case/sigma'_kappa'_facts=> {S}//.
+ have [_ k'H] := setIdP FmaxH.
+ rewrite [~~ _](pnatPpi (pHall_pgroup hallD) (piSg sKD _)) //=.
+ by rewrite [~~ _](pnatPpi k'H) (piSg sKH).
+suffices ->: H :&: Mst = D.
+ set sk' := _^' in sk'M_U hallU; pose Fu := 'O_sk'('F(H)).
+ have [sUFH nilFH] := (subset_trans sUHs sHsFH, Fitting_nil H).
+ have hallFu: sk'.-Hall('F(H)) Fu := nilpotent_pcore_Hall sk' nilFH.
+ have sUFu: U \subset Fu by rewrite (sub_Hall_pcore hallFu).
+ have nsFuH: Fu <| H := char_normal_trans (pcore_char _ _) (Fitting_normal _).
+ have [[sFuFH sk'Fu _] [sFuH nFuH]] := (and3P hallFu, andP nsFuH).
+ have defU: M :&: Fu = U.
+ have sk'MFu: sk'.-group(M :&: Fu) := pgroupS (subsetIr M _) sk'Fu.
+ by rewrite (sub_pHall hallU sk'MFu) ?subsetIl // subsetI sUM.
+ do 2?split=> //.
+ apply/eqP; rewrite eqEsubset subsetI (pHall_sub hallE) sEH /=.
+ by rewrite -defNMU subsetI subsetIl -defU normsGI.
+ apply: contra (contra_orbit _ _ notMGH) => sNHU_M.
+ rewrite (eq_mmax maxH maxM (subset_trans _ sNHU_M)) // subsetIidl.
+ rewrite -(nilpotent_sub_norm (nilpotentS sFuFH nilFH) sUFu) //= -/Fu.
+ by rewrite -{2}defU subsetI subsetIl (subset_trans (setSI _ sFuH)).
+have [maxMst _] := setDP PmaxMst.
+have [_ <- _ _] := sdprodP (sdprod_sigma maxH hallD).
+rewrite -{2}(mul1g D) setIC -group_modr // setIC; congr (_ * _).
+apply/eqP; apply: wlog_neg => ntHsMst.
+have nregHsK: 'C_(H`_\sigma)(K) != 1.
+ rewrite (subG1_contra _ ntHsMst) // subsetI subsetIl (sameP commG1P trivgP).
+ have <-: H`_\sigma :&: Mst`_\sigma = 1.
+ apply: card_le1_trivg; rewrite leqNgt -pi_pdiv; set p := pdiv _.
+ apply: contraFN (sigma_partition maxMst maxH notMstGH p) => piIp.
+ rewrite inE /= (pnatPpi (pcore_pgroup _ _) (piSg (subsetIl _ _) piIp)).
+ by rewrite (pnatPpi (pcore_pgroup _ _) (piSg (subsetIr _ _) piIp)).
+ rewrite commg_subI ?setIS ?gFnorm // subsetI sKMsts.
+ by rewrite (subset_trans sKH) ?gFnorm.
+have t2Hq: q \in \tau2(H).
+ have: q \in \pi(D) := piSg sKD piKq.
+ rewrite (partition_pi_sigma_compl maxH hallD) orbCA; case/orP=> // t13Hq.
+ case/FtypeP: FmaxH => _ /(_ q)/idP[]; rewrite unlock 3!inE /= t13Hq.
+ by apply/exists_inP; exists K => //; rewrite p1ElemE // !inE sKH /=.
+have [A EqA_D EqA] := ex_tau2Elem hallD t2Hq.
+have [_ _ _ -> //] := tau2_context maxH t2Hq EqA.
+rewrite 3!inE -val_eqE /= eq_sym (contra_orbit _ _ notMstGH) maxMst.
+by have [sAD _ _] := pnElemP EqA_D; apply: subset_trans sAD sDMst.
+Qed.
+
+(* This is B & G, Lemma 14.13(a). *)
+(* Part (b) is not needed for the Peterfalvi revision of the character theory *)
+(* part of the proof. *)
+Lemma non_disjoint_signalizer_Frobenius x M :
+ \ell_\sigma(x) == 1%N -> #|'M_\sigma[x]| > 1 ->
+ M \in 'M_\sigma[x] -> ~~ (\sigma('N[x])^'.-group M) ->
+ M \in 'M_'F /\ \tau2(M)^'.-group M.
+Proof.
+move=> ell1x ntR SMxM; have [maxM Ms_x] := setIdP SMxM.
+rewrite negb_and cardG_gt0 all_predC negbK => /hasP[q /= piMq sNq].
+have [Q EqQ]: exists Q, Q \in 'E_q^1(M) by apply/p_rank_geP; rewrite p_rank_gt0.
+have [ntQ [sQM abelQ dimQ]] := (nt_pnElem EqQ isT, pnElemP EqQ).
+have [[qQ _] q_pr] := (andP abelQ, pnElem_prime EqQ).
+have [_ [//| uniqN _ t2Nx _]] := FT_signalizer_context ell1x.
+case/(_ M SMxM)=> _ st2NsM spM_sbN _; have [maxN sCxN] := mem_uniq_mmax uniqN.
+have bNq: q \in \beta('N[x]) by rewrite spM_sbN //= 4!inE /= piMq.
+have bGq: q \in \beta(G) by move: bNq; rewrite -predI_sigma_beta // inE /= sNq.
+set p := pdiv #[x]; have pi_p: p \in \pi(#[x]).
+ by rewrite pi_pdiv order_gt1 (sameP eqP (ell_sigma0P _)) (eqP ell1x).
+have sMp: p \in \sigma(M) := pnatPpi (pcore_pgroup _ _) (piSg Ms_x pi_p).
+have t2Np: p \in \tau2('N[x]) := pnatPpi t2Nx pi_p.
+have notMGN: gval 'N[x] \notin M :^: G.
+ apply: contraL t2Np => /imsetP[a _ ->].
+ by rewrite negb_and negbK /= sigmaJ sMp.
+have sM'q: q \in \sigma(M)^'.
+ by apply: contraFN (sigma_partition maxM maxN notMGN q) => sMq; apply/andP.
+have [g sQNg]: exists g, Q \subset 'N[x] :^ g.
+ have [Q1 sylQ1] := Sylow_exists q 'N[x].
+ have [g _ sQQ1g] := Sylow_subJ (sigma_Sylow_G maxN sNq sylQ1) (subsetT Q) qQ.
+ by exists g; rewrite (subset_trans sQQ1g) // conjSg (pHall_sub sylQ1).
+have EqNQ: Q \in 'E_q^1('N[x] :^ g) by apply/pnElemP.
+have uniqNg: 'M('C(Q)) = [set 'N[x] :^ g]%G.
+ by case/cent_der_sigma_uniq: EqNQ; rewrite ?mmaxJ 1?betaJ ?bNq.
+have b'Mp: p \notin \beta(M).
+ by rewrite -predI_sigma_beta // inE /= sMp /=; case/tau2_not_beta: t2Np.
+have{p pi_p sMp t2Np b'Mp} FmaxM: M \in 'M_'F.
+ have [P1maxM | notP1maxM] := boolP (M \in 'M_'P1); last first.
+ have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
+ apply: contraR b'Mp => notFmaxM; have PmaxM: M \in 'M_'P by apply/setDP.
+ by have [_ _ _ _ [|<- //]] := Ptype_structure PmaxM hallK; apply/setDP.
+ have [PmaxM skM] := setIdP P1maxM.
+ have kMq: q \in \kappa(M).
+ by case/orP: (pnatPpi skM piMq) => //= sMq; case/negP: sM'q.
+ have [K hallK sQK] := Hall_superset (mmax_sol maxM) sQM (pi_pnat qQ kMq).
+ have EqKQ: Q \in 'E_q^1(K) by apply/pnElemP.
+ have [L _ [uniqL [kLhallKs sMhallKs] _ _ _]] := Ptype_embedding PmaxM hallK.
+ set Ks := 'C_(_)(K) in kLhallKs sMhallKs.
+ have{uniqL} defL: 'N[x] :^ g = L.
+ apply: congr_group; apply: set1_inj; rewrite -uniqNg uniqL //.
+ by apply/nElemP; exists q.
+ have rpL: 'r_p(L) = 2.
+ by apply/eqP; case/andP: t2Np => _; rewrite -defL p_rankJ.
+ suffices piKs_p: p \in \pi(Ks).
+ by rewrite rank_kappa // (pnatPpi (pHall_pgroup kLhallKs)) in rpL.
+ have [P sylP] := Sylow_exists p [group of Ks].
+ have sylP_L: p.-Sylow(L) P := subHall_Sylow sMhallKs sMp sylP.
+ by rewrite -p_rank_gt0 -(rank_Sylow sylP) (rank_Sylow sylP_L) ?rpL.
+split=> //; apply: sub_pgroup (pgroup_pi _) => p piMp; apply/negP=> /= t2Mp.
+have rpN: 'r_p('N[x]) <= 1.
+ have: p \notin \beta('N[x]).
+ rewrite -(predI_sigma_beta maxN) negb_and /= orbC.
+ by have [-> _] := tau2_not_beta maxM t2Mp.
+ apply: contraR; rewrite -ltnNge => rpN; rewrite spM_sbN // inE /= piMp.
+ have: p \in \pi('N[x]) by rewrite -p_rank_gt0 ltnW.
+ rewrite (partition_pi_mmax maxN) orbCA => /orP[t2Np | ].
+ by case/andP: t2Mp => /negP[]; apply: st2NsM.
+ by rewrite orbA -!andb_orr eqn_leq leqNgt rpN andbF.
+have [E hallE sQE] := Hall_superset (mmax_sol maxM) sQM (pi_pgroup qQ sM'q).
+have [A Ep2A _] := ex_tau2Elem hallE t2Mp; have [_ abelA dimA] := pnElemP Ep2A.
+pose A0 := [~: A, Q]%G; pose A1 := 'C_A(Q)%G.
+have sCQNg: 'C(Q) \subset 'N[x] :^ g by have [] := mem_uniq_mmax uniqNg.
+have ntA0: A0 :!=: 1.
+ rewrite (sameP eqP commG1P); apply: contraL rpN => cQA.
+ rewrite -ltnNge -(p_rankJ p _ g); apply/p_rank_geP.
+ by exists A; apply/pnElemP; rewrite (subset_trans cQA).
+have t1Mq: q \in \tau1(M).
+ have [_ nsCEA_E t1Eb] := tau1_cent_tau2Elem_factor maxM hallE t2Mp Ep2A.
+ rewrite (pnatPpi t1Eb) // (piSg (quotientS _ sQE)) // -p_rank_gt0.
+ rewrite -rank_pgroup ?quotient_pgroup // rank_gt0 -subG1.
+ rewrite quotient_sub1 ?(subset_trans _ (normal_norm nsCEA_E)) //.
+ by rewrite subsetI sQE centsC (sameP commG1P eqP).
+have EqEQ: Q \in 'E_q^1(E) by apply/pnElemP.
+have regMsQ: 'C_(M`_\sigma)(Q) = 1.
+ apply: contraTeq FmaxM => nregMsQ; apply/FtypeP=> [[_]]; move/(_ q).
+ by rewrite unlock 3!inE /= t1Mq; case/exists_inP; exists Q.
+have [[]] := tau1_act_tau2 maxM hallE t2Mp Ep2A t1Mq EqEQ regMsQ ntA0.
+rewrite -/A0 -/A1 => EpA0 cMsA0 _ notA1GA0 [EpA1 _].
+have [sA0A abelA0 oA0] := pnElemPcard EpA0; have [pA0 _] := andP abelA0.
+have [sA1A abelA1 oA1] := pnElemPcard EpA1; have [pA1 _] := andP abelA1.
+have sA0N: A0 \subset 'N[x].
+ rewrite -cMsA0 (subset_trans _ sCxN) //= -cent_cycle (centsS Ms_x) //.
+ exact: subsetIr.
+have [P sylP sA0P] := Sylow_superset sA0N pA0; have [_ pP _] := and3P sylP.
+have cycP: cyclic P.
+ by rewrite (odd_pgroup_rank1_cyclic pP) ?mFT_odd ?(p_rank_Sylow sylP).
+have sA1gN: A1 :^ g^-1 \subset 'N[x] by rewrite sub_conjgV subIset ?sCQNg ?orbT.
+have [|z _ sA1gzP] := Sylow_Jsub sylP sA1gN; first by rewrite pgroupJ.
+case/imsetP: notA1GA0; exists (g^-1 * z); rewrite ?inE // conjsgM.
+by apply/eqP; rewrite (eq_subG_cyclic cycP) // !cardJg oA0 oA1.
+Qed.
+
+End Section14.
+
+