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/BGsection16.v | |
Initial commit
Diffstat (limited to 'mathcomp/odd_order/BGsection16.v')
| -rw-r--r-- | mathcomp/odd_order/BGsection16.v | 1359 |
1 files changed, 1359 insertions, 0 deletions
diff --git a/mathcomp/odd_order/BGsection16.v b/mathcomp/odd_order/BGsection16.v new file mode 100644 index 0000000..a37edba --- /dev/null +++ b/mathcomp/odd_order/BGsection16.v @@ -0,0 +1,1359 @@ +(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *) +Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq div path fintype. +Require Import bigop finset prime fingroup morphism perm automorphism quotient. +Require Import action gproduct gfunctor pgroup cyclic center commutator. +Require Import 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 BGsection15. + +(******************************************************************************) +(* This file covers B & G, section 16; it summarises all the results of the *) +(* local analysis. Some of the definitions of B & G have been adapted to fit *) +(* in beter with Peterfalvi, section 8, dropping unused properties and adding *) +(* a few missing ones. This file also defines the following: *) +(* of_typeF M U <-> M = M`_\F ><| U is of type F, in the sense of *) +(* Petervalvi (8.1) rather than B & G section 14. *) +(* is_typeF_complement M U U0 <-> U0 is a subgroup of U with the same *) +(* exponent as U, such that M`_\F ><| U0 is a Frobenius *) +(* group; this corresponds to Peterfalvi (8.1)(c). *) +(* is_typeF_inertia M U U1 <-> U1 <| U is abelian and contains 'C_U[x] for *) +(* all x in M`_\F^#, and thus the inertia groups of all *) +(* nonprincipal irreducible characters of M`_\F; this *) +(* corresponds to Peterfalvi (8.1)(b). *) +(* of_typeI M U <-> M = M`_\F ><| U is of type I, in the sense of *) +(* Peterfalvi (8.3); this definition is almost identical *) +(* to B & G conditions (Ii) - (Iv), except that (Iiv) is *) +(* dropped, as is the condition p \in \pi* in (Iv)(c). *) +(* Also, the condition 'O_p^'(M) cyclic, present in both *) +(* B & G and Peterfalvi, is weakened to 'O_p^'(M`_\F) *) +(* cyclic, because B & G, Theorem 15.7 only proves the *) +(* weaker statement, and we did not manage to improve it. *) +(* This appears to be a typo in B & G that was copied *) +(* over to Petrfalvi (8.3). It is probably no consequence *) +(* because (8.3) is only used in (12.6) and (12.10) and *) +(* neither use the assumption that 'O_p^'(M) is cyclic. *) +(* For defW : W1 \x W2 = W we also define: *) +(* of_typeP M U defW <-> M = M`_\F ><| U ><| W1 is of type P, in the sense of *) +(* Peterfalvi (8.4) rather than B & G section 14, where *) +(* (8.4)(d,e) hold for W and W2 (i.e., W2 = C_M^(1)(W1)). *) +(* of_typeII_IV M U defW <-> M = M`_\F ><| U ><| W1 is of type II, III, or IV *) +(* in the sense of Peterfalvi (8.6)(a). This is almost *) +(* exactly the contents of B & G, (T1)-(T7), except that *) +(* (T6) is dropped, and 'C_(M`_\F)(W1) \subset M^`(2) is *) +(* added (PF, (8.4)(d) and B & G, Theorem C(3)). *) +(* of_typeII M U defW <-> M = M`_\F ><| U ><| W1 is of type II in the sense *) +(* of Peterfalvi (8.6); this differs from B & G by *) +(* dropping the rank 2 clause in IIiii and replacing IIv *) +(* by B(2)(3) (note that IIv is stated incorrectly: M' *) +(* should be M'^#). *) +(* of_typeIII M U defW <-> M = M`_\F ><| U ><| W1 is of type III in the sense *) +(* of Peterfalvi (8.6). *) +(* of_typeIV M U defW <-> M = M`_\F ><| U ><| W1 is of type IV in the sense *) +(* of Peterfalvi (8.6). *) +(* of_typeV M U defW <-> U = 1 and M = M`_\F ><| W1 is of type V in the *) +(* sense of Peterfalvi (8.7); this differs from B & G (V) *) +(* dropping the p \in \pi* condition in clauses (V)(b) *) +(* and (V)(c). *) +(* exists_typeP spec <-> spec U defW holds for some groups U, W, W1 and W2 *) +(* such that defW : W1 \x W2 = W; spec will be one of *) +(* (of_typeP M), (of_typeII_IV M), (of_typeII M), etc. *) +(* FTtype_spec i M <-> M is of type i, for 0 < i <= 5, in the sense of the *) +(* predicates above, for the appropriate complements to *) +(* M`_\F and M^`(1). *) +(* FTtype M == the type of M, in the sense above, when M is a maximal *) +(* subgroup of G (this is an integer i between 1 and 5). *) +(* M`_\s == an alternative, combinatorial definition of M`_\sigma *) +(* := M`_\F if M is of type I or II, else M^`(1) *) +(* 'A1(M) == the "inner Dade support" of a maximal group M, as *) +(* defined in Peterfalvi (8.10). *) +(* := (M`_\s)^# *) +(* 'A(M) == the "Dade support" of M as defined in Peterfalvi (8.10) *) +(* (this differs from B & G by excluding 1). *) +(* 'A0(M) == the "outer Dade support" of M as defined in Peterfalvi *) +(* (8.10) (this differs from B & G by excluding 1). *) +(* 'M^G == a transversal of the conjugacy classes of 'M. *) +(******************************************************************************) + +Set Implicit Arguments. +Unset Strict Implicit. +Unset Printing Implicit Defensive. + +Import GroupScope. + +Section GeneralDefinitions. + +Variable gT : finGroupType. +Implicit Types V W X : {set gT}. + +End GeneralDefinitions. + +Section Definitions. + +Variable gT : minSimpleOddGroupType. +Local Notation G := (TheMinSimpleOddGroup gT). + +Implicit Types M U V W X : {set gT}. + +Definition is_typeF_inertia M U (H := M`_\F) U1 := + [/\ U1 <| U, abelian U1 & {in H^#, forall x, 'C_U[x] \subset U1}]. + +Definition is_typeF_complement M U (H := M`_\F) U0 := + [/\ U0 \subset U, exponent U0 = exponent U & [Frobenius H <*> U0 = H ><| U0]]. + +Definition of_typeF M U (H := M`_\F) := + [/\ (*a*) [/\ H != 1, U :!=: 1 & H ><| U = M], + (*b*) exists U1 : {group gT}, is_typeF_inertia M U U1 + & (*c*) exists U0 : {group gT}, is_typeF_complement M U U0]. + +Definition of_typeI M (H := M`_\F) U := + of_typeF M U + /\ [\/ (*a*) normedTI H^# G M, + (*b*) abelian H /\ 'r(H) = 2 + | (*c*) {in \pi(H), forall p, exponent U %| p.-1} + /\ (exists2 p, p \in \pi(H) & cyclic 'O_p^'(H))]. + +Section Ptypes. + +Variables M U W W1 W2 : {set gT}. +Let H := M`_\F. +Let M' := M^`(1). +Implicit Type defW : W1 \x W2 = W. + +Definition of_typeP defW := + [/\ (*a*) [/\ cyclic W1, Hall M W1, W1 != 1 & M' ><| W1 = M], + (*b*) [/\ nilpotent U, U \subset M', W1 \subset 'N(U) & H ><| U = M'], + (*c*) [/\ ~~ cyclic H, M^`(2) \subset 'F(M), H * 'C_M(H) = 'F(M) + & 'F(M) \subset M'], + (*d*) [/\ cyclic W2, W2 != 1, W2 \subset H, W2 \subset M^`(2) + & {in W1^#, forall x, 'C_M'[x] = W2}] + & (*e*) normedTI (W :\: (W1 :|: W2)) G W]. + +Definition of_typeII_IV defW := + [/\ of_typeP defW, U != 1, prime #|W1| & normedTI 'F(M)^# G M]. + +Definition of_typeII defW := + [/\ of_typeII_IV defW, abelian U, ~~ ('N(U) \subset M), + of_typeF M' U & M'`_\F = H]. + +Definition of_typeIII defW := + [/\ of_typeII_IV defW, abelian U & 'N(U) \subset M]. + +Definition of_typeIV defW := + [/\ of_typeII_IV defW, ~~ abelian U & 'N(U) \subset M]. + +Definition of_typeV defW := + [/\ of_typeP defW /\ U = 1 + & [\/ (*a*) normedTI H^# G M, + (*b*) exists2 p, p \in \pi(H) & #|W1| %| p.-1 /\ cyclic 'O_p^'(H) + | (*c*) exists2 p, p \in \pi(H) + & [/\ #|'O_p(H)| = (p ^ 3)%N, #|W1| %| p.+1 & cyclic 'O_p^'(H)]]]. + +End Ptypes. + +CoInductive exists_typeP (spec : forall U W W1 W2, W1 \x W2 = W -> Prop) : Prop + := FTtypeP_Spec (U W W1 W2 : {group gT}) defW of spec U W W1 W2 defW. + +Definition FTtype_spec i M := + match i with + | 1%N => exists U : {group gT}, of_typeI M U + | 2 => exists_typeP (of_typeII M) + | 3 => exists_typeP (of_typeIII M) + | 4 => exists_typeP (of_typeIV M) + | 5 => exists_typeP (of_typeV M) + | _ => False + end. + +Definition FTtype M := + if \kappa(M)^'.-group M then 1%N else + if M`_\sigma != M^`(1) then 2 else + if M`_\F == M`_\sigma then 5 else + if abelian (M`_\sigma / M`_\F) then 3 else 4. + +Lemma FTtype_range M : 0 < FTtype M <= 5. +Proof. by rewrite /FTtype; do 4!case: ifP => // _. Qed. + +Definition FTcore M := if 0 < FTtype M <= 2 then M`_\F else M^`(1). +Fact FTcore_is_group M : group_set (FTcore M). +Proof. rewrite /FTcore; case: ifP => _; exact: groupP. Qed. +Canonical Structure FTcore_group M := Group (FTcore_is_group M). + +Definition FTsupport1 M := (FTcore M)^#. + +Let FTder M := M^`(FTtype M != 1%N). + +Definition FTsupport M := \bigcup_(x in FTsupport1 M) 'C_(FTder M)[x]^#. + +Definition FTsupport0 M (pi := \pi(FTder M)) := + FTsupport M :|: [set x in M | ~~ pi.-elt x & ~~ pi^'.-elt x]. + +Definition mmax_transversal U := orbit_transversal 'JG U 'M. + +End Definitions. + +Notation "M `_ \s" := (FTcore M) (at level 3, format "M `_ \s") : group_scope. +Notation "M `_ \s" := (FTcore_group M) : Group_scope. + +Notation "''A1' ( M )" := (FTsupport1 M) + (at level 8, format "''A1' ( M )") : group_scope. + +Notation "''A' ( M )" := (FTsupport M) + (at level 8, format "''A' ( M )") : group_scope. + +Notation "''A0' ( M )" := (FTsupport0 M) + (at level 8, format "''A0' ( M )") : group_scope. + +Notation "''M^' G" := (mmax_transversal G) + (at level 3, format "''M^' G") : group_scope. + +Section Section16. + +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}. + +(* Structural properties of the M`_\s definition. *) +Lemma FTcore_char M : M`_\s \char M. +Proof. by rewrite /FTcore; case: ifP; rewrite gFchar. Qed. + +Lemma FTcore_normal M : M`_\s <| M. +Proof. by rewrite char_normal ?FTcore_char. Qed. + +Lemma FTcore_norm M : M \subset 'N(M`_\s). +Proof. by rewrite char_norm ?FTcore_char. Qed. + +Lemma FTcore_sub M : M`_\s \subset M. +Proof. by rewrite char_sub ?FTcore_char. Qed. + +Lemma FTcore_type1 M : FTtype M == 1%N -> M`_\s = M`_\F. +Proof. by rewrite /M`_\s => /eqP->. Qed. + +Lemma FTcore_type2 M : FTtype M == 2 -> M`_\s = M`_\F. +Proof. by rewrite /M`_\s => /eqP->. Qed. + +Lemma FTcore_type_gt2 M : FTtype M > 2 -> M`_\s = M^`(1). +Proof. by rewrite /M`_\s => /subnKC <-. Qed. + +Lemma FTsupp1_type1 M : FTtype M == 1%N -> 'A1(M) = M`_\F^#. +Proof. by move/FTcore_type1 <-. Qed. + +Lemma FTsupp1_type2 M : FTtype M == 2 -> 'A1(M) = M`_\F^#. +Proof. by move/FTcore_type2 <-. Qed. + +Lemma FTsupp1_type_gt2 M : FTtype M > 2 -> 'A1(M) = M^`(1)^#. +Proof. by move/FTcore_type_gt2 <-. Qed. + +(* This section covers the characterization of the F, P, P1 and P2 types of *) +(* maximal subgroups summarized at the top of p. 125. in B & G. *) +Section KappaClassification. + +Variables M U K : {group gT}. +Hypotheses (maxM : M \in 'M) (complU : kappa_complement M U K). + +Remark trivgFmax : (M \in 'M_'F) = (K :==: 1). +Proof. by rewrite (trivg_kappa maxM); case: complU. Qed. + +Remark trivgPmax : (M \in 'M_'P) = (K :!=: 1). +Proof. by rewrite inE trivgFmax maxM andbT. Qed. + +Remark FmaxP : reflect (K :==: 1 /\ U :!=: 1) (M \in 'M_'F). +Proof. +rewrite (trivg_kappa_compl maxM complU) 2!inE. +have [_ hallK _] := complU; rewrite (trivg_kappa maxM hallK). +by apply: (iffP idP) => [-> | []]. +Qed. + +Remark P1maxP : reflect (K :!=: 1 /\ U :==: 1) (M \in 'M_'P1). +Proof. +rewrite (trivg_kappa_compl maxM complU) inE -trivgPmax. +by apply: (iffP idP) => [|[] //]; case/andP=> ->. +Qed. + +Remark P2maxP : reflect (K :!=: 1 /\ U :!=: 1) (M \in 'M_'P2). +Proof. +rewrite (trivg_kappa_compl maxM complU) -trivgPmax. +by apply: (iffP setDP) => [] []. +Qed. + +End KappaClassification. + +(* This section covers the combinatorial statements of B & G, Lemma 16.1. It *) +(* needs to appear before summary theorems A-E because we are following *) +(* Peterfalvi in anticipating the classification in the definition of the *) +(* kernel sets A1(M), A(M) and A0(M). The actual correspondence between the *) +(* combinatorial classification and the mathematical description, i.e., the *) +(* of_typeXX predicates, will be given later. *) +Section FTtypeClassification. + +Variable M : {group gT}. +Hypothesis maxM : M \in 'M. + +Lemma kappa_witness : + exists UK : {group gT} * {group gT}, kappa_complement M UK.1 UK.2. +Proof. +have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM). +by have [U complU] := ex_kappa_compl maxM hallK; exists (U, K). +Qed. + +(* This is B & G, Lemma 16.1(a). *) +Lemma FTtype_Fmax : (M \in 'M_'F) = (FTtype M == 1%N). +Proof. +by rewrite inE maxM /FTtype; case: (_.-group M) => //; do 3!case: ifP => // _. +Qed. + +Lemma FTtype_Pmax : (M \in 'M_'P) = (FTtype M != 1%N). +Proof. by rewrite inE maxM andbT FTtype_Fmax. Qed. + +(* This is B & G, Lemma 16.1(b). *) +Lemma FTtype_P2max : (M \in 'M_'P2) = (FTtype M == 2). +Proof. +have [[U K] /= complU] := kappa_witness. +rewrite (sameP (P2maxP maxM complU) andP) -(trivgFmax maxM complU) FTtype_Fmax. +have [-> // | notMtype1] := altP eqP. +have ntK: K :!=: 1 by rewrite -(trivgFmax maxM complU) FTtype_Fmax. +have [_ [//|defM' _] _ _ _] := kappa_structure maxM complU. +do [rewrite /FTtype; case: ifP => // _] in notMtype1 *. +rewrite -cardG_gt1 eqEcard Msigma_der1 //= -(sdprod_card defM') -ltnNge. +rewrite -(@ltn_pmul2l #|M`_\sigma|) ?cardG_gt0 //= muln1. +by case: leqP => // _; do 2!case: ifP=> //. +Qed. + +(* This covers the P1 part of B & G, Lemma 16.1 (c) and (d). *) +Lemma FTtype_P1max : (M \in 'M_'P1) = (2 < FTtype M <= 5). +Proof. +rewrite 2!ltn_neqAle -!andbA FTtype_range andbT eq_sym -FTtype_P2max. +rewrite eq_sym -FTtype_Pmax in_setD inE. +by case: (M \in _); rewrite ?andbT ?andbF ?negbK. +Qed. + +Lemma Msigma_eq_der1 : M \in 'M_'P1 -> M`_\sigma = M^`(1). +Proof. +have [[U K] /= complU] := kappa_witness. +case/(P1maxP maxM complU)=> ntK; move/eqP=> U1. +by have [_ [//|<- _] _ _ _] := kappa_structure maxM complU; rewrite U1 sdprodg1. +Qed. + +Lemma def_FTcore : M`_\s = M`_\sigma. +Proof. +rewrite /FTcore -mem_iota 2!inE -FTtype_Fmax -FTtype_P2max. +have [notP1maxM |] := ifPn. + by apply/Fcore_eq_Msigma; rewrite ?notP1type_Msigma_nil. +case/norP=> notFmaxM; rewrite inE andbC inE maxM notFmaxM negbK => P1maxM. +by rewrite Msigma_eq_der1. +Qed. + +(* Other relations between the 'core' groups. *) + +Lemma FTcore_sub_der1 : M`_\s \subset M^`(1)%g. +Proof. by rewrite def_FTcore Msigma_der1. Qed. + +Lemma Fcore_sub_FTcore : M`_\F \subset M`_\s. +Proof. by rewrite def_FTcore Fcore_sub_Msigma. Qed. + +Lemma mmax_Fcore_neq1 : M`_\F != 1. +Proof. by have [[]] := Fcore_structure maxM. Qed. + +Lemma mmax_Fitting_neq1 : 'F(M) != 1. +Proof. exact: subG1_contra (Fcore_sub_Fitting M) mmax_Fcore_neq1. Qed. + +Lemma FTcore_neq1 : M`_\s != 1. +Proof. exact: subG1_contra Fcore_sub_FTcore mmax_Fcore_neq1. Qed. + +Lemma norm_mmax_Fcore : 'N(M`_\F) = M. +Proof. exact: mmax_normal (gFnormal _ _) mmax_Fcore_neq1. Qed. + +Lemma norm_FTcore : 'N(M`_\s) = M. +Proof. exact: mmax_normal (FTcore_normal _) FTcore_neq1. Qed. + +Lemma norm_mmax_Fitting : 'N('F(M)) = M. +Proof. exact: mmax_normal (gFnormal _ _) mmax_Fitting_neq1. Qed. + +(* This is B & G, Lemma 16.1(f). *) +Lemma Fcore_eq_FTcore : reflect (M`_\F = M`_\s) (FTtype M \in pred3 1%N 2 5). +Proof. +rewrite /FTcore -mem_iota 3!inE orbA; case type12M: (_ || _); first by left. +move: type12M FTtype_P1max; rewrite /FTtype; do 2![case: ifP => // _] => _. +rewrite !(fun_if (leq^~ 5)) !(fun_if (leq 3)) !if_same /= => P1maxM. +rewrite Msigma_eq_der1 // !(fun_if (eq_op^~ 5)) if_same. +by rewrite [if _ then _ else _]andbT; apply: eqP. +Qed. + +(* This is the second part of B & G, Lemma 16.1(c). *) +Lemma Fcore_neq_FTcore : (M`_\F != M`_\s) = (FTtype M \in pred2 3 4). +Proof. +have:= FTtype_range M; rewrite -mem_iota (sameP eqP Fcore_eq_FTcore). +by do 5!case/predU1P=> [-> //|]. +Qed. + +Lemma FTcore_eq_der1 : FTtype M > 2 -> M`_\s = M^`(1). +Proof. +move=> FTtype_gt2; rewrite def_FTcore Msigma_eq_der1 // FTtype_P1max. +by rewrite FTtype_gt2; case/andP: (FTtype_range M). +Qed. + +End FTtypeClassification. + +(* Internal automorphism. *) +Lemma FTtypeJ M x : FTtype (M :^ x) = FTtype M. +Proof. +rewrite /FTtype (eq_p'group _ (kappaJ _ _)) pgroupJ MsigmaJ FcoreJ derJ. +rewrite !(can_eq (conjsgK x)); do 4!congr (if _ then _ else _). +rewrite -quotientInorm normJ -conjIg /= setIC -{1 3}(setIidPr (normG M`_\F)). +rewrite -!morphim_conj -morphim_quotm ?normalG //= => nsMFN. +by rewrite injm_abelian /= ?im_quotient // injm_quotm ?injm_conj. +Qed. + +Lemma FTcoreJ M x : (M :^ x)`_\s = M`_\s :^ x. +Proof. by rewrite /FTcore FTtypeJ FcoreJ derJ; case: ifP. Qed. + +Lemma FTsupp1J M x : 'A1(M :^ x) = 'A1(M) :^ x. +Proof. by rewrite conjD1g -FTcoreJ. Qed. + +Lemma FTsuppJ M x : 'A(M :^ x) = 'A(M) :^ x. +Proof. +rewrite -bigcupJ /'A(_) FTsupp1J big_imset /=; last exact: in2W (conjg_inj x). +by apply: eq_bigr => y _; rewrite FTtypeJ derJ cent1J -conjIg conjD1g. +Qed. + +Lemma FTsupp0J M x : 'A0(M :^ x) = 'A0(M) :^ x. +Proof. +apply/setP=> y; rewrite mem_conjg !inE FTsuppJ !mem_conjg; congr (_ || _ && _). +by rewrite FTtypeJ !p_eltJ derJ /= cardJg. +Qed. + +(* Inclusion/normality of class function supports. *) + +Lemma FTsupp_sub0 M : 'A(M) \subset 'A0(M). +Proof. exact: subsetUl. Qed. + +Lemma FTsupp0_sub M : 'A0(M) \subset M^#. +Proof. +rewrite subUset andbC subsetD1 setIdE subsetIl !inE p_elt1 andbF /=. +by apply/bigcupsP=> x _; rewrite setSD ?subIset ?der_sub. +Qed. + +Lemma FTsupp_sub M : 'A(M) \subset M^#. +Proof. exact: subset_trans (FTsupp_sub0 M) (FTsupp0_sub M). Qed. + +Lemma FTsupp1_norm M : M \subset 'N('A1(M)). +Proof. by rewrite normD1 (normal_norm (FTcore_normal M)). Qed. + +Lemma FTsupp_norm M : M \subset 'N('A(M)). +Proof. +apply/subsetP=> y My; rewrite inE -bigcupJ; apply/bigcupsP=> x A1x. +rewrite (bigcup_max (x ^ y)) ?memJ_norm ?(subsetP (FTsupp1_norm M)) //. +by rewrite conjD1g conjIg cent1J (normsP _ y My) ?gFnorm. +Qed. + +Lemma FTsupp0_norm M : M \subset 'N('A0(M)). +Proof. +rewrite normsU ?FTsupp_norm // setIdE normsI //. +by apply/normsP=> x _; apply/setP=> y; rewrite mem_conjg !inE !p_eltJ. +Qed. + +Section MmaxFTsupp. +(* Support inclusions that depend on the maximality of M. *) + +Variable M : {group gT}. +Hypothesis maxM : M \in 'M. + +Lemma FTsupp1_sub : 'A1(M) \subset 'A(M). +Proof. +apply/subsetP=> x A1x; apply/bigcupP; exists x => //. +have [ntx Ms_x] := setD1P A1x; rewrite 3!inE ntx cent1id (subsetP _ x Ms_x) //. +by case: (~~ _); rewrite ?FTcore_sub_der1 ?FTcore_sub. +Qed. + +Lemma FTsupp1_sub0 : 'A1(M) \subset 'A0(M). +Proof. exact: subset_trans FTsupp1_sub (FTsupp_sub0 M). Qed. + +Lemma FTsupp1_neq0 : 'A1(M) != set0. +Proof. by rewrite setD_eq0 subG1 FTcore_neq1. Qed. + +Lemma FTsupp_neq0 : 'A(M) != set0. +Proof. +by apply: contraNneq FTsupp1_neq0 => AM_0; rewrite -subset0 -AM_0 FTsupp1_sub. +Qed. + +Lemma FTsupp0_neq0 : 'A0(M) != set0. +Proof. +by apply: contraNneq FTsupp_neq0 => A0M_0; rewrite -subset0 -A0M_0 FTsupp_sub0. +Qed. + +Lemma Fcore_sub_FTsupp1 : M`_\F^# \subset 'A1(M). +Proof. exact: setSD (Fcore_sub_FTcore maxM). Qed. + +Lemma Fcore_sub_FTsupp : M`_\F^# \subset 'A(M). +Proof. exact: subset_trans Fcore_sub_FTsupp1 FTsupp1_sub. Qed. + +Lemma Fcore_sub_FTsupp0 : M`_\F^# \subset 'A0(M). +Proof. exact: subset_trans Fcore_sub_FTsupp1 FTsupp1_sub0. Qed. + +Lemma Fitting_sub_FTsupp : 'F(M)^# \subset 'A(M). +Proof. +pose pi := \pi(M`_\F); have nilF := Fitting_nil M. +have [U defF]: {U : {group gT} | M`_\F \x U = 'F(M)}. + have hallH := pHall_subl (Fcore_sub_Fitting M) (gFsub _ _) (Fcore_Hall M). + exists 'O_pi^'('F(M))%G; rewrite (nilpotent_Hall_pcore nilF hallH). + exact: nilpotent_pcoreC. +apply/subsetP=> xy /setD1P[ntxy Fxy]; apply/bigcupP. +have [x [y [Hx Vy Dxy _]]] := mem_dprod defF Fxy. +have [z [ntz Hz czxy]]: exists z, [/\ z != 1%g, z \in M`_\F & x \in 'C[z]]. + have [-> | ntx] := eqVneq x 1%g; last by exists x; rewrite ?cent1id. + by have /trivgPn[z ntz] := mmax_Fcore_neq1 maxM; exists z; rewrite ?group1. +exists z; first by rewrite !inE ntz (subsetP (Fcore_sub_FTcore maxM)). +rewrite 3!inE ntxy {2}Dxy groupMl //= andbC (subsetP _ y Vy) //=; last first. + by rewrite sub_cent1 (subsetP _ _ Hz) // centsC; have [] := dprodP defF. +rewrite -FTtype_Pmax // (subsetP _ xy Fxy) //. +case MtypeP: (M \in _); last exact: gFsub. +by have [_ _ _ ->] := Fitting_structure maxM. +Qed. + +Lemma Fitting_sub_FTsupp0 : 'F(M)^# \subset 'A0(M). +Proof. exact: subset_trans Fitting_sub_FTsupp (FTsupp_sub0 M). Qed. + +Lemma FTsupp_eq1 : (2 < FTtype M)%N -> 'A(M) = 'A1(M). +Proof. +move=> typeMgt2; rewrite /'A(M) -(subnKC typeMgt2) /= -FTcore_eq_der1 //. +apply/setP=> y; apply/bigcupP/idP=> [[x A1x /setD1P[nty /setIP[Ms_y _]]] | A1y]. + exact/setD1P. +by exists y; rewrite // inE in_setI cent1id andbT -in_setD. +Qed. + +End MmaxFTsupp. + +Section SingleGroupSummaries. + +Variables M U K : {group gT}. +Hypotheses (maxM : M \in 'M) (complU : kappa_complement M U K). + +Let Kstar := 'C_(M`_\sigma)(K). + +Theorem BGsummaryA : + [/\ (*1*) [/\ M`_\sigma <| M, \sigma(M).-Hall(M) M`_\sigma & + \sigma(M).-Hall(G) M`_\sigma], + (*2*) \kappa(M).-Hall(M) K /\ cyclic K, + (*3*) [/\ U \in [complements to M`_\sigma <*> K in M], + K \subset 'N(U), + M`_\sigma <*> U <| M, + U <| U <*> K + & M`_\sigma * U * K = M], + (*4*) {in K^#, forall k, 'C_U[k] = 1} + & + [/\ (*5*) Kstar != 1 /\ {in K^#, forall k, K \x Kstar = 'C_M[k]}, + (*6*) [/\ M`_\F != 1, M`_\F \subset M`_\sigma, M`_\sigma \subset M^`(1), + M^`(1) \proper M & nilpotent (M^`(1) / M`_\F)], + (*7*) [/\ M^`(2) \subset 'F(M), M`_\F * 'C_M(M`_\F) = 'F(M) + & K :!=: 1 -> 'F(M) \subset M^`(1)] + & (*8*) M`_\F != M`_\sigma -> + [/\ U :=: 1, normedTI 'F(M)^# G M & prime #|K| ]]]. +Proof. +have [hallU hallK _] := complU; split. +- by rewrite pcore_normal Msigma_Hall // Msigma_Hall_G. +- by have [[]] := kappa_structure maxM complU. +- have [_ defM _ _ _] := kappa_compl_context maxM complU. + have [[_ UK _ defUK]] := sdprodP defM; rewrite defUK. + have [nsKUK _ mulUK nUK _] := sdprod_context defUK. + rewrite -mulUK mulG_subG mulgA => mulMsUK /andP[nMsU nMsK] _. + rewrite (norm_joinEr nUK) mulUK; split=> //. + rewrite inE coprime_TIg /= norm_joinEr //=. + by rewrite -mulgA (normC nUK) mulgA mulMsUK !eqxx. + rewrite (pnat_coprime _ (pHall_pgroup hallU)) // -pgroupE pgroupM. + rewrite (sub_pgroup _ (pHall_pgroup hallK)) => [|p k_p]; last first. + by apply/orP; right. + by rewrite (sub_pgroup _ (pcore_pgroup _ _)) => // p s_p; apply/orP; left. + have{defM} [[defM _ _] _ _ _ _] := kappa_structure maxM complU. + have [[MsU _ defMsU] _ _ _ _] := sdprodP defM; rewrite defMsU in defM. + have [_ mulMsU _ _] := sdprodP defMsU. + by rewrite norm_joinEr // mulMsU; case/sdprod_context: defM. +- by have [] := kappa_compl_context maxM complU. +split. +- have [K1 | ntK] := eqsVneq K 1. + rewrite /Kstar K1 cent1T setIT Msigma_neq1 // setDv. + by split=> // k; rewrite inE. + have PmaxM: M \in 'M_'P by rewrite inE -(trivg_kappa maxM hallK) ntK. + have [_ [defNK _] [-> _] _ _] := Ptype_structure PmaxM hallK. + have [_ _ cKKs tiKKs] := dprodP defNK; rewrite dprodEY //; split=> // k Kk. + by have [_ _ [_ _ _ [_ _ -> // _ _] _]] := Ptype_embedding PmaxM hallK. +- have [_ _ [_ ->] _] := Fitting_structure maxM. + by have [[]] := Fcore_structure maxM. +- have [_ [-> defF _] _ sFM'] := Fitting_structure maxM. + have [_ -> _] := cprodP defF; split=> // ntK. + by rewrite sFM' // inE -(trivg_kappa maxM hallK) ntK. +move=> not_nilMs; pose q := #|Kstar|. +have solMs: solvable M`_\sigma := solvableS (pcore_sub _ _) (mmax_sol maxM). +have [D hallD] := Hall_exists q^' solMs. +have [_] := Fcore_structure maxM; case/(_ K D)=> //. +case=> P1maxM _ _ [-> _ _ _] _ _ _; split=> //. + by apply/eqP; rewrite (trivg_kappa_compl maxM complU). +by apply: contraR not_nilMs; case/nonTI_Fitting_facts=> // _ -> _. +Qed. + +(* This is a variant of B & G, Lemma 16.1(e) that better fits the Peterfalvi *) +(* definitions. *) +Lemma sdprod_FTder : M`_\sigma ><| U = M^`(FTtype M != 1%N). +Proof. +rewrite -FTtype_Fmax // (trivgFmax maxM complU). +have [[defM _ _] defM' _ _ _] := kappa_structure maxM complU. +by case: (altP eqP) defM' defM => [-> _ | _ [] //]; rewrite sdprodg1. +Qed. + +Theorem BGsummaryB : + [/\ (*1*) forall p S, p.-Sylow(U) S -> abelian S /\ 'r(S) <= 2, + (*2*) abelian <<U :&: 'A(M)>>, + (*3*) exists U0 : {group gT}, + [/\ U0 \subset U, exponent U0 = exponent U & [disjoint U0 & 'A(M)]] + & (*4*) (forall X, X \subset U -> X :!=: 1 -> 'C_(M`_\sigma)(X) != 1 -> + 'M('C(X)) = [set M]) + /\ (*5*) ('A(M) != 'A1(M) -> normedTI ('A(M) :\: 'A1(M)) G M)]. +Proof. +split. +- move=> p S sylS; have [hallU _ _] := complU; have [sUM sk'U _] := and3P hallU. + have [-> | ntS] := eqsVneq S 1; first by rewrite abelian1 rank1. + have sk'p: p \in \sigma_kappa(M)^'. + by rewrite (pnatPpi sk'U) // -p_rank_gt0 -(rank_Sylow sylS) rank_gt0. + have{sylS} sylS := subHall_Sylow hallU sk'p sylS. + have [[sSM pS _] [/= s'p _]] := (and3P sylS, norP sk'p). + rewrite (sigma'_nil_abelian maxM) ?(pi_pgroup pS) ?(pgroup_nil pS) //. + rewrite (rank_Sylow sylS) leqNgt (contra _ s'p) //; exact: alpha_sub_sigma. +- have [_ _ _ cUA_UA _] := kappa_structure maxM complU. + apply: abelianS cUA_UA; rewrite genS // -big_distrr ?setIS -?def_FTcore //=. + by apply/bigcupsP=> x A1x; rewrite (bigcup_max x) // setDE setIAC subsetIr. +- have [-> | ntU] := eqsVneq U 1. + exists 1%G; split; rewrite // disjoint_sym disjoints_subset. + by apply/bigcupsP=> x _; rewrite setDE subsetIr. + have [_ _ _ _ [// | U0 [sU0U expU0 frobU0]]] := kappa_structure maxM complU. + exists U0; split; rewrite // -setI_eq0 big_distrr /= /'A1(M) def_FTcore //. + rewrite big1 // => x A1x; apply/eqP; rewrite setIDA setD_eq0 setICA. + by rewrite (Frobenius_reg_compl frobU0) ?subsetIr. +set part4 := forall X, _; have part4holds: part4. + move=> X sXU ntX nregX. + by have [_ _] := kappa_structure maxM complU; case/(_ X). +have [[nsMsM _ _] _ [_ _ nsMsUM _ _] _ _] := BGsummaryA. +have{nsMsM nsMsUM}[[_ nMsM] [_ nMsUM]] := (andP nsMsM, andP nsMsUM). +rewrite eqEsubset FTsupp1_sub // -setD_eq0 andbT; set B := _ :\: _. +have nBM: M \subset 'N(B) by rewrite normsD ?FTsupp_norm ?FTsupp1_norm. +have uniqB y (u := y.`_\sigma(M)^'): y \in B -> 'M('C[u]) = [set M]. + case/setDP=> /bigcupP[x /setD1P[ntx Ms_x] /setD1P[nty /setIP[M'y cxy]]]. + rewrite !inE nty def_FTcore //= in Ms_x * => notMs_y; set M' := M^`(_) in M'y. + have [nsMsM' _ _ _ _] := sdprod_context sdprod_FTder. + have [[sMsM' nMsM'] sM'M]:= (andP nsMsM', der_sub _ M : M' \subset M). + have hallMs := pHall_subl sMsM' sM'M (Msigma_Hall maxM). + have hallU: \sigma(M)^'.-Hall(M') U. + by rewrite -(compl_pHall _ hallMs) sdprod_compl ?sdprod_FTder. + have suM': <[u]> \subset M' by rewrite cycle_subG groupX. + have solM': solvable M' := solvableS sM'M (mmax_sol maxM). + have [z M'z suzU] := Hall_Jsub solM' hallU suM' (p_elt_constt _ _). + have Mz': z^-1 \in M by rewrite groupV (subsetP sM'M). + rewrite -(conjgK z u) -(group_inj (conjGid Mz')) -cent_cycle. + rewrite !cycleJ centJ; apply: def_uniq_mmaxJ (part4holds _ suzU _ _). + rewrite /= -cycleJ cycle_eq1 -consttJ; apply: contraNneq notMs_y. + move/constt1P; rewrite p_eltNK p_eltJ => sMy. + by rewrite (mem_normal_Hall hallMs). + rewrite -(normsP nMsM' z M'z) centJ -conjIg -(isog_eq1 (conj_isog _ _)). + by apply/trivgPn; exists x; rewrite //= inE Ms_x cent_cycle cent1C groupX. +split=> // nzB; apply/normedTI_P; rewrite setTI; split=> // a _. +case/pred0Pn=> x /andP[/= Bx]; rewrite mem_conjg => /uniqB/(def_uniq_mmaxJ a). +rewrite consttJ -normJ conjg_set1 conjgKV uniqB // => /set1_inj defM. +by rewrite -(norm_mmax maxM) inE {2}defM. +Qed. + +Let Z := K <*> Kstar. +Let Zhat := Z :\: (K :|: Kstar). + +(* We strengthened the uniqueness condition in part (4) to *) +(* 'M_\sigma(K) = [set Mstar]. *) +Theorem BGsummaryC : K :!=: 1 -> + [/\ + [/\ (*1*) abelian U /\ ~~ ('N(U) \subset M), + (*2*) [/\ cyclic Kstar, Kstar != 1, Kstar \subset M`_\F & ~~ cyclic M`_\F] + & (*3*) M`_\sigma ><| U = M^`(1) /\ Kstar \subset M^`(2)], + exists Mstar, + [/\ (*4*) [/\ Mstar \in 'M_'P, 'C_(Mstar`_\sigma)(Kstar) = K, + \kappa(Mstar).-Hall(Mstar) Kstar + & 'M_\sigma(K) = [set Mstar]], (* uniqueness *) + (*5*) {in 'E^1(Kstar), forall X, 'M('C(X)) = [set M]} + /\ {in 'E^1(K), forall Y, 'M('C(Y)) = [set Mstar]}, + (*6*) [/\ M :&: Mstar = Z, K \x Kstar = Z & cyclic Z] + & (*7*) (M \in 'M_'P2 \/ Mstar \in 'M_'P2) + /\ {in 'M_'P, forall H, gval H \in M :^: G :|: Mstar :^: G}] +& [/\ (*8*) normedTI Zhat G Z, + (*9*) let B := 'A0(M) :\: 'A(M) in + B = class_support Zhat M /\ normedTI B G M, + (*10*) U :!=: 1 -> + [/\ prime #|K|, normedTI 'F(M)^# G M & M`_\sigma \subset 'F(M)] + & (*11*) U :==: 1 -> prime #|Kstar| ]]. +Proof. +move=> ntK; have [_ hallK _] := complU. +have PmaxM: M \in 'M_'P by rewrite inE -(trivg_kappa maxM hallK) ntK. +split. +- have [_ [//|-> ->] _ _ _] := kappa_structure maxM complU. + have [-> -> -> -> ->] := Ptype_cyclics PmaxM hallK; do 2!split=> //. + have [L maxCK_L] := mmax_exists (mFT_cent_proper ntK). + have [-> | ntU] := eqsVneq U 1. + by rewrite norm1 proper_subn // mmax_proper. + have P2maxM: M \in 'M_'P2 by rewrite inE -(trivg_kappa_compl maxM complU) ntU. + have [r _ rU] := rank_witness U; have [R sylR] := Sylow_exists r U. + have ntR: R :!=: 1 by rewrite -rank_gt0 (rank_Sylow sylR) -rU rank_gt0. + have ltRG: R \proper G := mFT_pgroup_proper (pHall_pgroup sylR). + have [H maxNR_H] := mmax_exists (mFT_norm_proper ntR ltRG). + apply: contra (subset_trans (subsetIr H _)) _. + by have [_ _ _ [->]] := P2type_signalizer P2maxM complU maxCK_L sylR maxNR_H. +- have [L [PmaxL _] [uniqL []]] := Ptype_embedding PmaxM hallK. + rewrite -/Kstar -/Z -/Zhat => hallKstar _ [defK _] [cycZ defML _ _ _]. + case=> _ P2_MorL Pmax_conjMorL _; exists L. + suffices uniqMSK: 'M_\sigma(K) = [set L]. + have [_ [defNK _] [_ uniqM] _ _] := Ptype_structure PmaxM hallK. + do 2!split=> //; last by case: P2_MorL => [] [-> _]; [left | right]. + by have [_ _ cKKs tiKKs] := dprodP defNK; rewrite dprodEY. + have sKLs: K \subset L`_\sigma by rewrite -defK subsetIl. + have [X E1X]: exists X, X \in 'E^1(K) by apply/rank_geP; rewrite rank_gt0. + have sXK: X \subset K by case/nElemP: E1X => ? /pnElemP[]. + have [maxL sCXL] := mem_uniq_mmax (uniqL X E1X). + have [x defKx] := cyclicP (cyclicS (joing_subl _ _) cycZ). + have SMxL: L \in 'M_\sigma[x] by rewrite -defKx inE maxL. + have ell1x: \ell_\sigma(x) == 1%N. + by rewrite (Msigma_ell1 maxL) // !inE -cycle_eq1 -cycle_subG -defKx ntK. + apply/eqP; rewrite eq_sym eqEcard defKx sub1set SMxL cards1 leqNgt. + apply/negP=> ntSMx; have [_ [//|_ ntR _ _]] := FT_signalizer_context ell1x. + case/(_ L)=> // /sdprodP[_ _ _ tiRL]; case/negP: ntR. + rewrite -subG1 -tiRL subsetIidl -setIA setICA setISS ?pcore_sub //. + by rewrite subsetIidr /= -cent_cycle -defKx (subset_trans (centS sXK) sCXL). +split; last 1 first. +- rewrite (trivg_kappa_compl maxM complU) => P1maxM. + have [L _ [_ _ _ _ [_ [] [] //]]] := Ptype_embedding PmaxM hallK. + by rewrite inE P1maxM. +- by have [L _ [_ _ _ _ [[]]]] := Ptype_embedding PmaxM hallK. +- have [L _ [_ _ _]] := Ptype_embedding PmaxM hallK; rewrite -/Zhat -/Z. + case=> cycZ defML defCK defCKs defCZhat [[tiZhat tiZhatM _] _ _ defM] B. + have sZM: Z \subset M by rewrite -[Z]defML subsetIl. + have sZhM: Zhat \subset M by rewrite subDset setUC subsetU ?sZM. + suffices defB: B = class_support Zhat M. + split=> //; apply/normedTI_P. + rewrite setTI normsD ?FTsupp_norm ?FTsupp0_norm //; split=> // [|g _]. + case/andP: tiZhat => /set0Pn[z Zz] _; apply/set0Pn; exists z. + by rewrite defB mem_class_support. + rewrite defB => /pred0Pn[_ /andP[/imset2P[z x Zz Mx ->] /= Bg_zx]]. + apply/idPn; rewrite -(groupMr g (groupVr Mx)) -in_setC. + case/tiZhatM/pred0Pn; exists z; rewrite /= Zz conjsgM mem_conjgV. + by apply: subsetP Bg_zx; rewrite conjSg class_support_subG. + rewrite /B /'A0(M); set M' := M^`(_); set su := \pi(M'). + have defM': M' = M^`(1) by rewrite /M' -FTtype_Pmax ?PmaxM. + have{hallK} hallM': su.-Hall(M) M'. + by rewrite Hall_pi //= -/M' defM' (sdprod_Hall defM) (pHall_Hall hallK). + have{hallM'} hallK: su^'.-Hall(M) K. + by rewrite -(compl_pHall _ hallM') /= -/M' defM' sdprod_compl. + have su'K: su^'.-group K := pHall_pgroup hallK. + have suKs: su.-group Kstar. + by rewrite (pgroupS _ (pgroup_pi _)) ///= -/M' defM' subIset ?Msigma_der1. + apply/setP=> x; rewrite !inE; apply/andP/imset2P=> [[]| [y a]]; last first. + case/setDP=> Zy; rewrite inE => /norP[not_Ky notKs_y] Ma ->. + have My := subsetP sZM y Zy; have Mya := groupJ My Ma. + have [not_suy not_su'y]: ~~ su.-elt y /\ ~~ su^'.-elt y. + have defZ: K * Kstar = Z by rewrite -cent_joinEr ?subsetIr. + have [hallK_Z hallKs] := coprime_mulGp_Hall defZ su'K suKs. + have ns_Z := sub_abelian_normal _ (cyclic_abelian cycZ). + rewrite -(mem_normal_Hall hallKs) -?ns_Z ?joing_subr // notKs_y. + by rewrite -(mem_normal_Hall hallK_Z) -?ns_Z ?joing_subl. + rewrite Mya !p_eltJ not_suy not_su'y orbT; split=> //. + apply: contra not_suy => /bigcupP[_ _ /setD1P[_ /setIP[M'ya _]]]. + by rewrite -(p_eltJ _ y a) (mem_p_elt (pgroup_pi _)). + move/negPf=> -> /and3P[Mx not_sux not_su'x]; set y := x.`_su^'. + have syM: <[y]> \subset M by rewrite cycle_subG groupX. + have [a Ma Kya] := Hall_Jsub (mmax_sol maxM) hallK syM (p_elt_constt _ _). + have{Kya} K1ya: y ^ a \in K^#. + rewrite !inE -cycle_subG cycleJ Kya andbT -consttJ. + by apply: contraNneq not_sux; move/constt1P; rewrite p_eltNK p_eltJ. + exists (x ^ a) a^-1; rewrite ?groupV ?conjgK // 2!inE andbC negb_or. + rewrite -[Z](defCK _ K1ya) inE groupJ // cent1C -consttJ groupX ?cent1id //. + by rewrite (contra (mem_p_elt su'K)) ?(contra (mem_p_elt suKs)) ?p_eltJ. +rewrite (trivg_kappa_compl maxM complU) => notP1maxM. +have P2maxM: M \in 'M_'P2 by exact/setDP. +split; first by have [_ _ _ _ []] := Ptype_structure PmaxM hallK. + apply: contraR notP1maxM; case/nonTI_Fitting_facts=> //. + by case/setUP=> //; case/idPn; case/setDP: PmaxM. +have [<- | neqMF_Ms] := eqVneq M`_\F M`_\sigma; first exact: Fcore_sub_Fitting. +have solMs: solvable M`_\sigma := solvableS (pcore_sub _ _) (mmax_sol maxM). +have [D hallD] := Hall_exists #|Kstar|^' solMs. +by case: (Fcore_structure maxM) notP1maxM => _ /(_ K D)[] // [[->]]. +Qed. + +End SingleGroupSummaries. + +Theorem BGsummaryD M : M \in 'M -> + [/\ (*1*) {in M`_\sigma &, forall x y, y \in x ^: G -> y \in x ^: M}, + (*2*) forall g (Ms := M`_\sigma), g \notin M -> + Ms:&: M :^ g = Ms :&: Ms :^ g /\ cyclic (Ms :&: M :^ g), + (*3*) {in M`_\sigma^#, forall x, + [/\ Hall 'C[x] 'C_M[x], 'R[x] ><| 'C_M[x] = 'C[x] + & let MGx := [set Mg in M :^: G | x \in Mg] in + [transitive 'R[x], on MGx | 'Js] /\ #|'R[x]| = #|MGx| ]} + & (*4*) {in M`_\sigma^#, forall x (N := 'N[x]), ~~ ('C[x] \subset M) -> + [/\ 'M('C[x]) = [set N] /\ N`_\F = N`_\sigma, + x \in 'A(N) :\: 'A1(N) /\ N \in 'M_'F :|: 'M_'P2, + \sigma(N)^'.-Hall(N) (M :&: N) + & N \in 'M_'P2 -> + [/\ M \in 'M_'F, + exists2 E, [Frobenius M = M`_\sigma ><| gval E] & cyclic E + & ~~ normedTI (M`_\F)^# G M]]}]. +Proof. +move=> maxM; have [[U K] /= complU] := kappa_witness maxM. +have defSM: {in M`_\sigma^#, + forall x, [set Mg in M :^: G | x \in Mg] = val @: 'M_\sigma[x]}. +- move=> x /setD1P[ntx Ms_x]. + have SMxM: M \in 'M_\sigma[x] by rewrite inE maxM cycle_subG. + apply/setP=> /= Mg; apply/setIdP/imsetP=> [[] | [H]]. + case/imsetP=> g _ -> Mg_x; exists (M :^ g)%G => //=. + rewrite inE cycle_subG (mem_Hall_pcore (Msigma_Hall _)) ?mmaxJ // maxM. + by rewrite (eq_p_elt _ (sigmaJ _ _)) (mem_p_elt (pcore_pgroup _ M)). + case/setIdP=> maxH; rewrite cycle_subG => Hs_x ->. + split; last exact: subsetP (pcore_sub _ _) x Hs_x. + pose p := pdiv #[x]; have pixp: p \in \pi(#[x]) by rewrite pi_pdiv order_gt1. + apply/idPn=> /(sigma_partition maxM maxH)/(_ p). + rewrite inE /= (pnatPpi (mem_p_elt (pcore_pgroup _ _) Ms_x)) //. + by rewrite (pnatPpi (mem_p_elt (pcore_pgroup _ _) Hs_x)). +split. +- have hallMs := pHall_subl (subxx _) (subsetT _) (Msigma_Hall_G maxM). + move=> x y Ms_x Ms_y /=/imsetP[a _ def_y]; rewrite def_y in Ms_y *. + have [b /setIP[Mb _ ->]] := sigma_Hall_tame maxM hallMs Ms_x Ms_y. + exact: mem_imset. +- move=> g notMg; split. + apply/eqP; rewrite eqEsubset andbC setIS ?conjSg ?pcore_sub //=. + rewrite subsetI subsetIl -MsigmaJ. + rewrite (sub_Hall_pcore (Msigma_Hall _)) ?mmaxJ ?subsetIr //. + rewrite (eq_pgroup _ (sigmaJ _ _)). + exact: pgroupS (subsetIl _ _) (pcore_pgroup _ _). + have [E hallE] := ex_sigma_compl maxM. + by have [_ _] := sigma_compl_embedding maxM hallE; case/(_ g). +- move=> x Ms1x /=. + have [[ntx Ms_x] ell1x] := (setD1P Ms1x, Msigma_ell1 maxM Ms1x). + have [[trR oR nsRC hallR] defC] := FT_signalizer_context ell1x. + have SMxM: M \in 'M_\sigma[x] by rewrite inE maxM cycle_subG. + suffices defCx: 'R[x] ><| 'C_M[x] = 'C[x]. + split=> //; first by rewrite -(sdprod_Hall defCx). + rewrite defSM //; split; last by rewrite (card_imset _ val_inj). + apply/imsetP; exists (gval M); first exact: mem_imset. + by rewrite -(atransP trR _ SMxM) -imset_comp. + have [| SMgt1] := leqP #|'M_\sigma[x]| 1. + rewrite leq_eqVlt {2}(cardD1 M) SMxM orbF => eqSMxM. + have ->: 'R[x] = 1 by apply/eqP; rewrite trivg_card1 oR. + by rewrite sdprod1g (setIidPr _) ?cent1_sub_uniq_sigma_mmax. + have [uniqN _ _ _ defCx] := defC SMgt1. + have{defCx} [[defCx _ _ _] [_ sCxN]] := (defCx M SMxM, mem_uniq_mmax uniqN). + by rewrite -setIA (setIidPr sCxN) in defCx. +move=> x Ms1x /= not_sCM. +have [[ntx Ms_x] ell1x] := (setD1P Ms1x, Msigma_ell1 maxM Ms1x). +have SMxM: M \in 'M_\sigma[x] by rewrite inE maxM cycle_subG. +have SMgt1: #|'M_\sigma[x]| > 1. + apply: contraR not_sCM; rewrite -leqNgt leq_eqVlt {2}(cardD1 M) SMxM orbF. + by move/cent1_sub_uniq_sigma_mmax->. +have [_ [//|uniqN ntR t2Nx notP1maxN]] := FT_signalizer_context ell1x. +have [maxN sCxN] := mem_uniq_mmax uniqN. +case/(_ M SMxM)=> _ st2NsM _ ->; split=> //. +- by rewrite (Fcore_eq_Msigma maxN (notP1type_Msigma_nil _)) // -in_setU. +- split=> //; apply/setDP; split. + have [y Ry nty] := trivgPn _ ntR; have [Nsy cxy] := setIP Ry. + apply/bigcupP; exists y; first by rewrite 2!inE def_FTcore ?nty. + rewrite 3!inE ntx cent1C cxy -FTtype_Pmax //= andbT. + have Nx: x \in 'N[x] by rewrite (subsetP sCxN) ?cent1id. + case PmaxN: ('N[x] \in 'M_'P) => //. + have [KN hallKN] := Hall_exists \kappa('N[x]) (mmax_sol maxN). + have [_ _ [_ _ _ _ [_ _ _ defN]]] := Ptype_embedding PmaxN hallKN. + have hallN': \kappa('N[x])^'.-Hall('N[x]) 'N[x]^`(1). + exact/(sdprod_normal_pHallP (der_normal 1 _) hallKN). + rewrite (mem_normal_Hall hallN') ?der_normal // (sub_p_elt _ t2Nx) // => p. + by case/andP=> _; apply: contraL => /rank_kappa->. + rewrite 2!inE ntx def_FTcore //=; apply: contra ntx => Ns_x. + rewrite -(constt_p_elt (mem_p_elt (pcore_pgroup _ _) Ns_x)). + by rewrite (constt1P (sub_p_elt _ t2Nx)) // => p; case/andP. +move=> P2maxN; have [PmaxN _] := setDP P2maxN; have [_ notFmaxN] := setDP PmaxN. +have [FmaxM _ [E _]] := nonFtype_signalizer_base maxM Ms1x not_sCM notFmaxN. +case=> cycE frobM; split=> //; first by exists E. +move: SMgt1; rewrite (cardsD1 M) SMxM ltnS lt0n => /pred0Pn[My /setD1P[neqMyM]]. +move/(mem_imset val); rewrite -defSM //= => /setIdP[/imsetP[y _ defMy] My_x]. +rewrite (Fcore_eq_Msigma maxM (notP1type_Msigma_nil _)) ?FmaxM //. +apply/normedTI_P=> [[_ _ /(_ y (in_setT y))/contraR/implyP/idPn[]]]. +rewrite -{1}(norm_mmax maxM) (sameP normP eqP) -defMy neqMyM. +apply/pred0Pn; exists x; rewrite /= conjD1g !inE ntx Ms_x /= -MsigmaJ. +rewrite (mem_Hall_pcore (Msigma_Hall _)) ?mmaxJ /= -?defMy //. +by rewrite defMy (eq_p_elt _ (sigmaJ _ _)) (mem_p_elt (pcore_pgroup _ _) Ms_x). +Qed. + +Lemma mmax_transversalP : + [/\ 'M^G \subset 'M, is_transversal 'M^G (orbit 'JG G @: 'M) 'M, + {in 'M^G &, injective (fun M => M :^: G)} + & {in 'M, forall M, exists x, (M :^ x)%G \in 'M^G}]. +Proof. +have: [acts G, on 'M | 'JG] by apply/actsP=> x _ M; rewrite mmaxJ. +case/orbit_transversalP; rewrite -/mmax_transversal => -> -> injMX memMX. +split=> // [M H MX_M MX_H /= eqMH | M /memMX[x _]]; last by exists x. +have /orbitP[x Gx defH]: val H \in M :^: G by rewrite eqMH orbit_refl. +by apply/eqP; rewrite -injMX // -(group_inj defH) (mem_orbit 'JG). +Qed. + +(* We are conforming to the statement of B & G, but we defer the introduction *) +(* of 'M^G to Peterfalvi (8.17), which requires several other changes. *) +Theorem BGsummaryE : + [/\ (*1*) forall M, M \in 'M -> + #|class_support M^~~ G| = (#|M`_\sigma|.-1 * #|G : M|)%N, + (*2*) {in \pi(G), forall p, + exists2 M : {group gT}, M \in 'M & p \in \sigma(M)} + /\ {in 'M &, forall M H, + gval H \notin M :^: G -> [predI \sigma(M) & \sigma(H)] =i pred0} + & (*3*) let PG := [set class_support M^~~ G | M : {group gT} in 'M] in + [/\ partition PG (cover PG), + 'M_'P = set0 :> {set {group gT}} -> cover PG = G^# + & forall M K, M \in 'M_'P -> \kappa(M).-Hall(M) K -> + let Kstar := 'C_(M`_\sigma)(K) in + let Zhat := (K <*> Kstar) :\: (K :|: Kstar) in + partition [set class_support Zhat G; cover PG] G^#]]. +Proof. +split=> [||PG]; first exact: card_class_support_sigma. + by split=> [p /sigma_mmax_exists[M]|]; [exists M | apply: sigma_partition]. +have [noPmax | ntPmax] := eqVneq 'M_'P (set0 : {set {group gT}}). + rewrite noPmax; move/eqP in noPmax; have [partPG _] := mFT_partition gT. + have /and3P[/eqP-> _ _] := partPG noPmax; rewrite partPG //. + by split=> // M K; rewrite inE. +have [_ partZPG] := mFT_partition gT. +have partPG: partition PG (cover PG). + have [M PmaxM] := set0Pn _ ntPmax; have [maxM _] := setDP PmaxM. + have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM). + have{partZPG} [/and3P[_ tiPG]] := partZPG M K PmaxM hallK. + rewrite inE => /norP[_ notPGset0] _; apply/and3P; split=> //; apply/trivIsetP. + by apply: sub_in2 (trivIsetP tiPG) => C; apply: setU1r. +split=> // [noPmax | M K PmaxM hallK]; first by case/eqP: ntPmax. +have [/=] := partZPG M K PmaxM hallK; rewrite -/PG; set Z := class_support _ G. +case/and3P=> /eqP defG1 tiZPG; rewrite 2!inE => /norP[nzZ _] notPGZ. +have [_ tiPG nzPG] := and3P partPG; have [maxM _] := setDP PmaxM. +rewrite /cover big_setU1 //= -/(cover PG) in defG1. +rewrite /trivIset /cover !big_setU1 //= (eqnP tiPG) -/(cover PG) in tiZPG. +have tiZ_PG: Z :&: cover PG = set0. + by apply/eqP; rewrite setI_eq0 -leq_card_setU eq_sym. +have notUPGZ: Z \notin [set cover PG]. + by rewrite inE; apply: contraNneq nzZ => defZ; rewrite -tiZ_PG -defZ setIid. +rewrite /partition /trivIset /(cover _) !big_setU1 // !big_set1 /= -defG1. +rewrite eqxx tiZPG !inE negb_or nzZ /= eq_sym; apply: contraNneq nzPG => PG0. +apply/imsetP; exists M => //; apply/eqP; rewrite eq_sym -subset0 -PG0. +by rewrite (bigcup_max (class_support M^~~ G)) //; apply: mem_imset. +Qed. + +Let typePfacts M (H := M`_\F) U W1 W2 W (defW : W1 \x W2 = W) : + M \in 'M -> of_typeP M U defW -> + [/\ M \in 'M_'P, \kappa(M).-Hall(M) W1, 'C_H(W1) = W2, + (M \in 'M_'P1) = (U :==: 1) || ('N(U) \subset M) + & let Ms := M`_\sigma in + Ms = M^`(1) -> (H == Ms) = (U :==: 1) /\ abelian (Ms / H) = abelian U]. +Proof. +move=> maxM []{defW}; move: W1 W2 => K Ks [cycK hallK ntK defM] /=. +have [[_ /= sHMs sMsM' _] _] := Fcore_structure maxM. +rewrite -/H in sHMs * => [] [nilU sUM' nUK defM'] _ [_ ntKs sKsH _ prKsK _]. +have [_ sKM mulM'K _ tiM'K] := sdprod_context defM. +have defKs: 'C_H(K) = Ks. + have [[x defK] sHM'] := (cyclicP cycK, subset_trans sHMs sMsM'). + have K1x: x \in K^# by rewrite !inE -cycle_eq1 -cycle_subG -defK subxx andbT. + by rewrite -(setIidPl sHM') -setIA defK cent_cycle prKsK // (setIidPr _). +have{hallK} kK: \kappa(M).-group K. + apply: sub_pgroup (pgroup_pi K) => p piKp. + rewrite unlock 4!inE -!andb_orr orNb andbT -andbA. + have [X EpX]: exists X, X \in 'E_p^1(K). + by apply/p_rank_geP; rewrite p_rank_gt0. + have [sXK abelX dimX] := pnElemP EpX; have [pX _] := andP abelX. + have sXM := subset_trans sXK sKM. + have ->: p \in \sigma(M)^'. + apply: contra (nt_pnElem EpX isT) => sp. + rewrite -subG1 -tiM'K subsetI (subset_trans _ sMsM') //. + by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) ?(pi_pgroup pX). + have ->: 'r_p(M) == 1%N. + rewrite -(p_rank_Hall (Hall_pi hallK)) // eqn_leq p_rank_gt0 piKp andbT. + apply: leq_trans (p_rank_le_rank p K) _. + by rewrite -abelian_rank1_cyclic ?cyclic_abelian. + apply/existsP; exists X; rewrite 2!inE sXM abelX dimX /=. + by rewrite (subG1_contra _ ntKs) // -defKs setISS ?centS. +have PmaxM : M \in 'M_'P. + apply/PtypeP; split=> //; exists (pdiv #|K|). + by rewrite (pnatPpi kK) // pi_pdiv cardG_gt1. +have hallK: \kappa(M).-Hall(M) K. + rewrite pHallE sKM -(eqn_pmul2l (cardG_gt0 M^`(1))) (sdprod_card defM). + have [K1 hallK1] := Hall_exists \kappa(M) (mmax_sol maxM). + have [_ _ [_ _ _ _ [_ _ _ defM1]]] := Ptype_embedding PmaxM hallK1. + by rewrite -(card_Hall hallK1) /= (sdprod_card defM1). +split=> // [|->]; first set Ms := M`_\sigma; last first. + rewrite trivg_card_le1 -(@leq_pmul2l #|H|) ?cardG_gt0 // muln1. + split; first by rewrite (sdprod_card defM') eqEcard (subset_trans sHMs). + have [_ mulHU nHU tiHU] := sdprodP defM'. + by rewrite -mulHU quotientMidl (isog_abelian (quotient_isog nHU tiHU)). +have [U1 | /= ntU] := altP eqP. + rewrite inE PmaxM -{2}mulM'K /= -defM' U1 sdprodg1 pgroupM. + have sH: \sigma(M).-group H := pgroupS sHMs (pcore_pgroup _ _). + rewrite (sub_pgroup _ sH) => [|p sMp]; last by rewrite inE /= sMp. + by rewrite (sub_pgroup _ kK) // => p kMp; rewrite inE /= kMp orbT. +have [P1maxM | notP1maxM] := boolP (M \in _). + have defMs: Ms = M^`(1). + have [U1 complU1] := ex_kappa_compl maxM hallK. + have [_ [//|<- _] _ _ _] := kappa_structure maxM complU1. + by case: (P1maxP maxM complU1 P1maxM) => _; move/eqP->; rewrite sdprodg1. + pose p := pdiv #|U|; have piUp: p \in \pi(U) by rewrite pi_pdiv cardG_gt1. + have hallU: \pi(H)^'.-Hall(M^`(1)) U. + have sHM': H \subset M^`(1) by rewrite -defMs. + have hallH := pHall_subl sHM' (der_sub 1 M) (Fcore_Hall M). + by rewrite -(compl_pHall _ hallH) ?sdprod_compl. + have piMs_p: p \in \pi(Ms) by rewrite defMs (piSg sUM'). + have{piMs_p} sMp: p \in \sigma(M) := pnatPpi (pcore_pgroup _ _) piMs_p. + have sylP: p.-Sylow(M^`(1)) 'O_p(U). + apply: (subHall_Sylow hallU (pnatPpi (pHall_pgroup hallU) piUp)). + exact: nilpotent_pcore_Hall nilU. + rewrite (subset_trans (char_norms (pcore_char p U))) //. + rewrite (norm_sigma_Sylow sMp) //. + by rewrite (subHall_Sylow (Msigma_Hall maxM)) //= -/Ms defMs. +suffices complU: kappa_complement M U K. + by symmetry; apply/idPn; have [[[]]] := BGsummaryC maxM complU ntK. +split=> //; last by rewrite -norm_joinEr ?groupP. +rewrite pHallE (subset_trans _ (der_sub 1 M)) //=. +rewrite -(@eqn_pmul2l #|H|) ?cardG_gt0 // (sdprod_card defM'). +have [U1 complU1] := ex_kappa_compl maxM hallK. +have [hallU1 _ _] := complU1; rewrite -(card_Hall hallU1). +have [_ [// | defM'1 _] _ _ _] := kappa_structure maxM complU1. +rewrite [H](Fcore_eq_Msigma maxM _) ?(sdprod_card defM'1) //. +by rewrite notP1type_Msigma_nil // in_setD notP1maxM PmaxM orbT. +Qed. + +(* This is B & G, Lemma 16.1. *) +Lemma FTtypeP i M : M \in 'M -> reflect (FTtype_spec i M) (FTtype M == i). +Proof. +move=> maxM; pose Ms := M`_\sigma; pose M' := M^`(1); pose H := M`_\F. +have [[ntH sHMs sMsM' _] _] := Fcore_structure maxM. +apply: (iffP eqP) => [<- | ]; last first. + case: i => [// | [[U [[[_ _ defM] _ [U0 [sU0U expU0 frobM]]] _]] | ]]. + apply/eqP; rewrite -FTtype_Fmax //; apply: wlog_neg => notFmaxM. + have PmaxM: M \in 'M_'P by apply/setDP. + apply/FtypeP; split=> // p; apply/idP=> kp. + have [X EpX]: exists X, X \in 'E_p^1(U0). + apply/p_rank_geP; rewrite p_rank_gt0 -pi_of_exponent expU0 pi_of_exponent. + have: p \in \pi(M) by rewrite kappa_pi. + rewrite /= -(sdprod_card defM) pi_ofM ?cardG_gt0 //; case/orP=> // Fk. + have [[_ sMFMs _ _] _] := Fcore_structure maxM. + case/negP: (kappa_sigma' kp). + exact: pnatPpi (pcore_pgroup _ _) (piSg sMFMs Fk). + have [[sXU0 abelX _] ntX] := (pnElemP EpX, nt_pnElem EpX isT). + have kX := pi_pgroup (abelem_pgroup abelX) kp. + have [_ sUM _ _ _] := sdprod_context defM. + have sXM := subset_trans sXU0 (subset_trans sU0U sUM). + have [K hallK sXK] := Hall_superset (mmax_sol maxM) sXM kX. + have [ntKs _ _ sKsMF _] := Ptype_cyclics PmaxM hallK; case/negP: ntKs. + rewrite -subG1 -(cent_semiregular (Frobenius_reg_ker frobM) sXU0 ntX). + by rewrite subsetI sKsMF subIset // centS ?orbT. + case=> [[U W K Ks defW [[PtypeM ntU _ _] _ not_sNUM _ _]] | ]. + apply/eqP; rewrite -FTtype_P2max // inE andbC. + by have [-> _ _ -> _] := typePfacts maxM PtypeM; rewrite negb_or ntU. + case=> [[U W K Ks defW [[PtypeM ntU _ _] cUU sNUM]] | ]. + have [_ _ _] := typePfacts maxM PtypeM. + rewrite (negPf ntU) sNUM FTtype_P1max // cUU /FTtype -/Ms -/M' -/H. + by case: ifP => // _; case: (Ms =P M') => // -> _ [//|-> ->]. + case=> [[U W K Ks defW [[PtypeM ntU _ _] not_cUU sNUM]] | ]. + have [_ _ _] := typePfacts maxM PtypeM. + rewrite (negPf ntU) (negPf not_cUU) sNUM FTtype_P1max // /FTtype -/Ms -/M'. + by case: ifP => // _; case: (Ms =P M') => // -> _ [//|-> ->]. + case=> // [[U K Ks W defW [[PtypeM U_1] _]]]. + have [_ _ _] := typePfacts maxM PtypeM. + rewrite U_1 eqxx FTtype_P1max //= /FTtype -/Ms -/M' -/H. + by case: ifP => // _; case: (Ms =P M') => // -> _ [//|-> _]. +have [[U K] /= complU] := kappa_witness maxM; have [hallU hallK _] := complU. +have [K1 | ntK] := eqsVneq K 1. + have FmaxM: M \in 'M_'F by rewrite -(trivg_kappa maxM hallK) K1. + have ->: FTtype M = 1%N by apply/eqP; rewrite -FTtype_Fmax. + have ntU: U :!=: 1 by case/(FmaxP maxM complU): FmaxM. + have defH: H = Ms. + by apply/Fcore_eq_Msigma; rewrite // notP1type_Msigma_nil ?FmaxM. + have defM: H ><| U = M. + by have [_] := kappa_compl_context maxM complU; rewrite defH K1 sdprodg1. + exists U; split. + have [_ _ _ cU1U1 exU0] := kappa_structure maxM complU. + split=> //; last by rewrite -/Ms -defH in exU0; exact: exU0. + exists [group of <<\bigcup_(x in (M`_\sigma)^#) 'C_U[x]>>]. + split=> //= [|x Hx]; last by rewrite sub_gen //= -/Ms -defH (bigcup_max x). + rewrite -big_distrr /= /normal gen_subG subsetIl. + rewrite norms_gen ?normsI ?normG //; apply/subsetP=> u Uu. + rewrite inE sub_conjg; apply/bigcupsP=> x Msx. + rewrite -sub_conjg -normJ conjg_set1 (bigcup_max (x ^ u)) ?memJ_norm //. + by rewrite normD1 (subsetP (gFnorm _ _)) // (subsetP (pHall_sub hallU)). + have [|] := boolP [forall (y | y \notin M), 'F(M) :&: 'F(M) :^ y == 1]. + move/forall_inP=> TI_F; constructor 1; apply/normedTI_P. + rewrite setD_eq0 subG1 mmax_Fcore_neq1 // setTI normD1 gFnorm. + split=> // x _; apply: contraR => /TI_F/eqP tiFx. + rewrite -setI_eq0 conjD1g -setDIl setD_eq0 -set1gE -tiFx. + by rewrite setISS ?conjSg ?Fcore_sub_Fitting. + rewrite negb_forall_in => /exists_inP[y notMy ntX]. + have [_ _ _ _] := nonTI_Fitting_structure maxM notMy ntX. + case=> [[] | [_]]; first by constructor 2. + move: #|_| => p; set P := 'O_p(H); rewrite /= -/H => not_cPP cycHp'. + case=> [expU | [_]]; [constructor 3 | by rewrite 2!inE FmaxM]. + split=> [q /expU | ]. + have [_ <- nHU tiHU] := sdprodP defM. + by rewrite quotientMidl -(exponent_isog (quotient_isog _ _)). + have sylP: p.-Sylow(H) P := nilpotent_pcore_Hall _ (Fcore_nil M). + have ntP: P != 1 by apply: contraNneq not_cPP => ->; exact: abelian1. + by exists p; rewrite // -p_rank_gt0 -(rank_Sylow sylP) rank_gt0. +have PmaxM: M \in 'M_'P by rewrite inE -(trivg_kappa maxM hallK) ntK. +have [Mstar _ [_ _ _ [cycW _ _ _ _]]] := Ptype_embedding PmaxM hallK. +case=> [[tiV _ _] _ _ defM {Mstar}]. +have [_ [_ cycK] [_ nUK _ _ _] _] := BGsummaryA maxM complU; rewrite -/H. +case=> [[ntKs defCMK] [_ _ _ _ nilM'H] [sM''F defF /(_ ntK)sFM'] types34]. +have hallK_M := pHall_Hall hallK. +have [/= [[cUU not_sNUM]]] := BGsummaryC maxM complU ntK; rewrite -/H -/M' -/Ms. +case=> cycKs _ sKsH not_cycH [defM' sKsM''] _ [_ _ type2 _]. +pose Ks := 'C_H(K); pose W := K <*> Ks; pose V := W :\: (K :|: Ks). +have defKs: 'C_Ms(K) = Ks by rewrite -(setIidPr sKsH) setIA (setIidPl sHMs). +rewrite {}defKs -/W -/V in ntKs tiV cycW cycKs sKsM'' sKsH defCMK. +have{defCMK} prM'K: {in K^#, forall k, 'C_M'[k] = Ks}. + have sKsM': Ks \subset M' := subset_trans sKsM'' (der_sub 1 _). + move=> k; move/defCMK=> defW; have:= dprod_modr defW sKsM'. + have [_ _ _ ->] := sdprodP defM; rewrite dprod1g. + by rewrite setIA (setIidPl (der_sub 1 M)). +have [sHM' nsM'M] := (subset_trans sHMs sMsM', der_normal 1 M : M' <| M). +have hallM': \kappa(M)^'.-Hall(M) M' by apply/(sdprod_normal_pHallP _ hallK). +have [sM'M k'M' _] := and3P hallM'. +have hallH_M': \pi(H).-Hall(M') H := pHall_subl sHM' sM'M (Fcore_Hall M). +have nsHM' := normalS sHM' sM'M (Fcore_normal M). +have defW: K \x Ks = W. + rewrite dprodEY ?subsetIr //= setIC; apply/trivgP. + by have [_ _ _ <-] := sdprodP defM; rewrite setSI ?subIset ?sHM'. +have [Ueq1 | ntU] := eqsVneq U 1; last first. + have P2maxM: M \in 'M_'P2 by rewrite inE -(trivg_kappa_compl maxM complU) ntU. + have ->: FTtype M = 2 by apply/eqP; rewrite -FTtype_P2max. + have defH: H = Ms. + by apply/Fcore_eq_Msigma; rewrite // notP1type_Msigma_nil ?P2maxM ?orbT. + have [//|pr_K tiFM _] := type2; rewrite -defH in defM'. + have [_ sUM' _ _ _] := sdprod_context defM'. + have MtypeP: of_typeP M U defW by split; rewrite // abelian_nil. + have defM'F: M'`_\F = H. + apply/eqP; rewrite eqEsubset (Fcore_max hallH_M') ?Fcore_nil // andbT. + rewrite (Fcore_max (subHall_Hall hallM' _ (Fcore_Hall _))) ?Fcore_nil //. + by move=> p piM'Fp; apply: pnatPpi k'M' (piSg (Fcore_sub _) piM'Fp). + exact: char_normal_trans (Fcore_char _) nsM'M. + exists U _ K _ defW; split=> //; split; first by rewrite defM'F. + by exists U; split=> // x _; apply: subsetIl. + have [_ _ _ _ /(_ ntU)] := kappa_structure maxM complU. + by rewrite -/Ms -defH -defM'F. +have P1maxM: M \in 'M_'P1 by rewrite -(trivg_kappa_compl maxM complU) Ueq1. +have: 2 < FTtype M <= 5 by rewrite -FTtype_P1max. +rewrite /FTtype -/H -/Ms; case: ifP => // _; case: eqP => //= defMs _. +have [Y hallY nYK]: exists2 Y, \pi(H)^'.-Hall(M') (gval Y) & K \subset 'N(Y). + apply: coprime_Hall_exists; first by case/sdprodP: defM. + by rewrite (coprime_sdprod_Hall_l defM) (pHall_Hall hallM'). + exact: solvableS sM'M (mmax_sol maxM). +have{defM'} defM': H ><| Y = M' by apply/(sdprod_normal_p'HallP _ hallY). +have MtypeP: of_typeP M Y defW. + have [_ sYM' mulHY nHY tiHY] := sdprod_context defM'. + do 2!split=> //; rewrite (isog_nil (quotient_isog nHY tiHY)). + by rewrite /= -quotientMidl mulHY. +have [_ _ _ sNYG [//| defY1 ->]] := typePfacts maxM MtypeP. +rewrite defY1; have [Y1 | ntY] := altP (Y :=P: 1); last first. + move/esym: sNYG; rewrite (negPf ntY) P1maxM /= => sNYG. + have [|_ tiFM prK] := types34; first by rewrite defY1. + by case: ifPn; exists Y _ K _ defW. +exists Y _ K _ defW; split=> //=. +have [|] := boolP [forall (y | y \notin M), 'F(M) :&: 'F(M) :^ y == 1]. + move/forall_inP=> TI_F; constructor 1; apply/normedTI_P. + rewrite setD_eq0 subG1 mmax_Fcore_neq1 // setTI normD1 gFnorm. + split=> // x _; apply: contraR => /TI_F/eqP tiFx. + rewrite -setI_eq0 conjD1g -setDIl setD_eq0 -set1gE -tiFx. + by rewrite setISS ?conjSg ?Fcore_sub_Fitting. +rewrite negb_forall_in => /exists_inP[y notMy ntX]. +have [_ _ _ _] := nonTI_Fitting_structure maxM notMy ntX. +case=> [[] | [_]]; first by case/idPn; case/setDP: PmaxM. +move: #|_| => p; set P := 'O_p(H); rewrite /= -/H => not_cPP cycHp'. +have sylP: p.-Sylow(H) P := nilpotent_pcore_Hall _ (Fcore_nil M). +have ntP: P != 1 by apply: contraNneq not_cPP => ->; exact: abelian1. +have piHp: p \in \pi(H) by rewrite -p_rank_gt0 -(rank_Sylow sylP) rank_gt0. +have defH: H = Ms by apply/eqP; rewrite defY1 Y1. +rewrite -defMs -defH in defM; have [_ <- nHU tiHU] := sdprodP defM. +rewrite quotientMidl -(card_isog (quotient_isog _ _)) //. +rewrite -(exponent_isog (quotient_isog _ _)) // exponent_cyclic //=. +case=> [K_dv_H1 | []]; [constructor 2 | constructor 3]; exists p => //. +by rewrite K_dv_H1. +Qed. + +(* This is B & G, Theorem I. *) +(* Note that the first assertion is not used in the Perterfalvi revision of *) +(* the character theory part of the proof. *) +Theorem BGsummaryI : + [/\ forall H x a, Hall G H -> nilpotent H -> x \in H -> x ^ a \in H -> + exists2 y, y \in 'N(H) & x ^ a = x ^ y + & {in 'M, forall M, FTtype M == 1%N} + \/ exists ST : {group gT} * {group gT}, let (S, T) := ST in + [/\ S \in 'M /\ T \in 'M, + exists Wi : {group gT} * {group gT}, let (W1, W2) := Wi in + let W := W1 <*> W2 in let V := W :\: (W1 :|: W2) in + (*a*) [/\ cyclic W, normedTI V G W & W1 :!=: 1 /\ W2 :!=: 1] /\ + (*b*) [/\ S^`(1) ><| W1 = S, T^`(1) ><| W2 = T & S :&: T = W], + (*c*) {in 'M, forall M, FTtype M != 1%N -> + exists x, S :^ x = M \/ T :^ x = M}, + (*d*) FTtype S == 2 \/ FTtype T == 2 + & (*e*) 1 < FTtype S <= 5 /\ 1 < FTtype T <= 5]]. +Proof. +split=> [H x a hallH nilH Hx|]. + have [M maxM sHMs] := nilpotent_Hall_sigma nilH hallH. + have{hallH} hallH := pHall_subl sHMs (subsetT _) (Hall_pi hallH). + by case/(sigma_Hall_tame maxM hallH Hx) => // y; case/setIP; exists y. +have [allFM | ] := boolP (('M : {set {group gT}}) \subset 'M_'F). + by left=> M maxM; rewrite -FTtype_Fmax // (subsetP allFM). +case/subsetPn=> S maxS notFmaxS; right. +have PmaxS: S \in 'M_'P by exact/setDP. +have [[U W1] /= complU] := kappa_witness maxS; have [_ hallW1 _] := complU. +have ntW1: W1 :!=: 1 by rewrite (trivg_kappa maxS). +have [[_ [_]]] := BGsummaryC maxS complU ntW1; set W2 := 'C_(_)(W1) => ntW2 _. +set W := W1 <*> W2; set V := W :\: _ => _ _ [T [[PmaxT defW1 hallW2 _] _]]. +case=> defST _ cycW [P2maxST PmaxST] [tiV _ _] _. +have [maxT _] := setDP PmaxT. +have [_ _ [_ _ _ _ [_ _ _ defS]]] := Ptype_embedding PmaxS hallW1. +have [_ _ [_ _ _ _ [_ _ _ defT]]] := Ptype_embedding PmaxT hallW2. +exists (S, T); split=> //; first by exists (W1, [group of W2]). +- move=> M maxM; rewrite /= -FTtype_Pmax //. + by case/PmaxST/setUP => /imsetP[x _ ->]; exists x; by [left | right]. +- by rewrite -!{1}FTtype_P2max. +rewrite !{1}(ltn_neqAle 1) -!{1}andbA !{1}FTtype_range // !{1}andbT. +by rewrite !{1}(eq_sym 1%N) -!{1}FTtype_Pmax. +Qed. + +Lemma FTsupp0_type1 M : FTtype M == 1%N -> 'A0(M) = 'A(M). +Proof. +move=> typeM; apply/setUidPl/subsetP=> x; rewrite typeM !inE => /and3P[Mx]. +by rewrite (mem_p_elt (pgroup_pi M)). +Qed. + +Lemma FTsupp0_typeP M (H := M`_\F) U W1 W2 W (defW : W1 \x W2 = W) : + M \in 'M -> of_typeP M U defW -> + let V := W :\: (W1 :|: W2) in 'A0(M) :\: 'A(M) = class_support V M. +Proof. +move: W1 W2 => K Ks in defW * => maxM MtypeP /=. +have [[_ _ ntK _] _ _ _ _] := MtypeP. +have [PmaxM hallK defKs _ _] := typePfacts maxM MtypeP. +have [[_ sHMs _ _] _] := Fcore_structure maxM. +have [V complV] := ex_kappa_compl maxM hallK. +have [[_ [_ _ sKsH _] _] _ [_ [-> _] _ _]] := BGsummaryC maxM complV ntK. +by rewrite -(setIidPr sKsH) setIA (setIidPl sHMs) defKs -(dprodWY defW). +Qed. + +(* This is the part of B & G, Theorem II that is relevant to the proof of *) +(* Peterfalvi (8.7). We drop the considerations on the set of supporting *) +(* groups, in particular (Tii)(a), but do include additional information on D *) +(* namely the fact that D is included in 'A1(M), not just 'A(M). *) +Theorem BGsummaryII M (X : {set gT}) : + M \in 'M -> X \in pred2 'A(M) 'A0(M) -> + let D := [set x in X | ~~ ('C[x] \subset M)] in + [/\ D \subset 'A1(M), (* was 'A(M) in B & G *) + (*i*) {in X, forall x a, x ^ a \in X -> exists2 y, y \in M & x ^ a = x ^ y} + & {in D, forall x (L := 'N[x]), + [/\ (*ii*) 'M('C[x]) = [set L], FTtype L \in pred2 1%N 2, + [/\ (*b*) L`_\F ><| (M :&: L) = L, + (*c*) {in X, forall y, coprime #|L`_\F| #|'C_M[y]| }, + (*d*) x \in 'A(L) :\: 'A1(L) + & (*e*) 'C_(L`_\F)[x] ><| 'C_M[x] = 'C[x]] + & (*iii*) FTtype L == 2 -> + exists2 E, [Frobenius M = M`_\F ><| gval E] & cyclic E]}]. +Proof. +move=> maxM defX. +have sA0M: 'A0(M) \subset M := subset_trans (FTsupp0_sub M) (subsetDl M 1). +have sAA0: 'A(M) \subset 'A0(M) := FTsupp_sub0 M. +have sAM: 'A(M) \subset M := subset_trans sAA0 sA0M. +without loss {defX} ->: X / X = 'A0(M). + case/pred2P: defX => ->; move/(_ _ (erefl _))=> //. + set D0 := finset _ => [[sD0A1 tameA0 signD0]] D. + have sDD0: D \subset D0 by rewrite /D /D0 !setIdE setSI. + split=> [|x Ax a Axa|x Dx]; first exact: subset_trans sDD0 sD0A1. + by apply: tameA0; exact: (subsetP sAA0). + have [/= -> -> [-> coA0L -> -> frobL]] := signD0 x (subsetP sDD0 x Dx). + by do 2![split=> //] => y Ay; rewrite coA0L // (subsetP sAA0). +move=> {X} D; pose Ms := M`_\sigma. +have tiA0A x a: x \in 'A0(M) :\: 'A(M) -> x ^ a \notin 'A(M). + rewrite 3!inE; case: (x \in _) => //= /and3P[_ notM'x _]. + apply: contra notM'x => /bigcupP[y _ /setD1P[_ /setIP[Mx _]]]. + by rewrite -(p_eltJ _ _ a) (mem_p_elt (pgroup_pi _)). +have tiA0 x a: x \in 'A0(M) :\: 'A1(M) -> x ^ a \in 'A0(M) -> a \in M. + case/setDP=> A0x notA1x A0xa. + have [Mx Mxa] := (subsetP sA0M x A0x, subsetP sA0M _ A0xa). + have [[U K] /= complU] := kappa_witness maxM. + have [Ax | notAx] := boolP (x \in 'A(M)). + have [_ _ _ [_]] := BGsummaryB maxM complU; set B := _ :\: _ => tiB. + have Bx: x \in B by apply/setDP. + have /tiB/normedTI_memJ_P: 'A(M) != 'A1(M) by apply: contraTneq Ax => ->. + case=> _ _ /(_ x) <- //; rewrite 3?inE // conjg_eq1; apply/andP; split. + apply: contra notA1x; rewrite !inE def_FTcore // => /andP[->]. + by rewrite !(mem_Hall_pcore (Msigma_Hall maxM)) // p_eltJ. + by apply: contraLR Ax => notAxa; rewrite -(conjgK a x) tiA0A // inE notAxa. + have ntK: K :!=: 1. + rewrite -(trivgFmax maxM complU) FTtype_Fmax //. + by apply: contra notAx => /FTsupp0_type1 <-. + have [_ _ [_ [_ /normedTI_memJ_P[_ _ tiB]] _ _]]:= BGsummaryC maxM complU ntK. + by rewrite -(tiB x) inE ?tiA0A ?notAx // inE notAx. +have sDA1: D \subset 'A1(M). + apply/subsetPn=> [[x /setIdP[A0x not_sCxM] notA1x]]. + case/subsetP: not_sCxM => a cxa. + by apply: (tiA0 x); [exact/setDP | rewrite /conjg -(cent1P cxa) mulKg]. +have sDMs1: D \subset Ms^# by rewrite /Ms -def_FTcore. +have [tameMs _ signM PsignM] := BGsummaryD maxM. +split=> // [x A0x a A0xa|x Dx]. + have [A1x | notA1x] := boolP (x \in 'A1(M)); last first. + by exists a; rewrite // (tiA0 x) // inE notA1x. + case/setD1P: A1x => _; rewrite def_FTcore // => Ms_x. + apply/imsetP; rewrite tameMs ?mem_imset ?inE //. + rewrite (mem_Hall_pcore (Msigma_Hall maxM)) ?(subsetP sA0M) //. + by rewrite p_eltJ (mem_p_elt (pcore_pgroup _ _) Ms_x). +have [Ms1x [_ not_sCxM]] := (subsetP sDMs1 x Dx, setIdP Dx). +have [[uniqN defNF] [ANx typeN hallMN] type2] := PsignM x Ms1x not_sCxM. +have [maxN _] := mem_uniq_mmax uniqN. +split=> //; last 1 first. +- rewrite -FTtype_P2max // => /type2[FmaxM]. + by rewrite (Fcore_eq_Msigma maxM _) // notP1type_Msigma_nil ?FmaxM. +- by rewrite !inE -FTtype_Fmax // -FTtype_P2max // -in_setU. +split=> // [|y A0y|]; rewrite defNF ?sdprod_sigma //=; last by case/signM: Ms1x. +rewrite coprime_pi' ?cardG_gt0 // -pgroupE. +rewrite (eq_p'group _ (pi_Msigma maxN)); apply: wlog_neg => not_sNx'CMy. +have ell1x := Msigma_ell1 maxM Ms1x. +have SMxM: M \in 'M_\sigma[x] by rewrite inE maxM cycle_subG; case/setD1P: Ms1x. +have MSx_gt1: #|'M_\sigma[x]| > 1. + rewrite ltn_neqAle lt0n {2}(cardD1 M) SMxM andbT eq_sym. + by apply: contra not_sCxM; move/cent1_sub_uniq_sigma_mmax->. +have [FmaxM t2'M]: M \in 'M_'F /\ \tau2(M)^'.-group M. + apply: (non_disjoint_signalizer_Frobenius ell1x MSx_gt1 SMxM). + by apply: contra not_sNx'CMy; exact: pgroupS (subsetIl _ _). +have defA0: 'A0(M) = Ms^#. + rewrite FTsupp0_type1; last by rewrite -FTtype_Fmax. + rewrite /'A(M) /'A1(M) -FTtype_Fmax // FmaxM def_FTcore //= -/Ms. + apply/setP => z; apply/bigcupP/idP=> [[t Ms1t] | Ms1z]; last first. + have [ntz Ms_z] := setD1P Ms1z. + by exists z; rewrite // 3!inE ntz cent1id (subsetP (pcore_sub _ _) z Ms_z). + case/setD1P=> ntz; case/setIP=> Mz ctz. + rewrite 2!inE ntz (mem_Hall_pcore (Msigma_Hall maxM)) //. + apply: sub_in_pnat (pnat_pi (order_gt0 z)) => p _ pi_z_p. + have szM: <[z]> \subset M by rewrite cycle_subG. + have [piMp [_ k'M]] := (piSg szM pi_z_p, setIdP FmaxM). + apply: contraR (pnatPpi k'M piMp) => s'p /=. + rewrite unlock; apply/andP; split. + have:= piMp; rewrite (partition_pi_mmax maxM) (negPf s'p) orbF. + by rewrite orbCA [p \in _](negPf (pnatPpi t2'M piMp)). + move: pi_z_p; rewrite -p_rank_gt0 /= -(setIidPr szM). + case/p_rank_geP=> P; rewrite pnElemI -setIdE => /setIdP[EpP sPz]. + apply/exists_inP; exists P => //; apply/trivgPn. + have [ntt Ms_t] := setD1P Ms1t; exists t => //. + by rewrite inE Ms_t (subsetP (centS sPz)) // cent_cycle cent1C. +move: A0y; rewrite defA0 => /setD1P[nty Ms_y]. +have sCyMs: 'C_M[y] \subset Ms. + rewrite -[Ms](setD1K (group1 _)) -subDset /= -defA0 subsetU //. + rewrite (bigcup_max y) //; first by rewrite 2!inE nty def_FTcore. + by rewrite -FTtype_Fmax ?FmaxM. +have notMGN: gval 'N[x] \notin M :^: G. + have [_ [//|_ _ t2Nx _ _]] := FT_signalizer_context ell1x. + have [ntx Ms_x] := setD1P Ms1x; have sMx := mem_p_elt (pcore_pgroup _ _) Ms_x. + apply: contra ntx => /imsetP[a _ defN]. + rewrite -order_eq1 (pnat_1 sMx (sub_p_elt _ t2Nx)) // => p. + by rewrite defN tau2J // => /andP[]. +apply: sub_pgroup (pgroupS sCyMs (pcore_pgroup _ _)) => p sMp. +by apply: contraFN (sigma_partition maxM maxN notMGN p) => sNp; apply/andP. +Qed. + +End Section16. + + |
