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/BGsection5.v | |
Initial commit
Diffstat (limited to 'mathcomp/odd_order/BGsection5.v')
| -rw-r--r-- | mathcomp/odd_order/BGsection5.v | 536 |
1 files changed, 536 insertions, 0 deletions
diff --git a/mathcomp/odd_order/BGsection5.v b/mathcomp/odd_order/BGsection5.v new file mode 100644 index 0000000..ab5a14a --- /dev/null +++ b/mathcomp/odd_order/BGsection5.v @@ -0,0 +1,536 @@ +(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *) +Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div. +Require Import fintype finset prime fingroup morphism perm automorphism action. +Require Import quotient cyclic gfunctor pgroup gproduct center commutator. +Require Import gseries nilpotent sylow abelian maximal hall. +Require Import BGsection1 BGsection4. + +(******************************************************************************) +(* This file covers Section 5 of B & G, except for some technical results *) +(* that are not actually used in the proof of the Odd Order Theorem, namely *) +(* part (c) of Theorem 5.5, parts (b), (d) and (e) of Theorem 5.5, and all of *) +(* Theorem 5.7. We also make the following change: in B & G, narrow p-groups *) +(* of rank at least 3 are defined by the structure of the centralisers of *) +(* their prime subgroups, then characterized by their rank 2 elementary *) +(* abelian subgroups in Theorem 5.3. We exchange the two, because the latter *) +(* condition is easier to check, and is the only one used later in the proof. *) +(* *) +(* p.-narrow G == G has a maximal elementary abelian p-subgroup of *) +(* p-rank at most 2. *) +(* := ('r_p(G) > 2) ==> ('E_p^2(G) :&: 'E*_p(G) != set0) *) +(* *) +(* narrow_structure p G <-> G has a subgroup S of order p whose centraliser *) +(* is the direct product of S and a cyclic group C, *) +(* i.e., S \x C = 'C_G(S). This is the condition used *) +(* in the definition of "narrow" in B & G, p. 2. *) +(* Theorem 5.3 states that for odd p this definition *) +(* is equivalent to ours, and this property is not *) +(* used outside of Section 5. *) +(******************************************************************************) + +Set Implicit Arguments. +Unset Strict Implicit. +Unset Printing Implicit Defensive. + +Import GroupScope. + +Reserved Notation "p .-narrow" (at level 2, format "p .-narrow"). + +Section Definitions. + +Variables (gT : finGroupType) (p : nat) (A : {set gT}). + +Definition narrow := ('r_p(A) > 2) ==> ('E_p^2(A) :&: 'E*_p(A) != set0). + +Inductive narrow_structure : Prop := + NarrowStructure (S C : {group gT}) of + S \subset A & C \subset A & #|S| = p & cyclic C & S \x C = 'C_A(S). + +End Definitions. + +Notation "p .-narrow" := (narrow p) : group_scope. + +Section IsoDef. + +Variables (gT rT : finGroupType) (p : nat). +Implicit Types G H : {group gT}. +Implicit Type R : {group rT}. + +Lemma injm_narrow G H (f : {morphism G >-> rT}) : + 'injm f -> H \subset G -> p.-narrow (f @* H) = p.-narrow H. +Proof. +move=> injf sHG; rewrite /narrow injm_p_rank //; congr (_ ==> _). +apply/set0Pn/set0Pn=> [] [E /setIP[Ep2E maxE]]. + exists (invm injf @* E)%G; rewrite -[H](group_inj (morphim_invm injf _)) //. + have sEfG: E \subset f @* G. + by rewrite (subset_trans _ (morphimS _ sHG)) //; case/pnElemP: Ep2E. + by rewrite inE injm_pnElem ?injm_pmaxElem ?injm_invm ?morphimS // Ep2E. +have sEG: E \subset G by rewrite (subset_trans _ sHG) //; case/pnElemP: Ep2E. +by exists (f @* E)%G; rewrite inE injm_pnElem ?injm_pmaxElem // Ep2E. +Qed. + +Lemma isog_narrow G R : G \isog R -> p.-narrow G = p.-narrow R. +Proof. by case/isogP=> f injf <-; rewrite injm_narrow. Qed. + +(* No isomorphism theorems for narrow_structure, which is not used outside of *) +(* this file. *) + +End IsoDef. + +Section Five. + +Implicit Type gT : finGroupType. +Implicit Type p : nat. + +Section OneGroup. + +Variables (gT : finGroupType) (p : nat) (R : {group gT}). +Implicit Types B E S : {group gT}. + +Lemma narrowJ x : p.-narrow (R :^ x) = p.-narrow R. +Proof. by apply: isog_narrow (isog_symr (conj_isog R x)). Qed. + +Hypotheses (pR : p.-group R) (oddR : odd #|R|). + +Section Rank3. + +Hypothesis rR : 2 < 'r_p(R). + +(* This lemma uses only the rR hypothesis. *) +Lemma narrow_pmaxElem : p.-narrow R -> exists E, E \in 'E_p^2(R) :&: 'E*_p(R). +Proof. by move=> nnP; apply: set0Pn; apply: implyP rR. Qed. + +Let ntR : R :!=: 1. Proof. by case: eqP rR => // ->; rewrite p_rank1. Qed. +Let p_pr : prime p. Proof. by case: (pgroup_pdiv pR ntR). Qed. +Let p_gt1 : p > 1. Proof. exact: prime_gt1. Qed. + +(* This is B & G, Lemma 5.1(a). *) +Lemma rank3_SCN3 : exists B, B \in 'SCN_3(R). +Proof. +by apply/set0Pn; rewrite -(rank2_SCN3_empty pR oddR) leqNgt (rank_pgroup pR) rR. +Qed. + +(* This is B & G, Lemma 5.1(b). *) +Lemma normal_p2Elem_SCN3 E : + E \in 'E_p^2(R) -> E <| R -> exists2 B, B \in 'SCN_3(R) & E \subset B. +Proof. +move=> Ep2E /andP[sER nER]; have [_ abelE dimE] := pnElemP Ep2E. +have [B Ep3B nBR]: exists2 B, B \in 'E_p^3(R) & R \subset 'N(B). + have [C] := rank3_SCN3; case/setIdP=> SCN_C rC. + have [nsCR cCC] := andP (maxgroupp (SCN_max SCN_C)). + have [sCR _] := andP nsCR; have pC: p.-group C := pgroupS sCR pR. + have{pC cCC} abelC1: p.-abelem 'Ohm_1(C) := Ohm1_abelem pC cCC. + have dimC1: 3 <= logn p #|'Ohm_1(C)| by rewrite -rank_abelem // rank_Ohm1. + have nsC1R: 'Ohm_1(C) <| R := char_normal_trans (Ohm_char 1 _) nsCR. + have [B [sBC1 nsBR oB]] := normal_pgroup pR nsC1R dimC1. + have [sBR nBR] := andP nsBR; exists B => //; apply/pnElemP. + by rewrite oB pfactorK // (abelemS sBC1). +have [sBR abelB dimB] := pnElemP Ep3B; have [pB cBB _] := and3P abelB. +have [oB oE] := (card_pnElem Ep3B, card_pnElem Ep2E). +pose Bs := (E <*> 'C_B(E))%G; have sCB: 'C_B(E) \subset B := subsetIl B _. +have sBsR: Bs \subset R by rewrite join_subG sER subIset ?sBR. +suffices Bs_gt2: 2 < logn p #|Bs|. + have nBsR: Bs <| R by rewrite /normal sBsR // normsY ?normsI ?norms_cent. + have abelBs: p.-abelem Bs. + by rewrite (cprod_abelem p (cprodEY _)) ?subsetIr // abelE (abelemS sCB). + have [C maxC sBsC] : {H | [max H | H <| R & abelian H ] & Bs \subset H}. + by apply: maxgroup_exists; rewrite nBsR (abelem_abelian abelBs). + exists C; last by rewrite (subset_trans _ sBsC) ?joing_subl. + by rewrite inE (max_SCN pR) ?(leq_trans Bs_gt2) // -rank_abelem ?rankS. +apply: contraFT (ltnn 2); rewrite -leqNgt => Bs_le2. +have{Bs_le2} sCE: 'C_B(E) \subset E. + rewrite (sameP joing_idPl eqP) eq_sym eqEcard joing_subl /=. + by rewrite (card_pgroup (pgroupS sBsR pR)) oE leq_exp2l. +have dimCBE: 2 <= logn p #|'C_B(E)|. + rewrite -ltnS -dimB -addn1 -leq_subLR -logn_div ?divgS ?cardSg //. + by rewrite logn_quotient_cent_abelem ?dimE ?(subset_trans sBR nER). +have defE: 'C_B(E) = E. + apply/eqP; rewrite eqEcard sCE oE /=. + by rewrite (card_pgroup (pgroupS sCB pB)) leq_exp2l. +by rewrite -dimB -dimE -defE lognSg // subsetIidl sub_abelian_cent // -defE. +Qed. + +Let Z := 'Ohm_1('Z(R)). +Let W := 'Ohm_1('Z_2(R)). +Let T := 'C_R(W). + +Let ntZ : Z != 1. +Proof. by rewrite Ohm1_eq1 (center_nil_eq1 (pgroup_nil pR)). Qed. + +Let sZR : Z \subset R. +Proof. exact: subset_trans (Ohm_sub 1 _) (center_sub R). Qed. + +Let abelZ : p.-abelem (Z). +Proof. by rewrite (Ohm1_abelem (pgroupS _ pR)) ?center_sub ?center_abelian. Qed. + +Let pZ : p.-group Z. +Proof. exact: abelem_pgroup abelZ. Qed. + +Let defCRZ : 'C_R(Z) = R. +Proof. +apply/eqP; rewrite eqEsubset subsetIl subsetIidl centsC. +by rewrite (subset_trans (Ohm_sub 1 _)) ?subsetIr. +Qed. + +Let sWR : W \subset R. +Proof. exact: subset_trans (Ohm_sub 1 _) (ucn_sub 2 R). Qed. + +Let nWR : R \subset 'N(W). +Proof. exact: char_norm_trans (Ohm_char 1 _) (char_norm (ucn_char 2 R)). Qed. + +(* This is B & G, Lemma 5.2. *) +Lemma Ohm1_ucn_p2maxElem E : + E \in 'E_p^2(R) :&: 'E*_p(R) -> + [/\ (*a*) ~~ (E \subset T), + (*b*) #|Z| = p /\ [group of W] \in 'E_p^2(R) + & (*c*) T \char R /\ #|R : T| = p ]. +Proof. +case/setIP=> Ep2E maxE; have defCRE1 := Ohm1_cent_max maxE pR. +have [[sER abelE dimE] oE] := (pnElemP Ep2E, card_pnElem Ep2E). +have [[sZR_R nZR_R] [pE _ eE]] := (andP (center_normal R), and3P abelE). +have{nZR_R} nZR: R \subset 'N(Z) := char_norm_trans (Ohm_char 1 _) nZR_R. +have{sZR_R} [pZR pW] := (pgroupS sZR_R pR, pgroupS sWR pR). +have sZE: Z \subset E by rewrite -defCRE1 OhmS ?setIS // centS. +have rCRE : 'r_p('C_R(E)) = 2 by rewrite -p_rank_Ohm1 defCRE1 p_rank_abelem. +have oZ: #|Z| = p. + apply/prime_nt_dvdP; rewrite -?trivg_card1 // (card_pgroup pZ) /= -/Z. + rewrite (@dvdn_exp2l _ _ 1) // -ltnS -dimE properG_ltn_log //= -/Z. + by case/eqVproper: sZE rR => // defZ; rewrite -defCRZ defZ rCRE ltnn. +have ncycR: ~~ cyclic R by rewrite (odd_pgroup_rank1_cyclic pR) // -(subnKC rR). +have [ncycW eW] := Ohm1_odd_ucn2 pR oddR ncycR; rewrite -/W in ncycW eW. +have sWRZ: [~: W, R] \subset Z. + rewrite [Z](OhmE 1 pZR) sub_gen //= -ucn1 subsetI. + rewrite (subset_trans _ (ucn_comm 1 _)) ?commSg ?Ohm_sub //. + by move: nWR eW; rewrite -commg_subl -sub_LdivT; apply: subset_trans. +have sZW: Z \subset W by rewrite OhmS /= -?ucn1 ?ucn_subS //. +have ltZW: Z \proper W. + by rewrite properEneq; case: eqP ncycW => // <-; rewrite prime_cyclic ?oZ. +have sWRE := subset_trans sWRZ sZE. +have nEW: W \subset 'N(E) by rewrite -commg_subr (subset_trans _ sWRE) ?commgSS. +have defZ: 'C_W(E) = Z. + have sCE: 'C_W(E) \subset E. + rewrite -{2}defCRE1 (OhmE 1 (pgroupS (subsetIl R _) pR)) sub_gen //. + by rewrite subsetI setSI // subIset // sub_LdivT eW. + have [defC | ltCE] := eqVproper sCE. + have sEW: E \subset W by rewrite -defC subsetIl. + have nsER: E <| R. + by rewrite /normal sER -commg_subl (subset_trans (commSg R sEW)). + have [B scn3B sEB] := normal_p2Elem_SCN3 Ep2E nsER. + have [scnB dimB] := setIdP scn3B; have [_ scBR] := SCN_P scnB. + rewrite ltnNge -rank_Ohm1 -dimE -rank_abelem ?rankS // in dimB. + by rewrite -scBR -defCRE1 OhmS // setIS ?centS. + apply/eqP; rewrite eq_sym eqEcard oZ (card_pgroup (pgroupS sCE pE)) /= -/W. + rewrite subsetI sZW (centsS sER); last by rewrite centsC -subsetIidl defCRZ. + by rewrite (leq_exp2l _ 1) // -ltnS -dimE properG_ltn_log. +have dimW: logn p #|W| = 2. + apply/eqP; rewrite -(Lagrange sZW) lognM ?cardG_gt0 // oZ (pfactorK 1) //=. + rewrite -/Z eqSS eqn_leq -{1}defZ logn_quotient_cent_abelem ?dimE // -/W. + by rewrite -divgS // logn_div ?cardSg // subn_gt0 properG_ltn_log. +have abelW: p.-abelem W. + by rewrite (abelem_Ohm1 (pgroupS _ pR)) ?(p2group_abelian pW) ?dimW ?ucn_sub. +have charT: T \char R. + by rewrite subcent_char ?char_refl //= (char_trans (Ohm_char 1 _)) ?ucn_char. +rewrite 2!inE sWR abelW dimW; do 2?split => //. + by apply: contra (proper_subn ltZW); rewrite -defZ !subsetI subxx sER centsC. +apply/prime_nt_dvdP=> //. + rewrite indexg_eq1 subsetIidl centsC; apply: contraFN (ltnn 1) => cRW. + by rewrite -dimW -(setIidPl (centsS sER cRW)) defZ oZ (pfactorK 1). +rewrite -(part_pnat_id (pnat_dvd (dvdn_indexg _ _) pR)) p_part. +by rewrite (@dvdn_exp2l p _ 1) ?logn_quotient_cent_abelem ?dimW. +Qed. + +(* This is B & G, Theorem 5.3(d); we omit parts (a)-(c) as they are mostly *) +(* redundant with Lemma 5.2, given our definition of "narrow". *) +Theorem narrow_cent_dprod S : + p.-narrow R -> #|S| = p -> S \subset R -> 'r_p('C_R(S)) <= 2 -> + [/\ cyclic 'C_T(S), S :&: R^`(1) = 1, S :&: T = 1 & S \x 'C_T(S) = 'C_R(S)]. +Proof. +move=> nnR oS sSR rS; have pS : p.-group S := pgroupS sSR pR. +have [E maxEp2E] := narrow_pmaxElem nnR; have [Ep2E maxE] := setIP maxEp2E. +have [not_sET [oZ Ep2W] [charT maxT]] := Ohm1_ucn_p2maxElem maxEp2E. +have cZS : S \subset 'C(Z) by rewrite (subset_trans sSR) // -defCRZ subsetIr. +have nZS : S \subset 'N(Z) by rewrite cents_norm. +have cSS : abelian S by rewrite cyclic_abelian ?prime_cyclic // oS. +pose SZ := (S <*> [group of Z])%G; have sSSZ: S \subset SZ := joing_subl _ _. +have sSZ_R: SZ \subset R by rewrite join_subG sSR sZR. +have abelSZ : p.-abelem SZ. + by rewrite /= joingC (cprod_abelem p (cprodEY cZS)) abelZ prime_abelem. +have tiSZ: S :&: Z = 1. + rewrite prime_TIg ?oS //= -/Z; apply: contraL rR => sZS. + by rewrite -leqNgt (leq_trans _ rS) ?p_rankS // -{1}defCRZ setIS ?centS. +have{tiSZ} oSZ: #|SZ| = (p ^ 2)%N by rewrite /= norm_joinEl ?TI_cardMg ?oS ?oZ. +have Ep2SZ: SZ \in 'E_p^2(R) by rewrite pnElemE // !inE sSZ_R abelSZ oSZ eqxx. +have{oSZ Ep2SZ abelSZ sSZ_R} maxSZ: SZ \in 'E_p^2(R) :&: 'E*_p(R). + rewrite inE Ep2SZ; apply/pmaxElemP; rewrite inE sSZ_R abelSZ. + split=> // H /setIdP[sHR abelH] sSZH. + have [[_ _ dimSZ] [cHH pH _]] := (pnElemP Ep2SZ, and3P abelH). + have sSH: S \subset H := subset_trans sSSZ sSZH. + have{sSH} sH_CRS: H \subset 'C_R(S) by rewrite subsetI sHR (centsS sSH). + have{sH_CRS}: 'r_p(H) <= 2 by rewrite (leq_trans _ rS) ?p_rankS. + apply: contraTeq; rewrite eq_sym eqEproper sSZH negbK => lSZH. + by rewrite -ltnNge p_rank_abelem // -dimSZ properG_ltn_log. +have sZT: Z \subset T. + by rewrite subsetI sZR (centsS sWR) // centsC -defCRZ subsetIr. +have{SZ sSSZ maxSZ} not_sST: ~~ (S \subset T). + have: ~~ (SZ \subset T) by case/Ohm1_ucn_p2maxElem: maxSZ. + by rewrite join_subG sZT andbT. +have tiST: S :&: T :=: 1 by rewrite prime_TIg ?oS. +have defST: S * T = R. + apply/eqP; rewrite eqEcard TI_cardMg ?mul_subG ?subsetIl //=. + by rewrite mulnC oS -maxT Lagrange ?subsetIl. +have cRRb: abelian (R / T) by rewrite -defST quotientMidr quotient_abelian. +have sR'T: R^`(1) \subset T by rewrite der1_min ?char_norm. +have TI_SR': S :&: R^`(1) :=: 1. + by rewrite prime_TIg ?oS // (contra _ not_sST) //; move/subset_trans->. +have defCRS : S \x 'C_T(S) = 'C_R(S). + rewrite (dprodE _ _) ?subsetIr //= -/T; last by rewrite setIA tiST setI1g. + rewrite -{1}(center_idP cSS) subcent_TImulg ?defST //. + by rewrite subsetI normG (subset_trans sSR) ?char_norm. +have sCTSR: 'C_T(S) \subset R by rewrite subIset ?subsetIl. +split; rewrite ?(odd_pgroup_rank1_cyclic (pgroupS _ pR) (oddSg _ oddR)) //= -/T. +rewrite -ltnS (leq_trans _ rS) //= -(p_rank_dprod p defCRS) -add1n leq_add2r. +by rewrite -rank_pgroup // rank_gt0 -cardG_gt1 oS. +Qed. + +(* This is B & G, Corollary 5.4. Given our definition of narrow, this is used *) +(* directly in the proof of the main part of Theorem 5.3. *) +Corollary narrow_centP : + reflect (exists S, [/\ gval S \subset R, #|S| = p & 'r_p('C_R(S)) <= 2]) + (p.-narrow R). +Proof. +rewrite /narrow rR; apply: (iffP (set0Pn _)) => [[E maxEp2E]|[S [sSR oS rCRS]]]. + have [Ep2E maxE] := setIP maxEp2E. + have{maxEp2E} [_ [oZ _] _] := Ohm1_ucn_p2maxElem maxEp2E. + have [sER abelE dimE] := pnElemP Ep2E; have oE := card_pnElem Ep2E. + have sZE: Z \subset E by rewrite -(Ohm1_cent_max maxE pR) OhmS ?setIS ?centS. + have [S defE] := abelem_split_dprod abelE sZE; exists S. + have{defE} [[_ defZS _ _] oZS] := (dprodP defE, dprod_card defE). + split; first by rewrite (subset_trans _ sER) // -defZS mulG_subr. + by apply/eqP; rewrite -(eqn_pmul2l (ltnW p_gt1)) -{1}oZ oZS oE. + rewrite -dimE -p_rank_abelem // -(Ohm1_cent_max maxE pR) p_rank_Ohm1. + by rewrite -defZS /= centM setIA defCRZ. +have abelS := prime_abelem p_pr oS. +have cSZ: Z \subset 'C(S) by rewrite (centsS sSR) // centsC -defCRZ subsetIr. +have sSZR: S <*> Z \subset R by rewrite join_subG sSR. +have defSZ: S \x Z = S <*> Z. + rewrite dprodEY ?prime_TIg ?oS //= -/Z; apply: contraL rR => sSZ. + by rewrite -leqNgt (leq_trans _ rCRS) ?p_rankS // -{1}defCRZ setIS ?centS. +have abelSZ: p.-abelem (S <*> Z) by rewrite (dprod_abelem p defSZ) abelS. +have [pSZ cSZSZ _] := and3P abelSZ. +have dimSZ: logn p #|S <*> Z| = 2. + apply/eqP; rewrite -p_rank_abelem // eqn_leq (leq_trans (p_rankS _ _) rCRS). + rewrite -(p_rank_dprod p defSZ) p_rank_abelem // oS (pfactorK 1) // ltnS. + by rewrite -rank_pgroup // rank_gt0. + by rewrite subsetI sSZR sub_abelian_cent ?joing_subl. +exists [group of S <*> Z]; rewrite 3!inE sSZR abelSZ dimSZ /=. +apply/pmaxElemP; rewrite inE sSZR; split=> // E; case/pElemP=> sER abelE sSZE. +apply: contraTeq rCRS; rewrite eq_sym -ltnNge -dimSZ => neqSZE. +have [[pE cEE _] sSE] := (and3P abelE, subset_trans (joing_subl S Z) sSZE). +rewrite (leq_trans (properG_ltn_log pE _)) ?properEneq ?neqSZE //. +by rewrite -p_rank_abelem ?p_rankS // subsetI sER sub_abelian_cent. +Qed. + +(* This is the main statement of B & G, Theorem 5.3, stating the equivalence *) +(* of the structural and rank characterizations of the "narrow" property. Due *) +(* to our definition of "narrow", the equivalence is the converse of that in *) +(* B & G (we define narrow in terms of maximal elementary abelian subgroups). *) +Lemma narrow_structureP : reflect (narrow_structure p R) (p.-narrow R). +Proof. +apply: (iffP idP) => [nnR | [S C sSR sCR oS cycC defSC]]. + have [S [sSR oS rCRS]] := narrow_centP nnR. + have [cycC _ _ defCRS] := narrow_cent_dprod nnR oS sSR rCRS. + by exists S [group of 'C_T(S)]; rewrite //= -setIA subsetIl. +apply/narrow_centP; exists S; split=> //. +have cycS: cyclic S by rewrite prime_cyclic ?oS. +rewrite -(p_rank_dprod p defSC) -!(rank_pgroup (pgroupS _ pR)) // -addn1. +rewrite leq_add -?abelian_rank1_cyclic ?cyclic_abelian //. +Qed. + +End Rank3. + +(* This is B & G, Theoren 5.5 (a) and (b). Part (c), which is not used in the *) +(* proof of the Odd Order Theorem, is omitted. *) +Theorem Aut_narrow (A : {group {perm gT}}) : + p.-narrow R -> solvable A -> A \subset Aut R -> odd #|A| -> + [/\ (*a*) p^'.-group (A / 'O_p(A)), abelian (A / 'O_p(A)) + & (*b*) 2 < 'r(R) -> forall x, x \in A -> p^'.-elt x -> #[x] %| p.-1]. +Proof. +move=> nnR solA AutA oddA; have nilR := pgroup_nil pR. +have [rR | rR] := leqP 'r(R) 2. + have pA' := der1_Aut_rank2_pgroup pR oddR rR AutA solA oddA. + have sA'Ap: A^`(1) \subset 'O_p(A) by rewrite pcore_max ?der_normal. + have cAbAb: abelian (A / 'O_p(A)) by rewrite sub_der1_abelian. + split; rewrite // -(nilpotent_pcoreC p (abelian_nil cAbAb)). + by rewrite trivg_pcore_quotient dprod1g pcore_pgroup. +have ntR: R :!=: 1 by rewrite -rank_gt0 2?ltnW. +rewrite (rank_pgroup pR) in rR. +have [H [charH sHRZ] _ eH pCH] := critical_odd pR oddR ntR. +have{ntR} [[p_pr _ _] sHR] := (pgroup_pdiv pR ntR, char_sub charH). +have ntH: H :!=: 1 by rewrite trivg_exponent eH -prime_coprime ?coprimen1. +have{nnR} [S C sSR sCR oS cycC defSC] := narrow_structureP rR nnR. +have [_ mulSC cSC tiSC] := dprodP defSC. +have abelS: p.-abelem S := prime_abelem p_pr oS; have [pS cSS _] := and3P abelS. +have cycS: cyclic S by rewrite prime_cyclic ?oS. +have tiHS: H :&: S = 1. + have rCRS: 'r_p('C_R(S)) <= 2. + rewrite -(p_rank_dprod p defSC) -addn1 -!rank_pgroup ?(pgroupS _ pR) //. + by rewrite leq_add -?abelian_rank1_cyclic ?cyclic_abelian. + rewrite setIC prime_TIg ?oS //; apply: contraL (rCRS) => sSH; rewrite -ltnNge. + have cZHS: S \subset 'C('Z(H)) by rewrite centsC (centsS sSH) ?subsetIr. + pose U := S <*> 'Z(H). + have sUH: U \subset H by rewrite join_subG sSH subsetIl. + have cUU: abelian U by rewrite abelianY cSS center_abelian centsC. + have abelU: p.-abelem U by rewrite abelemE // cUU -eH exponentS. + have sUR: U \subset R := subset_trans sUH sHR. + have rU: 'r_p(U) <= 'r_p('C_R(S)). + by rewrite p_rankS //= subsetI sUR (centsS (joing_subl S 'Z(H))). + have nsUR: U <| R. + rewrite /normal sUR -commg_subl (subset_trans (commSg _ sUH)) //= -/U. + by rewrite (subset_trans sHRZ) // joing_subr. + have{rU}:= leq_trans rU rCRS; rewrite leq_eqVlt => /predU1P[] rU. + have Ep2U: [group of U] \in 'E_p^2(R). + by rewrite !inE /= sUR abelU -(p_rank_abelem abelU) rU. + have [F scn3F sUF] := normal_p2Elem_SCN3 rR Ep2U nsUR. + have [scnF rF] := setIdP scn3F; have [_ scF] := SCN_P scnF. + rewrite (leq_trans rF) // -scF -rank_pgroup ?(pgroupS (subsetIl _ _)) //. + by rewrite rankS ?setIS ?centS // (subset_trans _ sUF) ?joing_subl. + have defU: S :=: U. + apply/eqP; rewrite eqEcard oS joing_subl (card_pgroup (pgroupS sUR pR)). + by rewrite -p_rank_abelem // (leq_exp2l _ 1) // prime_gt1. + have ntS: S :!=: 1 by rewrite -cardG_gt1 oS prime_gt1. + have sSZ: S \subset 'Z(R) by rewrite prime_meetG ?oS ?meet_center_nil // defU. + by rewrite (setIidPl _) // centsC (subset_trans sSZ) ?subsetIr. +have{tiHS eH} oCHS: #|'C_H(S)| = p. + have ntCHS: 'C_H(S) != 1. + have: H :&: 'Z(R) != 1 by rewrite meet_center_nil ?char_normal. + by apply: subG1_contra; rewrite setIS // (centsS sSR) ?subsetIr. + have cycCHS: cyclic 'C_H(S). + have tiS_CHS: S :&: 'C_H(S) = 1 by rewrite setICA setIA tiHS setI1g. + rewrite (isog_cyclic (quotient_isog _ tiS_CHS)) ?subIset ?cent_sub ?orbT //. + rewrite (cyclicS _ (quotient_cyclic S cycC)) //= -(quotientMidl S C). + by rewrite mulSC quotientS // setSI // char_sub. + have abelCHS: p.-abelem 'C_H(S). + by rewrite abelemE ?cyclic_abelian // -eH exponentS ?subsetIl. + rewrite -(Ohm1_id abelCHS). + by rewrite (Ohm1_cyclic_pgroup_prime _ (abelem_pgroup abelCHS)). +pose B := A^`(1) <*> [set a ^+ p.-1 | a in A]. +have sBA: B \subset A. + rewrite join_subG (der_sub 1 A) /=. + by apply/subsetP=> _ /imsetP[a Aa ->]; rewrite groupX. +have AutB: B \subset Aut R := subset_trans sBA AutA. +suffices pB (X : {group {perm gT}}): X \subset B -> p^'.-group X -> X :=: 1. + have cAbAb: abelian (A / 'O_p(A)). + rewrite sub_der1_abelian // pcore_max ?der_normal //. + apply/pgroupP=> q q_pr; apply: contraLR => p'q; rewrite -p'natE //. + have [X sylX] := Sylow_exists q A^`(1); have [sXA' qX _] := and3P sylX. + rewrite -partn_eq1 ?cardG_gt0 // -(card_Hall sylX). + by rewrite (pB X) ?cards1 ?(pi_pgroup qX) ?(subset_trans sXA') ?joing_subl. + rewrite cAbAb -(nilpotent_pcoreC p (abelian_nil cAbAb)) trivg_pcore_quotient. + rewrite dprod1g pcore_pgroup; split=> //_ a Aa p'a. + rewrite order_dvdn -cycle_eq1 [<[_]>]pB ?(pgroupS (cycleX _ _) p'a) //. + by rewrite genS // sub1set inE orbC (mem_imset (expgn^~ _)). +move=> sXB p'X; have AutX := subset_trans sXB AutB. +pose toX := ([Aut R] \ AutX)%gact; pose CX := 'C_(H | toX)(X). +suffices sHCX: H \subset CX. + rewrite -(setIid X) coprime_TIg ?(pnat_coprime (pgroupS _ pCH)) //. + by rewrite subsetIidl gacent_ract setIid gacentC in sHCX. +elim: _.+1 {1 2 4 6}H (charH) (subxx H) (ltnSn #|H|) => // n IHn L charL sLH. +rewrite ltnS => leLn; have sLR := char_sub charL; pose K := [~: L, R]. +wlog ntL: / L :!=: 1 by case: eqP => [-> | _ -> //]; rewrite sub1G. +have charK: K \char R by rewrite charR ?char_refl. +have ltKL: K \proper L. + have nLR: R \subset 'N_R(L) by rewrite subsetIidl char_norm. + exact: nil_comm_properl nilR sLR ntL nLR. +have [sKL sKR] := (proper_sub ltKL, char_sub charK). +have [sKH pK] := (subset_trans sKL sLH, pgroupS sKR pR : p.-group K). +have nsKH: K <| H := normalS sKH sHR (char_normal charK). +have sKCX: K \subset CX by rewrite IHn ?(leq_trans (proper_card ltKL)) ?leLn. +have pL := pgroupS sLR pR; have nKL: L \subset 'N(K) := commg_norml _ _. +have{pS cSS} oLb: #|L / K| = p. + have [v defS] := cyclicP cycS; rewrite defS cycle_subG in sSR. + have ntLb: L / K != 1 by rewrite -subG1 quotient_sub1 ?proper_subn. + have [_ p_dv_Lb _] := pgroup_pdiv (quotient_pgroup _ pL) ntLb. + apply/eqP; rewrite eqn_leq {p_dv_Lb}(dvdn_leq _ p_dv_Lb) // andbT. + rewrite -divg_normal ?(normalS sKL sLH nsKH) // leq_divLR ?cardSg //= -/K. + rewrite -(card_lcoset K v) -(LagrangeI L 'C(S)) -indexgI /= -oCHS /K commGC. + rewrite {2}defS cent_cycle index_cent1 leq_mul ?subset_leq_card ?setSI //. + by apply/subsetP=> vx; case/imsetP=> x Lx ->; rewrite mem_lcoset mem_commg. +have cycLb: cyclic (L / K) by rewrite prime_cyclic ?oLb. +rewrite -(quotientSGK _ sKCX) // quotientGI // subsetI quotientS //= -/K. +have actsXK: [acts X, on K | toX] by rewrite acts_ract subxx acts_char. +rewrite ext_coprime_quotient_cent ?(pnat_coprime pK p'X) ?(pgroup_sol pK) //. +have actsAL : {acts A, on group L | [Aut R]} by exact: gacts_char. +have sAD: A \subset qact_dom <[actsAL]> [~: L, R]. + by rewrite qact_domE // acts_actby subxx (setIidPr sKL) acts_char. +suffices cLbX: X \subset 'C(L / K | <[actsAL]> / _). + rewrite gacentE ?qact_domE // subsetI quotientS //=. + apply/subsetP=> Ku LbKu; rewrite inE; apply/subsetP=> x Xx; rewrite inE. + have [Dx cLx] := setIdP (subsetP cLbX x Xx); have [Ax _] := setIdP Dx. + rewrite inE in cLx; have:= subsetP cLx Ku LbKu; rewrite inE /=. + have [u Nu Lu ->] := morphimP LbKu. + by rewrite !{1}qactE // ?actbyE // qact_domE ?(subsetP actsXK). +rewrite (subset_trans sXB) // astab_range -ker_actperm gen_subG. +rewrite -sub_morphim_pre; last by rewrite -gen_subG ?(subset_trans sBA). +rewrite morphimU subUset morphim_der // (sameP trivgP derG1P). +rewrite (abelianS _ (Aut_cyclic_abelian cycLb)); last first. + exact: subset_trans (morphim_sub _ _) (im_actperm_Aut _). +apply/subsetP=> _ /morphimP[_ _ /imsetP[x Ax ->] ->]. +have Dx := subsetP sAD x Ax; rewrite inE morphX //= -order_dvdn. +apply: dvdn_trans (order_dvdG (actperm_Aut _ Dx)) _. +by rewrite card_Aut_cyclic // oLb (@totient_pfactor p 1) ?muln1. +Qed. + +End OneGroup. + +(* This is B & G, Theorem 5.6, parts (a) and (c). We do not prove parts (b), *) +(* (d) and (e), as they are not used in the proof of the Odd Order Theorem. *) +Theorem narrow_der1_complement_max_pdiv gT p (G S : {group gT}) : + odd #|G| -> solvable G -> p.-Sylow(G) S -> p.-narrow S -> + (2 < 'r(S)) ==> p.-length_1 G -> + [/\ (*a*) p^'.-Hall(G^`(1)) 'O_p^'(G^`(1)) + & (*c*) forall q, q \in \pi(G / 'O_p^'(G)) -> q <= p]. +Proof. +move=> oddG solG sylS nnS; case: (leqP 'r(S) 2) => /= rS pl1G. + have rG: 'r_p(G) <= 2 by rewrite -(rank_Sylow sylS). + split=> [|q]; first by have [-> _ _] := rank2_der1_complement solG oddG rG. + exact: rank2_max_pdiv solG oddG rG. +rewrite /pHall pcore_sub pcore_pgroup pnatNK /=. +rewrite -(pcore_setI_normal p^' (der_normal 1 G)) // setIC indexgI /=. +wlog Gp'1: gT G S oddG nnS solG sylS rS pl1G / 'O_p^'(G) = 1. + set K := 'O_p^'(G); have [_ nKG] := andP (pcore_normal _ G : K <| G). + move/(_ _ (G / K) (S / K))%G; rewrite quotient_sol ?quotient_odd //. + have [[sSG pS _] p'K] := (and3P sylS, pcore_pgroup _ G : p^'.-group K). + have [nKS nKG'] := (subset_trans sSG nKG, subset_trans (der_sub 1 G) nKG). + have tiKS: K :&: S = 1 := coprime_TIg (p'nat_coprime p'K pS). + have isoS := isog_symr (quotient_isog nKS tiKS). + rewrite (isog_narrow p isoS) {isoS}(isog_rank isoS) quotient_pHall //. + rewrite plength1_quo // trivg_pcore_quotient indexg1 /= -quotient_der //. + by rewrite card_quotient //= -/K -(card_isog (quotient1_isog _)); exact. +rewrite Gp'1 indexg1 -(card_isog (quotient1_isog _)) -pgroupE. +have [sSG pS _] := and3P sylS; have oddS: odd #|S| := oddSg sSG oddG. +have ntS: S :!=: 1 by rewrite -rank_gt0 (leq_trans _ rS). +have [p_pr _ _] := pgroup_pdiv pS ntS; have p_gt1 := prime_gt1 p_pr. +have{pl1G} defS: 'O_p(G) = S. + by rewrite (eq_Hall_pcore _ sylS) -?plength1_pcore_Sylow. +have nSG: G \subset 'N(S) by rewrite -defS gFnorm. +pose fA := restrm nSG (conj_aut S); pose A := fA @* G. +have AutA: A \subset Aut S by rewrite [A]im_restrm Aut_conj_aut. +have [solA oddA]: solvable A /\ odd #|A| by rewrite morphim_sol ?morphim_odd. +have [/= _ cAbAb p'A_dv_p1] := Aut_narrow pS oddS nnS solA AutA oddA. +have{defS} pKfA: p.-group ('ker fA). + rewrite (pgroupS _ pS) //= ker_restrm ker_conj_aut. + by rewrite -defS -Fitting_eq_pcore ?cent_sub_Fitting. +split=> [|q]. + rewrite -(pmorphim_pgroup pKfA) ?der_sub // morphim_der //. + by rewrite (pgroupS (der1_min (char_norm _) cAbAb)) ?pcore_pgroup ?pcore_char. +rewrite mem_primes; case/and3P=> q_pr _; case/Cauchy=> // x Gx ox. +rewrite leq_eqVlt -implyNb; apply/implyP=> p'q; rewrite -(ltn_predK p_gt1) ltnS. +have ofAx: #[fA x] = q. + apply/prime_nt_dvdP=> //; last by rewrite -ox morph_order. + rewrite order_eq1; apply: contraNneq p'q => fAx1. + by apply: (pgroupP pKfA); rewrite // -ox order_dvdG //; exact/kerP. +have p'fAx: p^'.-elt (fA x) by rewrite /p_elt ofAx pnatE. +by rewrite -ofAx dvdn_leq ?p'A_dv_p1 ?mem_morphim // -(subnKC p_gt1). +Qed. + +End Five. |
