diff options
| author | Enrico Tassi | 2015-03-09 11:07:53 +0100 |
|---|---|---|
| committer | Enrico Tassi | 2015-03-09 11:24:38 +0100 |
| commit | fc84c27eac260dffd8f2fb1cb56d599f1e3486d9 (patch) | |
| tree | c16205f1637c80833a4c4598993c29fa0fd8c373 /mathcomp/odd_order/BGsection10.v | |
Initial commit
Diffstat (limited to 'mathcomp/odd_order/BGsection10.v')
| -rw-r--r-- | mathcomp/odd_order/BGsection10.v | 1497 |
1 files changed, 1497 insertions, 0 deletions
diff --git a/mathcomp/odd_order/BGsection10.v b/mathcomp/odd_order/BGsection10.v new file mode 100644 index 0000000..88b4c39 --- /dev/null +++ b/mathcomp/odd_order/BGsection10.v @@ -0,0 +1,1497 @@ +(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *) +Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div path fintype. +Require Import bigop finset prime fingroup morphism perm automorphism quotient. +Require Import action gproduct gfunctor pgroup cyclic center commutator. +Require Import gseries nilpotent sylow abelian maximal hall. +Require Import BGsection1 BGsection3 BGsection4 BGsection5 BGsection6. +Require Import BGsection7 BGsection9. + +(******************************************************************************) +(* This file covers B & G, section 10, including with the definitions: *) +(* \alpha(M) == the primes p such that M has p-rank at least 3. *) +(* \beta(M) == the primes p in \alpha(M) such that Sylow p-subgroups of M *) +(* are not narrow (see BGsection5), i.e., such that M contains *) +(* no maximal elementary abelian subgroups of rank 2. In a *) +(* minimal counter-example G, \beta(M) is the intersection of *) +(* \alpha(M) and \beta(G). Note that B & G refers to primes in *) +(* \beta(G) as ``ideal'' primes, somewhat inconsistently. *) +(* \sigma(M) == the primes p such that there exists a p-Sylow subgroup P *) +(* of M whose normaliser (in the minimal counter-example) is *) +(* contained in M. *) +(* M`_\alpha == the \alpha(M)-core of M. *) +(* M`_\beta == the \beta(M)-core of M. *) +(* M`_\sigma == the \sigma(M)-core of M. *) +(******************************************************************************) + +Set Implicit Arguments. +Unset Strict Implicit. +Unset Printing Implicit Defensive. + +Import GroupScope. + +Reserved Notation "\alpha ( M )" (at level 2, format "\alpha ( M )"). +Reserved Notation "\beta ( M )" (at level 2, format "\beta ( M )"). +Reserved Notation "\sigma ( M )" (at level 2, format "\sigma ( M )"). + +Reserved Notation "M `_ \alpha" (at level 3, format "M `_ \alpha"). +Reserved Notation "M `_ \beta" (at level 3, format "M `_ \beta"). +Reserved Notation "M `_ \sigma" (at level 3, format "M `_ \sigma"). + +Section Def. + +Variable gT : finGroupType. +Implicit Type p : nat. + +Variable M : {set gT}. + +Definition alpha := [pred p | 2 < 'r_p(M)]. +Definition alpha_core := 'O_alpha(M). +Canonical Structure alpha_core_group := Eval hnf in [group of alpha_core]. + +Definition beta := + [pred p | [forall (P : {group gT} | p.-Sylow(M) P), ~~ p.-narrow P]]. +Definition beta_core := 'O_beta(M). +Canonical Structure beta_core_group := Eval hnf in [group of beta_core]. + +Definition sigma := + [pred p | [exists (P : {group gT} | p.-Sylow(M) P), 'N(P) \subset M]]. +Definition sigma_core := 'O_sigma(M). +Canonical Structure sigma_core_group := Eval hnf in [group of sigma_core]. + +End Def. + +Notation "\alpha ( M )" := (alpha M) : group_scope. +Notation "M `_ \alpha" := (alpha_core M) : group_scope. +Notation "M `_ \alpha" := (alpha_core_group M) : Group_scope. + +Notation "\beta ( M )" := (beta M) : group_scope. +Notation "M `_ \beta" := (beta_core M) : group_scope. +Notation "M `_ \beta" := (beta_core_group M) : Group_scope. + +Notation "\sigma ( M )" := (sigma M) : group_scope. +Notation "M `_ \sigma" := (sigma_core M) : group_scope. +Notation "M `_ \sigma" := (sigma_core_group M) : Group_scope. + +Section CoreTheory. + +Variable gT : minSimpleOddGroupType. +Local Notation G := (TheMinSimpleOddGroup gT). +Implicit Type x : gT. +Implicit Type P : {group gT}. + +Section GenericCores. + +Variables H K : {group gT}. + +Lemma sigmaJ x : \sigma(H :^ x) =i \sigma(H). +Proof. +move=> p; apply/exists_inP/exists_inP=> [] [P sylP sNH]; last first. + by exists (P :^ x)%G; rewrite ?pHallJ2 // normJ conjSg. +by exists (P :^ x^-1)%G; rewrite ?normJ ?sub_conjgV // -(pHallJ2 _ _ _ x) actKV. +Qed. + +Lemma MsigmaJ x : (H :^ x)`_\sigma = H`_\sigma :^ x. +Proof. by rewrite /sigma_core -(eq_pcore H (sigmaJ x)) pcoreJ. Qed. + +Lemma alphaJ x : \alpha(H :^ x) =i \alpha(H). +Proof. by move=> p; rewrite !inE /= p_rankJ. Qed. + +Lemma MalphaJ x : (H :^ x)`_\alpha = H`_\alpha :^ x. +Proof. by rewrite /alpha_core -(eq_pcore H (alphaJ x)) pcoreJ. Qed. + +Lemma betaJ x : \beta(H :^ x) =i \beta(H). +Proof. +move=> p; apply/forall_inP/forall_inP=> nnSylH P sylP. + by rewrite -(@narrowJ _ _ _ x) nnSylH ?pHallJ2. +by rewrite -(@narrowJ _ _ _ x^-1) nnSylH // -(pHallJ2 _ _ _ x) actKV. +Qed. + +Lemma MbetaJ x : (H :^ x)`_\beta = H`_\beta :^ x. +Proof. by rewrite /beta_core -(eq_pcore H (betaJ x)) pcoreJ. Qed. + +End GenericCores. + +(* This remark appears at the start (p. 70) of B & G, Section 10, just after *) +(* the definition of ideal, which we do not include, since it is redundant *) +(* with the notation p \in \beta(G) that is used later. *) +Remark not_narrow_ideal p P : p.-Sylow(G) P -> ~~ p.-narrow P -> p \in \beta(G). +Proof. +move=> sylP nnP; apply/forall_inP=> Q sylQ. +by have [x _ ->] := Sylow_trans sylP sylQ; rewrite narrowJ. +Qed. + +Section MaxCores. + +Variables M : {group gT}. +Hypothesis maxM : M \in 'M. + +(* This is the first inclusion in the remark following the preliminary *) +(* definitions in B & G, p. 70. *) +Remark beta_sub_alpha : {subset \beta(M) <= \alpha(M)}. +Proof. +move=> p; rewrite !inE /= => /forall_inP nnSylM. +have [P sylP] := Sylow_exists p M; have:= nnSylM P sylP. +by rewrite negb_imply (p_rank_Sylow sylP) => /andP[]. +Qed. + +Remark alpha_sub_sigma : {subset \alpha(M) <= \sigma(M)}. +Proof. +move=> p a_p; have [P sylP] := Sylow_exists p M; have [sPM pP _ ] := and3P sylP. +have{a_p} rP: 2 < 'r(P) by rewrite (rank_Sylow sylP). +apply/exists_inP; exists P; rewrite ?uniq_mmax_norm_sub //. +exact: def_uniq_mmax (rank3_Uniqueness (mFT_pgroup_proper pP) rP) maxM sPM. +Qed. + +Remark beta_sub_sigma : {subset \beta(M) <= \sigma(M)}. +Proof. by move=> p; move/beta_sub_alpha; exact: alpha_sub_sigma. Qed. + +Remark Mbeta_sub_Malpha : M`_\beta \subset M`_\alpha. +Proof. exact: sub_pcore beta_sub_alpha. Qed. + +Remark Malpha_sub_Msigma : M`_\alpha \subset M`_\sigma. +Proof. exact: sub_pcore alpha_sub_sigma. Qed. + +Remark Mbeta_sub_Msigma : M`_\beta \subset M`_\sigma. +Proof. exact: sub_pcore beta_sub_sigma. Qed. + +(* This is the first part of the remark just above B & G, Theorem 10.1. *) +Remark norm_sigma_Sylow p P : + p \in \sigma(M) -> p.-Sylow(M) P -> 'N(P) \subset M. +Proof. +case/exists_inP=> Q sylQ sNPM sylP. +by case: (Sylow_trans sylQ sylP) => m mM ->; rewrite normJ conj_subG. +Qed. + +(* This is the second part of the remark just above B & G, Theorem 10.1. *) +Remark sigma_Sylow_G p P : p \in \sigma(M) -> p.-Sylow(M) P -> p.-Sylow(G) P. +Proof. +move=> sMp sylP; apply: (mmax_sigma_Sylow maxM) => //. +exact: norm_sigma_Sylow sMp sylP. +Qed. + +Lemma sigma_Sylow_neq1 p P : p \in \sigma(M) -> p.-Sylow(M) P -> P :!=: 1. +Proof. +move=> sMp /(norm_sigma_Sylow sMp); apply: contraTneq => ->. +by rewrite norm1 subTset -properT mmax_proper. +Qed. + +Lemma sigma_sub_pi : {subset \sigma(M) <= \pi(M)}. +Proof. +move=> p sMp; have [P sylP]:= Sylow_exists p M. +by rewrite -p_rank_gt0 -(rank_Sylow sylP) rank_gt0 (sigma_Sylow_neq1 sMp sylP). +Qed. + +Lemma predI_sigma_alpha : [predI \sigma(M) & \alpha(G)] =i \alpha(M). +Proof. +move=> p; rewrite inE /= -(andb_idl (@alpha_sub_sigma p)). +apply: andb_id2l => sMp; have [P sylP] := Sylow_exists p M. +by rewrite !inE -(rank_Sylow sylP) -(rank_Sylow (sigma_Sylow_G sMp sylP)). +Qed. + +Lemma predI_sigma_beta : [predI \sigma(M) & \beta(G)] =i \beta(M). +Proof. +move=> p; rewrite inE /= -(andb_idl (@beta_sub_sigma p)). +apply: andb_id2l => sMp; apply/idP/forall_inP=> [bGp P sylP | nnSylM]. + exact: forall_inP bGp P (sigma_Sylow_G sMp sylP). +have [P sylP] := Sylow_exists p M. +exact: not_narrow_ideal (sigma_Sylow_G sMp sylP) (nnSylM P sylP). +Qed. + +End MaxCores. + +End CoreTheory. + +Section Ten. + +Variable gT : minSimpleOddGroupType. +Local Notation G := (TheMinSimpleOddGroup gT). + +Implicit Type p : nat. +Implicit Type A E H K M N P Q R S V W X Y : {group gT}. + +(* This is B & G, Theorem 10.1(d); note that we do not assume M is maximal. *) +Theorem sigma_Sylow_trans M p X g : + p \in \sigma(M) -> p.-Sylow(M) X -> X :^ g \subset M -> g \in M. +Proof. +move=> sMp sylX sXgM; have pX := pHall_pgroup sylX. +have [|h hM /= sXghX] := Sylow_Jsub sylX sXgM; first by rewrite pgroupJ. +by rewrite -(groupMr _ hM) (subsetP (norm_sigma_Sylow _ sylX)) ?inE ?conjsgM. +Qed. + +(* This is B & G, Theorem 10.1 (a, b, c). *) +(* Part (e) of Theorem 10.1 is obviously stated incorrectly, and this is *) +(* difficult to correct because it is not used in the rest of the proof. *) +Theorem sigma_group_trans M p X : + M \in 'M -> p \in \sigma(M) -> p.-group X -> + [/\ (*a*) forall g, X \subset M -> X :^ g \subset M -> + exists2 c, c \in 'C(X) & exists2 m, m \in M & g = c * m, + (*b*) [transitive 'C(X), on [set Mg in M :^: G | X \subset Mg] | 'Js ] + & (*c*) X \subset M -> 'C(X) * 'N_M(X) = 'N(X)]. +Proof. +move=> maxM sMp pX; have defNM := norm_mmax maxM. +pose OM (Y : {set gT}) : {set {set gT}} := [set Mg in M :^: G | Y \subset Mg]. +pose trM (Y : {set gT}) := [transitive 'C(Y), on OM Y | 'Js]. +have actsOM Y: [acts 'N(Y), on OM Y | 'Js]. + apply/actsP=> z nYz Q; rewrite !inE -{1}(normP nYz) conjSg. + by rewrite (acts_act (acts_orbit _ _ _)) ?inE. +have OMid Y: (gval M \in OM Y) = (Y \subset M) by rewrite inE orbit_refl. +have ntOM Y: p.-group Y -> exists B, gval B \in OM Y. + have [S sylS] := Sylow_exists p M; have sSM := pHall_sub sylS. + have sylS_G := sigma_Sylow_G maxM sMp sylS. + move=> pY; have [g Gg sXSg] := Sylow_subJ sylS_G (subsetT Y) pY. + by exists (M :^ g)%G; rewrite inE mem_orbit // (subset_trans sXSg) ?conjSg. +have maxOM Y H: gval H \in OM Y -> H \in 'M. + by case/setIdP=> /imsetP[g _ /val_inj->]; rewrite mmaxJ. +have part_c Y H: trM Y -> gval H \in OM Y -> 'C(Y) * 'N_H(Y) = 'N(Y). + move=> trMY O_H; rewrite -(norm_mmax (maxOM Y H O_H)) -(astab1Js H) setIC. + have [sCN nCN] := andP (cent_normal Y); rewrite -normC 1?subIset ?nCN //. + by apply/(subgroup_transitiveP O_H); rewrite ?(atrans_supgroup sCN) ?actsOM. +suffices trMX: trM X. + do [split; rewrite // -OMid] => [g O_M sXgM |]; last exact: part_c. + have O_Mg': M :^ g^-1 \in OM X by rewrite inE mem_orbit -?sub_conjg ?inE. + have [c Cc /= Mc] := atransP2 trMX O_M O_Mg'; exists c^-1; rewrite ?groupV //. + by exists (c * g); rewrite ?mulKg // -defNM inE conjsgM -Mc conjsgKV. +elim: {X}_.+1 {-2}X (ltnSn (#|G| - #|X|)) => // n IHn X geXn in pX *. +have{n IHn geXn} IHX Y: X \proper Y -> p.-group Y -> trM Y. + move=> ltXY; apply: IHn; rewrite -ltnS (leq_trans _ geXn) // ltnS. + by rewrite ltn_sub2l ?(leq_trans (proper_card ltXY)) // cardsT max_card. +have [-> | ntX] := eqsVneq X 1. + rewrite /trM cent1T /OM setIdE (setIidPl _) ?atrans_orbit //. + by apply/subsetP=> Mg; case/imsetP=> g _ ->; rewrite inE sub1G. +pose L := 'N(X)%G; have ltLG := mFT_norm_proper ntX (mFT_pgroup_proper pX). +have IH_L: {in OM X &, forall B B', + B != B' -> exists2 X1, X \proper gval X1 & p.-Sylow(B :&: L) X1}. +- move=> _ _ /setIdP[/imsetP[a Ga ->] sXMa] /setIdP[/imsetP[b Gb ->] sXMb]. + move=> neqMab. + have [S sylS sXS] := Sylow_superset sXMa pX; have [sSMa pS _] := and3P sylS. + have [defS | ltXS] := eqVproper sXS. + case/eqP: neqMab; apply: (canRL (actKV _ _)); apply: (act_inj 'Js a). + rewrite /= -conjsgM [_ :^ _]conjGid ?(sigma_Sylow_trans _ sylS) ?sigmaJ //. + by rewrite -defS conjsgM conjSg sub_conjgV. + have pSL: p.-group (S :&: L) := pgroupS (subsetIl _ _) pS. + have [X1 sylX1 sNX1] := Sylow_superset (setSI L sSMa) pSL; exists X1 => //. + by rewrite (proper_sub_trans (nilpotent_proper_norm (pgroup_nil pS) _)). +have [M1 O_M1] := ntOM X pX; apply/imsetP; exists (gval M1) => //; apply/eqP. +rewrite eqEsubset andbC acts_sub_orbit ?(subset_trans (cent_sub X)) // O_M1 /=. +apply/subsetP=> M2 O_M2. +have [-> | neqM12] := eqsVneq M1 M2; first exact: orbit_refl. +have [|X2 ltXX2 sylX2] := IH_L _ _ O_M2 O_M1; first by rewrite eq_sym. +have{IH_L neqM12} [X1 ltXX1 sylX1] := IH_L _ _ O_M1 O_M2 neqM12. +have [[sX1L1 pX1 _] [sX2L2 pX2 _]] := (and3P sylX1, and3P sylX2). +have [[sX1M1 sX1L] [sX2M2 sX2L]] := (subsetIP sX1L1, subsetIP sX2L2). +have [P sylP sX1P] := Sylow_superset sX1L pX1; have [sPL pP _] := and3P sylP. +have [M0 O_M0] := ntOM P pP; have [MG_M0 sPM0] := setIdP O_M0. +have [t Lt sX2Pt] := Sylow_subJ sylP sX2L pX2. +have [sX1M0 ltXP] := (subset_trans sX1P sPM0, proper_sub_trans ltXX1 sX1P). +have M0C_M1: gval M1 \in orbit 'Js 'C(X) M0. + rewrite (subsetP (imsetS _ (centS (proper_sub ltXX1)))) // -orbitE. + by rewrite (atransP (IHX _ ltXX1 pX1)) inE ?MG_M0 //; case/setIdP: O_M1 => ->. +have M0tC_M2: M2 \in orbit 'Js 'C(X) (M0 :^ t). + rewrite (subsetP (imsetS _ (centS (proper_sub ltXX2)))) // -orbitE. + rewrite (atransP (IHX _ ltXX2 pX2)) inE; first by case/setIdP: O_M2 => ->. + rewrite (acts_act (acts_orbit _ _ _)) ?inE ?MG_M0 //. + by rewrite (subset_trans sX2Pt) ?conjSg. +rewrite (orbit_transl M0C_M1) (orbit_transr _ M0tC_M2). +have maxM0 := maxOM _ _ O_M0; have ltMG := mmax_proper maxM0. +have [rPgt2 | rPle2] := ltnP 2 'r(P). + have uP: P \in 'U by rewrite rank3_Uniqueness ?(mFT_pgroup_proper pP). + have uP_M0: 'M(P) = [set M0] := def_uniq_mmax uP maxM0 sPM0. + by rewrite conjGid ?orbit_refl ?(subsetP (sub_uniq_mmax uP_M0 sPL ltLG)). +have pl1L: p.-length_1 L. + have [oddL]: odd #|L| /\ 'r_p(L) <= 2 by rewrite mFT_odd -(rank_Sylow sylP). + by case/rank2_der1_complement; rewrite ?mFT_sol ?plength1_pseries2_quo. +have [|u v nLPu Lp'_v ->] := imset2P (_ : t \in 'N_L(P) * 'O_p^'(L)). + by rewrite normC ?plength1_Frattini // subIset ?gFnorm. +rewrite actM (orbit_transr _ (mem_orbit _ _ _)); last first. + have coLp'X: coprime #|'O_p^'(L)| #|X| := p'nat_coprime (pcore_pgroup _ _) pX. + apply: subsetP Lp'_v; have [sLp'L nLp'L] := andP (pcore_normal p^' L). + rewrite -subsetIidl -coprime_norm_cent ?subsetIidl //. + exact: subset_trans (normG X) nLp'L. +have [|w x nM0Pw cPx ->] := imset2P (_ : u \in 'N_M0(P) * 'C(P)). + rewrite normC ?part_c ?IHX //; first by case/setIP: nLPu. + by rewrite setIC subIset ?cent_norm. +rewrite actM /= conjGid ?mem_orbit //; last by case/setIP: nM0Pw. +by rewrite (subsetP (centS (subset_trans (proper_sub ltXX1) sX1P))). +Qed. + +Section OneMaximal. + +Variable M : {group gT}. +Hypothesis maxM : M \in 'M. + +Let ltMG := mmax_proper maxM. +Let solM := mmax_sol maxM. + +Let aMa : \alpha(M).-group (M`_\alpha). Proof. exact: pcore_pgroup. Qed. +Let nsMaM : M`_\alpha <| M. Proof. exact: pcore_normal. Qed. +Let sMaMs : M`_\alpha \subset M`_\sigma. Proof. exact: Malpha_sub_Msigma. Qed. + +Let F := 'F(M / M`_\alpha). +Let nsFMa : F <| M / M`_\alpha. Proof. exact: Fitting_normal. Qed. + +Let alpha'F : \alpha(M)^'.-group F. +Proof. +rewrite -[F](nilpotent_pcoreC \alpha(M) (Fitting_nil _)) -Fitting_pcore /=. +by rewrite trivg_pcore_quotient (trivgP (Fitting_sub 1)) dprod1g pcore_pgroup. +Qed. + +Let Malpha_quo_sub_Fitting : M^`(1) / M`_\alpha \subset F. +Proof. +have [/= K defF sMaK nsKM] := inv_quotientN nsMaM nsFMa; rewrite -/F in defF. +have [sKM _] := andP nsKM; have nsMaK: M`_\alpha <| K := normalS sMaK sKM nsMaM. +have [[_ nMaK] [_ nMaM]] := (andP nsMaK, andP nsMaM). +have hallMa: \alpha(M).-Hall(K) M`_\alpha. + by rewrite /pHall sMaK pcore_pgroup -card_quotient -?defF. +have [H hallH] := Hall_exists \alpha(M)^' (solvableS sKM solM). +have{hallH} defK := sdprod_normal_p'HallP nsMaK hallH hallMa. +have{defK} [_ sHK defK nMaH tiMaH] := sdprod_context defK. +have{defK} isoHF: H \isog F by rewrite [F]defF -defK quotientMidl quotient_isog. +have{sHK nMaH} sHM := subset_trans sHK sKM. +have{tiMaH isoHF sHM H} rF: 'r(F) <= 2. + rewrite -(isog_rank isoHF); have [p p_pr -> /=] := rank_witness H. + have [|a_p] := leqP 'r_p(M) 2; first exact: leq_trans (p_rankS p sHM). + rewrite 2?leqW // leqNgt p_rank_gt0 /= (card_isog isoHF) /= -/F. + exact: contraL (pnatPpi alpha'F) a_p. +by rewrite quotient_der // rank2_der1_sub_Fitting ?mFT_quo_odd ?quotient_sol. +Qed. + +Let sigma_Hall_sub_der1 H : \sigma(M).-Hall(M) H -> H \subset M^`(1). +Proof. +move=> hallH; have [sHM sH _] := and3P hallH. +rewrite -(Sylow_gen H) gen_subG; apply/bigcupsP=> P /SylowP[p p_pr sylP]. +have [-> | ntP] := eqsVneq P 1; first by rewrite sub1G. +have [sPH pP _] := and3P sylP; have{ntP} [_ p_dv_P _] := pgroup_pdiv pP ntP. +have{p_dv_P} s_p: p \in \sigma(M) := pgroupP (pgroupS sPH sH) p p_pr p_dv_P. +have{sylP} sylP: p.-Sylow(M) P := subHall_Sylow hallH s_p sylP. +have [sPM nMP] := (pHall_sub sylP, norm_sigma_Sylow s_p sylP). +have sylP_G := sigma_Sylow_G maxM s_p sylP. +have defG': G^`(1) = G. + have [_ simpG] := simpleP _ (mFT_simple gT). + by have [?|//] := simpG _ (der_normal 1 _); case/derG1P: (mFT_nonAbelian gT). +rewrite -subsetIidl -{1}(setIT P) -defG'. +rewrite (focal_subgroup_gen sylP_G) (focal_subgroup_gen sylP) genS //. +apply/subsetP=> _ /imset2P[x g Px /setIdP[Gg Pxg] ->]. +pose X := <[x]>; have sXM : X \subset M by rewrite cycle_subG (subsetP sPM). +have sXgM: X :^ g \subset M by rewrite -cycleJ cycle_subG (subsetP sPM). +have [trMX _ _] := sigma_group_trans maxM s_p (mem_p_elt pP Px). +have [c cXc [m Mm def_g]] := trMX _ sXM sXgM; rewrite cent_cycle in cXc. +have def_xg: x ^ g = x ^ m by rewrite def_g conjgM /conjg -(cent1P cXc) mulKg. +by rewrite commgEl def_xg -commgEl mem_imset2 // inE Mm -def_xg. +Qed. + +(* This is B & G, Theorem 10.2(a1). *) +Theorem Malpha_Hall : \alpha(M).-Hall(M) M`_\alpha. +Proof. +have [H hallH] := Hall_exists \sigma(M) solM; have [sHM sH _] := and3P hallH. +rewrite (subHall_Hall hallH (alpha_sub_sigma maxM)) // /pHall pcore_pgroup /=. +rewrite -(card_quotient (subset_trans sHM (normal_norm nsMaM))) -pgroupE. +rewrite (subset_trans sMaMs) ?pcore_sub_Hall ?(pgroupS _ alpha'F) //=. +exact: subset_trans (quotientS _ (sigma_Hall_sub_der1 hallH)) _. +Qed. + +(* This is B & G, Theorem 10.2(b1). *) +Theorem Msigma_Hall : \sigma(M).-Hall(M) M`_\sigma. +Proof. +have [H hallH] := Hall_exists \sigma(M) solM; have [sHM sH _] := and3P hallH. +rewrite /M`_\sigma (normal_Hall_pcore hallH) // -(quotientGK nsMaM). +rewrite -(quotientGK (normalS _ sHM nsMaM)) ?cosetpre_normal //; last first. + by rewrite (subset_trans sMaMs) ?pcore_sub_Hall. +have hallHa: \sigma(M).-Hall(F) (H / M`_\alpha). + apply: pHall_subl (subset_trans _ Malpha_quo_sub_Fitting) (Fitting_sub _) _. + by rewrite quotientS ?sigma_Hall_sub_der1. + exact: quotient_pHall (subset_trans sHM (normal_norm nsMaM)) hallH. +rewrite (nilpotent_Hall_pcore (Fitting_nil _) hallHa) /=. +exact: char_normal_trans (pcore_char _ _) nsFMa. +Qed. + +Lemma pi_Msigma : \pi(M`_\sigma) =i \sigma(M). +Proof. +move=> p; apply/idP/idP=> [|s_p /=]; first exact: pnatPpi (pcore_pgroup _ _). +by rewrite (card_Hall Msigma_Hall) pi_of_part // inE /= sigma_sub_pi. +Qed. + +(* This is B & G, Theorem 10.2(b2). *) +Theorem Msigma_Hall_G : \sigma(M).-Hall(G) M`_\sigma. +Proof. +rewrite pHallE subsetT /= eqn_dvd {1}(card_Hall Msigma_Hall). +rewrite partn_dvd ?cardG_gt0 ?cardSg ?subsetT //=. +apply/dvdn_partP; rewrite ?part_gt0 // => p. +rewrite pi_of_part ?cardG_gt0 // => /andP[_ s_p]. +rewrite partn_part => [|q /eqnP-> //]. +have [P sylP] := Sylow_exists p M; have [sPM pP _] := and3P sylP. +rewrite -(card_Hall (sigma_Sylow_G _ _ sylP)) ?cardSg //. +by rewrite (sub_Hall_pcore Msigma_Hall) ?(pi_pgroup pP). +Qed. + +(* This is B & G, Theorem 10.2(a2). *) +Theorem Malpha_Hall_G : \alpha(M).-Hall(G) M`_\alpha. +Proof. +apply: subHall_Hall Msigma_Hall_G (alpha_sub_sigma maxM) _. +exact: pHall_subl sMaMs (pcore_sub _ _) Malpha_Hall. +Qed. + +(* This is B & G, Theorem 10.2(c). *) +Theorem Msigma_der1 : M`_\sigma \subset M^`(1). +Proof. exact: sigma_Hall_sub_der1 Msigma_Hall. Qed. + +(* This is B & G, Theorem 10.2(d1). *) +Theorem Malpha_quo_rank2 : 'r(M / M`_\alpha) <= 2. +Proof. +have [p p_pr ->] := rank_witness (M / M`_\alpha). +have [P sylP] := Sylow_exists p M; have [sPM pP _] := and3P sylP. +have nMaP := subset_trans sPM (normal_norm nsMaM). +rewrite -(rank_Sylow (quotient_pHall nMaP sylP)) /= leqNgt. +have [a_p | a'p] := boolP (p \in \alpha(M)). + by rewrite quotientS1 ?rank1 ?(sub_Hall_pcore Malpha_Hall) ?(pi_pgroup pP). +rewrite -(isog_rank (quotient_isog _ _)) ?coprime_TIg ?(rank_Sylow sylP) //. +exact: pnat_coprime aMa (pi_pnat pP _). +Qed. + +(* This is B & G, Theorem 10.2(d2). *) +Theorem Malpha_quo_nil : nilpotent (M^`(1) / M`_\alpha). +Proof. exact: nilpotentS Malpha_quo_sub_Fitting (Fitting_nil _). Qed. + +(* This is B & G, Theorem 10.2(e). *) +Theorem Msigma_neq1 : M`_\sigma :!=: 1. +Proof. +without loss Ma1: / M`_\alpha = 1. + by case: eqP => // Ms1 -> //; apply/trivgP; rewrite -Ms1 Malpha_sub_Msigma. +have{Ma1} rFM: 'r('F(M)) <= 2. + rewrite (leq_trans _ Malpha_quo_rank2) // Ma1. + by rewrite -(isog_rank (quotient1_isog _)) rankS ?Fitting_sub. +pose q := max_pdiv #|M|; pose Q := 'O_q(M)%G. +have sylQ: q.-Sylow(M) Q := rank2_max_pcore_Sylow (mFT_odd M) solM rFM. +have piMq: q \in \pi(M) by rewrite pi_max_pdiv cardG_gt1 mmax_neq1. +have{piMq} ntQ: Q :!=: 1 by rewrite -rank_gt0 (rank_Sylow sylQ) p_rank_gt0. +rewrite (subG1_contra _ ntQ) ?(sub_Hall_pcore Msigma_Hall) ?pcore_sub //. +rewrite (pi_pgroup (pcore_pgroup _ _)) //; apply/exists_inP; exists Q => //. +by rewrite (mmax_normal maxM) ?pcore_normal. +Qed. + +(* This is B & G, Lemma 10.3. *) +Theorem cent_alpha'_uniq X : + X \subset M -> \alpha(M)^'.-group X -> 'r('C_(M`_\alpha)(X)) >= 2 -> + 'C_M(X)%G \in 'U. +Proof. +have ltM_G := sub_proper_trans (subsetIl M _) ltMG. +move=> sXM a'X; have [p p_pr -> rCX] := rank_witness 'C_(M`_\alpha)(X). +have{rCX} [B EpB] := p_rank_geP rCX; have{EpB} [sBCX abelB dimB] := pnElemP EpB. +have [[sBMa cXB] [pB cBB _]] := (subsetIP sBCX, and3P abelB). +have rMa: 1 < 'r_p(M`_\alpha) by rewrite -dimB -p_rank_abelem ?p_rankS. +have{rMa} a_p: p \in \alpha(M) by rewrite (pnatPpi aMa) // -p_rank_gt0 ltnW. +have nBX: X \subset 'N(B) by rewrite cents_norm // centsC. +have coMaX: coprime #|M`_\alpha| #|X| := pnat_coprime aMa a'X. +have [sMaM nMaM] := andP nsMaM; have solMa := solvableS sMaM solM. +have nMaX := subset_trans sXM nMaM. +have [P [sylP nPX sBP]] := coprime_Hall_subset nMaX coMaX solMa sBMa pB nBX. +have [sPMa pP _] := and3P sylP; have sPM := subset_trans sPMa sMaM. +have EpCB: B \in 'E_p^2('C_P(B)) by rewrite !inE subsetI sBP abelB dimB !andbT. +have: 1 < 'r_p('C_P(B)) by apply/p_rank_geP; exists B. +rewrite leq_eqVlt; case: ltngtP => // rCPB _. + apply: (uniq_mmaxS (subset_trans sBCX (setSI _ sMaM))) => //=. + have pCPB := pgroupS (subsetIl P 'C(B)) pP; rewrite -rank_pgroup // in rCPB. + have: 2 < 'r('C(B)) by rewrite (leq_trans rCPB) ?rankS ?subsetIr. + by apply: cent_rank3_Uniqueness; rewrite -dimB -rank_abelem. +have cPX: P \subset 'C(X). + have EpPB: B \in 'E_p(P) by exact/pElemP. + have coPX: coprime #|P| #|X| := coprimeSg sPMa coMaX. + rewrite centsC (coprime_odd_faithful_cent_abelem EpPB) ?mFT_odd //. + rewrite -(setIid 'C(B)) setIA (pmaxElem_LdivP p_pr _) 1?centsC //. + by rewrite (subsetP (p_rankElem_max _ _)) -?rCPB. +have sylP_M := subHall_Sylow Malpha_Hall a_p sylP. +have{sylP_M} rP: 2 < 'r(P) by rewrite (rank_Sylow sylP_M). +by rewrite rank3_Uniqueness ?(leq_trans rP (rankS _)) //= subsetI sPM. +Qed. + +Variable p : nat. + +(* This is B & G, Lemma 10.4(a). *) +(* We omit the redundant assumption p \in \pi(M). *) +Lemma der1_quo_sigma' : p %| #|M / M^`(1)| -> p \in \sigma(M)^'. +Proof. +apply: contraL => /= s_p; have piMp := sigma_sub_pi maxM s_p. +have p_pr: prime p by move: piMp; rewrite mem_primes; case/andP. +rewrite -p'natE ?(pi'_p'nat _ s_p) // -pgroupE -partG_eq1. +rewrite -(card_Hall (quotient_pHall _ Msigma_Hall)) /=; last first. + exact: subset_trans (pcore_sub _ _) (der_norm _ _). +by rewrite quotientS1 ?cards1 // Msigma_der1. +Qed. + +Hypothesis s'p : p \in \sigma(M)^'. + +(* This is B & G, Lemma 10.4(b). *) +(* We do not need the assumption M`_\alpha != 1; the assumption p \in \pi(M) *) +(* is restated as P != 1. *) +Lemma cent1_sigma'_Zgroup P : + p.-Sylow(M) P -> P :!=: 1 -> + exists x, + [/\ x \in 'Ohm_1('Z(P))^#, 'M('C[x]) != [set M] & Zgroup 'C_(M`_\alpha)[x]]. +Proof. +move=> sylP ntP; set T := 'Ohm_1(_); have [sPM pP _] := and3P sylP. +have [charT nilP] := (char_trans (Ohm_char 1 _) (center_char P), pgroup_nil pP). +suffices [x Tx not_uCx]: exists2 x, x \in T^# & 'M('C[x]) != [set M]. + exists x; split=> //; rewrite odd_rank1_Zgroup ?mFT_odd //= leqNgt. + apply: contra not_uCx; rewrite -cent_cycle; set X := <[x]> => rCMaX. + have{Tx} [ntX Tx] := setD1P Tx; rewrite -cycle_eq1 -/X in ntX. + have sXP: X \subset P by rewrite cycle_subG (subsetP (char_sub charT)). + rewrite (@def_uniq_mmaxS _ M 'C_M(X)) ?subsetIr ?mFT_cent_proper //. + apply: def_uniq_mmax; rewrite ?subsetIl //. + rewrite cent_alpha'_uniq ?(subset_trans sXP) ?(pi_pgroup (pgroupS sXP pP)) //. + by apply: contra s'p; apply: alpha_sub_sigma. +apply/exists_inP; rewrite -negb_forall_in; apply: contra s'p. +move/forall_inP => uCT; apply/exists_inP; exists P => //. +apply/subsetP=> u nPu; have [y Ty]: exists y, y \in T^#. + by apply/set0Pn; rewrite setD_eq0 subG1 Ohm1_eq1 center_nil_eq1. +rewrite -(norm_mmax maxM) (sameP normP eqP) (inj_eq (@group_inj gT)) -in_set1. +have Tyu: y ^ u \in T^#. + by rewrite memJ_norm // normD1 (subsetP (char_norms charT)). +by rewrite -(eqP (uCT _ Tyu)) -conjg_set1 normJ mmax_ofJ (eqP (uCT _ Ty)) set11. +Qed. + +(* This is B & G, Lemma 10.4(c), part 1. *) +(* The redundant assumption p \in \pi(M) is omitted. *) +Lemma sigma'_rank2_max : 'r_p(M) = 2 -> 'E_p^2(M) \subset 'E*_p(G). +Proof. +move=> rpM; apply: contraR s'p => /subsetPn[A Ep2A not_maxA]. +have{Ep2A} [sAM abelA dimA] := pnElemP Ep2A; have [pA _ _] := and3P abelA. +have [P sylP sAP] := Sylow_superset sAM pA; have [_ pP _] := and3P sylP. +apply/exists_inP; exists P; rewrite ?uniq_mmax_norm_sub //. +apply: def_uniq_mmaxS (mFT_pgroup_proper pP) (def_uniq_mmax _ _ sAM) => //. +by rewrite (@nonmaxElem2_Uniqueness _ p) // !(not_maxA, inE) abelA dimA subsetT. +Qed. + +(* This is B & G, Lemma 10.4(c), part 2 *) +(* The redundant assumption p \in \pi(M) is omitted. *) +Lemma sigma'_rank2_beta' : 'r_p(M) = 2 -> p \notin \beta(G). +Proof. +move=> rpM; rewrite -[p \in _]negb_exists_in negbK; apply/exists_inP. +have [A Ep2A]: exists A, A \in 'E_p^2(M) by apply/p_rank_geP; rewrite rpM. +have [_ abelA dimA] := pnElemP Ep2A; have [pA _] := andP abelA. +have [P sylP sAP] := Sylow_superset (subsetT _) pA. +exists P; rewrite ?inE //; apply/implyP=> _; apply/set0Pn. +exists A; rewrite 3!inE abelA dimA sAP (subsetP (pmaxElemS _ (subsetT P))) //. +by rewrite inE (subsetP (sigma'_rank2_max rpM)) // inE. +Qed. + +(* This is B & G, Lemma 10.5, part 1; the condition on X has been weakened, *) +(* because the proof of Lemma 12.2(a) requires the stronger result. *) +Lemma sigma'_norm_mmax_rank2 X : p.-group X -> 'N(X) \subset M -> 'r_p(M) = 2. +Proof. +move=> pX sNX_M; have sXM: X \subset M := subset_trans (normG X) sNX_M. +have [P sylP sXP] := Sylow_superset sXM pX; have [sPM pP _] := and3P sylP. +apply: contraNeq s'p; case: ltngtP => // rM _; last exact: alpha_sub_sigma. +apply/exists_inP; exists P; rewrite ?(subset_trans _ sNX_M) ?char_norms //. +rewrite sub_cyclic_char // (odd_pgroup_rank1_cyclic pP) ?mFT_odd //. +by rewrite (p_rank_Sylow sylP). +Qed. + +(* This is B & G, Lemma 10.5, part 2. We omit the second claim of B & G 10.5 *) +(* as it is an immediate consequence of sigma'_rank2_beta' (i.e., 10.4(c)). *) +Lemma sigma'1Elem_sub_p2Elem X : + X \in 'E_p^1(G) -> 'N(X) \subset M -> + exists2 A, A \in 'E_p^2(G) & X \subset A. +Proof. +move=> EpX sNXM; have sXM := subset_trans (normG X) sNXM. +have [[_ abelX dimX] p_pr] := (pnElemP EpX, pnElem_prime EpX). +have pX := abelem_pgroup abelX; have rpM2 := sigma'_norm_mmax_rank2 pX sNXM. +have [P sylP sXP] := Sylow_superset sXM pX; have [sPM pP _] := and3P sylP. +pose T := 'Ohm_1('Z(P)); pose A := X <*> T; have nilP := pgroup_nil pP. +have charT: T \char P := char_trans (Ohm_char 1 _) (center_char P). +have neqTX: T != X. + apply: contraNneq s'p => defX; apply/exists_inP; exists P => //. + by rewrite (subset_trans _ sNXM) // -defX char_norms. +have rP: 'r(P) = 2 by rewrite (rank_Sylow sylP) rpM2. +have ntT: T != 1 by rewrite Ohm1_eq1 center_nil_eq1 // -rank_gt0 rP. +have sAP: A \subset P by rewrite join_subG sXP char_sub. +have cTX: T \subset 'C(X) := centSS (Ohm_sub 1 _) sXP (subsetIr P _). +have{cTX} defA: X \* T = A by rewrite cprodEY. +have{defA} abelA : p.-abelem A. + have pZ: p.-group 'Z(P) := pgroupS (center_sub P) pP. + by rewrite (cprod_abelem _ defA) abelX Ohm1_abelem ?center_abelian. +exists [group of A]; last exact: joing_subl. +rewrite !inE subsetT abelA eqn_leq -{1}rP -{1}(rank_abelem abelA) rankS //=. +rewrite -dimX (properG_ltn_log (pgroupS sAP pP)) // /proper join_subG subxx. +rewrite joing_subl /=; apply: contra ntT => sTX; rewrite eqEsubset sTX in neqTX. +by rewrite -(setIidPr sTX) prime_TIg ?(card_pnElem EpX). +Qed. + +End OneMaximal. + +(* This is B & G, Theorem 10.6. *) +Theorem mFT_proper_plength1 p H : H \proper G -> p.-length_1 H. +Proof. +case/mmax_exists=> M /setIdP[maxM sHM]. +suffices{H sHM}: p.-length_1 M by apply: plength1S. +have [solM oddM] := (mmax_sol maxM, mFT_odd M). +have [rpMle2 | a_p] := leqP 'r_p(M) 2. + by rewrite plength1_pseries2_quo; case/rank2_der1_complement: rpMle2. +pose Ma := M`_\alpha; have hallMa: \alpha(M).-Hall(M) Ma := Malpha_Hall maxM. +have [[K hallK] [sMaM aMa _]] := (Hall_exists \alpha(M)^' solM, and3P hallMa). +have defM: Ma ><| K = M by apply/sdprod_Hall_pcoreP. +have{aMa} coMaK: coprime #|Ma| #|K| := pnat_coprime aMa (pHall_pgroup hallK). +suffices{a_p hallMa}: p.-length_1 Ma. + rewrite !p_elt_gen_length1 /p_elt_gen setIdE /= -/Ma -(setIidPl sMaM) -setIA. + rewrite -(setIdE M) (setIidPr _) //; apply/subsetP=> x; case/setIdP=> Mx p_x. + by rewrite (mem_Hall_pcore hallMa) /p_elt ?(pi_pnat p_x). +have{sMaM} <-: [~: Ma, K] = Ma. + have sMaMs: Ma \subset M`_\sigma := Malpha_sub_Msigma maxM. + have sMaM': Ma \subset M^`(1) := subset_trans sMaMs (Msigma_der1 maxM). + by have [] := coprime_der1_sdprod defM coMaK (solvableS sMaM solM) sMaM'. +have [q q_pr q_dv_Mq]: {q | prime q & q %| #|M / M^`(1)| }. + apply: pdivP; rewrite card_quotient ?der_norm // indexg_gt1 proper_subn //. + by rewrite (sol_der1_proper solM) ?mmax_neq1. +have s'q: q \in \sigma(M)^' by apply: der1_quo_sigma' q_dv_Mq. +have [Q sylQ] := Sylow_exists q K; have [sQK qQ _] := and3P sylQ. +have a'q: q \in \alpha(M)^' by apply: contra s'q; apply: alpha_sub_sigma. +have{a'q sylQ hallK} sylQ: q.-Sylow(M) Q := subHall_Sylow hallK a'q sylQ. +have{q_dv_Mq} ntQ: Q :!=: 1. + rewrite -rank_gt0 (rank_Sylow sylQ) p_rank_gt0 mem_primes q_pr cardG_gt0. + exact: dvdn_trans q_dv_Mq (dvdn_quotient _ _). +have{s'q sylQ ntQ} [x [Q1x _ ZgCx]] := cent1_sigma'_Zgroup maxM s'q sylQ ntQ. +have{Q1x} [ntx Q1x] := setD1P Q1x. +have sZQ := center_sub Q; have{sQK} sZK := subset_trans sZQ sQK. +have{sZK} Kx: x \in K by rewrite (subsetP sZK) // (subsetP (Ohm_sub 1 _)). +have{sZQ qQ} abelQ1 := Ohm1_abelem (pgroupS sZQ qQ) (center_abelian Q). +have{q q_pr Q abelQ1 Q1x} ox: prime #[x] by rewrite (abelem_order_p abelQ1). +move: Kx ox ZgCx; rewrite -cycle_subG -cent_cycle. +exact: odd_sdprod_Zgroup_cent_prime_plength1 solM oddM defM coMaK. +Qed. + +Section OneSylow. + +Variables (p : nat) (P : {group gT}). +Hypothesis sylP_G: p.-Sylow(G) P. +Let pP : p.-group P := pHall_pgroup sylP_G. + +(* This is an B & G, Corollary 10.7(a), second part (which does not depend on *) +(* a particular complement). *) +Corollary mFT_Sylow_der1 : P \subset 'N(P)^`(1). +Proof. +have [-> | ntP] := eqsVneq P 1; first exact: sub1G. +have ltNG: 'N(P) \proper G := mFT_norm_proper ntP (mFT_pgroup_proper pP). +have [M] := mmax_exists ltNG; case/setIdP=> /= maxM sNM. +have [ltMG solM] := (mmax_proper maxM, mmax_sol maxM). +have [pl1M sPM] := (mFT_proper_plength1 p ltMG, subset_trans (normG P) sNM). +have sylP := pHall_subl sPM (subsetT M) sylP_G. +have sMp: p \in \sigma(M) by apply/exists_inP; exists P. +apply: subset_trans (dergS 1 (subsetIr M 'N(P))) => /=. +apply: plength1_Sylow_sub_der1 sylP pl1M (subset_trans _ (Msigma_der1 maxM)). +by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) ?(pi_pgroup pP). +Qed. + +(* This is B & G, Corollary 10.7(a), first part. *) +Corollary mFT_Sylow_sdprod_commg V : P ><| V = 'N(P) -> [~: P, V] = P. +Proof. +move=> defV; have sPN' := mFT_Sylow_der1. +have sylP := pHall_subl (normG P) (subsetT 'N(P)) sylP_G. +have [|//] := coprime_der1_sdprod defV _ (pgroup_sol pP) sPN'. +by rewrite (coprime_sdprod_Hall_l defV) // (pHall_Hall sylP). +Qed. + +(* This is B & G, Corollary 10.7(b). *) +Corollary mFT_rank2_Sylow_cprod : + 'r(P) < 3 -> ~~ abelian P -> + exists2 S, [/\ ~~ abelian (gval S), logn p #|S| = 3 & exponent S %| p] + & exists2 C, cyclic (gval C) & S \* C = P /\ 'Ohm_1(C) = 'Z(S). +Proof. +move=> rP not_cPP; have sylP := pHall_subl (normG P) (subsetT 'N(P)) sylP_G. +have ntP: P :!=: 1 by apply: contraNneq not_cPP => ->; apply: abelian1. +have ltNG: 'N(P) \proper G := mFT_norm_proper ntP (mFT_pgroup_proper pP). +have [V hallV] := Hall_exists p^' (mFT_sol ltNG); have [_ p'V _] := and3P hallV. +have defNP: P ><| V = 'N(P) := sdprod_normal_p'HallP (normalG P) hallV sylP. +have defP: [~: P, V] = P := mFT_Sylow_sdprod_commg defNP. +have [_] := rank2_coprime_comm_cprod pP (mFT_odd _) ntP rP defP p'V (mFT_odd _). +case=> [/idPn// | [S esS [C [mulSC cycC defC1]]]]. +exists S => //; exists C => //; split=> //; rewrite defC1. +have sSP: S \subset P by case/cprodP: mulSC => _ /mulG_sub[]. +have [[not_cSS dimS _] pS] := (esS, pgroupS sSP pP). +by have [||[]] := p3group_extraspecial pS; rewrite ?dimS. +Qed. + +(* This is B & G, Corollary 10.7(c). *) +Corollary mFT_sub_Sylow_trans : forall Q x, + Q \subset P -> Q :^ x \subset P -> exists2 y, y \in 'N(P) & Q :^ x = Q :^ y. +Proof. +move=> Q x; have [-> /trivgP-> /trivgP-> | ntP sQP sQxP] := eqsVneq P 1. + by exists 1; rewrite ?group1 ?conjs1g. +have ltNG: 'N(P) \proper G := mFT_norm_proper ntP (mFT_pgroup_proper pP). +have [M /=] := mmax_exists ltNG; case/setIdP=> maxM sNM. +have [ltMG solM] := (mmax_proper maxM, mmax_sol maxM). +have [pl1M sPM] := (mFT_proper_plength1 p ltMG, subset_trans (normG P) sNM). +have sylP := pHall_subl sPM (subsetT M) sylP_G. +have sMp: p \in \sigma(M) by apply/exists_inP; exists P. +have [transCQ _ _] := sigma_group_trans maxM sMp (pgroupS sQP pP). +have [||q cQq [u Mu defx]] := transCQ x; try exact: subset_trans _ sPM. +have nQC := normP (subsetP (cent_sub Q) _ _). +have [|q' cMQq' [y nMPy defu]] := plength1_Sylow_trans sylP pl1M solM sQP Mu. + by rewrite defx conjsgM nQC in sQxP. +have [[_ nPy] [_ cQq']] := (setIP nMPy, setIP cMQq'). +by exists y; rewrite // defx defu !conjsgM 2?nQC. +Qed. + +(* This is B & G, Corollary 10.7(d). *) +Corollary mFT_subnorm_Sylow Q : Q \subset P -> p.-Sylow('N(Q)) 'N_P(Q). +Proof. +move=> sQP; have pQ := pgroupS sQP pP. +have [S /= sylS] := Sylow_exists p 'N(Q); have [sNS pS _] := and3P sylS. +have sQS: Q \subset S := normal_sub_max_pgroup (Hall_max sylS) pQ (normalG Q). +have [x _ sSxP] := Sylow_Jsub sylP_G (subsetT S) pS. +have sQxP: Q :^ x \subset P by rewrite (subset_trans _ sSxP) ?conjSg. +have [y nPy defQy] := mFT_sub_Sylow_trans sQP sQxP. +have nQxy: x * y^-1 \in 'N(Q) by rewrite inE conjsgM defQy actK. +have sSxyP: S :^ (x * y^-1) \subset P by rewrite conjsgM sub_conjgV (normP nPy). +have sylSxy: p.-Sylow('N(Q)) (S :^ (x * y^-1)) by rewrite pHallJ. +have pNPQ: p.-group 'N_P(Q) := pgroupS (subsetIl P 'N(Q)) pP. +by rewrite (sub_pHall sylSxy pNPQ) ?subsetIr // subsetI sSxyP (@pHall_sub _ p). +Qed. + +(* This is B & G, Corollary 10.7(e). *) +Corollary mFT_Sylow_normalS Q R : + p.-group R -> Q \subset P :&: R -> Q <| 'N(P) -> Q <| 'N(R). +Proof. +move=> pR /subsetIP[sQP sQR] /andP[nQP nQ_NP]. +have [x _ sRxP] := Sylow_Jsub sylP_G (subsetT R) pR. +rewrite /normal normsG //; apply/subsetP=> y nRy. +have sQxP: Q :^ x \subset P by rewrite (subset_trans _ sRxP) ?conjSg. +have sQyxP: Q :^ (y * x) \subset P. + by rewrite actM (subset_trans _ sRxP) // -(normP nRy) !conjSg. +have [t tNP defQx] := mFT_sub_Sylow_trans sQP sQxP. +have [z zNP defQxy] := mFT_sub_Sylow_trans sQP sQyxP. +by rewrite inE -(conjSg _ _ x) -actM /= defQx defQxy !(normsP nQ_NP). +Qed. + +End OneSylow. + +Section AnotherMaximal. + +Variable M : {group gT}. +Hypothesis maxM : M \in 'M. + +Let solM : solvable M := mmax_sol maxM. +Let ltMG : M \proper G := mmax_proper maxM. + +Let sMbMs : M`_\beta \subset M`_\sigma := Mbeta_sub_Msigma maxM. +Let nsMbM : M`_\beta <| M := pcore_normal _ _. + +Let hallMs : \sigma(M).-Hall(M) M`_\sigma := Msigma_Hall maxM. +Let nsMsM : M`_\sigma <| M := pcore_normal _ M. +Let sMsM' : M`_\sigma \subset M^`(1) := Msigma_der1 maxM. + +Lemma Mbeta_der1 : M`_\beta \subset M^`(1). +Proof. exact: subset_trans sMbMs sMsM'. Qed. + +Let sM'M : M^`(1) \subset M := der_sub 1 M. +Let nsMsM' : M`_\sigma <| M^`(1) := normalS sMsM' sM'M nsMsM. +Let nsMbM' : M`_\beta <| M^`(1) := normalS Mbeta_der1 sM'M nsMbM. +Let nMbM' := normal_norm nsMbM'. + +(* This is B & G, Lemma 10.8(c). *) +Lemma beta_max_pdiv p : + p \notin \beta(M) -> + [/\ p^'.-Hall(M^`(1)) 'O_p^'(M^`(1)), + p^'.-Hall(M`_\sigma) 'O_p^'(M`_\sigma) + & forall q, q \in \pi(M / 'O_p^'(M)) -> q <= p]. +Proof. +rewrite !inE -negb_exists_in negbK => /exists_inP[P sylP nnP]. +have [|ncM' p_max] := narrow_der1_complement_max_pdiv (mFT_odd M) solM sylP nnP. + by rewrite mFT_proper_plength1 ?implybT. +by rewrite -(pcore_setI_normal _ nsMsM') (Hall_setI_normal nsMsM'). +Qed. + +(* This is B & G, Lemma 10.8(a), first part. *) +Lemma Mbeta_Hall : \beta(M).-Hall(M) M`_\beta. +Proof. +have [H hallH] := Hall_exists \beta(M) solM; have [sHM bH _]:= and3P hallH. +rewrite [M`_\beta](sub_pHall hallH) ?pcore_pgroup ?pcore_sub //=. +rewrite -(setIidPl sMbMs) pcore_setI_normal ?pcore_normal //. +have sH: \sigma(M).-group H := sub_pgroup (beta_sub_sigma maxM) bH. +have sHMs: H \subset M`_\sigma by rewrite (sub_Hall_pcore hallMs). +rewrite -pcoreNK -bigcap_p'core subsetI sHMs. +apply/bigcapsP=> p b'p; have [_ hallKp' _] := beta_max_pdiv b'p. +by rewrite (sub_Hall_pcore hallKp') ?(pi_p'group bH). +Qed. + +(* This is B & G, Lemma 10.8(a), second part. *) +Lemma Mbeta_Hall_G : \beta(M).-Hall(G) M`_\beta. +Proof. +apply: (subHall_Hall (Msigma_Hall_G maxM) (beta_sub_sigma maxM)). +exact: pHall_subl sMbMs (pcore_sub _ _) Mbeta_Hall. +Qed. + +(* This is an equivalent form of B & G, Lemma 10.8(b), which is used directly *) +(* later in the proof (e.g., Corollary 10.9a below, and Lemma 12.11), and is *) +(* proved as an intermediate step of the proof of of 12.8(b). *) +Lemma Mbeta_quo_nil : nilpotent (M^`(1) / M`_\beta). +Proof. +have /and3P[_ bMb b'M'Mb] := pHall_subl Mbeta_der1 sM'M Mbeta_Hall. +apply: nilpotentS (Fitting_nil (M^`(1) / M`_\beta)) => /=. +rewrite -{1}[_ / _]Sylow_gen gen_subG. +apply/bigcupsP=> Q /SylowP[q _ /and3P[sQM' qQ _]]. +apply: subset_trans (pcore_sub q _). +rewrite p_core_Fitting -pcoreNK -bigcap_p'core subsetI sQM' /=. +apply/bigcapsP=> [[p /= _] q'p]; have [b_p | b'p] := boolP (p \in \beta(M)). + by rewrite pcore_pgroup_id ?(pi'_p'group _ b_p) // /pgroup card_quotient. +have p'Mb: p^'.-group M`_\beta := pi_p'group bMb b'p. +rewrite sub_Hall_pcore ?(pi_p'group qQ) {Q qQ sQM'}//. +rewrite pquotient_pcore ?quotient_pHall ?(subset_trans (pcore_sub _ _)) //. +by have [-> _ _] := beta_max_pdiv b'p. +Qed. + +(* This is B & G, Lemma 10.8(b), generalized to arbitrary beta'-subgroups of *) +(* M^`(1) (which includes Hall beta'-subgroups of M^`(1) and M`_\beta). *) +Lemma beta'_der1_nil H : \beta(M)^'.-group H -> H \subset M^`(1) -> nilpotent H. +Proof. +move=> b'H sHM'; have [_ bMb _] := and3P Mbeta_Hall. +have{b'H} tiMbH: M`_\beta :&: H = 1 := coprime_TIg (pnat_coprime bMb b'H). +rewrite {tiMbH}(isog_nil (quotient_isog (subset_trans sHM' nMbM') tiMbH)). +exact: nilpotentS (quotientS _ sHM') Mbeta_quo_nil. +Qed. + +(* This is B & G, Corollary 10.9(a). *) +Corollary beta'_cent_Sylow p q X : + p \notin \beta(M) -> q \notin \beta(M) -> q.-group X -> + (p != q) && (X \subset M^`(1)) || (p < q) && (X \subset M) -> + [/\ (*a1*) exists2 P, p.-Sylow(M`_\sigma) (gval P) & X \subset 'C(P), + (*a2*) p \in \alpha(M) -> 'C_M(X)%G \in 'U + & (*a3*) q.-Sylow(M^`(1)) X -> + exists2 P, p.-Sylow(M^`(1)) (gval P) & P \subset 'N_M(X)^`(1)]. +Proof. +move=> b'p b'q qX q'p_sXM'; pose pq : nat_pred := pred2 p q. +have [q'p sXM]: p \in q^' /\ X \subset M. + case/orP: q'p_sXM' => /andP[q'p /subset_trans-> //]. + by rewrite !inE neq_ltn q'p. +have sXM'M: X <*> M^`(1) \subset M by rewrite join_subG sXM. +have solXM': solvable (X <*> M^`(1)) := solvableS sXM'M solM. +have pqX: pq.-group X by rewrite (pi_pgroup qX) ?inE ?eqxx ?orbT. +have{solXM' pqX} [W /= hallW sXW] := Hall_superset solXM' (joing_subl _ _) pqX. +have [sWXM' pqW _] := and3P hallW; have sWM := subset_trans sWXM' sXM'M. +have{b'q} b'W: \beta(M)^'.-group W. (* GG -- Coq diverges on b'p <> b'q *) + by apply: sub_pgroup pqW => r /pred2P[]->; [exact: b'p | exact: b'q]. +have nilM'W: nilpotent (M^`(1) :&: W). + by rewrite beta'_der1_nil ?subsetIl ?(pgroupS (subsetIr _ _)). +have{nilM'W} nilW: nilpotent W. + do [case/orP: q'p_sXM'=> /andP[]] => [_ sXM' | lt_pq _]. + by rewrite -(setIidPr sWXM') (joing_idPr sXM'). + pose Wq := 'O_p^'(M) :&: W; pose Wp := 'O_p(M^`(1) :&: W). + have nMp'M := char_norm (pcore_char p^' M). + have nMp'W := subset_trans sWM nMp'M. + have sylWq: q.-Sylow(W) Wq. + have [sWqMp' sWp'W] := subsetIP (subxx Wq). + have [Q sylQ] := Sylow_exists q W; have [sQW qQ _] := and3P sylQ. + rewrite [Wq](sub_pHall sylQ _ _ (subsetIr _ W)) //= -/Wq. + apply/pgroupP=> r r_pr r_dv_Wp'. + have:= pgroupP (pgroupS sWqMp' (pcore_pgroup _ _)) r r_pr r_dv_Wp'. + by apply/implyP; rewrite implyNb; exact: (pgroupP (pgroupS sWp'W pqW)). + have [[_ _ max_p] sQM] := (beta_max_pdiv b'p, subset_trans sQW sWM). + rewrite subsetI sQW -quotient_sub1 ?(subset_trans sQM nMp'M) //. + apply: contraLR lt_pq; rewrite -leqNgt andbT subG1 -rank_gt0. + rewrite (rank_pgroup (quotient_pgroup _ qQ)) p_rank_gt0 => piQb_q. + exact: max_p (piSg (quotientS _ sQM) piQb_q). + have nM'W: W \subset 'N(M^`(1)) by rewrite (subset_trans sWM) ?der_norm. + have qWWM': q.-group (W / (M^`(1) :&: W)). + rewrite (isog_pgroup _ (second_isog _)) ?(pgroupS (quotientS _ sWXM')) //=. + by rewrite (quotientYidr (subset_trans sXW nM'W)) quotient_pgroup. + have{qWWM'} sylWp: p.-Sylow(W) Wp. + rewrite /pHall pcore_pgroup (subset_trans (pcore_sub _ _)) ?subsetIr //=. + rewrite -(Lagrange_index (subsetIr _ _) (pcore_sub _ _)) pnat_mul //. + rewrite -(divgS (pcore_sub _ _)) -card_quotient ?normsI ?normG //= -pgroupE. + rewrite (pi_p'group qWWM') //= -(dprod_card (nilpotent_pcoreC p nilM'W)). + by rewrite mulKn ?cardG_gt0 // -pgroupE pcore_pgroup. + have [[sWqW qWq _] [sWpW pWp _]] := (and3P sylWq, and3P sylWp). + have <-: Wp * Wq = W. + apply/eqP; rewrite eqEcard mul_subG //= -(partnC q (cardG_gt0 W)). + rewrite (coprime_cardMg (p'nat_coprime (pi_pnat pWp _) qWq)) //. + rewrite (card_Hall sylWp) (card_Hall sylWq) -{2}(part_pnat_id pqW) -partnI. + rewrite mulnC (@eq_partn _ p) // => r. + by rewrite !inE andb_orl andbN orbF; apply: andb_idr; move/eqP->. + apply: nilpotentS (mul_subG _ _) (Fitting_nil W). + rewrite Fitting_max ?(pgroup_nil pWp) //. + by rewrite (char_normal_trans (pcore_char _ _)) //= setIC norm_normalI. + by rewrite Fitting_max ?(pgroup_nil qWq) //= setIC norm_normalI. +have part1: exists2 P : {group gT}, p.-Sylow(M`_\sigma) P & X \subset 'C(P). + have sMsXM' := subset_trans sMsM' (joing_subr X _). + have nsMsXM': M`_\sigma <| X <*> M^`(1) := normalS sMsXM' sXM'M nsMsM. + have sylWp: p.-Hall(M`_\sigma) ('O_p(W) :&: M`_\sigma). + rewrite setIC (Sylow_setI_normal nsMsXM') //. + exact: subHall_Sylow hallW (predU1l _ _) (nilpotent_pcore_Hall p nilW). + have [_ _ cWpWp' _] := dprodP (nilpotent_pcoreC p nilW). + exists ('O_p(W) :&: M`_\sigma)%G; rewrite ?(centSS _ _ cWpWp') ?subsetIl //. + by rewrite (sub_Hall_pcore (nilpotent_pcore_Hall _ _)) ?(pi_p'group qX). +split=> // [a_p | {part1}sylX]. + have ltCMX_G := sub_proper_trans (subsetIl M 'C(X)) ltMG. + have [P sylP cPX] := part1; have s_p := alpha_sub_sigma maxM a_p. + have{sylP} sylP := subHall_Sylow hallMs s_p sylP. + apply: rank3_Uniqueness ltCMX_G (leq_trans a_p _). + by rewrite -(rank_Sylow sylP) rankS //= subsetI (pHall_sub sylP) // centsC. +do [move: sWXM'; rewrite (joing_idPr (pHall_sub sylX)) => sWM'] in hallW. +have nMbX: X \subset 'N(M`_\beta) := subset_trans sXM (normal_norm nsMbM). +have nsMbXM : M`_\beta <*> X <| M. + rewrite -{2}(quotientGK nsMbM) -quotientYK ?cosetpre_normal //=. + rewrite (eq_Hall_pcore _ (quotient_pHall nMbX sylX)); last first. + exact: nilpotent_pcore_Hall Mbeta_quo_nil. + by rewrite (char_normal_trans (pcore_char _ _)) ?quotient_normal ?der_normal. +pose U := 'N_M(X); have defM: M`_\beta * U = M. + have sXU : X \subset U by rewrite subsetI sXM normG. + rewrite -[U](mulSGid sXU) /= -/U mulgA -norm_joinEr //. + apply: Frattini_arg nsMbXM (pHall_subl (joing_subr _ X) _ sylX). + by rewrite join_subG Mbeta_der1 (pHall_sub sylX). +have sWpU: 'O_p(W) \subset U. + rewrite (subset_trans (pcore_sub _ _)) // subsetI sWM normal_norm //=. + have sylX_W: q.-Sylow(W) X := pHall_subl sXW sWM' sylX. + by rewrite (eq_Hall_pcore (nilpotent_pcore_Hall q nilW) sylX_W) pcore_normal. +have sylWp: p.-Sylow(M^`(1)) 'O_p(W). + exact: subHall_Sylow hallW (predU1l _ _) (nilpotent_pcore_Hall p nilW). +exists 'O_p(W)%G; rewrite //= -(setIidPl (pHall_sub sylWp)). +rewrite (pprod_focal_coprime defM) ?pcore_normal ?subsetIr //. +exact: pnat_coprime (pcore_pgroup _ _) (pi_pnat (pcore_pgroup _ _) _). +Qed. + +(* This is B & G, Corollary 10.9(b). *) +Corollary nonuniq_norm_Sylow_pprod p H S : + H \in 'M -> H :!=: M -> p.-Sylow(G) S -> 'N(S) \subset H :&: M -> + M`_\beta * (H :&: M) = M /\ \alpha(M) =i \beta(M). +Proof. +move=> maxH neqHM sylS_G sN_HM; have [sNH sNM] := subsetIP sN_HM. +have [sSM sSH] := (subset_trans (normG S) sNM, subset_trans (normG S) sNH). +have [sylS pS] := (pHall_subl sSM (subsetT M) sylS_G, pHall_pgroup sylS_G). +have sMp: p \in \sigma(M) by apply/exists_inP; exists S. +have aM'p: p \in \alpha(M)^'. + apply: contra neqHM; rewrite !inE -(rank_Sylow sylS) => rS. + have uniqS: S \in 'U := rank3_Uniqueness (mFT_pgroup_proper pS) rS. + by rewrite (eq_uniq_mmax (def_uniq_mmax uniqS maxM sSM) maxH sSH). +have sSM': S \subset M^`(1). + by rewrite (subset_trans _ sMsM') ?(sub_Hall_pcore hallMs) ?(pi_pgroup pS). +have nMbS := subset_trans sSM (normal_norm nsMbM). +have nMbSM: M`_\beta <*> S <| M. + rewrite -{2}(quotientGK nsMbM) -quotientYK ?cosetpre_normal //=. + have sylS_M' := pHall_subl sSM' sM'M sylS. + rewrite (eq_Hall_pcore _ (quotient_pHall nMbS sylS_M')); last first. + exact: nilpotent_pcore_Hall Mbeta_quo_nil. + by rewrite (char_normal_trans (pcore_char _ _)) ?quotient_normal ?der_normal. +have defM: M`_\beta * 'N_M(S) = M. + have sSNM: S \subset 'N_M(S) by rewrite subsetI sSM normG. + rewrite -(mulSGid sSNM) /= mulgA -norm_joinEr //. + by rewrite (Frattini_arg _ (pHall_subl _ _ sylS_G)) ?joing_subr ?subsetT. +split=> [|q]. + apply/eqP; rewrite setIC eqEsubset mulG_subG subsetIl pcore_sub /=. + by rewrite -{1}defM mulgS ?setIS. +apply/idP/idP=> [aMq|]; last exact: beta_sub_alpha. +apply: contraR neqHM => bM'q; have bM'p := contra (@beta_sub_alpha _ M p) aM'p. +have [|_ uniqNM _] := beta'_cent_Sylow bM'q bM'p pS. + by apply: contraR aM'p; rewrite sSM'; case: eqP => //= <- _. +rewrite (eq_uniq_mmax (def_uniq_mmax (uniqNM aMq) maxM (subsetIl _ _)) maxH) //. +by rewrite subIset ?(subset_trans (cent_sub _)) ?orbT. +Qed. + +(* This is B & G, Proposition 10.10. *) +Proposition max_normed_2Elem_signaliser p q (A Q : {group gT}) : + p != q -> A \in 'E_p^2(G) :&: 'E*_p(G) -> Q \in |/|*(A; q) -> + q %| #|'C(A)| -> + exists2 P : {group gT}, p.-Sylow(G) P /\ A \subset P + & [/\ (*a*) 'O_p^'('C(P)) * ('N(P) :&: 'N(Q)) = 'N(P), + (*b*) P \subset 'N(Q)^`(1) + & (*c*) q.-narrow Q -> P \subset 'C(Q)]. +Proof. +move=> neq_pq /setIP[Ep2A EpmA] maxQ piCAq. +have [_ abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA. +have [p_pr oA] := (pnElem_prime Ep2A, card_pnElem Ep2A). +have{dimA} rA2: 'r(A) = 2 by rewrite (rank_abelem abelA). +have{EpmA} ncA: normed_constrained A. + have ntA: A :!=: 1 by rewrite -rank_gt0 rA2. + exact: plength_1_normed_constrained ntA EpmA (mFT_proper_plength1 _). +pose pi := \pi(A); pose K := 'O_pi^'('C(A)). +have def_pi : pi =i (p : nat_pred). + by move=> r; rewrite !inE /= oA primes_exp ?primes_prime ?inE. +have pi'q : q \notin pi by rewrite def_pi !inE eq_sym. +have transKA: [transitive K, on |/|*(A; q) | 'JG]. + by rewrite normed_constrained_rank2_trans // (center_idP cAA) rA2. +have [P0 sylP0 sAP0] := Sylow_superset (subsetT _) pA. +have pP0: p.-group P0 := pHall_pgroup sylP0. +have piP0: pi.-group P0 by rewrite (eq_pgroup _ def_pi). +have{pP0} snAP0: A <|<| P0 := nilpotent_subnormal (pgroup_nil pP0) sAP0. +have{pi'q snAP0 ncA piP0} [//|] := normed_trans_superset ncA pi'q snAP0 piP0. +rewrite /= -/pi -/K => -> transKP submaxPA maxPfactoring. +have{transKP} [Q0 maxQ0 _] := imsetP transKP. +have{transKA} [k Kk defQ] := atransP2 transKA (subsetP submaxPA _ maxQ0) maxQ. +set P := P0 :^ k; have{sylP0} sylP: p.-Sylow(G) P by rewrite pHallJ ?in_setT. +have nAK: K \subset 'N(A) by rewrite cents_norm ?pcore_sub. +have{sAP0 nAK K Kk} sAP: A \subset P by rewrite -(normsP nAK k Kk) conjSg. +exists [group of P] => //. +have{maxPfactoring} [sPNQ' defNP] := maxPfactoring _ maxQ0. +move/(congr1 ('Js%act^~ k)): defNP sPNQ'; rewrite -(conjSg _ _ k) /=. +rewrite conjsMg !conjIg !conjsRg -!derg1 -!normJ -pcoreJ -centJ -/P. +rewrite -(congr_group defQ) (eq_pcore _ (eq_negn def_pi)) => defNP sPNQ'. +have{sPNQ'} sPNQ': P \subset 'N(Q)^`(1). + by rewrite (setIidPl (mFT_Sylow_der1 sylP)) in sPNQ'. +split=> // narrowQ; have [-> | ntQ] := eqsVneq Q 1; first exact: cents1. +pose AutQ := conj_aut Q @* 'N(Q). +have qQ: q.-group Q by case/mem_max_normed: maxQ. +have ltNG: 'N(Q) \proper G by rewrite mFT_norm_proper // (mFT_pgroup_proper qQ). +have{ltNG} qAutQ': q.-group AutQ^`(1). + have qAutQq: q.-group 'O_q(AutQ) := pcore_pgroup _ _. + rewrite (pgroupS _ qAutQq) // der1_min ?gFnorm //. + have solAutQ: solvable AutQ by rewrite morphim_sol -?mFT_sol_proper. + have [oddQ oddAutQ]: odd #|Q| /\ odd #|AutQ| by rewrite morphim_odd mFT_odd. + by have /(Aut_narrow qQ)[] := Aut_conj_aut Q 'N(Q). +have nQP: P \subset 'N(Q) := subset_trans sPNQ' (der_sub 1 _). +rewrite (sameP setIidPl eqP) eqEsubset subsetIl /=. +rewrite -quotient_sub1 ?normsI ?normG ?norms_cent //= -ker_conj_aut subG1. +rewrite trivg_card1 (card_isog (first_isog_loc _ _)) //= -trivg_card1 -subG1. +have q'AutP: q^'.-group (conj_aut Q @* P). + by rewrite morphim_pgroup //; apply: pi_pnat (pHall_pgroup sylP) _. +rewrite -(coprime_TIg (pnat_coprime qAutQ' q'AutP)) subsetI subxx. +by rewrite /= -morphim_der // morphimS. +Qed. + +(* Notation for Proposition 11, which is the last to appear in this segment. *) +Local Notation sigma' := \sigma(gval M)^'. + +(* This is B & G, Proposition 10.11(a). *) +Proposition sigma'_not_uniq K : K \subset M -> sigma'.-group K -> K \notin 'U. +Proof. +move=> sKM sg'K; have [E hallE sKE] := Hall_superset solM sKM sg'K. +have [sEM sg'E _] := and3P hallE. +have rEle2: 'r(E) <= 2. + have [q _ ->] := rank_witness E; rewrite leqNgt; apply/negP=> rEgt2. + have: q \in sigma' by rewrite (pnatPpi sg'E) // -p_rank_gt0 -(subnKC rEgt2). + by rewrite inE /= alpha_sub_sigma //; apply: leq_trans (p_rankS q sEM). +have [E1 | ntE]:= eqsVneq E 1. + by apply: contraL (@uniq_mmax_neq1 _ K) _; rewrite -subG1 -E1. +pose p := max_pdiv #|E|; pose P := 'O_p(E). +have piEp: p \in \pi(E) by rewrite pi_max_pdiv cardG_gt1. +have sg'p: p \in sigma' by rewrite (pnatPpi sg'E). +have sylP: p.-Sylow(E) P. + rewrite rank2_max_pcore_Sylow ?mFT_odd ?(solvableS sEM solM) //. + exact: leq_trans (rankS (Fitting_sub E)) rEle2. +apply: contra (sg'p) => uniqK; apply/existsP; exists [group of P]. +have defMK := def_uniq_mmax uniqK maxM (subset_trans sKE sEM). +rewrite (subHall_Sylow hallE) // (sub_uniq_mmax defMK) //; last first. + rewrite mFT_norm_proper ?(mFT_pgroup_proper (pcore_pgroup _ _)) //. + by rewrite -cardG_gt1 (card_Hall sylP) p_part_gt1. +by rewrite (subset_trans sKE) // gFnorm. +Qed. + +(* This is B & G, Proposition 10.11(b). *) +Proposition sub'cent_sigma_rank1 K : + K \subset M -> sigma'.-group K -> 'r('C_K(M`_\sigma)) <= 1. +Proof. +move=> sKM sg'K; rewrite leqNgt; apply/rank_geP=> [[A /nElemP[p Ep2A]]]. +have p_pr := pnElem_prime Ep2A. +have [sACKMs abelA dimA] := pnElemP Ep2A; rewrite subsetI centsC in sACKMs. +have{sACKMs} [sAK cAMs]: A \subset K /\ M`_\sigma \subset 'C(A) := andP sACKMs. +have sg'p: p \in sigma'. + by rewrite (pgroupP (pgroupS sAK sg'K)) // (card_pnElem Ep2A) dvdn_mull. +have [Ms1 | [q q_pr q_dvd_Ms]] := trivgVpdiv M`_\sigma. + by case/eqP: (Msigma_neq1 maxM). +have sg_q: q \in \sigma(M) := pgroupP (pcore_pgroup _ _) _ q_pr q_dvd_Ms. +have neq_pq: p != q by apply: contraNneq sg'p => ->. +have [Q sylQ] := Sylow_exists q M`_\sigma; have [sQMs qQ _] := and3P sylQ. +have cAQ: Q \subset 'C(A) := subset_trans sQMs cAMs. +have{q_dvd_Ms} q_dv_CA: q %| #|'C(A)|. + rewrite (dvdn_trans _ (cardSg cAQ)) // -(part_pnat_id (pnat_id q_pr)). + by rewrite (card_Hall sylQ) partn_dvd. +have{cAQ} maxQ: Q \in |/|*(A; q). + rewrite inE; apply/maxgroupP; rewrite qQ cents_norm 1?centsC //. + split=> // Y /andP[qY _] sQY; apply: sub_pHall qY sQY (subsetT Y). + by rewrite (subHall_Sylow (Msigma_Hall_G maxM)). +have sNQM: 'N(Q) \subset M. + by rewrite (norm_sigma_Sylow sg_q) // (subHall_Sylow hallMs). +have rCAle2: 'r('C(A)) <= 2. + apply: contraR (sigma'_not_uniq sKM sg'K); rewrite -ltnNge => rCAgt2. + apply: uniq_mmaxS sAK (sub_mmax_proper maxM sKM) _. + by apply: cent_rank3_Uniqueness rCAgt2; rewrite (rank_abelem abelA) dimA. +have max2A: A \in 'E_p^2(G) :&: 'E*_p(G). + rewrite 3!inE subsetT abelA dimA; apply/pmaxElemP; rewrite inE subsetT. + split=> // Y /pElemP[_ abelY /eqVproper[]//ltAY]. + have [pY cYY _] := and3P abelY. + suffices: 'r_p('C(A)) > 2 by rewrite ltnNge (leq_trans (p_rank_le_rank p _)). + rewrite -dimA (leq_trans (properG_ltn_log pY ltAY)) //. + by rewrite logn_le_p_rank // inE centsC (subset_trans (proper_sub ltAY)). +have{rCAle2 cAMs} Ma1: M`_\alpha = 1. + apply: contraTeq rCAle2; rewrite -rank_gt0 -ltnNge. + have [r _ ->] := rank_witness M`_\alpha; rewrite p_rank_gt0. + move/(pnatPpi (pcore_pgroup _ _))=> a_r; apply: (leq_trans a_r). + have [R sylR] := Sylow_exists r M`_\sigma. + have sylR_M: r.-Sylow(M) R. + by rewrite (subHall_Sylow (Msigma_Hall maxM)) ?alpha_sub_sigma. + rewrite -(p_rank_Sylow sylR_M) (p_rank_Sylow sylR). + by rewrite (leq_trans (p_rank_le_rank r _)) // rankS // centsC. +have{Ma1} nilM': nilpotent M^`(1). + by rewrite (isog_nil (quotient1_isog _)) -Ma1 Malpha_quo_nil. +have{max2A maxQ neq_pq q_dv_CA} [P [sylP sAP] sPNQ']: + exists2 P : {group gT}, p.-Sylow(G) P /\ A \subset P & P \subset 'N(Q)^`(1). +- by case/(max_normed_2Elem_signaliser neq_pq): maxQ => // P ? []; exists P. +have{sNQM} defP: 'O_p(M^`(1)) = P. + rewrite (nilpotent_Hall_pcore nilM' (pHall_subl _ _ sylP)) ?subsetT //. + by rewrite (subset_trans sPNQ') ?dergS. +have charP: P \char M by rewrite -defP (char_trans (pcore_char p _)) ?der_char. +have [sPM nsPM] := (char_sub charP, char_normal charP). +case/exists_inP: sg'p; exists P; first exact: pHall_subl (subsetT M) sylP. +by rewrite (mmax_normal maxM) // -rank_gt0 ltnW // -dimA -rank_abelem ?rankS. +Qed. + +(* This is B & G, Proposition 10.11(c). *) +Proposition sub'cent_sigma_cyclic K (Y := 'C_K(M`_\sigma) :&: M^`(1)) : + K \subset M -> sigma'.-group K -> cyclic Y /\ Y <| M. +Proof. +move=> sKM sg'K; pose Z := 'O_sigma'('F(M)). +have nsZM: Z <| M := char_normal_trans (pcore_char _ _) (Fitting_normal M). +have [sZM nZM] := andP nsZM; have Fnil := Fitting_nil M. +have rZle1: 'r(Z) <= 1. + apply: leq_trans (rankS _) (sub'cent_sigma_rank1 sZM (pcore_pgroup _ _)). + rewrite subsetI subxx (sameP commG1P trivgP) /=. + rewrite -(TI_pcoreC \sigma(M) M 'F(M)) subsetI commg_subl commg_subr. + by rewrite (subset_trans sZM) ?gFnorm ?(subset_trans (pcore_sub _ _)). +have{rZle1} cycZ: cyclic Z. + have nilZ: nilpotent Z := nilpotentS (pcore_sub _ _) Fnil. + by rewrite nil_Zgroup_cyclic // odd_rank1_Zgroup // mFT_odd. +have cZM': M^`(1) \subset 'C_M(Z). + rewrite der1_min ?normsI ?normG ?norms_cent //= -ker_conj_aut. + rewrite (isog_abelian (first_isog_loc _ _)) //. + by rewrite (abelianS (Aut_conj_aut _ _)) // Aut_cyclic_abelian. +have sYF: Y \subset 'F(M). + apply: subset_trans (cent_sub_Fitting (mmax_sol maxM)). + have [_ /= <- _ _] := dprodP (nilpotent_pcoreC \sigma(M) Fnil). + by rewrite centM setICA setISS // setIC subIset ?centS // pcore_Fitting. +have{sYF} sYZ: Y \subset Z. + rewrite (sub_Hall_pcore (nilpotent_pcore_Hall _ Fnil)) //=. + by rewrite -setIA (pgroupS (subsetIl K _)). +by rewrite (cyclicS sYZ cycZ) (char_normal_trans _ nsZM) // sub_cyclic_char. +Qed. + +(* This is B & G, Proposition 10.11(d). *) +Proposition commG_sigma'_1Elem_cyclic p K P (K0 := [~: K, P]) : + K \subset M -> sigma'.-group K -> p \in sigma' -> P \in 'E_p^1('N_M(K)) -> + 'C_(M`_\sigma)(P) = 1 -> p^'.-group K -> abelian K -> + [/\ K0 \subset 'C(M`_\sigma), cyclic K0 & K0 <| M]. +Proof. +move=> sKM sg'K sg'p EpP regP p'K cKK. +have nK0P: P \subset 'N(K0) := commg_normr P K. +have p_pr := pnElem_prime EpP; have [sPMN _ oP] := pnElemPcard EpP. +have [sPM nKP]: P \subset M /\ P \subset 'N(K) by apply/subsetIP. +have /andP[sMsM nMsM]: M`_\sigma <| M := pcore_normal _ _. +have sK0K: K0 \subset K by rewrite commg_subl. +have [sK0M sg'K0]:= (subset_trans sK0K sKM, pgroupS sK0K sg'K). +have [nMsK0 nMsP] := (subset_trans sK0M nMsM, subset_trans sPM nMsM). +have coKP: coprime #|K| #|P| by rewrite oP coprime_sym prime_coprime -?p'natE. +have coK0Ms: coprime #|K0| #|M`_\sigma|. + by rewrite coprime_sym (pnat_coprime (pcore_pgroup _ _)). +have nilK0Ms: nilpotent (K0 <*> M`_\sigma). + have mulK0MsP: K0 <*> M`_\sigma ><| P = K0 <*> M`_\sigma <*> P. + rewrite sdprodEY ?normsY // coprime_TIg //= norm_joinEl //. + rewrite coprime_cardMg // coprime_mull (coprimeSg sK0K) //. + by rewrite oP (pnat_coprime (pcore_pgroup _ _)) ?pnatE. + apply: (prime_Frobenius_sol_kernel_nil mulK0MsP); rewrite ?oP //=. + by rewrite (solvableS _ solM) // !join_subG sK0M pcore_sub. + rewrite norm_joinEl // -subcent_TImulg ?subsetI ?nK0P //. + by rewrite coprime_abel_cent_TI ?mul1g. + exact: coprime_TIg. +have cMsK0: K0 \subset 'C(M`_\sigma). + rewrite (sub_nilpotent_cent2 nilK0Ms) ?joing_subl ?joing_subr //. + exact: pnat_coprime (pcore_pgroup _ _) sg'K0. +have [cycY nsYM] := sub'cent_sigma_cyclic sK0M sg'K0. +set Y := _ :&: _ in cycY nsYM. +have sK0Y: K0 \subset Y by rewrite !subsetI subxx cMsK0 commgSS. +split=> //; first exact: cyclicS sK0Y cycY. +by apply: char_normal_trans nsYM; rewrite sub_cyclic_char. +Qed. + +End AnotherMaximal. + +(* This is B & G, Lemma 10.12. *) +Lemma sigma_disjoint M H : + M \in 'M -> H \in 'M -> gval H \notin M :^: G -> + [/\ (*a*) M`_\alpha :&: H`_\sigma = 1, + [predI \alpha(M) & \sigma(H)] =i pred0 + & (*b*) nilpotent M`_\sigma -> + M`_\sigma :&: H`_\sigma = 1 + /\ [predI \sigma(M) & \sigma(H)] =i pred0]. +Proof. +move=> maxM maxH notjMH. +suffices sigmaMHnil p: p \in [predI \sigma(M) & \sigma(H)] -> + p \notin \alpha(M) /\ ~~ nilpotent M`_\sigma. +- have a2: [predI \alpha(M) & \sigma(H)] =i pred0. + move=> p; apply/andP=> [[/= aMp sHp]]. + by case: (sigmaMHnil p); rewrite /= ?aMp // inE /= alpha_sub_sigma. + split=> // [|nilMs]. + rewrite coprime_TIg // (pnat_coprime (pcore_pgroup _ _)) //. + apply: sub_in_pnat (pcore_pgroup _ _) => p _ sHp. + by apply: contraFN (a2 p) => aMp; rewrite inE /= sHp andbT. + have b2: [predI \sigma(M) & \sigma(H)] =i pred0. + by move=> p; apply/negP; case/sigmaMHnil => _; rewrite nilMs. + rewrite coprime_TIg // (pnat_coprime (pcore_pgroup _ _)) //. + apply: sub_in_pnat (pcore_pgroup _ _) => p _ sHp. + by apply: contraFN (b2 p) => bMp; rewrite inE /= sHp andbT. +case/andP=> sMp sHp; have [S sylS]:= Sylow_exists p M. +have [sSM pS _] := and3P sylS. +have sylS_G: p.-Sylow(G) S := sigma_Sylow_G maxM sMp sylS. +have [g sSHg]: exists g, S \subset H :^ g. + have [Sg' sylSg']:= Sylow_exists p H. + have [g _ ->] := Sylow_trans (sigma_Sylow_G maxH sHp sylSg') sylS_G. + by exists g; rewrite conjSg (pHall_sub sylSg'). +have{notjMH} neqHgM: H :^ g != M. + by apply: contraNneq notjMH => <-; rewrite orbit_sym mem_orbit ?in_setT. +do [split; apply: contra neqHgM] => [|nilMs]. + rewrite !inE -(p_rank_Sylow sylS) -rank_pgroup //= => rS_gt3. + have uniqS: S \in 'U := rank3_Uniqueness (mFT_pgroup_proper pS) rS_gt3. + have defUS: 'M(S) = [set M] := def_uniq_mmax uniqS maxM sSM. + by rewrite (eq_uniq_mmax defUS _ sSHg) ?mmaxJ. +have nsSM: S <| M. + have nsMsM: M`_\sigma <| M by exact: pcore_normal. + have{sylS} sylS: p.-Sylow(M`_\sigma) S. + apply: pHall_subl (pcore_sub _ _) sylS => //. + by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) ?(pi_pgroup pS). + rewrite (nilpotent_Hall_pcore nilMs sylS). + by rewrite (char_normal_trans (pcore_char _ _)). +have sNS_Hg: 'N(S) \subset H :^ g. + rewrite -sub_conjgV -normJ (norm_sigma_Sylow sHp) //. + by rewrite (pHall_subl _ (subsetT _)) ?sub_conjgV // pHallJ ?in_setT. +have ltHg: H :^ g \proper G by rewrite mmax_proper ?mmaxJ //. +rewrite (mmax_max maxM ltHg) // -(mmax_normal maxM nsSM) //. +by apply: contraTneq sNS_Hg => ->; rewrite norm1 proper_subn. +Qed. + +(* This is B & G, Lemma 10.13. *) +Lemma basic_p2maxElem_structure p A P : + A \in 'E_p^2(G) :&: 'E*_p(G) -> p.-group P -> A \subset P -> ~~ abelian P -> + let Z0 := ('Ohm_1('Z(P)))%G in + [/\ (*a*) Z0 \in 'E_p^1(A), + (*b*) exists Y : {group gT}, + [/\ cyclic Y, Z0 \subset Y + & forall A0, A0 \in 'E_p^1(A) :\ Z0 -> A0 \x Y = 'C_P(A)] + & (*c*) [transitive 'N_P(A), on 'E_p^1(A) :\ Z0| 'JG]]. +Proof. +case/setIP=> Ep2A maxA pP sAP not_cPP Z0; set E1A := 'E_p^1(A). +have p_pr: prime p := pnElem_prime Ep2A; have [_ abelA dimA] := pnElemP Ep2A. +have [oA [pA cAA _]] := (card_pnElem Ep2A, and3P abelA). +have [p_gt0 p_gt1] := (prime_gt0 p_pr, prime_gt1 p_pr). +have{maxA} maxA S: + p.-group S -> A \subset S -> A \in 'E*_p(S) /\ 'Ohm_1('C_S(A)) = A. +- move=> pS sAS; suff maxAS: A \in 'E*_p(S) by rewrite (Ohm1_cent_max maxAS). + by rewrite (subsetP (pmaxElemS p (subsetT S))) // inE maxA inE. +have [S sylS sPS] := Sylow_superset (subsetT P) pP. +pose Z1 := 'Ohm_1('Z(S))%G; have sZ1Z: Z1 \subset 'Z(S) := Ohm_sub 1 _. +have [pS sAS] := (pHall_pgroup sylS, subset_trans sAP sPS). +have [maxAS defC1] := maxA S pS sAS; set C := 'C_S(A) in defC1. +have sZ0A: Z0 \subset A by rewrite -defC1 OhmS // setISS // centS. +have sZ1A: Z1 \subset A by rewrite -defC1 OhmS // setIS // centS. +have [pZ0 pZ1]: p.-group Z0 /\ p.-group Z1 by split; exact: pgroupS pA. +have sZ10: Z1 \subset Z0. + rewrite -[gval Z1]Ohm_id OhmS // subsetI (subset_trans sZ1A) //=. + by rewrite (subset_trans sZ1Z) // subIset // centS ?orbT. +have ntZ1: Z1 :!=: 1. + have: A :!=: 1 by rewrite -cardG_gt1 oA (ltn_exp2l 0). + apply: contraNneq; rewrite -subG1 -(setIidPr sZ1Z) => /TI_Ohm1. + by rewrite setIid => /(trivg_center_pgroup pS) <-. +have EpZ01: abelian C -> Z1 = Z0 /\ Z0 \in E1A. + move=> cCC; have [eqZ0A | ltZ0A] := eqVproper sZ0A. + rewrite (abelianS _ cCC) // in not_cPP. + by rewrite subsetI sPS centsC -eqZ0A (subset_trans (Ohm_sub _ _)) ?subsetIr. + have leZ0p: #|Z0| <= p ^ 1. + by rewrite (card_pgroup pZ0) leq_exp2l // -ltnS -dimA properG_ltn_log. + have [_ _ [e oZ1]] := pgroup_pdiv pZ1 ntZ1. + have{e oZ1}: #|Z1| >= p by rewrite oZ1 (leq_exp2l 1). + rewrite (geq_leqif (leqif_trans (subset_leqif_card sZ10) (leqif_eq leZ0p))). + rewrite [E1A]p1ElemE // !inE sZ0A; case/andP=> sZ01 ->. + by split=> //; apply/eqP; rewrite -val_eqE eqEsubset sZ10. +have [A1 neqA1Z EpA1]: exists2 A1, A1 != Z1 & #|Z1| = p -> A1 \in E1A. + have [oZ1 |] := #|Z1| =P p; last by exists 1%G; rewrite // eq_sym. + have [A1 defA]:= abelem_split_dprod abelA sZ1A. + have{defA} [_ defA _ tiA1Z1] := dprodP defA. + have EpZ1: Z1 \in E1A by rewrite [E1A]p1ElemE // !inE sZ1A /= oZ1. + suffices: A1 \in E1A by exists A1; rewrite // eq_sym; exact/(TIp1ElemP EpZ1). + rewrite [E1A]p1ElemE // !inE -defA mulG_subr /=. + by rewrite -(mulKn #|A1| p_gt0) -{1}oZ1 -TI_cardMg // defA oA mulKn. +pose cplA1C Y := [/\ cyclic Y, Z0 \subset Y, A1 \x Y = C & abelian C]. +have [Y [{cplA1C} cycY sZ0Y defC cCC]]: exists Y, cplA1C Y. + have [rSgt2 | rSle2] := ltnP 2 'r(S). + rewrite (rank_pgroup pS) in rSgt2; have oddS := mFT_odd S. + have max2AS: A \in 'E_p^2(S) :&: 'E*_p(S) by rewrite 3!inE sAS abelA dimA. + have oZ1: #|Z1| = p by case/Ohm1_ucn_p2maxElem: max2AS => // _ []. + have{EpA1} EpA1 := EpA1 oZ1; have [sA1A abelA1 oA1] := pnElemPcard EpA1. + have EpZ1: Z1 \in E1A by rewrite [E1A]p1ElemE // !inE sZ1A /= oZ1. + have [_ defA cA1Z tiA1Z] := dprodP (p2Elem_dprodP Ep2A EpA1 EpZ1 neqA1Z). + have defC: 'C_S(A1) = C. + rewrite /C -defA centM setICA setIC ['C_S(Z1)](setIidPl _) // centsC. + by rewrite (subset_trans sZ1Z) ?subsetIr. + have rCSA1: 'r_p('C_S(A1)) <= 2. + by rewrite defC -p_rank_Ohm1 defC1 (p_rank_abelem abelA) dimA. + have sA1S := subset_trans sA1A sAS. + have nnS: p.-narrow S by apply/implyP=> _; apply/set0Pn; exists A. + have [] := narrow_cent_dprod pS oddS rSgt2 nnS oA1 sA1S rCSA1. + set Y := _ :&: _; rewrite {}defC => cycY _ _ defC; exists [group of Y]. + have cCC: abelian C; last split=> //. + apply/center_idP; rewrite -(center_dprod defC). + rewrite (center_idP (abelem_abelian abelA1)). + by rewrite (center_idP (cyclic_abelian cycY)). + have{EpZ01} [<- _] := EpZ01 cCC; rewrite subsetI (subset_trans sZ1Z) //. + by rewrite setIS ?centS // (subset_trans (Ohm_sub 1 _)) ?ucn_sub. + have not_cSS := contra (abelianS sPS) not_cPP. + have:= mFT_rank2_Sylow_cprod sylS rSle2 not_cSS. + case=> E [_ dimE3 eE] [Y cycY [defS defY1]]. + have [[_ mulEY cEY] cYY] := (cprodP defS, cyclic_abelian cycY). + have defY: 'Z(S) = Y. + case/cprodP: (center_cprod defS) => _ <- _. + by rewrite (center_idP cYY) -defY1 mulSGid ?Ohm_sub. + have pY: p.-group Y by rewrite -defY (pgroupS (center_sub S)). + have sES: E \subset S by rewrite -mulEY mulG_subl. + have pE := pgroupS sES pS. + have defS1: 'Ohm_1(S) = E. + apply/eqP; rewrite (OhmE 1 pS) eqEsubset gen_subG andbC. + rewrite sub_gen; last by rewrite subsetI sES sub_LdivT. + apply/subsetP=> ey /LdivP[]; rewrite -mulEY. + case/imset2P=> e y Ee Yy -> eyp; rewrite groupM //. + rewrite (subsetP (center_sub E)) // -defY1 (OhmE 1 pY) mem_gen //. + rewrite expgMn in eyp; last by red; rewrite -(centsP cEY). + by rewrite (exponentP eE) // mul1g in eyp; rewrite !inE Yy eyp eqxx. + have sAE: A \subset E by rewrite -defS1 -(Ohm1_id abelA) OhmS. + have defC: A * Y = C. + rewrite /C -mulEY setIC -group_modr; last first. + by rewrite -defY subIset // orbC centS. + congr (_ * _); apply/eqP; rewrite /= setIC eqEcard subsetI sAE. + have pCEA: p.-group 'C_E(A) := pgroupS (subsetIl E _) pE. + rewrite -abelianE cAA (card_pgroup pCEA) oA leq_exp2l //= leqNgt. + apply: contraL cycY => dimCEA3. + have sAZE: A \subset 'Z(E). + rewrite subsetI sAE // centsC (sameP setIidPl eqP) eqEcard subsetIl /=. + by rewrite (card_pgroup pE) (card_pgroup pCEA) dimE3 leq_exp2l. + rewrite abelian_rank1_cyclic // -ltnNge (rank_pgroup pY). + by rewrite (p_rank_abelian p cYY) defY1 -dimA lognSg. + have cAY: Y \subset 'C(A) by apply: centSS cEY. + have cCC: abelian C by rewrite -defC abelianM cAA cYY. + have{EpZ01} [eqZ10 EpZ1] := EpZ01 cCC; rewrite -eqZ10 in EpZ1. + have sZ0Y: Z0 \subset Y by rewrite -eqZ10 -defY Ohm_sub. + have{EpA1} EpA1 := EpA1 (card_pnElem EpZ1). + have [sA1A _ oA1] := pnElemPcard EpA1. + have [_ defA _ tiA1Z] := dprodP (p2Elem_dprodP Ep2A EpA1 EpZ1 neqA1Z). + exists Y; split; rewrite // dprodE ?(centSS _ sA1A cAY) ?prime_TIg ?oA1 //. + by rewrite -(mulSGid sZ0Y) -eqZ10 mulgA defA. + apply: contraL cycY => sA1Y; rewrite abelian_rank1_cyclic // -ltnNge. + by rewrite -dimA -rank_abelem ?rankS // -defA eqZ10 mul_subG. +have{EpZ01} [eqZ10 EpZ0] := EpZ01 cCC; have oZ0 := card_pnElem EpZ0. +have{EpA1} EpA1: A1 \in E1A by rewrite EpA1 ?eqZ10. +have [sA1A _ oA1] := pnElemPcard EpA1; rewrite {}eqZ10 in neqA1Z. +have [_ defA _ tiA1Z] := dprodP (p2Elem_dprodP Ep2A EpA1 EpZ0 neqA1Z). +split=> //; first exists (P :&: Y)%G. + have sPY_Y := subsetIr P Y; rewrite (cyclicS sPY_Y) //. + rewrite subsetI (subset_trans sZ0A) //= sZ0Y. + split=> // A0 /setD1P[neqA0Z EpA0]; have [sA0A _ _] := pnElemP EpA0. + have [_ mulA0Z _ tiA0Z] := dprodP (p2Elem_dprodP Ep2A EpA0 EpZ0 neqA0Z). + have{defC} [_ defC cA1Y tiA1Y] := dprodP defC. + rewrite setIC -{2}(setIidPr sPS) setIAC. + apply: dprod_modl (subset_trans sA0A sAP); rewrite -defC dprodE /=. + - by rewrite -(mulSGid sZ0Y) !mulgA mulA0Z defA. + - rewrite (centSS (subxx Y) sA0A) // -defA centM subsetI cA1Y /=. + by rewrite sub_abelian_cent ?cyclic_abelian. + rewrite setIC -(setIidPr sA0A) setIA -defA -group_modr //. + by rewrite (setIC Y) tiA1Y mul1g setIC. +apply/imsetP; exists A1; first by rewrite 2!inE neqA1Z. +apply/eqP; rewrite eq_sym eqEcard; apply/andP; split. + apply/subsetP=> _ /imsetP[x /setIP[Px nAx] ->]. + rewrite 2!inE /E1A -(normP nAx) pnElemJ EpA1 andbT -val_eqE /=. + have nZ0P: P \subset 'N(Z0). + by rewrite (char_norm_trans (Ohm_char 1 _)) // gFnorm. + by rewrite -(normsP nZ0P x Px) (inj_eq (@conjsg_inj _ x)). +have pN: p.-group 'N_P(_) := pgroupS (subsetIl P _) pP. +have defCPA: 'N_('N_P(A))(A1) = 'C_P(A). + apply/eqP; rewrite eqEsubset andbC subsetI setIS ?cent_sub //. + rewrite subIset /=; last by rewrite orbC cents_norm ?centS. + rewrite setIAC (subset_trans (subsetIl _ _)) //= subsetI subsetIl /=. + rewrite -defA centM subsetI andbC subIset /=; last first. + by rewrite centsC (subset_trans (Ohm_sub 1 _)) ?subsetIr. + have nC_NP: 'N_P(A1) \subset 'N('C(A1)) by rewrite norms_cent ?subsetIr. + rewrite -quotient_sub1 // subG1 trivg_card1. + rewrite (pnat_1 (quotient_pgroup _ (pN _))) //. + rewrite -(card_isog (second_isog nC_NP)) /= (setIC 'C(A1)). + by apply: p'group_quotient_cent_prime; rewrite ?subsetIr ?oA1. +have sCN: 'C_P(A) \subset 'N_P(A) by rewrite setIS ?cent_sub. +have nA_NCPA: 'N_P('C_P(A)) \subset 'N_P(A). + have [_ defCPA1] := maxA P pP sAP. + by rewrite -{2}defCPA1 setIS // (char_norm_trans (Ohm_char 1 _)). +rewrite card_orbit astab1JG /= {}defCPA. +rewrite -(leq_add2l (Z0 \in E1A)) -cardsD1 EpZ0 (card_p1Elem_p2Elem Ep2A) ltnS. +rewrite dvdn_leq ?(pfactor_dvdn 1) ?indexg_gt0 // -divgS // logn_div ?cardSg //. +rewrite subn_gt0 properG_ltn_log ?pN //= (proper_sub_trans _ nA_NCPA) //. +rewrite (nilpotent_proper_norm (pgroup_nil pP)) // properEneq subsetIl andbT. +by apply: contraNneq not_cPP => <-; rewrite (abelianS (setSI _ sPS)). +Qed. + +(* This is B & G, Proposition 10.14(a). *) +Proposition beta_not_narrow p : p \in \beta(G) -> + [disjoint 'E_p^2(G) & 'E*_p(G)] + /\ (forall P, p.-Sylow(G) P -> [disjoint 'E_p^2(P) & 'E*_p(P)]). +Proof. +move/forall_inP=> nnG. +have nnSyl P: p.-Sylow(G) P -> [disjoint 'E_p^2(P) & 'E*_p(P)]. + by move/nnG; rewrite negb_imply negbK setI_eq0 => /andP[]. +split=> //; apply/pred0Pn=> [[E /andP[/= Ep2E EpmE]]]. +have [_ abelE dimE]:= pnElemP Ep2E; have pE := abelem_pgroup abelE. +have [P sylP sEP] := Sylow_superset (subsetT E) pE. +case/pred0Pn: (nnSyl P sylP); exists E; rewrite /= 2!inE sEP abelE dimE /=. +by rewrite (subsetP (pmaxElemS p (subsetT P))) // inE EpmE inE. +Qed. + +(* This is B & G, Proposition 10.14(b). *) +Proposition beta_noncyclic_uniq p R : + p \in \beta(G) -> p.-group R -> 'r(R) > 1 -> R \in 'U. +Proof. +move=> b_p pR rRgt1; have [P sylP sRP] := Sylow_superset (subsetT R) pR. +rewrite (rank_pgroup pR) in rRgt1; have [A Ep2A] := p_rank_geP rRgt1. +have [sAR abelA dimA] := pnElemP Ep2A; have p_pr := pnElem_prime Ep2A. +case: (pickP [pred F in 'E_p(P) | A \proper F]) => [F | maxA]; last first. + have [_ nnSyl] := beta_not_narrow b_p; case/pred0Pn: (nnSyl P sylP). + exists A; rewrite /= (subsetP (pnElemS p 2 sRP)) //. + apply/pmaxElemP; split=> [|F EpF]; first by rewrite inE (subset_trans sAR). + by case/eqVproper=> [// | ltAF]; case/andP: (maxA F). +case/andP=> /pElemP[_ abelF] ltAF; have [pF cFF _] := and3P abelF. +apply: uniq_mmaxS sAR (mFT_pgroup_proper pR) _. +have rCAgt2: 'r('C(A)) > 2. + rewrite -dimA (leq_trans (properG_ltn_log pF ltAF)) // -(rank_abelem abelF). + by rewrite rankS // centsC (subset_trans (proper_sub ltAF)). +by apply: cent_rank3_Uniqueness rCAgt2; rewrite (rank_abelem abelA) dimA. +Qed. + +(* This is B & G, Proposition 10.14(c). *) +Proposition beta_subnorm_uniq p P X : + p \in \beta(G) -> p.-Sylow(G) P -> X \subset P -> 'N_P(X)%G \in 'U. +Proof. +move=> b_p sylP sXP; set Q := 'N_P(X)%G. +have pP := pHall_pgroup sylP; have pQ: p.-group Q := pgroupS (subsetIl _ _) pP. +have [| rQle1] := ltnP 1 'r(Q); first exact: beta_noncyclic_uniq pQ. +have cycQ: cyclic Q. + by rewrite (odd_pgroup_rank1_cyclic pQ) ?mFT_odd -?rank_pgroup. +have defQ: P :=: Q. + apply: (nilpotent_sub_norm (pgroup_nil pP) (subsetIl _ _)). + by rewrite setIS // char_norms // sub_cyclic_char // subsetI sXP normG. +have:= forall_inP b_p P; rewrite inE negb_imply ltnNge; move/(_ sylP). +by rewrite defQ -(rank_pgroup pQ) (leq_trans rQle1). +Qed. + +(* This is B & G, Proposition 10.14(d). *) +Proposition beta_norm_sub_mmax M Y : + M \in 'M -> \beta(M).-subgroup(M) Y -> Y :!=: 1 -> 'N(Y) \subset M. +Proof. +move=> maxM /andP[sYM bY] ntY. +have [F1 | [q q_pr q_dv_FY]] := trivgVpdiv 'F(Y). + by rewrite -(trivg_Fitting (solvableS sYM (mmax_sol maxM))) F1 eqxx in ntY. +pose X := 'O_q(Y); have qX: q.-group X := pcore_pgroup q _. +have ntX: X != 1. + apply: contraTneq q_dv_FY => X1; rewrite -p'natE // -partn_eq1 //. + rewrite -(card_Hall (nilpotent_pcore_Hall q (Fitting_nil Y))). + by rewrite /= p_core_Fitting -/X X1 cards1. +have bMq: q \in \beta(M) by apply: (pgroupP (pgroupS (Fitting_sub Y) bY)). +have b_q: q \in \beta(G) by move: bMq; rewrite -predI_sigma_beta //; case/andP. +have sXM: X \subset M := subset_trans (pcore_sub q Y) sYM. +have [P sylP sXP] := Sylow_superset sXM qX; have [sPM qP _] := and3P sylP. +have sylPG: q.-Sylow(G) P by rewrite (sigma_Sylow_G maxM) ?beta_sub_sigma. +have uniqNX: 'M('N_P(X)) = [set M]. + apply: def_uniq_mmax => //; last by rewrite subIset ?sPM. + exact: (beta_subnorm_uniq b_q). +rewrite (subset_trans (char_norms (pcore_char q Y))) //. +rewrite (sub_uniq_mmax uniqNX) ?subsetIr // mFT_norm_proper //. +by rewrite (sub_mmax_proper maxM). +Qed. + +End Ten. + + |
