aboutsummaryrefslogtreecommitdiff
path: root/mathcomp/odd_order/BGsection15.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/BGsection15.v
parentc1ec9cd8e7e50f73159613c492aad4c6c40bc3aa (diff)
move odd_order to its own repository
Diffstat (limited to 'mathcomp/odd_order/BGsection15.v')
-rw-r--r--mathcomp/odd_order/BGsection15.v1511
1 files changed, 0 insertions, 1511 deletions
diff --git a/mathcomp/odd_order/BGsection15.v b/mathcomp/odd_order/BGsection15.v
deleted file mode 100644
index 704e98d..0000000
--- a/mathcomp/odd_order/BGsection15.v
+++ /dev/null
@@ -1,1511 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq choice div fintype.
-From mathcomp
-Require Import path bigop finset prime fingroup morphism perm automorphism.
-From mathcomp
-Require Import quotient action gproduct gfunctor pgroup cyclic commutator.
-From mathcomp
-Require Import center gseries nilpotent sylow abelian maximal hall frobenius.
-From mathcomp
-Require Import BGsection1 BGsection2 BGsection3 BGsection4 BGsection5.
-From mathcomp
-Require Import BGsection6 BGsection7 BGsection9 BGsection10 BGsection12.
-From mathcomp
-Require Import BGsection13 BGsection14.
-
-(******************************************************************************)
-(* This file covers B & G, section 15; it fills in the picture of maximal *)
-(* subgroups that was sketched out in section14, providing an intrinsic *)
-(* characterization of M`_\sigma and establishing the TI property for the *)
-(* "kernels" of maximal groups. We introduce only one new definition: *)
-(* M`_\F == the (direct) product of all the normal Sylow subgroups of M; *)
-(* equivalently, the largest normal nilpotent Hall subgroup of M *)
-(* We will refer to M`_\F as the Fitting core or F-core of M. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope.
-
-Section Definitions.
-
-Variables (gT : finGroupType) (M : {set gT}).
-
-Definition Fitting_core :=
- <<\bigcup_(P : {group gT} | Sylow M P && (P <| M)) P>>.
-Canonical Structure Fitting_core_group := [group of Fitting_core].
-
-End Definitions.
-
-Notation "M `_ \F" := (Fitting_core M)
- (at level 3, format "M `_ \F") : group_scope.
-Notation "M `_ \F" := (Fitting_core_group M) : Group_scope.
-
-Section FittingCore.
-
-Variable (gT : finGroupType) (M : {group gT}).
-Implicit Types H P : {group gT}.
-Implicit Type p : nat.
-
-Lemma Fcore_normal : M`_\F <| M.
-Proof.
-rewrite -[M`_\F]bigprodGE.
-elim/big_ind: _ => [|P Q nsP nsG|P /andP[] //]; first exact: normal1.
-by rewrite /normal normsY ?normal_norm // join_subG ?normal_sub.
-Qed.
-Hint Resolve Fcore_normal.
-
-Lemma Fcore_sub : M`_\F \subset M.
-Proof. by case/andP: Fcore_normal. Qed.
-
-Lemma Fcore_sub_Fitting : M`_\F \subset 'F(M).
-Proof.
-rewrite gen_subG; apply/bigcupsP=> P /andP[/SylowP[p _ /and3P[_ pP _]] nsP].
-by rewrite Fitting_max // (pgroup_nil pP).
-Qed.
-
-Lemma Fcore_nil : nilpotent M`_\F.
-Proof. exact: nilpotentS Fcore_sub_Fitting (Fitting_nil M). Qed.
-
-Lemma Fcore_max pi H :
- pi.-Hall(M) H -> H <| M -> nilpotent H -> H \subset M`_\F.
-Proof.
-move=> hallH nsHM nilH; have [sHM pi_H _] := and3P hallH.
-rewrite -(nilpotent_Fitting nilH) FittingEgen genS //.
-apply/bigcupsP=> [[p /= _] piHp]; rewrite (bigcup_max 'O_p(H)%G) //.
-have sylHp := nilpotent_pcore_Hall p nilH.
-have sylHp_M := subHall_Sylow hallH (pnatPpi pi_H piHp) sylHp.
-by rewrite (p_Sylow sylHp_M) gFnormal_trans.
-Qed.
-
-Lemma Fcore_dprod : \big[dprod/1]_(P | Sylow M (gval P) && (P <| M)) P = M`_\F.
-Proof.
-rewrite -[M`_\F]bigprodGE.
-apply/eqP/bigdprodYP=> P /andP[/SylowP[p p_pr sylP] nsPM].
-have defP := normal_Hall_pcore sylP nsPM.
-have /dprodP[_ _ cFpFp' tiFpFp'] := nilpotent_pcoreC p (Fitting_nil M).
-have /dprodYP := dprodEY cFpFp' tiFpFp'; rewrite /= p_core_Fitting defP.
-apply: subset_trans; rewrite bigprodGE gen_subG.
-apply/bigcupsP=> Q => /andP[/andP[/SylowP[q _ sylQ] nsQM] neqQP].
-have defQ := normal_Hall_pcore sylQ nsQM; rewrite -defQ -p_core_Fitting.
-apply: sub_pcore => q' /eqnP->; apply: contraNneq neqQP => eq_qp.
-by rewrite -val_eqE /= -defP -defQ eq_qp.
-Qed.
-
-Lemma Fcore_pcore_Sylow p : p \in \pi(M`_\F) -> p.-Sylow(M) 'O_p(M).
-Proof.
-rewrite /= -(bigdprod_card Fcore_dprod) mem_primes => /and3P[p_pr _].
-have not_p_dv_1: ~ p %| 1 by rewrite gtnNdvd ?prime_gt1.
-elim/big_ind: _ => // [p1 p2 IH1 IH2|P /andP[/SylowP[q q_pr sylP] nsPM p_dv_P]].
- by rewrite Euclid_dvdM // => /orP[/IH1 | /IH2].
-have qP := pHall_pgroup sylP.
-by rewrite (eqnP (pgroupP qP p p_pr p_dv_P)) (normal_Hall_pcore sylP).
-Qed.
-
-Lemma p_core_Fcore p : p \in \pi(M`_\F) -> 'O_p(M`_\F) = 'O_p(M).
-Proof.
-move=> piMFp /=; rewrite -(pcore_setI_normal p Fcore_normal).
-apply/setIidPl; rewrite sub_gen // (bigcup_max 'O_p(M)%G) //= pcore_normal.
-by rewrite (p_Sylow (Fcore_pcore_Sylow piMFp)).
-Qed.
-
-Lemma Fcore_Hall : \pi(M`_\F).-Hall(M) M`_\F.
-Proof.
-rewrite Hall_pi // /Hall Fcore_sub coprime_pi' ?cardG_gt0 //=.
-apply/pnatP=> // p p_pr; apply: contraL => /= piMFp; rewrite -p'natE //.
-rewrite -partn_eq1 // -(eqn_pmul2l (part_gt0 p #|M`_\F|)) muln1.
-rewrite -partnM ?cardG_gt0 // Lagrange ?Fcore_sub //.
-rewrite -(card_Hall (nilpotent_pcore_Hall p Fcore_nil)) /=.
-by rewrite p_core_Fcore // (card_Hall (Fcore_pcore_Sylow piMFp)).
-Qed.
-
-Lemma pcore_Fcore pi : {subset pi <= \pi(M`_\F)} -> 'O_pi(M`_\F) = 'O_pi(M).
-Proof.
-move=> s_pi_MF; rewrite -(pcore_setI_normal pi Fcore_normal).
-apply/setIidPl; rewrite (sub_normal_Hall Fcore_Hall) ?pcore_sub //.
-exact: sub_pgroup s_pi_MF (pcore_pgroup pi M).
-Qed.
-
-Lemma Fcore_pcore_Hall pi : {subset pi <= \pi(M`_\F)} -> pi.-Hall(M) 'O_pi(M).
-Proof.
-move=> s_pi_MF; apply: (subHall_Hall Fcore_Hall s_pi_MF).
-by rewrite /= -pcore_Fcore // (nilpotent_pcore_Hall pi Fcore_nil).
-Qed.
-
-End FittingCore.
-
-Lemma morphim_Fcore : GFunctor.pcontinuous Fitting_core.
-Proof.
-move=> gT rT G D f; have nsGF_G := Fcore_normal G.
-suffices hall_fGF: \pi(G`_\F).-Hall(f @* (D :&: G)) (f @* (D :&: G`_\F)).
- rewrite !morphimIdom in hall_fGF.
- by rewrite (Fcore_max hall_fGF) ?morphim_normal // morphim_nil ?Fcore_nil.
-rewrite morphim_pHall ?subsetIl //= -{2}(setIidPr (Fcore_sub G)) setIA.
-by rewrite !(setIC (D :&: G)) (setI_normal_Hall nsGF_G) ?subsetIr ?Fcore_Hall.
-Qed.
-
-Canonical Structure Fcore_igFun := [igFun by Fcore_sub & morphim_Fcore].
-Canonical Structure Fcore_gFun := [gFun by morphim_Fcore].
-Canonical Structure Fcore_pgFun := [pgFun by morphim_Fcore].
-
-Section MoreFittingCore.
-
-Variables (gT rT : finGroupType) (D : {group gT}) (f : {morphism D >-> rT}).
-Implicit Types (M H : {group gT}) (R : {group rT}).
-
-Lemma Fcore_char M : M`_\F \char M. Proof. exact: gFchar. Qed.
-
-Lemma FcoreJ M x : (M :^ x)`_\F = M`_\F :^ x.
-Proof.
-rewrite -{1}(setTI M) -morphim_conj.
-by rewrite -injmF ?injm_conj ?subsetT // morphim_conj setTI.
-Qed.
-
-Lemma injm_Fcore M : 'injm f -> M \subset D -> f @* M`_\F = (f @* M)`_\F.
-Proof. by move=> injf sMD; rewrite injmF. Qed.
-
-Lemma isom_Fcore M R : isom M R f -> M \subset D -> isom M`_\F R`_\F f.
-Proof. by move=> isoMR sMD; apply: gFisom. Qed.
-
-Lemma isog_Fcore M R : M \isog R -> M`_\F \isog R`_\F.
-Proof. by move=> isoMR; apply: gFisog. Qed.
-
-End MoreFittingCore.
-
-Section Section15.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Implicit Types p q q_star r : nat.
-Implicit Types x y z : gT.
-Implicit Types A E H K L M Mstar N P Q Qstar R S T U V W X Y Z : {group gT}.
-
-Lemma Fcore_sub_Msigma M : M \in 'M -> M`_\F \subset M`_\sigma.
-Proof.
-move=> maxM; rewrite gen_subG.
-apply/bigcupsP=> P /andP[/SylowP[p _ sylP] nsPM]; have [sPM pP _] := and3P sylP.
-have [-> | ntP] := eqsVneq P 1; first exact: sub1G.
-rewrite (sub_Hall_pcore (Msigma_Hall maxM)) // (pi_pgroup pP) //.
-by apply/exists_inP; exists P; rewrite ?(mmax_normal maxM).
-Qed.
-
-Lemma Fcore_eq_Msigma M :
- M \in 'M -> reflect (M`_\F = M`_\sigma) (nilpotent M`_\sigma).
-Proof.
-move=> maxM; apply: (iffP idP) => [nilMs | <-]; last exact: Fcore_nil.
-apply/eqP; rewrite eqEsubset Fcore_sub_Msigma //.
-by rewrite (Fcore_max (Msigma_Hall maxM)) ?pcore_normal.
-Qed.
-
-(* This is B & G, Lemma 15.1. *)
-(* We have made all semidirect products explicits, and omitted the assertion *)
-(* M`_\sigma \subset M^`(1), which is exactly covered by Msigma_der1. *)
-(* Some refactoring is definitely needed here, to avoid the mindless cut *)
-(* and paste of a large fragment of the proof of Lemma 12.12. *)
-Lemma kappa_structure M U K (Ms := M`_\sigma) :
- M \in 'M -> kappa_complement M U K ->
- [/\ (*a*) [/\ (Ms ><| U) ><| K = M, cyclic K & abelian (M^`(1) / Ms)],
- (*b*) K :!=: 1 -> Ms ><| U = M^`(1) /\ abelian U,
- (*c*) forall X, X \subset U -> X :!=: 1 -> 'C_Ms(X) != 1 ->
- [/\ 'M('C(X)) = [set M], cyclic X & \tau2(M).-group X],
- (*d*) abelian <<\bigcup_(x in Ms^#) 'C_U[x]>>
- & (*e*) U :!=: 1 -> exists U0,
- [/\ gval U0 \subset U, exponent (gval U0) = exponent U
- & [Frobenius Ms <*> U0 = Ms ><| U0]]].
-Proof.
-move=> maxM complU; have [hallU hallK _] := complU.
-have [hallE defM _ regUK cUU] := kappa_compl_context maxM complU.
-have [[_ E _ defE]] := sdprodP defM.
-have [nsUE sKE mulUK nUK tiUK] := sdprod_context defE.
-rewrite defE -{1 2}mulUK mulgA => defMl /mulGsubP[nMsU nMsK] tiMsE.
-have [/andP[sMsM nMsM] [sUE nUE]] := (pcore_normal _ M : Ms <| M, andP nsUE).
-rewrite norm_joinEr // mulUK in hallE.
-have [[sEM s'M_E _] [sUM sk'U _]] := (and3P hallE, and3P hallU).
-have defMsU: Ms ><| U = Ms <*> U.
- by apply: sdprodEY nMsU (trivgP _); rewrite -tiMsE -mulUK setIS ?mulG_subl.
-have{defM} defM: Ms <*> U ><| K = M.
- rewrite sdprodE ?normsY ?coprime_TIg //=; first by rewrite norm_joinEr.
- rewrite -(sdprod_card defMsU) coprime_mull andbC regular_norm_coprime //=.
- by rewrite (coprimegS sKE) ?(pnat_coprime (pcore_pgroup _ _)).
-rewrite defMsU quotient_der //= -/Ms -{2}defMl -mulgA mulUK.
-rewrite quotientMidl -quotient_der ?(subset_trans sEM) //.
-rewrite quotient_abelian ?(der_mmax_compl_abelian maxM hallE) //.
-set part_c := forall U, _; have c_holds: part_c.
- move=> X sXU ntX nregMsX; have sXE := subset_trans sXU sUE.
- have [x /setIP[Ms_x cXx] ntx] := trivgPn _ nregMsX.
- have Ms1x: x \in Ms^# by apply/setD1P.
- have piCx_hyp: {in X^#, forall x', x' \in ('C_M[x])^# /\ \sigma(M)^'.-elt x'}.
- move=> x' /setD1P[ntx' Xx']; have Ex' := subsetP sXE x' Xx'.
- rewrite 3!inE ntx' (subsetP sEM) ?(mem_p_elt s'M_E) //=.
- by rewrite (subsetP _ _ Xx') ?sub_cent1.
- have piCx x' X1x' := (* GG -- ssreflect evar generalization fails in trunk *)
- let: conj c e := piCx_hyp x' X1x' in pi_of_cent_sigma maxM Ms1x c e.
- have t2X: \tau2(M).-group X.
- apply/pgroupP=> p p_pr /Cauchy[] // x' Xx' ox'.
- have X1x': x' \in X^# by rewrite !inE Xx' -order_gt1 ox' prime_gt1.
- have [[]|[]] := piCx _ X1x'; last by rewrite /p_elt ox' pnatE.
- case/idPn; have:= mem_p_elt (pgroupS sXU sk'U) Xx'.
- by rewrite /p_elt ox' !pnatE // => /norP[].
- suffices cycX: cyclic X.
- split=> //; have [x' defX] := cyclicP cycX.
- have X1x': x' \in X^# by rewrite !inE -cycle_eq1 -cycle_subG -defX ntX /=.
- have [[kX _]|[_ _]] := piCx _ X1x'; last by rewrite defX cent_cycle.
- rewrite -(setIid X) coprime_TIg ?eqxx // {2}defX in ntX.
- rewrite (pnat_coprime t2X (sub_pgroup _ kX)) // => p kp.
- by rewrite inE /= negb_and rank_kappa ?orbT.
- have [E2 hallE2 sXE2] := Hall_superset (sigma_compl_sol hallE) sXE t2X.
- rewrite abelian_rank1_cyclic; last first.
- exact: abelianS sXE2 (tau2_compl_abelian maxM hallE hallE2).
- have [p _ ->] := rank_witness X; rewrite leqNgt; apply: contra nregMsX => rpX.
- have t2p: p \in \tau2(M) by rewrite (pnatPpi t2X) // -p_rank_gt0 ltnW.
- rewrite -(setIidPr (subset_trans sXE sEM)) in rpX.
- case/p_rank_geP: rpX => A; rewrite pnElemI -setIdE; case/setIdP=> Ep2A sAX.
- rewrite -subG1; have [_ _ <- _ _] := tau2_context maxM t2p Ep2A.
- by rewrite setIS ?centS.
-have hallU_E: Hall E U := pHall_Hall (pHall_subl sUE sEM hallU).
-have UtypeF := FTtypeF_complement maxM hallE hallU_E nsUE.
-set k'U13 := ({in _, _}) in UtypeF.
-have/UtypeF{UtypeF k'U13}UtypeF: k'U13.
- move=> x /setD1P[]; rewrite -order_gt1 -pi_pdiv.
- set p := pdiv _ => pi_x_p Ux t13x.
- apply: contraNeq (pnatPpi (mem_p_elt sk'U Ux) pi_x_p) => nreg_x.
- apply/orP; right; rewrite unlock /= inE /= (pnatPpi t13x) //=.
- have sxM: <[x]> \subset M by rewrite cycle_subG (subsetP sUM).
- move: pi_x_p; rewrite -p_rank_gt0 /= -(setIidPr sxM) => /p_rank_geP[P].
- rewrite pnElemI -setIdE => /setIdP[EpP sPx]; apply/exists_inP; exists P => //.
- by rewrite (subG1_contra _ nreg_x) //= -cent_cycle setIS ?centS.
-have [K1 | ntK] := altP (K :=P: 1).
- rewrite {2}K1 cyclic1; rewrite K1 mulg1 in mulUK; rewrite -mulUK in hallE.
- have ltM'M := sol_der1_proper (mmax_sol maxM) (subxx _) (mmax_neq1 maxM).
- suffices /UtypeF[[A0 [_ abA0 genA0]] frobM]: U :!=: 1.
- by split => //; apply: abelianS abA0; rewrite gen_subG; apply/bigcupsP.
- apply: contraNneq (proper_subn ltM'M); rewrite -{1}defMl => ->.
- by rewrite K1 !mulg1 Msigma_der1.
-have PmaxM: M \in 'M_'P by rewrite inE maxM -(trivg_kappa maxM hallK) andbT.
-have [_ _ [_ _ _ [cycZ _ _ _ _] [_ _ _ defM']]] := Ptype_embedding PmaxM hallK.
-have{cycZ cUU} [cycK cUU] := (cyclicS (joing_subl _ _) cycZ, cUU ntK).
-split=> // [_||/UtypeF[] //]; first split=> //.
- apply/eqP; rewrite eq_sym eqEcard -(leq_pmul2r (cardG_gt0 K)).
- have [nsMsU_M _ mulMsU _ _] := sdprod_context defM.
- rewrite (sdprod_card defM) (sdprod_card defM') der1_min ?normal_norm //=.
- by rewrite -(isog_abelian (sdprod_isog defM)) cyclic_abelian.
-by apply: abelianS cUU; rewrite gen_subG -big_distrr subsetIl.
-Qed.
-
-(* This is B & G, Theorem 15.2. *)
-(* It is this theorem that implies that the non-functorial definition of *)
-(* M`_\sigma used in B & G is equivalent to the original definition in FT *)
-(* (also used in Peterfalvi). *)
-(* Proof notes: this proof contained two non-structural arguments: taking D *)
-(* to be K-invariant, and reusing the nilpotent Frobenius kernel argument for *)
-(* Q1 (bottom of p. 118). We handled the first with a "without loss", but for *)
-(* the second we had to spell out explicitly the assumptions and conclusions *)
-(* of the nilpotent kernel argument that were spread throughout the last *)
-(* paragraph p. 118. *)
-(* We also had to make a few additions to the argument at the top of p. 119; *)
-(* while the statement of the Theorem states that F(M) = C_M(Qbar), the text *)
-(* only shows that F(M) = C_Msigma(Qbar), and we need to show that K acts *)
-(* regularly on Qbar to complete the proof; this follows from the values of *)
-(* orders of K, Kstar and Qbar. In addition we need to show much earlier *)
-(* that K acts faithfully on Q, to show that C_M(Q) is included in Ms, and *)
-(* this requires a use of 14.2(e) not mentioned in the text; in addition, the *)
-(* reference to coprime action (Proposition 1.5) on p. 119 l. 1 is somewhat *)
-(* misleading, since we actually need to use the coprime stabilizer Lemma 1.9 *)
-(* to show that C_D(Qbar) = C_D(Q) = 1 (unless we splice in the proof of that *)
-(* lemma). *)
-Theorem Fcore_structure M (Ms := M`_\sigma) :
- M \in 'M ->
- [/\ M`_\F != 1, M`_\F \subset Ms, Ms \subset M^`(1) & M^`(1) \proper M]
- /\ (forall K D : {group gT},
- \kappa(M).-Hall(M) K -> M`_\F != M`_\sigma ->
- let p := #|K| in let Ks := 'C_Ms(K) in
- let q := #|Ks| in let Q := 'O_q(M) in
- let Q0 := 'C_Q(D) in let Qbar := Q / Q0 in
- q^'.-Hall(M`_\sigma) D ->
- [/\ (*a*) [/\ M \in 'M_'P1, Ms ><| K = M & Ms = M ^`(1)],
- (*b*) [/\ prime p, prime q, q \in \pi(M`_\F) & q \in \beta(M)],
- [/\ (*c*) q.-Sylow(M) Q,
- (*d*) nilpotent D
- & (*e*) Q0 <| M],
- (*f*) [/\ minnormal Qbar (M / Q0), q.-abelem Qbar & #|Qbar| = (q ^ p)%N]
- & (*g*) [/\ Ms^`(1) = M^`(2),
- M^`(2) \subset 'F(M),
- [/\ Q <*> 'C_M(Q) = 'F(M),
- 'C_M(Qbar | 'Q) = 'F(M)
- & 'C_Ms (Ks / Q0 | 'Q) = 'F(M)]
- & 'F(M) \proper Ms]]).
-Proof.
-move=> maxM; set M' := M^`(1); set M'' := M^`(2).
-have nsMsM: Ms <| M := pcore_normal _ M; have [sMsM nMsM] := andP nsMsM.
-have solM := mmax_sol maxM; have solMs: solvable Ms := solvableS sMsM solM.
-have sMF_Ms: M`_\F \subset Ms := Fcore_sub_Msigma maxM.
-have ltM'M: M' \proper M by rewrite (sol_der1_proper solM) ?mmax_neq1.
-have sMsM': Ms \subset M' := Msigma_der1 maxM.
-have [-> | ltMF_Ms] := eqVproper sMF_Ms; first by rewrite eqxx Msigma_neq1.
-set KDpart := (X in _ /\ X); suffices KD_holds: KDpart.
- do 2!split=> //; have [K hallK] := Hall_exists \kappa(M) solM.
- pose q := #|'C_(M`_\sigma)(K)|; have [D hallD] := Hall_exists q^' solMs.
- have [_ [_ _ piMFq _] _ _ _] := KD_holds K D hallK (proper_neq ltMF_Ms) hallD.
- by rewrite -rank_gt0 (leq_trans _ (p_rank_le_rank q _)) ?p_rank_gt0.
-move=> {KDpart} K D hallK neMF_Ms p Ks q Q /= hallD.
-have not_nilMs: ~~ nilpotent Ms by rewrite (sameP (Fcore_eq_Msigma maxM) eqP).
-have P1maxM: M \in 'M_'P1; last have [PmaxM _] := setIdP P1maxM.
- apply: contraR not_nilMs => notP1maxM; apply: notP1type_Msigma_nil.
- by rewrite orbC inE notP1maxM inE maxM andbT orNb.
-have ntK: K :!=: 1 by rewrite inE maxM andbT -(trivg_kappa maxM hallK) in PmaxM.
-have [defMs defM]: Ms = M' /\ Ms ><| K = M.
- have [U complU] := ex_kappa_compl maxM hallK.
- have U1: U :=: 1 by apply/eqP; rewrite (trivg_kappa_compl maxM complU).
- have [[defM _ _] [//| defM' _] _ _ _] := kappa_structure maxM complU.
- by rewrite U1 sdprodg1 in defM defM'.
-have [_ mulMsK nMsK _] := sdprodP defM; rewrite /= -/Ms in mulMsK nMsK.
-have [sKM kK _] := and3P hallK; have s'K := sub_pgroup (@kappa_sigma' _ _) kK.
-have coMsK: coprime #|Ms| #|K| := pnat_coprime (pcore_pgroup _ _) s'K.
-have q_pr: prime q.
- have [L _ [_ _ _ _ [_]]] := Ptype_embedding PmaxM hallK.
- by rewrite inE P1maxM => [[] []].
-have hallMs: \sigma(M).-Hall(M) Ms := Msigma_Hall maxM.
-have sMq: q \in \sigma(M).
- by rewrite -pnatE // -pgroupE (pgroupS (subsetIl _ _) (pcore_pgroup _ _)).
-have{s'K kK} q'K: q^'.-group K := pi'_p'group s'K sMq.
-have nsQM: Q <| M := pcore_normal q M; have [sQM nQM] := andP nsQM.
-have qQ: q.-group Q := pcore_pgroup _ _.
-have sQMs: Q \subset Ms by rewrite (sub_Hall_pcore hallMs) ?(pi_pgroup qQ).
-have [K1 prK1 sK1K]: exists2 K1, prime #|gval K1| & K1 \subset K.
- have:= ntK; rewrite -rank_gt0; have [r r_pr ->] := rank_witness K.
- by case/p_rank_geP=> K1 /pnElemPcard[? _ oK1]; exists K1; rewrite ?oK1.
-have coMsK1 := coprimegS sK1K coMsK; have coQK1 := coprimeSg sQMs coMsK1.
-have prMsK: semiprime Ms K by have [[? _ []] ] := Ptype_structure PmaxM hallK.
-have defCMsK1: 'C_Ms(K1) = Ks.
- by rewrite (cent_semiprime prMsK) // -cardG_gt1 prime_gt1.
-have sK1M := subset_trans sK1K sKM; have nQK1 := subset_trans sK1M nQM.
-have{sMsM'} sKsQ: Ks \subset Q.
- have defMsK: [~: Ms, K] = Ms by case/coprime_der1_sdprod: defM.
- have hallQ := nilpotent_pcore_Hall q (Fitting_nil M).
- rewrite -[Q]p_core_Fitting (sub_Hall_pcore hallQ) //; first exact: pnat_id.
- apply: prime_meetG => //; apply: contraNneq not_nilMs => tiKsFM.
- suffices <-: 'F(Ms) = Ms by apply: Fitting_nil.
- apply/eqP; rewrite eqEsubset Fitting_sub /= -{1}defMsK.
- rewrite (odd_sdprod_primact_commg_sub_Fitting defM) ?mFT_odd //.
- apply/trivgP; rewrite -tiKsFM setIAC setSI //= -/Ms subsetI Fitting_sub /=.
- by rewrite Fitting_max ?Fitting_nil // gFnormal_trans.
-have nilMs_Q: nilpotent (Ms / Q).
- have [nMsK1 tiQK1] := (subset_trans sK1K nMsK, coprime_TIg coQK1).
- have prK1b: prime #|K1 / Q| by rewrite -(card_isog (quotient_isog _ _)).
- have defMsK1: (Ms / Q) ><| (K1 / Q) = (Ms / Q) <*> (K1 / Q).
- by rewrite sdprodEY ?quotient_norms // coprime_TIg ?coprime_morph.
- apply: (prime_Frobenius_sol_kernel_nil defMsK1) => //.
- by rewrite (solvableS _ (quotient_sol _ solM)) ?join_subG ?quotientS.
- by rewrite -coprime_quotient_cent ?quotientS1 /= ?defCMsK1.
-have defQ: 'O_q(Ms) = Q by rewrite -(setIidPl sQMs) pcore_setI_normal.
-have sylQ: q.-Sylow(Ms) Q.
- have nsQMs: Q <| Ms by rewrite -defQ pcore_normal.
- rewrite -(pquotient_pHall qQ) // /= -/Q -{3}defQ.
- by rewrite -(pquotient_pcore _ qQ) ?nilpotent_pcore_Hall.
-have{sMq hallMs} sylQ_M := subHall_Sylow hallMs sMq sylQ.
-have sQ_MF: Q \subset M`_\F.
- by rewrite sub_gen ?(bigcup_max [group of Q]) ?(p_Sylow sylQ_M) ?pcore_normal.
-have{sQ_MF} piMFq: q \in \pi(M`_\F).
- by rewrite (piSg sQ_MF) // (piSg sKsQ) // pi_of_prime ?inE /=.
-without loss nDK: D hallD / K \subset 'N(D).
- have [E hallE nEK] := coprime_Hall_exists q^' nMsK coMsK solMs.
- have [x Ms_x ->] := Hall_trans solMs hallD hallE.
- set Q0 := 'C__(_)%G; rewrite -(isog_nil (conj_isog _ _)) -['C_Q(_)]/(gval Q0).
- move/(_ E hallE nEK)=> IH; suffices ->: Q0 = [group of 'C_Q(E)] by [].
- apply: group_inj => /=; have Mx: x \in M := subsetP (pcore_sub _ _) x Ms_x.
- rewrite /= -/Q -{1}(normsP nQM x Mx) centJ -conjIg (normsP _ x Mx) //.
- by case: IH => _ _ [_ _]; case/andP.
-set Q0 := 'C_Q(D); set Qb := Q / Q0.
-have defQD: Q ><| D = Ms by rewrite -defQ in sylQ *; apply/sdprod_Hall_pcoreP.
-have [_ mulQD nQD tiQD] := sdprodP defQD; rewrite /= -/Q -/Ms in mulQD nQD tiQD.
-have nilD: nilpotent D.
- by rewrite (isog_nil (quotient_isog nQD tiQD)) /= -quotientMidl mulQD.
-have [sDMs q'D _] := and3P hallD; have sDM := subset_trans sDMs sMsM.
-have sDKM: D <*> K \subset M by rewrite join_subG sDM.
-have q'DK: q^'.-group (D <*> K) by rewrite norm_joinEr // pgroupM q'D.
-have{K1 sK1M sK1K coMsK1 coQK1 prK1 defCMsK1 nQK1 solMs} Qi_rec Qi:
- Qi \in |/|_Q(D <*> K; q) -> Q0 \subset Qi -> Qi \proper Q ->
- exists L, [/\ L \in |/|_Q(D <*> K; q), Qi <| L, minnormal (L / Qi) (M / Qi)
- & ~~ ((Ks \subset L) ==> (Ks \subset Qi))].
-- case/setIdP=> /andP[sQiQ qQi] nQiDK sQ0i ltQiQ.
- have ltQiN := nilpotent_proper_norm (pgroup_nil qQ) ltQiQ.
- have [Lb minLb sLbQ]: {Lb | minnormal (gval Lb) (M / Qi) & Lb \subset Q / Qi}.
- apply: mingroup_exists; rewrite quotient_norms //= andbT -quotientInorm.
- by rewrite -subG1 quotient_sub1 ?subsetIr // proper_subn.
- have [ntLb nLbM] := andP (mingroupp minLb).
- have nsQiN: Qi <| 'N_M(Qi) by rewrite normal_subnorm (subset_trans sQiQ).
- have: Lb <| 'N_M(Qi) / Qi.
- by rewrite quotientInorm /normal (subset_trans sLbQ) ?quotientS.
- case/(inv_quotientN nsQiN) => L defLb sQij /=; case/andP.
- case/subsetIP=> sLM nQij nLN; exists L.
- have{sLbQ} sLQ: L \subset Q by rewrite -(quotientSGK nQij sQiQ) -defLb.
- rewrite inE /psubgroup /normal sLQ sQij nQij (pgroupS sLQ qQ) -defLb.
- have nLDK: D <*> K \subset 'N(L) by apply: subset_trans nLN; apply/subsetIP.
- have sLD_Ms: L <*> D \subset Ms by rewrite join_subG (subset_trans sLQ).
- have coLD_K1: coprime #|L <*> D| #|K1| := coprimeSg sLD_Ms coMsK1.
- have [[nQiD nQiK] [nLD nLK]] := (joing_subP nQiDK, joing_subP nLDK).
- have [nQiK1 nLK1] := (subset_trans sK1K nQiK, subset_trans sK1K nLK).
- split=> //; apply: contra ntLb => regLK.
- have [sLLD sDLD] := joing_subP (subxx (L <*> D)).
- suffices nilLDbar: nilpotent (L <*> D / Qi).
- rewrite defLb -subG1 -(quotientS1 sQ0i) /= -/Q.
- rewrite coprime_quotient_cent ?(pgroup_sol qQ) ?(pnat_coprime qQ) //=.
- rewrite subsetI quotientS //= (sub_nilpotent_cent2 nilLDbar) ?quotientS //.
- by rewrite coprime_morph ?(p'nat_coprime q'D (pgroupS sLQ qQ)).
- have defLK1b: (L <*> D / Qi) ><| (K1 / Qi) = (L <*> D / Qi) <*> (K1 / Qi).
- rewrite sdprodEY ?coprime_TIg ?quotient_norms //=.
- by rewrite (subset_trans sK1K) // normsY.
- by rewrite coprime_morph // (coprimeSg sLD_Ms).
- have [sQiLD sLD_M] := (subset_trans sQij sLLD, subset_trans sLD_Ms sMsM).
- have{regLK}: 'C_(L <*> D / Qi)(K1 / Qi) = 1.
- rewrite -coprime_quotient_cent ?(subset_trans sK1K) ?(solvableS sLD_M) //=.
- rewrite -(setIidPr sLD_Ms) setIAC defCMsK1 quotientS1 //= -/Ks joingC.
- rewrite norm_joinEl // -(setIidPl sKsQ) -setIA -group_modr // tiQD mul1g.
- have [-> | ntLKs] := eqVneq (Ks :&: L) 1; first exact: sub1G.
- by rewrite subIset ?(implyP regLK) // prime_meetG.
- apply: (prime_Frobenius_sol_kernel_nil defLK1b).
- by apply: solvableS (quotient_sol _ solM); rewrite join_subG !quotientS.
- by rewrite -(card_isog (quotient_isog _ _)) ?coprime_TIg // (coprimeSg sQiQ).
-have ltQ0Q: Q0 \proper Q.
- rewrite properEneq subsetIl andbT; apply: contraNneq not_nilMs => defQ0.
- rewrite -dprodEsd // in defQD; last by rewrite centsC -defQ0 subsetIr.
- by rewrite (dprod_nil defQD) (pgroup_nil qQ).
-have [nQK coQK] := (subset_trans sKM nQM, pnat_coprime qQ q'K).
-have solQ := pgroup_sol qQ. (* must come late: Coq diverges on solQ <> solMs *)
-have [coDK coQD] := (coprimeSg sDMs coMsK, pnat_coprime qQ q'D).
-have nQ0K: K \subset 'N(Q0) by rewrite normsI ?norms_cent.
-have nQ0D: D \subset 'N(Q0) by rewrite cents_norm // centsC subsetIr.
-have nQ0DK: D <*> K \subset 'N(Q0) by apply/joing_subP.
-have [|Q1 [DKinvQ1 nsQ01 minQ1b nregQ1b]] := Qi_rec _ _ (subxx _) ltQ0Q.
- by rewrite inE /psubgroup (pgroupS _ qQ) ?subsetIl.
-have{Qi_rec nregQ1b DKinvQ1} [tiQ0Ks defQ1]: Q0 :&: Ks = 1 /\ Q1 :=: Q.
- move: nregQ1b; rewrite negb_imply; case/andP=> sKsQ1 not_sKsQ0.
- split=> //; first by rewrite setIC prime_TIg.
- have [] := setIdP DKinvQ1; case/andP; case/eqVproper=> // ltQ1Q _ _.
- have [Q2 [_ _ _]] := Qi_rec Q1 DKinvQ1 (normal_sub nsQ01) ltQ1Q.
- by rewrite sKsQ1 implybT.
-have [nsQ0Q minQb]: Q0 <| Q /\ minnormal Qb (M / Q0) by rewrite /Qb -defQ1.
-have{Q1 defQ1 minQ1b nsQ01} abelQb: q.-abelem Qb.
- have qQb: q.-group Qb := quotient_pgroup _ qQ; have solQb := pgroup_sol qQb.
- by rewrite -is_abelem_pgroup // (minnormal_solvable_abelem minQb).
-have [cQbQb [sQ0Q nQ0Q]] := (abelem_abelian abelQb, andP nsQ0Q).
-have nQ0M: M \subset 'N(Q0) by rewrite -mulMsK -mulQD -mulgA !mul_subG.
-have nsQ0M: Q0 <| M by rewrite /normal subIset ?sQM.
-have sFM_QCQ: 'F(M) \subset Q <*> 'C_M(Q).
- have [_ /= mulQQ' cQQ' _] := dprodP (nilpotent_pcoreC q (Fitting_nil M)).
- rewrite -{3}mulQQ' p_core_Fitting cent_joinEr ?subsetIr //= -/Q in cQQ' *.
- by rewrite mulgS // subsetI gFsub_trans ?gFsub.
-have sQCQ_CMsQb: Q <*> 'C_M(Q) \subset 'C_Ms(Qb | 'Q).
- rewrite join_subG !(subsetI _ Ms) sQMs /= !sub_astabQ nQ0Q /= -/Q0 -/Qb.
- rewrite -abelianE cQbQb quotient_cents ?subsetIr //= andbC subIset ?nQ0M //=.
- rewrite -(coprime_mulG_setI_norm mulMsK) ?norms_cent //= -/Ms.
- suffices ->: 'C_K(Q) = 1 by rewrite mulg1 subsetIl.
- have: ~~ (Q \subset Ks); last apply: contraNeq => ntCKQ.
- have [_ _ _ [_]] := Ptype_structure PmaxM hallK.
- by move/(_ q); rewrite pi_of_prime //; case/(_ (eqxx q) _ sylQ_M).
- rewrite -[Ks](cent_semiprime prMsK _ ntCKQ) ?subsetIl //.
- by rewrite subsetI sQMs centsC subsetIr.
-have nCQb: M \subset 'N('C(Qb | 'Q)).
- by rewrite (subset_trans _ (astab_norm _ _)) ?actsQ.
-have defFM: 'C_Ms(Qb | 'Q) = 'F(M).
- apply/eqP; rewrite eqEsubset andbC (subset_trans sFM_QCQ) //=.
- rewrite Fitting_max //=; first by rewrite /normal subIset ?sMsM //= normsI.
- rewrite -(coprime_mulG_setI_norm mulQD) ?(subset_trans sMsM) //= -/Q.
- rewrite mulg_nil ?(nilpotentS (subsetIl _ _)) ?(pgroup_nil qQ) //= -/Q.
- rewrite (centsS (subsetIl _ _)) //= -/Q.
- have cDQ0: 'C_D(Qb | 'Q) \subset 'C(Q0) by rewrite subIset // centsC subsetIr.
- rewrite (stable_factor_cent cDQ0) ?(coprimegS (subsetIl _ _) coQD) //.
- by rewrite /stable_factor commGC -sub_astabQR ?subsetIr // subIset ?nQ0D.
-have{sFM_QCQ sQCQ_CMsQb} ->: Q <*> 'C_M(Q) = 'F(M).
- by apply/eqP; rewrite eqEsubset sFM_QCQ andbT -defFM.
-have ltFM_Ms: 'F(M) \proper Ms.
- rewrite properEneq -{2}defFM subsetIl andbT.
- by apply: contraNneq not_nilMs => <-; apply: Fitting_nil.
-have sQFM: Q \subset 'F(M) by rewrite -[Q]p_core_Fitting pcore_sub.
-have not_cDQb: ~~ (D / Q0 \subset 'C(Qb)).
- apply: contra (proper_subn ltFM_Ms) => cDQb; rewrite -mulQD mulG_subG sQFM /=.
- by rewrite -defFM subsetI sDMs sub_astabQ nQ0D.
-have [_ minQbP] := mingroupP minQb.
-have regQbDb: 'C_Qb(D / Q0) = 1.
- apply: contraNeq not_cDQb => ntCQDb; rewrite centsC; apply/setIidPl.
- apply: minQbP (subsetIl _ _); rewrite ntCQDb /= -/Qb -(setIidPl cQbQb) -setIA.
- by rewrite -centM -quotientMl //= mulQD normsI ?norms_cent ?quotient_norms.
-have tiQ0 R: q^'.-group R -> Q0 :&: R = 1.
- by move/(pnat_coprime (pgroupS sQ0Q qQ))/coprime_TIg.
-have oKb: #|K / Q0| = p by rewrite -(card_isog (quotient_isog _ (tiQ0 _ _))).
-have oKsb: #|Ks / Q0| = q.
- by rewrite -(card_isog (quotient_isog _ tiQ0Ks)) ?(subset_trans sKsQ).
-have regDK: 'C_D(K) = 1.
- by rewrite -(setIidPl sDMs) -setIA setIC coprime_TIg ?(coprimeSg sKsQ).
-have{tiQ0} frobDKb: [Frobenius D <*> K / Q0 = (D / Q0) ><| (K / Q0)].
- have ntDb: D / Q0 != 1 by apply: contraNneq not_cDQb => ->; apply: sub1G.
- have ntKb: K / Q0 != 1 by rewrite -(isog_eq1 (quotient_isog _ (tiQ0 _ _))).
- apply/Frobenius_semiregularP => // [|xb].
- by apply: quotient_coprime_sdprod; rewrite ?sdprodEY ?coprime_TIg.
- have [f [_ ker_f _ im_f]] := restrmP (coset_morphism Q0) nQ0DK.
- have{ker_f} inj_f: 'injm f by rewrite ker_f ker_coset setIC tiQ0.
- rewrite /= /quotient -!im_f ?joing_subl ?joing_subr //.
- rewrite 2!inE andbC => /andP[/morphimP[x DKx Kx ->{xb}]].
- rewrite morph_injm_eq1 // -injm_subcent1 ?joing_subl // => ntx.
- rewrite -{3}(setIidPl sDMs) -setIA prMsK ?inE ?ntx //.
- by rewrite setICA regDK setIg1 morphim1.
-have defKsb: 'C_Qb(K / Q0) = Ks / Q0.
- rewrite /Ks -mulQD coprime_cent_mulG // regDK mulg1.
- by rewrite coprime_quotient_cent ?subsetIl.
-have{frobDKb regQbDb} [p_pr oQb cQbD']:
- [/\ prime p, #|Qb| = (q ^ p)%N & (D / Q0)^`(1) \subset 'C(Qb)].
-- have ntQb: Qb != 1 by rewrite -subG1 quotient_sub1 ?proper_subn.
- have prQbK: semiprime Qb (K / Q0).
- move=> xb; rewrite 2!inE andbC; case/andP; case/morphimP=> x nQ0x Kx -> ntx.
- have{ntx} ntx: x != 1 by apply: contraNneq ntx => ->; rewrite morph1.
- transitivity ('C_Q[x] / Q0); last first.
- rewrite -(coprime_quotient_cent (subsetIl Q _) nQ0K coQK solQ) /= -/Q0.
- by rewrite -/Q -(setIidPl sQMs) -!setIA prMsK // !inE ntx.
- rewrite -!cent_cycle -quotient_cycle //; rewrite -!cycle_subG in Kx nQ0x.
- by rewrite coprime_quotient_cent ?(coprimegS Kx).
- have:= Frobenius_primact frobDKb _ _ _ ntQb _ prQbK regQbDb.
- have [nQDK solDK] := (subset_trans sDKM nQM, solvableS sDKM solM).
- rewrite !quotient_sol ?quotient_norms // coprime_morph ?(pnat_coprime qQ) //=.
- rewrite -/Qb oKb defKsb prime_cyclic oKsb // subsetI der_sub /=.
- by case=> //= -> -> ->.
-have{cQbD'} sM''FM: M'' \subset 'F(M).
- have nQMs := subset_trans sMsM nQM.
- rewrite [M'']dergSn -/M' -defMs -(quotientSGK _ sQFM) ?comm_subG //.
- rewrite (quotient_der 1) //= -/Ms -mulQD quotientMidl -quotient_der //= -/Q.
- by rewrite quotientS // -defFM subsetI sub_astabQ !comm_subG ?quotient_der.
-have sQ0Ms := subset_trans sQ0Q sQMs.
-have ->: 'C_Ms(Ks / Q0 | 'Q) = 'F(M).
- have sFMcKsb: 'F(M) \subset 'C_Ms(Ks / Q0 | 'Q).
- by rewrite -defFM setIS ?astabS ?quotientS.
- have nCMsKsbM: M \subset 'N('C_Ms(Ks / Q0 | 'Q)).
- rewrite -{1}mulMsK mulG_subG sub_der1_norm ?subsetIl //= -/Ms; last first.
- by rewrite {1}defMs (subset_trans sM''FM sFMcKsb).
- rewrite normsI // (subset_trans _ (astab_norm _ _)) ?actsQ //.
- by rewrite cents_norm // centsC subsetIr.
- apply/eqP; rewrite eqEsubset sFMcKsb -defFM subsetI subsetIl.
- rewrite sub_astabQ /= -/Q0 subIset ?(subset_trans sMsM) //= andbT centsC.
- apply/setIidPl; apply: minQbP (subsetIl _ _).
- rewrite andbC normsI ?norms_cent ?quotient_norms //= -/Qb.
- have: Ks / Q0 != 1 by rewrite -cardG_gt1 oKsb prime_gt1.
- apply: subG1_contra; rewrite (quotientGI _ sQ0Ms) quotient_astabQ /= -/Q0.
- by rewrite subsetI quotientS // centsC subsetIr.
-have ->: 'C_M(Qb | 'Q) = 'F(M).
- apply/eqP; rewrite eqEsubset -{2}defFM setSI //= andbT.
- rewrite -(coprime_mulG_setI_norm mulMsK) //= -defFM mulG_subG subxx /=.
- rewrite subsetI subsetIr -(quotientSGK _ sQ0Ms) 1?subIset ?nQ0K //= -/Q0.
- rewrite quotientIG; last by rewrite sub_astabQ normG trivg_quotient sub1G.
- rewrite quotient_astabQ /= -/Q0 prime_TIg ?sub1G ?oKb //.
- rewrite centsC -subsetIidl defKsb; apply: contra (@subset_leq_card _ _ _) _.
- by rewrite -ltnNge oQb oKsb (ltn_exp2l 1) prime_gt1.
-suffices ->: q \in \beta(M) by do 2!split=> //; last rewrite {1}defMs.
-apply: contraR not_cDQb; rewrite negb_forall_in; case/exists_inP=> Q1 sylQ1.
-rewrite negbK {Q1 sylQ1}(eq_Hall_pcore sylQ_M sylQ1) -/Q => nnQ.
-have sD_DK': D \subset (D <*> K)^`(1).
- rewrite -{1}(coprime_cent_prod nDK) ?nilpotent_sol // regDK mulg1.
- by rewrite commgSS ?joing_subl ?joing_subr.
-rewrite quotient_cents // (subset_trans sD_DK') //.
-have nQDK := subset_trans sDKM nQM; have nCQDK := norms_cent nQDK.
-rewrite der1_min // -(isog_abelian (second_isog nCQDK)) setIC /=.
-rewrite -ker_conj_aut (isog_abelian (first_isog_loc _ _)) //=; set A := _ @* _.
-have norm_q := normal_norm (pcore_normal q _).
-rewrite {norm_q}(isog_abelian (quotient_isog (norm_q _ _) _)) /=; last first.
- by rewrite coprime_TIg ?coprime_morphr //= (pnat_coprime (pcore_pgroup q _)).
-have AutA: A \subset [Aut Q] := Aut_conj_aut _ _.
-have [|//] := Aut_narrow qQ (mFT_odd _) nnQ _ AutA (morphim_odd _ (mFT_odd _)).
-exact: morphim_sol (solvableS sDKM solM).
-Qed.
-
-(* This is B & G, Corollary 15.3(a). *)
-Corollary cent_Hall_sigma_sdprod M H pi :
- M \in 'M -> pi.-Hall(M`_\sigma) H -> H :!=: 1 ->
- exists X, [/\ gval X \subset M, cyclic X, \tau2(M).-group X
- & 'C_(M`_\sigma)(H) ><| X = 'C_M(H)].
-Proof.
-move=> maxM hallH ntH; have hallMs := Msigma_Hall maxM.
-have nsMsM: M`_\sigma <| M := pcore_normal _ M; have [sMsM nMsM] := andP nsMsM.
-have sMs := pHall_pgroup hallMs; have [sHMs piH _] := and3P hallH.
-have k'CH: \kappa(M)^'.-group 'C_M(H).
- apply/idPn; rewrite negb_and cardG_gt0 all_predC negbK => /hasP[p piCHp kMp].
- have PmaxM: M \in 'M_'P by apply/PtypeP; split; last exists p.
- have [X]: exists X, X \in 'E_p^1('C_M(H)).
- by apply/p_rank_geP; rewrite p_rank_gt0.
- case/pnElemP; case/subsetIP=> sXM cHX abelX dimX; have [pX _] := andP abelX.
- have [K hallK sXK] := Hall_superset (mmax_sol maxM) sXM (pi_pgroup pX kMp).
- have E1X: X \in 'E^1(K) by apply/nElemP; exists p; apply/pnElemP.
- have [q q_pr rqH] := rank_witness H; have [S sylS] := Sylow_exists q H.
- have piSq: q \in \pi(S).
- by rewrite -p_rank_gt0 (p_rank_Sylow sylS) -rqH rank_gt0.
- have [_ [defNK defNX] _ [_ not_sylCP _] _] := Ptype_structure PmaxM hallK.
- have{defNX} [defNX _] := defNX X E1X.
- have [[_ nsKs] [_ mulKKs _ _]] := (dprod_normal2 defNK, dprodP defNK).
- have s'K := sub_pgroup (@kappa_sigma' _ _) (pHall_pgroup hallK).
- have [_ hallKs] := coprime_mulGp_Hall mulKKs s'K (pgroupS (subsetIl _ _) sMs).
- have [sSH _] := andP sylS.
- have sylS_Ms := subHall_Sylow hallH (pnatPpi piH (piSg sSH piSq)) sylS.
- have [sSMs _] := andP sylS_Ms; have sS := pgroupS sSMs sMs.
- have sylS_M := subHall_Sylow hallMs (pnatPpi sS piSq) sylS_Ms.
- have sSKs: S \subset 'C_(M`_\sigma)(K).
- rewrite (sub_normal_Hall hallKs) //= -defNX subsetI (pHall_sub sylS_M) /=.
- by rewrite cents_norm // centsC (centsS sSH).
- by have [_ /negP] := not_sylCP q (piSg sSKs piSq) S sylS_M.
-have solCH := solvableS (subsetIl M 'C(H)) (mmax_sol maxM).
-have [X hallX] := Hall_exists \sigma(M)^' solCH; exists X.
-have nsCsH: 'C_(M`_\sigma)(H) <| 'C_M(H) by rewrite /normal setSI // normsIG.
-have hallCs: \sigma(M).-Hall('C_M(H)) 'C_(M`_\sigma)(H).
- by rewrite -(setIidPl sMsM) -setIA (setI_normal_Hall nsMsM) ?subsetIl.
-rewrite (sdprod_normal_p'HallP nsCsH hallX hallCs).
-have [-> | ntX] := eqsVneq X 1; first by rewrite sub1G cyclic1 pgroup1.
-have [sXCH s'X _] := and3P hallX; have [sXM cHX] := subsetIP sXCH.
-have sk'X: \sigma_kappa(M)^'.-group X.
- apply/pgroupP=> p p_pr p_dv_X; apply/norP=> /=.
- by split; [apply: (pgroupP s'X) | apply: (pgroupP (pgroupS sXCH k'CH))].
-have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
-have [U complU] := ex_kappa_compl maxM hallK; have [hallU _ _] := complU.
-have [a Ma sXaU] := Hall_Jsub (mmax_sol maxM) hallU sXM sk'X.
-have [_ _ cycX _ _] := kappa_structure maxM complU.
-rewrite -(cyclicJ _ a) -(pgroupJ _ _ a); have [||//] := cycX _ sXaU.
- by rewrite -(isog_eq1 (conj_isog X a)).
-rewrite -(normsP nMsM a Ma) centJ -conjIg -(isog_eq1 (conj_isog _ a)).
-by rewrite (subG1_contra _ ntH) // subsetI sHMs centsC.
-Qed.
-
-(* This is B & G, Corollary 15.3(b). *)
-Corollary sigma_Hall_tame M H pi x a :
- M \in 'M -> pi.-Hall(M`_\sigma) H -> x \in H -> x ^ a \in H ->
- exists2 b, b \in 'N_M(H) & x ^ a = x ^ b.
-Proof.
-move=> maxM hallH Hx Hxa; have [sHMs piH _] := and3P hallH.
-have SMxM: M \in 'M_\sigma[x] by rewrite inE maxM cycle_subG (subsetP sHMs).
-have SMxMa: (M :^ a^-1)%G \in 'M_\sigma[x].
- by rewrite inE mmaxJ maxM cycle_subG /= MsigmaJ mem_conjgV (subsetP sHMs).
-have [-> | ntx] := eqVneq x 1; first by exists 1; rewrite ?group1 ?conj1g.
-have ell1x: \ell_\sigma(x) == 1%N.
- by apply/ell_sigma1P; split=> //; apply/set0Pn; exists M.
-have ntH: H :!=: 1 by apply/trivgPn; exists x.
-have [[transR _ _ _] _] := FT_signalizer_context ell1x.
-have [c Rc defMc] := atransP2 transR SMxM SMxMa.
-pose b := c * a; have def_xa: x ^ a = x ^ b.
- by have [_ cxc] := setIP Rc; rewrite conjgM {3}/conjg -(cent1P cxc) mulKg.
-have Mb: b \in M.
- by rewrite -(norm_mmax maxM) inE conjsgM -(congr_group defMc) actKV.
-have nsMsM: M`_\sigma <| M := pcore_normal _ _; have [sMsM _] := andP nsMsM.
-have [nsHM | not_nsHM] := boolP (H <| M).
- by exists b; rewrite // (mmax_normal maxM) ?setIid.
-have neqMFs: M`_\F != M`_\sigma.
- apply: contraNneq not_nsHM => /(Fcore_eq_Msigma maxM)nilMs.
- by rewrite (nilpotent_Hall_pcore nilMs hallH) gFnormal_trans.
-have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
-pose q := #|'C_(M`_\sigma)(K)|.
-have [D hallD] := Hall_exists q^' (solvableS sMsM (mmax_sol maxM)).
-have [[_ sMFs _ _]] := Fcore_structure maxM; case/(_ K D) => //; rewrite -/q.
-set Q := 'O_q(M) => _ [_ q_pr piMFq _] [sylQ nilD _] _ _.
-have sQMs: Q \subset M`_\sigma.
- by apply: subset_trans sMFs; rewrite -[Q](p_core_Fcore piMFq) pcore_sub.
-have sylQ_Ms: q.-Hall(M`_\sigma) Q := pHall_subl sQMs sMsM sylQ.
-have nsQM: Q <| M := pcore_normal q M; have [_ qQ _] := and3P sylQ.
-have nsQ_Ms: Q <| M`_\sigma := normalS sQMs sMsM nsQM.
-have defMs: Q ><| D = M`_\sigma := sdprod_normal_p'HallP nsQ_Ms hallD sylQ_Ms.
-have [_ mulQD nQD tiQD] := sdprodP defMs; rewrite -/Q in mulQD nQD tiQD.
-have nQH := subset_trans sHMs (normal_norm nsQ_Ms).
-have nsQHM: Q <*> H <| M.
- rewrite -(quotientGK nsQM) -quotientYK // cosetpre_normal //= -/Q.
- suffices ->: H / Q = 'O_pi(M`_\sigma / Q).
- by rewrite gFnormal_trans ?quotient_normal.
- apply: nilpotent_Hall_pcore; last exact: quotient_pHall.
- by rewrite /= -mulQD quotientMidl -(isog_nil (quotient_isog _ _)).
-have tiQH: Q :&: H = 1.
- apply: coprime_TIg (p'nat_coprime (pi_pgroup qQ _) piH).
- apply: contra not_nsHM => pi_q; rewrite (joing_idPr _) // in nsQHM.
- by rewrite (normal_sub_max_pgroup (Hall_max hallH)) ?(pi_pgroup qQ).
-have defM: Q * 'N_M(H) = M.
- have hallH_QH: pi.-Hall(Q <*> H) H.
- by rewrite (pHall_subl (joing_subr _ _) _ hallH) // join_subG sQMs.
- have solQH := solvableS (normal_sub nsQHM) (mmax_sol maxM).
- rewrite -[RHS](Hall_Frattini_arg solQH nsQHM hallH_QH) /= norm_joinEr //.
- by rewrite -mulgA [H * _]mulSGid // subsetI (subset_trans sHMs sMsM) normG.
-rewrite -defM in Mb; case/mulsgP: Mb => z n Qz Nn defb; exists n => //.
-rewrite def_xa defb conjgM [x ^ z](conjg_fixP _) // -in_set1 -set1gE -tiQH.
-rewrite inE {1}commgEr groupMr // -mem_conjgV groupV /=.
-rewrite (normsP (normal_norm nsQM)) ?Qz; last first.
- by rewrite groupV (subsetP sMsM) // (subsetP sHMs).
-rewrite commgEl groupMl ?groupV //= -(conjsgK n H) mem_conjgV -conjgM -defb.
-by have [_ nHn] := setIP Nn; rewrite (normP nHn) -def_xa.
-Qed.
-
-(* This is B & G, Corollary 15.4. *)
-(* This result does not appear to be needed for the actual proof. *)
-Corollary nilpotent_Hall_sigma H :
- nilpotent H -> Hall G H -> exists2 M, M \in 'M & H \subset M`_\sigma.
-Proof.
-move=> nilH /Hall_pi/=hallH; have [_ piH _] := and3P hallH.
-have [-> | ntH] := eqsVneq H 1.
- by have [M maxM] := any_mmax gT; exists M; rewrite ?sub1G.
-pose p := pdiv #|H|; have piHp: p \in \pi(H) by rewrite pi_pdiv cardG_gt1.
-pose S := 'O_p(H)%G; have sylS: p.-Sylow(H) S := nilpotent_pcore_Hall p nilH.
-have [sSH pS _] := and3P sylS.
-have ntS: S :!=: 1 by rewrite -rank_gt0 (rank_Sylow sylS) p_rank_gt0.
-have [M maxNM] := mmax_exists (mFT_norm_proper ntS (mFT_pgroup_proper pS)).
-have [maxM sNM] := setIdP maxNM; exists M => //.
-have sSM: S \subset M := subset_trans (normG _) sNM.
-have sylS_G := subHall_Sylow hallH (pnatPpi piH piHp) sylS.
-have sylS_M := pHall_subl sSM (subsetT M) sylS_G.
-have sMp: p \in \sigma(M) by apply/exists_inP; exists S.
-have sSMs: S \subset M`_\sigma.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) ?(pi_pgroup pS).
-rewrite -(nilpotent_Fitting nilH) FittingEgen gen_subG.
-apply/bigcupsP=> [[q /= _] piHq]; have [-> // | p'q] := eqVneq q p.
-have sylS_Ms := pHall_subl sSMs (pcore_sub _ _) sylS_M.
-have [X [_ cycX t2X defCS]] := cent_Hall_sigma_sdprod maxM sylS_Ms ntS.
-have{defCS} [nCMsCS _ defCS _ _] := sdprod_context defCS.
-have t2'CMs: \tau2(M)^'.-group 'C_(M`_\sigma)(S).
- apply: pgroupS (subsetIl _ _) (sub_pgroup _ (pcore_pgroup _ _)) => r.
- by apply: contraL => /andP[].
-have [hallCMs hallX] := coprime_mulGp_Hall defCS t2'CMs t2X.
-have sHqCS: 'O_q(H) \subset 'C_M(S).
- rewrite (setIidPr (subset_trans (cent_sub _) sNM)).
- rewrite (sub_nilpotent_cent2 nilH) ?pcore_sub //.
- exact: pnat_coprime pS (pi_pgroup (pcore_pgroup _ _) _).
-have [t2q | t2'q] := boolP (q \in \tau2(M)); last first.
- apply: subset_trans (subsetIl _ 'C(S)).
- by rewrite (sub_normal_Hall hallCMs) // (pi_pgroup (pcore_pgroup _ _)).
-have sylHq := nilpotent_pcore_Hall q nilH.
-have sylHq_G := subHall_Sylow hallH (pnatPpi piH piHq) sylHq.
-have sylHq_CS := pHall_subl sHqCS (subsetT _) sylHq_G.
-have [Q sylQ] := Sylow_exists q X; have [sQX _] := andP sylQ.
-have sylQ_CS := subHall_Sylow hallX t2q sylQ.
-case/andP: t2q => _.
-rewrite eqn_leq andbC ltnNge (leq_trans (p_rankS q (subsetT _))) //.
-rewrite -(rank_Sylow sylHq_G) (rank_Sylow sylHq_CS) -(rank_Sylow sylQ_CS).
-by rewrite (leq_trans (rankS sQX)) // -abelian_rank1_cyclic ?cyclic_abelian.
-Qed.
-
-(* This is B & G, Corollary 15.5. *)
-(* We have changed the condition K != 1 to the equivalent M \in 'M_'P, as *)
-(* avoids a spurrious quantification on K. *)
-(* The text is quite misleading here, since Corollary 15.3(a) is needed for *)
-(* bith the nilpotent and the non-nilpotent case -- indeed, it is not really *)
-(* needed in the non-nilpotent case! *)
-Corollary Fitting_structure M (H := M`_\F) (Y := 'O_\sigma(M)^'('F(M))) :
- M \in 'M ->
- [/\ (*a*) cyclic Y /\ \tau2(M).-group Y,
- (*b*) [/\ M^`(2) \subset 'F(M),
- H \* 'C_M(H) = 'F(M)
- & 'F(M`_\sigma) \x Y = 'F(M)],
- (*c*) H \subset M^`(1) /\ nilpotent (M^`(1) / H)
- & (*d*) M \in 'M_'P -> 'F(M) \subset M^`(1)].
-Proof.
-move=> maxM; have nilF := Fitting_nil M.
-have sHF: H \subset 'F(M) := Fcore_sub_Fitting M.
-have nsMsM: M`_\sigma <| M := pcore_normal _ _; have [sMsM nMsM] := andP nsMsM.
-have sMs: \sigma(M).-group M`_\sigma := pcore_pgroup _ _.
-have nsFM: 'F(M) <| M := Fitting_normal M; have [sFM nFM] := andP nsFM.
-have sYF: Y \subset 'F(M) := pcore_sub _ _; have sYM := subset_trans sYF sFM.
-have defF: 'F(M`_\sigma) \x Y = 'F(M).
- rewrite -(nilpotent_pcoreC \sigma(M) nilF); congr (_ \x _).
- apply/eqP; rewrite eqEsubset pcore_max ?(pgroupS (Fitting_sub _)) //=.
- rewrite Fitting_max ?(nilpotentS (pcore_sub _ _)) //=.
- by rewrite -(pcore_setI_normal _ nsFM) norm_normalI ?(subset_trans sMsM).
- rewrite /normal (char_norm_trans (Fitting_char _)) ?(subset_trans sFM) //.
- by rewrite Fitting_max ?Fitting_nil ?gFnormal_trans.
-have [[ntH sHMs sMsM' _] nnil_struct] := Fcore_structure maxM.
-have hallH: \pi(H).-Hall(M`_\sigma) H := pHall_subl sHMs sMsM (Fcore_Hall M).
-have [X [_ cycX t2X defCH]] := cent_Hall_sigma_sdprod maxM hallH ntH.
-have hallX: \sigma(M)^'.-Hall('C_M(H)) X.
- have [_ mulCsH_X _ _] := sdprodP defCH.
- have [|//] := coprime_mulpG_Hall mulCsH_X (pgroupS (subsetIl _ _) sMs).
- by apply: sub_pgroup t2X => p /andP[].
-have sYX: Y \subset X.
- rewrite (normal_sub_max_pgroup (Hall_max hallX)) ?pcore_pgroup //.
- rewrite /normal gFnorm_trans ?subIset ?nFM //= -/Y andbT.
- have [_ _ cFsY _] := dprodP defF.
- rewrite subsetI sYM (sub_nilpotent_cent2 nilF) //= -/Y -/H.
- exact: pnat_coprime (pgroupS sHMs sMs) (pcore_pgroup _ _).
-have [cycY t2Y]: cyclic Y /\ \tau2(M).-group Y.
- by rewrite (cyclicS sYX cycX) (pgroupS sYX t2X).
-have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
-have [U complU] := ex_kappa_compl maxM hallK.
-have [[defM _ cM'M'b] defM' _ _ _] := kappa_structure maxM complU.
-have d_holds: M \in 'M_'P -> 'F(M) \subset M^`(1).
- rewrite inE maxM andbT -(trivg_kappa maxM hallK) => ntK.
- rewrite -(dprodW defF) mulG_subG gFsub_trans //= -/Y.
- have{defM'} [[defM' _] nsM'M] := (defM' ntK, der_normal 1 M).
- have hallM': \kappa(M)^'.-Hall(M) M^`(1).
- by apply/(sdprod_normal_pHallP nsM'M hallK); rewrite /= -defM'.
- rewrite (sub_normal_Hall hallM') ?(sub_pgroup _ t2Y) // => p /andP[_].
- by apply: contraL => /rank_kappa->.
-have defF_H: 'C_M(H) \subset 'F(M) -> H \* 'C_M(H) = 'F(M).
- move=> sCHF; apply/eqP; rewrite cprodE ?subsetIr // eqEsubset ?mul_subG //=.
- have hallH_F := pHall_subl sHF sFM (Fcore_Hall M).
- have nsHF := normalS sHF sFM (Fcore_normal M).
- have /dprodP[_] := nilpotent_pcoreC \pi(H) nilF.
- rewrite (normal_Hall_pcore hallH_F nsHF) /= -/H => defF_H cHFH' _.
- by rewrite -defF_H mulgS // subsetI gFsub_trans.
-have [eqHMs | neqHMs] := eqVneq H M`_\sigma.
- split=> //; [split=> // | by rewrite eqHMs abelian_nil].
- by rewrite (subset_trans _ sHF) //= eqHMs der1_min ?comm_subG.
- rewrite defF_H // -(sdprodW defCH) -eqHMs mulG_subG subIset ?sHF //=.
- rewrite Fitting_max ?abelian_nil ?cyclic_abelian //.
- rewrite -(normal_Hall_pcore hallX) ?gFnormal_trans //.
- by rewrite norm_normalI // eqHMs norms_cent.
- move: defCH; rewrite -dprodEsd; first by case/dprod_normal2.
- by rewrite -eqHMs (centsS (subsetIl _ _)); case/subsetIP: (pHall_sub hallX).
-pose q := #|'C_(M`_\sigma)(K)|; pose Q := 'O_q(M).
-have [D hallD] := Hall_exists q^' (solvableS sMsM (mmax_sol maxM)).
-case/(_ K D): nnil_struct => //=; rewrite -/H -/q -/Q.
-move=> [_ _ defMs] [_ _ piHq _] [sylQ nilD _] _ [_ -> [defF_Q _ _] _].
-have sQH: Q \subset H by rewrite -[Q](p_core_Fcore piHq) pcore_sub.
-split=> //; rewrite -?{}defMs; split=> //.
- by rewrite defF_H // -defF_Q joingC sub_gen // subsetU ?setIS ?centS.
-have sQMs := subset_trans sQH sHMs; have sylQ_Ms := pHall_subl sQMs sMsM sylQ.
-have nsQ_Ms: Q <| M`_\sigma := normalS sQMs sMsM (pcore_normal _ _).
-have defMs: Q ><| D = M`_\sigma := sdprod_normal_p'HallP nsQ_Ms hallD sylQ_Ms.
-have [_ <- _ _] := sdprodP defMs; rewrite -quotientMidl mulgA (mulGSid sQH).
-by rewrite quotientMidl quotient_nil.
-Qed.
-
-(* This is B & G, Corollary 15.6. *)
-(* Note that the proof of the F-core noncyclicity given in the text only *)
-(* applies to the nilpotent case, and we need to use a different assertion of *)
-(* 15.2 if Msigma is not nilpotent. *)
-Corollary Ptype_cyclics M K (Ks := 'C_(M`_\sigma)(K)) :
- M \in 'M_'P -> \kappa(M).-Hall(M) K ->
- [/\ Ks != 1, cyclic Ks, Ks \subset M^`(2), Ks \subset M`_\F
- & ~~ cyclic M`_\F].
-Proof.
-move=> PmaxM hallK; have [ntK maxM] := setIdP PmaxM.
-rewrite -(trivg_kappa maxM hallK) in ntK.
-have [_ _ [ntKs _] _ _] := Ptype_structure PmaxM hallK.
-have [_ _ [_ _ _ [cycZ _ _ _ _] [_ _ _ defM]]] := Ptype_embedding PmaxM hallK.
-have{cycZ} cycKs: cyclic Ks := cyclicS (joing_subr _ _) cycZ.
-have solM': solvable M^`(1) := solvableS (der_sub 1 M) (mmax_sol maxM).
-have sMsM' := Msigma_der1 maxM.
-have{defM} sKsM'': Ks \subset M^`(2).
- have coM'K: coprime #|M^`(1)| #|K|.
- by rewrite (coprime_sdprod_Hall_r defM) (pHall_Hall hallK).
- have [_] := coprime_der1_sdprod defM coM'K solM' (subxx _).
- exact: subset_trans (setSI _ sMsM').
-have [eqMFs | neqMFs] := eqVneq M`_\F M`_\sigma.
- split=> //; rewrite eqMFs ?subsetIl //; apply: contra ntKs => cycMs.
- rewrite -subG1 (subset_trans sKsM'') // (sameP trivgP derG1P) /= -derg1.
- have cycF: cyclic 'F(M).
- have [[cycY _] [_ _ defF] _ _] := Fitting_structure maxM.
- have [[x defMs] [y defY]] := (cyclicP cycMs, cyclicP cycY).
- rewrite defMs (nilpotent_Fitting (abelian_nil (cycle_abelian _))) in defF.
- have [_ mulXY cxy _] := dprodP defF.
- rewrite -mulXY defY -cycleM ?cycle_cyclic //.
- by apply/cent1P; rewrite -cycle_subG sub_cent1 -cycle_subG -defY.
- by rewrite /order -defMs -defY coprime_pcoreC.
- apply: abelianS (cyclic_abelian cycF).
- apply: subset_trans (cent_sub_Fitting (mmax_sol maxM)).
- rewrite der1_min ?normsI ?normG ?norms_cent ?gFnorm //=.
- rewrite -ker_conj_aut (isog_abelian (first_isog_loc _ _)) ?gFnorm //=.
- exact: abelianS (Aut_conj_aut _ _) (Aut_cyclic_abelian cycF).
-have [D hallD] := Hall_exists #|Ks|^' (solvableS sMsM' solM').
-have [_ /(_ K D)[]//=] := Fcore_structure maxM; rewrite -/Ks.
-set q := #|Ks|; set Q := 'O_q(M) => _ [_ q_pr piMFq bMq] [sylQ _ _] _ _.
-have sQMF: Q \subset M`_\F by rewrite -[Q]p_core_Fcore ?pcore_sub.
-have qKs: q.-group Ks := pnat_id q_pr.
-have sKsM := subset_trans sKsM'' (der_sub 2 M).
-split=> //; first by apply: subset_trans sQMF; rewrite (sub_Hall_pcore sylQ).
-apply: contraL (beta_sub_alpha bMq) => /(cyclicS sQMF)cycQ; rewrite -leqNgt.
-by rewrite leqW // -(rank_Sylow sylQ) -abelian_rank1_cyclic ?cyclic_abelian.
-Qed.
-
-(* This is B & G, Theorem 15.7. *)
-(* We had to change the statement of the Theorem, because the first equality *)
-(* of part (c) does not appear to be valid: if M is of type F, we know very *)
-(* little of the action E1 on the Sylow subgroups of E2, and so E2 might have *)
-(* a Sylow subgroup that meets F(M) but is also centralised by E1 and hence *)
-(* intesects M' trivially; luckily, only the inclusion M' \subset F(M) seems *)
-(* to be needed in the sequel. *)
-(* We have also restricted the quantification on the Ei to part (c), and *)
-(* factored and simplified some of the assertions of parts (e2) and (e3); it *)
-(* appears they could perhaps be simplified futher, since the assertions on *)
-(* Op(H) and Op'(H) do not appear to be used in the Peterfalvi revision of *)
-(* the character theory part of the proof. *)
-(* Proof notes: we had to correct/complete several arguments of the B & G *)
-(* text. The use of 12.6(d) for parts (c) and (d), p. 120, l. 5 from the *)
-(* bottom, is inapropriate as tau2 could be empty. The assertion X1 != Z0 on *)
-(* l. 5, p. 121 needs to be strengthened to ~~ (X1 \subset Z0) in order to *)
-(* prove that #|Z0| is prime -- only then are the assertions equivalent. The *)
-(* use of Lemma 10.13(b), l. 7, p. 121, requires that B be maximal in G, not *)
-(* only in P as is stated l. 6; proving the stronger assertion requires using *)
-(* Corollary 15.3(b), which the text does not mention. The regularity *)
-(* property stated l. 11-13 is too weak to be used in the type P1 case -- the *)
-(* regularity assumption need to be restricted to a subgroup of prime order. *)
-(* Finally, the cyclicity of Z(H) is not actually needed in the proof. *)
-Theorem nonTI_Fitting_structure M g (H := (M`_\F)%G) :
- let X := ('F(M) :&: 'F(M) :^ g)%G in
- M \in 'M -> g \notin M -> X :!=: 1 ->
- [/\ (*a*) M \in 'M_'F :|: 'M_'P1 /\ H :=: M`_\sigma,
- (*b*) X \subset H /\ cyclic X,
- (*c*) M^`(1) \subset 'F(M) /\ M`_\sigma \x 'O_\sigma(M)^'('F(M)) = 'F(M),
- (*d*) forall E E1 E2 E3, sigma_complement M E E1 E2 E3 ->
- [/\ E3 :=: 1, E2 <| E, E / E2 \isog E1 & cyclic (E / E2)]
- & (*e*) (*1*) [/\ M \in 'M_'F, abelian H & 'r(H) = 2]
- \/ let p := #|X| in [/\ prime p, ~~ abelian 'O_p(H), cyclic 'O_p^'(H)
- & (*2*) {in \pi(H), forall q, exponent (M / H) %| q.-1}
- \/ (*3*) [/\ #|'O_p(H)| = (p ^ 3)%N, M \in 'M_'P1 & #|M / H| %| p.+1]
- ]].
-Proof.
-move=> X maxM notMg ntX; have nilH: nilpotent H := Fcore_nil M.
-have /andP[sHM nHM]: H <| M := Fcore_normal M.
-have [[cycY t2Y] [_ _ defF] _ _] := Fitting_structure maxM.
-set Y := 'O_\sigma(M)^'('F(M)) in cycY t2Y defF *.
-have not_cycMp: {in \pi(X), forall p, ~~ cyclic 'O_p(M)}.
- move=> p; rewrite mem_primes => /and3P[p_pr _ p_dv_X].
- apply: contra notMg => cycMp.
- have hallMp := nilpotent_pcore_Hall p (Fitting_nil M).
- have{cycMp} defNx1: {in 'F(M), forall x1, #[x1] = p -> 'N(<[x1]>) = M}.
- move=> x1; rewrite /order -cycle_subG => sX1F oX1.
- rewrite (mmax_normal maxM) //; last by rewrite -cardG_gt1 oX1 prime_gt1.
- rewrite (char_normal_trans _ (pcore_normal p M)) ?sub_cyclic_char //=.
- by rewrite -p_core_Fitting (sub_Hall_pcore hallMp) // /pgroup oX1 pnat_id.
- have [x1 Xx1 ox1] := Cauchy p_pr p_dv_X; have [Fx1 Fgx1] := setIP Xx1.
- rewrite -(norm_mmax maxM) inE -{1}(defNx1 (x1 ^ g^-1)) -?mem_conjg ?orderJ //.
- by rewrite cycleJ normJ actKV -(defNx1 x1).
-have{cycY} sX: \sigma(M).-group X.
- apply: sub_pgroup (pgroup_pi X) => p piXp.
- apply: contraR (not_cycMp p piXp) => s'p; rewrite -p_core_Fitting.
- by apply: cyclicS (sub_pcore _ _) cycY => p1; move/eqnP->.
-have sXMs: X \subset M`_\sigma.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) // subIset ?Fitting_sub.
-have E1X_facts p X1 (C1 := 'C_H(X1)%G):
- X1 \in 'E_p^1(X) -> [/\ C1 \notin 'U, 'r(C1) <= 2 & abelian C1].
-- move=> EpX1; have [sX1X /andP[pX1 _] _] := pnElemP EpX1.
- have piXp: p \in \pi(X) by rewrite -p_rank_gt0; apply/p_rank_geP; exists X1.
- have not_sCX1M: ~~ ('C(X1) \subset M).
- have [[sX1F sX1Fg] sFM] := (subsetIP sX1X, Fitting_sub M).
- apply: contra notMg => sCX1M; rewrite -groupV.
- have [trCX1 _ _] := sigma_group_trans maxM (pnatPpi sX piXp) pX1.
- have [||c cX1c] := trCX1 g^-1; rewrite ?(subset_trans _ sFM) ?sub_conjgV //.
- by case=> m Mm ->; rewrite groupM // (subsetP sCX1M).
- have ltCX1_G: 'C(X1) \proper G := mFT_cent_proper (nt_pnElem EpX1 isT).
- have ltC1G: C1 \proper G := sub_proper_trans (subsetIr H _) ltCX1_G.
- have{ltCX1_G} nonuniqC1: C1 \notin 'U.
- have sC1M: C1 \subset M by rewrite subIset ?Fcore_sub.
- apply: contra not_sCX1M => uniqC1.
- by rewrite (sub_uniq_mmax (def_uniq_mmax uniqC1 maxM sC1M)) ?subsetIr.
- split=> //; first by rewrite leqNgt (contra (rank3_Uniqueness _)).
- have sC1H: C1 \subset H := subsetIl _ _.
- have dprodC1: 'F(C1) = C1 := nilpotent_Fitting (nilpotentS sC1H nilH).
- apply/center_idP; rewrite -{2}dprodC1 -(center_bigdprod dprodC1).
- apply: eq_bigr => r _; apply/center_idP; apply: contraR nonuniqC1.
- move/(nonabelian_Uniqueness (pcore_pgroup _ _)).
- exact: uniq_mmaxS (pcore_sub _ _) ltC1G.
-pose p := pdiv #|X|; have piXp: p \in \pi(X) by rewrite pi_pdiv cardG_gt1.
-have /p_rank_geP[X1 EpX1]: 0 < 'r_p(X) by rewrite p_rank_gt0.
-have [sMp ntX1] := (pnatPpi sX piXp, nt_pnElem EpX1 isT).
-have [p_pr oX1] := (pnElem_prime EpX1, card_pnElem EpX1 : #|X1| = p).
-have [sX1X abelX1 dimX1] := pnElemP EpX1; have [pX1 _] := andP abelX1.
-have [nonuniqC1 rC1 cC1C1] := E1X_facts p X1 EpX1.
-have [cycX b'p]: cyclic X /\ p \in \beta(M)^'.
- have [E hallE] := ex_sigma_compl maxM.
- have [_ _] := sigma_compl_embedding maxM hallE.
- case/(_ g notMg); set X2 := _ :&: _ => cycX2 b'X2 _.
- have sXMg: X \subset M :^ g by rewrite subIset // conjSg Fitting_sub orbT.
- have{sXMg} sXX2: X \subset X2 by rewrite subsetI sXMs.
- by rewrite (pnatPpi b'X2 (piSg sXX2 piXp)) (cyclicS sXX2).
-have b'H: \beta(M)^'.-group H.
- apply: sub_pgroup (pgroup_pi _) => r piHr; have [-> // | p'r] := eqVneq r p.
- apply/existsP; exists 'O_r(M)%G; rewrite /= Fcore_pcore_Sylow // negbK.
- apply/implyP; rewrite ltnNge -rank_pgroup ?pcore_pgroup ?(leq_trans _ rC1) //.
- rewrite rankS // subsetI /= -{1}(p_core_Fcore piHr) pcore_sub //.
- rewrite -p_core_Fitting (sub_nilpotent_cent2 (Fitting_nil M)) ?pcore_sub //.
- exact: subset_trans sX1X (subsetIl _ _).
- exact: pnat_coprime pX1 (pi_pgroup (pcore_pgroup r _) _).
-have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
-have [sKM kK _] := and3P hallK; have s'K := sub_pgroup (@kappa_sigma' _ M) kK.
-have [U complU] := ex_kappa_compl maxM hallK.
-have [[defM cycK _] defM' _ _ exU0] := kappa_structure maxM complU.
-have{b'p} FP1maxM: M \in 'M_'F :|: 'M_'P1.
- apply: contraR b'p; rewrite inE /=; case/norP=> notFmaxF notP1maxF.
- have PmaxM: M \in 'M_'P by apply/setDP.
- by have [_ _ _ _ [| <- //]] := Ptype_structure PmaxM hallK; apply/setDP.
-have defH: H :=: M`_\sigma.
- apply/eqP; apply/idPn=> neqHMs; pose q := #|'C_(M`_\sigma)(K)|.
- have solMs: solvable M`_\sigma := solvableS (pcore_sub _ _) (mmax_sol maxM).
- have [D hallD] := Hall_exists q^' solMs.
- have [_ /(_ K D)[] // _ [_ _ piHq /idPn[]]] := Fcore_structure maxM.
- exact: pnatPpi b'H piHq.
-have{sXMs} sXH: X \subset H by rewrite defH.
-have{b'H} sM'F: M^`(1) \subset 'F(M).
- rewrite Fitting_max ?der_normal // (isog_nil (quotient1_isog _)).
- suffices <-: M`_\beta = 1 by apply: Mbeta_quo_nil.
- apply/eqP; rewrite trivg_card1 (card_Hall (Mbeta_Hall maxM)).
- rewrite -(partn_part _ (beta_sub_sigma maxM)) -(card_Hall (Msigma_Hall maxM)).
- by rewrite /= -defH partG_eq1.
-have{defF} defF: M`_\sigma \x Y = 'F(M).
- by rewrite -defF -defH nilpotent_Fitting.
-split=> // [E E1 E2 E3 complEi | {Y t2Y defF sM'F}].
- have [[sE3E' _] _ [cycE1 _] [_ defE] _]:= sigma_compl_context maxM complEi.
- have [hallE _ _ hallE3 _] := complEi; have [sE3E t3E3 _] := and3P hallE3.
- have E3_1: E3 :=: 1.
- have [sEM s'E _] := and3P hallE; have sE'M' := dergS 1 sEM.
- have sE3F: E3 \subset 'F(M) := subset_trans sE3E' (subset_trans sE'M' sM'F).
- rewrite -(setIidPr sE3F) coprime_TIg // -(dprod_card defF) coprime_mull.
- rewrite (pnat_coprime (pcore_pgroup _ _) (pgroupS sE3E s'E)).
- exact: p'nat_coprime (sub_pgroup (@tau3'2 _ M) t2Y) t3E3.
- have{defE} defE: E2 ><| E1 = E by rewrite -defE E3_1 sdprod1g.
- have [-> _ mulE21 nE21 tiE21] := sdprod_context defE.
- by rewrite -mulE21 quotientMidl quotient_cyclic // isog_sym quotient_isog.
-have{defM'} defM_P1: M \in 'M_'P1 -> H ><| K = M /\ M^`(1) = H.
- move=> P1maxM; have [PmaxM _] := setIdP P1maxM.
- have U1: U :=: 1 by apply/eqP; rewrite (trivg_kappa_compl maxM complU).
- have ntK: K :!=: 1 by rewrite (trivg_kappa maxM hallK); case/setDP: PmaxM.
- by have [<- _] := defM' ntK; rewrite -{1}defM U1 sdprodg1 -defH.
-pose P := 'O_p(H); have sylP: p.-Sylow(H) P := nilpotent_pcore_Hall p nilH.
-have [sPH pP _] := and3P sylP.
-have [cHH | {not_cycMp} not_cHH] := boolP (abelian H); [left | right].
- have [-> | P1maxM] := setUP FP1maxM; last first.
- have [PmaxM _] := setIdP P1maxM.
- have [ntKs _ sKsM'' _ _] := Ptype_cyclics PmaxM hallK.
- case/eqP: (subG1_contra sKsM'' ntKs); apply/derG1P.
- by rewrite /= -derg1; have [_ ->] := defM_P1 P1maxM.
- split=> //; apply/eqP; rewrite eqn_leq (leq_trans _ rC1) //=; last first.
- by rewrite rankS // subsetIidl (centsS sX1X) // (sub_abelian_cent cHH).
- apply: leq_trans (rankS (pcore_sub p _)).
- rewrite ltnNge -abelian_rank1_cyclic ?(abelianS sPH) //=.
- by rewrite p_core_Fcore ?(piSg sXH) ?not_cycMp.
-have sX1P: X1 \subset P by rewrite (sub_Hall_pcore sylP) ?(subset_trans sX1X).
-have [_ mulPHp' cPHp' _] := dprodP (nilpotent_pcoreC p nilH : P \x _ = H).
-have cHp'Hp': abelian 'O_p^'(H).
- by rewrite (abelianS _ cC1C1) // subsetI pcore_sub (centsS sX1P).
-have not_cPP: ~~ abelian P.
- by apply: contra not_cHH => cPP; rewrite -mulPHp' abelianM cPP cHp'Hp'.
-have{E1X_facts} pX: p.-group X.
- apply: sub_pgroup (pgroup_pi _) => q; rewrite -p_rank_gt0.
- case/p_rank_geP=> X2 EqX2; have [_ _ cC2C2] := E1X_facts _ _ EqX2.
- case/pnElemP: EqX2 => sX2X /andP[qX2 _] _; have sX2H := subset_trans sX2X sXH.
- apply: contraR not_cPP => q'p; rewrite (abelianS _ cC2C2) // subsetI sPH.
- by rewrite (sub_nilpotent_cent2 nilH) ?(p'nat_coprime (pi_pgroup qX2 _) pP).
-have sXP: X \subset P by rewrite (sub_Hall_pcore sylP).
-pose Z0 := 'Ohm_1('Z(P)); have sZ0ZP: Z0 \subset 'Z(P) := Ohm_sub 1 _.
-have{sZ0ZP} [sZ0P cPZ0] := subsetIP sZ0ZP.
-have not_sX1Z0: ~~ (X1 \subset Z0).
- apply: contra not_cPP => sX1Z0; apply: abelianS cC1C1.
- by rewrite subsetI sPH (centsS sX1Z0) // centsC.
-pose B := X1 <*> Z0; have sBP: B \subset P by rewrite join_subG sX1P.
-have defB: X1 \x Z0 = B by rewrite dprodEY ?prime_TIg ?oX1 ?(centsS sX1P).
-have pZP: p.-group 'Z(P) := pgroupS (center_sub _) pP.
-have abelZ0: p.-abelem Z0 by rewrite Ohm1_abelem ?center_abelian.
-have{abelZ0} abelB: p.-abelem B by rewrite (dprod_abelem _ defB) abelX1.
-have sylP_Ms: p.-Sylow(M`_\sigma) P by rewrite -defH.
-have sylP_G: p.-Sylow(G) P := subHall_Sylow (Msigma_Hall_G maxM) sMp sylP_Ms.
-have max_rB A: p.-abelem A -> B \subset A -> 'r_p(A) <= 2.
- move=> abelA /joing_subP[sX1A _]; have [pA cAA _] := and3P abelA.
- suffices [a [nX1a sAaP]]: exists a, a \in 'N(X1) /\ A :^ a \subset P.
- rewrite -rank_pgroup // -(rankJ _ a) (leq_trans _ rC1) ?rankS //= subsetI.
- by rewrite -(normP nX1a) centJ conjSg (subset_trans sAaP) ?(centsS sX1A).
- have [a _ sAaP] := Sylow_Jsub sylP_G (subsetT A) pA.
- have [x1 defX1]: exists x1, X1 :=: <[x1]>.
- by apply/cyclicP; rewrite prime_cyclic ?oX1.
- have Px1: x1 \in P by rewrite -cycle_subG -defX1.
- have Px1a: x1 ^ a \in P.
- by rewrite (subsetP sAaP) // memJ_conjg -cycle_subG -defX1.
- have [b nPb def_xb] := sigma_Hall_tame maxM sylP_Ms Px1 Px1a.
- exists (a * b^-1); rewrite !inE !actM !sub_conjgV defX1 /= -!cycleJ def_xb.
- by have{nPb} [_ nPb] := setIP nPb; rewrite (normP nPb).
-have rpB: 'r_p(B) = 2.
- apply/eqP; rewrite eqn_leq max_rB // -(p_rank_dprod p defB).
- rewrite p_rank_abelem ?dimX1 // ltnS p_rank_Ohm1 -rank_pgroup // rank_gt0.
- by rewrite center_nil_eq1 ?(pgroup_nil pP) ?(subG1_contra sXP).
-have oZ0: #|Z0| = p.
- apply/eqP; rewrite -(eqn_pmul2l (cardG_gt0 X1)) (dprod_card defB) oX1.
- by rewrite (card_pgroup (abelem_pgroup abelB)) -p_rank_abelem ?rpB.
-have p2maxElemB: [group of B] \in 'E_p^2(G) :&: 'E*_p(G).
- rewrite !inE subsetT abelB -p_rank_abelem // rpB /=.
- apply/maxgroupP; rewrite !inE subsetT /= -/B; split=> // A.
- case/pElemP=> _ abelA sBA; have [pA _] := andP abelA.
- apply/eqP; rewrite eq_sym eqEcard sBA (card_pgroup pA).
- rewrite (card_pgroup (abelem_pgroup abelB)) -!p_rank_abelem // rpB.
- by rewrite leq_exp2l ?prime_gt1 ?max_rB.
-have{not_sX1Z0} defX: X :=: X1.
- have sX_CPB: X \subset 'C_P(B).
- rewrite centY !subsetI sXP sub_abelian_cent ?cyclic_abelian //=.
- by rewrite centsC (centsS sXP).
- have [C defCPB]: exists C, X1 \x C = 'C_P(B).
- have [_ [C]] := basic_p2maxElem_structure p2maxElemB pP sBP not_cPP.
- case=> _ _ defCPB _; exists C; rewrite defCPB // !inE joing_subl abelX1.
- by rewrite -val_eqE eqEsubset negb_and not_sX1Z0 /= dimX1.
- have defX: X1 \x (C :&: X) = X by rewrite (dprod_modl defCPB) // (setIidPr _).
- by move/eqP: ntX1; case/(cyclic_pgroup_dprod_trivg pX cycX): defX; case.
-have cycHp': cyclic 'O_p^'(H).
- rewrite abelian_rank1_cyclic // leqNgt; apply: contra nonuniqC1 => rHp'.
- apply: (uniq_mmaxS (setIS H (centS sX1P))).
- by rewrite mFT_sol_proper nilpotent_sol // (nilpotentS (subsetIl _ _)).
- apply: cent_uniq_Uniqueness (subsetIr _ _) (leq_trans rHp' (rankS _)).
- exact: nonabelian_Uniqueness pP not_cPP.
- by rewrite subsetI pcore_sub.
-rewrite {1}defX oX1 /= -[M`_\F]/(gval H) -/P; split=> //.
-pose Z q := 'Ohm_1('Z('O_q(H)))%G.
-have charZ q: Z q \char H by rewrite 3?gFchar_trans.
-have{cycHp'} oZ: {in \pi(H), forall q, #|Z q| = q}.
- move=> q piHp; have [-> // | p'q] := eqVneq q p.
- have qHq: q.-group 'O_q(H) := pcore_pgroup q H.
- have sHqHp': 'O_q(H) \subset 'O_p^'(H) by apply: sub_pcore => r /eqnP->.
- rewrite /= (center_idP (abelianS sHqHp' cHp'Hp')).
- apply: Ohm1_cyclic_pgroup_prime (cyclicS sHqHp' cycHp') qHq _.
- by rewrite -rank_gt0 (rank_Sylow (nilpotent_pcore_Hall q nilH)) p_rank_gt0.
-have regZq_dv_q1 A q:
- A \subset 'N(H) -> q \in \pi(H) -> semiregular (Z q) A -> #|A| %| q.-1.
-- move=> nHA piHq regA.
- by rewrite -(oZ q piHq) regular_norm_dvd_pred // (char_norm_trans (charZ q)).
-have [FmaxM | {U complU defM exU0}P1maxM] := setUP FP1maxM.
- left=> q piHq; have K1: K :=: 1 by apply/eqP; rewrite (trivg_kappa maxM).
- have ntU: U :!=: 1 by rewrite (trivg_kappa_compl maxM complU) 2!inE FmaxM.
- rewrite K1 sdprodg1 -defH in defM; have [_ mulHU nHU tiHU] := sdprodP defM.
- rewrite -mulHU quotientMidl -(exponent_isog (quotient_isog nHU tiHU)).
- have [U0 [sU0U <- frobMsU0]] := exU0 ntU; have nHU0 := subset_trans sU0U nHU.
- apply: dvdn_trans (exponent_dvdn U0) _; apply: regZq_dv_q1 => // x U0x.
- apply/trivgP; rewrite -(Frobenius_reg_ker frobMsU0 U0x) setSI //= -defH.
- exact: (char_sub (charZ _)).
-have{defM_P1} [[defM defM'] [PmaxM _]] := (defM_P1 P1maxM, setIdP P1maxM).
-have [_ mulHK nHK tiHK] := sdprodP defM; have p'K := pi'_p'group s'K sMp.
-have coHK: coprime #|H| #|K| by rewrite defH (pnat_coprime (pcore_pgroup _ _)).
-have{coHK} coPK: coprime #|P| #|K| := coprimeSg sPH coHK.
-have oMH: #|M / H| = #|K|.
- by rewrite -mulHK quotientMidl -(card_isog (quotient_isog nHK tiHK)).
-pose Ks := 'C_H(K); have prKs: prime #|Ks|.
- have [Ms _ [_ _ _ _ [_]]] := Ptype_embedding PmaxM hallK.
- by rewrite inE P1maxM -defH; do 2!case.
-have sKsP: Ks \subset P.
- have sKsM'': Ks \subset M^`(2) by rewrite /Ks defH; case/Ptype_cyclics: hallK.
- rewrite (subset_trans sKsM'') 1?der1_min //= -derg1 defM' ?gFnorm //.
- by rewrite -mulPHp' quotientMidl quotient_abelian.
-have oKs: #|Ks| = p.
- apply/eqP; apply: pnatPpi pP (piSg sKsP _).
- by rewrite mem_primes prKs cardG_gt0 dvdnn.
-have [prHK ntKs]: semiprime H K /\ Ks != 1.
- by rewrite /Ks defH; case/Ptype_structure: hallK => // [[_ _ [_ ? _]] _ []].
-have [K_dv_p1 | {regZq_dv_q1}] := altP (@implyP (Ks :==: Z0) (#|K| %| p.-1)).
- left=> q piHq; rewrite (dvdn_trans (exponent_dvdn _)) // oMH.
- have [eqZqKs | neqZqKs] := eqVneq Ks (Z q).
- have def_q: q = p by rewrite -(oZ q piHq) -eqZqKs.
- by rewrite def_q K_dv_p1 // eqZqKs def_q.
- apply: regZq_dv_q1 => // x Kx; rewrite -(setIidPl (char_sub (charZ q))).
- rewrite -setIA prHK {x Kx}// setIC (prime_TIg prKs) //.
- have q_pr: prime q by rewrite mem_primes in piHq; case/and3P: piHq.
- apply: contra neqZqKs => sKsZq; rewrite eqEsubset sKsZq /=.
- by rewrite prime_meetG ?oZ // (setIidPr sKsZq).
-rewrite {Z oZ charZ}negb_imply; case/andP; move/eqP=> defKs not_K_dv_p1.
-have nPK: K \subset 'N(P) by apply: gFnorm_trans.
-have defZP: 'Z(P) = Ks.
- apply/eqP; rewrite eqEsubset andbC {1}defKs Ohm_sub subsetI subIset ?sPH //.
- have nZPK: K \subset 'N('Z(P)) by apply: gFnorm_trans.
- have coZPK: coprime #|'Z(P)| #|K| := coprimeSg (center_sub _) coPK.
- rewrite centsC (coprime_odd_faithful_Ohm1 pZP) ?mFT_odd //.
- by rewrite /= -/Z0 -defKs centsC subsetIr.
-have rPle2: 'r(P) <= 2.
- case/setIP: p2maxElemB; case/pnElemP=> _ _ dimB pmaxB.
- have Ep2B: [group of B] \in 'E_p^2(P) by apply/pnElemP.
- rewrite leqNgt; apply: contra not_K_dv_p1 => rPgt2.
- have tiKcP: 'C_K(P) = 1.
- apply/trivgP/subsetP=> x => /setIP[Kx cPx].
- apply: contraR ntX1 => ntx; rewrite -subG1.
- have [_ _ _ <-] := dprodP defB; rewrite subsetIidl -defKs.
- rewrite -[Ks](prHK x) 1?inE ?ntx // (subset_trans sX1P) //=.
- by rewrite subsetI sPH sub_cent1.
- rewrite (card_isog (quotient1_isog _)) -tiKcP -ker_conj_aut.
- rewrite (card_isog (first_isog_loc _ nPK)) /=.
- set A := _ @* _; have AutA: A \subset Aut P := Aut_conj_aut _ _.
- have solA: solvable A by rewrite morphim_sol ?abelian_sol ?cyclic_abelian.
- have oddA: odd #|A| by rewrite morphim_odd ?mFT_odd.
- have nnP: p.-narrow P.
- apply/implyP=> _; apply/set0Pn; exists [group of B].
- by rewrite inE Ep2B (subsetP (pmaxElemS p (subsetT P))) // inE pmaxB inE.
- have [x defK] := cyclicP cycK; have Kx: x \in K by rewrite defK cycle_id.
- have nPx := subsetP nPK x Kx; rewrite /A defK morphim_cycle //.
- have Axj: conj_aut [group of P] x \in A by apply: mem_morphim.
- have [_ _ -> //] := Aut_narrow pP (mFT_odd _) nnP solA AutA oddA.
- by rewrite morph_p_elt // (mem_p_elt p'K).
-have{rPle2} dimP: logn p #|P| = 3.
- have [S [_ <- _] [C cycC]] := mFT_rank2_Sylow_cprod sylP_G rPle2 not_cPP.
- case=> defP defZS; congr (logn p #|(_ : {set _})|).
- suffices defC: 'Ohm_1(C) = C by rewrite -defC defZS cprod_center_id in defP.
- suffices <-: 'Z(P) = C by rewrite defZP (@Ohm1_id _ p) // prime_abelem.
- have [_ <- _] := cprodP (center_cprod defP).
- by rewrite -defZS (center_idP (cyclic_abelian cycC)) mulSGid ?Ohm_sub.
-have oP: #|P| = (p ^ 1.*2.+1)%N by rewrite (card_pgroup pP) dimP.
-right; split; rewrite // {}oMH.
-have esP: extraspecial P by apply: (p3group_extraspecial pP); rewrite ?dimP.
-have defPK: P ><| K = P <*> K by rewrite sdprodEY // coprime_TIg.
-have copK: coprime p #|K| by rewrite -oX1 (coprimeSg sX1P).
-have [x|] := repr_extraspecial_prime_sdprod_cycle pP esP defPK cycK oP copK.
- move/prHK=> defCHx /=; rewrite /= -/P -{1}(setIidPl sPH) -setIA defCHx -/Ks.
- by rewrite -defZP setIA setIid.
-by rewrite addn1 subn1 (negPf not_K_dv_p1) orbF.
-Qed.
-
-(* A subset of the above, that does not require the non-TI witness. *)
-Lemma nonTI_Fitting_facts M :
- M \in 'M -> ~~ normedTI 'F(M)^# G M ->
- [/\ M \in 'M_'F :|: 'M_'P1, M`_\F = M`_\sigma & M^`(1) \subset 'F(M)].
-Proof.
-move=> maxM nonTI; suff: [exists (y | y \notin M), 'F(M) :&: 'F(M) :^ y != 1].
- by case/exists_inP=> y notMy /nonTI_Fitting_structure[] // [-> dMF] _ [].
-rewrite -negb_forall_in; apply: contra nonTI => /forall_inP tiF.
-apply/normedTI_P; rewrite normD1 setTI gFnorm setD_eq0 subG1.
-split=> // [|g _]; first by rewrite (trivg_Fitting (mmax_sol maxM)) mmax_neq1.
-by apply: contraR => /tiF; rewrite -setI_eq0 conjD1g -setDIl setD_eq0 subG1.
-Qed.
-
-(* This is B & G, Theorem 15.8, due to Feit and Thompson (1991). *)
-(* We handle the non-structural step on l. 5, p. 122 by choosing A not to be *)
-(* a q-group, if possible, so that when it turns out to be we know q is the *)
-(* only prime in tau2(H). Since this uniqueness does not appear to be used *)
-(* later we could also eliminate this complication. *)
-(* We also avoid the circularity in proving that A is a q-group and that Q *)
-(* is non-abelian by deriving that Q is in U from 14.2(e) rather than 12.13. *)
-Theorem tau2_P2type_signalizer M Mstar U K r R H (q := #|K|) :
- M \in 'M_'P2 -> kappa_complement M U K -> Mstar \in 'M('C(K)) ->
- r.-Sylow(U) R -> H \in 'M('N(R)) -> ~~ \tau2(H)^'.-group H ->
- [/\ prime q, \tau2(H) =i (q : nat_pred) & \tau2(M)^'.-group M].
-Proof.
-move: Mstar => L P2maxM complU maxCK_L sylR maxNR_H not_t2'H.
-have [[PmaxM notP1maxM] [hallU hallK _]] := (setDP P2maxM, complU).
-have q_pr: prime q by have [_ _ _ _ []] := Ptype_structure PmaxM hallK.
-have [[maxH _] [maxM _]] := (setIdP maxNR_H, setDP PmaxM).
-have [maxL sCKL] := setIdP maxCK_L; have hallLs := Msigma_Hall maxL.
-have [_ sUHs] := P2type_signalizer P2maxM complU maxCK_L sylR maxNR_H.
-set D := H :&: L => defUK [_ sKFD hallD] {r R sylR maxNR_H}.
-set uniq_q := _ =i _.
-have{not_t2'H} [q1 t2Hq neq_q]: exists2 q1, q1 \in \tau2(H) & q1 = q -> uniq_q.
- move: not_t2'H; rewrite negb_and cardG_gt0 all_predC negbK /= has_filter.
- set s := filter _ _ => nts.
- have mem_s: s =i \tau2(H).
- move=> q1; rewrite mem_filter; apply: andb_idr => /= t2q1.
- by rewrite (partition_pi_mmax maxH) t2q1 !orbT.
- have [all_q | ] := altP (@allP _ (pred1 q) s); last first.
- by case/allPn=> q1; rewrite mem_s=> t2q1; move/eqnP=> ne_q1q; exists q1.
- have s_q1: head q s \in s by case: (s) nts => // q1 s' _; apply: predU1l.
- exists (head q s) => [|def_q q1]; rewrite -mem_s //.
- by apply/idP/idP; [apply: all_q | move/eqnP->; rewrite -def_q].
-have [A /= Eq2A Eq2A_H] := ex_tau2Elem hallD t2Hq; rewrite -/D in Eq2A.
-have [b'q qmaxA]: q1 \notin \beta(G) /\ A \in 'E*_q1(G).
- by have [-> ->] := tau2_not_beta maxH t2Hq.
-have [sDH s'HD _] := and3P hallD.
-have [sAH abelA dimA] := pnElemP Eq2A_H; have [qA _] := andP abelA.
-have [[nsAD _] _ _ _] := tau2_compl_context maxH hallD t2Hq Eq2A.
-have cKA: A \subset 'C(K).
- have sFD: 'F(D) \subset D := Fitting_sub _; have sFH := subset_trans sFD sDH.
- have cFF: abelian 'F(D).
- exact: sigma'_nil_abelian maxH sFH (pgroupS sFD s'HD) (Fitting_nil _).
- exact: sub_abelian_cent2 cFF (Fitting_max nsAD (pgroup_nil qA)) sKFD.
-have sAL: A \subset L := subset_trans cKA sCKL.
-pose Ks := 'C_(M`_\sigma)(K).
-have [PmaxL hallKs defK]:
- [/\ L \in 'M_'P, \kappa(L).-Hall(L) Ks & 'C_(L`_\sigma)(Ks) = K].
-- have [L1 [? _] [defL1 [? _] [? _] _ _]] := Ptype_embedding PmaxM hallK.
- suffices ->: L = L1 by []; apply/set1P; rewrite defL1 // in maxCK_L.
- by apply/nElemP; exists q; rewrite p1ElemE // !inE subxx eqxx.
-have sKLs: K \subset L`_\sigma by rewrite -defK subsetIl.
-have sLq: q \in \sigma(L).
- by rewrite -pnatE // -pgroupE (pgroupS sKLs) ?pcore_pgroup.
-have sLq1: q1 \in \sigma(L).
- apply: contraLR sLq => s'Lq1; rewrite -negnK negbK /= -pnatE // -pgroupE.
- have s'LA: \sigma(L)^'.-group A by apply: pi_pgroup qA _.
- have [E hallE sAE] := Hall_superset (mmax_sol maxL) sAL s'LA.
- have EqA_E: A \in 'E_q1^2(E) by apply/pnElemP.
- have [[sEL s'E _] t2Lq1] := (and3P hallE, sigma'2Elem_tau2 maxL hallE EqA_E).
- have [_ [sCAE _ _] _ _] := tau2_compl_context maxL hallE t2Lq1 EqA_E.
- by apply: pgroupS (subset_trans _ sCAE) s'E; rewrite centsC.
-have sALs: A \subset L`_\sigma by rewrite sub_Hall_pcore ?(pi_pgroup qA).
-have solL: solvable L`_\sigma := solvableS (pcore_sub _ _) (mmax_sol maxL).
-pose Q := 'O_q(L)%G; have{solL} [Ds hallDs] := Hall_exists q^' solL.
-have sQFL: Q \subset 'F(L) by rewrite -[gval Q]p_core_Fitting pcore_sub.
-have [sAFL sylQ]: A \subset 'F(L) /\ q.-Sylow(L) Q.
- have [defLF | neqLF] := eqVneq L`_\F L`_\sigma.
- split; first by rewrite (subset_trans sALs) // -defLF Fcore_sub_Fitting.
- by rewrite Fcore_pcore_Sylow // defLF mem_primes q_pr cardG_gt0 cardSg.
- have [_ /(_ _ Ds hallKs neqLF)] := Fcore_structure maxL.
- rewrite /= defK -/q -/Q; case=> // _ _ [-> _ nsQ0L] _ [_ _ [_ _ <-] _].
- rewrite subsetI sALs sub_astabQ quotient_cents // (subset_trans sAL) //.
- exact: normal_norm nsQ0L.
-have{sLq1} neqHL: H :!=: L.
- by apply: contraTneq t2Hq => ->; rewrite negb_and negbK /= sLq1.
-have def_q1: q1 = q.
- have uniqQ: Q \in 'U.
- have [_ _ _ [_ uniqQ _] _] := Ptype_structure PmaxL hallKs.
- apply/uniq_mmaxP; exists L; case/uniqQ: sylQ => //=; rewrite defK.
- by rewrite pi_of_prime ?inE.
- apply: contraNeq neqHL => q'q1.
- rewrite (eq_uniq_mmax (def_uniq_mmax _ maxL sAL) maxH sAH) //.
- rewrite (cent_uniq_Uniqueness uniqQ) ?(rank_abelem abelA) ?dimA //.
- rewrite (sub_nilpotent_cent2 (Fitting_nil L)) //.
- exact: pnat_coprime (pcore_pgroup _ _) (pi_pgroup qA _).
-split=> //; first exact: neq_q.
-rewrite {q1 neq_q}def_q1 in qA Eq2A Eq2A_H t2Hq abelA dimA qmaxA b'q.
-have{b'q} b'q: q \notin \beta(L) by rewrite -predI_sigma_beta // inE /= sLq.
-have P1maxL: L \in 'M_'P1.
- apply: contraR b'q => notP1maxL.
- by have [_ _ _ _ [|<- //]] := Ptype_structure PmaxL hallKs; apply/setDP.
-have nilLs: nilpotent L`_\sigma.
- rewrite (sameP (Fcore_eq_Msigma maxL) eqP); apply: contraR b'q => neqLF.
- have [_ /(_ _ Ds hallKs neqLF)] := Fcore_structure maxL.
- by rewrite /= defK -/q -/Q; case=> // _ [_ _ _ ->] _ _ _.
-have defL': L^`(1) = L`_\sigma.
- have [Us complUs] := ex_kappa_compl maxL hallKs.
- have [_ [|<- _ _ _ _]] := kappa_structure maxL complUs.
- by rewrite (trivg_kappa maxL hallKs) //; case/setDP: PmaxL.
- suffices ->: Us :=: 1 by rewrite sdprodg1.
- by apply/eqP; rewrite (trivg_kappa_compl maxL complUs).
-have [ntK sKLs']: K :!=: 1 /\ K \subset L`_\sigma^`(1).
- by rewrite -defL' -defK; case/Ptype_cyclics: hallKs.
-have [sQL qQ _] := and3P sylQ.
-have not_cQQ: ~~ abelian Q.
- have sKL: K \subset L := subset_trans sKLs (pcore_sub _ _).
- have sKQ: K \subset Q by rewrite (sub_Hall_pcore sylQ) /pgroup ?pnat_id.
- have sQLs: Q \subset L`_\sigma by rewrite sub_Hall_pcore ?(pi_pgroup qQ).
- have defLs: 'O_q^'(L`_\sigma) * Q = L`_\sigma.
- rewrite -(setIidPl sQLs) pcore_setI_normal ?pcore_normal //.
- by have [_] := dprodP (nilpotent_pcoreC q^' nilLs); rewrite pcoreNK.
- apply: contra ntK => cQQ; rewrite -subG1 /= -(derG1P cQQ) -subsetIidl.
- rewrite -(pprod_focal_coprime defLs) ?subsetIidl ?pcore_normal //.
- by rewrite coprime_sym (coprimeSg sKQ) ?coprime_pcoreC.
-pose X := 'C_A(H`_\sigma)%G.
-have [sXA cHsX]: X \subset A /\ X \subset 'C(H`_\sigma) by apply/subsetIP.
-have{not_cQQ} oX: #|X| = q.
- by have [_ []] := nonabelian_tau2 maxH hallD t2Hq Eq2A qQ not_cQQ.
-have neqXK: X :!=: K.
- apply: contraNneq neqHL => defX; rewrite (eq_mmax maxH maxL) //.
- have [_ <- _ _] := sdprodP (sdprod_sigma maxH hallD).
- by rewrite mulG_subG subsetIr (subset_trans _ sCKL) // centsC -defX.
-have{neqXK sXA} not_sXM: ~~ (X \subset M).
- apply: contra neqXK => sXM; rewrite eqEcard oX leqnn andbT; apply/joing_idPl.
- have [[sKM kK _] cKX] := (and3P hallK, subset_trans sXA cKA).
- apply: sub_pHall hallK _ (joing_subl _ _) _; last by rewrite join_subG sKM.
- by rewrite /= (cent_joinEr cKX) pgroupM {2}/pgroup oX andbb.
-have{not_sXM} not_sCUM: ~~ ('C(U) \subset M).
- exact: contra (subset_trans (centsS sUHs cHsX)) not_sXM.
-apply/pgroupP=> r r_pr _; apply: contra not_sCUM => /= t2Mr.
-have [hallUK _ _ _ _] := kappa_compl_context maxM complU.
-have [[B Er2B _] [sUKM _]] := (ex_tau2Elem hallUK t2Mr, andP hallUK).
-have [[nsBUK _] [sCBUK _ _] _ _ ] := tau2_compl_context maxM hallUK t2Mr Er2B.
-apply: subset_trans (centS _) (subset_trans sCBUK sUKM).
-have [sBUK /andP[rB _] _] := pnElemP Er2B.
-have maxU_UK := Hall_max (pHall_subl (joing_subl _ _) sUKM hallU).
-rewrite (normal_sub_max_pgroup maxU_UK) // (pi_pgroup rB) //.
-apply: contraL t2Mr; rewrite negb_and negbK /= inE /=.
-by case: (r \in _) => //=; move/rank_kappa->.
-Qed.
-
-(* This is B & G, Theorem 15.9, parts (a) and (b), due to D. Sibley and Feit *)
-(* and Thompson, respectively. *)
-(* We have dropped part (c) because it is not used later, and localizing the *)
-(* quantification on r would complicate the proof needlessly. *)
-Theorem nonFtype_signalizer_base M x :
- M \in 'M -> x \in M`_\sigma^# ->
- ~~ ('C[x] \subset M) -> 'N[x] \notin 'M_'F ->
- [/\ (*a*) M \in 'M_'F, 'N[x] \in 'M_'P2
- & (*b*) exists2 E : {group gT}, \sigma(M)^'.-Hall(M) E
- & cyclic (gval E) /\ [Frobenius M = M`_\sigma ><| E]].
-Proof.
-move=> maxM Ms1x not_sCxM notFmaxN; have ell1x := Msigma_ell1 maxM Ms1x.
-have [[ntx Ms_x] [y cxy notMy]] := (setD1P Ms1x, subsetPn not_sCxM).
-have SMxM: M \in 'M_\sigma[x] by rewrite inE maxM cycle_subG.
-have SMxMy: (M :^ y)%G \in 'M_\sigma[x].
- by rewrite inE mmaxJ maxM gen_subG -(normP cxy) /= MsigmaJ conjSg sub1set.
-have neq_MyM: M :^ y != M by rewrite (sameP eqP normP) norm_mmax.
-have SMx_gt1: #|'M_\sigma[x]| > 1.
- by rewrite (cardD1 M) SMxM (cardD1 (M :^ y)%G) inE /= SMxMy neq_MyM.
-have [_ [//|uniqN _ t2Nx]] := FT_signalizer_context ell1x.
-rewrite inE (negPf notFmaxN) /= => P2maxN /(_ M SMxM)[_ st2NsM _ hallMN].
-pose r := pdiv #[x]; have pixr: r \in \pi(#[x]) by rewrite pi_pdiv order_gt1.
-have t2Nr := pnatPpi t2Nx pixr; have sMr := st2NsM r t2Nr.
-have [[PmaxN _] [_ s'N_MN _]] := (setDP P2maxN, and3P hallMN).
-have [K hallK] := Hall_exists \kappa('N[x]) (sigma_compl_sol hallMN).
-have [U hallU] := Hall_exists \kappa('N[x])^' (sigma_compl_sol hallMN).
-have hallK_N := subHall_Hall hallMN (@kappa_sigma' _ _) hallK.
-have [[sKMN kK _] [sUMN k'U _]] := (and3P hallK, and3P hallU).
-have mulUK: U * K = M :&: 'N[x].
- apply/eqP; rewrite eqEcard mulG_subG sUMN sKMN.
- rewrite coprime_cardMg ?(p'nat_coprime k'U) //= mulnC.
- by rewrite (card_Hall hallU) (card_Hall hallK) partnC ?cardG_gt0.
-have complU: kappa_complement 'N[x] U K.
- split=> //; last by rewrite mulUK groupP.
- apply: (subHall_Hall hallMN) => [p|]; first by case/norP.
- rewrite pHallE sUMN /= (card_Hall hallU) eq_sym; apply/eqP.
- apply: eq_in_partn => p piMNp; rewrite inE /= negb_or /=.
- by rewrite [~~ _](pnatPpi s'N_MN).
-have prK: prime #|K| by case/Ptype_structure: hallK_N => // _ _ _ _ [].
-have ntK: K :!=: 1 by rewrite -cardG_gt1 prime_gt1.
-have [maxN _] := setDP PmaxN.
-have [defUK cUU regUK]: [/\ U ><| K = M :&: 'N[x], abelian U & 'C_U(K) = 1].
- have [_ defM _ regUK -> //] := kappa_compl_context maxN complU.
- have [[_ UK _ defUK] _ _ _] := sdprodP defM.
- by rewrite (cent_semiregular regUK) // defUK; case/sdprodP: defUK => _ <-.
-have [[R sylR] [s'Nr rrN]] := (Sylow_exists r (M :&: 'N[x]), andP t2Nr).
-have [[sRMN rR _] sylR_N] := (and3P sylR, subHall_Sylow hallMN s'Nr sylR).
-have [nsUMN _ _ nUK _] := sdprod_context defUK.
-have [[sRM sRN] [sKM _]] := (subsetIP sRMN, subsetIP sKMN).
-have sRU: R \subset U.
- rewrite (sub_normal_Hall hallU nsUMN sRMN) (pi_pgroup rR) //.
- by apply: contraL rrN; move/rank_kappa->.
-have sNRM: 'N(R) \subset M.
- apply: (norm_noncyclic_sigma maxM sMr rR sRM).
- rewrite (odd_pgroup_rank1_cyclic rR) ?mFT_odd //.
- by rewrite (p_rank_Sylow sylR_N) (eqnP rrN).
-have sylR_U := pHall_subl sRU sUMN sylR.
-have maxNRM: M \in 'M('N(R)) by rewrite inE maxM.
-have [L maxCK_L] := mmax_exists (mFT_cent_proper ntK).
-have FmaxM: M \in 'M_'F; last split=> //.
- by have [] := P2type_signalizer P2maxN complU maxCK_L sylR_U maxNRM.
-have nilMs: nilpotent M`_\sigma by rewrite notP1type_Msigma_nil ?FmaxM.
-have sMsF: M`_\sigma \subset 'F(M) by rewrite Fitting_max ?pcore_normal.
-have defR: R :=: 'O_r(U) := nilpotent_Hall_pcore (abelian_nil cUU) sylR_U.
-have nRK: K \subset 'N(R) by rewrite defR gFnorm_trans.
-have ntR: R :!=: 1.
- rewrite -rank_gt0 (rank_Sylow sylR_N) p_rank_gt0.
- by rewrite (partition_pi_mmax maxN) t2Nr !orbT.
-have not_nilRK: ~~ nilpotent (R <*> K).
- apply: contra ntR => nilRK; rewrite -subG1 -regUK subsetI sRU.
- rewrite (sub_nilpotent_cent2 nilRK) ?joing_subl ?joing_subr //.
- by rewrite (coprimegS sRU) ?(pnat_coprime kK).
-have{not_nilRK} not_sKMs: ~~ (K \subset M`_\sigma).
- apply: contra not_nilRK => sKMs; apply: nilpotentS nilMs.
- by rewrite join_subG (sub_Hall_pcore (Msigma_Hall maxM)) // (pi_pgroup rR).
-have s'MK: \sigma(M)^'.-group K.
- rewrite /pgroup pnatE //; apply: contra not_sKMs; rewrite /= -pnatE // => sK.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxM)).
-have [E hallE sKE] := Hall_superset (mmax_sol maxM) sKM s'MK.
-have [[E1 hallE1] [E3 hallE3]] := ex_tau13_compl hallE.
-have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
-have [[_ t1E1 _] [sEM _]] := (and3P hallE1, andP hallE).
-have E2_1: E2 :=: 1.
- have [sE2E t2E2 _] := and3P hallE2.
- rewrite -(setIidPl sE2E) coprime_TIg ?(pnat_coprime t2E2 (pgroupS sEM _)) //.
- apply: contraR ntR => not_t2'M.
- have:= tau2_P2type_signalizer P2maxN complU maxCK_L sylR_U maxNRM not_t2'M.
- case=> _ _ t2'N; rewrite -(setIidPl sRN) coprime_TIg //.
- by rewrite (pnat_coprime (pi_pgroup rR t2Nr)).
-have E3_1: E3 :=: 1.
- have ntX: 'F(M) :&: 'F(M) :^ y != 1.
- apply/trivgPn; exists x; rewrite // inE mem_conjg !(subsetP sMsF) //.
- by rewrite /conjg invgK mulgA (cent1P cxy) mulgK.
- have [_ _ _ defE _] := nonTI_Fitting_structure maxM notMy ntX.
- by case/defE: complEi.
-have [cycE defE]: cyclic E /\ E :=: E1.
- have [_ _ [cycE1 _] [<- _] _] := sigma_compl_context maxM complEi.
- by rewrite E2_1 E3_1 !sdprod1g.
-have [ntMs ntE] := (Msigma_neq1 maxM, subG1_contra sKE ntK).
-have defM := sdprod_sigma maxM hallE.
-exists E => //; split=> //; apply/Frobenius_semiregularP=> // z Ez.
-have{Ez} [ntz szE1] := setD1P Ez; rewrite defE -cycle_subG in szE1.
-pose q := pdiv #[z]; have pizq: q \in \pi(#[z]) by rewrite pi_pdiv order_gt1.
-have szM: <[z]> \subset M by rewrite (subset_trans _ sEM) ?defE.
-have [_ k'M] := setIdP FmaxM; have k'q := pnatPpi k'M (piSg szM pizq).
-have t1q := pnatPpi t1E1 (piSg szE1 pizq).
-move: pizq; rewrite -p_rank_gt0 => /p_rank_geP[Z].
-rewrite /= -(setIidPr szM) pnElemI -setIdE => /setIdP[EqZ sZz].
-apply: contraNeq k'q => ntCMsx /=.
-rewrite unlock 3!inE /= t1q; apply/exists_inP; exists Z => //.
-by rewrite (subG1_contra _ ntCMsx) ?setIS //= -cent_cycle centS.
-Qed.
-
-End Section15.