aboutsummaryrefslogtreecommitdiff
path: root/mathcomp/odd_order/BGsection5.v
diff options
context:
space:
mode:
authorEnrico Tassi2018-04-17 16:57:13 +0200
committerEnrico Tassi2018-04-17 16:57:13 +0200
commiteaa90cf9520e43d0b05fc6431a479e6b9559ef0e (patch)
tree8499953a468a8d8be510dd0d60232cbd8984c1ec /mathcomp/odd_order/BGsection5.v
parentc1ec9cd8e7e50f73159613c492aad4c6c40bc3aa (diff)
move odd_order to its own repository
Diffstat (limited to 'mathcomp/odd_order/BGsection5.v')
-rw-r--r--mathcomp/odd_order/BGsection5.v534
1 files changed, 0 insertions, 534 deletions
diff --git a/mathcomp/odd_order/BGsection5.v b/mathcomp/odd_order/BGsection5.v
deleted file mode 100644
index 9769c86..0000000
--- a/mathcomp/odd_order/BGsection5.v
+++ /dev/null
@@ -1,534 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq div.
-From mathcomp
-Require Import fintype finset prime fingroup morphism perm automorphism action.
-From mathcomp
-Require Import quotient cyclic gfunctor pgroup gproduct center commutator.
-From mathcomp
-Require Import gseries nilpotent sylow abelian maximal hall.
-From mathcomp
-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 := gFnormal_trans _ 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. by rewrite !gFsub_trans. 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. by apply/setIidPl; rewrite centsC gFsub_trans ?subsetIr. Qed.
-
-Let sWR : W \subset R. Proof. exact/gFsub_trans/gFsub. Qed.
-Let nWR : R \subset 'N(W). Proof. exact/gFnorm_trans/gFnorm. 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) := gFnorm_trans _ 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 ?gFchar_trans.
-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) // => /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 apply: 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 _)); apply.
-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 _ cAbAb)) ?pcore_pgroup ?gFnorm.
-rewrite mem_primes => /and3P[q_pr _ /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 //; apply/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.