aboutsummaryrefslogtreecommitdiff
path: root/mathcomp/odd_order/BGsection12.v
diff options
context:
space:
mode:
authorEnrico Tassi2018-04-17 16:57:13 +0200
committerEnrico Tassi2018-04-17 16:57:13 +0200
commiteaa90cf9520e43d0b05fc6431a479e6b9559ef0e (patch)
tree8499953a468a8d8be510dd0d60232cbd8984c1ec /mathcomp/odd_order/BGsection12.v
parentc1ec9cd8e7e50f73159613c492aad4c6c40bc3aa (diff)
move odd_order to its own repository
Diffstat (limited to 'mathcomp/odd_order/BGsection12.v')
-rw-r--r--mathcomp/odd_order/BGsection12.v2686
1 files changed, 0 insertions, 2686 deletions
diff --git a/mathcomp/odd_order/BGsection12.v b/mathcomp/odd_order/BGsection12.v
deleted file mode 100644
index ea39e9d..0000000
--- a/mathcomp/odd_order/BGsection12.v
+++ /dev/null
@@ -1,2686 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq choice div fintype.
-From mathcomp
-Require Import path bigop finset prime fingroup morphism perm automorphism.
-From mathcomp
-Require Import quotient action gproduct gfunctor pgroup cyclic commutator.
-From mathcomp
-Require Import center gseries nilpotent sylow abelian maximal hall frobenius.
-From mathcomp
-Require Import BGsection1 BGsection3 BGsection4 BGsection5 BGsection6.
-From mathcomp
-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; apply: 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; apply: sigma'_rank2_max.
-Qed.
-
-End Introduction.
-
-Arguments tau2'1 {M} [x].
-Arguments tau3'1 {M} [x].
-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 by rewrite !gFnormal_trans.
-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 apply: 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 ?gFsub_trans //=.
- 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 ?nsE'piE.
- 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.
- have{sKNEP} [sKE nPK] := subsetIP sKNEP; 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; apply: subset_trans (centS sA0A).
-have nsHsH: H`_\sigma <| H by apply: 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 => // -> _ _; apply: 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=> //; apply/pnElemP.
- have maxAM: M \in 'M(A) by apply/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.
- do 2!rewrite {1}subsetI {1}(subset_trans (subsetIl _ _) (pcore_sub _ _)).
- have sCYH: 'C(Y) \subset H := subset_trans (cent_sub Y) sNYH.
- by split=> // [/cAMs | /cAMa]; rewrite centsC; apply/subset_trans/setIS.
-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) // gFsub_trans ?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) //=.
-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) ?gFnormal_trans.
-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).
- by rewrite (nilpotent_Hall_pcore nilHs sylP_Hs) !gFnorm_trans ?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/gFnorms.
-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 apply: 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 apply: 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 => _; apply: 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 by rewrite !gFsub_trans.
- 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 [_ <| _]andbC gFsub_trans ?gFnorm //.
- rewrite Fitting_max ?gFnormal ?(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 gFnormal_trans // /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) => // _ [// |<- _] _ _ _ _; apply: 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.
- by rewrite (nilpotent_Hall_pcore nilF hallE2_F) !gFnormal_trans.
-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 apply/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; apply: 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 apply: (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 commGC -quotient_cents2 ?gFnorm_trans ?normsG //=.
- 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 by apply: gFsub_trans.
- 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=> Sz; rewrite sub_center_normal ?cycle_subG ?(subsetP sSZ).
- 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 apply: 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 apply: 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: 'Ohm_1(Q) \subset 'N(Q0) by apply: gFsub_trans.
- 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) ['Z(E) :^ x](normsP _ x Ex) ?gFnorm //.
- set Q11x := _ :^ x; have oQ11x: #|Q11x| = q.
- by rewrite cardJg (Ohm1_cyclic_pgroup_prime _ qQ1) // -rank_gt0 rQ1.
- apply: regE1subZ; rewrite /= -/Q11x.
- apply/nElemP; exists q; rewrite p1ElemE // !inE oQ11x.
- by rewrite (subset_trans _ sQ1xE1) //= conjSg Ohm_sub.
- have /cyclicP[y defQ11x]: cyclic Q11x by rewrite prime_cyclic ?oQ11x.
- rewrite defQ11x cent_cycle regU13 //.
- rewrite !inE -order_gt1 -cycle_subG /order -defQ11x oQ11x prime_gt1 //.
- by rewrite -(normsP (normal_norm nsUE) x Ex) conjSg gFsub_trans.
- 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 apply/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 apply: 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; apply/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) => _ <- _; apply: 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_eqP (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)).
- rewrite -norm_joinEr ?gFsub_trans //; apply: pgroupS => /=.
- rewrite norm_joinEr -?quotientSK ?gFsub_trans //= !quotient_der //.
- by rewrite -[in L / K]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 //.
- have sylQ_M': q.-Sylow(M^`(1)) Q := pHall_subl sQM' (der_sub 1 M) sylQ.
- rewrite (nilpotent_Hall_pcore _ sylQ_M') ?gFnormal_trans //.
- 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.
-
-Arguments tau2'1 {gT M} [x].
-Arguments tau3'1 {gT M} [x].
-Arguments tau3'2 {gT M} [x].
-