aboutsummaryrefslogtreecommitdiff
path: root/mathcomp/odd_order/BGappendixAB.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/BGappendixAB.v
parentc1ec9cd8e7e50f73159613c492aad4c6c40bc3aa (diff)
move odd_order to its own repository
Diffstat (limited to 'mathcomp/odd_order/BGappendixAB.v')
-rw-r--r--mathcomp/odd_order/BGappendixAB.v516
1 files changed, 0 insertions, 516 deletions
diff --git a/mathcomp/odd_order/BGappendixAB.v b/mathcomp/odd_order/BGappendixAB.v
deleted file mode 100644
index eb708a6..0000000
--- a/mathcomp/odd_order/BGappendixAB.v
+++ /dev/null
@@ -1,516 +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 bigop prime finset ssralg fingroup morphism.
-From mathcomp
-Require Import automorphism quotient gfunctor commutator zmodp center pgroup.
-From mathcomp
-Require Import sylow gseries nilpotent abelian maximal.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation mxabelem.
-From mathcomp
-Require Import BGsection1 BGsection2.
-
-(******************************************************************************)
-(* This file contains the useful material in B & G, appendices A and B, i.e., *)
-(* the proof of the p-stability properties and the ZL-Theorem (the Puig *)
-(* replacement for the Glaubermann ZJ-theorem). The relevant definitions are *)
-(* given in BGsection1. *)
-(* Theorem A.4(a) has not been formalised: it is a result on external *)
-(* p-stability, which concerns faithful representations of group with a *)
-(* trivial p-core on a field of characteristic p. It's the historical concept *)
-(* that was studied by Hall and Higman, but it's not used for FT. Note that *)
-(* the finite field case can be recovered from A.4(c) with a semi-direct *)
-(* product. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Local Open Scope ring_scope.
-Import GroupScope GRing.Theory.
-
-Section AppendixA.
-
-Implicit Type gT : finGroupType.
-Implicit Type p : nat.
-
-Import MatrixGenField.
-
-(* This is B & G, Theorem A.4(c) (in Appendix A, not section 16!). We follow *)
-(* both B & G and Gorenstein in using the general form of the p-stable *)
-(* property. We could simplify the property because the conditions under *)
-(* which we prove p-stability are inherited by sections (morphic image in our *)
-(* framework), and restrict to the case where P is normal in G. (Clearly the *)
-(* 'O_p^'(G) * P <| G premise plays no part in the proof.) *)
-(* Theorems A.1-A.3 are essentially inlined in this proof. *)
-
-Theorem odd_p_stable gT p (G : {group gT}) : odd #|G| -> p.-stable G.
-Proof.
-move: gT G.
-pose p_xp gT (E : {group gT}) x := p.-elt x && (x \in 'C([~: E, [set x]])).
-suffices IH gT (E : {group gT}) x y (G := <<[set x; y]>>) :
- [&& odd #|G|, p.-group E & G \subset 'N(E)] -> p_xp gT E x && p_xp gT E y ->
- p.-group (G / 'C(E)).
-- move=> gT G oddG P A pP /andP[/mulGsubP[_ sPG] _] /andP[sANG pA] cRA.
- apply/subsetP=> _ /morphimP[x Nx Ax ->]; have NGx := subsetP sANG x Ax.
- apply: Baer_Suzuki => [|_ /morphimP[y Ny NGy ->]]; first exact: mem_quotient.
- rewrite -morphJ // -!morphim_set1 -?[<<_>>]morphimY ?sub1set ?groupJ //.
- set G1 := _ <*> _; rewrite /pgroup -(card_isog (second_isog _)); last first.
- by rewrite join_subG !sub1set Nx groupJ.
- have{Nx NGx Ny NGy} [[Gx Nx] [Gy Ny]] := (setIP NGx, setIP NGy).
- have sG1G: G1 \subset G by rewrite join_subG !sub1set groupJ ?andbT.
- have nPG1: G1 \subset 'N(P) by rewrite join_subG !sub1set groupJ ?andbT.
- rewrite -setIA setICA (setIidPr sG1G).
- rewrite (card_isog (second_isog _)) ?norms_cent //.
- apply: IH => //; first by rewrite pP nPG1 (oddSg sG1G).
- rewrite /p_xp -{2}(normP Ny) -conjg_set1 -conjsRg centJ memJ_conjg.
- rewrite p_eltJ andbb (mem_p_elt pA) // -sub1set centsC (sameP commG1P trivgP).
- by rewrite -cRA !commgSS ?sub1set.
-move: {2}_.+1 (ltnSn #|E|) => n; elim: n => // n IHn in gT E x y G *.
-rewrite ltnS => leEn /and3P[oddG pE nEG] /and3P[/andP[p_x cRx] p_y cRy].
-have [Gx Gy]: x \in G /\ y \in G by apply/andP; rewrite -!sub1set -join_subG.
-apply: wlog_neg => p'Gc; apply/pgroupP=> q q_pr qGc; apply/idPn => p'q.
-have [Q sylQ] := Sylow_exists q [group of G].
-have [sQG qQ]: Q \subset G /\ q.-group Q by case/and3P: sylQ.
-have{qQ p'q} p'Q: p^'.-group Q by apply: sub_in_pnat qQ => q' _ /eqnP->.
-have{q q_pr sylQ qGc} ncEQ: ~~ (Q \subset 'C(E)).
- apply: contraL qGc => cEQ; rewrite -p'natE // -partn_eq1 //.
- have nCQ: Q \subset 'N('C(E)) by apply: subset_trans (normG _).
- have sylQc: q.-Sylow(G / 'C(E)) (Q / 'C(E)) by rewrite morphim_pSylow.
- by rewrite -(card_Hall sylQc) -trivg_card1 (sameP eqP trivgP) quotient_sub1.
-have solE: solvable E := pgroup_sol pE.
-have ntE: E :!=: 1 by apply: contra ncEQ; move/eqP->; rewrite cents1.
-have{Q ncEQ p'Q sQG} minE_EG: minnormal E (E <*> G).
- apply/mingroupP; split=> [|D]; rewrite join_subG ?ntE ?normG //.
- case/and3P=> ntD nDE nDG sDE; have nDGi := subsetP nDG.
- apply/eqP; rewrite eqEcard sDE leqNgt; apply: contra ncEQ => ltDE.
- have nDQ: Q \subset 'N(D) by rewrite (subset_trans sQG).
- have cDQ: Q \subset 'C(D).
- rewrite -quotient_sub1 ?norms_cent // ?[_ / _]card1_trivg //.
- apply: pnat_1 (morphim_pgroup _ p'Q); apply: pgroupS (quotientS _ sQG) _.
- apply: IHn (leq_trans ltDE leEn) _ _; first by rewrite oddG (pgroupS sDE).
- rewrite /p_xp p_x p_y /=; apply/andP.
- by split; [move: cRx | move: cRy]; apply: subsetP; rewrite centS ?commSg.
- apply: (stable_factor_cent cDQ) solE; rewrite ?(pnat_coprime pE) //.
- apply/and3P; split; rewrite // -quotient_cents2 // centsC.
- rewrite -quotient_sub1 ?norms_cent ?quotient_norms ?(subset_trans sQG) //=.
- rewrite [(_ / _) / _]card1_trivg //=.
- apply: pnat_1 (morphim_pgroup _ (morphim_pgroup _ p'Q)).
- apply: pgroupS (quotientS _ (quotientS _ sQG)) _.
- have defGq: G / D = <<[set coset D x; coset D y]>>.
- by rewrite quotient_gen -1?gen_subG ?quotientU ?quotient_set1 ?nDGi.
- rewrite /= defGq IHn ?(leq_trans _ leEn) ?ltn_quotient // -?defGq.
- by rewrite quotient_odd // quotient_pgroup // quotient_norms.
- rewrite /p_xp -!sub1set !morph_p_elt -?quotient_set1 ?nDGi //=.
- by rewrite -!quotientR ?quotient_cents ?sub1set ?nDGi.
-have abelE: p.-abelem E.
- by rewrite -is_abelem_pgroup //; case: (minnormal_solvable minE_EG _ solE).
-have cEE: abelian E by case/and3P: abelE.
-have{minE_EG} minE: minnormal E G.
- case/mingroupP: minE_EG => _ minE; apply/mingroupP; rewrite ntE.
- split=> // D ntD sDE; apply: minE => //; rewrite join_subG cents_norm //.
- by rewrite centsC (subset_trans sDE).
-have nCG: G \subset 'N('C_G(E)) by rewrite normsI ?normG ?norms_cent.
-suffices{p'Gc} pG'c: p.-group (G / 'C_G(E))^`(1).
- have [Pc sylPc sGc'Pc]:= Sylow_superset (der_subS _ _) pG'c.
- have nsPc: Pc <| G / 'C_G(E) by rewrite sub_der1_normal ?(pHall_sub sylPc).
- case/negP: p'Gc; rewrite /pgroup -(card_isog (second_isog _)) ?norms_cent //.
- rewrite setIC; apply: pgroupS (pHall_pgroup sylPc) => /=.
- rewrite sub_quotient_pre // join_subG !sub1set !(subsetP nCG, inE) //=.
- by rewrite !(mem_normal_Hall sylPc) ?mem_quotient ?morph_p_elt ?(subsetP nCG).
-have defC := rker_abelem abelE ntE nEG; rewrite /= -/G in defC.
-set rG := abelem_repr _ _ _ in defC.
-case ncxy: (rG x *m rG y == rG y *m rG x).
- have Cxy: [~ x, y] \in 'C_G(E).
- rewrite -defC inE groupR //= !repr_mxM ?groupM ?groupV // mul1mx -/rG.
- by rewrite (eqP ncxy) -!repr_mxM ?groupM ?groupV // mulKg mulVg repr_mx1.
- rewrite [_^`(1)](commG1P _) ?pgroup1 //= quotient_gen -gen_subG //= -/G.
- rewrite !gen_subG centsC gen_subG quotient_cents2r ?gen_subG //= -/G.
- rewrite /commg_set imset2Ul !imset2_set1l !imsetU !imset_set1.
- by rewrite !subUset andbC !sub1set !commgg group1 /= -invg_comm groupV Cxy.
-pose Ax : 'M(E) := rG x - 1; pose Ay : 'M(E) := rG y - 1.
-have Ax2: Ax *m Ax = 0.
- apply/row_matrixP=> i; apply/eqP; rewrite row_mul mulmxBr mulmx1.
- rewrite row0 subr_eq0 -(inj_eq (@rVabelem_inj _ _ _ abelE ntE)).
- rewrite rVabelemJ // conjgE -(centP cRx) ?mulKg //.
- rewrite linearB /= addrC row1 rowE rVabelemD rVabelemN rVabelemJ //=.
- by rewrite mem_commg ?set11 ?mem_rVabelem.
-have Ay2: Ay *m Ay = 0.
- apply/row_matrixP=> i; apply/eqP; rewrite row_mul mulmxBr mulmx1.
- rewrite row0 subr_eq0 -(inj_eq (@rVabelem_inj _ _ _ abelE ntE)).
- rewrite rVabelemJ // conjgE -(centP cRy) ?mulKg //.
- rewrite linearB /= addrC row1 rowE rVabelemD rVabelemN rVabelemJ //=.
- by rewrite mem_commg ?set11 ?mem_rVabelem.
-pose A := Ax *m Ay + Ay *m Ax.
-have cAG: centgmx rG A.
- rewrite /centgmx gen_subG subUset !sub1set !inE Gx Gy /=; apply/andP.
- rewrite -[rG x](subrK 1%R) -[rG y](subrK 1%R) -/Ax -/Ay.
- rewrite 2!(mulmxDl _ 1 A) 2!(mulmxDr A _ 1) !mulmx1 !mul1mx.
- rewrite !(inj_eq (addIr A)) ![_ *m A]mulmxDr ![A *m _]mulmxDl.
- by rewrite -!mulmxA Ax2 Ay2 !mulmx0 !mulmxA Ax2 Ay2 !mul0mx !addr0 !add0r.
-have irrG: mx_irreducible rG by apply/abelem_mx_irrP.
-pose rAG := gen_repr irrG cAG; pose inFA := in_gen irrG cAG.
-pose valFA := @val_gen _ _ _ _ _ _ irrG cAG.
-set dA := gen_dim A in rAG inFA valFA.
-rewrite -(rker_abelem abelE ntE nEG) -/rG -(rker_gen irrG cAG) -/rAG.
-have dA_gt0: dA > 0 by rewrite (gen_dim_gt0 irrG cAG).
-have irrAG: mx_irreducible rAG by apply: gen_mx_irr.
-have: dA <= 2.
- case Ax0: (Ax == 0).
- by rewrite subr_eq0 in Ax0; case/eqP: ncxy; rewrite (eqP Ax0) mulmx1 mul1mx.
- case/rowV0Pn: Ax0 => v; case/submxP => u def_v nzv.
- pose U := col_mx v (v *m Ay); pose UA := <<inFA _ U>>%MS.
- pose rvalFA := @rowval_gen _ _ _ _ _ _ irrG cAG.
- have Umod: mxmodule rAG UA.
- rewrite /mxmodule gen_subG subUset !sub1set !inE Gx Gy /= andbC.
- apply/andP; split; rewrite (eqmxMr _ (genmxE _)) -in_genJ // genmxE.
- rewrite submx_in_gen // -[rG y](subrK 1%R) -/Ay mulmxDr mulmx1.
- rewrite addmx_sub // mul_col_mx -mulmxA Ay2 mulmx0.
- by rewrite -!addsmxE addsmx0 addsmxSr.
- rewrite -[rG x](subrK 1%R) -/Ax mulmxDr mulmx1 in_genD mul_col_mx.
- rewrite -mulmxA -[Ay *m Ax](addKr (Ax *m Ay)) (mulmxDr v _ A) -mulmxN.
- rewrite mulmxA {1 2}def_v -(mulmxA u) Ax2 mulmx0 mul0mx add0r.
- pose B := A; rewrite -(mul0mx _ B) -mul_col_mx -[B](mxval_groot irrG cAG).
- rewrite {B} -[_ 0 v](in_genK irrG cAG) -val_genZ val_genK.
- rewrite addmx_sub ?scalemx_sub ?submx_in_gen //.
- by rewrite -!addsmxE adds0mx addsmxSl.
- have nzU: UA != 0.
- rewrite -mxrank_eq0 genmxE mxrank_eq0; apply/eqP.
- move/(canRL ((in_genK _ _) _)); rewrite val_gen0; apply/eqP.
- by rewrite -submx0 -addsmxE addsmx_sub submx0 negb_and nzv.
- case/mx_irrP: irrAG => _ /(_ UA Umod nzU)/eqnP <-.
- by rewrite genmxE rank_leq_row.
-rewrite leq_eqVlt ltnS leq_eqVlt ltnNge dA_gt0 orbF orbC; case/pred2P=> def_dA.
- rewrite [_^`(1)](commG1P _) ?pgroup1 // quotient_cents2r // gen_subG.
- apply/subsetP=> zt; case/imset2P=> z t Gz Gt ->{zt}.
- rewrite !inE groupR //= mul1mx; have Gtz := groupM Gt Gz.
- rewrite -(inj_eq (can_inj (mulKmx (repr_mx_unit rAG Gtz)))) mulmx1.
- rewrite [eq_op]lock -repr_mxM ?groupR ?groupM // -commgC !repr_mxM // -lock.
- apply/eqP; move: (rAG z) (rAG t); rewrite /= -/dA def_dA => Az At.
- by rewrite [Az]mx11_scalar scalar_mxC.
-move: (kquo_repr _) (kquo_mx_faithful rAG) => /=; set K := rker _.
-rewrite def_dA => r2G; move/der1_odd_GL2_charf; move/implyP.
-rewrite quotient_odd //= -/G; apply: etrans; apply: eq_pgroup => p'.
-have [p_pr _ _] := pgroup_pdiv pE ntE.
-by rewrite (fmorph_char (gen_rmorphism _ _)) (charf_eq (char_Fp _)).
-Qed.
-
-Section A5.
-
-Variables (gT : finGroupType) (p : nat) (G P X : {group gT}).
-
-Hypotheses (oddG : odd #|G|) (solG : solvable G) (pP : p.-group P).
-Hypotheses (nsPG : P <| G) (sXG : X \subset G).
-Hypotheses (genX : generated_by (p_norm_abelian p P) X).
-
-Let C := 'C_G(P).
-Let defN : 'N_G(P) = G. Proof. by rewrite (setIidPl _) ?normal_norm. Qed.
-Let nsCG : C <| G. Proof. by rewrite -defN subcent_normal. Qed.
-Let nCG := normal_norm nsCG.
-Let nCX := subset_trans sXG nCG.
-
-(* This is B & G, Theorem A.5.1; it does not depend on the solG assumption. *)
-Theorem odd_abelian_gen_stable : X / C \subset 'O_p(G / C).
-Proof.
-case/exists_eqP: genX => gX defX.
-rewrite -defN sub_quotient_pre // -defX gen_subG.
-apply/bigcupsP=> A gX_A; have [_ pA nAP cAA] := and4P gX_A.
-have{gX_A} sAX: A \subset X by rewrite -defX sub_gen ?bigcup_sup.
-rewrite -sub_quotient_pre ?(subset_trans sAX nCX) //=.
-rewrite odd_p_stable ?normalM ?pcore_normal //.
- by rewrite /psubgroup pA defN (subset_trans sAX sXG).
-by apply/commG1P; rewrite (subset_trans _ cAA) // commg_subr.
-Qed.
-
-(* This is B & G, Theorem A.5.2. *)
-Theorem odd_abelian_gen_constrained :
- 'O_p^'(G) = 1 -> 'C_('O_p(G))(P) \subset P -> X \subset 'O_p(G).
-Proof.
-set Q := 'O_p(G) => p'G1 sCQ_P.
-have sPQ: P \subset Q by rewrite pcore_max.
-have defQ: 'O_{p^', p}(G) = Q by rewrite pseries_pop2.
-have pQ: p.-group Q by apply: pcore_pgroup.
-have sCQ: 'C_G(Q) \subset Q.
- by rewrite -{2}defQ solvable_p_constrained //= defQ /pHall pQ indexgg subxx.
-have pC: p.-group C.
- apply/pgroupP=> q q_pr; case/Cauchy=> // u Cu q_u; apply/idPn=> p'q.
- suff cQu: u \in 'C_G(Q).
- case/negP: p'q; have{q_u}: q %| #[u] by rewrite q_u.
- by apply: pnatP q q_pr => //; apply: mem_p_elt pQ _; apply: (subsetP sCQ).
- have [Gu cPu] := setIP Cu; rewrite inE Gu /= -cycle_subG.
- rewrite coprime_nil_faithful_cent_stab ?(pgroup_nil pQ) //= -/C -/Q.
- - by rewrite cycle_subG; apply: subsetP Gu; rewrite normal_norm ?pcore_normal.
- - by rewrite (pnat_coprime pQ) // [#|_|]q_u pnatE.
- have sPcQu: P \subset 'C_Q(<[u]>) by rewrite subsetI sPQ centsC cycle_subG.
- by apply: subset_trans (subset_trans sCQ_P sPcQu); rewrite setIS // centS.
-rewrite -(quotientSGK nCX) ?pcore_max // -pquotient_pcore //.
-exact: odd_abelian_gen_stable.
-Qed.
-
-End A5.
-
-End AppendixA.
-
-Section AppendixB.
-
-Local Notation "X --> Y" := (generated_by (norm_abelian X) Y)
- (at level 70, no associativity) : group_scope.
-
-Variable gT : finGroupType.
-Implicit Types G H A : {group gT}.
-Implicit Types D E : {set gT}.
-Implicit Type p : nat.
-
-Lemma Puig_char G : 'L(G) \char G.
-Proof. exact: gFchar. Qed.
-
-Lemma center_Puig_char G : 'Z('L(G)) \char G.
-Proof. by rewrite !gFchar_trans. Qed.
-
-(* This is B & G, Lemma B.1(a). *)
-Lemma Puig_succS G D E : D \subset E -> 'L_[G](E) \subset 'L_[G](D).
-Proof.
-move=> sDE; apply: Puig_max (Puig_succ_sub _ _).
-exact: norm_abgenS sDE (Puig_gen _ _).
-Qed.
-
-(* This is part of B & G, Lemma B.1(b) (see also BGsection1.Puig1). *)
-Lemma Puig_sub_even m n G : m <= n -> 'L_{m.*2}(G) \subset 'L_{n.*2}(G).
-Proof.
-move/subnKC <-; move: {n}(n - m)%N => n.
-by elim: m => [|m IHm] /=; rewrite ?sub1G ?Puig_succS.
-Qed.
-
-(* This is part of B & G, Lemma B.1(b). *)
-Lemma Puig_sub_odd m n G : m <= n -> 'L_{n.*2.+1}(G) \subset 'L_{m.*2.+1}(G).
-Proof. by move=> le_mn; rewrite Puig_succS ?Puig_sub_even. Qed.
-
-(* This is part of B & G, Lemma B.1(b). *)
-Lemma Puig_sub_even_odd m n G : 'L_{m.*2}(G) \subset 'L_{n.*2.+1}(G).
-Proof.
-elim: n m => [|n IHn] m; first by rewrite Puig1 Puig_at_sub.
-by case: m => [|m]; rewrite ?sub1G ?Puig_succS ?IHn.
-Qed.
-
-(* This is B & G, Lemma B.1(c). *)
-Lemma Puig_limit G :
- exists m, forall k, m <= k ->
- 'L_{k.*2}(G) = 'L_*(G) /\ 'L_{k.*2.+1}(G) = 'L(G).
-Proof.
-pose L2G m := 'L_{m.*2}(G); pose n := #|G|.
-have []: #|L2G n| <= n /\ n <= n by rewrite subset_leq_card ?Puig_at_sub.
-elim: {1 2 3}n => [| m IHm leLm1 /ltnW]; first by rewrite leqNgt cardG_gt0.
-have [eqLm le_mn|] := eqVneq (L2G m.+1) (L2G m); last first.
- rewrite eq_sym eqEcard Puig_sub_even ?leqnSn // -ltnNge => lt_m1_m.
- exact: IHm (leq_trans lt_m1_m leLm1).
-have{eqLm} eqLm k: m <= k -> 'L_{k.*2}(G) = L2G m.
- rewrite leq_eqVlt => /predU1P[-> // |]; elim: k => // k IHk.
- by rewrite leq_eqVlt => /predU1P[<- //| ltmk]; rewrite -eqLm !PuigS IHk.
-by exists m => k le_mk; rewrite Puig_def PuigS /Puig_inf /= !eqLm.
-Qed.
-
-(* This is B & G, Lemma B.1(d), second part; the first part is covered by *)
-(* BGsection1.Puig_inf_sub. *)
-Lemma Puig_inf_sub_Puig G : 'L_*(G) \subset 'L(G).
-Proof. exact: Puig_sub_even_odd. Qed.
-
-(* This is B & G, Lemma B.1(e). *)
-Lemma abelian_norm_Puig n G A :
- n > 0 -> abelian A -> A <| G -> A \subset 'L_{n}(G).
-Proof.
-case: n => // n _ cAA /andP[sAG nAG].
-rewrite PuigS sub_gen // bigcup_sup // inE sAG /norm_abelian cAA andbT.
-exact: subset_trans (Puig_at_sub n G) nAG.
-Qed.
-
-(* This is B & G, Lemma B.1(f), first inclusion. *)
-Lemma sub_cent_Puig_at n p G :
- n > 0 -> p.-group G -> 'C_G('L_{n}(G)) \subset 'L_{n}(G).
-Proof.
-move=> n_gt0 pG.
-have /ex_maxgroup[M /(max_SCN pG)SCN_M]: exists M, (gval M <| G) && abelian M.
- by exists 1%G; rewrite normal1 abelian1.
-have{SCN_M} [cMM [nsMG defCM]] := (SCN_abelian SCN_M, SCN_P SCN_M).
-have sML: M \subset 'L_{n}(G) by apply: abelian_norm_Puig.
-by apply: subset_trans (sML); rewrite -defCM setIS // centS.
-Qed.
-
-(* This is B & G, Lemma B.1(f), second inclusion. *)
-Lemma sub_center_cent_Puig_at n G : 'Z(G) \subset 'C_G('L_{n}(G)).
-Proof. by rewrite setIS ?centS ?Puig_at_sub. Qed.
-
-(* This is B & G, Lemma B.1(f), third inclusion (the fourth is trivial). *)
-Lemma sub_cent_Puig_inf p G : p.-group G -> 'C_G('L_*(G)) \subset 'L_*(G).
-Proof. by apply: sub_cent_Puig_at; rewrite double_gt0. Qed.
-
-(* This is B & G, Lemma B.1(f), fifth inclusion (the sixth is trivial). *)
-Lemma sub_cent_Puig p G : p.-group G -> 'C_G('L(G)) \subset 'L(G).
-Proof. exact: sub_cent_Puig_at. Qed.
-
-(* This is B & G, Lemma B.1(f), final remark (we prove the contrapositive). *)
-Lemma trivg_center_Puig_pgroup p G : p.-group G -> 'Z('L(G)) = 1 -> G :=: 1.
-Proof.
-move=> pG LG1; apply/(trivg_center_pgroup pG)/trivgP.
-rewrite -(trivg_center_pgroup (pgroupS (Puig_sub _) pG) LG1).
-by apply: subset_trans (sub_cent_Puig pG); apply: sub_center_cent_Puig_at.
-Qed.
-
-(* This is B & G, Lemma B.1(g), second part; the first part is simply the *)
-(* definition of 'L(G) in terms of 'L_*(G). *)
-Lemma Puig_inf_def G : 'L_*(G) = 'L_[G]('L(G)).
-Proof.
-have [k defL] := Puig_limit G.
-by case: (defL k) => // _ <-; case: (defL k.+1) => [|<- //]; apply: leqnSn.
-Qed.
-
-(* This is B & G, Lemma B.2. *)
-Lemma sub_Puig_eq G H : H \subset G -> 'L(G) \subset H -> 'L(H) = 'L(G).
-Proof.
-move=> sHG sLG_H; apply/setP/subset_eqP/andP.
-have sLH_G := subset_trans (Puig_succ_sub _ _) sHG.
-have gPuig := norm_abgenS _ (Puig_gen _ _).
-have [[kG defLG] [kH defLH]] := (Puig_limit G, Puig_limit H).
-have [/defLG[_ {1}<-] /defLH[_ <-]] := (leq_maxl kG kH, leq_maxr kG kH).
-split; do [elim: (maxn _ _) => [|k IHk /=]; first by rewrite !Puig1].
- rewrite doubleS !(PuigS _.+1) Puig_max ?gPuig // Puig_max ?gPuig //.
- exact: subset_trans (Puig_sub_even_odd _.+1 _ _) sLG_H.
-rewrite doubleS Puig_max // -!PuigS Puig_def gPuig //.
-by rewrite Puig_inf_def Puig_max ?gPuig ?sLH_G.
-Qed.
-
-Lemma norm_abgen_pgroup p X G :
- p.-group G -> X --> G -> generated_by (p_norm_abelian p X) G.
-Proof.
-move=> pG /exists_eqP[gG defG].
-have:= subxx G; rewrite -{1 3}defG gen_subG /= => /bigcupsP-sGG.
-apply/exists_eqP; exists gG; congr <<_>>; apply: eq_bigl => A.
-by rewrite andbA andbAC andb_idr // => /sGG/pgroupS->.
-Qed.
-
-Variables (p : nat) (G S : {group gT}).
-Hypotheses (oddG : odd #|G|) (solG : solvable G) (sylS : p.-Sylow(G) S).
-Hypothesis p'G1 : 'O_p^'(G) = 1.
-
-Let T := 'O_p(G).
-Let nsTG : T <| G := pcore_normal _ _.
-Let pT : p.-group T := pcore_pgroup _ _.
-Let pS : p.-group S := pHall_pgroup sylS.
-Let sSG := pHall_sub sylS.
-
-(* This is B & G, Lemma B.3. *)
-Lemma pcore_Sylow_Puig_sub : 'L_*(S) \subset 'L_*(T) /\ 'L(T) \subset 'L(S).
-Proof.
-have [[kS defLS] [kT defLT]] := (Puig_limit S, Puig_limit [group of T]).
-have [/defLS[<- <-] /defLT[<- <-]] := (leq_maxl kS kT, leq_maxr kS kT).
-have sL_ := subset_trans (Puig_succ_sub _ _).
-elim: (maxn kS kT) => [|k [_ sL1]]; first by rewrite !Puig1 pcore_sub_Hall.
-have{sL1} gL: 'L_{k.*2.+1}(T) --> 'L_{k.*2.+2}(S).
- exact: norm_abgenS sL1 (Puig_gen _ _).
-have sCT_L: 'C_T('L_{k.*2.+1}(T)) \subset 'L_{k.*2.+1}(T).
- exact: sub_cent_Puig_at pT.
-have{sCT_L} sLT: 'L_{k.*2.+2}(S) \subset T.
- apply: odd_abelian_gen_constrained sCT_L => //.
- - exact: pgroupS (Puig_at_sub _ _) pT.
- - exact: gFnormal_trans nsTG.
- - exact: sL_ sSG.
- by rewrite norm_abgen_pgroup // (pgroupS _ pS) ?Puig_at_sub.
-have sL2: 'L_{k.*2.+2}(S) \subset 'L_{k.*2.+2}(T) by apply: Puig_max.
-split; [exact: sL2 | rewrite doubleS; apply: subset_trans (Puig_succS _ sL2) _].
-by rewrite Puig_max -?PuigS ?Puig_gen // sL_ // pcore_sub_Hall.
-Qed.
-
-Let Y := 'Z('L(T)).
-Let L := 'L(S).
-
-(* This is B & G, Theorem B.4(b). *)
-Theorem Puig_center_normal : 'Z(L) <| G.
-Proof.
-have [sLiST sLTS] := pcore_Sylow_Puig_sub.
-have sLiLT: 'L_*(T) \subset 'L(T) by apply: Puig_sub_even_odd.
-have sZY: 'Z(L) \subset Y.
- rewrite subsetI andbC subIset ?centS ?orbT //=.
- suffices: 'C_S('L_*(S)) \subset 'L(T).
- by apply: subset_trans; rewrite setISS ?Puig_sub ?centS ?Puig_sub_even_odd.
- apply: subset_trans (subset_trans sLiST sLiLT).
- by apply: sub_cent_Puig_at pS; rewrite double_gt0.
-have chY: Y \char G by rewrite !gFchar_trans.
-have nsCY_G: 'C_G(Y) <| G by rewrite char_normal 1?subcent_char ?char_refl.
-have [C defC sCY_C nsCG] := inv_quotientN nsCY_G (pcore_normal p _).
-have sLG: L \subset G by rewrite gFsub_trans ?(pHall_sub sylS).
-have nsL_nCS: L <| 'N_G(C :&: S).
- have sYLiS: Y \subset 'L_*(S).
- rewrite abelian_norm_Puig ?double_gt0 ?center_abelian //.
- apply: normalS (pHall_sub sylS) (char_normal chY).
- by rewrite subIset // (subset_trans sLTS) ?Puig_sub.
- have gYL: Y --> L := norm_abgenS sYLiS (Puig_gen _ _).
- have sLCS: L \subset C :&: S.
- rewrite subsetI Puig_sub andbT.
- rewrite -(quotientSGK _ sCY_C) ?(subset_trans sLG) ?normal_norm // -defC.
- rewrite odd_abelian_gen_stable ?char_normal ?norm_abgen_pgroup //.
- by rewrite (pgroupS _ pT) ?subIset // Puig_sub.
- by rewrite (pgroupS _ pS) ?Puig_sub.
- rewrite -[L](sub_Puig_eq _ sLCS) ?subsetIr // gFnormal_trans ?normalSG //.
- by rewrite subIset // sSG orbT.
-have sylCS: p.-Sylow(C) (C :&: S) := Sylow_setI_normal nsCG sylS.
-have{defC} defC: 'C_G(Y) * (C :&: S) = C.
- apply/eqP; rewrite eqEsubset mulG_subG sCY_C subsetIl /=.
- have nCY_C: C \subset 'N('C_G(Y)).
- exact: subset_trans (normal_sub nsCG) (normal_norm nsCY_G).
- rewrite -quotientSK // -defC /= -pseries1.
- rewrite -(pseries_catr_id [:: p : nat_pred]) (pseries_rcons_id [::]) /=.
- rewrite pseries1 /= pseries1 defC pcore_sub_Hall // morphim_pHall //.
- by rewrite subIset ?nCY_C.
-have defG: 'C_G(Y) * 'N_G(C :&: S) = G.
- have sCS_N: C :&: S \subset 'N_G(C :&: S).
- by rewrite subsetI normG subIset // sSG orbT.
- by rewrite -(mulSGid sCS_N) mulgA defC (Frattini_arg _ sylCS).
-have nsZ_N: 'Z(L) <| 'N_G(C :&: S) := gFnormal_trans _ nsL_nCS.
-rewrite /normal subIset ?sLG //= -{1}defG mulG_subG /=.
-rewrite cents_norm ?normal_norm // centsC.
-by rewrite (subset_trans sZY) // centsC subsetIr.
-Qed.
-
-End AppendixB.
-
-Section Puig_factorization.
-
-Variables (gT : finGroupType) (p : nat) (G S : {group gT}).
-Hypotheses (oddG : odd #|G|) (solG : solvable G) (sylS : p.-Sylow(G) S).
-
-(* This is B & G, Theorem B.4(a). *)
-Theorem Puig_factorization : 'O_p^'(G) * 'N_G('Z('L(S))) = G.
-Proof.
-set D := 'O_p^'(G); set Z := 'Z(_); have [sSG pS _] := and3P sylS.
-have sSN: S \subset 'N(D) by rewrite (subset_trans sSG) ?gFnorm.
-have p'D: p^'.-group D := pcore_pgroup _ _.
-have tiSD: S :&: D = 1 := coprime_TIg (pnat_coprime pS p'D).
-have def_Zq: Z / D = 'Z('L(S / D)).
- rewrite !quotientE -(setIid S) -(morphim_restrm sSN); set f := restrm _ _.
- have injf: 'injm f by rewrite ker_restrm ker_coset tiSD.
- rewrite -!(injmF _ injf) ?Puig_sub //= morphim_restrm.
- by rewrite (setIidPr _) // subIset ?Puig_sub.
-have{def_Zq} nZq: Z / D <| G / D.
- have sylSq: p.-Sylow(G / D) (S / D) by apply: morphim_pHall.
- rewrite def_Zq (Puig_center_normal _ _ sylSq) ?quotient_odd ?quotient_sol //.
- exact: trivg_pcore_quotient.
-have sZS: Z \subset S by rewrite subIset ?Puig_sub.
-have sZN: Z \subset 'N_G(Z) by rewrite subsetI normG (subset_trans sZS).
-have nDZ: Z \subset 'N(D) by rewrite (subset_trans sZS).
-rewrite -(mulSGid sZN) mulgA -(norm_joinEr nDZ) (@Frattini_arg p) //= -/D -/Z.
- rewrite -cosetpre_normal quotientK ?quotientGK ?pcore_normal // in nZq.
- by rewrite norm_joinEr.
-rewrite /pHall -divgS joing_subr ?(pgroupS sZS) /= ?norm_joinEr //= -/Z.
-by rewrite TI_cardMg ?mulnK //; apply/trivgP; rewrite /= setIC -tiSD setSI.
-Qed.
-
-End Puig_factorization.
-
-
-
-
-