aboutsummaryrefslogtreecommitdiff
path: root/mathcomp/odd_order/BGsection12.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/BGsection12.v
Initial commit
Diffstat (limited to 'mathcomp/odd_order/BGsection12.v')
-rw-r--r--mathcomp/odd_order/BGsection12.v2688
1 files changed, 2688 insertions, 0 deletions
diff --git a/mathcomp/odd_order/BGsection12.v b/mathcomp/odd_order/BGsection12.v
new file mode 100644
index 0000000..b831ebc
--- /dev/null
+++ b/mathcomp/odd_order/BGsection12.v
@@ -0,0 +1,2688 @@
+(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *)
+Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq choice div fintype.
+Require Import path bigop finset prime fingroup morphism perm automorphism.
+Require Import quotient action gproduct gfunctor pgroup cyclic commutator.
+Require Import center gseries nilpotent sylow abelian maximal hall frobenius.
+Require Import BGsection1 BGsection3 BGsection4 BGsection5 BGsection6.
+Require Import BGsection7 BGsection9 BGsection10 BGsection11.
+
+(******************************************************************************)
+(* This file covers B & G, section 12; it defines the prime sets for the *)
+(* complements of M`_\sigma in a maximal group M: *)
+(* \tau1(M) == the set of p not in \pi(M^`(1)) (thus not in \sigma(M)), *)
+(* such that M has p-rank 1. *)
+(* \tau2(M) == the set of p not in \sigma(M), such that M has p-rank 2. *)
+(* \tau3(M) == the set of p not in \sigma(M), but in \pi(M^`(1)), such *)
+(* that M has p-rank 1. *)
+(* We also define the following helper predicate, which encapsulates the *)
+(* notation conventions defined at the beginning of B & G, Section 12: *)
+(* sigma_complement M E E1 E2 E3 <=> *)
+(* E is a Hall \sigma(M)^'-subgroup of M, the Ei are Hall *)
+(* \tau_i(M)-subgroups of E, and E2 * E1 is a group. *)
+(******************************************************************************)
+
+Set Implicit Arguments.
+Unset Strict Implicit.
+Unset Printing Implicit Defensive.
+
+Import GroupScope.
+Section Definitions.
+
+Variables (gT : finGroupType) (M : {set gT}).
+Local Notation sigma' := \sigma(M)^'.
+
+Definition tau1 := [pred p in sigma' | 'r_p(M) == 1%N & ~~ (p %| #|M^`(1)|)].
+Definition tau2 := [pred p in sigma' | 'r_p(M) == 2].
+Definition tau3 := [pred p in sigma' | 'r_p(M) == 1%N & p %| #|M^`(1)|].
+
+Definition sigma_complement E E1 E2 E3 :=
+ [/\ sigma'.-Hall(M) E, tau1.-Hall(E) E1, tau2.-Hall(E) E2, tau3.-Hall(E) E3
+ & group_set (E2 * E1)].
+
+End Definitions.
+
+Notation "\tau1 ( M )" := (tau1 M)
+ (at level 2, format "\tau1 ( M )") : group_scope.
+Notation "\tau2 ( M )" := (tau2 M)
+ (at level 2, format "\tau2 ( M )") : group_scope.
+Notation "\tau3 ( M )" := (tau3 M)
+ (at level 2, format "\tau3 ( M )") : group_scope.
+
+Section Section12.
+
+Variable gT : minSimpleOddGroupType.
+Local Notation G := (TheMinSimpleOddGroup gT).
+Implicit Types p q r : nat.
+Implicit Types A E H K M Mstar N P Q R S T U V W X Y Z : {group gT}.
+
+Section Introduction.
+
+Variables M E : {group gT}.
+Hypotheses (maxM : M \in 'M) (hallE : \sigma(M)^'.-Hall(M) E).
+
+Lemma tau1J x : \tau1(M :^ x) =i \tau1(M).
+Proof. by move=> p; rewrite 3!inE sigmaJ p_rankJ derg1 -conjsRg cardJg. Qed.
+
+Lemma tau2J x : \tau2(M :^ x) =i \tau2(M).
+Proof. by move=> p; rewrite 3!inE sigmaJ p_rankJ. Qed.
+
+Lemma tau3J x : \tau3(M :^ x) =i \tau3(M).
+Proof. by move=> p; rewrite 3!inE sigmaJ p_rankJ derg1 -conjsRg cardJg. Qed.
+
+Lemma tau2'1 : {subset \tau1(M) <= \tau2(M)^'}.
+Proof. by move=> p; rewrite !inE; case/and3P=> ->; move/eqP->. Qed.
+
+Lemma tau3'1 : {subset \tau1(M) <= \tau3(M)^'}.
+Proof. by move=> p; rewrite !inE; case/and3P=> -> ->. Qed.
+
+Lemma tau3'2 : {subset \tau2(M) <= \tau3(M)^'}.
+Proof. by move=> p; rewrite !inE; case/andP=> ->; move/eqP->. Qed.
+
+Lemma ex_sigma_compl : exists F : {group gT}, \sigma(M)^'.-Hall(M) F.
+Proof. exact: Hall_exists (mmax_sol maxM). Qed.
+
+Let s'E : \sigma(M)^'.-group E := pHall_pgroup hallE.
+Let sEM : E \subset M := pHall_sub hallE.
+
+(* For added convenience, this lemma does NOT depend on the maxM assumption. *)
+Lemma sigma_compl_sol : solvable E.
+Proof.
+have [-> | [p p_pr pE]] := trivgVpdiv E; first exact: solvable1.
+rewrite (solvableS sEM) // mFT_sol // properT.
+apply: contraNneq (pgroupP s'E p p_pr pE) => ->.
+have [P sylP] := Sylow_exists p [set: gT].
+by apply/exists_inP; exists P; rewrite ?subsetT.
+Qed.
+Let solE := sigma_compl_sol.
+
+Let exHallE pi := exists Ei : {group gT}, pi.-Hall(E) Ei.
+Lemma ex_tau13_compl : exHallE \tau1(M) /\ exHallE \tau3(M).
+Proof. by split; exact: Hall_exists. Qed.
+
+Lemma ex_tau2_compl E1 E3 :
+ \tau1(M).-Hall(E) E1 -> \tau3(M).-Hall(E) E3 ->
+ exists2 E2 : {group gT}, \tau2(M).-Hall(E) E2 & sigma_complement M E E1 E2 E3.
+Proof.
+move=> hallE1 hallE3; have [sE1E t1E1 _] := and3P hallE1.
+pose tau12 := [predU \tau1(M) & \tau2(M)].
+have t12E1: tau12.-group E1 by apply: sub_pgroup t1E1 => p t1p; apply/orP; left.
+have [E21 hallE21 sE1E21] := Hall_superset solE sE1E t12E1.
+have [sE21E t12E21 _] := and3P hallE21.
+have [E2 hallE2] := Hall_exists \tau2(M) (solvableS sE21E solE).
+have [sE2E21 t2E2 _] := and3P hallE2.
+have hallE2_E: \tau2(M).-Hall(E) E2.
+ by apply: subHall_Hall hallE21 _ hallE2 => p t2p; apply/orP; right.
+exists E2 => //; split=> //.
+suffices ->: E2 * E1 = E21 by apply: groupP.
+have coE21: coprime #|E2| #|E1| := sub_pnat_coprime tau2'1 t2E2 t1E1.
+apply/eqP; rewrite eqEcard mul_subG ?coprime_cardMg //=.
+rewrite -(partnC \tau1(M) (cardG_gt0 E21)) (card_Hall hallE2) mulnC.
+rewrite (card_Hall (pHall_subl sE1E21 sE21E hallE1)) leq_pmul2r //.
+rewrite dvdn_leq // sub_in_partn // => p t12p t1'p.
+by apply: contraLR (pnatPpi t12E21 t12p) => t2'p; apply/norP.
+Qed.
+
+Lemma coprime_sigma_compl : coprime #|M`_\sigma| #|E|.
+Proof. exact: pnat_coprime (pcore_pgroup _ _) (pHall_pgroup hallE). Qed.
+Let coMsE := coprime_sigma_compl.
+
+Lemma pi_sigma_compl : \pi(E) =i [predD \pi(M) & \sigma(M)].
+Proof. by move=> p; rewrite /= (card_Hall hallE) pi_of_part // !inE andbC. Qed.
+
+Lemma sdprod_sigma : M`_\sigma ><| E = M.
+Proof.
+rewrite sdprodE ?coprime_TIg ?(subset_trans sEM) ?gFnorm //.
+apply/eqP; rewrite eqEcard mul_subG ?pcore_sub ?coprime_cardMg //=.
+by rewrite (card_Hall (Msigma_Hall maxM)) (card_Hall hallE) partnC.
+Qed.
+
+(* The preliminary remarks in the introduction of B & G, section 12. *)
+
+Remark der1_sigma_compl : M^`(1) :&: E = E^`(1).
+Proof.
+have [nsMsM _ defM _ _] := sdprod_context sdprod_sigma.
+by rewrite setIC (pprod_focal_coprime defM _ (subxx E)) ?(setIidPr _) ?der_sub.
+Qed.
+
+Remark partition_pi_mmax p :
+ (p \in \pi(M)) =
+ [|| p \in \tau1(M), p \in \tau2(M), p \in \tau3(M) | p \in \sigma(M)].
+Proof.
+symmetry; rewrite 2!orbA -!andb_orr orbAC -andb_orr orNb andbT.
+rewrite orb_andl orNb /= -(orb_idl ((alpha_sub_sigma maxM) p)) orbA orbC -orbA.
+rewrite !(eq_sym 'r_p(M)) -!leq_eqVlt p_rank_gt0 orb_idl //.
+exact: sigma_sub_pi.
+Qed.
+
+Remark partition_pi_sigma_compl p :
+ (p \in \pi(E)) = [|| p \in \tau1(M), p \in \tau2(M) | p \in \tau3(M)].
+Proof.
+rewrite pi_sigma_compl inE /= partition_pi_mmax !andb_orr /=.
+by rewrite andNb orbF !(andbb, andbA) -2!andbA.
+Qed.
+
+Remark tau2E p : (p \in \tau2(M)) = (p \in \pi(E)) && ('r_p(E) == 2).
+Proof.
+have [P sylP] := Sylow_exists p E.
+rewrite -(andb_idl (pnatPpi s'E)) -p_rank_gt0 -andbA; apply: andb_id2l => s'p.
+have sylP_M := subHall_Sylow hallE s'p sylP.
+by rewrite -(p_rank_Sylow sylP_M) (p_rank_Sylow sylP); case: posnP => // ->.
+Qed.
+
+Remark tau3E p : (p \in \tau3(M)) = (p \in \pi(E^`(1))) && ('r_p(E) == 1%N).
+Proof.
+have [P sylP] := Sylow_exists p E.
+have hallE': \sigma(M)^'.-Hall(M^`(1)) E^`(1).
+ by rewrite -der1_sigma_compl setIC (Hall_setI_normal _ hallE) ?der_normal.
+rewrite 4!inE -(andb_idl (pnatPpi (pHall_pgroup hallE'))) -andbA.
+apply: andb_id2l => s'p; have sylP_M := subHall_Sylow hallE s'p sylP.
+rewrite -(p_rank_Sylow sylP_M) (p_rank_Sylow sylP) andbC; apply: andb_id2r.
+rewrite eqn_leq p_rank_gt0 mem_primes => /and3P[_ p_pr _].
+rewrite (card_Hall hallE') pi_of_part 3?inE ?mem_primes ?cardG_gt0 //=.
+by rewrite p_pr inE /= s'p andbT.
+Qed.
+
+Remark tau1E p :
+ (p \in \tau1(M)) = [&& p \in \pi(E), p \notin \pi(E^`(1)) & 'r_p(E) == 1%N].
+Proof.
+rewrite partition_pi_sigma_compl; apply/idP/idP=> [t1p|].
+ have [s'p rpM _] := and3P t1p; have [P sylP] := Sylow_exists p E.
+ have:= tau3'1 t1p; rewrite t1p /= inE /= tau3E -(p_rank_Sylow sylP).
+ by rewrite (p_rank_Sylow (subHall_Sylow hallE s'p sylP)) rpM !andbT.
+rewrite orbC andbC -andbA => /and3P[not_piE'p /eqP rpE].
+by rewrite tau3E tau2E rpE (negPf not_piE'p) andbF.
+Qed.
+
+(* Generate a rank 2 elementary abelian tau2 subgroup in a given complement. *)
+Lemma ex_tau2Elem p :
+ p \in \tau2(M) -> exists2 A, A \in 'E_p^2(E) & A \in 'E_p^2(M).
+Proof.
+move=> t2p; have [A Ep2A] := p_rank_witness p E.
+have <-: 'r_p(E) = 2 by apply/eqP; move: t2p; rewrite tau2E; case/andP.
+by exists A; rewrite // (subsetP (pnElemS p _ sEM)).
+Qed.
+
+(* A converse to the above Lemma: if E has an elementary abelian subgroup of *)
+(* order p^2, then p must be in tau2. *)
+Lemma sigma'2Elem_tau2 p A : A \in 'E_p^2(E) -> p \in \tau2(M).
+Proof.
+move=> Ep2A; have rE: 'r_p(E) > 1 by apply/p_rank_geP; exists A.
+have: p \in \pi(E) by rewrite -p_rank_gt0 ltnW.
+rewrite partition_pi_sigma_compl orbCA => /orP[] //.
+by rewrite -!andb_orr eqn_leq leqNgt (leq_trans rE) ?andbF ?p_rankS.
+Qed.
+
+(* This is B & G, Lemma 12.1(a). *)
+Lemma der1_sigma_compl_nil : nilpotent E^`(1).
+Proof.
+have sE'E := der_sub 1 E.
+have nMaE: E \subset 'N(M`_\alpha) by rewrite (subset_trans sEM) ?gFnorm.
+have tiMaE': M`_\alpha :&: E^`(1) = 1.
+ by apply/trivgP; rewrite -(coprime_TIg coMsE) setISS ?Malpha_sub_Msigma.
+rewrite (isog_nil (quotient_isog (subset_trans sE'E nMaE) tiMaE')).
+by rewrite (nilpotentS (quotientS _ (dergS 1 sEM))) ?Malpha_quo_nil.
+Qed.
+
+(* This is B & G, Lemma 12.1(g). *)
+Lemma tau2_not_beta p :
+ p \in \tau2(M) -> p \notin \beta(G) /\ {subset 'E_p^2(M) <= 'E*_p(G)}.
+Proof.
+case/andP=> s'p /eqP rpM; split; first exact: sigma'_rank2_beta' rpM.
+by apply/subsetP; exact: sigma'_rank2_max.
+Qed.
+
+End Introduction.
+
+Implicit Arguments tau2'1 [[M] x].
+Implicit Arguments tau3'1 [[M] x].
+Implicit Arguments tau3'2 [[M] x].
+
+(* This is the rest of B & G, Lemma 12.1 (parts b, c, d,e, and f). *)
+Lemma sigma_compl_context M E E1 E2 E3 :
+ M \in 'M -> sigma_complement M E E1 E2 E3 ->
+ [/\ (*b*) E3 \subset E^`(1) /\ E3 <| E,
+ (*c*) E2 :==: 1 -> E1 :!=: 1,
+ (*d*) cyclic E1 /\ cyclic E3,
+ (*e*) E3 ><| (E2 ><| E1) = E /\ E3 ><| E2 ><| E1 = E
+ & (*f*) 'C_E3(E) = 1].
+Proof.
+move=> maxM [hallE hallE1 hallE2 hallE3 groupE21].
+have [sEM solM] := (pHall_sub hallE, mmax_sol maxM).
+have [[sE1E t1E1 _] [sE3E t3E3 _]] := (and3P hallE1, and3P hallE3).
+have tiE'E1: E^`(1) :&: E1 = 1.
+ rewrite coprime_TIg // coprime_pi' ?cardG_gt0 //.
+ by apply: sub_pgroup t1E1 => p; rewrite (tau1E maxM hallE) => /and3P[].
+have cycE1: cyclic E1.
+ apply: nil_Zgroup_cyclic.
+ rewrite odd_rank1_Zgroup ?mFT_odd //; apply: wlog_neg; rewrite -ltnNge.
+ have [p p_pr ->]:= rank_witness E1; move/ltnW; rewrite p_rank_gt0.
+ move/(pnatPpi t1E1); rewrite (tau1E maxM hallE) => /and3P[_ _ /eqP <-].
+ by rewrite p_rankS.
+ rewrite abelian_nil // /abelian (sameP commG1P trivgP) -tiE'E1.
+ by rewrite subsetI (der_sub 1) (dergS 1).
+have solE: solvable E := solvableS sEM solM.
+have nilE': nilpotent E^`(1) := der1_sigma_compl_nil maxM hallE.
+have nsE'piE pi: 'O_pi(E^`(1)) <| E.
+ exact: char_normal_trans (pcore_char _ _) (der_normal _ _).
+have SylowE3 P: Sylow E3 P -> [/\ cyclic P, P \subset E^`(1) & 'C_P(E) = 1].
+- case/SylowP=> p p_pr sylP; have [sPE3 pP _] := and3P sylP.
+ have [-> | ntP] := eqsVneq P 1.
+ by rewrite cyclic1 sub1G (setIidPl (sub1G _)).
+ have t3p: p \in \tau3(M).
+ rewrite (pnatPpi t3E3) // -p_rank_gt0 -(p_rank_Sylow sylP) -rank_pgroup //.
+ by rewrite rank_gt0.
+ have sPE: P \subset E := subset_trans sPE3 sE3E.
+ have cycP: cyclic P.
+ rewrite (odd_pgroup_rank1_cyclic pP) ?mFT_odd //.
+ rewrite (tau3E maxM hallE) in t3p.
+ by case/andP: t3p => _ /eqP <-; rewrite p_rankS.
+ have nEp'E: E \subset 'N('O_p^'(E)) by exact: gFnorm.
+ have nEp'P := subset_trans sPE nEp'E.
+ have sylP_E := subHall_Sylow hallE3 t3p sylP.
+ have nsEp'P_E: 'O_p^'(E) <*> P <| E.
+ rewrite sub_der1_normal ?join_subG ?pcore_sub //=.
+ rewrite norm_joinEr // -quotientSK //=; last first.
+ by rewrite (subset_trans (der_sub 1 E)).
+ have [_ /= <- _ _] := dprodP (nilpotent_pcoreC p nilE').
+ rewrite -quotientMidr -mulgA (mulSGid (pcore_max _ _)) ?pcore_pgroup //=.
+ rewrite quotientMidr quotientS //.
+ apply: subset_trans (pcore_sub_Hall sylP_E).
+ by rewrite pcore_max ?pcore_pgroup /=.
+ have nEP_sol: solvable 'N_E(P) by rewrite (solvableS _ solE) ?subsetIl.
+ have [K hallK] := Hall_exists p^' nEP_sol; have [sKNEP p'K _] := and3P hallK.
+ have coPK: coprime #|P| #|K| := pnat_coprime pP p'K.
+ have sP_NEP: P \subset 'N_E(P) by rewrite subsetI sPE normG.
+ have mulPK: P * K = 'N_E(P).
+ apply/eqP; rewrite eqEcard mul_subG //= coprime_cardMg // (card_Hall hallK).
+ by rewrite (card_Hall (pHall_subl sP_NEP (subsetIl E _) sylP_E)) partnC.
+ rewrite subsetI in sKNEP; case/andP: sKNEP => sKE nPK.
+ have nEp'K := subset_trans sKE nEp'E.
+ have defE: 'O_p^'(E) <*> K * P = E.
+ have sP_Ep'P: P \subset 'O_p^'(E) <*> P := joing_subr _ _.
+ have sylP_Ep'P := pHall_subl sP_Ep'P (normal_sub nsEp'P_E) sylP_E.
+ rewrite -{2}(Frattini_arg nsEp'P_E sylP_Ep'P) /= !norm_joinEr //.
+ by rewrite -mulgA (normC nPK) -mulPK -{1}(mulGid P) !mulgA.
+ have ntPE': P :&: E^`(1) != 1.
+ have sylPE' := Hall_setI_normal (der_normal 1 E) sylP_E.
+ rewrite -rank_gt0 (rank_Sylow sylPE') p_rank_gt0.
+ by rewrite (tau3E maxM hallE) in t3p; case/andP: t3p.
+ have defP := coprime_abelian_cent_dprod nPK coPK (cyclic_abelian cycP).
+ have{defP} [[PK1 _]|[regKP defP]] := cyclic_pgroup_dprod_trivg pP cycP defP.
+ have coP_Ep'K: coprime #|P| #|'O_p^'(E) <*> K|.
+ rewrite (pnat_coprime pP) // -pgroupE norm_joinEr //.
+ by rewrite pgroupM pcore_pgroup.
+ rewrite -subG1 -(coprime_TIg coP_Ep'K) setIS ?der1_min // in ntPE'.
+ rewrite -{1}defE mulG_subG normG normsY // cents_norm //.
+ exact/commG1P.
+ by rewrite -{2}defE quotientMidl quotient_abelian ?cyclic_abelian.
+ split=> //; first by rewrite -defP commgSS.
+ by apply/trivgP; rewrite -regKP setIS ?centS.
+have sE3E': E3 \subset E^`(1).
+ by rewrite -(Sylow_gen E3) gen_subG; apply/bigcupsP=> P; case/SylowE3.
+have cycE3: cyclic E3.
+ rewrite nil_Zgroup_cyclic ?(nilpotentS sE3E') //.
+ by apply/forall_inP => P; case/SylowE3.
+have regEE3: 'C_E3(E) = 1.
+ have [// | [p p_pr]] := trivgVpdiv 'C_E3(E).
+ case/Cauchy=> // x /setIP[]; rewrite -!cycle_subG => sXE3 cEX ox.
+ have pX: p.-elt x by rewrite /p_elt ox pnat_id.
+ have [P sylP sXP] := Sylow_superset sXE3 pX.
+ suffices: <[x]> == 1 by case/idPn; rewrite cycle_eq1 -order_gt1 ox prime_gt1.
+ rewrite -subG1; case/SylowE3: (p_Sylow sylP) => _ _ <-.
+ by rewrite subsetI sXP.
+have nsE3E: E3 <| E.
+ have hallE3_E' := pHall_subl sE3E' (der_sub 1 E) hallE3.
+ by rewrite (nilpotent_Hall_pcore nilE' hallE3_E') /=.
+have [sE2E t2E2 _] := and3P hallE2; have [_ nE3E] := andP nsE3E.
+have coE21: coprime #|E2| #|E1| := sub_pnat_coprime tau2'1 t2E2 t1E1.
+have coE31: coprime #|E3| #|E1| := sub_pnat_coprime tau3'1 t3E3 t1E1.
+have coE32: coprime #|E3| #|E2| := sub_pnat_coprime tau3'2 t3E3 t2E2.
+have{groupE21} defE: E3 ><| (E2 ><| E1) = E.
+ have defE21: E2 * E1 = E2 <*> E1 by rewrite -genM_join gen_set_id.
+ have sE21E: E2 <*> E1 \subset E by rewrite join_subG sE2E.
+ have nE3E21 := subset_trans sE21E nE3E.
+ have coE312: coprime #|E3| #|E2 <*> E1|.
+ by rewrite -defE21 coprime_cardMg // coprime_mulr coE32.
+ have nE21: E1 \subset 'N(E2).
+ rewrite (subset_trans (joing_subr E2 E1)) ?sub_der1_norm ?joing_subl //.
+ rewrite /= -{2}(mulg1 E2) -(setIidPr (der_sub 1 _)) /=.
+ rewrite -(coprime_mulG_setI_norm defE21) ?gFnorm //.
+ by rewrite mulgSS ?subsetIl // -tiE'E1 setIC setSI ?dergS.
+ rewrite (sdprodEY nE21) ?sdprodE ?coprime_TIg //=.
+ apply/eqP; rewrite eqEcard mul_subG // coprime_cardMg //= -defE21.
+ rewrite -(partnC \tau3(M) (cardG_gt0 E)) (card_Hall hallE3) leq_mul //.
+ rewrite coprime_cardMg // (card_Hall hallE1) (card_Hall hallE2).
+ rewrite -[#|E|`__](partnC \tau2(M)) ?leq_mul ?(partn_part _ tau3'2) //.
+ rewrite -partnI dvdn_leq // sub_in_partn // => p piEp; apply/implyP.
+ rewrite inE /= -negb_or /= orbC implyNb orbC.
+ by rewrite -(partition_pi_sigma_compl maxM hallE).
+split=> // [/eqP E2_1|]; last split=> //.
+ apply: contraTneq (sol_der1_proper solM (subxx _) (mmax_neq1 maxM)) => E1_1.
+ case/sdprodP: (sdprod_sigma maxM hallE) => _ defM _ _.
+ rewrite properE der_sub /= negbK -{1}defM mulG_subG Msigma_der1 //.
+ by rewrite -defE E1_1 E2_1 !sdprodg1 (subset_trans sE3E') ?dergS //.
+case/sdprodP: defE => [[_ E21 _ defE21]]; rewrite defE21 => defE nE321 tiE321.
+have{defE21} [_ defE21 nE21 tiE21] := sdprodP defE21.
+have [nE32 nE31] := (subset_trans sE2E nE3E, subset_trans sE1E nE3E).
+rewrite [E3 ><| _]sdprodEY ? sdprodE ?coprime_TIg ?normsY //=.
+ by rewrite norm_joinEr // -mulgA defE21.
+by rewrite norm_joinEr // coprime_cardMg // coprime_mull coE31.
+Qed.
+
+(* This is B & G, Lemma 12.2(a). *)
+Lemma prime_class_mmax_norm M p X :
+ M \in 'M -> p.-group X -> 'N(X) \subset M ->
+ (p \in \sigma(M)) || (p \in \tau2(M)).
+Proof.
+move=> maxM pX sNM; rewrite -implyNb; apply/implyP=> sM'p.
+by rewrite 3!inE /= sM'p (sigma'_norm_mmax_rank2 _ _ pX).
+Qed.
+
+(* This is B & G, Lemma 12.2(b). *)
+Lemma mmax_norm_notJ M Mstar p X :
+ M \in 'M -> Mstar \in 'M ->
+ p.-group X -> X \subset M -> 'N(X) \subset Mstar ->
+ [|| [&& p \in \sigma(M) & M :!=: Mstar], p \in \tau1(M) | p \in \tau3(M)] ->
+ gval Mstar \notin M :^: G.
+Proof.
+move: Mstar => H maxM maxH pX sXM sNH; apply: contraL => MG_H.
+have [x Gx defH] := imsetP MG_H.
+have [sMp | sM'p] := boolP (p \in \sigma(M)); last first.
+ have:= prime_class_mmax_norm maxH pX sNH.
+ rewrite defH /= sigmaJ tau2J !negb_or (negPf sM'p) /= => t2Mp.
+ by rewrite (contraL (@tau2'1 _ p)) // [~~ _]tau3'2.
+rewrite 3!inE sMp 3!inE sMp orbF negbK.
+have [_ transCX _] := sigma_group_trans maxM sMp pX.
+set maxMX := finset _ in transCX.
+have maxMX_H: gval H \in maxMX by rewrite inE MG_H (subset_trans (normG X)).
+have maxMX_M: gval M \in maxMX by rewrite inE orbit_refl.
+have [y cXy ->] := atransP2 transCX maxMX_H maxMX_M.
+by rewrite /= conjGid // (subsetP sNH) // (subsetP (cent_sub X)).
+Qed.
+
+(* This is B & G, Lemma 12.3. *)
+Lemma nonuniq_p2Elem_cent_sigma M Mstar p A A0 :
+ M \in 'M -> Mstar \in 'M -> Mstar :!=: M -> A \in 'E_p^2(M) ->
+ A0 \in 'E_p^1(A) -> 'N(A0) \subset Mstar ->
+ [/\ (*a*) p \notin \sigma(M) -> A \subset 'C(M`_\sigma :&: Mstar)
+ & (*b*) p \notin \alpha(M) -> A \subset 'C(M`_\alpha :&: Mstar)].
+Proof.
+move: Mstar => H maxM maxH neqMH Ep2A EpA0 sNH.
+have p_pr := pnElem_prime Ep2A.
+have [sAM abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
+have [sA0A _ _] := pnElemP EpA0; have pA0 := pgroupS sA0A pA.
+have sAH: A \subset H.
+ by apply: subset_trans (cents_norm _) sNH; exact: subset_trans (centS sA0A).
+have nsHsH: H`_\sigma <| H by exact: pcore_normal.
+have [sHsH nHsH] := andP nsHsH; have nHsA := subset_trans sAH nHsH.
+have nsHsA_H: H`_\sigma <*> A <| H.
+ have [sHp | sH'p] := boolP (p \in \sigma(H)).
+ rewrite (joing_idPl _) ?pcore_normal //.
+ by rewrite (sub_Hall_pcore (Msigma_Hall _)) // (pi_pgroup pA).
+ have [P sylP sAP] := Sylow_superset sAH pA.
+ have excH: exceptional_FTmaximal p H A0 A by split=> //; apply/pnElemP.
+ exact: exceptional_mul_sigma_normal excH sylP sAP.
+have cAp' K:
+ p^'.-group K -> A \subset 'N(K) -> K \subset H ->
+ [~: K, A] \subset K :&: H`_\sigma.
+- move=> p'K nKA sKH; have nHsK := subset_trans sKH nHsH.
+ rewrite subsetI commg_subl nKA /= -quotient_sub1 ?comm_subG // quotientR //=.
+ have <-: K / H`_\sigma :&: A / H`_\sigma = 1.
+ by rewrite setIC coprime_TIg ?coprime_morph ?(pnat_coprime pA p'K).
+ rewrite subsetI commg_subl commg_subr /= -{2}(quotientYidr nHsA).
+ by rewrite !quotient_norms //= joingC (subset_trans sKH) ?normal_norm.
+have [sMp | sM'p] := boolP (p \in \sigma(M)).
+ split=> // aM'p; have notMGH: gval H \notin M :^: G.
+ apply: mmax_norm_notJ maxM maxH pA0 (subset_trans sA0A sAM) sNH _.
+ by rewrite sMp eq_sym neqMH.
+ rewrite centsC (sameP commG1P trivgP).
+ apply: subset_trans (cAp' _ _ _ (subsetIr _ _)) _.
+ - exact: pi_p'group (pgroupS (subsetIl _ _) (pcore_pgroup _ _)) aM'p.
+ - by rewrite (normsI _ (normsG sAH)) // (subset_trans sAM) ?gFnorm.
+ by rewrite setIAC; case/sigma_disjoint: notMGH => // -> _ _; exact: subsetIl.
+suffices cMaA: A \subset 'C(M`_\sigma :&: H).
+ by rewrite !{1}(subset_trans cMaA) ?centS ?setSI // Malpha_sub_Msigma.
+have [sHp | sH'p] := boolP (p \in \sigma(H)); last first.
+ apply/commG1P; apply: contraNeq neqMH => ntA_MsH.
+ have [P sylP sAP] := Sylow_superset sAH pA.
+ have excH: exceptional_FTmaximal p H A0 A by split=> //; exact/pnElemP.
+ have maxAM: M \in 'M(A) by exact/setIdP.
+ rewrite (exceptional_sigma_uniq maxH excH sylP sAP maxAM) //.
+ apply: contraNneq ntA_MsH => tiMsHs; rewrite -subG1.
+ have [sHsA_H nHsA_H] := andP nsHsA_H.
+ have <-: H`_\sigma <*> A :&: M`_\sigma = 1.
+ apply/trivgP; rewrite -tiMsHs subsetI subsetIr /=.
+ rewrite -quotient_sub1 ?subIset ?(subset_trans sHsA_H) //.
+ rewrite quotientGI ?joing_subl //= joingC quotientYidr //.
+ rewrite setIC coprime_TIg ?coprime_morph //.
+ rewrite (pnat_coprime (pcore_pgroup _ _)) // (card_pnElem Ep2A).
+ by rewrite pnat_exp ?orbF ?pnatE.
+ rewrite commg_subI // subsetI ?joing_subr ?subsetIl.
+ by rewrite (subset_trans sAM) ?gFnorm.
+ by rewrite setIC subIset ?nHsA_H.
+have sAHs: A \subset H`_\sigma.
+ by rewrite (sub_Hall_pcore (Msigma_Hall maxH)) // (pi_pgroup pA).
+have [S sylS sAS] := Sylow_superset sAHs pA; have [sSHs pS _] := and3P sylS.
+have nsHaH: H`_\alpha <| H := pcore_normal _ _; have [_ nHaH] := andP nsHaH.
+have nHaS := subset_trans (subset_trans sSHs sHsH) nHaH.
+have nsHaS_H: H`_\alpha <*> S <| H.
+ rewrite -{2}(quotientGK nsHaH) (norm_joinEr nHaS) -quotientK //.
+ rewrite cosetpre_normal; apply: char_normal_trans (quotient_normal _ nsHsH).
+ rewrite /= (nilpotent_Hall_pcore _ (quotient_pHall _ sylS)) ?pcore_char //.
+ exact: nilpotentS (quotientS _ (Msigma_der1 maxH)) (Malpha_quo_nil maxH).
+rewrite (sameP commG1P trivgP).
+have <-: H`_\alpha <*> S :&: M`_\sigma = 1.
+ have: gval M \notin H :^: G.
+ by apply: contra sM'p; case/imsetP=> x _ ->; rewrite sigmaJ.
+ case/sigma_disjoint=> // _ ti_aHsM _.
+ rewrite setIC coprime_TIg ?(pnat_coprime (pcore_pgroup _ _)) //=.
+ rewrite norm_joinEr // [pnat _ _]pgroupM (pi_pgroup pS) // andbT.
+ apply: sub_pgroup (pcore_pgroup _ _) => q aHq.
+ by apply: contraFN (ti_aHsM q) => sMq; rewrite inE /= aHq.
+rewrite commg_subI // subsetI ?subsetIl.
+ by rewrite (subset_trans sAS) ?joing_subr ?(subset_trans sAM) ?gFnorm.
+by rewrite setIC subIset 1?normal_norm.
+Qed.
+
+(* This is B & G, Proposition 12.4. *)
+Proposition p2Elem_mmax M p A :
+ M \in 'M -> A \in 'E_p^2(M) ->
+ (*a*) 'C(A) \subset M
+ /\ (*b*) ([forall A0 in 'E_p^1(A), 'M('N(A0)) != [set M]] ->
+ [/\ p \in \sigma(M), M`_\alpha = 1 & nilpotent M`_\sigma]).
+Proof.
+move=> maxM Ep2A; have p_pr := pnElem_prime Ep2A.
+have [sAM abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
+have [EpAnonuniq |] := altP forall_inP; last first.
+ rewrite negb_forall_in; case/exists_inP=> A0 EpA0; rewrite negbK.
+ case/eqP/mem_uniq_mmax=> _ sNA0_M; rewrite (subset_trans _ sNA0_M) //.
+ by have [sA0A _ _] := pnElemP EpA0; rewrite cents_norm // centS.
+have{EpAnonuniq} sCMkApCA y: y \in A^# ->
+ [/\ 'r('C_M(<[y]>)) <= 2,
+ p \in \sigma(M)^' -> 'C_(M`_\sigma)[y] \subset 'C_M(A)
+ & p \in \alpha(M)^' -> 'C_(M`_\alpha)[y] \subset 'C_M(A)].
+- case/setD1P=> nty Ay; pose Y := <[y]>%G.
+ rewrite -cent_cycle -[<[y]>]/(gval Y).
+ have EpY: Y \in 'E_p^1(A).
+ by rewrite p1ElemE // 2!inE cycle_subG Ay -orderE (abelem_order_p abelA) /=.
+ have [sYA abelY dimY] := pnElemP EpY; have [pY _] := andP abelY.
+ have [H maxNYH neqHM]: exists2 H, H \in 'M('N(Y)) & H \notin [set M].
+ apply/subsetPn; rewrite subset1 negb_or EpAnonuniq //=.
+ apply/set0Pn; have [|H] := (@mmax_exists _ 'N(Y)); last by exists H.
+ rewrite mFT_norm_proper ?(mFT_pgroup_proper pY) //.
+ by rewrite -rank_gt0 (rank_abelem abelY) dimY.
+ have{maxNYH} [maxH sNYH] := setIdP maxNYH; rewrite inE -val_eqE /= in neqHM.
+ have ->: 'r('C_M(Y)) <= 2.
+ apply: contraR neqHM; rewrite -ltnNge => rCMYgt2.
+ have uniqCMY: 'C_M(Y)%G \in 'U.
+ by rewrite rank3_Uniqueness ?(sub_mmax_proper maxM) ?subsetIl.
+ have defU: 'M('C_M(Y)) = [set M] by apply: def_uniq_mmax; rewrite ?subsetIl.
+ rewrite (eq_uniq_mmax defU maxH) ?subIset //.
+ by rewrite orbC (subset_trans (cent_sub Y)).
+ have [cAMs cAMa] := nonuniq_p2Elem_cent_sigma maxM maxH neqHM Ep2A EpY sNYH.
+ rewrite !{1}subsetI !{1}(subset_trans (subsetIl _ _) (pcore_sub _ _)).
+ by split=> // [/cAMs | /cAMa]; rewrite centsC; apply: subset_trans;
+ rewrite setIS ?(subset_trans (cent_sub Y)).
+have ntA: A :!=: 1 by rewrite -rank_gt0 (rank_abelem abelA) dimA.
+have ncycA: ~~ cyclic A by rewrite (abelem_cyclic abelA) dimA.
+have rCMAle2: 'r('C_M(A)) <= 2.
+ have [y Ay]: exists y, y \in A^# by apply/set0Pn; rewrite setD_eq0 subG1.
+ have [rCMy _ _] := sCMkApCA y Ay; apply: leq_trans rCMy.
+ by rewrite rankS // setIS // centS // cycle_subG; case/setIdP: Ay.
+have sMp: p \in \sigma(M).
+ apply: contraFT (ltnn 1) => sM'p; rewrite -dimA -(rank_abelem abelA).
+ suffices cMsA: A \subset 'C(M`_\sigma).
+ by rewrite -(setIidPl cMsA) sub'cent_sigma_rank1 // (pi_pgroup pA).
+ have nMsA: A \subset 'N(M`_\sigma) by rewrite (subset_trans sAM) ?gFnorm.
+ rewrite centsC /= -(coprime_abelian_gen_cent1 _ _ nMsA) //; last first.
+ exact: pnat_coprime (pcore_pgroup _ _) (pi_pnat pA _).
+ rewrite gen_subG; apply/bigcupsP=> y; case/sCMkApCA=> _ sCMsyCA _.
+ by rewrite (subset_trans (sCMsyCA sM'p)) ?subsetIr.
+have [P sylP sAP] := Sylow_superset sAM pA; have [sPM pP _] := and3P sylP.
+pose Z := 'Ohm_1('Z(P)).
+have sZA: Z \subset A.
+ have maxA: A \in 'E*_p('C_M(A)).
+ have sACMA: A \subset 'C_M(A) by rewrite subsetI sAM.
+ rewrite (subsetP (p_rankElem_max _ _)) // !inE abelA sACMA.
+ rewrite eqn_leq logn_le_p_rank /=; last by rewrite !inE sACMA abelA.
+ by rewrite dimA (leq_trans (p_rank_le_rank _ _)).
+ rewrite [Z](OhmE 1 (pgroupS (center_sub P) pP)) gen_subG.
+ rewrite -(pmaxElem_LdivP p_pr maxA) -(setIA M) setIid setSI //=.
+ by rewrite setISS // centS.
+have{ntA} ntZ: Z != 1.
+ by rewrite Ohm1_eq1 (center_nil_eq1 (pgroup_nil pP)) (subG1_contra sAP).
+have rPle2: 'r(P) <= 2.
+ have [z Zz ntz]: exists2 z, z \in Z & z \notin [1].
+ by apply/subsetPn; rewrite subG1.
+ have [|rCMz _ _] := sCMkApCA z; first by rewrite inE ntz (subsetP sZA).
+ rewrite (leq_trans _ rCMz) ?rankS // subsetI sPM centsC cycle_subG.
+ by rewrite (subsetP _ z Zz) // (subset_trans (Ohm_sub 1 _)) ?subsetIr.
+have aM'p: p \in \alpha(M)^'.
+ by rewrite !inE -leqNgt -(p_rank_Sylow sylP) -rank_pgroup.
+have sMaCMA: M`_\alpha \subset 'C_M(A).
+have nMaA: A \subset 'N(M`_\alpha) by rewrite (subset_trans sAM) ?gFnorm.
+ rewrite -(coprime_abelian_gen_cent1 _ _ nMaA) //; last first.
+ exact: (pnat_coprime (pcore_pgroup _ _) (pi_pnat pA _)).
+ rewrite gen_subG; apply/bigcupsP=> y; case/sCMkApCA=> _ _ sCMayCA.
+ by rewrite (subset_trans (sCMayCA aM'p)) ?subsetIr.
+have Ma1: M`_\alpha = 1.
+ have [q q_pr rMa]:= rank_witness M`_\alpha.
+ apply: contraTeq rCMAle2; rewrite -ltnNge -rank_gt0 rMa p_rank_gt0 => piMa_q.
+ have aMq: q \in \alpha(M) := pnatPpi (pcore_pgroup _ _) piMa_q.
+ apply: leq_trans (rankS sMaCMA); rewrite rMa.
+ have [Q sylQ] := Sylow_exists q M`_\alpha; rewrite -(p_rank_Sylow sylQ).
+ by rewrite (p_rank_Sylow (subHall_Sylow (Malpha_Hall maxM) aMq sylQ)).
+have nilMs: nilpotent M`_\sigma.
+ rewrite (nilpotentS (Msigma_der1 maxM)) // (isog_nil (quotient1_isog _)).
+ by rewrite -Ma1 Malpha_quo_nil.
+rewrite (subset_trans (cents_norm (centS sZA))) ?(mmax_normal maxM) //.
+apply: char_normal_trans (char_trans (Ohm_char 1 _) (center_char P)) _.
+have{sylP} sylP: p.-Sylow(M`_\sigma) P.
+ apply: pHall_subl _ (pcore_sub _ _) sylP.
+ by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) // (pi_pgroup pP).
+by rewrite (nilpotent_Hall_pcore _ sylP) ?(char_normal_trans (pcore_char _ _)).
+Qed.
+
+(* This is B & G, Theorem 12.5(a) -- this part does not mention a specific *)
+(* rank 2 elementary abelian \tau_2(M) subgroup of M. *)
+
+Theorem tau2_Msigma_nil M p : M \in 'M -> p \in \tau2(M) -> nilpotent M`_\sigma.
+Proof.
+move=> maxM t2Mp; have [sM'p /eqP rpM] := andP t2Mp.
+have [A Ep2A] := p_rank_witness p M; rewrite rpM in Ep2A.
+have [_]:= p2Elem_mmax maxM Ep2A; rewrite -negb_exists_in [p \in _](negPf sM'p).
+have [[A0 EpA0 /eqP/mem_uniq_mmax[_ sNA0M _]] | _ [] //] := exists_inP.
+have{EpA0 sNA0M} excM: exceptional_FTmaximal p M A0 A by [].
+have [sAM abelA _] := pnElemP Ep2A; have [pA _] := andP abelA.
+have [P sylP sAP] := Sylow_superset sAM pA.
+exact: exceptional_sigma_nil maxM excM sylP sAP.
+Qed.
+
+(* This is B & G, Theorem 12.5 (b-f) -- the bulk of the Theorem. *)
+Theorem tau2_context M p A (Ms := M`_\sigma) :
+ M \in 'M -> p \in \tau2(M) -> A \in 'E_p^2(M) ->
+ [/\ (*b*) forall P, p.-Sylow(M) P ->
+ abelian P
+ /\ (A \subset P -> 'Ohm_1(P) = A /\ ~~ ('N(P) \subset M)),
+ (*c*) Ms <*> A <| M,
+ (*d*) 'C_Ms(A) = 1,
+ (*e*) forall Mstar, Mstar \in 'M(A) :\ M -> Ms :&: Mstar = 1
+ & (*f*) exists2 A1, A1 \in 'E_p^1(A) & 'C_Ms(A1) = 1].
+Proof.
+move=> maxM t2Mp Ep2A; have [sM'p _] := andP t2Mp.
+have [_]:= p2Elem_mmax maxM Ep2A; rewrite -negb_exists_in [p \in _](negPf sM'p).
+have [[A0 EpA0 /eqP/mem_uniq_mmax[_ sNA0M _]] | _ [] //] := exists_inP.
+have{EpA0 sNA0M} excM: exceptional_FTmaximal p M A0 A by [].
+have strM := exceptional_structure maxM excM.
+have [sAM abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
+have [P sylP sAP] := Sylow_superset sAM pA.
+have nsMsA_M : Ms <*> A <| M := exceptional_mul_sigma_normal maxM excM sylP sAP.
+have [_ regA [A1 EpA1 [_ _ [_ regA1 _]]]] := strM P sylP sAP.
+split=> // [P1 sylP1 | {P sylP sAP A0 excM}H| ]; last by exists A1.
+ split=> [|sAP1]; first exact: (exceptional_Sylow_abelian _ excM sylP).
+ split; first by case/strM: sylP1.
+ by apply: contra sM'p => sNP1M; apply/exists_inP; exists P1; rewrite // ?inE.
+case/setD1P; rewrite -val_eqE /= => neqHM /setIdP[maxH sAH].
+apply/trivgP; rewrite -regA subsetI subsetIl /=.
+have Ep2A_H: A \in 'E_p^2(H) by apply/pnElemP.
+have [_]:= p2Elem_mmax maxH Ep2A_H; rewrite -negb_exists_in.
+have [[A0 EpA0 /eqP/mem_uniq_mmax[_ sNA0H _]]|_ [//|sHp _ nilHs]] := exists_inP.
+ have [cMSH_A _]:= nonuniq_p2Elem_cent_sigma maxM maxH neqHM Ep2A EpA0 sNA0H.
+ by rewrite centsC cMSH_A.
+have [P sylP sAP] := Sylow_superset sAH pA; have [sPH pP _] := and3P sylP.
+have sylP_Hs: p.-Sylow(H`_\sigma) P.
+ rewrite (pHall_subl _ (pcore_sub _ _) sylP) //.
+ by rewrite (sub_Hall_pcore (Msigma_Hall maxH)) // (pi_pgroup pP).
+have nPH: H \subset 'N(P).
+ rewrite (nilpotent_Hall_pcore nilHs sylP_Hs).
+ by rewrite !(char_norm_trans (pcore_char _ _)) ?normG.
+have coMsP: coprime #|M`_\sigma| #|P|.
+ exact: pnat_coprime (pcore_pgroup _ _) (pi_pnat pP _).
+rewrite (sameP commG1P trivgP) -(coprime_TIg coMsP) commg_subI ?setIS //.
+by rewrite subsetI sAP (subset_trans sAM) ?gFnorm.
+Qed.
+
+(* This is B & G, Corollary 12.6 (a, b, c & f) -- i.e., the assertions that *)
+(* do not depend on the decomposition of the complement. *)
+Corollary tau2_compl_context M E p A (Ms := M`_\sigma) :
+ M \in 'M -> \sigma(M)^'.-Hall(M) E -> p \in \tau2(M) -> A \in 'E_p^2(E) ->
+ [/\ (*a*) A <| E /\ 'E_p^1(E) = 'E_p^1(A),
+ (*b*) [/\ 'C(A) \subset E, 'N_M(A) = E & ~~ ('N(A) \subset M)],
+ (*c*) forall X, X \in 'E_p^1(E) -> 'C_Ms(X) != 1 -> 'M('C(X)) = [set M]
+ & (*f*) forall Mstar,
+ Mstar \in 'M -> gval Mstar \notin M :^: G ->
+ Ms :&: Mstar`_\sigma = 1
+ /\ [predI \sigma(M) & \sigma(Mstar)] =i pred0].
+Proof.
+move=> maxM hallE t2Mp Ep2A; have [sEM sM'E _] := and3P hallE.
+have [p_pr [sM'p _]] := (pnElem_prime Ep2A, andP t2Mp).
+have [sAE abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
+have [_ mulMsE nMsE tiMsE] := sdprodP (sdprod_sigma maxM hallE).
+have Ep2A_M: A \in 'E_p^2(M) by rewrite (subsetP (pnElemS _ _ sEM)).
+have [syl_p_M nsMsAM regA tiMsMA _] := tau2_context maxM t2Mp Ep2A_M.
+have nMsA: A \subset 'N(Ms) := subset_trans sAE nMsE.
+have nsAE: A <| E.
+ rewrite /normal sAE -(mul1g A) -tiMsE setIC group_modr // normsI ?normG //.
+ by rewrite (subset_trans sEM) // -(norm_joinEr nMsA) normal_norm.
+have sAsylE P: p.-Sylow(E) P -> 'Ohm_1(P) = A /\ ~~ ('N(P) \subset M).
+ move=> sylP; have sylP_M: p.-Sylow(M) P by apply: (subHall_Sylow hallE).
+ have [_] := syl_p_M P sylP_M; apply.
+ exact: subset_trans (pcore_max pA nsAE) (pcore_sub_Hall sylP).
+have not_sNA_M: ~~ ('N(A) \subset M).
+ have [P sylP] := Sylow_exists p E; have [<-]:= sAsylE P sylP.
+ exact: contra (subset_trans (char_norms (Ohm_char 1 P))).
+have{sAsylE syl_p_M} defEpE: 'E_p^1(E) = 'E_p^1(A).
+ apply/eqP; rewrite eqEsubset andbC pnElemS //.
+ apply/subsetP=> X /pnElemP[sXE abelX dimX]; apply/pnElemP; split=> //.
+ have [pX _ eX] := and3P abelX; have [P sylP sXP] := Sylow_superset sXE pX.
+ have [<- _]:= sAsylE P sylP; have [_ pP _] := and3P sylP.
+ by rewrite (OhmE 1 pP) sub_gen // subsetI sXP sub_LdivT.
+have defNMA: 'N_M(A) = E.
+ rewrite -mulMsE setIC -group_modr ?normal_norm //= setIC.
+ rewrite coprime_norm_cent ?regA ?mul1g //.
+ exact: (pnat_coprime (pcore_pgroup _ _) (pi_pnat pA _)).
+have [sCAM _]: 'C(A) \subset M /\ _ := p2Elem_mmax maxM Ep2A_M.
+have sCAE: 'C(A) \subset E by rewrite -defNMA subsetI sCAM cent_sub.
+split=> // [X EpX | H maxH not_MGH]; last first.
+ by case/sigma_disjoint: not_MGH => // _ _; apply; apply: tau2_Msigma_nil t2Mp.
+rewrite defEpE in EpX; have [sXA abelX dimX] := pnElemP EpX.
+have ntX: X :!=: 1 by rewrite -rank_gt0 (rank_abelem abelX) dimX.
+apply: contraNeq => neq_maxCX_M.
+have{neq_maxCX_M} [H]: exists2 H, H \in 'M('C(X)) & H \notin [set M].
+ apply/subsetPn; rewrite subset1 negb_or neq_maxCX_M.
+ by have [H maxH]:= mmax_exists (mFT_cent_proper ntX); apply/set0Pn; exists H.
+case/setIdP=> maxH sCXH neqHM.
+rewrite -subG1 -(tiMsMA H) ?setIS // inE neqHM inE maxH.
+exact: subset_trans (sub_abelian_cent cAA sXA) sCXH.
+Qed.
+
+(* This is B & G, Corollary 12.6 (d, e) -- the parts that apply to a *)
+(* particular decomposition of the complement. We included an easy consequece *)
+(* of part (a), that A is a subgroup of E2, as this is used implicitly later *)
+(* in sections 12 and 13. *)
+Corollary tau2_regular M E E1 E2 E3 p A (Ms := M`_\sigma) :
+ M \in 'M -> sigma_complement M E E1 E2 E3 ->
+ p \in \tau2(M) -> A \in 'E_p^2(E) ->
+ [/\ (*d*) semiregular Ms E3,
+ (*e*) semiregular Ms 'C_E1(A)
+ & A \subset E2].
+Proof.
+move=> maxM complEi t2Mp Ep2A; have p_pr := pnElem_prime Ep2A.
+have [hallE hallE1 hallE2 hallE3 _] := complEi.
+have [sEM sM'E _] := and3P hallE; have [sM'p _] := andP t2Mp.
+have [sAE abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
+have Ep2A_M: A \in 'E_p^2(M) by rewrite (subsetP (pnElemS _ _ sEM)).
+have [_ _ _ tiMsMA _] := tau2_context maxM t2Mp Ep2A_M.
+have [[nsAE _] _ _ _] := tau2_compl_context maxM hallE t2Mp Ep2A.
+have [sCAM _]: 'C(A) \subset M /\ _ := p2Elem_mmax maxM Ep2A_M.
+have sAE2: A \subset E2.
+ exact: normal_sub_max_pgroup (Hall_max hallE2) (pi_pnat pA _) nsAE.
+split=> // x /setD1P[ntx]; last first.
+ case/setIP; rewrite -cent_cycle -!cycle_subG => sXE1 cAX.
+ pose q := pdiv #[x]; have piXq: q \in \pi(#[x]) by rewrite pi_pdiv order_gt1.
+ have [Q sylQ] := Sylow_exists q <[x]>; have [sQX qQ _] := and3P sylQ.
+ have [sE1E t1E1 _] := and3P hallE1; have sQE1 := subset_trans sQX sXE1.
+ have sQM := subset_trans sQE1 (subset_trans sE1E sEM).
+ have [H /setIdP[maxH sNQH]]: {H | H \in 'M('N(Q))}.
+ apply: mmax_exists; rewrite mFT_norm_proper ?(mFT_pgroup_proper qQ) //.
+ by rewrite -rank_gt0 (rank_pgroup qQ) (p_rank_Sylow sylQ) p_rank_gt0.
+ apply/trivgP; rewrite -(tiMsMA H) ?setIS //.
+ by rewrite (subset_trans _ sNQH) ?cents_norm ?centS.
+ rewrite 3!inE maxH /=; apply/andP; split.
+ apply: contra_orbit (mmax_norm_notJ maxM maxH qQ sQM sNQH _).
+ by rewrite (pnatPpi (pgroupS sXE1 t1E1)) ?orbT.
+ by rewrite (subset_trans _ sNQH) ?cents_norm // centsC (subset_trans sQX).
+rewrite -cent_cycle -cycle_subG => sXE3.
+pose q := pdiv #[x]; have piXq: q \in \pi(#[x]) by rewrite pi_pdiv order_gt1.
+have [Q sylQ] := Sylow_exists q <[x]>; have [sQX qQ _] := and3P sylQ.
+have [sE3E t3E3 _] := and3P hallE3; have sQE3 := subset_trans sQX sXE3.
+have sQM := subset_trans sQE3 (subset_trans sE3E sEM).
+have [H /setIdP[maxH sNQH]]: {H | H \in 'M('N(Q))}.
+ apply: mmax_exists; rewrite mFT_norm_proper ?(mFT_pgroup_proper qQ) //.
+ by rewrite -rank_gt0 (rank_pgroup qQ) (p_rank_Sylow sylQ) p_rank_gt0.
+apply/trivgP; rewrite -(tiMsMA H) ?setIS //.
+ by rewrite (subset_trans _ sNQH) ?cents_norm ?centS.
+rewrite 3!inE maxH /=; apply/andP; split.
+ apply: contra_orbit (mmax_norm_notJ maxM maxH qQ sQM sNQH _).
+ by rewrite (pnatPpi (pgroupS sXE3 t3E3)) ?orbT.
+rewrite (subset_trans _ sNQH) ?cents_norm // (subset_trans _ (centS sQE3)) //.
+have coE3A: coprime #|E3| #|A|.
+ by rewrite (pnat_coprime t3E3 (pi_pnat pA _)) ?tau3'2.
+rewrite (sameP commG1P trivgP) -(coprime_TIg coE3A) subsetI commg_subl.
+have [[_ nsE3E] _ _ _ _] := sigma_compl_context maxM complEi.
+by rewrite commg_subr (subset_trans sE3E) ?(subset_trans sAE) ?normal_norm.
+Qed.
+
+(* This is B & G, Theorem 12.7. *)
+Theorem nonabelian_tau2 M E p A P0 (Ms := M`_\sigma) (A0 := 'C_A(Ms)%G) :
+ M \in 'M -> \sigma(M)^'.-Hall(M) E -> p \in \tau2(M) -> A \in 'E_p^2(E) ->
+ p.-group P0 -> ~~ abelian P0 ->
+ [/\ (*a*) \tau2(M) =i (p : nat_pred),
+ (*b*) #|A0| = p /\ Ms \x A0 = 'F(M),
+ (*c*) forall X,
+ X \in 'E_p^1(E) :\ A0 -> 'C_Ms(X) = 1 /\ ~~ ('C(X) \subset M)
+ & (*d*) exists2 E0 : {group gT}, A0 ><| E0 = E
+ & (*e*) forall x, x \in Ms^# -> {subset \pi('C_E0[x]) <= \tau1(M)}].
+Proof.
+rewrite {}/A0 => maxM hallE t2Mp Ep2A pP0 not_cP0P0 /=.
+have p_pr := pnElem_prime Ep2A.
+have [sEM sM'E _] := and3P hallE; have [sM'p _] := andP t2Mp.
+have [sAE abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
+have Ep2A_M: A \in 'E_p^2(M) by rewrite (subsetP (pnElemS _ _ sEM)).
+have [[E1 hallE1] [E3 hallE3]] := ex_tau13_compl hallE.
+have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
+have [regE3 _ sAE2] := tau2_regular maxM complEi t2Mp Ep2A.
+have [P sylP sAP] := Sylow_superset sAE2 pA; have [sPE2 pP _] := and3P sylP.
+have [S /= sylS sPS] := Sylow_superset (subsetT P) pP.
+have pS := pHall_pgroup sylS; have sAS := subset_trans sAP sPS.
+have sylP_E: p.-Sylow(E) P := subHall_Sylow hallE2 t2Mp sylP.
+have sylP_M: p.-Sylow(M) P := subHall_Sylow hallE sM'p sylP_E.
+have [syl_p_M _ regA _ _] := tau2_context maxM t2Mp Ep2A_M.
+have{syl_p_M} cPP: abelian P by case: (syl_p_M P).
+have{P0 pP0 not_cP0P0} not_cSS: ~~ abelian S.
+ have [x _ sP0Sx] := Sylow_subJ sylS (subsetT P0) pP0.
+ by apply: contra not_cP0P0 => cSS; rewrite (abelianS sP0Sx) ?abelianJ.
+have [defP | ltPS] := eqVproper sPS; first by rewrite -defP cPP in not_cSS.
+have [[nsAE defEp] [sCAE _ _] nregA _] :=
+ tau2_compl_context maxM hallE t2Mp Ep2A.
+have defCSA: 'C_S(A) = P.
+ apply: (sub_pHall sylP_E (pgroupS (subsetIl _ _) pS)).
+ by rewrite subsetI sPS (sub_abelian_cent2 cPP).
+ by rewrite subIset // sCAE orbT.
+have max2A: A \in 'E_p^2(G) :&: 'E*_p(G).
+ by rewrite 3!inE subsetT abelA dimA; case: (tau2_not_beta maxM t2Mp) => _ ->.
+have def_t2: \tau2(M) =i (p : nat_pred).
+ move=> q; apply/idP/idP=> [t2Mq |]; last by move/eqnP->.
+ apply: contraLR (proper_card ltPS); rewrite !inE /= eq_sym -leqNgt => q'p.
+ apply: wlog_neg => p'q; have [B EqB] := p_rank_witness q E.
+ have{EqB} Eq2B: B \in 'E_q^2(E).
+ by move: t2Mq; rewrite (tau2E hallE) => /andP[_ /eqP <-].
+ have [sBE abelB dimB]:= pnElemP Eq2B; have [qB _] := andP abelB.
+ have coBA: coprime #|B| #|A| by exact: pnat_coprime qB (pi_pnat pA _).
+ have [[nsBE _] [sCBE _ _] _ _] := tau2_compl_context maxM hallE t2Mq Eq2B.
+ have nBA: A \subset 'N(B) by rewrite (subset_trans sAE) ?normal_norm.
+ have cAB: B \subset 'C(A).
+ rewrite (sameP commG1P trivgP) -(coprime_TIg coBA) subsetI commg_subl nBA.
+ by rewrite commg_subr (subset_trans sBE) ?normal_norm.
+ have{cAB} qCA: q %| #|'C(A)|.
+ by apply: dvdn_trans (cardSg cAB); rewrite (card_pnElem Eq2B) dvdn_mull.
+ have [Q maxQ sBQ] := max_normed_exists qB nBA.
+ have nnQ: q.-narrow Q.
+ apply/implyP=> _; apply/set0Pn; exists B.
+ rewrite 3!inE sBQ abelB dimB (subsetP (pmaxElemS q (subsetT Q))) //=.
+ rewrite setIC 2!inE sBQ; case: (tau2_not_beta maxM t2Mq) => _ -> //.
+ by rewrite (subsetP (pnElemS _ _ sEM)).
+ have [P1 [sylP1 _] [_ _]] := max_normed_2Elem_signaliser q'p max2A maxQ qCA.
+ move/(_ nnQ)=> cQP1; have sylP1_E: p.-Sylow(E) P1.
+ apply: pHall_subl (subset_trans _ sCBE) (subsetT E) sylP1.
+ exact: subset_trans (centS sBQ).
+ rewrite (card_Hall sylS) -(card_Hall sylP1).
+ by rewrite (card_Hall sylP_E) -(card_Hall sylP1_E).
+have coMsA: coprime #|Ms| #|A|.
+ by exact: pnat_coprime (pcore_pgroup _ _) (pi_pnat pA _).
+have defMs: <<\bigcup_(X in 'E_p^1(A)) 'C_Ms(X)>> = Ms.
+ have ncycA: ~~ cyclic A by rewrite (abelem_cyclic abelA) dimA.
+ have [sAM _ _] := pnElemP Ep2A_M.
+ have{sAM} nMsA: A \subset 'N(Ms) by rewrite (subset_trans sAM) ?gFnorm.
+ apply/eqP; rewrite eqEsubset andbC gen_subG.
+ rewrite -{1}[Ms](coprime_abelian_gen_cent1 cAA ncycA nMsA coMsA).
+ rewrite genS; apply/bigcupsP=> x; rewrite ?subsetIl //; case/setD1P=> ntx Ax.
+ rewrite /= -cent_cycle (bigcup_max <[x]>%G) // p1ElemE // .
+ by rewrite 2!inE cycle_subG Ax /= -orderE (abelem_order_p abelA).
+have [A0 EpA0 nregA0]: exists2 A0, A0 \in 'E_p^1(A) & 'C_Ms(A0) != 1.
+ apply/exists_inP; rewrite -negb_forall_in.
+ apply: contra (Msigma_neq1 maxM); move/forall_inP => regAp.
+ rewrite -/Ms -defMs -subG1 gen_subG; apply/bigcupsP=> X EpX.
+ by rewrite subG1 regAp.
+have uniqCA0: 'M('C(A0)) = [set M].
+ by rewrite nregA // (subsetP (pnElemS _ _ sAE)).
+have defSM: S :&: M = P.
+ apply: sub_pHall (pgroupS (subsetIl S M) pS) _ (subsetIr S M) => //.
+ by rewrite subsetI sPS (pHall_sub sylP_M).
+have{ltPS} not_sSM: ~~ (S \subset M).
+ by rewrite (sameP setIidPl eqP) defSM proper_neq.
+have not_sA0Z: ~~ (A0 \subset 'Z(S)).
+ apply: contra not_sSM; rewrite subsetI centsC; case/andP=> _ sS_CA0.
+ by case/mem_uniq_mmax: uniqCA0 => _; exact: subset_trans sS_CA0.
+have [EpZ0 dxCSA transNSA] := basic_p2maxElem_structure max2A pS sAS not_cSS.
+do [set Z0 := 'Ohm_1('Z(S))%G; set EpA' := _ :\ Z0] in EpZ0 dxCSA transNSA.
+have sZ0Z: Z0 \subset 'Z(S) := Ohm_sub 1 _.
+have [sA0A _ _] := pnElemP EpA0; have sA0P := subset_trans sA0A sAP.
+have EpA'_A0: A0 \in EpA'.
+ by rewrite 2!inE EpA0 andbT; apply: contraNneq not_sA0Z => ->.
+have{transNSA sAP not_sSM defSM} regA0' X:
+ X \in 'E_p^1(E) :\ A0 -> 'C_Ms(X) = 1 /\ ~~ ('C(X) \subset M).
+- case/setD1P=> neqXA0 EpX.
+ suffices not_sCXM: ~~ ('C(X) \subset M).
+ split=> //; apply: contraNeq not_sCXM => nregX.
+ by case/mem_uniq_mmax: (nregA X EpX nregX).
+ have [sXZ | not_sXZ] := boolP (X \subset 'Z(S)).
+ apply: contra (subset_trans _) not_sSM.
+ by rewrite centsC (subset_trans sXZ) ?subsetIr.
+ have EpA'_X: X \in EpA'.
+ by rewrite 2!inE -defEp EpX andbT; apply: contraNneq not_sXZ => ->.
+ have [g NSAg /= defX] := atransP2 transNSA EpA'_A0 EpA'_X.
+ have{NSAg} [Sg nAg] := setIP NSAg.
+ have neqMgM: M :^ g != M.
+ rewrite (sameP eqP normP) (norm_mmax maxM); apply: contra neqXA0 => Mg.
+ rewrite defX [_ == _](sameP eqP normP) (subsetP (cent_sub A0)) //.
+ by rewrite (subsetP (centSS (subxx _) sA0P cPP)) // -defSM inE Sg.
+ apply: contra neqMgM; rewrite defX centJ sub_conjg.
+ by move/(eq_uniq_mmax uniqCA0) => defM; rewrite -{1}defM ?mmaxJ ?actKV.
+have{defMs} defA0: 'C_A(Ms) = A0.
+ apply/eqP; rewrite eq_sym eqEcard subsetI sA0A (card_pnElem EpA0).
+ have pCA: p.-group 'C_A(Ms) := pgroupS (subsetIl A _) pA.
+ rewrite andbC (card_pgroup pCA) leq_exp2l ?prime_gt1 // -ltnS -dimA.
+ rewrite properG_ltn_log //=; last first.
+ rewrite properE subsetIl /= subsetI subxx centsC -(subxx Ms) -subsetI.
+ by rewrite regA subG1 Msigma_neq1.
+ rewrite centsC -defMs gen_subG (big_setD1 A0) //= subUset subsetIr /=.
+ by apply/bigcupsP=> X; rewrite -defEp; case/regA0'=> -> _; rewrite sub1G.
+rewrite defA0 (group_inj defA0) (card_pnElem EpA0).
+have{dxCSA} [Y [cycY sZ0Y]] := dxCSA; move/(_ _ EpA'_A0)=> dxCSA.
+have defCP_Ms: 'C_P(Ms) = A0.
+ move: dxCSA; rewrite defCSA => /dprodP[_ mulA0Y cA0Y tiA0Y].
+ rewrite -mulA0Y -group_modl /=; last by rewrite -defA0 subsetIr.
+ rewrite setIC TI_Ohm1 ?mulg1 // setIC.
+ have pY: p.-group Y by rewrite (pgroupS _ pP) // -mulA0Y mulG_subr.
+ have cYY: abelian Y := cyclic_abelian cycY.
+ have ->: 'Ohm_1(Y) = Z0.
+ apply/eqP; rewrite eq_sym eqEcard (card_pnElem EpZ0) /= -['Ohm_1(_)]Ohm_id.
+ rewrite OhmS // (card_pgroup (pgroupS (Ohm_sub 1 Y) pY)).
+ rewrite leq_exp2l ?prime_gt1 -?p_rank_abelian // -rank_pgroup //.
+ by rewrite -abelian_rank1_cyclic.
+ rewrite prime_TIg ?(card_pnElem EpZ0) // centsC (sameP setIidPl eqP) eq_sym.
+ case: (regA0' Z0) => [|-> _]; last exact: Msigma_neq1.
+ by rewrite 2!inE defEp EpZ0 andbT; apply: contraNneq not_sA0Z => <-.
+have [sPM pA0] := (pHall_sub sylP_M, pgroupS sA0A pA).
+have cMsA0: A0 \subset 'C(Ms) by rewrite -defA0 subsetIr.
+have nsA0M: A0 <| M.
+ have [_ defM nMsE _] := sdprodP (sdprod_sigma maxM hallE).
+ rewrite /normal (subset_trans sA0P) // -defM mulG_subG cents_norm 1?centsC //.
+ by rewrite -defA0 normsI ?norms_cent // normal_norm.
+have defFM: Ms \x A0 = 'F(M).
+ have nilF := Fitting_nil M.
+ rewrite dprodE ?(coprime_TIg (coprimegS sA0A coMsA)) //.
+ have [_ /= defFM cFpp' _] := dprodP (nilpotent_pcoreC p nilF).
+ have defFp': 'O_p^'('F(M)) = Ms.
+ apply/eqP; rewrite eqEsubset.
+ rewrite (sub_Hall_pcore (Msigma_Hall maxM)); last first.
+ exact: subset_trans (pcore_sub _ _) (Fitting_sub _).
+ rewrite /pgroup (sub_in_pnat _ (pcore_pgroup _ _)) => [|q piFq]; last first.
+ have [Q sylQ] := Sylow_exists q 'F(M); have [sQF qQ _] := and3P sylQ.
+ have ntQ: Q :!=: 1.
+ rewrite -rank_gt0 (rank_pgroup qQ) (p_rank_Sylow sylQ) p_rank_gt0.
+ by rewrite (piSg _ piFq) ?pcore_sub.
+ have sNQM: 'N(Q) \subset M.
+ rewrite (mmax_normal maxM) // (nilpotent_Hall_pcore nilF sylQ).
+ by rewrite p_core_Fitting pcore_normal.
+ apply/implyP; rewrite implyNb /= -def_t2 orbC.
+ by rewrite (prime_class_mmax_norm maxM qQ).
+ rewrite pcore_max ?(pi_p'group (pcore_pgroup _ _)) //.
+ rewrite /normal (subset_trans (Fitting_sub M)) ?gFnorm //.
+ rewrite Fitting_max ?pcore_normal ?(tau2_Msigma_nil _ t2Mp) //.
+ rewrite p_core_Fitting defFp' centsC in defFM cFpp'.
+ rewrite -defFM (centC cFpp'); congr (Ms * _).
+ apply/eqP; rewrite eqEsubset pcore_max //.
+ by rewrite -defCP_Ms subsetI cFpp' pcore_sub_Hall.
+split=> {defFM}//.
+have [[sE1E t1E1 _] t2E2] := (and3P hallE1, pHall_pgroup hallE2).
+have defE2: E2 :=: P by rewrite (sub_pHall sylP) // -(eq_pgroup _ def_t2) t2E2.
+have [[_ nsE3E] _ _ [defEr _] _] := sigma_compl_context maxM complEi.
+have [sE3E nE3E] := andP nsE3E; have{nE3E} nE3E := subset_trans _ nE3E.
+have [[_ E21 _ defE21]] := sdprodP defEr; rewrite defE21 => defE nE321 tiE321.
+rewrite defE2 in defE21; have{defE21} [_ defPE1 nPE1 tiPE1] := sdprodP defE21.
+have [P0 defP nP0E1]: exists2 P0 : {group gT}, A0 \x P0 = P & E1 \subset 'N(P0).
+ have p'E1b: p^'.-group (E1 / 'Phi(P)).
+ rewrite quotient_pgroup //; apply: sub_pgroup t1E1 => q /tau2'1.
+ by rewrite inE /= def_t2.
+ have defPhiP: 'Phi(P) = 'Phi(Y).
+ have [_ _ cA0Y tiA0Y] := dprodP dxCSA.
+ rewrite defCSA dprodEcp // in dxCSA.
+ have [_ abelA0 _] := pnElemP EpA0; rewrite -trivg_Phi // in abelA0.
+ by rewrite -(Phi_cprod pP dxCSA) (eqP abelA0) cprod1g.
+ have abelPb := Phi_quotient_abelem pP; have sA0Pb := quotientS 'Phi(P) sA0P.
+ have [||P0b] := Maschke_abelem abelPb p'E1b sA0Pb; rewrite ?quotient_norms //.
+ by rewrite (subset_trans (subset_trans sE1E sEM)) ?normal_norm.
+ case/dprodP=> _ defPb _ tiAP0b nP0E1b.
+ have sP0Pb: P0b \subset P / 'Phi(P) by rewrite -defPb mulG_subr.
+ have [P0 defP0b sPhiP0 sP0P] := inv_quotientS (Phi_normal P) sP0Pb.
+ exists P0; last first.
+ rewrite -(quotientSGK (char_norm_trans (Phi_char P) nPE1)); last first.
+ by rewrite cents_norm ?(sub_abelian_cent2 cPP (Phi_sub P) sP0P).
+ by rewrite quotient_normG -?defP0b ?(normalS _ _ (Phi_normal P)).
+ rewrite dprodEY ?(sub_abelian_cent2 cPP) //.
+ apply/eqP; rewrite eqEsubset join_subG sA0P sP0P /=.
+ rewrite -(quotientSGK (normal_norm (Phi_normal P))) //=; last first.
+ by rewrite sub_gen // subsetU // sPhiP0 orbT.
+ rewrite cent_joinEr ?(sub_abelian_cent2 cPP) //.
+ rewrite quotientMr //; last by rewrite (subset_trans sP0P) ?gFnorm.
+ by rewrite -defP0b defPb.
+ apply/trivgP; case/dprodP: dxCSA => _ _ _ <-.
+ rewrite subsetI subsetIl (subset_trans _ (Phi_sub Y)) // -defPhiP.
+ rewrite -quotient_sub1 ?subIset ?(subset_trans sA0P) ?gFnorm //.
+ by rewrite quotientIG // -defP0b tiAP0b.
+have nA0E := subset_trans _ (subset_trans sEM (normal_norm nsA0M)).
+have{defP} [_ defAP0 _ tiAP0] := dprodP defP.
+have sP0P: P0 \subset P by rewrite -defAP0 mulG_subr.
+have sP0E := subset_trans sP0P (pHall_sub sylP_E).
+pose E0 := (E3 <*> (P0 <*> E1))%G.
+have sP0E1_E: P0 <*> E1 \subset E by rewrite join_subG sP0E.
+have sE0E: E0 \subset E by rewrite join_subG sE3E.
+have mulA0E0: A0 * E0 = E.
+ rewrite /= (norm_joinEr (nE3E _ sP0E1_E)) mulgA -(normC (nA0E _ sE3E)).
+ by rewrite /= -mulgA (norm_joinEr nP0E1) (mulgA A0) defAP0 defPE1.
+have tiA0E0: A0 :&: E0 = 1.
+ rewrite cardMg_TI // mulA0E0 -defE /= (norm_joinEr (nE3E _ sP0E1_E)).
+ rewrite !TI_cardMg //; last first.
+ by apply/trivgP; rewrite -tiE321 setIS //= ?norm_joinEr // -defPE1 mulSg.
+ rewrite mulnCA /= leq_mul // norm_joinEr //= -defPE1.
+ rewrite !TI_cardMg //; last by apply/trivgP; rewrite -tiPE1 setSI.
+ by rewrite mulnA -(TI_cardMg tiAP0) defAP0.
+have defAE0: A0 ><| E0 = E by rewrite sdprodE ?nA0E.
+exists E0 => // x /setD1P[ntx Ms_x] q piCE0x_q.
+have: q \in \pi(E) by apply: piSg piCE0x_q; rewrite subIset ?sE0E.
+rewrite mem_primes in piCE0x_q; case/and3P: piCE0x_q => q_pr _.
+case/Cauchy=> // z /setIP[E0z cxz] oz.
+have ntz: z != 1 by rewrite -order_gt1 oz prime_gt1.
+have ntCMs_z: 'C_Ms[z] != 1.
+ apply: contraNneq ntx => reg_z; rewrite (sameP eqP set1gP) -reg_z inE Ms_x.
+ by rewrite cent1C.
+rewrite (partition_pi_sigma_compl maxM hallE) def_t2.
+case/or3P => [-> // | pq | t3Mq].
+ have EpA0'_z: <[z]>%G \in 'E_p^1(E) :\ A0.
+ rewrite p1ElemE // !inE -orderE oz (eqnP pq) eqxx cycle_subG.
+ rewrite (subsetP sE0E) // !andbT; apply: contraNneq ntz => eqA0z.
+ by rewrite (sameP eqP set1gP) -tiA0E0 inE -eqA0z cycle_id E0z.
+ have [reg_z _] := regA0' _ EpA0'_z.
+ by rewrite -cent_cycle reg_z eqxx in ntCMs_z.
+rewrite regE3 ?eqxx // !inE ntz /= in ntCMs_z.
+by rewrite (mem_normal_Hall hallE3 nsE3E) ?(subsetP sE0E) // /p_elt oz pnatE.
+Qed.
+
+(* This is B & G, Theorem 12.8(c). This part does not use the decompotision *)
+(* of the complement, and needs to be proved ahead because it is used with *)
+(* different primes in \tau_2(M) in the main argument. We also include an *)
+(* auxiliary identity, which is needed in another part of the proof of 12.8. *)
+Theorem abelian_tau2_sub_Fitting M E p A S :
+ M \in 'M -> \sigma(M)^'.-Hall(M) E ->
+ p \in \tau2(M) -> A \in 'E_p^2(E) ->
+ p.-Sylow(G) S -> A \subset S -> abelian S ->
+ [/\ S \subset 'N(S)^`(1),
+ 'N(S)^`(1) \subset 'F(E),
+ 'F(E) \subset 'C(S),
+ 'C(S) \subset E
+ & 'F('N(A)) = 'F(E)].
+Proof.
+move=> maxM hallE t2Mp Ep2A sylS sAS cSS.
+have [sAE abelA dimA]:= pnElemP Ep2A; have [pA cAA _] := and3P abelA.
+have [sEM sM'E _] := and3P hallE.
+have Ep2A_M := subsetP (pnElemS p 2 sEM) A Ep2A.
+have eqFC H: A <| H -> 'C(A) \subset H -> 'F(H) = 'F('C(A)).
+ move=> nsAH sCH; have [_ nAH] := andP nsAH.
+ apply/eqP; rewrite eqEsubset !Fitting_max ?Fitting_nil //.
+ by rewrite (char_normal_trans (Fitting_char _)) // /normal sCH norms_cent.
+ apply: normalS sCH (Fitting_normal H).
+ have [_ defF cFpFp' _] := dprodP (nilpotent_pcoreC p (Fitting_nil H)).
+ have sAFp: A \subset 'O_p('F(H)) by rewrite p_core_Fitting pcore_max.
+ have [x _ sFpSx] := Sylow_subJ sylS (subsetT _) (pcore_pgroup p 'F(H)).
+ have cFpFp: abelian 'O_p('F(H)) by rewrite (abelianS sFpSx) ?abelianJ.
+ by rewrite -defF mulG_subG (centSS _ _ cFpFp) // (centSS _ _ cFpFp').
+have [[nsAE _] [sCAE _] _ _ _] := tau2_compl_context maxM hallE t2Mp Ep2A.
+have eqFN_FE: 'F('N(A)) = 'F(E) by rewrite (eqFC E) // eqFC ?cent_sub ?normalG.
+have sN'FN: 'N(A)^`(1) \subset 'F('N(A)).
+ rewrite rank2_der1_sub_Fitting ?mFT_odd //.
+ rewrite ?mFT_sol // mFT_norm_proper ?(mFT_pgroup_proper pA) //.
+ by rewrite -rank_gt0 (rank_abelem abelA) dimA.
+ rewrite eqFN_FE (leq_trans (rankS (Fitting_sub E))) //.
+ have [q q_pr ->]:= rank_witness E; apply: wlog_neg; rewrite -ltnNge => rEgt2.
+ rewrite (leq_trans (p_rankS q sEM)) // leqNgt.
+ apply: contra ((alpha_sub_sigma maxM) q) (pnatPpi sM'E _).
+ by rewrite -p_rank_gt0 (leq_trans _ rEgt2).
+have sSE: S \subset E by rewrite (subset_trans _ sCAE) // (centSS _ _ cSS).
+have nA_NS: 'N(S) \subset 'N(A).
+ have [ ] := tau2_context maxM t2Mp Ep2A_M; have sSM := subset_trans sSE sEM.
+ have sylS_M: p.-Sylow(M) S := pHall_subl sSM (subsetT M) sylS.
+ by case/(_ S) => // _ [// |<- _] _ _ _ _; exact: char_norms (Ohm_char 1 _).
+have sS_NS': S \subset 'N(S)^`(1) := mFT_Sylow_der1 sylS.
+have sNS'_FE: 'N(S)^`(1) \subset 'F(E).
+ by rewrite -eqFN_FE (subset_trans (dergS 1 nA_NS)).
+split=> //; last by rewrite (subset_trans (centS sAS)).
+have sSFE := subset_trans sS_NS' sNS'_FE; have nilFE := Fitting_nil E.
+have sylS_FE := pHall_subl sSFE (subsetT 'F(E)) sylS.
+suff sSZF: S \subset 'Z('F(E)) by rewrite centsC (subset_trans sSZF) ?subsetIr.
+have [_ <- _ _] := dprodP (center_dprod (nilpotent_pcoreC p nilFE)).
+by rewrite -(nilpotent_Hall_pcore nilFE sylS_FE) (center_idP cSS) mulG_subl.
+Qed.
+
+(* This is B & G, Theorem 12.8(a,b,d,e) -- the bulk of the Theorem. We prove *)
+(* part (f) separately below, as it does not depend on a decomposition of the *)
+(* complement. *)
+Theorem abelian_tau2 M E E1 E2 E3 p A S (Ms := M`_\sigma) :
+ M \in 'M -> sigma_complement M E E1 E2 E3 ->
+ p \in \tau2(M) -> A \in 'E_p^2(E) ->
+ p.-Sylow(G) S -> A \subset S -> abelian S ->
+ [/\ (*a*) E2 <| E /\ abelian E2,
+ (*b*) \tau2(M).-Hall(G) E2,
+ (*d*) [/\ 'N(A) = 'N(S),
+ 'N(S) = 'N(E2),
+ 'N(E2) = 'N(E3 <*> E2)
+ & 'N(E3 <*> E2) = 'N('F(E))]
+ & (*e*) forall X, X \in 'E^1(E1) -> 'C_Ms(X) = 1 -> X \subset 'Z(E)].
+Proof.
+move=> maxM complEi t2Mp Ep2A sylS sAS cSS.
+have [hallE hallE1 hallE2 hallE3 _] := complEi.
+have [sEM sM'E _] := and3P hallE.
+have [sE1E t1E1 _] := and3P hallE1.
+have [sE2E t2E2 _] := and3P hallE2.
+have [sE3E t3E3 _] := and3P hallE3.
+have nilF: nilpotent 'F(E) := Fitting_nil E.
+have sylE2_sylG_ZFE q Q:
+ q.-Sylow(E2) Q -> Q :!=: 1 -> q.-Sylow(G) Q /\ Q \subset 'Z('F(E)).
+- move=> sylQ ntQ; have [sQE2 qQ _] := and3P sylQ.
+ have piQq: q \in \pi(Q) by rewrite -p_rank_gt0 -rank_pgroup // rank_gt0.
+ have t2Mq: q \in \tau2(M) by rewrite (pnatPpi t2E2) // (piSg sQE2).
+ have sylQ_E: q.-Sylow(E) Q := subHall_Sylow hallE2 t2Mq sylQ.
+ have rqQ: 'r_q(Q) = 2.
+ rewrite (tau2E hallE) !inE -(p_rank_Sylow sylQ_E) in t2Mq.
+ by case/andP: t2Mq => _ /eqP.
+ have [B Eq2B sBQ]: exists2 B, B \in 'E_q^2(E) & B \subset Q.
+ have [B Eq2B] := p_rank_witness q Q; have [sBQ abelB rBQ] := pnElemP Eq2B.
+ exists B; rewrite // !inE rBQ rqQ abelB !andbT.
+ exact: subset_trans sBQ (pHall_sub sylQ_E).
+ have [T /= sylT sQT] := Sylow_superset (subsetT Q) qQ.
+ have qT: q.-group T := pHall_pgroup sylT.
+ have cTT: abelian T.
+ apply: wlog_neg => not_cTT.
+ have [def_t2 _ _ _] := nonabelian_tau2 maxM hallE t2Mq Eq2B qT not_cTT.
+ rewrite def_t2 !inE in t2Mp; rewrite (eqP t2Mp) in sylS.
+ by have [x _ ->] := Sylow_trans sylS sylT; rewrite abelianJ.
+ have sTF: T \subset 'F(E).
+ have subF := abelian_tau2_sub_Fitting maxM hallE t2Mq Eq2B sylT.
+ have [sTN' sN'F _ _ _] := subF (subset_trans sBQ sQT) cTT.
+ exact: subset_trans sTN' sN'F.
+ have sTE: T \subset E := subset_trans sTF (Fitting_sub E).
+ have <-: T :=: Q by apply: (sub_pHall sylQ_E).
+ have sylT_F: q.-Sylow('F(E)) T := pHall_subl sTF (subsetT _) sylT.
+ have [_ <- _ _] := dprodP (center_dprod (nilpotent_pcoreC q nilF)).
+ by rewrite -(nilpotent_Hall_pcore nilF sylT_F) (center_idP cTT) mulG_subl.
+have hallE2_G: \tau2(M).-Hall(G) E2.
+ rewrite pHallE subsetT /= -(part_pnat_id t2E2); apply/eqnP.
+ rewrite !(widen_partn _ (subset_leq_card (subsetT _))).
+ apply: eq_bigr => q t2q; rewrite -!p_part.
+ have [Q sylQ] := Sylow_exists q E2; have qQ := pHall_pgroup sylQ.
+ have sylQ_E: q.-Sylow(E) Q := subHall_Sylow hallE2 t2q sylQ.
+ have ntQ: Q :!=: 1.
+ rewrite -rank_gt0 (rank_pgroup qQ) (p_rank_Sylow sylQ_E) p_rank_gt0.
+ by rewrite (tau2E hallE) in t2q; case/andP: t2q.
+ have [sylQ_G _] := sylE2_sylG_ZFE q Q sylQ ntQ.
+ by rewrite -(card_Hall sylQ) -(card_Hall sylQ_G).
+have sE2_ZFE: E2 \subset 'Z('F(E)).
+ rewrite -Sylow_gen gen_subG; apply/bigcupsP=> Q; case/SylowP=> q q_pr sylQ.
+ have [-> | ntQ] := eqsVneq Q 1; first exact: sub1G.
+ by have [_ ->] := sylE2_sylG_ZFE q Q sylQ ntQ.
+have cE2E2: abelian E2 := abelianS sE2_ZFE (center_abelian _).
+have sE2FE: E2 \subset 'F(E) := subset_trans sE2_ZFE (center_sub _).
+have nsE2E: E2 <| E.
+ have hallE2_F := pHall_subl sE2FE (Fitting_sub E) hallE2.
+ rewrite (nilpotent_Hall_pcore nilF hallE2_F).
+ exact: char_normal_trans (pcore_char _ _) (Fitting_normal E).
+have [_ _ [cycE1 cycE3] [_ defEl] _] := sigma_compl_context maxM complEi.
+have [[K _ defK _] _ _ _] := sdprodP defEl; rewrite defK in defEl.
+have [nsKE _ mulKE1 nKE1 _] := sdprod_context defEl; have [sKE _] := andP nsKE.
+have [nsE3K sE2K _ nE32 tiE32] := sdprod_context defK.
+rewrite -sdprodEY // defK.
+have{defK} defK: E3 \x E2 = K.
+ rewrite dprodEsd // (sameP commG1P trivgP) -tiE32 subsetI commg_subr nE32.
+ by rewrite commg_subl (subset_trans sE3E) ?normal_norm.
+have cKK: abelian K.
+ by have [_ <- cE23 _] := dprodP defK; rewrite abelianM cE2E2 cyclic_abelian.
+have [_ sNS'F _ sCS_E defFN] :=
+ abelian_tau2_sub_Fitting maxM hallE t2Mp Ep2A sylS sAS cSS.
+have{sCS_E} sSE2: S \subset E2.
+ rewrite (sub_normal_Hall hallE2 nsE2E (subset_trans cSS sCS_E)).
+ by rewrite (pi_pgroup (pHall_pgroup sylS)).
+have charS: S \char E2.
+ have sylS_E2: p.-Sylow(E2) S := pHall_subl sSE2 (subsetT E2) sylS.
+ by rewrite (nilpotent_Hall_pcore (abelian_nil cE2E2) sylS_E2) pcore_char.
+have nsSE: S <| E := char_normal_trans charS nsE2E; have [sSE nSE] := andP nsSE.
+have charA: A \char S.
+ have Ep2A_M := subsetP (pnElemS p 2 sEM) A Ep2A.
+ have sylS_M := pHall_subl (subset_trans sSE sEM) (subsetT M) sylS.
+ have [] := tau2_context maxM t2Mp Ep2A_M; case/(_ S sylS_M)=> _ [//|<- _].
+ by rewrite Ohm_char.
+have charE2: E2 \char K.
+ have hallE2_K := pHall_subl sE2K sKE hallE2.
+ by rewrite (nilpotent_Hall_pcore (abelian_nil cKK) hallE2_K) pcore_char.
+have coKE1: coprime #|K| #|E1|.
+ rewrite -(dprod_card defK) coprime_mull (sub_pnat_coprime tau3'1 t3E3 t1E1).
+ by rewrite (sub_pnat_coprime tau2'1 t2E2 t1E1).
+have hallK: Hall 'F(E) K.
+ have hallK: Hall E K.
+ by rewrite /Hall -divgS sKE //= -(sdprod_card defEl) mulKn.
+ have sKFE: K \subset 'F(E) by rewrite Fitting_max ?abelian_nil.
+ exact: pHall_Hall (pHall_subl sKFE (Fitting_sub E) (Hall_pi hallK)).
+have charK: K \char 'F(E).
+ by rewrite (nilpotent_Hall_pcore nilF (Hall_pi hallK)) pcore_char.
+have{defFN} [eqNAS eqNSE2 eqNE2K eqNKF]:
+ [/\ 'N(A) = 'N(S), 'N(S) = 'N(E2), 'N(E2) = 'N(K) & 'N(K) = 'N('F(E))].
+ have: #|'N(A)| <= #|'N('F(E))|.
+ by rewrite subset_leq_card // -defFN gFnorm.
+ have leCN := subset_leqif_cards (@char_norms gT _ _ _).
+ have trCN := leqif_trans (leCN _ _ _).
+ have leq_KtoA := trCN _ _ _ _ charE2 (trCN _ _ _ _ charS (leCN _ _ charA)).
+ rewrite (geq_leqif (trCN _ _ _ _ charK leq_KtoA)).
+ by case/and4P; do 4!move/eqP->.
+split=> // X E1_1_X regX.
+have cK_NK': 'N(K)^`(1) \subset 'C(K).
+ suffices sKZ: K \subset 'Z('F(E)).
+ by rewrite -eqNE2K -eqNSE2 (centSS sNS'F sKZ) // centsC subsetIr.
+ have{hallK} [pi hallK] := HallP hallK.
+ have [_ <- _ _] := dprodP (center_dprod (nilpotent_pcoreC pi nilF)).
+ by rewrite -(nilpotent_Hall_pcore nilF hallK) (center_idP cKK) mulG_subl.
+have [q EqX] := nElemP E1_1_X; have [sXE1 abelX dimX] := pnElemP EqX.
+have sXE := subset_trans sXE1 sE1E.
+have nKX := subset_trans sXE (normal_norm nsKE).
+have nCSX_NS: 'N(K) \subset 'N('C(K) * X).
+ rewrite -(quotientGK (cent_normal _)) -quotientK ?norms_cent //.
+ by rewrite morphpre_norms // sub_abelian_norm ?quotientS ?sub_der1_abelian.
+have nKX_NS: 'N(S) \subset 'N([~: K, X]).
+ have CK_K_1: [~: 'C(K), K] = 1 by apply/commG1P.
+ rewrite eqNSE2 eqNE2K commGC -[[~: X, K]]mul1g -CK_K_1.
+ by rewrite -commMG ?CK_K_1 ?norms1 ?normsR.
+have not_sNKX_M: ~~ ('N([~: K, X]) \subset M).
+ have [[sM'p _] sSM] := (andP t2Mp, subset_trans sSE sEM).
+ apply: contra sM'p => sNKX_M; apply/existsP; exists S.
+ by rewrite (pHall_subl sSM (subsetT _) sylS) // (subset_trans _ sNKX_M).
+have cKX: K \subset 'C(X).
+ apply: contraR not_sNKX_M; rewrite (sameP commG1P eqP) => ntKX.
+ rewrite (mmax_normal maxM) //.
+ have [sKM sM'K] := (subset_trans sKE sEM, pgroupS sKE sM'E).
+ have piE1q: q \in \pi(E1).
+ by rewrite -p_rank_gt0 -dimX logn_le_p_rank // inE sXE1.
+ have sM'q: q \in \sigma(M)^' by rewrite (pnatPpi sM'E) // (piSg sE1E).
+ have EpX_NK: X \in 'E_q^1('N_M(K)).
+ by apply: subsetP EqX; rewrite pnElemS // subsetI (subset_trans sE1E).
+ have q'K: q^'.-group K.
+ by rewrite p'groupEpi ?coprime_pi' // in coKE1 *; apply: (pnatPpi coKE1).
+ by have []:= commG_sigma'_1Elem_cyclic maxM sKM sM'K sM'q EpX_NK regX.
+rewrite subsetI sXE /= -mulKE1 centM subsetI centsC cKX.
+exact: subset_trans sXE1 (cyclic_abelian cycE1).
+Qed.
+
+(* This is B & G, Theorem 12.8(f). *)
+Theorem abelian_tau2_norm_Sylow M E p A S :
+ M \in 'M -> \sigma(M)^'.-Hall(M) E -> p \in \tau2(M) -> A \in 'E_p^2(E) ->
+ p.-Sylow(G) S -> A \subset S -> abelian S ->
+ forall X, X \subset 'N(S) -> 'C_S(X) <| 'N(S) /\ [~: S, X] <| 'N(S).
+Proof.
+move=> maxM hallE t2Mp Ep2A sylS sAS cSS X nSX.
+have [_ sNS'F sFCS _ _] :=
+ abelian_tau2_sub_Fitting maxM hallE t2Mp Ep2A sylS sAS cSS.
+have{sNS'F sFCS} sNS'CS: 'N(S)^`(1) \subset 'C(S) := subset_trans sNS'F sFCS.
+have nCSX_NS: 'N(S) \subset 'N('C(S) * X).
+ rewrite -quotientK ?norms_cent // -{1}(quotientGK (cent_normal S)).
+ by rewrite morphpre_norms // sub_abelian_norm ?quotientS ?sub_der1_abelian.
+rewrite /normal subIset ?comm_subG ?normG //=; split.
+ have ->: 'C_S(X) = 'C_S('C(S) * X).
+ by rewrite centM setIA; congr (_ :&: _); rewrite (setIidPl _) // centsC.
+ by rewrite normsI ?norms_cent.
+have CS_S_1: [~: 'C(S), S] = 1 by exact/commG1P.
+by rewrite commGC -[[~: X, S]]mul1g -CS_S_1 -commMG ?CS_S_1 ?norms1 ?normsR.
+Qed.
+
+(* This is B & G, Corollary 12.9. *)
+Corollary tau1_act_tau2 M E p A q Q (Ms := M`_\sigma) :
+ M \in 'M -> \sigma(M)^'.-Hall(M) E -> p \in \tau2(M) -> A \in 'E_p^2(E) ->
+ q \in \tau1(M) -> Q \in 'E_q^1(E) -> 'C_Ms(Q) = 1 -> [~: A, Q] != 1 ->
+ let A0 := [~: A, Q]%G in let A1 := ('C_A(Q))%G in
+ [/\ (*a*) [/\ A0 \in 'E_p^1(A), 'C_A(Ms) = A0 & A0 <| M],
+ (*b*) gval A0 \notin A1 :^: G
+ & (*c*) A1 \in 'E_p^1(A) /\ ~~ ('C(A1) \subset M)].
+Proof.
+move=> maxM hallE t2Mp Ep2A t1Mq EqQ regQ ntA0 A0 A1.
+have [sEM sM'E _] := and3P hallE.
+have [sAE abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
+have [sQE abelQ dimQ] := pnElemP EqQ; have [qQ _ _] := and3P abelQ.
+have [p_pr q_pr] := (pnElem_prime Ep2A, pnElem_prime EqQ).
+have p_gt1 := prime_gt1 p_pr.
+have Ep2A_M := subsetP (pnElemS p 2 sEM) A Ep2A.
+have [_ _ regA _ _] := tau2_context maxM t2Mp Ep2A_M.
+have [[nsAE _] _ _ _] := tau2_compl_context maxM hallE t2Mp Ep2A.
+have [_ nAE] := andP nsAE; have nAQ := subset_trans sQE nAE.
+have coAQ: coprime #|A| #|Q|.
+ exact: sub_pnat_coprime tau2'1 (pi_pnat pA t2Mp) (pi_pnat qQ t1Mq).
+have defA: A0 \x A1 = A := coprime_abelian_cent_dprod nAQ coAQ cAA.
+have [_ _ _ tiA01] := dprodP defA.
+have [sAM sM'A] := (subset_trans sAE sEM, pgroupS sAE sM'E).
+have sM'q: q \in \sigma(M)^' by case/andP: t1Mq.
+have EqQ_NA: Q \in 'E_q^1('N_M(A)).
+ by apply: subsetP EqQ; rewrite pnElemS // subsetI sEM.
+have q'A: q^'.-group A.
+ rewrite p'groupEpi ?coprime_pi' // in coAQ *.
+ by apply: (pnatPpi coAQ); rewrite -p_rank_gt0 (p_rank_abelem abelQ) dimQ.
+have [] := commG_sigma'_1Elem_cyclic maxM sAM sM'A sM'q EqQ_NA regQ q'A cAA.
+rewrite -[[~: A, Q]]/(gval A0) -/Ms => cMsA0 cycA0 nsA0M.
+have sA0A: A0 \subset A by rewrite commg_subl.
+have EpA0: A0 \in 'E_p^1(A).
+ have abelA0 := abelemS sA0A abelA; have [pA0 _] := andP abelA0.
+ rewrite p1ElemE // !inE sA0A -(Ohm1_id abelA0) /=.
+ by rewrite (Ohm1_cyclic_pgroup_prime cycA0 pA0).
+have defA0: 'C_A(Ms) = A0.
+ apply/eqP; rewrite eq_sym eqEcard subsetI sA0A cMsA0 (card_pnElem EpA0).
+ have pCAMs: p.-group 'C_A(Ms) := pgroupS (subsetIl A _) pA.
+ rewrite (card_pgroup pCAMs) leq_exp2l //= leqNgt.
+ apply: contra (Msigma_neq1 maxM) => dimCAMs.
+ rewrite eq_sym -regA (sameP eqP setIidPl) centsC (sameP setIidPl eqP).
+ by rewrite eqEcard subsetIl (card_pnElem Ep2A) (card_pgroup pCAMs) leq_exp2l.
+have EpA1: A1 \in 'E_p^1(A).
+ rewrite p1ElemE // !inE subsetIl -(eqn_pmul2l (ltnW p_gt1)).
+ by rewrite -{1}[p](card_pnElem EpA0) (dprod_card defA) (card_pnElem Ep2A) /=.
+have defNA0: 'N(A0) = M by apply: mmax_normal.
+have not_cA0Q: ~~ (Q \subset 'C(A0)).
+ apply: contra ntA0 => cA0Q.
+ by rewrite -subG1 -tiA01 !subsetI subxx sA0A centsC cA0Q.
+have rqM: 'r_q(M) = 1%N by apply/eqP; case/and3P: t1Mq.
+have q'CA0: q^'.-group 'C(A0).
+ have [S sylS sQS] := Sylow_superset (subset_trans sQE sEM) qQ.
+ have qS := pHall_pgroup sylS; rewrite -(p_rank_Sylow sylS) in rqM.
+ have cycS: cyclic S by rewrite (odd_pgroup_rank1_cyclic qS) ?mFT_odd ?rqM.
+ have ntS: S :!=: 1 by rewrite -rank_gt0 (rank_pgroup qS) rqM.
+ have defS1: 'Ohm_1(S) = Q.
+ apply/eqP; rewrite eq_sym eqEcard -{1}(Ohm1_id abelQ) OhmS //=.
+ by rewrite (card_pnElem EqQ) (Ohm1_cyclic_pgroup_prime cycS qS).
+ have sylSC: q.-Sylow('C(A0)) 'C_S(A0).
+ by rewrite (Hall_setI_normal _ sylS) // -defNA0 cent_normal.
+ rewrite -partG_eq1 ?cardG_gt0 // -(card_Hall sylSC) -trivg_card1 /=.
+ by rewrite setIC TI_Ohm1 // defS1 setIC prime_TIg ?(card_pnElem EqQ).
+do 2?split=> //.
+ have: ~~ q^'.-group Q by rewrite /pgroup (card_pnElem EqQ) pnatE ?inE ?negbK.
+ apply: contra; case/imsetP=> x _ defA01.
+ rewrite defA01 centJ pgroupJ in q'CA0.
+ by apply: pgroupS q'CA0; rewrite centsC subsetIr.
+have [S sylS sAS] := Sylow_superset (subsetT A) pA.
+have [cSS | not_cSS] := boolP (abelian S).
+ have solE := sigma_compl_sol hallE.
+ have [E1 hallE1 sQE1] := Hall_superset solE sQE (pi_pnat qQ t1Mq).
+ have [E3 hallE3] := Hall_exists \tau3(M) solE.
+ have [E2 _ complEi] := ex_tau2_compl hallE hallE1 hallE3.
+ have [_ _ _ reg1Z] := abelian_tau2 maxM complEi t2Mp Ep2A sylS sAS cSS.
+ have E1Q: Q \in 'E^1(E1).
+ by apply/nElemP; exists q; rewrite // !inE sQE1 abelQ dimQ.
+ rewrite (subset_trans (reg1Z Q E1Q regQ)) ?subIset // in not_cA0Q.
+ by rewrite centS ?orbT // (subset_trans sA0A).
+have pS := pHall_pgroup sylS.
+have [_ _ not_cent_reg _] := nonabelian_tau2 maxM hallE t2Mp Ep2A pS not_cSS.
+case: (not_cent_reg A1); rewrite // 2!inE (subsetP (pnElemS p 1 sAE)) // andbT.
+by rewrite -val_eqE /= defA0 eq_sym; apply/(TIp1ElemP EpA0 EpA1).
+Qed.
+
+(* This is B & G, Corollary 12.10(a). *)
+Corollary sigma'_nil_abelian M N :
+ M \in 'M -> N \subset M -> \sigma(M)^'.-group N -> nilpotent N -> abelian N.
+Proof.
+move=> maxM sNM sM'N /nilpotent_Fitting defN.
+apply/center_idP; rewrite -{2}defN -{defN}(center_bigdprod defN).
+apply: eq_bigr => p _; apply/center_idP; set P := 'O_p(N).
+have [-> | ntP] := eqVneq P 1; first exact: abelian1.
+have [pP sPN]: p.-group P /\ P \subset N by rewrite pcore_sub pcore_pgroup.
+have{sPN sNM sM'N} [sPM sM'P] := (subset_trans sPN sNM, pgroupS sPN sM'N).
+have{sPM sM'P} [E hallE sPE] := Hall_superset (mmax_sol maxM) sPM sM'P.
+suffices [S sylS cSS]: exists2 S : {group gT}, p.-Sylow(E) S & abelian S.
+ by have [x _ sPS] := Sylow_subJ sylS sPE pP; rewrite (abelianS sPS) ?abelianJ.
+have{N P sPE pP ntP} piEp: p \in \pi(E).
+ by rewrite (piSg sPE) // -p_rank_gt0 -rank_pgroup // rank_gt0.
+rewrite (partition_pi_sigma_compl maxM hallE) orbCA orbC -orbA in piEp.
+have [[E1 hallE1] [E3 hallE3]] := ex_tau13_compl hallE.
+have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
+have{complEi} [_ _ [cycE1 cycE3] _ _] := sigma_compl_context maxM complEi.
+have{piEp} [t1p | t3p | t2p] := or3P piEp.
+- have [S sylS] := Sylow_exists p E1.
+ exists S; first exact: subHall_Sylow hallE1 t1p sylS.
+ exact: abelianS (pHall_sub sylS) (cyclic_abelian cycE1).
+- have [S sylS] := Sylow_exists p E3.
+ exists S; first exact: subHall_Sylow hallE3 t3p sylS.
+ exact: abelianS (pHall_sub sylS) (cyclic_abelian cycE3).
+have [s'p rpM] := andP t2p; have [S sylS] := Sylow_exists p E; exists S => //.
+have sylS_M := subHall_Sylow hallE s'p sylS.
+have [A _ Ep2A] := ex_tau2Elem hallE t2p.
+by have [/(_ S sylS_M)[]] := tau2_context maxM t2p Ep2A.
+Qed.
+
+(* This is B & G, Corollary 12.10(b), first assertion. *)
+Corollary der_mmax_compl_abelian M E :
+ M \in 'M -> \sigma(M)^'.-Hall(M) E -> abelian E^`(1).
+Proof.
+move=> maxM hallE; have [sEM s'E _] := and3P hallE.
+have sE'E := der_sub 1 E; have sE'M := subset_trans sE'E sEM.
+exact: sigma'_nil_abelian (pgroupS _ s'E) (der1_sigma_compl_nil maxM hallE).
+Qed.
+
+(* This is B & G, Corollary 12.10(b), second assertion. *)
+(* Note that we do not require the full decomposition of the complement. *)
+Corollary tau2_compl_abelian M E E2 :
+ M \in 'M -> \sigma(M)^'.-Hall(M) E -> \tau2(M).-Hall(E) E2 -> abelian E2.
+Proof.
+move: E2 => F2 maxM hallE hallF2; have [sEM s'E _] := and3P hallE.
+have [[E1 hallE1] [E3 hallE3]] := ex_tau13_compl hallE.
+have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
+have solE: solvable E := sigma_compl_sol hallE.
+have{solE hallF2} [x _ ->{F2}] := Hall_trans solE hallF2 hallE2.
+have [-> | ntE] := eqsVneq E2 1; rewrite {x}abelianJ ?abelian1 //.
+have [[p p_pr rpE2] [sE2E t2E2 _]] := (rank_witness E2, and3P hallE2).
+have piE2p: p \in \pi(E2) by rewrite -p_rank_gt0 -rpE2 rank_gt0.
+have t2p := pnatPpi t2E2 piE2p; have [A Ep2A _] := ex_tau2Elem hallE t2p.
+have [_ abelA _] := pnElemP Ep2A; have [pA _] := andP abelA.
+have [S /= sylS sAS] := Sylow_superset (subsetT A) pA.
+have [cSS | not_cSS] := boolP (abelian S).
+ by have [[_ cE2E2] _ _ _] := abelian_tau2 maxM complEi t2p Ep2A sylS sAS cSS.
+have pS := pHall_pgroup sylS.
+have [def_t2 _ _ _] := nonabelian_tau2 maxM hallE t2p Ep2A pS not_cSS.
+apply: sigma'_nil_abelian (subset_trans _ sEM) (pgroupS _ s'E) _ => //.
+by rewrite (eq_pgroup _ def_t2) in t2E2; exact: pgroup_nil t2E2.
+Qed.
+
+(* This is B & G, Corollary 12.10(c). *)
+(* We do not really need a full decomposition of the complement in the first *)
+(* part, but this reduces the number of assumptions. *)
+Corollary tau1_cent_tau2Elem_factor M E p A :
+ M \in 'M -> \sigma(M)^'.-Hall(M) E -> p \in \tau2(M) -> A \in 'E_p^2(E) ->
+ [/\ forall E1 E2 E3, sigma_complement M E E1 E2 E3 -> E3 * E2 \subset 'C_E(A),
+ 'C_E(A) <| E
+ & \tau1(M).-group (E / 'C_E(A))].
+Proof.
+move=> maxM hallE t2p Ep2A; have sEM: E \subset M := pHall_sub hallE.
+have nsAE: A <| E by case/(tau2_compl_context maxM): Ep2A => //; case.
+have [sAE nAE]: A \subset E /\ E \subset 'N(A) := andP nsAE.
+have nsCAE: 'C_E(A) <| E by rewrite norm_normalI ?norms_cent.
+have [[E1 hallE1] [E3 hallE3]] := ex_tau13_compl hallE.
+have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
+have{hallE1} [t1E1 sE3E] := (pHall_pgroup hallE1, pHall_sub hallE3).
+have{nsAE} sAE2: A \subset E2.
+ apply: subset_trans (pcore_max _ nsAE) (pcore_sub_Hall hallE2).
+ by apply: pi_pnat t2p; case/pnElemP: Ep2A => _; case/andP.
+have{complEi} defE: (E3 ><| E2) ><| E1 = E.
+ by case/sigma_compl_context: complEi => // _ _ _ [_ ->].
+have [[K _ defK _] _ _ _] := sdprodP defE; rewrite defK in defE.
+have nsKE: K <| E by case/sdprod_context: defE.
+have [[sKE nKE] [_ mulE32 nE32 tiE32]] := (andP nsKE, sdprodP defK).
+have{sE3E} sK_CEA: K \subset 'C_E(A).
+ have cE2E2: abelian E2 := tau2_compl_abelian maxM hallE hallE2.
+ rewrite subsetI sKE -mulE32 mulG_subG (centsS sAE2 cE2E2) (sameP commG1P eqP).
+ rewrite -subG1 -tiE32 subsetI commg_subl (subset_trans sAE2) //=.
+ by rewrite (subset_trans _ sAE2) // commg_subr (subset_trans sE3E).
+split=> // [_ F2 F3 [_ _ hallF2 hallF3 _] | ].
+ have solE: solvable E := solvableS sEM (mmax_sol maxM).
+ have [x2 Ex2 ->] := Hall_trans solE hallF2 hallE2.
+ have [x3 Ex3 ->] := Hall_trans solE hallF3 hallE3.
+ rewrite mulG_subG !sub_conjg !(normsP (normal_norm nsCAE)) ?groupV //.
+ by rewrite -mulG_subG mulE32.
+have [f <-] := homgP (homg_quotientS nKE (normal_norm nsCAE) sK_CEA).
+by rewrite morphim_pgroup // /pgroup -divg_normal // -(sdprod_card defE) mulKn.
+Qed.
+
+(* This is B & G, Corollary 12.10(d). *)
+Corollary norm_noncyclic_sigma M p P :
+ M \in 'M -> p \in \sigma(M) -> p.-group P -> P \subset M -> ~~ cyclic P ->
+ 'N(P) \subset M.
+Proof.
+move=> maxM sMp pP sPM ncycP.
+have [A Ep2A]: exists A, A \in 'E_p^2(P).
+ by apply/p_rank_geP; rewrite ltnNge -odd_pgroup_rank1_cyclic ?mFT_odd.
+have [[sAP _ _] Ep2A_M] := (pnElemP Ep2A, subsetP (pnElemS p 2 sPM) A Ep2A).
+have sCAM: 'C(A) \subset M by case/p2Elem_mmax: Ep2A_M.
+have [_ _ <- //] := sigma_group_trans maxM sMp pP.
+by rewrite mulG_subG subsetIl (subset_trans (centS sAP)).
+Qed.
+
+(* This is B & G, Corollary 12.10(e). *)
+Corollary cent1_nreg_sigma_uniq M (Ms := M`_\sigma) x :
+ M \in 'M -> x \in M^# -> \tau2(M).-elt x -> 'C_Ms[x] != 1 ->
+ 'M('C[x]) = [set M].
+Proof.
+move=> maxM /setD1P[ntx]; rewrite -cycle_subG => sMX t2x.
+apply: contraNeq => MCx_neqM.
+have{MCx_neqM} [H maxCxH neqHM]: exists2 H, H \in 'M('C[x]) & H \notin [set M].
+ apply/subsetPn; have [H MCxH] := mmax_exists (mFT_cent1_proper ntx).
+ by rewrite eqEcard cards1 (cardD1 H) MCxH andbT in MCx_neqM.
+have sCxH: 'C[x] \subset H by case/setIdP: maxCxH.
+have s'x: \sigma(M)^'.-elt x by apply: sub_pgroup t2x => p; case/andP.
+have [E hallE sXE] := Hall_superset (mmax_sol maxM) sMX s'x.
+have [sEM solE] := (pHall_sub hallE, sigma_compl_sol hallE).
+have{sXE} [E2 hallE2 sXE2] := Hall_superset solE sXE t2x.
+pose p := pdiv #[x].
+have t2p: p \in \tau2(M) by rewrite (pnatPpi t2x) ?pi_pdiv ?order_gt1.
+have [A Ep2A sAE2]: exists2 A, A \in 'E_p^2(M) & A \subset E2.
+ have [A Ep2A_E EpA] := ex_tau2Elem hallE t2p.
+ have [sAE abelA _] := pnElemP Ep2A_E; have [pA _] := andP abelA.
+ have [z Ez sAzE2] := Hall_Jsub solE hallE2 sAE (pi_pnat pA t2p).
+ by exists (A :^ z)%G; rewrite // -(normsP (normsG sEM) z Ez) pnElemJ.
+have cE2E2: abelian E2 := tau2_compl_abelian maxM hallE hallE2.
+have cxA: A \subset 'C[x] by rewrite -cent_cycle (sub_abelian_cent2 cE2E2).
+have maxAH: H \in 'M(A) :\ M by rewrite inE neqHM (subsetP (mmax_ofS cxA)).
+have [_ _ _ tiMsMA _] := tau2_context maxM t2p Ep2A.
+by rewrite -subG1 -(tiMsMA H maxAH) setIS.
+Qed.
+
+(* This is B & G, Lemma 12.11. *)
+Lemma primes_norm_tau2Elem M E p A Mstar :
+ M \in 'M -> \sigma(M)^'.-Hall(M) E -> p \in \tau2(M) -> A \in 'E_p^2(E) ->
+ Mstar \in 'M('N(A)) ->
+ [/\ (*a*) {subset \tau2(M) <= [predD \sigma(Mstar) & \beta(Mstar)]},
+ (*b*) [predU \tau1(Mstar) & \tau2(Mstar)].-group (E / 'C_E(A))
+ & (*c*) forall q, q \in \pi(E / 'C_E(A)) -> q \in \pi('C_E(A)) ->
+ [/\ q \in \tau2(Mstar),
+ exists2 P, P \in 'Syl_p(G) & P <| Mstar
+ & exists Q, [/\ Q \in 'Syl_q(G), Q \subset Mstar & abelian Q]]].
+Proof.
+move=> maxM hallE t2Mp Ep2A; move: Mstar.
+have [sAE abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
+have ntA: A :!=: 1 by exact: (nt_pnElem Ep2A).
+have [sEM solE] := (pHall_sub hallE, sigma_compl_sol hallE).
+have [_ nsCA_E t1CEAb] := tau1_cent_tau2Elem_factor maxM hallE t2Mp Ep2A.
+have [sAM nCA_E] := (subset_trans sAE sEM, normal_norm nsCA_E).
+have part_a H:
+ H \in 'M('N(A)) -> {subset \tau2(M) <= [predD \sigma(H) & \beta(H)]}.
+- case/setIdP=> maxH sNA_H q t2Mq.
+ have sCA_H: 'C(A) \subset H := subset_trans (cent_sub A) sNA_H.
+ have sAH := subset_trans cAA sCA_H.
+ have sHp: p \in \sigma(H).
+ have [// | t2Hp] := orP (prime_class_mmax_norm maxH pA sNA_H).
+ apply: contraLR sNA_H => sH'p.
+ have sH'A: \sigma(H)^'.-group A by apply: pi_pnat pA _.
+ have [F hallF sAF] := Hall_superset (mmax_sol maxH) sAH sH'A.
+ have Ep2A_F: A \in 'E_p^2(F) by apply/pnElemP.
+ by have [_ [_ _ ->]]:= tau2_compl_context maxH hallF t2Hp Ep2A_F.
+ rewrite inE /= -predI_sigma_beta //= negb_and /= orbC.
+ have [-> /= _] := tau2_not_beta maxM t2Mq.
+ have [B Eq2B]: exists B, B \in 'E_q^2('C(A)).
+ have [E2 hallE2 sAE2] := Hall_superset solE sAE (pi_pnat pA t2Mp).
+ have cE2E2: abelian E2 := tau2_compl_abelian maxM hallE hallE2.
+ have [Q sylQ] := Sylow_exists q E2; have sQE2 := pHall_sub sylQ.
+ have sylQ_E := subHall_Sylow hallE2 t2Mq sylQ.
+ apply/p_rank_geP; apply: leq_trans (p_rankS q (centsS sAE2 cE2E2)).
+ rewrite -(p_rank_Sylow sylQ) (p_rank_Sylow sylQ_E).
+ by move: t2Mq; rewrite (tau2E hallE) => /andP[_ /eqP->].
+ have [cAB abelB dimB] := pnElemP Eq2B; have sBH := subset_trans cAB sCA_H.
+ have{Eq2B} Eq2B: B \in 'E_q^2(H) by apply/pnElemP.
+ have rqHgt1: 'r_q(H) > 1 by apply/p_rank_geP; exists B.
+ have piHq: q \in \pi(H) by rewrite -p_rank_gt0 ltnW.
+ rewrite partition_pi_mmax // in piHq.
+ case/or4P: piHq rqHgt1 => // [|t2Hq _|]; try by case/and3P=> _ /eqP->.
+ have [_ _ regB _ _] := tau2_context maxH t2Hq Eq2B.
+ case/negP: ntA; rewrite -subG1 -regB subsetI centsC cAB andbT.
+ by rewrite (sub_Hall_pcore (Msigma_Hall maxH)) // (pi_pgroup pA).
+have part_b H:
+ H \in 'M('N(A)) -> [predU \tau1(H) & \tau2(H)].-group (E / 'C_E(A)).
+- move=> maxNA_H; have [maxH sNA_H] := setIdP maxNA_H.
+ have [/= bH'p sHp] := andP (part_a H maxNA_H p t2Mp).
+ have sCA_H: 'C(A) \subset H := subset_trans (cent_sub A) sNA_H.
+ have sAH := subset_trans cAA sCA_H.
+ apply/pgroupP=> q q_pr q_dv_CEAb; apply: contraR bH'p => t12H'q.
+ have [Q sylQ] := Sylow_exists q E; have [sQE qQ _] := and3P sylQ.
+ have nsAE: A <| E by case/(tau2_compl_context maxM): Ep2A => //; case.
+ have nAE := normal_norm nsAE; have nAQ := subset_trans sQE nAE.
+ have sAQ_A: [~: A, Q] \subset A by rewrite commg_subl.
+ have ntAQ: [~: A, Q] != 1.
+ apply: contraTneq q_dv_CEAb => /commG1P cAQ.
+ have nCEA_Q := subset_trans sQE nCA_E.
+ rewrite -p'natE // -partn_eq1 ?cardg_gt0 //.
+ rewrite -(card_Hall (quotient_pHall nCEA_Q sylQ)) -trivg_card1 -subG1.
+ by rewrite quotient_sub1 // subsetI sQE centsC.
+ have sQH: Q \subset H := subset_trans nAQ sNA_H.
+ have sHsubH' r X:
+ r \in \sigma(H) -> X \subset H -> r.-group X -> X \subset H^`(1).
+ + move=> sHr sXH rX; apply: subset_trans (Msigma_der1 maxH).
+ by rewrite (sub_Hall_pcore (Msigma_Hall maxH)) // (pi_pgroup rX sHr).
+ have sAH': A \subset H^`(1) by apply: sHsubH' pA.
+ have{t12H'q} sQH': Q \subset H^`(1).
+ have [sHq | sH'q] := boolP (q \in \sigma(H)); first exact: sHsubH' qQ.
+ have{sH'q} sH'Q: \sigma(H)^'.-group Q by apply: (pi_pnat qQ).
+ have{sH'Q} [F hallF sQF] := Hall_superset (mmax_sol maxH) sQH sH'Q.
+ have [-> | ntQ] := eqsVneq Q 1; first exact: sub1G.
+ have{t12H'q} t3Hq: q \in \tau3(H).
+ apply: implyP t12H'q; rewrite implyNb -orbA.
+ rewrite -(partition_pi_sigma_compl maxH hallF) -p_rank_gt0.
+ by rewrite (leq_trans _ (p_rankS q sQF)) // -rank_pgroup // rank_gt0.
+ have solF: solvable F := sigma_compl_sol hallF.
+ have [F3 hallF3 sQF3] := Hall_superset solF sQF (pi_pnat qQ t3Hq).
+ have [[F1 hallF1] _] := ex_tau13_compl hallF.
+ have [F2 _ complFi] := ex_tau2_compl hallF hallF1 hallF3.
+ have [[sF3H' _] _ _ _ _] := sigma_compl_context maxH complFi.
+ exact: subset_trans sQF3 (subset_trans sF3H' (dergS 1 (pHall_sub hallF))).
+ have hallHb: \beta(H).-Hall(H) H`_\beta := Mbeta_Hall maxH.
+ have nilH'b: nilpotent (H^`(1) / H`_\beta) := Mbeta_quo_nil maxH.
+ have{nilH'b} sAQ_Hb: [~: A, Q] \subset H`_\beta.
+ rewrite -quotient_cents2 ?(subset_trans _ (gFnorm _ _)) // centsC.
+ rewrite (sub_nilpotent_cent2 nilH'b) ?quotientS ?coprime_morph //.
+ rewrite (pnat_coprime (pi_pnat pA t2Mp) (pi_pnat qQ _)) ?tau2'1 //.
+ by rewrite (pnatPpi t1CEAb) // mem_primes q_pr cardG_gt0.
+ rewrite (pnatPpi (pHall_pgroup hallHb)) // (piSg sAQ_Hb) // -p_rank_gt0.
+ by rewrite -(rank_pgroup (pgroupS sAQ_A pA)) rank_gt0.
+move=> H maxNA_H; split; last 1 [move=> q piCEAb_q piCEAq] || by auto.
+have [_ sHp]: _ /\ p \in \sigma(H) := andP (part_a H maxNA_H p t2Mp).
+have{maxNA_H} [maxH sNA_H] := setIdP maxNA_H.
+have{sNA_H} sCA_H: 'C(A) \subset H := subset_trans (cent_sub A) sNA_H.
+have{piCEAq} [Q0 EqQ0]: exists Q0, Q0 \in 'E_q^1('C_E(A)).
+ by apply/p_rank_geP; rewrite p_rank_gt0.
+have [sQ0_CEA abelQ0 dimQ0]:= pnElemP EqQ0; have [qQ0 cQ0Q0 _] := and3P abelQ0.
+have{sQ0_CEA} [sQ0E cAQ0]: Q0 \subset E /\ Q0 \subset 'C(A).
+ by apply/andP; rewrite -subsetI.
+have ntQ0: Q0 :!=: 1 by apply: (nt_pnElem EqQ0).
+have{t1CEAb} t1Mq: q \in \tau1(M) := pnatPpi t1CEAb piCEAb_q.
+have [Q sylQ sQ0Q] := Sylow_superset sQ0E qQ0; have [sQE qQ _] := and3P sylQ.
+have [E1 hallE1 sQE1] := Hall_superset solE sQE (pi_pnat qQ t1Mq).
+have rqE: 'r_q(E) = 1%N.
+ by move: t1Mq; rewrite (tau1E maxM hallE) andbA andbC; case: eqP.
+have cycQ: cyclic Q.
+ by rewrite (odd_pgroup_rank1_cyclic qQ) ?mFT_odd // (p_rank_Sylow sylQ) rqE.
+have sCAE: 'C(A) \subset E by case/(tau2_compl_context maxM): Ep2A => // _ [].
+have{sCAE} sylCQA: q.-Sylow('C(A)) 'C_Q(A).
+ by apply: Hall_setI_normal sylQ; rewrite /= -(setIidPr sCAE).
+have{sylCQA} defNA: 'C(A) * 'N_('N(A))(Q0) = 'N(A).
+ apply/eqP; rewrite eqEsubset mulG_subG cent_sub subsetIl /=.
+ rewrite -{1}(Frattini_arg (cent_normal A) sylCQA) mulgS ?setIS ?char_norms //.
+ by rewrite (sub_cyclic_char Q0 (cyclicS (subsetIl Q _) cycQ)) subsetI sQ0Q.
+have [L maxNQ0_L]: {L | L \in 'M('N(Q0))}.
+ by apply: mmax_exists; rewrite mFT_norm_proper ?(mFT_pgroup_proper qQ0).
+have{maxNQ0_L} [maxL sNQ0_L] := setIdP maxNQ0_L.
+have sCQ0_L: 'C(Q0) \subset L := subset_trans (cent_sub Q0) sNQ0_L.
+have sAL: A \subset L by rewrite (subset_trans _ sCQ0_L) // centsC.
+have sCA_L: 'C(A) \subset L.
+ by have /p2Elem_mmax[]: A \in 'E_p^2(L) by apply/pnElemP.
+have{sCA_L defNA} maxNA_L: L \in 'M('N(A)).
+ by rewrite inE maxL -defNA setIC mul_subG // subIset ?sNQ0_L.
+have t2Lq: q \in \tau2(L).
+ have /orP[sLq | //] := prime_class_mmax_norm maxL qQ0 sNQ0_L.
+ by have /orP[/andP[/negP] | ] := pnatPpi (part_b L maxNA_L) piCEAb_q.
+have [cQQ [/= sL'q _]] := (cyclic_abelian cycQ, andP t2Lq).
+have sQL: Q \subset L := subset_trans (centsS sQ0Q cQQ) sCQ0_L.
+have [F hallF sQF] := Hall_superset (mmax_sol maxL) sQL (pi_pnat qQ sL'q).
+have [B Eq2B _] := ex_tau2Elem hallF t2Lq.
+have [_ sLp]: _ /\ p \in \sigma(L) := andP (part_a L maxNA_L p t2Mp).
+have{H sHp maxH sCA_H} <-: L :=: H.
+ have sLHp: p \in [predI \sigma(L) & \sigma(H)] by apply/andP.
+ have [_ transCA _] := sigma_group_trans maxH sHp pA.
+ set S := finset _ in transCA; have sAH := subset_trans cAA sCA_H.
+ suffices [SH SL]: gval H \in S /\ gval L \in S.
+ have [c cAc -> /=]:= atransP2 transCA SH SL.
+ by rewrite conjGid // (subsetP sCA_H).
+ have [_ _ _ TIsL] := tau2_compl_context maxL hallF t2Lq Eq2B.
+ apply/andP; rewrite !inE sAH sAL orbit_refl orbit_sym /= andbT.
+ by apply: contraLR sLHp => /TIsL[] // _ ->.
+split=> //.
+ exists ('O_p(L`_\sigma))%G; last by rewrite /= -pcoreI pcore_normal.
+ rewrite inE (subHall_Sylow (Msigma_Hall_G maxL) sLp) //.
+ by rewrite nilpotent_pcore_Hall // (tau2_Msigma_nil maxL t2Lq).
+have [Q1 sylQ1 sQQ1] := Sylow_superset (subsetT Q) qQ.
+have [sQ0Q1 qQ1] := (subset_trans sQ0Q sQQ1, pHall_pgroup sylQ1).
+have [cQ1Q1 | not_cQ1Q1] := boolP (abelian Q1).
+ by exists Q1; rewrite inE (subset_trans (centsS sQ0Q1 cQ1Q1)).
+have [_ _ regB [F0 /=]] := nonabelian_tau2 maxL hallF t2Lq Eq2B qQ1 not_cQ1Q1.
+have{regB} ->: 'C_B(L`_\sigma) = Q0; last move=> defF _.
+ apply: contraTeq sCQ0_L => neqQ0B; case: (regB Q0) => //.
+ by rewrite 2!inE eq_sym neqQ0B; apply/pnElemP; rewrite (subset_trans sQ0Q).
+have{defF} defQ: Q0 \x (F0 :&: Q) = Q.
+ rewrite dprodEsd ?(centSS (subsetIr F0 Q) sQ0Q) //.
+ by rewrite (sdprod_modl defF sQ0Q) (setIidPr sQF).
+have [[/eqP/idPn//] | [_ eqQ0Q]] := cyclic_pgroup_dprod_trivg qQ cycQ defQ.
+have nCEA_Q := subset_trans sQE nCA_E.
+case/idPn: piCEAb_q; rewrite -p'natEpi -?partn_eq1 ?cardG_gt0 //.
+rewrite -(card_Hall (quotient_pHall nCEA_Q sylQ)) -trivg_card1 -subG1.
+by rewrite quotient_sub1 // subsetI sQE -eqQ0Q.
+Qed.
+
+(* This is a generalization of B & G, Theorem 12.12. *)
+(* In the B & G text, Theorem 12.12 only establishes the type F structure *)
+(* for groups of type I, whereas it is required for the derived groups of *)
+(* groups of type II (in the sense of Peterfalvi). Indeed this is exactly *)
+(* what is stated in Lemma 15.15(e) and then Theorem B(3). The proof of *)
+(* 15.15(c) cites 12.12 in the type I case (K = 1) and then loosely invokes *)
+(* a "short and easy argument" inside the proof of 12.12 for the K != 1 case. *)
+(* In fact, this involves copying roughly 25% of the proof, whereas the proof *)
+(* remains essentially unchanged when Theorem 12.12 is generalized to a *)
+(* normal Hall subgroup of E as below. *)
+(* Also, we simplify the argument for central tau2 Sylow subgroup S of U by *)
+(* by replacing the considerations on the abelian structure of S by a *)
+(* comparison of Mho^n-1(S) and Ohm_1(S) (with exponent S = p ^ n), as the *)
+(* former is needed anyway to prove regularity when S is not homocyclic. *)
+Theorem FTtypeF_complement M (Ms := M`_\sigma) E U :
+ M \in 'M -> \sigma(M)^'.-Hall(M) E -> Hall E U -> U <| E -> U :!=: 1 ->
+ {in U^#, forall e, [predU \tau1(M) & \tau3(M)].-elt e -> 'C_Ms[e] = 1} ->
+ [/\ (*a*) exists A0 : {group gT},
+ [/\ A0 <| U, abelian A0 & {in Ms^#, forall x, 'C_U[x] \subset A0}]
+ & (*b*) exists E0 : {group gT},
+ [/\ E0 \subset U, exponent E0 = exponent U
+ & [Frobenius Ms <*> E0 = Ms ><| E0]]].
+Proof.
+set p13 := predU _ _ => maxM hallE /Hall_pi hallU nsUE ntU regU13.
+have [[E1 hallE1] [E3 hallE3]] := ex_tau13_compl hallE.
+have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
+have [[sE1E _] [sE2E t2E2 _]] := (andP hallE1, and3P hallE2).
+have [[_ nsE3E] _ [cycE1 _] [defE _] _] := sigma_compl_context maxM complEi.
+have [[[sE3E t3E3 _][_ nE3E]] [sUE _]] := (and3P hallE3, andP nsE3E, andP nsUE).
+have defM: Ms ><| E = M := sdprod_sigma maxM hallE.
+have [nsMsM sEM mulMsE nMsE tiMsE] := sdprod_context defM.
+have ntMs: Ms != 1 := Msigma_neq1 maxM.
+have{defM} defMsU: Ms ><| U = Ms <*> U := sdprod_subr defM sUE.
+pose U2 := (E2 :&: U)%G.
+have hallU2: \tau2(M).-Hall(U) U2 := Hall_setI_normal nsUE hallE2.
+have [U2_1 | ntU2] := eqsVneq U2 1.
+ have frobMsU: [Frobenius Ms <*> U = Ms ><| U].
+ apply/Frobenius_semiregularP=> // e Ue.
+ apply: regU13 => //; case/setD1P: Ue => _; apply: mem_p_elt.
+ have: \tau2(M)^'.-group U.
+ by rewrite -partG_eq1 -(card_Hall hallU2) U2_1 cards1.
+ apply: sub_in_pnat => p /(piSg sUE).
+ by rewrite (partition_pi_sigma_compl maxM hallE) orbCA => /orP[] // /idPn.
+ split; [exists 1%G; rewrite normal1 abelian1 | by exists U].
+ by split=> //= x Ux; rewrite (Frobenius_reg_compl frobMsU).
+have [[sU2U t2U2 _] [p p_pr rU2]] := (and3P hallU2, rank_witness U2).
+have piU2p: p \in \pi(U2) by rewrite -p_rank_gt0 -rU2 rank_gt0.
+have t2p: p \in \tau2(M) := pnatPpi t2U2 piU2p.
+have [A Ep2A Ep2A_M] := ex_tau2Elem hallE t2p.
+have [sAE abelA _] := pnElemP Ep2A; have{abelA} [pA cAA _] := and3P abelA.
+have [S sylS sAS] := Sylow_superset (subsetT A) pA.
+have [cSS | not_cSS] := boolP (abelian S); last first.
+ have [_] := nonabelian_tau2 maxM hallE t2p Ep2A (pHall_pgroup sylS) not_cSS.
+ set A0 := ('C_A(_))%G => [] [oA0 _] _ {defE} [E0 defE regE0].
+ have [nsA0E sE0E mulAE0 nAE0 tiAE0] := sdprod_context defE.
+ have [P sylP] := Sylow_exists p U; have [sPU _] := andP sylP.
+ have sylP_E := subHall_Sylow hallU (piSg sU2U piU2p) sylP.
+ have pA0: p.-group A0 by rewrite /pgroup oA0 pnat_id.
+ have sA0P: A0 \subset P.
+ by apply: subset_trans (pcore_sub_Hall sylP_E); apply: pcore_max.
+ have sA0U: A0 \subset U := subset_trans sA0P sPU.
+ pose U0 := (E0 :&: U)%G.
+ have defU: A0 ><| U0 = U by rewrite (sdprod_modl defE) // (setIidPr sUE).
+ have piU0p: p \in \pi(U0).
+ have:= lognSg p sAE; rewrite (card_pnElem Ep2A) pfactorK //.
+ rewrite -logn_part -(card_Hall sylP_E) (card_Hall sylP) logn_part.
+ rewrite -(sdprod_card defU) oA0 lognM // ?prime_gt0 // logn_prime // eqxx.
+ by rewrite ltnS logn_gt0.
+ have defM0: Ms ><| U0 = Ms <*> U0 := sdprod_subr defMsU (subsetIr _ _).
+ have frobM0: [Frobenius Ms <*> U0 = Ms ><| U0].
+ apply/Frobenius_semiregularP=> // [|e /setD1P[nte /setIP[E0e Ue]]].
+ by rewrite -rank_gt0 (leq_trans _ (p_rank_le_rank p _)) ?p_rank_gt0.
+ have [ | ] := boolP (p13.-elt e); first by apply: regU13; rewrite !inE nte.
+ apply: contraNeq => /trivgPn[x /setIP[Ms_x cex] ntx].
+ apply/pgroupP=> q q_pr q_dv_x ; rewrite inE /= (regE0 x) ?inE ?ntx //.
+ rewrite mem_primes q_pr cardG_gt0 (dvdn_trans q_dv_x) ?order_dvdG //.
+ by rewrite inE E0e cent1C.
+ have [nsA0U sU0U _ _ _] := sdprod_context defU.
+ split; [exists A0 | exists U0].
+ split=> // [|x Ms_x]; first by rewrite (abelianS (subsetIl A _) cAA).
+ rewrite -(sdprodW defU) -group_modl ?(Frobenius_reg_compl frobM0) ?mulg1 //.
+ by rewrite subIset //= orbC -cent_set1 centS // sub1set; case/setD1P: Ms_x.
+ split=> //; apply/eqP; rewrite eqn_dvd exponentS //=.
+ rewrite -(partnC p (exponent_gt0 U0)) -(partnC p (exponent_gt0 U)).
+ apply: dvdn_mul; last first.
+ rewrite (partn_exponentS sU0U) // -(sdprod_card defU) partnM ?cardG_gt0 //.
+ by rewrite part_p'nat ?pnatNK // mul1n dvdn_part.
+ have cPP: abelian P.
+ have [/(_ P)[] //] := tau2_context maxM t2p Ep2A_M.
+ by apply: subHall_Sylow hallE _ sylP_E; case/andP: t2p.
+ have defP: A0 \x (U0 :&: P) = P.
+ rewrite dprodEsd ?(sub_abelian_cent2 cPP) ?subsetIr //.
+ by rewrite (sdprod_modl defU) // (setIidPr sPU).
+ have sylP_U0: p.-Sylow(U0) (U0 :&: P).
+ rewrite pHallE subsetIl /= -(eqn_pmul2l (cardG_gt0 A0)).
+ rewrite (dprod_card defP) (card_Hall sylP) -(sdprod_card defU).
+ by rewrite partnM // part_pnat_id.
+ rewrite -(exponent_Hall sylP) -(dprod_exponent defP) (exponent_Hall sylP_U0).
+ rewrite dvdn_lcm (dvdn_trans (exponent_dvdn A0)) //= oA0.
+ apply: contraLR piU0p; rewrite -p'natE // -partn_eq1 // partn_part //.
+ by rewrite partn_eq1 ?exponent_gt0 // pnat_exponent -p'groupEpi.
+have{t2p Ep2A sylS sAS cSS} [[nsE2E cE2E2] hallE2_G _ _]
+ := abelian_tau2 maxM complEi t2p Ep2A sylS sAS cSS.
+clear p p_pr rU2 piU2p A S Ep2A_M sAE pA cAA.
+have nsU2U: U2 <| U by rewrite (normalS sU2U sUE) ?normalI.
+have cU2U2: abelian U2 := abelianS (subsetIl _ _) cE2E2.
+split.
+ exists U2; rewrite -set1gE; split=> // x /setDP[Ms_x ntx].
+ rewrite (sub_normal_Hall hallU2) ?subsetIl //=.
+ apply: sub_in_pnat (pgroup_pi _) => q /(piSg (subsetIl U _))/(piSg sUE).
+ rewrite (partition_pi_sigma_compl maxM) // orbCA => /orP[] // t13q.
+ rewrite mem_primes => /and3P[q_pr _ /Cauchy[] // y /setIP[Uy cxy] oy].
+ case/negP: ntx; rewrite -(regU13 y); first by rewrite inE Ms_x cent1C.
+ by rewrite !inE -order_gt1 oy prime_gt1.
+ by rewrite /p_elt oy pnatE.
+pose sylU2 S := (S :!=: 1) && Sylow U2 S.
+pose cyclicRegular Z S :=
+ [/\ Z <| U, cyclic Z, 'C_Ms('Ohm_1(Z)) = 1 & exponent Z = exponent S].
+suffices /fin_all_exists[Z_ Z_P] S: exists Z, sylU2 S -> cyclicRegular Z S.
+ pose Z2 := <<\bigcup_(S | sylU2 S) Z_ S>>.
+ have sZU2: Z2 \subset U2.
+ rewrite gen_subG; apply/bigcupsP=> S sylS.
+ have [[/andP[sZE _] _ _ eq_expZS] [_ _ sSU2 _]] := (Z_P S sylS, and4P sylS).
+ rewrite (sub_normal_Hall hallU2) // -pnat_exponent eq_expZS.
+ by rewrite pnat_exponent (pgroupS sSU2 t2U2).
+ have nZ2U: U \subset 'N(Z2).
+ by rewrite norms_gen ?norms_bigcup //; apply/bigcapsP => S /Z_P[/andP[]].
+ have solU: solvable U := solvableS sUE (sigma_compl_sol hallE).
+ have [U31 hallU31] := Hall_exists \tau2(M)^' solU.
+ have [[sU31U t2'U31 _] t2Z2] := (and3P hallU31, pgroupS sZU2 t2U2).
+ pose U0 := (Z2 <*> U31)%G; have /joing_sub[sZ2U0 sU310] := erefl (gval U0).
+ have sU0U: U0 \subset U by rewrite join_subG (subset_trans sZU2).
+ have nsZ2U0: Z2 <| U0 by rewrite /normal sZ2U0 (subset_trans sU0U).
+ have defU0: Z2 * U31 = U0 by rewrite -norm_joinEr // (subset_trans sU31U).
+ have [hallZ2 hallU31_0] := coprime_mulpG_Hall defU0 t2Z2 t2'U31.
+ have expU0U: exponent U0 = exponent U.
+ have exp_t2c U' := partnC \tau2(M) (exponent_gt0 U').
+ rewrite -(exp_t2c U) -(exponent_Hall hallU31) -(exponent_Hall hallU2).
+ rewrite -{}exp_t2c -(exponent_Hall hallU31_0) -(exponent_Hall hallZ2).
+ congr (_ * _)%N; apply/eqP; rewrite eqn_dvd exponentS //=.
+ apply/dvdn_partP=> [|p]; first exact: exponent_gt0.
+ have [S sylS] := Sylow_exists p U2; rewrite -(exponent_Hall sylS).
+ rewrite pi_of_exponent -p_rank_gt0 -(rank_Sylow sylS) rank_gt0 => ntS.
+ have{sylS} sylS: sylU2 S by rewrite /sylU2 ntS (p_Sylow sylS).
+ by have /Z_P[_ _ _ <-] := sylS; rewrite exponentS ?sub_gen ?(bigcup_max S).
+ exists U0; split=> //.
+ have ntU0: U0 :!=: 1 by rewrite trivg_exponent expU0U -trivg_exponent.
+ apply/Frobenius_semiregularP=> //; first by rewrite (sdprod_subr defMsU).
+ apply: semiregular_sym => x /setD1P[ntx Ms_x]; apply: contraNeq ntx.
+ rewrite -rank_gt0; have [p p_pr ->] := rank_witness [group of 'C_U0[x]].
+ rewrite -in_set1 -set1gE p_rank_gt0 => piCp.
+ have [e /setIP[U0e cxe] oe]: {e | e \in 'C_U0[x] & #[e] = p}.
+ by move: piCp; rewrite mem_primes p_pr cardG_gt0; apply: Cauchy.
+ have nte: e != 1 by rewrite -order_gt1 oe prime_gt1.
+ have{piCp} piUp: p \in \pi(U).
+ by rewrite -pi_of_exponent -expU0U pi_of_exponent (piSg _ piCp) ?subsetIl.
+ have:= piSg sUE piUp; rewrite (partition_pi_sigma_compl maxM) // orbCA orbC.
+ case/orP=> [t13p | t2p].
+ rewrite -(regU13 e) 1?inE ?Ms_x 1?cent1C //.
+ by rewrite inE nte (subsetP sU0U).
+ by rewrite /p_elt oe pnatE.
+ have Z2e: e \in Z2 by rewrite (mem_normal_Hall hallZ2) // /p_elt oe pnatE.
+ have [S sylS] := Sylow_exists p U2; have [sSU2 pS _] := and3P sylS.
+ have sylS_U: p.-Sylow(U) S := subHall_Sylow hallU2 t2p sylS.
+ have ntS: S :!=: 1 by rewrite -rank_gt0 (rank_Sylow sylS_U) p_rank_gt0.
+ have sylS_U2: sylU2 S by rewrite /sylU2 ntS (p_Sylow sylS).
+ have [nsZU cycZ regZ1 eqexpZS] := Z_P S sylS_U2.
+ suffices defZ1: 'Ohm_1(Z_ S) == <[e]>.
+ by rewrite -regZ1 (eqP defZ1) cent_cycle inE Ms_x cent1C.
+ have pZ: p.-group (Z_ S) by rewrite -pnat_exponent eqexpZS pnat_exponent.
+ have sylZ: p.-Sylow(Z2) (Z_ S).
+ have:= sZU2; rewrite pHallE /Z2 /= -bigprodGE (bigD1 S) //=.
+ set Z2' := (\prod_(T | _) _)%G => /joing_subP[sZ_U2 sZ2'_U2].
+ rewrite joing_subl cent_joinEl ?(sub_abelian_cent2 cU2U2) //=.
+ suffices p'Z2': p^'.-group Z2'.
+ rewrite coprime_cardMg ?(pnat_coprime pZ) //.
+ by rewrite partnM // part_pnat_id // part_p'nat // muln1.
+ elim/big_ind: Z2' sZ2'_U2 => [_||T /andP[sylT neqTS]]; first exact: pgroup1.
+ move=> X Y IHX IHY /joing_subP[sXU2 sYU2] /=.
+ by rewrite cent_joinEl ?(sub_abelian_cent2 cU2U2) // pgroupM IHX ?IHY.
+ have /Z_P[_ _ _ expYT _] := sylT.
+ have{sylT} [_ /SylowP[q _ sylT]] := andP sylT.
+ rewrite -pnat_exponent expYT pnat_exponent.
+ apply: (pi_pnat (pHall_pgroup sylT)); apply: contraNneq neqTS => eq_qp.
+ have defOE2 := nilpotent_Hall_pcore (abelian_nil cU2U2).
+ by rewrite -val_eqE /= (defOE2 _ _ sylS) (defOE2 _ _ sylT) eq_qp.
+ have nZZ2 := normalS (pHall_sub sylZ) (subset_trans sZU2 sU2U) nsZU.
+ have Ze: e \in Z_ S by rewrite (mem_normal_Hall sylZ) // /p_elt oe pnat_id.
+ rewrite (eq_subG_cyclic cycZ) ?Ohm_sub ?cycle_subG // -orderE oe.
+ by rewrite (Ohm1_cyclic_pgroup_prime _ pZ) //; apply/trivgPn; exists e.
+case: (sylU2 S) / andP => [[ntS /SylowP[p p_pr sylS_U2]]|]; last by exists E.
+have [sSU2 pS _] := and3P sylS_U2; have [sSE2 sSU] := subsetIP sSU2.
+have piSp: p \in \pi(S) by rewrite -p_rank_gt0 -rank_pgroup ?rank_gt0.
+have t2p: p \in \tau2(M) := pnatPpi t2U2 (piSg sSU2 piSp).
+have sylS_U: p.-Sylow(U) S := subHall_Sylow hallU2 t2p sylS_U2.
+have sylS_E: p.-Sylow(E) S := subHall_Sylow hallU (piSg sSU piSp) sylS_U.
+have sylS: p.-Sylow(E2) S := pHall_subl sSE2 sE2E sylS_E.
+have sylS_G: p.-Sylow(G) S := subHall_Sylow hallE2_G t2p sylS.
+have [cSS [/= s'p rpM]] := (abelianS sSU2 cU2U2, andP t2p).
+have sylS_M: p.-Sylow(M) S := subHall_Sylow hallE s'p sylS_E.
+have rpS: 'r_p(S) = 2 by apply/eqP; rewrite (p_rank_Sylow sylS_M).
+have [A] := p_rank_witness p S; rewrite rpS -(setIidPr (pHall_sub sylS_E)).
+rewrite pnElemI setIC 2!inE => /andP[sAS Ep2A].
+have [[nsAE defEp] _ nregEp_uniq _] := tau2_compl_context maxM hallE t2p Ep2A.
+have [_ sNS'FE _ sCSE _]
+ := abelian_tau2_sub_Fitting maxM hallE t2p Ep2A sylS_G sAS cSS.
+have [_ _ [defNS _ _ _] regE1subZ]
+ := abelian_tau2 maxM complEi t2p Ep2A sylS_G sAS cSS.
+have nSE: E \subset 'N(S) by rewrite -defNS normal_norm.
+have [sSE nSU] := (subset_trans sSE2 sE2E, subset_trans sUE nSE).
+have n_subNS := abelian_tau2_norm_Sylow maxM hallE t2p Ep2A sylS_G sAS cSS.
+have not_sNS_M: ~~ ('N(S) \subset M).
+ by apply: contra s'p => sNS_M; apply/exists_inP; exists S; rewrite // inE.
+have regNNS Z (Z1 := 'Ohm_1(Z)%G):
+ Z \subset S -> cyclic Z -> Z :!=: 1 -> 'N(S) \subset 'N(Z1) -> 'C_Ms(Z1) = 1.
+- move=> sZS cycZ ntZ nZ1_NS; apply: contraNeq not_sNS_M => nregZ1.
+ have sZ1S: Z1 \subset S := subset_trans (Ohm_sub 1 Z) sZS.
+ have EpZ1: Z1 \in 'E_p^1(E).
+ rewrite p1ElemE // !inE (subset_trans sZ1S) //=.
+ by rewrite (Ohm1_cyclic_pgroup_prime _ (pgroupS sZS pS)).
+ have /= uCZ1 := nregEp_uniq _ EpZ1 nregZ1.
+ apply: (subset_trans nZ1_NS); apply: (sub_uniq_mmax uCZ1 (cent_sub _)).
+ by rewrite mFT_norm_proper ?(mFT_pgroup_proper (pgroupS sZ1S pS)) ?Ohm1_eq1.
+have [_ nsCEA t1CEAb] := tau1_cent_tau2Elem_factor maxM hallE t2p Ep2A.
+have [cSU | not_cSU] := boolP (U \subset 'C(S)).
+ pose n := logn p (exponent S); pose Sn := 'Mho^n.-1(S)%G.
+ have n_gt0: 0 < n by rewrite -pi_of_exponent -logn_gt0 in piSp.
+ have expS: (exponent S = p ^ n.-1 * p)%N.
+ rewrite -expnSr prednK -?p_part //.
+ by rewrite part_pnat_id ?pnat_exponent ?expg_exponent.
+ have sSnS1: Sn \subset 'Ohm_1(S).
+ rewrite (OhmE 1 pS) /= (MhoE _ pS); apply/genS/subsetP=> _ /imsetP[x Sx ->].
+ by rewrite !inE groupX //= -expgM -expS expg_exponent.
+ have sSZ: S \subset 'Z(U) by rewrite subsetI sSU centsC.
+ have{sSZ} nsZU z: z \in S -> <[z]> <| U.
+ by move/(subsetP sSZ)=> ZUz; rewrite sub_center_normal ?cycle_subG.
+ have [homoS | ltSnS1] := eqVproper sSnS1.
+ have Ep2A_M := subsetP (pnElemS p 2 sEM) A Ep2A.
+ have [_ _ _ _ [A1 EpA1 regA1]] := tau2_context maxM t2p Ep2A_M.
+ have [sA1A _ oA1] := pnElemPcard EpA1.
+ have /cyclicP[zn defA1]: cyclic A1 by rewrite prime_cyclic ?oA1.
+ have [z Sz def_zn]: exists2 z, z \in S & zn = z ^+ (p ^ n.-1).
+ apply/imsetP; rewrite -(MhoEabelian _ pS cSS) homoS (OhmE 1 pS).
+ rewrite mem_gen // !inE -cycle_subG -defA1 (subset_trans sA1A) //=.
+ by rewrite -oA1 defA1 expg_order.
+ have oz: #[z] = exponent S.
+ by rewrite expS; apply: orderXpfactor; rewrite // -def_zn orderE -defA1.
+ exists <[z]>%G; split; rewrite ?cycle_cyclic ?exponent_cycle ?nsZU //.
+ by rewrite (Ohm_p_cycle _ (mem_p_elt pS Sz)) subn1 oz -def_zn -defA1.
+ have [z Sz /esym oz] := exponent_witness (abelian_nil cSS).
+ exists <[z]>%G; split; rewrite ?cycle_cyclic ?exponent_cycle ?nsZU //.
+ have ntz: <[z]> != 1 by rewrite trivg_card1 -orderE oz -dvdn1 -trivg_exponent.
+ rewrite regNNS ?cycle_cyclic ?cycle_subG //=.
+ suffices /eqP->: 'Ohm_1(<[z]>) == Sn by apply: char_norms; apply: gFchar.
+ have [p_z pS1] := (mem_p_elt pS Sz, pgroupS (Ohm_sub 1 S) pS).
+ rewrite eqEcard (Ohm1_cyclic_pgroup_prime _ p_z) ?cycle_cyclic //.
+ rewrite (Ohm_p_cycle _ p_z) oz -/n subn1 cycle_subG Mho_p_elt //=.
+ rewrite (card_pgroup (pgroupS sSnS1 pS1)) (leq_exp2l _ 1) ?prime_gt1 //.
+ by rewrite -ltnS -rpS p_rank_abelian ?properG_ltn_log.
+have{not_cSU} [q q_pr piUq]: {q | prime q & q \in \pi(U / 'C(S))}.
+ have [q q_pr rCE] := rank_witness (U / 'C(S)); exists q => //.
+ by rewrite -p_rank_gt0 -rCE rank_gt0 -subG1 quotient_sub1 ?norms_cent.
+have{piUq} [piCESbq piUq]: q \in \pi(E / 'C_E(S)) /\ q \in \pi(U).
+ rewrite /= setIC (card_isog (second_isog (norms_cent nSE))).
+ by rewrite (piSg _ piUq) ?quotientS // (pi_of_dvd _ _ piUq) ?dvdn_quotient.
+have [Q1 sylQ1_U] := Sylow_exists q U; have [sQ1U qQ1 _] := and3P sylQ1_U.
+have sylQ1: q.-Sylow(E) Q1 := subHall_Sylow hallU piUq sylQ1_U.
+have sQ1E := subset_trans sQ1U sUE; have nSQ1 := subset_trans sQ1E nSE.
+have [Q sylQ sQ1Q] := Sylow_superset nSQ1 qQ1; have [nSQ qQ _] := and3P sylQ.
+have Ep2A_M := subsetP (pnElemS p 2 sEM) A Ep2A.
+have ltCQ1_S: 'C_S(Q1) \proper S.
+ rewrite properE subsetIl /= subsetI subxx centsC -sQ1E -subsetI.
+ have nCES_Q1: Q1 \subset 'N('C_E(S)) by rewrite (setIidPr sCSE) norms_cent.
+ rewrite -quotient_sub1 // subG1 -rank_gt0.
+ by rewrite (rank_Sylow (quotient_pHall nCES_Q1 sylQ1)) p_rank_gt0.
+have coSQ: coprime #|S| #|Q|.
+ suffices p'q: q != p by rewrite (pnat_coprime pS) // (pi_pnat qQ).
+ apply: contraNneq (proper_subn ltCQ1_S) => eq_qp; rewrite subsetI subxx.
+ rewrite (sub_abelian_cent2 cE2E2) // (sub_normal_Hall hallE2) //.
+ by rewrite (pi_pgroup qQ1) ?eq_qp.
+have not_sQ1CEA: ~~ (Q1 \subset 'C_E(A)).
+ rewrite subsetI sQ1E; apply: contra (proper_subn ltCQ1_S) => /= cAQ1.
+ rewrite subsetIidl centsC coprime_abelian_faithful_Ohm1 ?(coprimegS sQ1Q) //.
+ by case: (tau2_context maxM t2p Ep2A_M); case/(_ S sylS_M)=> _ [|->] //.
+have t1q: q \in \tau1(M).
+ rewrite (pnatPpi t1CEAb) // -p_rank_gt0.
+ have nCEA_Q1: Q1 \subset 'N('C_E(A)) := subset_trans sQ1E (normal_norm nsCEA).
+ rewrite -(rank_Sylow (quotient_pHall nCEA_Q1 sylQ1)) rank_gt0.
+ by rewrite -subG1 quotient_sub1.
+have cycQ1: cyclic Q1.
+ have [x _ sQ1E1x] := Hall_psubJ hallE1 t1q sQ1E qQ1.
+ by rewrite (cyclicS sQ1E1x) ?cyclicJ.
+have defQ1: Q :&: E = Q1.
+ apply: (sub_pHall sylQ1) (subsetIr Q E); last by rewrite subsetI sQ1Q.
+ by rewrite (pgroupS (subsetIl Q _)).
+pose Q0 := 'C_Q(S); have nsQ0Q: Q0 <| Q by rewrite norm_normalI ?norms_cent.
+have [sQ0Q nQ0Q] := andP nsQ0Q; have nQ01 := subset_trans sQ1Q nQ0Q.
+have coSQ0: coprime #|S| #|Q0| := coprimegS sQ0Q coSQ.
+have ltQ01: Q0 \proper Q1.
+ rewrite /proper -{1}defQ1 setIS //.
+ apply: contra (proper_subn ltCQ1_S) => sQ10.
+ by rewrite subsetIidl (centsS sQ10) // centsC subsetIr.
+have [X]: exists2 X, X \in subgroups Q & ('C_S(X) != 1) && ([~: S, X] != 1).
+ apply/exists_inP; apply: contraFT (ltnn 1); rewrite negb_exists_in => irrS.
+ have [sQ01 not_sQ10] := andP ltQ01.
+ have qQb: q.-group (Q / Q0) by exact: quotient_pgroup.
+ have ntQ1b: Q1 / Q0 != 1 by rewrite -subG1 quotient_sub1.
+ have ntQb: Q / Q0 != 1 := subG1_contra (quotientS _ sQ1Q) ntQ1b.
+ have{irrS} regQ: semiregular (S / Q0) (Q / Q0).
+ move=> Q0x; rewrite 2!inE -cycle_subG -cycle_eq1 -cent_cycle andbC.
+ case/andP; case/(inv_quotientS nsQ0Q)=> X /= -> {Q0x} sQ0X sXQ ntXb.
+ have [nSX nQ0X] := (subset_trans sXQ nSQ, subset_trans sXQ nQ0Q).
+ rewrite -quotient_TI_subcent ?(coprime_TIg coSQ0) //.
+ apply: contraTeq (forallP irrS X) => ntCSXb; rewrite inE sXQ negbK.
+ apply/andP; split.
+ by apply: contraNneq ntCSXb => ->; rewrite quotient1.
+ apply: contraNneq ntXb; move/commG1P => cXS.
+ by rewrite quotientS1 // subsetI sXQ centsC.
+ have{regQ} cycQb: cyclic (Q / Q0).
+ have nSQb: Q / Q0 \subset 'N(S / Q0) by exact: quotient_norms.
+ apply: odd_regular_pgroup_cyclic qQb (mFT_quo_odd _ _) _ nSQb regQ.
+ rewrite -(isog_eq1 (quotient_isog _ _)) ?coprime_TIg 1?coprime_sym //.
+ by rewrite cents_norm // centsC subsetIr.
+ have rQ1: 'r(Q1) = 1%N.
+ apply/eqP; rewrite (rank_Sylow sylQ1).
+ by rewrite (tau1E maxM hallE) in t1q; case/and3P: t1q.
+ have: 'r(Q) <= 1; last apply: leq_trans.
+ have nQ0_Ohm1Q := subset_trans (Ohm_sub 1 Q) nQ0Q.
+ rewrite -rQ1 -rank_Ohm1 rankS // -(quotientSGK _ sQ01) //.
+ rewrite (subset_trans (morphim_Ohm _ _ nQ0Q)) //= -quotientE -/Q0.
+ rewrite -(cardSg_cyclic cycQb) ?Ohm_sub ?quotientS //.
+ have [_ q_dv_Q1b _] := pgroup_pdiv (pgroupS (quotientS _ sQ1Q) qQb) ntQ1b.
+ by rewrite (Ohm1_cyclic_pgroup_prime cycQb qQb ntQb).
+ have ltNA_G: 'N(A) \proper G.
+ by rewrite defNS mFT_norm_proper // (mFT_pgroup_proper pS).
+ have [H maxNA_H] := mmax_exists ltNA_G.
+ have nCEA_Q1 := subset_trans sQ1E (normal_norm nsCEA).
+ have [_ _] := primes_norm_tau2Elem maxM hallE t2p Ep2A maxNA_H.
+ case/(_ q)=> [||t2Hq [S2 sylS2 nsS2H] _].
+ - rewrite -p_rank_gt0 -(rank_Sylow (quotient_pHall _ sylQ1)) //.
+ by rewrite rank_gt0 -subG1 quotient_sub1.
+ - rewrite -p_rank_gt0 -rQ1 (rank_pgroup qQ1) -p_rank_Ohm1 p_rankS //.
+ have: 'Z(E) \subset 'C_E(A); last apply: subset_trans.
+ by rewrite setIS ?centS // normal_sub.
+ have [x Ex sQ1xE1] := Hall_pJsub hallE1 t1q sQ1E qQ1.
+ rewrite -(conjSg _ _ x) (normsP (normal_norm (center_normal E))) //.
+ set Q11x := _ :^ x; have oQ11x: #|Q11x| = q.
+ by rewrite cardJg (Ohm1_cyclic_pgroup_prime _ qQ1) // -rank_gt0 rQ1.
+ apply: regE1subZ.
+ apply/nElemP; exists q; rewrite p1ElemE // !inE oQ11x.
+ by rewrite (subset_trans _ sQ1xE1) //= conjSg Ohm_sub.
+ have: cyclic Q11x by rewrite prime_cyclic ?oQ11x.
+ case/cyclicP=> y defQ11x; rewrite /= -/Q11x defQ11x cent_cycle regU13 //.
+ rewrite !inE -order_gt1 -cycle_subG /order -defQ11x oQ11x prime_gt1 //.
+ rewrite sub_conjg (subset_trans (Ohm_sub 1 Q1)) //.
+ by rewrite (normsP (normal_norm nsUE)) ?groupV.
+ by rewrite /p_elt /order -defQ11x oQ11x pnatE //; apply/orP; left.
+ rewrite inE in sylS2; have [sS2H _]:= andP nsS2H.
+ have sylS2_H := pHall_subl sS2H (subsetT H) sylS2.
+ have [maxH sNS_H] := setIdP maxNA_H; rewrite /= defNS in sNS_H.
+ have sylS_H := pHall_subl (subset_trans (normG S) sNS_H) (subsetT H) sylS_G.
+ have defS2: S :=: S2 := uniq_normal_Hall sylS2_H nsS2H (Hall_max sylS_H).
+ have sylQ_H: q.-Sylow(H) Q by rewrite -(mmax_normal maxH nsS2H) -defS2.
+ by rewrite (rank_Sylow sylQ_H); case/andP: t2Hq => _ /eqP->.
+rewrite inE => sXQ /=; have nSX := subset_trans sXQ nSQ.
+set S1 := [~: S, X]; set S2 := 'C_S(X) => /andP[ntS2 ntS1].
+have defS12: S1 \x S2 = S.
+ by apply: coprime_abelian_cent_dprod; rewrite ?(coprimegS sXQ).
+have /mulG_sub[sS1S sS2S] := dprodW defS12.
+have [cycS1 cycS2]: cyclic S1 /\ cyclic S2.
+ apply/andP; rewrite !(abelian_rank1_cyclic (abelianS _ cSS)) //.
+ rewrite -(leqif_add (leqif_geq _) (leqif_geq _)) ?rank_gt0 // addn1 -rpS.
+ rewrite !(rank_pgroup (pgroupS _ pS)) ?(p_rank_abelian p (abelianS _ cSS)) //.
+ by rewrite -lognM ?cardG_gt0 // (dprod_card (Ohm_dprod 1 defS12)).
+have [nsS2NS nsS1NS]: S2 <| 'N(S) /\ S1 <| 'N(S) := n_subNS X nSX.
+pose Z := if #|S1| < #|S2| then [group of S2] else [group of S1].
+have [ntZ sZS nsZN cycZ]: [/\ Z :!=: 1, Z \subset S, Z <| 'N(S) & cyclic Z].
+ by rewrite /Z; case: ifP.
+have nsZU: Z <| U := normalS (subset_trans sZS sSU) nSU nsZN.
+exists Z; split=> //=.
+ by rewrite regNNS // (char_norm_trans (Ohm_char 1 Z)) // normal_norm.
+rewrite -(dprod_exponent defS12) /= (fun_if val) fun_if !exponent_cyclic //=.
+rewrite (card_pgroup (pgroupS sS1S pS)) (card_pgroup (pgroupS sS2S pS)) //.
+by rewrite /= -/S1 -/S2 ltn_exp2l ?prime_gt1 // -fun_if expn_max.
+Qed.
+
+(* This is B & G, Theorem 12.13. *)
+Theorem nonabelian_Uniqueness p P : p.-group P -> ~~ abelian P -> P \in 'U.
+Proof.
+move=> pP not_cPP; have [M maxP_M] := mmax_exists (mFT_pgroup_proper pP).
+have sigma_p L: L \in 'M(P) -> p \in \sigma(L).
+ case/setIdP=> maxL sPL; apply: contraR not_cPP => sL'p.
+ exact: sigma'_nil_abelian maxL sPL (pi_pnat pP _) (pgroup_nil pP).
+have{maxP_M} [[maxM sPM] sMp] := (setIdP maxP_M, sigma_p M maxP_M).
+rewrite (uniq_mmax_subset1 maxM sPM); apply/subsetP=> H maxP_H; rewrite inE.
+have{sigma_p maxP_H} [[maxH sPH] sHp] := (setIdP maxP_H, sigma_p H maxP_H).
+without loss{pP sPH sPM} sylP: P not_cPP / p.-Sylow(M :&: H) P.
+ move=> IH; have sP_MH: P \subset M :&: H by rewrite subsetI sPM.
+ have [S sylS sPS] := Sylow_superset sP_MH pP.
+ exact: IH (contra (abelianS sPS) not_cPP) sylS.
+have [sP_MH pP _] := and3P sylP; have [sPM sPH] := subsetIP sP_MH.
+have ncycP := contra (@cyclic_abelian _ _) not_cPP.
+have{sHp} sNMH: 'N(P) \subset M :&: H.
+ by rewrite subsetI !(@norm_noncyclic_sigma _ p).
+have{sylP} sylP_M: p.-Sylow(M) P.
+ have [S sylS sPS] := Sylow_superset sPM pP; have pS := pHall_pgroup sylS.
+ have [-> // | ltPS] := eqVproper sPS.
+ have /andP[sNP] := nilpotent_proper_norm (pgroup_nil pS) ltPS.
+ rewrite (sub_pHall sylP _ sNP) ?subxx ?(pgroupS (subsetIl _ _)) //.
+ by rewrite subIset // orbC sNMH.
+have{sMp} sylP_G: p.-Sylow(G) P := sigma_Sylow_G maxM sMp sylP_M.
+have sylP_H: p.-Sylow(H) P := pHall_subl sPH (subsetT H) sylP_G.
+have [rPgt2 | rPle2] := ltnP 2 'r(P).
+ have uniqP: P \in 'U by rewrite rank3_Uniqueness ?(mFT_pgroup_proper pP).
+ have defMP: 'M(P) = [set M] := def_uniq_mmax uniqP maxM sPM.
+ by rewrite -val_eqE /= (eq_uniq_mmax defMP maxH).
+have rpP: 'r_p(P) = 2.
+ apply/eqP; rewrite eqn_leq -{1}rank_pgroup // rPle2 ltnNge.
+ by rewrite -odd_pgroup_rank1_cyclic ?mFT_odd.
+have:= mFT_rank2_Sylow_cprod sylP_G rPle2 not_cPP.
+case=> Q [not_cQQ dimQ eQ] [R cycR [defP defR1]].
+have sQP: Q \subset P by have /mulG_sub[] := cprodW defP.
+have pQ: p.-group Q := pgroupS sQP pP.
+have oQ: #|Q| = (p ^ 3)%N by rewrite (card_pgroup pQ) dimQ.
+have esQ: extraspecial Q by apply: (p3group_extraspecial pQ); rewrite ?dimQ.
+have p_pr := extraspecial_prime pQ esQ; have p_gt1 := prime_gt1 p_pr.
+pose Z := 'Z(Q)%G; have oZ: #|Z| = p := card_center_extraspecial pQ esQ.
+have nsZQ: Z <| Q := center_normal Q; have [sZQ nZQ] := andP nsZQ.
+have [[defPhiQ defQ'] _]: ('Phi(Q) = Z /\ Q^`(1) = Z) /\ _ := esQ.
+have defZ: 'Ohm_1 ('Z(P)) = Z.
+ have [_ <- _] := cprodP (center_cprod defP).
+ by rewrite (center_idP (cyclic_abelian cycR)) -defR1 mulSGid ?Ohm_sub.
+have ncycQ: ~~ cyclic Q := contra (@cyclic_abelian _ Q) not_cQQ.
+have rQgt1: 'r_p(Q) > 1.
+ by rewrite ltnNge -(odd_pgroup_rank1_cyclic pQ) ?mFT_odd.
+have [A Ep2A]: exists A, A \in 'E_p^2(Q) by exact/p_rank_geP.
+wlog uniqNEpA: M H maxM maxH sP_MH sNMH sPM sPH sylP_M sylP_H /
+ ~~ [exists A0 in 'E_p^1(A) :\ Z, 'M('N(A0)) == [set M]].
+- move=> IH; case: exists_inP (IH M H) => [[A0 EpA0 defMA0] _ | _ -> //].
+ case: exists_inP {IH}(IH H M) => [[A1 EpA1 defMA1] _ | _]; last first.
+ by rewrite setIC eq_sym => ->.
+ have [sAQ abelA dimA] := pnElemP Ep2A; have sAP := subset_trans sAQ sQP.
+ have transNP: [transitive 'N_P(A), on 'E_p^1(A) :\ Z | 'JG].
+ have [|_ _] := basic_p2maxElem_structure _ pP sAP not_cPP.
+ have Ep2A_G := subsetP (pnElemS p 2 (subsetT Q)) A Ep2A.
+ rewrite inE Ep2A_G (subsetP (p_rankElem_max p G)) //.
+ by rewrite -(p_rank_Sylow sylP_G) rpP.
+ by rewrite (group_inj defZ).
+ have [x NPx defA1] := atransP2 transNP EpA0 EpA1.
+ have Mx: x \in M by rewrite (subsetP sPM) //; case/setIP: NPx.
+ rewrite eq_sym -in_set1 -(group_inj (conjGid Mx)).
+ by rewrite -(eqP defMA1) defA1 /= normJ mmax_ofJ (eqP defMA0) set11.
+apply: contraR uniqNEpA => neqHM; have sQM := subset_trans sQP sPM.
+suffices{A Ep2A} [ntMa nonuniqNZ]: M`_\alpha != 1 /\ 'M('N(Z)) != [set M].
+ have [A0 EpA0 defMNA0]: exists2 A0, A0 \in 'E_p^1(A) & 'M('N(A0)) == [set M].
+ apply/exists_inP; apply: contraR ntMa; rewrite negb_exists_in => uniqNA1.
+ have{Ep2A} Ep2A: A \in 'E_p^2(M) := subsetP (pnElemS p 2 sQM) A Ep2A.
+ by have [_ [//|_ ->]] := p2Elem_mmax maxM Ep2A.
+ apply/exists_inP; exists A0; rewrite // 2!inE EpA0 andbT.
+ by apply: contraNneq nonuniqNZ => <-.
+have coMaQ: coprime #|M`_\alpha| #|Q|.
+ apply: pnat_coprime (pcore_pgroup _ _) (pi_pnat pQ _).
+ by rewrite !inE -(p_rank_Sylow sylP_M) rpP.
+have nMaQ: Q \subset 'N(M`_\alpha) by rewrite (subset_trans sQM) ?gFnorm.
+have [coMaZ nMaZ] := (coprimegS sZQ coMaQ, subset_trans sZQ nMaQ).
+pose K := 'N_(M`_\alpha)(Z).
+have defKC: 'C_(M`_\alpha)(Z) = K by rewrite -coprime_norm_cent.
+have coKQ: coprime #|K| #|Q| := coprimeSg (subsetIl _ _) coMaQ.
+have nKQ: Q \subset 'N(K) by rewrite normsI ?norms_norm.
+have [coKZ nKZ] := (coprimegS sZQ coKQ, subset_trans sZQ nKQ).
+have sKH: K \subset H.
+ have sZH := subset_trans sZQ (subset_trans sQP sPH).
+ rewrite -(quotientSGK (subsetIr _ _) sZH) /= -/Z -/K.
+ have cQQb: abelian (Q / Z) by rewrite -defQ' sub_der1_abelian.
+ rewrite -(coprime_abelian_gen_cent cQQb) ?coprime_morph ?quotient_norms //.
+ rewrite gen_subG /= -/K -/Z; apply/bigcupsP=> Ab; rewrite andbC; case/andP.
+ case/(inv_quotientN nsZQ)=> A -> sZA nsAQ; have sAQ := normal_sub nsAQ.
+ rewrite (isog_cyclic (third_isog _ _ _)) // -/Z => cycQA.
+ have pA: p.-group A := pgroupS sAQ pQ.
+ have rAgt1: 'r_p(A) > 1.
+ have [-> // | ltAQ] := eqVproper sAQ.
+ rewrite ltnNge -(odd_pgroup_rank1_cyclic pA) ?mFT_odd //.
+ apply: contraL cycQA => cycA /=; have cAA := cyclic_abelian cycA.
+ suff <-: Z :=: A by rewrite -defPhiQ (contra (@Phi_quotient_cyclic _ Q)).
+ apply/eqP; rewrite eqEcard sZA /= oZ (card_pgroup pA) (leq_exp2l _ 1) //.
+ by rewrite -abelem_cyclic // /abelem pA cAA (dvdn_trans (exponentS sAQ)).
+ have [A1 EpA1] := p_rank_geP rAgt1.
+ rewrite -(setIidPr (subset_trans sAQ (subset_trans sQP sPH))) pnElemI in EpA1.
+ have{EpA1} [Ep2A1 sA1A]:= setIdP EpA1; rewrite inE in sA1A.
+ have [sCA1_H _]: 'C(A1) \subset H /\ _ := p2Elem_mmax maxH Ep2A1.
+ rewrite -quotient_TI_subcent ?(subset_trans sAQ) ?(coprime_TIg coKZ) //= -/K.
+ by rewrite quotientS // subIset // orbC (subset_trans (centS sA1A)).
+have defM: M`_\alpha * (M :&: H) = M.
+ rewrite setIC in sNMH *.
+ have [defM eq_aM_bM] := nonuniq_norm_Sylow_pprod maxM maxH neqHM sylP_G sNMH.
+ by rewrite [M`_\alpha](eq_pcore M eq_aM_bM).
+do [split; apply: contraNneq neqHM] => [Ma1 | uniqNZ].
+ by rewrite -val_eqE /= (eq_mmax maxM maxH) // -defM Ma1 mul1g subsetIr.
+have [_ sNZM]: _ /\ 'N(Z) \subset M := mem_uniq_mmax uniqNZ.
+rewrite -val_eqE /= (eq_uniq_mmax uniqNZ maxH) //= -(setIidPr sNZM).
+have sZ_MH: Z \subset M :&: H := subset_trans sZQ (subset_trans sQP sP_MH).
+rewrite -(pprod_norm_coprime_prod defM) ?pcore_normal ?mmax_sol //.
+by rewrite mulG_subG /= defKC sKH setIAC subsetIr.
+Qed.
+
+(* This is B & G, Corollary 12.14. We have removed the redundant assumption *)
+(* p \in \sigma(M), and restricted the quantification over P to the part of *)
+(* the conclusion where it is mentioned. *)
+(* Usage note: it might be more convenient to state that P is a Sylow *)
+(* subgroup of M rather than M`_\sigma; check later use. *)
+Corollary cent_der_sigma_uniq M p X (Ms := M`_\sigma) :
+ M \in 'M -> X \in 'E_p^1(M) -> (p \in \beta(M)) || (X \subset Ms^`(1)) ->
+ 'M('C(X)) = [set M] /\ (forall P, p.-Sylow(Ms) P -> 'M(P) = [set M]).
+Proof.
+move=> maxM EpX bMp_sXMs'; have p_pr := pnElem_prime EpX.
+have [sXM abelX oX] := pnElemPcard EpX; have [pX _] := andP abelX.
+have ntX: X :!=: 1 := nt_pnElem EpX isT; have ltCXG := mFT_cent_proper ntX.
+have sMp: p \in \sigma(M).
+ have [bMp | sXMs'] := orP bMp_sXMs'; first by rewrite beta_sub_sigma.
+ rewrite -pnatE // -[p]oX; apply: pgroupS (subset_trans sXMs' (der_sub 1 _)) _.
+ exact: pcore_pgroup.
+have hallMs: \sigma(M).-Hall(M) Ms by exact: Msigma_Hall.
+have sXMs: X \subset Ms by rewrite (sub_Hall_pcore hallMs) // /pgroup oX pnatE.
+have [P sylP sXP]:= Sylow_superset sXMs pX.
+have sylP_M: p.-Sylow(M) P := subHall_Sylow hallMs sMp sylP.
+have sylP_G := sigma_Sylow_G maxM sMp sylP_M.
+have [sPM pP _] := and3P sylP_M; have ltPG := mFT_pgroup_proper pP.
+suffices [-> uniqP]: 'M('C(X)) = [set M] /\ 'M(P) = [set M].
+ split=> // Py sylPy; have [y Ms_y ->] := Sylow_trans sylP sylPy.
+ rewrite (def_uniq_mmaxJ _ uniqP) (group_inj (conjGid _)) //.
+ exact: subsetP (pcore_sub _ _) y Ms_y.
+have [rCPXgt2 | rCPXle2] := ltnP 2 'r_p('C_P(X)).
+ have [sCPX_P sCPX_CX] := subsetIP (subxx 'C_P(X)).
+ have [ltP ltCX] := (mFT_pgroup_proper pP, mFT_cent_proper ntX).
+ have sCPX_M := subset_trans sCPX_P sPM.
+ have ltCPX_G := sub_proper_trans sCPX_P ltPG.
+ suff uniqCPX: 'M('C_P(X)) = [set M] by rewrite !(def_uniq_mmaxS _ _ uniqCPX).
+ apply: (def_uniq_mmax (rank3_Uniqueness _ _)) => //.
+ exact: leq_trans (p_rank_le_rank p _).
+have nnP: p.-narrow P.
+ apply: wlog_neg; rewrite negb_imply; case/andP=> rP _.
+ by apply/narrow_centP; rewrite ?mFT_odd //; exists X.
+have{bMp_sXMs'} [bM'p sXMs']: p \notin \beta(M) /\ X \subset Ms^`(1).
+ move: bMp_sXMs'; rewrite !inE -negb_exists_in.
+ by case: exists_inP => // [[]]; exists P.
+have defMs: 'O_p^'(Ms) ><| P = Ms.
+ by have [_ hallMp' _] := beta_max_pdiv maxM bM'p; exact/sdprod_Hall_p'coreP.
+have{defMs} sXP': X \subset P^`(1).
+ have{defMs} [_ defMs nMp'P tiMp'P] := sdprodP defMs.
+ have [injMp'P imMp'P] := isomP (quotient_isom nMp'P tiMp'P).
+ rewrite -(injmSK injMp'P) // morphim_der // {injMp'P}imMp'P morphim_restrm.
+ rewrite (setIidPr sXP) /= -quotientMidl defMs -quotient_der ?quotientS //.
+ by rewrite -defMs mul_subG ?normG.
+have [rPgt2 | rPle2] := ltnP 2 'r_p(P).
+ case/eqP: ntX; rewrite -(setIidPl sXP').
+ by case/(narrow_cent_dprod pP (mFT_odd P)): rCPXle2.
+have not_cPP: ~~ abelian P.
+ by rewrite (sameP derG1P eqP) (subG1_contra sXP') ?ntX.
+have sXZ: X \subset 'Z(P).
+ rewrite -rank_pgroup // in rPle2.
+ have := mFT_rank2_Sylow_cprod sylP_G rPle2 not_cPP.
+ case=> Q [not_cQQ dimQ _] [R]; move/cyclic_abelian=> cRR [defP _].
+ have [_ mulQR _] := cprodP defP; have [sQP _] := mulG_sub mulQR.
+ rewrite (subset_trans sXP') // -(der_cprod 1 defP) (derG1P cRR) cprodg1.
+ have{dimQ} dimQ: logn p #|Q| <= 3 by rewrite dimQ.
+ have [[_ ->] _] := p3group_extraspecial (pgroupS sQP pP) not_cQQ dimQ.
+ by case/cprodP: (center_cprod defP) => _ <- _; exact: mulG_subl.
+have uniqP: 'M(P) = [set M].
+ exact: def_uniq_mmax (nonabelian_Uniqueness pP not_cPP) maxM sPM.
+rewrite (def_uniq_mmaxS _ ltCXG uniqP) //.
+by rewrite centsC (subset_trans sXZ) // subsetIr.
+Qed.
+
+(* This is B & G, Proposition 12.15. *)
+Proposition sigma_subgroup_embedding M q X Mstar :
+ M \in 'M -> q \in \sigma(M) -> X \subset M -> q.-group X -> X :!=: 1 ->
+ Mstar \in 'M('N(X)) :\ M ->
+ [/\ (*a*) gval Mstar \notin M :^: G,
+ forall S, q.-Sylow(M :&: Mstar) S -> X \subset S ->
+ (*b*) 'N(S) \subset M
+ /\ (*c*) q.-Sylow(Mstar) S
+ & if q \in \sigma(Mstar)
+ (*d*) then
+ [/\ (*1*) Mstar`_\beta * (M :&: Mstar) = Mstar,
+ (*2*) {subset \tau1(Mstar) <= [predU \tau1(M) & \alpha(M)]}
+ & (*3*) M`_\beta = M`_\alpha /\ M`_\alpha != 1]
+ (*e*) else
+ [/\ (*1*) q \in \tau2(Mstar),
+ (*2*) {subset [predI \pi(M) & \sigma(Mstar)] <= \beta(Mstar)}
+ & (*3*) \sigma(Mstar)^'.-Hall(Mstar) (M :&: Mstar)]].
+Proof.
+move: Mstar => H maxM sMq sXM qX ntX /setD1P[neqHM maxNX_H].
+have [q_pr _ _] := pgroup_pdiv qX ntX; have [maxH sNX_H] := setIdP maxNX_H.
+have sXH := subset_trans (normG X) sNX_H.
+have sX_MH: X \subset M :&: H by apply/subsetIP.
+have parts_bc S:
+ q.-Sylow(M :&: H) S -> X \subset S -> 'N(S) \subset M /\ q.-Sylow(H) S.
+- move=> sylS sXS; have [sS_MH qS _] := and3P sylS.
+ have [sSM sSH] := subsetIP sS_MH.
+ have sNS_M: 'N(S) \subset M.
+ have [cycS|] := boolP (cyclic S); last exact: norm_noncyclic_sigma qS _.
+ have [T sylT sST] := Sylow_superset sSM qS; have [sTM qT _] := and3P sylT.
+ rewrite -(nilpotent_sub_norm (pgroup_nil qT) sST).
+ exact: norm_sigma_Sylow sylT.
+ rewrite (sub_pHall sylS (pgroupS (subsetIl T _) qT)) //.
+ by rewrite subsetI sST normG.
+ by rewrite setISS // (subset_trans (char_norms _) sNX_H) // sub_cyclic_char.
+ split=> //; have [T sylT sST] := Sylow_superset sSH qS.
+ have [sTH qT _] := and3P sylT.
+ rewrite -(nilpotent_sub_norm (pgroup_nil qT) sST) //.
+ rewrite (sub_pHall sylS (pgroupS (subsetIl T _) qT)) //=.
+ by rewrite subsetI sST normG.
+ by rewrite /= setIC setISS.
+have [S sylS sXS] := Sylow_superset sX_MH qX; have [sS_MH qS _] := and3P sylS.
+have [sSM sSH] := subsetIP sS_MH; have [sNS_M sylS_H] := parts_bc S sylS sXS.
+have notMGH: gval H \notin M :^: G.
+ by apply: mmax_norm_notJ maxM maxH qX sXM sNX_H _; rewrite sMq eq_sym neqHM.
+have /orP[sHq | t2Hq] := prime_class_mmax_norm maxH qX sNX_H; last first.
+ have [/= sH'q rqH] := andP t2Hq; rewrite [q \in _](negPf sH'q); split=> //.
+ have [A Eq2A] := p_rank_witness q S; have [sAS abelA dimA] := pnElemP Eq2A.
+ rewrite (p_rank_Sylow sylS_H) (eqP rqH) in dimA; have [qA _] := andP abelA.
+ have [sAH sAM] := (subset_trans sAS sSH, subset_trans sAS sSM).
+ have [F hallF sAF] := Hall_superset (mmax_sol maxH) sAH (pi_pnat qA sH'q).
+ have tiHsM: H`_\sigma :&: M = 1.
+ have{Eq2A} Eq2A: A \in 'E_q^2(H) by apply/pnElemP.
+ have [_ _ _ -> //] := tau2_context maxH t2Hq Eq2A.
+ by rewrite 3!inE eq_sym neqHM maxM.
+ have{Eq2A} Eq2A_F: A \in 'E_q^2(F) by apply/pnElemP.
+ have [[nsAF _] [sCA_F _ _] _ TIsH]
+ := tau2_compl_context maxH hallF t2Hq Eq2A_F.
+ have sNA_M: 'N(A) \subset M.
+ apply: norm_noncyclic_sigma maxM sMq qA sAM _.
+ by rewrite (abelem_cyclic abelA) dimA.
+ have ->: M :&: H = F.
+ have [[_ <- _ _] [_ nAF]] := (sdprodP (sdprod_sigma maxH hallF), andP nsAF).
+ by rewrite -(group_modr _ (subset_trans nAF sNA_M)) setIC tiHsM mul1g.
+ split=> // p /andP[/= piMp sHp]; apply: wlog_neg => bH'p.
+ have bM'q: q \notin \beta(M).
+ by rewrite -predI_sigma_beta // inE /= sMq; case/tau2_not_beta: t2Hq.
+ have sM'p: p \notin \sigma(M).
+ rewrite orbit_sym in notMGH; have [_ TIsHM] := TIsH M maxM notMGH.
+ by have:= TIsHM p; rewrite inE /= sHp /= => ->.
+ have p'CA: p^'.-group 'C(A).
+ by rewrite (pgroupS sCA_F) // (pi'_p'group (pHall_pgroup hallF)).
+ have p_pr: prime p by rewrite mem_primes in piMp; case/andP: piMp.
+ have [lt_pq | lt_qp | eq_pq] := ltngtP p q; last 1 first.
+ - by rewrite eq_pq sMq in sM'p.
+ - have bH'q: q \notin \beta(H) by apply: contra sH'q; apply: beta_sub_sigma.
+ have [|[P sylP cPA] _ _] := beta'_cent_Sylow maxH bH'p bH'q qA.
+ by rewrite lt_pq sAH orbT.
+ have sylP_H := subHall_Sylow (Msigma_Hall maxH) sHp sylP.
+ have piPp: p \in \pi(P).
+ by rewrite -p_rank_gt0 (p_rank_Sylow sylP_H) p_rank_gt0 sigma_sub_pi.
+ by rewrite centsC in cPA; case/eqnP: (pnatPpi (pgroupS cPA p'CA) piPp).
+ have bM'p: p \notin \beta(M) by apply: contra sM'p; apply: beta_sub_sigma.
+ have [P sylP] := Sylow_exists p M; have [sMP pP _] := and3P sylP.
+ have [|[Q1 sylQ1 cQ1P] _ _] := beta'_cent_Sylow maxM bM'q bM'p pP.
+ by rewrite lt_qp sMP orbT.
+ have sylQ1_M := subHall_Sylow (Msigma_Hall maxM) sMq sylQ1.
+ have [x Mx sAQ1x] := Sylow_subJ sylQ1_M sAM qA.
+ have sPxCA: P :^ x \subset 'C(A) by rewrite (centsS sAQ1x) // centJ conjSg.
+ have piPx_p: p \in \pi(P :^ x).
+ by rewrite /= cardJg -p_rank_gt0 (p_rank_Sylow sylP) p_rank_gt0.
+ by case/eqnP: (pnatPpi (pgroupS sPxCA p'CA) piPx_p).
+rewrite sHq; split=> //.
+have sNS_HM: 'N(S) \subset H :&: M by rewrite subsetI (norm_sigma_Sylow sHq).
+have sylS_G: q.-Sylow(G) S := sigma_Sylow_G maxH sHq sylS_H.
+have [defM eq_abM] := nonuniq_norm_Sylow_pprod maxM maxH neqHM sylS_G sNS_HM.
+rewrite setIC eq_sym in sNS_HM neqHM defM.
+have [defH eq_abH] := nonuniq_norm_Sylow_pprod maxH maxM neqHM sylS_G sNS_HM.
+rewrite [M`_\alpha](eq_pcore M eq_abM) -/M`_\beta.
+split=> // [r t1Hr|]; last first.
+ split=> //; apply: contraNneq neqHM => Mb1.
+ by rewrite -val_eqE /= (eq_mmax maxM maxH) // -defM Mb1 mul1g subsetIr.
+have [R sylR] := Sylow_exists r (M :&: H); have [sR_MH rR _] := and3P sylR.
+have [sRM sRH] := subsetIP sR_MH; have [sH'r rrH not_rH'] := and3P t1Hr.
+have bH'r: r \notin \beta(H).
+ by apply: contra sH'r; rewrite -eq_abH; apply: alpha_sub_sigma.
+have sylR_H: r.-Sylow(H) R.
+ rewrite pHallE sRH -defH -LagrangeMr partnM ?cardG_gt0 //.
+ rewrite -(card_Hall sylR) part_p'nat ?mul1n ?(pnat_dvd (dvdn_indexg _ _)) //=.
+ by rewrite (pi_p'nat (pcore_pgroup _ _)).
+rewrite inE /= orbC -implyNb eq_abM; apply/implyP=> bM'r.
+have sylR_M: r.-Sylow(M) R.
+ rewrite pHallE sRM -defM -LagrangeMr partnM ?cardG_gt0 //.
+ rewrite -(card_Hall sylR) part_p'nat ?mul1n ?(pnat_dvd (dvdn_indexg _ _)) //=.
+ by rewrite (pi_p'nat (pcore_pgroup _ _)).
+have rrR: 'r_r(R) = 1%N by rewrite (p_rank_Sylow sylR_H) (eqP rrH).
+have piRr: r \in \pi(R) by rewrite -p_rank_gt0 rrR.
+suffices not_piM'r: r \notin \pi(M^`(1)).
+ rewrite inE /= -(p_rank_Sylow sylR_M) rrR /= -negb_or /=.
+ apply: contra not_piM'r; case/orP=> [sMr | rM'].
+ have sRMs: R \subset M`_\sigma.
+ by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) ?(pi_pgroup rR).
+ by rewrite (piSg (Msigma_der1 maxM)) // (piSg sRMs).
+ by move: piRr; rewrite !mem_primes !cardG_gt0; case/andP=> ->.
+have coMbR: coprime #|M`_\beta| #|R|.
+ exact: pnat_coprime (pcore_pgroup _ _) (pi_pnat rR _).
+have sylRM': r.-Sylow(M^`(1)) _ := Hall_setI_normal (der_normal 1 M) sylR_M.
+rewrite -p'groupEpi -partG_eq1 -(card_Hall sylRM') -trivg_card1 /=.
+rewrite (pprod_focal_coprime defM (pcore_normal _ _)) //.
+rewrite coprime_TIg ?(pnat_coprime rR (pgroupS (dergS 1 (subsetIr _ _)) _)) //.
+by rewrite p'groupEpi mem_primes (negPf not_rH') !andbF.
+Qed.
+
+(* This is B & G, Corollary 12.16. *)
+Corollary sigma_Jsub M Y :
+ M \in 'M -> \sigma(M).-group Y -> Y :!=: 1 ->
+ [/\ exists x, Y :^ x \subset M`_\sigma
+ & forall E p H,
+ \sigma(M)^'.-Hall(M) E -> p \in \pi(E) -> p \notin \beta(G) ->
+ H \in 'M(Y) -> gval H \notin M :^: G ->
+ [/\ (*a*) 'r_p('N_H(Y)) <= 1
+ & (*b*) p \in \tau1(M) -> p \notin \pi(('N_H(Y))^`(1))]].
+Proof.
+move=> maxM sM_Y ntY.
+have ltYG: Y \proper G.
+ have ltMsG: M`_\sigma \proper G.
+ exact: sub_proper_trans (pcore_sub _ _) (mmax_proper maxM).
+ rewrite properEcard subsetT (leq_ltn_trans _ (proper_card ltMsG)) //.
+ rewrite dvdn_leq ?cardG_gt0 // (card_Hall (Msigma_Hall_G maxM)).
+ by rewrite -(part_pnat_id sM_Y) partn_dvd // cardSg ?subsetT.
+have [q q_pr rFY] := rank_witness 'F(Y).
+have [X [ntX qX charX]]: exists X, [/\ gval X :!=: 1, q.-group X & X \char Y].
+ exists ('O_q(Y))%G; rewrite pcore_pgroup pcore_char //.
+ rewrite -rank_gt0 /= -p_core_Fitting.
+ rewrite (rank_Sylow (nilpotent_pcore_Hall q (Fitting_nil Y))) -rFY.
+ by rewrite rank_gt0 (trivg_Fitting (mFT_sol ltYG)).
+have sXY: X \subset Y := char_sub charX.
+have sMq: q \in \sigma(M).
+ apply: (pnatPpi (pgroupS sXY sM_Y)).
+ by rewrite -p_rank_gt0 -(rank_pgroup qX) rank_gt0.
+without loss sXMs: M maxM sM_Y sMq / X \subset M`_\sigma.
+ move=> IH; have [Q sylQ] := Sylow_exists q M`_\sigma.
+ have sQMs := pHall_sub sylQ.
+ have sylQ_G := subHall_Sylow (Msigma_Hall_G maxM) sMq sylQ.
+ have [x Gx sXQx] := Sylow_subJ sylQ_G (subsetT X) qX.
+ have: X \subset M`_\sigma :^ x by rewrite (subset_trans sXQx) ?conjSg.
+ rewrite -MsigmaJ => /IH; rewrite sigmaJ mmaxJ (eq_pgroup _ (sigmaJ _ _)).
+ case => // [[y sYyMx] parts_ab].
+ split=> [|E p H hallE piEp bG'p maxY_H notMGH].
+ by exists (y * x^-1); rewrite conjsgM sub_conjgV -MsigmaJ.
+ have:= parts_ab (E :^ x)%G p H; rewrite tau1J /= cardJg pHallJ2.
+ rewrite (eq_pHall _ _ (eq_negn (sigmaJ _ _))).
+ by rewrite 2!orbit_sym (orbit_transl (mem_orbit _ _ _)) //; apply.
+have pre_part_a E p H:
+ \sigma(M)^'.-Hall(M) E -> p \in \pi(E) ->
+ H \in 'M(Y) -> gval H \notin M :^: G -> 'r_p(H :&: M) <= 1.
+- move=> hallE piEp /setIdP[maxH sYH] notMGH; rewrite leqNgt.
+ apply: contra ntX => /p_rank_geP[A /pnElemP[/subsetIP[sAH sAM] abelA dimA]].
+ have{abelA dimA} Ep2A: A \in 'E_p^2(M) by apply/pnElemP.
+ have rpMgt1: 'r_p(M) > 1 by apply/p_rank_geP; exists A.
+ have t2Mp: p \in \tau2(M).
+ move: piEp; rewrite (partition_pi_sigma_compl maxM hallE) orbCA orbC.
+ by rewrite -2!andb_orr orNb eqn_leq leqNgt rpMgt1 !andbF.
+ have sM'p := pnatPpi (pHall_pgroup hallE) piEp.
+ have [_ _ _ tiMsH _] := tau2_context maxM t2Mp Ep2A.
+ rewrite -subG1 -(tiMsH H); first by rewrite subsetI sXMs (subset_trans sXY).
+ by rewrite 3!inE maxH (contra_orbit _ _ notMGH).
+have [sNX_M | not_sNX_M] := boolP ('N(X) \subset M).
+ have sNY_M: 'N(Y) \subset M := subset_trans (char_norms charX) sNX_M.
+ split=> [|E p H hallE piEp bG'p maxY_H notMGH]; last split.
+ - exists 1; rewrite act1 (sub_Hall_pcore (Msigma_Hall maxM)) //.
+ exact: subset_trans (normG Y) sNY_M.
+ - rewrite (leq_trans (p_rankS p (setIS H sNY_M))) ?(pre_part_a E) //.
+ case/and3P=> _ _; apply: contra; rewrite mem_primes => /and3P[_ _ pM'].
+ by apply: dvdn_trans pM' (cardSg (dergS 1 _)); rewrite subIset ?sNY_M ?orbT.
+have [L maxNX_L] := mmax_exists (mFT_norm_proper ntX (mFT_pgroup_proper qX)).
+have [maxL sNX_L] := setIdP maxNX_L.
+have{maxNX_L} maxNX_L: L \in 'M('N(X)) :\ M.
+ by rewrite 2!inE maxNX_L andbT; apply: contraNneq not_sNX_M => <-.
+have sXM := subset_trans sXMs (pcore_sub _ M).
+have [notMGL _ embedL] := sigma_subgroup_embedding maxM sMq sXM qX ntX maxNX_L.
+pose K := (if q \in \sigma(L) then L`_\beta else L`_\sigma)%G.
+have sM'K: \sigma(M)^'.-group K.
+ rewrite orbit_sym in notMGL.
+ rewrite /K; case: (boolP (q \in _)) embedL => [sLq _ | sL'q [t2Lq _ _]].
+ have [_ TIaLsM _] := sigma_disjoint maxL maxM notMGL.
+ apply: sub_pgroup (pcore_pgroup _ _) => p bLp.
+ by apply: contraFN (TIaLsM p) => /= sMp; rewrite inE /= beta_sub_alpha.
+ have [F hallF] := ex_sigma_compl maxL.
+ have [A Ep2A _] := ex_tau2Elem hallF t2Lq.
+ have [_ _ _ TIsLs] := tau2_compl_context maxL hallF t2Lq Ep2A.
+ have{TIsLs} [_ TIsLsM] := TIsLs M maxM notMGL.
+ apply: sub_pgroup (pcore_pgroup _ _) => p sLp.
+ by apply: contraFN (TIsLsM p) => /= sMp; rewrite inE /= sLp.
+have defL: K * (M :&: L) = L.
+ rewrite /K; case: (q \in _) embedL => [] [] // _ _.
+ by move/(sdprod_Hall_pcoreP (Msigma_Hall maxL)); case/sdprodP.
+have sYL := subset_trans (char_norm charX) sNX_L.
+have [x sYxMs]: exists x, Y :^ x \subset M`_\sigma.
+ have solML := solvableS (subsetIl M L) (mmax_sol maxM).
+ have [H hallH] := Hall_exists \sigma(M) solML.
+ have [sHM sHL] := subsetIP (pHall_sub hallH).
+ have hallH_L: \sigma(M).-Hall(L) H.
+ rewrite pHallE sHL -defL -LagrangeMr partnM ?cardG_gt0 //.
+ rewrite -(card_Hall hallH) part_p'nat ?mul1n //=.
+ exact: pnat_dvd (dvdn_indexg _ _) sM'K.
+ have [x _ sYxH]:= Hall_Jsub (mmax_sol maxL) hallH_L sYL sM_Y.
+ exists x; rewrite (sub_Hall_pcore (Msigma_Hall maxM)) ?pgroupJ //.
+ exact: subset_trans sYxH sHM.
+split=> [|E p H hallE piEp bG'p maxY_H notMGH]; first by exists x.
+have p'K: p^'.-group K.
+ have bL'p: p \notin \beta(L).
+ by rewrite -predI_sigma_beta // negb_and bG'p orbT.
+ rewrite /K; case: (q \in _) embedL => [_ | [_ bLp _]].
+ by rewrite (pi_p'group (pcore_pgroup _ _)).
+ rewrite (pi_p'group (pcore_pgroup _ _)) //; apply: contra bL'p => /= sLp.
+ by rewrite bLp // inE /= (piSg (pHall_sub hallE)).
+have sNHY_L: 'N_H(Y) \subset L.
+ by rewrite subIset ?(subset_trans (char_norms charX)) ?orbT.
+rewrite (leq_trans (p_rankS p sNHY_L)); last first.
+ have [P sylP] := Sylow_exists p (M :&: L).
+ have [_ sPL] := subsetIP (pHall_sub sylP).
+ have{sPL} sylP_L: p.-Sylow(L) P.
+ rewrite pHallE sPL -defL -LagrangeMr partnM ?cardG_gt0 //.
+ rewrite -(card_Hall sylP) part_p'nat ?mul1n //=.
+ exact: pnat_dvd (dvdn_indexg _ _) p'K.
+ rewrite -(p_rank_Sylow sylP_L) {P sylP sylP_L}(p_rank_Sylow sylP).
+ by rewrite /= setIC (pre_part_a E) // inE maxL.
+split=> // t1Mp; rewrite (contra ((piSg (dergS 1 sNHY_L)) p)) // -p'groupEpi.
+have nsKL: K <| L by rewrite /K; case: ifP => _; apply: pcore_normal.
+have [sKL nKL] := andP nsKL; have nKML := subset_trans (subsetIr M L) nKL.
+suffices: p^'.-group (K * (M :&: L)^`(1)).
+ have sder := subset_trans (der_sub 1 _).
+ rewrite -norm_joinEr ?sder //; apply: pgroupS => /=.
+ rewrite norm_joinEr -?quotientSK ?sder //= !quotient_der //.
+ by rewrite -{1}defL quotientMidl.
+rewrite pgroupM p'K (pgroupS (dergS 1 (subsetIl M L))) // p'groupEpi.
+by rewrite mem_primes andbA andbC negb_and; case/and3P: t1Mp => _ _ ->.
+Qed.
+
+(* This is B & G, Lemma 12.17. *)
+Lemma sigma_compl_embedding M E (Ms := M`_\sigma) :
+ M \in 'M -> \sigma(M)^'.-Hall(M) E ->
+ [/\ 'C_Ms(E) \subset Ms^`(1), [~: Ms, E] = Ms
+ & forall g (MsMg := Ms :&: M :^ g), g \notin M ->
+ [/\ cyclic MsMg, \beta(M)^'.-group MsMg & MsMg :&: Ms^`(1) = 1]].
+Proof.
+move=> maxM hallE; have [sEM s'E _] := and3P hallE.
+have solMs: solvable Ms := solvableS (pcore_sub _ _) (mmax_sol maxM).
+have defM := coprime_der1_sdprod (sdprod_sigma maxM hallE).
+have{s'E} coMsE: coprime #|Ms| #|E| := pnat_coprime (pcore_pgroup _ _) s'E.
+have{defM coMsE} [-> ->] := defM coMsE solMs (Msigma_der1 maxM).
+split=> // g MsMg notMg.
+have sMsMg: \sigma(M).-group MsMg := pgroupS (subsetIl _ _) (pcore_pgroup _ _).
+have EpMsMg p n X: X \in 'E_p^n(MsMg) -> n > 0 ->
+ n = 1%N /\ ~~ ((p \in \beta(M)) || (X \subset Ms^`(1))).
+- move=> EpX n_gt0; have [sXMsMg abelX dimX] := pnElemP EpX.
+ have [[sXMs sXMg] [pX _]] := (subsetIP sXMsMg, andP abelX).
+ have sXM := subset_trans sXMs (pcore_sub _ _).
+ have piXp: p \in \pi(X) by rewrite -p_rank_gt0 p_rank_abelem ?dimX.
+ have sMp: p \in \sigma(M) := pnatPpi (pgroupS sXMs (pcore_pgroup _ _)) piXp.
+ have not_sCX_M: ~~ ('C(X) \subset M).
+ apply: contra notMg => sCX_M; rewrite -groupV.
+ have [transCX _ _] := sigma_group_trans maxM sMp pX.
+ have [|c CXc [m Mm ->]] := transCX g^-1 sXM; rewrite ?sub_conjgV //.
+ by rewrite groupM // (subsetP sCX_M).
+ have cycX: cyclic X.
+ apply: contraR not_sCX_M => ncycX; apply: subset_trans (cent_sub _) _.
+ exact: norm_noncyclic_sigma maxM sMp pX sXM ncycX.
+ have n1: n = 1%N by apply/eqP; rewrite eqn_leq -{1}dimX -abelem_cyclic ?cycX.
+ rewrite n1 in dimX *; split=> //; apply: contra not_sCX_M.
+ by case/cent_der_sigma_uniq=> //; [apply/pnElemP | case/mem_uniq_mmax].
+have tiMsMg_Ms': MsMg :&: Ms^`(1) = 1.
+ apply/eqP/idPn; rewrite -rank_gt0 => /rank_geP[X /nElemP[p]].
+ case/pnElemP=> /subsetIP[sXMsMg sXMs'] abelX dimX.
+ by case: (EpMsMg p 1%N X) => //; [apply/pnElemP | rewrite sXMs' orbT].
+split=> //; last first.
+ apply: sub_in_pnat sMsMg => p.
+ by rewrite -p_rank_gt0 => /p_rank_geP[X /EpMsMg[] // _ /norP[]].
+rewrite abelian_rank1_cyclic.
+ by rewrite leqNgt; apply/rank_geP=> [[X /nElemP[p /EpMsMg[]]]].
+by rewrite (sameP derG1P trivgP) -tiMsMg_Ms' subsetI der_sub dergS ?subsetIl.
+Qed.
+
+(* This is B & G, Lemma 12.18. *)
+(* We corrected an omission in the text, which fails to quote Lemma 10.3 to *)
+(* justify the two p-rank inequalities (12.5) and (12.6), and indeed *)
+(* erroneously refers to 12.2(a) for (12.5). Note also that the loosely *)
+(* justified equalities of Ohm_1 subgroups are in fact unnecessary. *)
+Lemma cent_Malpha_reg_tau1 M p q P Q (Ma := M`_\alpha) :
+ M \in 'M -> p \in \tau1(M) -> q \in p^' -> P \in 'E_p^1(M) -> Q :!=: 1 ->
+ P \subset 'N(Q) -> 'C_Q(P) = 1 -> 'M('N(Q)) != [set M] ->
+ [/\ (*a*) Ma != 1 -> q \notin \alpha(M) -> q.-group Q -> Q \subset M ->
+ 'C_Ma(P) != 1 /\ 'C_Ma(Q <*> P) = 1
+ & (*b*) q.-Sylow(M) Q ->
+ [/\ \alpha(M) =i \beta(M), Ma != 1, q \notin \alpha(M),
+ 'C_Ma(P) != 1 & 'C_Ma(Q <*> P) = 1]].
+Proof.
+move=> maxM t1p p'q EpP ntQ nQP regPQ nonuniqNQ.
+set QP := Q <*> P; set CaQP := 'C_Ma(QP); set part_a := _ -> _.
+have ssolM := solvableS _ (mmax_sol maxM).
+have [sPM abelP oP] := pnElemPcard EpP; have{abelP} [pP _] := andP abelP.
+have p_pr := pnElem_prime EpP; have [s'p _] := andP t1p.
+have a'p: p \in \alpha(M)^' by apply: contra s'p; apply: alpha_sub_sigma.
+have{a'p} [a'P t2'p] := (pi_pgroup pP a'p, tau2'1 t1p).
+have uniqCMX: 'M('C_M(_)) = [set M] := def_uniq_mmax _ maxM (subsetIl _ _).
+have nQ_CMQ: 'C_M(Q) \subset 'N(Q) by rewrite setIC subIset ?cent_sub.
+have part_a_holds: part_a.
+ move=> ntMa a'q qQ sQM; have{p'q} p'Q := pi_pgroup qQ p'q.
+ have{p'Q} coQP: coprime #|Q| #|P| by rewrite coprime_sym (pnat_coprime pP).
+ have{a'q} a'Q: \alpha(M)^'.-group Q by rewrite (pi_pgroup qQ).
+ have rCMaQle1: 'r('C_Ma(Q)) <= 1.
+ rewrite leqNgt; apply: contra nonuniqNQ => rCMaQgt1; apply/eqP.
+ apply: def_uniq_mmaxS (uniqCMX Q _) => //; last exact: cent_alpha'_uniq.
+ exact: mFT_norm_proper (mFT_pgroup_proper qQ).
+ have rCMaPle1: 'r('C_Ma(P)) <= 1.
+ have: ~~ ('N(P) \subset M).
+ by apply: contra (prime_class_mmax_norm maxM pP) _; apply/norP.
+ rewrite leqNgt; apply: contra => rCMaPgt1.
+ apply: (sub_uniq_mmax (uniqCMX P _)); first exact: cent_alpha'_uniq.
+ by rewrite /= setIC subIset ?cent_sub.
+ exact: mFT_norm_proper (nt_pnElem EpP _) (mFT_pgroup_proper pP).
+ have [sMaM nMaM] := andP (pcore_normal _ M : Ma <| M).
+ have aMa: \alpha(M).-group Ma by rewrite pcore_pgroup.
+ have nMaQP: QP \subset 'N(Ma) by rewrite join_subG !(subset_trans _ nMaM).
+ have{nMaM} coMaQP: coprime #|Ma| #|QP|.
+ by rewrite (pnat_coprime aMa) ?[QP]norm_joinEr // [pnat _ _]pgroupM ?a'Q.
+ pose r := pdiv #|if CaQP == 1 then Ma else CaQP|.
+ have{ntMa} piMar: r \in \pi(Ma).
+ rewrite /r; case: ifPn => [_| ntCaQP]; first by rewrite pi_pdiv cardG_gt1.
+ by rewrite (piSg (subsetIl Ma 'C(QP))) // pi_pdiv cardG_gt1.
+ have{aMa} a_r: r \in \alpha(M) := pnatPpi aMa piMar.
+ have [r'Q r'P] : r^'.-group Q /\ r^'.-group P by rewrite !(pi'_p'group _ a_r).
+ have [Rc /= sylRc] := Sylow_exists r [group of CaQP].
+ have [sRcCaQP rRc _] := and3P sylRc; have [sRcMa cQPRc] := subsetIP sRcCaQP.
+ have nRcQP: QP \subset 'N(Rc) by rewrite cents_norm // centsC.
+ have{nMaQP rRc coMaQP sRcCaQP sRcMa nRcQP} [R [sylR nR_QP sRcR]] :=
+ coprime_Hall_subset nMaQP coMaQP (ssolM _ sMaM) sRcMa rRc nRcQP.
+ have{nR_QP} [[sRMa rR _] [nRQ nRP]] := (and3P sylR, joing_subP nR_QP).
+ have{piMar} ntR: R :!=: 1 by rewrite -rank_gt0 (rank_Sylow sylR) p_rank_gt0.
+ have [r_pr _ _] := pgroup_pdiv rR ntR.
+ have sylR_M := subHall_Sylow (Malpha_Hall maxM) a_r sylR.
+ have{rCMaQle1 a_r} not_cRQ: ~~ (Q \subset 'C(R)).
+ apply: contraL rCMaQle1; rewrite centsC => cQR; rewrite -ltnNge ltnW //.
+ by rewrite (leq_trans a_r) // -(rank_Sylow sylR_M) rankS // subsetI sRMa.
+ have [R1 [charR1 _ _ expR1 rCR1_AutR]] := critical_odd rR (mFT_odd R) ntR.
+ have [sR1R nR1R] := andP (char_normal charR1); have rR1 := pgroupS sR1R rR.
+ have [nR1P nR1Q] := (char_norm_trans charR1 nRP, char_norm_trans charR1 nRQ).
+ have [coR1Q coR1P] := (pnat_coprime rR1 r'Q, pnat_coprime rR1 r'P).
+ have {rCR1_AutR not_cRQ} not_cR1Q: ~~ (Q \subset 'C(R1)).
+ apply: contra not_cRQ => cR1Q; rewrite -subsetIidl.
+ rewrite -quotient_sub1 ?normsI ?normG ?norms_cent // subG1 trivg_card1.
+ rewrite (pnat_1 _ (quotient_pgroup _ r'Q)) //= -ker_conj_aut.
+ rewrite (card_isog (first_isog_loc _ _)) //; apply: pgroupS rCR1_AutR.
+ apply/subsetP=> za; case/morphimP=> z nRz Qz ->; rewrite inE Aut_aut inE.
+ apply/subsetP=> x R1x; rewrite inE [_ x _]norm_conj_autE ?(subsetP sR1R) //.
+ by rewrite /conjg -(centsP cR1Q z) ?mulKg.
+ pose R0 := 'C_R1(Q); have sR0R1: R0 \subset R1 := subsetIl R1 'C(Q).
+ have nR0P: P \subset 'N(R0) by rewrite normsI ?norms_cent.
+ have nR0Q: Q \subset 'N(R0) by rewrite normsI ?norms_cent ?normG.
+ pose R1Q := R1 <*> Q; have defR1Q: R1 * Q = R1Q by rewrite -norm_joinEr.
+ have [[sR1_R1Q sQ_R1Q] tiR1Q] := (joing_sub (erefl R1Q), coprime_TIg coR1Q).
+ have not_nilR1Q: ~~ nilpotent R1Q.
+ by apply: contra not_cR1Q => /sub_nilpotent_cent2; apply.
+ have not_nilR1Qb: ~~ nilpotent (R1Q / R0).
+ apply: contra not_cR1Q => nilR1Qb.
+ have [nilR1 solR1] := (pgroup_nil rR1, pgroup_sol rR1).
+ rewrite centsC -subsetIidl -(nilpotent_sub_norm nilR1 sR0R1) //= -/R0.
+ rewrite -(quotientSGK (subsetIr R1 _)) ?coprime_quotient_cent //= -/R0.
+ rewrite quotientInorm subsetIidl /= centsC -/R0.
+ by rewrite (sub_nilpotent_cent2 nilR1Qb) ?quotientS ?coprime_morph.
+ have coR1QP: coprime #|R1Q| #|P|.
+ by rewrite -defR1Q TI_cardMg // coprime_mull coR1P.
+ have defR1QP: R1Q ><| P = R1Q <*> P.
+ by rewrite sdprodEY ?normsY ?coprime_TIg.
+ have sR1Ma := subset_trans sR1R sRMa; have sR1M := subset_trans sR1Ma sMaM.
+ have solR1Q: solvable R1Q by rewrite ssolM // !join_subG sR1M.
+ have solR1QP: solvable (R1Q <*> P) by rewrite ssolM // !join_subG sR1M sQM.
+ have defCR1QP: 'C_R1Q(P) = 'C_R1(P).
+ by rewrite -defR1Q -subcent_TImulg ?regPQ ?mulg1 //; apply/subsetIP.
+ have ntCR1P: 'C_R1(P) != 1.
+ apply: contraNneq not_nilR1Q => regPR1.
+ by rewrite (prime_Frobenius_sol_kernel_nil defR1QP) ?oP ?defCR1QP.
+ split; first exact: subG1_contra (setSI _ sR1Ma) ntCR1P.
+ have{rCMaPle1} cycCRP: cyclic 'C_R(P).
+ have rCRP: r.-group 'C_R(P) := pgroupS (subsetIl R _) rR.
+ rewrite (odd_pgroup_rank1_cyclic rCRP) ?mFT_odd -?rank_pgroup {rCRP}//.
+ by rewrite (leq_trans (rankS _) rCMaPle1) ?setSI.
+ have{ntCR1P} oCR1P: #|'C_R1(P)| = r.
+ have cycCR1P: cyclic 'C_R1(P) by rewrite (cyclicS _ cycCRP) ?setSI.
+ apply: cyclic_abelem_prime ntCR1P => //.
+ by rewrite abelemE ?cyclic_abelian // -expR1 exponentS ?subsetIl.
+ apply: contraNeq not_nilR1Qb => ntCaQP.
+ have{Rc sRcR sylRc cQPRc ntCaQP} ntCRQP: 'C_R(QP) != 1.
+ suffices: Rc :!=: 1 by apply: subG1_contra; apply/subsetIP.
+ rewrite -rank_gt0 (rank_Sylow sylRc) p_rank_gt0.
+ by rewrite /r (negPf ntCaQP) pi_pdiv cardG_gt1.
+ have defR1QPb: (R1Q / R0) ><| (P / R0) = R1Q <*> P / R0.
+ have [_ <- nR1QP _] := sdprodP defR1QP; rewrite quotientMr //.
+ by rewrite sdprodE ?quotient_norms // coprime_TIg ?coprime_morph.
+ have tiPR0: R0 :&: P = 1 by rewrite coprime_TIg // (coprimeSg sR0R1).
+ have prPb: prime #|P / R0| by rewrite -(card_isog (quotient_isog _ _)) ?oP.
+ rewrite (prime_Frobenius_sol_kernel_nil defR1QPb) ?quotient_sol //.
+ rewrite -coprime_quotient_cent ?(subset_trans sR0R1) // quotientS1 //=.
+ rewrite defCR1QP -{2}(setIidPl sR1R) -setIA subsetI subsetIl.
+ apply: subset_trans (setIS R (centS (joing_subl Q P))).
+ rewrite -(cardSg_cyclic cycCRP) ?setIS ?setSI ?centS ?joing_subr // oCR1P.
+ by have [_ -> _] := pgroup_pdiv (pgroupS (subsetIl R _) rR) ntCRQP.
+split=> // sylQ; have [sQM qQ _] := and3P sylQ.
+have ltQG := mFT_pgroup_proper qQ; have ltNQG := mFT_norm_proper ntQ ltQG.
+have{p'q} p'Q := pi_pgroup qQ p'q.
+have{p'Q} coQP: coprime #|Q| #|P| by rewrite coprime_sym (pnat_coprime pP).
+have sQM': Q \subset M^`(1).
+ by rewrite -(coprime_cent_prod nQP) ?ssolM // regPQ mulg1 commgSS.
+have ntMa: Ma != 1.
+ apply: contraNneq nonuniqNQ => Ma1.
+ rewrite (mmax_normal maxM _ ntQ) ?mmax_sup_id //.
+ apply: char_normal_trans (der_normal 1 M).
+ have sylQ_M': q.-Sylow(M^`(1)) Q := pHall_subl sQM' (der_sub 1 M) sylQ.
+ rewrite (nilpotent_Hall_pcore _ sylQ_M') ?pcore_char //.
+ by rewrite (isog_nil (quotient1_isog _)) -Ma1 Malpha_quo_nil.
+have a'q: q \notin \alpha(M).
+ apply: contra nonuniqNQ => a_q.
+ have uniqQ: Q \in 'U by rewrite rank3_Uniqueness ?(rank_Sylow sylQ).
+ by rewrite (def_uniq_mmaxS _ _ (def_uniq_mmax _ _ sQM)) ?normG.
+have b'q := contra (@beta_sub_alpha _ M _) a'q.
+case: part_a_holds => // ntCaP regQP; split=> {ntCaP regQP}// r.
+apply/idP/idP=> [a_r | ]; last exact: beta_sub_alpha.
+apply: contraR nonuniqNQ => b'r; apply/eqP.
+apply: def_uniq_mmaxS (uniqCMX Q _) => //.
+have q'r: r != q by apply: contraNneq a'q => <-.
+by have [|_ -> //] := beta'_cent_Sylow maxM b'r b'q qQ; rewrite q'r sQM'.
+Qed.
+
+(* This is B & G, Lemma 12.19. *)
+(* We have used lemmas 10.8(b) and 10.2(c) rather than 10.9(a) as suggested *)
+(* in the text; this avoids a quantifier inversion! *)
+Lemma der_compl_cent_beta' M E :
+ M \in 'M -> \sigma(M)^'.-Hall(M) E ->
+ exists2 H : {group gT}, \beta(M)^'.-Hall(M`_\sigma) H & E^`(1) \subset 'C(H).
+Proof.
+move=> maxM hallE; have [sEM s'E _] := and3P hallE.
+have s'E': \sigma(M)^'.-group E^`(1) := pgroupS (der_sub 1 E) s'E.
+have b'E': \beta(M)^'.-group E^`(1).
+ by apply: sub_pgroup s'E' => p; apply: contra; apply: beta_sub_sigma.
+have solM': solvable M^`(1) := solvableS (der_sub 1 M) (mmax_sol maxM).
+have [K hallK sE'K] := Hall_superset solM' (dergS 1 sEM) b'E'.
+exists (K :&: M`_\sigma)%G.
+ apply: Hall_setI_normal hallK.
+ exact: normalS (Msigma_der1 maxM) (der_sub 1 M) (pcore_normal _ M).
+have nilK: nilpotent K.
+ by have [sKM' b'K _] := and3P hallK; apply: beta'_der1_nil sKM'.
+rewrite (sub_nilpotent_cent2 nilK) ?subsetIl ?(coprimeSg (subsetIr _ _)) //.
+exact: pnat_coprime (pcore_pgroup _ _) s'E'.
+Qed.
+
+End Section12.
+
+Implicit Arguments tau2'1 [[gT] [M] x].
+Implicit Arguments tau3'1 [[gT] [M] x].
+Implicit Arguments tau3'2 [[gT] [M] x].
+