diff options
| author | Enrico Tassi | 2015-03-09 11:07:53 +0100 |
|---|---|---|
| committer | Enrico Tassi | 2015-03-09 11:24:38 +0100 |
| commit | fc84c27eac260dffd8f2fb1cb56d599f1e3486d9 (patch) | |
| tree | c16205f1637c80833a4c4598993c29fa0fd8c373 /mathcomp/odd_order/BGsection15.v | |
Initial commit
Diffstat (limited to 'mathcomp/odd_order/BGsection15.v')
| -rw-r--r-- | mathcomp/odd_order/BGsection15.v | 1509 |
1 files changed, 1509 insertions, 0 deletions
diff --git a/mathcomp/odd_order/BGsection15.v b/mathcomp/odd_order/BGsection15.v new file mode 100644 index 0000000..2238534 --- /dev/null +++ b/mathcomp/odd_order/BGsection15.v @@ -0,0 +1,1509 @@ +(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *) +Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq choice div fintype. +Require Import path bigop finset prime fingroup morphism perm automorphism. +Require Import quotient action gproduct gfunctor pgroup cyclic commutator. +Require Import center gseries nilpotent sylow abelian maximal hall frobenius. +Require Import BGsection1 BGsection2 BGsection3 BGsection4 BGsection5. +Require Import BGsection6 BGsection7 BGsection9 BGsection10 BGsection12. +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) (char_normal_trans (pcore_char _ _)). +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 // (char_normal_trans (Fitting_char _)). +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; exact/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 (subset_trans (pcore_sub _ _) (Fitting_sub M)). +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 => eq_MF_Ms. + have nilMs: nilpotent M`_\sigma by apply/Fcore_eq_Msigma. + rewrite (eq_Hall_pcore (nilpotent_pcore_Hall _ nilMs) hallH). + exact: char_normal_trans (pcore_char _ _) nsMsM. +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. + have nilMsQ: nilpotent (M`_\sigma / Q). + by rewrite -mulQD quotientMidl -(isog_nil (quotient_isog _ _)). + have hallMsQpi := nilpotent_pcore_Hall pi nilMsQ. + rewrite (eq_Hall_pcore hallMsQpi (quotient_pHall nQH hallH)). + by rewrite (char_normal_trans (pcore_char _ _)) ?quotient_normal. +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 -{2}(Hall_Frattini_arg solQH nsQHM hallH_QH) /= norm_joinEr //. + by rewrite -mulgA [H * _]mulSGid // subsetI (subset_trans sHMs sMsM) normG. +move: Mb; rewrite -{1}defM; case/mulsgP=> 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 // (char_normal_trans (Fitting_char _)). +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 (char_norm_trans (pcore_char _ _)) ?subIset ?nFM //= -/Y. + 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 (subset_trans (Fitting_sub _)) //= -/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. + by case/andP=> _; 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 (subset_trans (pcore_sub _ _)). +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) ?(char_normal_trans (pcore_char _ _)) //. + 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. + have:= char_trans (center_char _) (pcore_char q H). + exact: char_trans (Ohm_char 1 _). +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) := char_norm_trans (pcore_char p H) nHK. +have defZP: 'Z(P) = Ks. + apply/eqP; rewrite eqEsubset andbC {1}defKs Ohm_sub subsetI subIset ?sPH //. + have nZPK: K \subset 'N('Z(P)) := char_norm_trans (center_char _) nPK. + 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 exact: 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[] // [[-> ?] _ []]. +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' _; exact: predU1l. + exists (head q s) => [|def_q q1]; rewrite -mem_s //. + by apply/idP/idP; [exact: 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 exact: 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 exact/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 (char_norm_trans (pcore_char r U)). +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. + + |
