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/PFsection8.v | |
Initial commit
Diffstat (limited to 'mathcomp/odd_order/PFsection8.v')
| -rw-r--r-- | mathcomp/odd_order/PFsection8.v | 1128 |
1 files changed, 1128 insertions, 0 deletions
diff --git a/mathcomp/odd_order/PFsection8.v b/mathcomp/odd_order/PFsection8.v new file mode 100644 index 0000000..72a0d00 --- /dev/null +++ b/mathcomp/odd_order/PFsection8.v @@ -0,0 +1,1128 @@ +(* (c) Copyright Microsoft Corporation and Inria. All rights reserved. *) +Require Import ssreflect ssrbool ssrfun eqtype ssrnat seq path div choice. +Require Import fintype tuple finfun bigop prime ssralg poly finset center. +Require Import fingroup morphism perm automorphism quotient action finalg zmodp. +Require Import gfunctor gproduct cyclic commutator nilpotent pgroup. +Require Import sylow hall abelian maximal frobenius. +Require Import matrix mxalgebra mxrepresentation vector. +Require Import BGsection1 BGsection3 BGsection7 BGsection10. +Require Import BGsection14 BGsection15 BGsection16. +Require ssrnum. +Require Import algC classfun character inertia vcharacter. +Require Import PFsection1 PFsection2 PFsection3 PFsection4 PFsection5. + +(******************************************************************************) +(* This file covers Peterfalvi, Section 8: Structure of a Minimal Simple *) +(* Group of Odd Order. Actually, most Section 8 definitions can be found in *) +(* BGsection16, which holds the conclusions of the Local Analysis part of the *) +(* proof, as the B & G text has been adapted to fit the usage in Section 8. *) +(* Most of the definitions of Peterfalvi Section 8 are covered in BGsection7, *) +(* BGsection15 and BGsection16; we only give here: *) +(* FT_Pstructure S T defW <-> the groups W, W1, W2, S, and T satisfy the *) +(* conclusion of Theorem (8.8)(b), in particular, S and T *) +(* are of type P, S = S^(1) ><| W1, and T = T^`(1) ><| W2. *) +(* The assumption defW : W1 \x W2 = W is a parameter. *) +(* 'R[x] == the "signalizer" group of x \in 'A1(M) for the Dade *) +(* hypothesis of M (note: this is only extensionally equal *) +(* to the 'R[x] defined in BGsection14). *) +(* 'R_M == the signalizer functor for the Dade hypothesis of M. *) +(* Note that this only maps x to 'R[x] for x in 'A1(M). *) +(* The casual use of the R(x) in Peterfalvi is improper, *) +(* as its meaning depends on which maximal group is *) +(* considered. *) +(* 'A~(M, A) == the support of the image of 'CF(M, A) under the Dade *) +(* isometry of a maximal group M. *) +(* 'A1~(M) := 'A~(M, 'A1(M)). *) +(* 'A~(M) := 'A~(M, 'A(M)). *) +(* 'A0~(M) := 'A~(M, 'A0(M)). *) +(* FT_Dade maxM, FT_Dade0 maxM, FT_Dade1 maxM, FT_DadeF maxM *) +(* FT_Dade_hyp maxM, FT_Dade0_hyp maxM, FT_Dade1_hyp maxM, FT_DadeF_hyp maxM *) +(* == for maxM : M \in 'M, the Dade isometry of M, with *) +(* domain 'A(M), 'A0(M), 'A1(M) and M`_\F^#, respectively, *) +(* and the proofs of the corresponding Dade hypotheses. *) +(* Note that we use an additional restriction (to M`_\F^#) *) +(* to fit better with the conventions of PFsection7. *) +(* FTsupports M L <-> L supports M in the sense of (8.14) and (8.18). This *) +(* definition is not used outside this file. *) +(******************************************************************************) + +Set Implicit Arguments. +Unset Strict Implicit. +Unset Printing Implicit Defensive. + +Import GroupScope GRing.Theory. + +Local Open Scope ring_scope. + +(* Supercedes the notation in BGsection14. *) +Notation "''R' [ x ]" := 'C_((gval 'N[x])`_\F)[x] + (at level 8, format "''R' [ x ]") : group_scope. +Notation "''R' [ x ]" := 'C_('N[x]`_\F)[x]%G : Group_scope. + +Section Definitions. + +Variable gT : minSimpleOddGroupType. +Local Notation G := (TheMinSimpleOddGroup gT). +Implicit Types L M X : {set gT}. + +(* These cover Peterfalvi, Definition (8.14). *) +Definition FTsignalizer M x := if 'C[x] \subset M then 1%G else 'R[x]%G. + +Definition FTsupports M L := + [exists x in 'A(M), ~~ ('C[x] \subset M) && ('C[x] \subset L)]. + +Definition FT_Dade_support M X := + \bigcup_(x in X) class_support (FTsignalizer M x :* x) G. + +End Definitions. + +Notation "''R_' M" := (FTsignalizer M) + (at level 8, M at level 2, format "''R_' M") : group_scope. + +Notation "''A~' ( M , A )" := (FT_Dade_support M A) + (at level 8, format "''A~' ( M , A )"). + +Notation "''A1~' ( M )" := 'A~(M, 'A1(M)) (at level 8, format "''A1~' ( M )"). +Notation "''A~' ( M )" := 'A~(M, 'A(M)) (at level 8, format "''A~' ( M )"). +Notation "''A0~' ( M )" := 'A~(M, 'A0(M)) (at level 8, format "''A0~' ( M )"). + +Section Eight. + +Variable gT : minSimpleOddGroupType. +Local Notation G := (TheMinSimpleOddGroup gT). +Implicit Types (p q : nat) (x y z : gT) (A B : {set gT}). +Implicit Types H K L M N P Q R S T U V W : {group gT}. + +(* Peterfalvi, Definition (8.1) is covered by BGsection16.of_typeF. *) + +(* This is the remark following Definition (8.1). *) +Remark compl_of_typeF M U V (H := M`_\F) : + H ><| U = M -> of_typeF M V -> of_typeF M U. +Proof. +move=> defM_U [[]]; rewrite -/H => ntH ntV defM part_b part_c. +have oU: #|U| = #|V|. + apply/eqP; rewrite -(@eqn_pmul2l #|H|) ?cardG_gt0 //. + by rewrite (sdprod_card defM) (sdprod_card defM_U). +have [x Mx defU]: exists2 x, x \in M & U :=: V :^ x. + pose pi := \pi(V); have hallV: pi.-Hall(M) V. + by rewrite Hall_pi // -(sdprod_Hall defM) (pHall_Hall (Fcore_Hall M)). + apply: Hall_trans (hallV). + rewrite mFT_sol // (sub_proper_trans _ (mFT_norm_proper ntH _)) ?gFnorm //. + rewrite (proper_sub_trans _ (subsetT M)) // properEcard gFsub. + by rewrite -(sdprod_card defM) ltn_Pmulr ?cardG_gt0 ?cardG_gt1. + rewrite pHallE -(card_Hall hallV) oU eqxx andbT. + by case/sdprod_context: defM_U. +have nHx: x \in 'N(H) by apply: subsetP Mx; rewrite gFnorm. +split; first by rewrite {1}defU conjsg_eq1. + have [U1 [nsU1U abU1 prU1H]] := part_b. + rewrite defU; exists (U1 :^ x)%G; split; rewrite ?normalJ ?abelianJ //. + rewrite -/H -(normP nHx) -conjD1g => _ /imsetP[h Hh ->]. + by rewrite -conjg_set1 normJ -conjIg conjSg prU1H. +have [U0 [sU0V expU0 frobHU0]] := part_c. +have [defHU0 _ ntU0 _ _] := Frobenius_context frobHU0. +rewrite defU; exists (U0 :^ x)%G; split; rewrite ?conjSg ?exponentJ //. +by rewrite -/H -(normP nHx) -conjYg FrobeniusJ. +Qed. + +Lemma Frobenius_of_typeF M U (H := M`_\F) : + [Frobenius M = H ><| U] -> of_typeF M U. +Proof. +move=> frobM; have [defM ntH ntU _ _] := Frobenius_context frobM. +have [_ _ nHU tiHU] := sdprodP defM. +split=> //; last by exists U; split; rewrite // -sdprodEY ?defM. +exists 1%G; split; rewrite ?normal1 ?abelian1 //. +by move=> x /(Frobenius_reg_compl frobM)->. +Qed. + +(* This is Peterfalvi (8.2). *) +Lemma typeF_context M U (H := M`_\F) : + of_typeF M U -> + [/\ (*a*) forall U0, is_typeF_complement M U U0 -> #|U0| = exponent U, + (*b*) [Frobenius M = H ><| U] = Zgroup U + & (*c*) forall U1 (i : Iirr H), + is_typeF_inertia M U U1 -> i != 0 -> 'I_U['chi_i] \subset U1]. +Proof. +case; rewrite -/H => [[ntH ntM defM] _ exU0]; set part_a := forall U0, _. +have [nsHM sUG mulHU nHU _] := sdprod_context defM. +have oU0: part_a. + move=> U0 [sU0U <- /Frobenius_reg_ker regU0]; rewrite exponent_Zgroup //. + apply/forall_inP=> S /SylowP[p _ /and3P[sSU0 pS _]]. + apply: odd_regular_pgroup_cyclic pS (mFT_odd S) ntH _ _. + by rewrite (subset_trans (subset_trans sSU0 sU0U)). + by move=> x /setD1P[ntx /(subsetP sSU0) U0x]; rewrite regU0 // !inE ntx. +split=> // [|U1 i [nsU1U abU1 s_cUH_U1] nz_i]. + apply/idP/idP=> [frobU | ZgU]. + apply/forall_inP=> S /SylowP[p _ /and3P[sSU pS _]]. + apply: odd_regular_pgroup_cyclic pS (mFT_odd S) ntH _ _. + by rewrite (subset_trans sSU). + move=> x /setD1P[ntx /(subsetP sSU) Ux]. + by rewrite (Frobenius_reg_ker frobU) // !inE ntx. + have [U0 [sU0U expU0 frobU0]] := exU0; have regU0 := Frobenius_reg_ker frobU0. + suffices defU0: U0 :=: U by rewrite defU0 norm_joinEr ?mulHU // in frobU0. + by apply/eqP; rewrite eqEcard sU0U /= (oU0 U0) // exponent_Zgroup. +have itoP: is_action M (fun (j : Iirr H) x => conjg_Iirr j x). + split=> [x | j x y Mx My]. + apply: can_inj (fun j => conjg_Iirr j x^-1) _ => j. + by apply: irr_inj; rewrite !conjg_IirrE cfConjgK. + by apply: irr_inj; rewrite !conjg_IirrE (cfConjgM _ nsHM). +pose ito := Action itoP; pose cto := ('Js \ subsetT M)%act. +have actsMcH: [acts M, on classes H | cto]. + apply/subsetP=> x Mx; rewrite !inE Mx; apply/subsetP=> _ /imsetP[y Hy ->]. + have nHx: x \in 'N(H) by rewrite (subsetP (gFnorm _ _)). + rewrite !inE /= -class_rcoset norm_rlcoset // class_lcoset mem_classes //. + by rewrite memJ_norm. +apply/subsetP=> g /setIP[Ug /setIdP[nHg c_i_g]]; have Mg := subsetP sUG g Ug. +apply: contraR nz_i => notU1g; rewrite (sameP eqP set1P). +suffices <-: 'Fix_ito[g] = [set 0 : Iirr H]. + by rewrite !inE sub1set inE -(inj_eq (@irr_inj _ _)) conjg_IirrE. +apply/eqP; rewrite eq_sym eqEcard cards1 !(inE, sub1set) /=. +rewrite -(inj_eq (@irr_inj _ _)) conjg_IirrE irr0 cfConjg_cfun1 eqxx. +rewrite (card_afix_irr_classes Mg actsMcH) => [|j y z Hy /=]; last first. + case/imsetP=> _ /imsetP[t Ht ->] -> {z}. + by rewrite conjg_IirrE cfConjgE // conjgK cfunJ. +rewrite -(cards1 [1 gT]) subset_leq_card //= -/H. +apply/subsetP=> _ /setIP[/imsetP[a Ha ->] /afix1P caHg]; rewrite inE classG_eq1. +have{caHg} /imsetP[x Hgx cax]: a \in a ^: (H :* g). + by rewrite class_rcoset caHg class_refl. +have coHg: coprime #|H| #[g]. + apply: (coprime_dvdr (order_dvdG Ug)). + by rewrite (coprime_sdprod_Hall_l defM) (pHall_Hall (Fcore_Hall M)). +have /imset2P[z y cHgg_z Hy defx]: x \in class_support ('C_H[g] :* g) H. + have [/and3P[/eqP defUcHgg _ _] _] := partition_cent_rcoset nHg coHg. + by rewrite class_supportEr -cover_imset defUcHgg. +rewrite -(can_eq (conjgKV y)) conj1g; apply: contraR notU1g => nt_ay'. +have{nt_ay'} Hay': a ^ y^-1 \in H^# by rewrite !inE nt_ay' groupJ ?groupV. +rewrite (subsetP (s_cUH_U1 _ Hay')) // inE Ug. +have ->: g = z.`_(\pi(H)^'). + have [h /setIP[Hh /cent1P cgh] ->] := rcosetP cHgg_z. + rewrite consttM // (constt1P _) ?mul1g ?constt_p_elt //. + by rewrite /p_elt -coprime_pi' ?cardG_gt0. + by rewrite (mem_p_elt _ Hh) // pgroupNK pgroup_pi. +by rewrite groupX //= -conjg_set1 normJ mem_conjgV -defx !inE conjg_set1 -cax. +Qed. + +(* Peterfalvi, Definition (8.3) is covered by BGsection16.of_typeI. *) +(* Peterfalvi, Definition (8.4) is covered by BGsection16.of_typeP. *) + +Section TypeP_Remarks. +(* These correspond to the remarks following Definition (8.4). *) + +Variables (M U W W1 W2 : {group gT}) (defW : W1 \x W2 = W). +Let H := M`_\F. +Let M' := M^`(1)%g. + +Hypothesis MtypeP : of_typeP M U defW. + +Remark of_typeP_sol : solvable M. +Proof. +have [_ [nilU _ _ defM'] _ _ _] := MtypeP. +have [nsHM' _ mulHU _ _] := sdprod_context defM'. +rewrite (series_sol (der_normal 1 M)) (abelian_sol (der_abelian 0 M)) andbT. +rewrite (series_sol nsHM') (nilpotent_sol (Fcore_nil M)). +by rewrite -mulHU quotientMidl quotient_sol ?(nilpotent_sol nilU). +Qed. + +Remark typeP_cent_compl : 'C_M'(W1) = W2. +Proof. +have [[/cyclicP[x ->] _ ntW1 _] _ _ [_ _ _ _ prM'W1] _] := MtypeP. +by rewrite cent_cycle prM'W1 // !inE cycle_id -cycle_eq1 ntW1. +Qed. + +Remark typeP_cent_core_compl : 'C_H(W1) = W2. +Proof. +have [sW2H sHM']: W2 \subset H /\ H \subset M'. + by have [_ [_ _ _ /sdprodW/mulG_sub[-> _]] _ []] := MtypeP. +by apply/eqP; rewrite eqEsubset subsetI sW2H -typeP_cent_compl ?subsetIr ?setSI. +Qed. + +Lemma typePF_exclusion K : ~ of_typeF M K. +Proof. +move=> [[ntH ntU1 defM_K] _ [U0 [sU01 expU0] frobU0]]. +have [[cycW1 hallW1 ntW1 defM] [_ _ _ defM'] _ [_]] := MtypeP; case/negP. +pose p := pdiv #|W1|; rewrite -/M' -/H in defM defM' frobU0 *. +have piW1p: p \in \pi(W1) by rewrite pi_pdiv cardG_gt1. +have piU0p: p \in \pi(U0). + rewrite -pi_of_exponent expU0 pi_of_exponent (pi_of_dvd _ _ piW1p) //=. + rewrite -(@dvdn_pmul2l #|H|) ?cardG_gt0 // (sdprod_card defM_K). + rewrite -(sdprod_card defM) dvdn_pmul2r ?cardSg //. + by case/sdprodP: defM' => _ <- _ _; exact: mulG_subl. +have [|X EpX]:= @p_rank_geP _ p 1 U0 _; first by rewrite p_rank_gt0. +have [ntX [sXU0 abelX _]] := (nt_pnElem EpX isT, pnElemP EpX). +have piW1_X: \pi(W1).-group X by apply: pi_pgroup piW1p; case/andP: abelX. +have sXM: X \subset M. + by rewrite -(sdprodWY defM_K) joingC sub_gen ?subsetU // (subset_trans sXU0). +have nHM: M \subset 'N(H) by apply: gFnorm. +have [regU0 solM] := (Frobenius_reg_ker frobU0, of_typeP_sol). +have [a Ma sXaW1] := Hall_Jsub solM (Hall_pi hallW1) sXM piW1_X. +rewrite -subG1 -(conjs1g a) -(cent_semiregular regU0 sXU0 ntX) conjIg -centJ. +by rewrite (normsP nHM) // -typeP_cent_core_compl ?setIS ?centS. +Qed. + +Remark of_typeP_compl_conj W1x : M' ><| W1x = M -> W1x \in W1 :^: M. +Proof. +case/sdprodP=> [[{W1x}_ W1x _ ->] mulM'W1x _ tiM'W1x]. +have [[_ /Hall_pi hallW1 _ defM] _ _ _ _] := MtypeP. +apply/imsetP; apply: Hall_trans of_typeP_sol _ (hallW1). +rewrite pHallE -(card_Hall hallW1) -(@eqn_pmul2l #|M'|) ?cardG_gt0 //. +by rewrite (sdprod_card defM) -mulM'W1x mulG_subr /= TI_cardMg. +Qed. + +Remark conj_of_typeP x : + {defWx : W1 :^ x \x W2 :^ x = W :^ x | of_typeP (M :^ x) (U :^ x) defWx}. +Proof. +have defWx: W1 :^ x \x W2 :^ x = W :^ x by rewrite -dprodJ defW. +exists defWx; rewrite /of_typeP !derJ FcoreJ FittingJ centJ -conjIg normJ. +rewrite !cyclicJ !conjsg_eq1 /Hall !conjSg indexJg cardJg -[_ && _]/(Hall M W1). +rewrite -(isog_nil (conj_isog U x)) -!sdprodJ -conjsMg -conjD1g. +rewrite -(conjGid (in_setT x)) -conjUg -conjDg normedTI_J. +have [[-> -> -> ->] [-> -> -> ->] [-> -> -> ->] [-> -> -> -> prW1] ->]:= MtypeP. +by do 2![split]=> // _ /imsetP[y /prW1<- ->]; rewrite cent1J -conjIg. +Qed. + +(* This is Peterfalvi (8.5), with an extra clause in anticipation of (8.15). *) +Lemma typeP_context : + [/\ (*a*) H \x 'C_U(H) = 'F(M), + (*b*) U^`(1)%g \subset 'C(H) /\ (U :!=: 1%g -> ~~ (U \subset 'C(H))), + (*c*) normedTI (cyclicTIset defW) G W + & cyclicTI_hypothesis G defW]. +Proof. +have defW2 := typeP_cent_core_compl. +case: MtypeP; rewrite /= -/H => [] [cycW1 hallW1 ntW1 defM] [nilU _ _ defM']. +set V := W :\: _ => [] [_ sM''F defF sFM'] [cycW2 ntW2 sW2H _ _] TI_V. +have [/andP[sHM' nHM'] sUM' mulHU _ tiHU] := sdprod_context defM'. +have sM'M : M' \subset M by apply: der_sub. +have hallM': \pi(M').-Hall(M) M' by rewrite Hall_pi // (sdprod_Hall defM). +have hallH_M': \pi(H).-Hall(M') H := pHall_subl sHM' sM'M (Fcore_Hall M). +have{defF} defF: (H * 'C_U(H))%g = 'F(M). + rewrite -(setIidPl sFM') -defF -group_modl //= -/H. + rewrite setIAC (setIidPr (der_sub 1 M)). + rewrite -(coprime_mulG_setI_norm mulHU) ?norms_cent //; last first. + by rewrite (coprime_sdprod_Hall_l defM') (pHall_Hall hallH_M'). + by rewrite mulgA (mulGSid (subsetIl _ _)). +have coW12: coprime #|W1| #|W2|. + rewrite coprime_sym (coprimeSg (subset_trans sW2H sHM')) //. + by rewrite (coprime_sdprod_Hall_r defM). +have cycW: cyclic W by rewrite (cyclic_dprod defW). +have ctiW: cyclicTI_hypothesis G defW by split; rewrite ?mFT_odd. +split=> //; first by rewrite dprodE ?subsetIr //= setIA tiHU setI1g. +split. + apply: subset_trans (_ : U :&: 'F(M) \subset _). + by rewrite subsetI der_sub (subset_trans (dergS 1 sUM')). + by rewrite -defF -group_modr ?subsetIl // setIC tiHU mul1g subsetIr. +apply: contra => cHU; rewrite -subG1 -tiHU subsetIidr (subset_trans sUM') //. +by rewrite (Fcore_max hallM') ?der_normal // -mulHU mulg_nil ?Fcore_nil. +Qed. + +End TypeP_Remarks. + +Remark FTtypeP_witness M : + M \in 'M -> FTtype M != 1%N -> exists_typeP (of_typeP M). +Proof. +move=> maxM /negbTE typeMnot1. +have:= FTtype_range M; rewrite -mem_iota !inE typeMnot1 /=. +by case/or4P=> /FTtypeP[//|U W W1 W2 defW [[]]]; exists U W W1 W2 defW. +Qed. + +(* Peterfalvi, Definition (8.6) is covered by BGsection16.of_typeII_IV et al. *) +(* Peterfalvi, Definition (8.7) is covered by BGsection16.of_typeV. *) + +Section FTypeP_Remarks. +(* The remarks for Definition (8.4) also apply to (8.6) and (8.7). *) + +Variables (M U W W1 W2 : {group gT}) (defW : W1 \x W2 = W). +Let H := M`_\F. +Let M' := M^`(1)%g. + +Hypotheses (maxM : M \in 'M) (MtypeP : of_typeP M U defW). + +Remark of_typeP_conj (Ux W1x W2x Wx : {group gT}) (defWx : W1x \x W2x = Wx) : + of_typeP M Ux defWx -> + exists x, + [/\ x \in M, U :^ x = Ux, W1 :^ x = W1x, W2 :^ x = W2x & W :^ x = Wx]. +Proof. +move=> MtypePx; have [[_ _ _ defMx] [_ _ nUW1x defM'x] _ _ _] := MtypePx. +have [[_ hallW1 _ defM] [_ _ nUW1 defM'] _ _ _] := MtypeP. +have [/mulG_sub[/= sHM' sUM'] [_ _ nM'W1 _]] := (sdprodW defM', sdprodP defM). +rewrite -/M' -/H in defMx defM'x defM defM' sHM' sUM' nM'W1. +have /imsetP[x2 Mx2 defW1x2] := of_typeP_compl_conj MtypeP defMx. +have /andP[sM'M nM'M]: M' <| M by apply: der_normal. +have solM': solvable M' := solvableS sM'M (of_typeP_sol MtypeP). +have [hallU hallUx]: \pi(H)^'.-Hall(M') U /\ \pi(H)^'.-Hall(M') (Ux :^ x2^-1). + have hallH: \pi(H).-Hall(M') H by apply: pHall_subl (Fcore_Hall M). + rewrite pHallJnorm ?(subsetP nM'M) ?groupV // -!(compl_pHall _ hallH). + by rewrite (sdprod_compl defM') (sdprod_compl defM'x). +have coM'W1: coprime #|M'| #|W1| by rewrite (coprime_sdprod_Hall_r defM). +have nUxW1: W1 \subset 'N(Ux :^ x2^-1) by rewrite normJ -sub_conjg -defW1x2. +have [x1] := coprime_Hall_trans nM'W1 coM'W1 solM' hallUx nUxW1 hallU nUW1. +case/setIP=> /(subsetP sM'M) My /(normsP (cent_sub _)) nW1x1 defUx1. +pose x := (x1 * x2)%g; have Mx: x \in M by rewrite groupM. +have defW1x: W1 :^ x = W1x by rewrite conjsgM nW1x1. +have defW2x: W2 :^ x = W2x. + rewrite -(typeP_cent_compl MtypeP) -(typeP_cent_compl MtypePx). + by rewrite conjIg -centJ defW1x (normsP nM'M). +by exists x; rewrite -defW dprodJ defW1x defW2x conjsgM -defUx1 conjsgKV. +Qed. + +Lemma FTtypeP_neq1 : FTtype M != 1%N. +Proof. by apply/FTtypeP=> // [[V [/(typePF_exclusion MtypeP)]]]. Qed. + +Remark compl_of_typeII_IV : FTtype M != 5 -> of_typeII_IV M U defW. +Proof. +move=> Mtype'5. +have [Ux Wx W1x W2x defWx Mtype24]: exists_typeP (of_typeII_IV M). + have:= FTtype_range M; rewrite leq_eqVlt eq_sym (leq_eqVlt _ 5). + rewrite (negPf FTtypeP_neq1) (negPf Mtype'5) /= -mem_iota !inE. + by case/or3P=> /FTtypeP[]// Ux Wx W1x W2x dWx []; exists Ux Wx W1x W2x dWx. +have [MtypePx ntUx prW1x tiFM] := Mtype24. +have [x [Mx defUx defW1x _ _]] := of_typeP_conj MtypePx. +by rewrite -defUx -defW1x cardJg conjsg_eq1 in ntUx prW1x. +Qed. + +Remark compl_of_typeII : FTtype M == 2 -> of_typeII M U defW. +Proof. +move=> Mtype2. +have [Ux Wx W1x W2x defWx [[MtypePx _ _ _]]] := FTtypeP 2 maxM Mtype2. +have [x [Mx <- _ _ _]] := of_typeP_conj MtypePx; rewrite -/M' -/H. +rewrite abelianJ normJ -{1}(conjGid Mx) conjSg => cUU not_sNUM M'typeF defH. +split=> //; first by apply: compl_of_typeII_IV; rewrite // (eqP Mtype2). +by apply: compl_of_typeF M'typeF; rewrite defH; have [_ []] := MtypeP. +Qed. + +Remark compl_of_typeIII : FTtype M == 3 -> of_typeIII M U defW. +Proof. +move=> Mtype3. +have [Ux Wx W1x W2x defWx [[MtypePx _ _ _]]] := FTtypeP 3 maxM Mtype3. +have [x [Mx <- _ _ _]] := of_typeP_conj MtypePx; rewrite -/M' -/H. +rewrite abelianJ normJ -{1}(conjGid Mx) conjSg. +by split=> //; apply: compl_of_typeII_IV; rewrite // (eqP Mtype3). +Qed. + +Remark compl_of_typeIV : FTtype M == 4 -> of_typeIV M U defW. +Proof. +move=> Mtype4. +have [Ux Wx W1x W2x defWx [[MtypePx _ _ _]]] := FTtypeP 4 maxM Mtype4. +have [x [Mx <- _ _ _]] := of_typeP_conj MtypePx; rewrite -/M' -/H. +rewrite abelianJ normJ -{1}(conjGid Mx) conjSg. +by split=> //; apply: compl_of_typeII_IV; rewrite // (eqP Mtype4). +Qed. + +Remark compl_of_typeV : FTtype M == 5 -> of_typeV M U defW. +Proof. +move=> Mtype5. +have [Ux Wx W1x W2x defWx [[MtypePx /eqP]]] := FTtypeP 5 maxM Mtype5. +have [x [Mx <- <- _ _]] := of_typeP_conj MtypePx; rewrite -/M' -/H. +by rewrite cardJg conjsg_eq1 => /eqP. +Qed. + +End FTypeP_Remarks. + +(* This is the statement of Peterfalvi, Theorem (8.8)(a). *) +Definition all_FTtype1 := [forall M : {group gT} in 'M, FTtype M == 1%N]. + +(* This is the statement of Peterfalvi, Theorem (8.8)(b). *) +Definition typeP_pair S T (W W1 W2 : {set gT}) (defW : W1 \x W2 = W) := + [/\ [/\ cyclicTI_hypothesis G defW, S \in 'M & T \in 'M], + (*b1*) [/\ S^`(1) ><| W1 = S, T^`(1) ><| W2 = T & S :&: T = W]%g, + (*b2*) (FTtype S == 2) || (FTtype T == 2), + (*b3*) (1 < FTtype S <= 5 /\ 1 < FTtype T <= 5)%N + & (*b4*) {in 'M, forall M, FTtype M != 1%N -> gval M \in S :^: G :|: T :^: G}]. + +Lemma typeP_pair_sym S T W W1 W2 (defW : W1 \x W2 = W) (xdefW : W2 \x W1 = W) : + typeP_pair S T defW -> typeP_pair T S xdefW. +Proof. +by case=> [[/cyclicTIhyp_sym ? ? ?] [? ?]]; rewrite setIC setUC orbC => ? ? []. +Qed. + +(* This is Peterfalvi, Theorem (8.8). *) +Lemma FTtypeP_pair_cases : + (*a*) {in 'M, forall M, FTtype M == 1%N} + \/ (*b*) exists S, exists T, exists_typeP (fun _ => typeP_pair S T). +Proof. +have [_ [| [[S T] [[maxS maxT] [[W1 W2] /=]]]]] := BGsummaryI gT; first by left. +set W := W1 <*> W2; set V := W :\: (W1 :|: W2). +case=> [[cycW tiV _] [defS defT tiST]] b4 /orP b2 b3. +have [cWW /joing_sub[sW1W sW2W]] := (cyclic_abelian cycW, erefl W). +have ntV: V != set0 by have [] := andP tiV. +suffices{tiST tiV cWW sW1W sW2W b3 b4} tiW12: W1 :&: W2 = 1%g. + have defW: W1 \x W2 = W by rewrite dprodEY ?(centSS _ _ cWW). + right; exists S, T; exists S _ _ _ defW; split=> // [|M _ /b4[] // x]. + by do 2?split; rewrite ?mFT_odd // /normedTI tiV nVW setTI /=. + by case=> <-; rewrite inE mem_orbit ?orbT. +wlog {b2 T defT maxT} Stype2: S W1 W2 @W @V maxS defS cycW ntV / FTtype S == 2. + move=> IH; case/orP: b2 cycW ntV => /IH; first exact. + by rewrite setIC /V /W /= joingC setUC; apply. +have{maxS Stype2 defS} prW1: prime #|W1|. + have [U ? W1x ? ? [[StypeP _ prW1x _] _ _ _ _]] := FTtypeP 2 maxS Stype2. + by have /imsetP[x _ ->] := of_typeP_compl_conj StypeP defS; rewrite cardJg. +rewrite prime_TIg //; apply: contra ntV => sW12. +by rewrite setD_eq0 (setUidPr sW12) join_subG sW12 /=. +Qed. + +(* This is Peterfalvi (8.9). *) +(* We state the lemma using the of_typeP predicate, as it is the Skolemised *) +(* form of Peterfalvi, Definition (8.4). *) +Lemma typeP_pairW S T W W1 W2 (defW : W1 \x W2 = W) : + typeP_pair S T defW -> exists U : {group gT}, of_typeP S U defW. +Proof. +case=> [[[cycW _ /and3P[_ _ /eqP nVW]] maxS _] [defS _ defST] _ [Stype25 _] _]. +set S' := S^`(1)%g in defS; have [nsS'S _ _ _ tiS'W1] := sdprod_context defS. +have{Stype25} Stype'1: FTtype S != 1%N by apply: contraTneq Stype25 => ->. +have [/mulG_sub[sW1W sW2W] [_ mulW12 cW12 _]] := (dprodW defW, dprodP defW). +have [cycW1 cycW2] := (cyclicS sW1W cycW, cyclicS sW2W cycW). +have{cycW1 cycW2} coW12: coprime #|W1| #|W2| by rewrite -(cyclic_dprod defW). +have{maxS Stype'1} [Ux Wx W1x W2x defWx StypeP] := FTtypeP_witness maxS Stype'1. +have /imsetP[y Sy defW1] := of_typeP_compl_conj StypeP defS. +suffices defW2: W2 :=: W2x :^ y. + have [] := conj_of_typeP StypeP y; rewrite -defWx dprodJ -defW1 -defW2. + by rewrite (conjGid Sy) {-1}defW; exists (Ux :^ y)%G. +have [[_ hallW1x _ defSx] _ _ [/cyclic_abelian abW2x _ _ _ _] _] := StypeP. +have{Sy} nS'y: y \in 'N(S') by rewrite (subsetP (normal_norm nsS'S)). +have{nS'y} defW2xy: W2x :^ y = 'C_S'(W1). + by rewrite -(typeP_cent_compl StypeP) conjIg -centJ -defW1 (normP nS'y). +have{nsS'S} sW2S': W2 \subset S'. + have sW2S: W2 \subset S by rewrite (subset_trans sW2W) // -defST subsetIl. + have{hallW1x} hallW1: \pi(W1).-Hall(S) W1x by rewrite defW1 /= cardJg Hall_pi. + have hallS': \pi(W1)^'.-Hall(S) S' by apply/(sdprod_normal_pHallP _ hallW1). + by rewrite coprime_pi' // (sub_normal_Hall hallS') in coW12 *. +have sW2xy: W2 \subset W2x :^ y by rewrite defW2xy subsetI sW2S'. +have defW2: W2 :=: S' :&: W by rewrite -mulW12 -group_modr ?tiS'W1 ?mul1g. +apply/eqP; rewrite eqEsubset sW2xy defW2 subsetI {1}defW2xy subsetIl /=. +rewrite -nVW /= setTI cents_norm // (centsS (subsetDl _ _)) // -mulW12. +by rewrite centM subsetI {1}defW2xy subsetIr sub_abelian_cent // abelianJ. +Qed. + +Section OneMaximal. + +Variable M U W W1 W2 : {group gT}. (* W, W1 and W2 are only used later. *) +Hypothesis maxM : M \in 'M. + +(* Peterfalvi, Definition (8.10) is covered in BGsection16. *) + +(* This is Peterfalvi (8.11). *) +Lemma FTcore_facts : + [/\ Hall G M`_\F, Hall G M`_\s + & forall S, Sylow M`_\s S -> S :!=: 1%g -> 'N(S) \subset M]. +Proof. +have hallMs := Msigma_Hall_G maxM; have [_ sMs _] := and3P hallMs. +rewrite def_FTcore // (pHall_Hall hallMs). +split=> // [|S /SylowP[p _ sylS] ntS]. + have sMF_Ms:= Fcore_sub_Msigma maxM. + apply: (@pHall_Hall _ \pi(M`_\F)); apply: (subHall_Hall hallMs). + by move=> p /(piSg sMF_Ms)/(pnatPpi sMs). + exact: pHall_subl (pcore_sub _ M) (Fcore_Hall M). +have s_p: p \in \sigma(M). + by rewrite (pnatPpi sMs) // -p_rank_gt0 -(rank_Sylow sylS) rank_gt0. +by apply: (norm_sigma_Sylow s_p); exact: (subHall_Sylow (Msigma_Hall maxM)). +Qed. + +(* This is Peterfalvi (8.12). *) +(* (b) could be stated for subgroups of U wlog -- usage should be checked. *) +Lemma FTtypeI_II_facts n (H := M`_\F) : + FTtype M == n -> H ><| U = M ^`(n.-1)%g -> + if 0 < n <= 2 then + [/\ (*a*) forall p S, p.-Sylow(U) S -> abelian S /\ ('r(S) <= 2)%N, + (*b*) forall X, X != set0 -> X \subset U^# -> 'C_H(X) != 1%g -> + 'M('C(X)) = [set M] + & (*c*) let B := 'A(M) :\: 'A1(M) in B != set0 -> normedTI B G M + ] else True. +Proof. +move=> typeM defMn; have [n12 | //] := ifP; rewrite -mem_iota !inE in n12. +have defH: H = M`_\sigma. + by rewrite -def_FTcore -?(Fcore_eq_FTcore _ _) // (eqP typeM) !inE orbA n12. +have [K complU]: exists K : {group gT}, kappa_complement M U K. + have [[V K] /= complV] := kappa_witness maxM. + have [[hallV hallK gVK] [_ sUMn _ _ _]] := (complV, sdprod_context defMn). + have hallU: \sigma_kappa(M)^'.-Hall(M) U. + rewrite pHallE -(card_Hall hallV) (subset_trans sUMn) ?der_sub //=. + rewrite -(@eqn_pmul2l #|H|) ?cardG_gt0 // (sdprod_card defMn) defH. + rewrite (sdprod_card (sdprod_FTder maxM complV)) (eqP typeM). + by case/pred2P: n12 => ->. + have [x Mx defU] := Hall_trans (mmax_sol maxM) hallU hallV. + exists (K :^ x)%G; split; rewrite ?pHallJ // defU -conjsMg. + by rewrite -(gen_set_id gVK) groupP. +have [part_a _ _ [part_b part_c]] := BGsummaryB maxM complU. +rewrite eqEsubset FTsupp1_sub // andbT -setD_eq0 in part_c. +split=> // X notX0 /subsetD1P[sXU notX1]; rewrite -cent_gen defH. +apply: part_b; rewrite -?subG1 ?gen_subG //. +by rewrite -setD_eq0 setDE (setIidPl _) // subsetC sub1set inE. +Qed. + +(* This is Peterfalvi (8.13). *) +(* We have substituted the B & G notation for the unique maximal supergroup *) +(* of 'C[x], and specialized the lemma to X := 'A0(M). *) +Lemma FTsupport_facts (X := 'A0(M)) (D := [set x in X | ~~('C[x] \subset M)]) : + [/\ (*a*) {in X &, forall x, {subset x ^: G <= x ^: M}}, + (*b*) D \subset 'A1(M) /\ {in D, forall x, 'M('C[x]) = [set 'N[x]]} + & (*c*) {in D, forall x (L := 'N[x]) (H := L`_\F), + [/\ (*c1*) H ><| (M :&: L) = L /\ 'C_H[x] ><| 'C_M[x] = 'C[x], + (*c2*) {in X, forall y, coprime #|H| #|'C_M[y]| }, + (*c3*) x \in 'A(L) :\: 'A1(L) + & (*c4*) 1 <= FTtype L <= 2 + /\ (FTtype L == 2 -> [Frobenius M with kernel M`_\F])]}]. +Proof. +have defX: X \in pred2 'A(M) 'A0(M) by rewrite !inE eqxx orbT. +have [sDA1 part_a part_c] := BGsummaryII maxM defX. +have{part_a} part_a: {in X &, forall x, {subset x ^: G <= x ^: M}}. + move=> x y A0x A0y /= /imsetP[g Gg def_y]; rewrite def_y. + by apply/imsetP/part_a; rewrite -?def_y. +do [split=> //; first split=> //] => x /part_c[_ ] //. +rewrite /= -(mem_iota 1) !inE => -> [-> ? -> -> L2_frob]. +by do 2![split=> //] => /L2_frob[E /FrobeniusWker]. +Qed. + +(* A generic proof of the first assertion of Peterfalvi (8.15). *) +Let norm_FTsuppX A : + M \subset 'N(A) -> 'A1(M) \subset A -> A \subset 'A0(M) -> 'N(A) = M. +Proof. +move=> nAM sA1A sAA0; apply: mmax_max => //. +rewrite (sub_proper_trans (norm_gen _)) ?mFT_norm_proper //; last first. + rewrite (sub_proper_trans _ (mmax_proper maxM)) // gen_subG. + by rewrite (subset_trans sAA0) // (subset_trans (FTsupp0_sub M)) ?subsetDl. +rewrite (subG1_contra (genS sA1A)) //= genD1 ?group1 //. +by rewrite genGid /= def_FTcore ?Msigma_neq1. +Qed. + +Lemma norm_FTsupp1 : 'N('A1(M)) = M. +Proof. exact: norm_FTsuppX (FTsupp1_norm M) _ (FTsupp1_sub0 maxM). Qed. + +Lemma norm_FTsupp : 'N('A(M)) = M. +Proof. exact: norm_FTsuppX (FTsupp_norm M) (FTsupp1_sub _) (FTsupp_sub0 M). Qed. + +Lemma norm_FTsupp0 : 'N('A0(M)) = M. +Proof. exact: norm_FTsuppX (FTsupp0_norm M) (FTsupp1_sub0 _) _. Qed. + +Lemma FTsignalizerJ x y : 'R_(M :^ x) (y ^ x) :=: 'R_M y :^ x. +Proof. +rewrite /'R__ /= {1}cent1J conjSg; case: ifP => _ /=; first by rewrite conjs1g. +by rewrite cent1J FT_signalizer_baseJ FcoreJ -conjIg. +Qed. + +Let is_FTsignalizer : is_Dade_signalizer G M 'A0(M) 'R_M. +Proof. +rewrite /'R_M => x A0x /=; rewrite setTI. +case: ifPn => [sCxM | not_sCxM]; first by rewrite sdprod1g (setIidPr sCxM). +by have [_ _ /(_ x)[| [] //]] := FTsupport_facts; exact/setIdP. +Qed. + +(* This is Peterfalvi (8.15), second assertion. *) +Lemma FT_Dade0_hyp : Dade_hypothesis G M 'A0(M). +Proof. +have [part_a _ parts_bc] := FTsupport_facts. +have /subsetD1P[sA0M notA0_1] := FTsupp0_sub M. +split; rewrite // /normal ?sA0M ?norm_FTsupp0 //=. +exists 'R_M => [|x y A0x A0y]; first exact: is_FTsignalizer. +rewrite /'R_M; case: ifPn => [_ | not_sCxM]; first by rewrite cards1 coprime1n. +rewrite (coprimeSg (subsetIl _ _)) //=. +by have [| _ -> //] := parts_bc x; apply/setIdP. +Qed. + +Definition FT_Dade_hyp := + restr_Dade_hyp FT_Dade0_hyp (FTsupp_sub0 M) (FTsupp_norm M). + +Definition FT_Dade1_hyp := + restr_Dade_hyp FT_Dade0_hyp (FTsupp1_sub0 maxM) (FTsupp1_norm M). + +Definition FT_DadeF_hyp := + restr_Dade_hyp FT_Dade0_hyp (Fcore_sub_FTsupp0 maxM) (normsD1 (gFnorm _ _)). + +Lemma def_FTsignalizer0 : {in 'A0(M), Dade_signalizer FT_Dade0_hyp =1 'R_M}. +Proof. exact: def_Dade_signalizer. Qed. + +Lemma def_FTsignalizer : {in 'A(M), Dade_signalizer FT_Dade_hyp =1 'R_M}. +Proof. exact: restr_Dade_signalizer def_FTsignalizer0. Qed. + +Lemma def_FTsignalizer1 : {in 'A1(M), Dade_signalizer FT_Dade1_hyp =1 'R_M}. +Proof. exact: restr_Dade_signalizer def_FTsignalizer0. Qed. + +Lemma def_FTsignalizerF : {in M`_\F^#, Dade_signalizer FT_DadeF_hyp =1 'R_M}. +Proof. exact: restr_Dade_signalizer def_FTsignalizer0. Qed. + +Local Notation tau := (Dade FT_Dade0_hyp). +Local Notation FT_Dade := (Dade FT_Dade_hyp). +Local Notation FT_Dade1 := (Dade FT_Dade1_hyp). +Local Notation FT_DadeF := (Dade FT_DadeF_hyp). + +Lemma FT_DadeE : {in 'CF(M, 'A(M)), FT_Dade =1 tau}. +Proof. exact: restr_DadeE. Qed. + +Lemma FT_Dade1E : {in 'CF(M, 'A1(M)), FT_Dade1 =1 tau}. +Proof. exact: restr_DadeE. Qed. + +Lemma FT_DadeF_E : {in 'CF(M, M`_\F^#), FT_DadeF =1 tau}. +Proof. exact: restr_DadeE. Qed. + +Lemma FT_Dade_supportS A B : A \subset B -> 'A~(M, A) \subset 'A~(M, B). +Proof. +by move/subsetP=> sAB; apply/bigcupsP=> x Ax; rewrite (bigcup_max x) ?sAB. +Qed. + +Lemma FT_Dade0_supportE : Dade_support FT_Dade0_hyp = 'A0~(M). +Proof. by apply/eq_bigr=> x /def_FTsignalizer0 <-. Qed. + +Let defA A (sAA0 : A \subset 'A0(M)) (nAM : M \subset 'N(A)) : + Dade_support (restr_Dade_hyp FT_Dade0_hyp sAA0 nAM) = 'A~(M, A). +Proof. +by apply/eq_bigr=> x /(restr_Dade_signalizer sAA0 nAM def_FTsignalizer0) <-. +Qed. + +Lemma FT_Dade_supportE : Dade_support FT_Dade_hyp = 'A~(M). +Proof. exact: defA. Qed. + +Lemma FT_Dade1_supportE : Dade_support FT_Dade1_hyp = 'A1~(M). +Proof. exact: defA. Qed. + +Lemma FT_DadeF_supportE : Dade_support FT_DadeF_hyp = 'A~(M, M`_\F^#). +Proof. exact: defA. Qed. + +Lemma FT_Dade0_supportJ x : 'A0~(M :^ x) = 'A0~(M). +Proof. +rewrite /'A0~(_) FTsupp0J big_imset /=; last exact: in2W (conjg_inj x). +apply: eq_bigr => y _; rewrite FTsignalizerJ -conjg_set1 -conjsMg. +by rewrite class_supportGidl ?inE. +Qed. + +Lemma FT_Dade1_supportJ x : 'A1~(M :^ x) = 'A1~(M). +Proof. +rewrite /'A1~(_) FTsupp1J big_imset /=; last exact: in2W (conjg_inj x). +apply: eq_bigr => y _; rewrite FTsignalizerJ -conjg_set1 -conjsMg. +by rewrite class_supportGidl ?inE. +Qed. + +Lemma FT_Dade_supportJ x : 'A~(M :^ x) = 'A~(M). +Proof. +rewrite /'A~(_) FTsuppJ big_imset /=; last exact: in2W (conjg_inj x). +apply: eq_bigr => y _; rewrite FTsignalizerJ -conjg_set1 -conjsMg. +by rewrite class_supportGidl ?inE. +Qed. + +(* Subcoherence and cyclicTI properties of type II-V subgroups. *) +Hypotheses (defW : W1 \x W2 = W) (MtypeP : of_typeP M U defW). +Let H := M`_\F%G. +Let K := M^`(1)%G. + +Lemma FT_cyclicTI_hyp : cyclicTI_hypothesis G defW. +Proof. by case/typeP_context: MtypeP. Qed. +Let ctiW := FT_cyclicTI_hyp. + +(* This is a useful combination of Peterfalvi (8.8) and (8.9). *) +Lemma FTtypeP_pair_witness : + exists2 T, typeP_pair M T defW + & exists xdefW : W2 \x W1 = W, exists V : {group gT}, of_typeP T V xdefW. +Proof. +have Mtype'1 := FTtypeP_neq1 maxM MtypeP. +case: FTtypeP_pair_cases => [/(_ M maxM)/idPn[] // | [S [T]]]. +case=> _ Wx W1x W2x defWx pairST. +without loss /imsetP[y2 _ defSy]: S T W1x W2x defWx pairST / gval M \in S :^: G. + have [_ _ _ _ coverST] := pairST => IH. + have /setUP[] := coverST M maxM Mtype'1; first exact: IH pairST. + by apply: IH (typeP_pair_sym _ pairST); rewrite dprodC. +have [U_S StypeP] := typeP_pairW pairST. +have [[_ maxS maxT] [defS defT defST] b2 b3 b4] := pairST. +have [[[_ _ _ defM] _ _ _ _] defW2] := (MtypeP, typeP_cent_compl MtypeP). +have /imsetP[y1 Sy1 /(canRL (conjsgKV _)) defW1]: W1 :^ y2^-1 \in W1x :^: S. + apply: (of_typeP_compl_conj StypeP). + by rewrite -(conjsgK y2 S) -defSy derJ -sdprodJ defM. +pose y := (y1 * y2)%g; rewrite -conjsgM -/y in defW1. +have{defSy} defSy: S :^ y = M by rewrite conjsgM (conjGid Sy1). +have{defW2} defW2: W2 :=: W2x :^ y. + by rewrite -(typeP_cent_compl StypeP) conjIg -derJ -centJ defSy -defW1. +suffices pairMTy: typeP_pair M (T :^ y) defW. + exists (T :^ y)%G => //; have xdefW: W2 \x W1 = W by rewrite dprodC. + by exists xdefW; apply: typeP_pairW (typeP_pair_sym xdefW pairMTy). +do [split; rewrite ?defM -?defSy ?mmaxJ ?FTtypeJ //] => [|L maxL /(b4 L maxL)]. + by rewrite -defW defW1 defW2 derJ -sdprodJ -dprodJ -conjIg defT defST defWx. +by rewrite !conjugates_conj lcoset_id // inE. +Qed. + +(* A converse to the above. *) +Lemma of_typeP_pair (xdefW : W2 \x W1 = W) T V : + T \in 'M -> of_typeP T V xdefW -> typeP_pair M T defW. +Proof. +have [S pairMS [xdefW' [V1 StypeP]]] := FTtypeP_pair_witness => maxT TtypeP. +have [[cycW2 /andP[sW2T _] ntW2 _] _ _ [cycW1 _ _ sW1T'' _] _] := TtypeP. +have{sW1T'' sW2T} sWT: W \subset T. + by rewrite -(dprodW defW) mul_subG ?(subset_trans sW1T'') ?gFsub. +have [cycW _ /and3P[_ _ /eqP defNW]] := ctiW. +rewrite (@group_inj _ T S) //; have{pairMS} [_ _ _ _ defT] := pairMS. +have /defT/setUP[] := FTtypeP_neq1 maxT TtypeP => {defT}// /imsetP[x _ defT]. + have [defWx] := conj_of_typeP MtypeP x; rewrite -defT. + case/(of_typeP_conj TtypeP)=> y [_ _ _ defW1y _]. + have /idP[]:= negbF cycW; rewrite (cyclic_dprod defW) // /coprime. + by rewrite -(cardJg _ y) defW1y cardJg gcdnn -trivg_card1. +have [defWx] := conj_of_typeP StypeP x; rewrite -defT. +case/(of_typeP_conj TtypeP)=> y [Ty _ defW2y defW1y defWy]. +have Wyx: (y * x^-1)%g \in W. + by rewrite -defNW !inE /= conjDg conjUg !conjsgM defW2y defW1y defWy !conjsgK. +by rewrite -(conjGid (subsetP sWT _ Wyx)) conjsgM (conjGid Ty) defT conjsgK. +Qed. + +Lemma FT_primeTI_hyp : primeTI_hypothesis M K defW. +Proof. +have [[cycW1 ntW1 hallW1 defM] _ _ [cycW2 ntW2 _ sW2M'' prM'W1] _] := MtypeP. +by split; rewrite ?mFT_odd // (subset_trans sW2M'') ?der_subS. +Qed. +Let ptiWM := FT_primeTI_hyp. + +Lemma FTtypeP_supp0_def : + 'A0(M) = 'A(M) :|: class_support (cyclicTIset defW) M. +Proof. +rewrite -(setID 'A0(M) 'A(M)) (FTsupp0_typeP maxM MtypeP) (setIidPr _) //. +exact: FTsupp_sub0. +Qed. + +Fact FT_Fcore_prime_Dade_def : prime_Dade_definition M K H 'A(M) 'A0(M) defW. +Proof. +have [_ [_ _ _ /sdprodW/mulG_sub[sHK _]] _ [_ _ sW2H _ _] _] := MtypeP. +split; rewrite ?gFnormal //; last exact: FTtypeP_supp0_def. +rewrite /normal FTsupp_norm andbT /'A(M) (FTtypeP_neq1 maxM MtypeP) /=. +do ?split=> //; apply/bigcupsP=> x A1x; last by rewrite setSD ?subsetIl. + by rewrite setDE -setIA subIset // gFsub. +by rewrite (bigcup_max x) // (subsetP _ x A1x) // setSD ?Fcore_sub_FTcore. +Qed. + +Definition FT_prDade_hypF : prime_Dade_hypothesis _ M K H 'A(M) 'A0(M) defW := + PrimeDadeHypothesis ctiW ptiWM FT_Dade0_hyp FT_Fcore_prime_Dade_def. + +Fact FT_core_prime_Dade_def : prime_Dade_definition M K M`_\s 'A(M) 'A0(M) defW. +Proof. +have [[_ sW2H sHK] [nsAM sCA sAK] defA0] := FT_Fcore_prime_Dade_def. +have [_ [_ sW2K _ _] _] := ptiWM. +split=> //=; first by rewrite FTcore_normal /M`_\s; case: ifP. +rewrite nsAM /= /'A(M) /M`_\s (FTtypeP_neq1 maxM MtypeP); split=> //=. +by apply/bigcupsP=> x _; rewrite setSD ?subsetIl. +Qed. + +Definition FT_prDade_hyp : prime_Dade_hypothesis _ M K M`_\s 'A(M) 'A0(M) defW + := PrimeDadeHypothesis ctiW ptiWM FT_Dade0_hyp FT_core_prime_Dade_def. + +Let calS := seqIndD K M M`_\s 1. + +Fact FTtypeP_cohererence_base_subproof : cfConjC_subset calS calS. +Proof. exact: seqInd_conjC_subset1. Qed. + +Fact FTtypeP_cohererence_nonreal_subproof : ~~ has cfReal calS. +Proof. by rewrite seqInd_notReal ?mFT_odd ?FTcore_sub_der1 ?der_normal. Qed. + +Definition FTtypeP_coh_base_sig := + prDade_subcoherent FT_prDade_hyp + FTtypeP_cohererence_base_subproof FTtypeP_cohererence_nonreal_subproof. + +Definition FTtypeP_coh_base := sval FTtypeP_coh_base_sig. + +Local Notation R := FTtypeP_coh_base. + +Lemma FTtypeP_subcoherent : subcoherent calS tau R. +Proof. by rewrite /R; case: FTtypeP_coh_base_sig => R1 []. Qed. +Let scohS := FTtypeP_subcoherent. + +Let w_ i j := cyclicTIirr defW i j. +Let sigma := cyclicTIiso ctiW. +Let eta_ i j := sigma (w_ i j). +Let mu_ := primeTIred ptiWM. +Let delta_ := fun j => primeTIsign ptiWM j. + +Lemma FTtypeP_base_ortho : + {in [predI calS & irr M] & irr W, forall phi w, orthogonal (R phi) (sigma w)}. +Proof. by rewrite /R; case: FTtypeP_coh_base_sig => R1 []. Qed. + +Lemma FTtypeP_base_TIred : + let dsw j k := [seq delta_ j *: eta_ i k | i : Iirr W1] in + let Rmu j := dsw j j ++ map -%R (dsw j (conjC_Iirr j)) in + forall j, R (mu_ j) = Rmu j. +Proof. by rewrite /R; case: FTtypeP_coh_base_sig => R1 []. Qed. + +Lemma coherent_ortho_cycTIiso calS1 (tau1 : {additive 'CF(M) -> 'CF(G)}) : + cfConjC_subset calS1 calS -> coherent_with calS1 M^# tau tau1 -> + forall chi i j, chi \in calS1 -> chi \in irr M -> '[tau1 chi, eta_ i j] = 0. +Proof. +move=> ccsS1S cohS1 chi i j S1chi chi_irr; have [_ sS1S _] := ccsS1S. +have [e /mem_subseq Re ->] := mem_coherent_sum_subseq scohS ccsS1S cohS1 S1chi. +rewrite cfdot_suml big1_seq // => xi /Re; apply: orthoPr. +by apply: FTtypeP_base_ortho (mem_irr _); rewrite !inE sS1S. +Qed. + +Import ssrnum Num.Theory. + +(* A reformuation of Peterfalvi (5.8) for the Odd Order proof context. *) +Lemma FTtypeP_coherent_TIred calS1 tau1 zeta j : + cfConjC_subset calS1 calS -> coherent_with calS1 M^# tau tau1 -> + zeta \in irr M -> zeta \in calS1 -> mu_ j \in calS1 -> + let d := primeTI_Isign ptiWM j in let k := conjC_Iirr j in + {dk : bool * Iirr W2 | tau1 (mu_ j) = (-1) ^+ dk.1 *: (\sum_i eta_ i dk.2) + & dk.1 = d /\ dk.2 = j + \/ [/\ dk.1 = ~~ d, dk.2 = k + & forall l, mu_ l \in calS1 -> mu_ l 1%g = mu_ j 1%g -> pred2 j k l]}. +Proof. +move=> ccsS1S cohS1 irr_zeta S1zeta S1mu_j d k. +have irrS1: [/\ ~~ has cfReal calS1, has (mem (irr M)) calS1 & mu_ j \in calS1]. + have [[_ -> _] _ _ _ _] := subset_subcoherent scohS ccsS1S. + by split=> //; apply/hasP; exists zeta. +have Dmu := coherent_prDade_TIred FT_prDade_hyp ccsS1S irrS1 cohS1. +rewrite -/mu_ -/d in Dmu; pose mu_sum d1 k1 := (-1) ^+ d1 *: (\sum_i eta_ i k1). +have mu_sumK (d1 d2 : bool) k1 k2: + ('[mu_sum d1 k1, (-1) ^+ d2 *: eta_ 0 k2] > 0) = (d1 == d2) && (k1 == k2). +- rewrite cfdotZl cfdotZr rmorph_sign mulrA -signr_addb cfdot_suml. + rewrite (bigD1 0) //= cfdot_cycTIiso !eqxx big1 => [|i nz_i]; last first. + by rewrite cfdot_cycTIiso (negPf nz_i). + rewrite addr0 /= andbC; case: (k1 == k2); rewrite ?mulr0 ?ltrr //=. + by rewrite mulr1 signr_gt0 negb_add. +have [dk tau1mu_j]: {dk : bool * Iirr W2 | tau1 (mu_ j) = mu_sum dk.1 dk.2}. + apply: sig_eqW; case: Dmu => [-> | [-> _]]; first by exists (d, j). + by exists (~~ d, k); rewrite -signrN. +exists dk => //; have:= mu_sumK dk.1 dk.1 dk.2 dk.2; rewrite !eqxx -tau1mu_j. +case: Dmu => [-> | [-> all_jk]]; + rewrite -?signrN mu_sumK => /andP[/eqP <- /eqP <-]; [by left | right]. +by split=> // j1 S1j1 /(all_jk j1 S1j1)/pred2P. +Qed. + +Lemma size_red_subseq_seqInd_typeP (calX : {set Iirr K}) calS1 : + uniq calS1 -> {subset calS1 <= seqInd M calX} -> + {subset calS1 <= [predC irr M]} -> + size calS1 = #|[set i : Iirr K | 'Ind 'chi_i \in calS1]|. +Proof. +move=> uS1 sS1S redS1; pose h s := 'Ind[M, K] 'chi_s. +apply/eqP; rewrite cardE -(size_map h) -uniq_size_uniq // => [|xi]; last first. + apply/imageP/idP=> [[i] | S1xi]; first by rewrite inE => ? ->. + by have /seqIndP[s _ Dxi] := sS1S _ S1xi; exists s; rewrite ?inE -?Dxi. +apply/dinjectiveP; pose h1 xi := cfIirr (#|W1|%:R^-1 *: 'Res[K, M] xi). +apply: can_in_inj (h1) _ => s; rewrite inE => /redS1 red_s. +have cycW1: cyclic W1 by have [[]] := MtypeP. +have [[j /irr_inj->] | [/idPn[]//]] := prTIres_irr_cases ptiWM s. +by rewrite /h cfInd_prTIres /h1 cfRes_prTIred scalerK ?neq0CG ?irrK. +Qed. + +End OneMaximal. + +(* This is Peterfalvi (8.16). *) +Lemma FTtypeII_ker_TI M : + M \in 'M -> FTtype M == 2 -> + [/\ normedTI 'A0(M) G M, normedTI 'A(M) G M & normedTI 'A1(M) G M]. +Proof. +move=> maxM typeM; have [sA1A sAA0] := (FTsupp1_sub maxM, FTsupp_sub0 M). +have [sA10 sA0M] := (subset_trans sA1A sAA0, FTsupp0_sub M). +have nzA1: 'A1(M) != set0 by rewrite setD_eq0 def_FTcore ?subG1 ?Msigma_neq1. +have [nzA nzA0] := (subset_neq0 sA1A nzA1, subset_neq0 sA10 nzA1). +suffices nTI_A0: normedTI 'A0(M) G M. + by rewrite nTI_A0 !(normedTI_S _ _ _ nTI_A0) // ?FTsupp_norm ?FTsupp1_norm. +have [U W W1 W2 defW [[MtypeP _ _ tiFM] _ _ _ _]] := FTtypeP 2 maxM typeM. +apply/(Dade_normedTI_P (FT_Dade0_hyp maxM)); split=> // x A0x. +rewrite /= def_FTsignalizer0 /'R_M //=; have [// | not_sCxM] := ifPn. +have [y cxy /negP[]] := subsetPn not_sCxM. +apply: subsetP cxy; rewrite -['C[x]]setTI (cent1_normedTI tiFM) //. +have /setD1P[ntx Ms_x]: x \in 'A1(M). + by have [_ [/subsetP-> // ]] := FTsupport_facts maxM; apply/setIdP. +rewrite !inE ntx (subsetP (Fcore_sub_Fitting M)) //. +by rewrite (Fcore_eq_FTcore _ _) ?(eqP typeM). +Qed. + +(* This is Peterfalvi, Theorem (8.17). *) +Theorem FT_Dade_support_partition : + [/\ (*a1*) + \pi(G) =i [pred p | [exists M : {group gT} in 'M, p \in \pi(M`_\s)]], + (*a2*) {in 'M &, forall M L, + gval L \notin M :^: G -> coprime #|M`_\s| #|L`_\s| }, + (*b*) {in 'M, forall M, #|'A1~(M)| = (#|M`_\s|.-1 * #|G : M|)%N} + & (*c*) let PG := [set 'A1~(Mi) | Mi : {group gT} in 'M^G] in + [/\ {in 'M^G &, injective (fun M => 'A1~(M))}, + all_FTtype1 -> partition PG G^# + & forall S T W W1 W2 (defW : W1 \x W2 = W), + let VG := class_support (cyclicTIset defW) G in + typeP_pair S T defW -> partition (VG |: PG) G^# /\ VG \notin PG]]. +Proof. +have defDsup M: M \in 'M -> class_support M^~~ G = 'A1~(M). + move=> maxM; rewrite class_supportEr /'A1~(M) /'A1(M) def_FTcore //. + rewrite -(eq_bigr _ (fun _ _ => bigcupJ _ _ _ _)) exchange_big /=. + apply: eq_bigr => x Ms_x; rewrite -class_supportEr. + rewrite -norm_rlcoset ?(subsetP (cent_sub _)) ?cent_FT_signalizer //=. + congr (class_support (_ :* x) G); rewrite /'R_M. + have [_ _ /(_ x Ms_x)[_ defCx _] /(_ x Ms_x)defNF]:= BGsummaryD maxM. + have [sCxM | /defNF[[_ <-]] //] := ifPn. + apply/eqP; rewrite trivg_card1 -(eqn_pmul2r (cardG_gt0 'C_M[x])). + by rewrite (sdprod_card defCx) mul1n /= (setIidPr _). +have [b [a1 a2] [/and3P[_ _ not_PG_set0] _ _]] := BGsummaryE gT. +split=> [p | M L maxM maxL /a2 | M maxM | {b a1 a2}PG]. +- apply/idP/exists_inP=> [/a1[M maxM sMp] | [M _]]. + by exists M => //; rewrite def_FTcore // pi_Msigma. + exact: piSg (subsetT _) p. +- move/(_ maxM maxL)=> coML; rewrite coprime_pi' // !def_FTcore //. + apply: sub_pgroup (pcore_pgroup _ L) => p; apply/implyP. + by rewrite implybN /= pi_Msigma // implybE -negb_and [_ && _]coML. +- by rewrite -defDsup // def_FTcore // b. +have [/subsetP sMG_M _ injMG sM_MG] := mmax_transversalP gT. +have{PG} ->: PG = [set class_support M^~~ G | M : {group gT} in 'M]. + apply/setP=> AG; apply/imsetP/imsetP=> [] [M maxM ->]. + by move/sMG_M in maxM; exists M; rewrite ?defDsup //. + have [x MG_Mx] := sM_MG M maxM. + by exists (M :^ x)%G; rewrite // defDsup ?mmaxJ ?FT_Dade1_supportJ. +have [c1 c2] := mFT_partition gT. +split=> [M H maxM maxH eq_MH | Gtype1 | S T W W1 W2 defW VG pairST]. +- apply: injMG => //; move/sMG_M in maxM; move/sMG_M in maxH. + apply/orbit_transl/idPn => not_HG_M. + have /negP[]: ~~ [disjoint 'A1~(M) & 'A1~(H)]. + rewrite eq_MH -setI_eq0 setIid -defDsup //. + by apply: contraNneq not_PG_set0 => <-; exact: mem_imset. + rewrite -!defDsup // -setI_eq0 class_supportEr big_distrl -subset0. + apply/bigcupsP=> x /class_supportGidr <- /=; rewrite -conjIg sub_conjg conj0g. + rewrite class_supportEr big_distrr /=; apply/bigcupsP=> {x}x _. + rewrite subset0 setI_eq0 -sigma_supportJ sigma_support_disjoint ?mmaxJ //. + by rewrite (orbit_transr _ (mem_orbit _ _ _)) ?in_setT // orbit_sym. +- rewrite c1 // setD_eq0; apply/subsetP=> M maxM. + by rewrite FTtype_Fmax ?(forall_inP Gtype1). +have [[[cycW maxS _] _ _ _ _] [U_S StypeP]] := (pairST, typeP_pairW pairST). +have Stype'1 := FTtypeP_neq1 maxS StypeP. +have maxP_S: S \in TypeP_maxgroups _ by rewrite FTtype_Pmax. +have hallW1: \kappa(S).-Hall(S) W1. + have [[U1 K] /= complU1] := kappa_witness maxS. + have ntK: K :!=: 1%g by rewrite -(trivgPmax maxS complU1). + have [[defS_K _ _] [//|defS' _] _ _ _] := kappa_structure maxS complU1. + rewrite {}defS' in defS_K. + have /imsetP[x Sx defK] := of_typeP_compl_conj StypeP defS_K. + by have [_ hallK _] := complU1; rewrite defK pHallJ in hallK. +have{cycW} [[ntW1 ntW2] [cycW _ _]] := (cycTI_nontrivial cycW, cycW). +suffices defW2: 'C_(S`_\sigma)(W1) = W2. + by have [] := c2 _ _ maxP_S hallW1; rewrite defW2 /= (dprodWY defW). +have [U1 complU1] := ex_kappa_compl maxS hallW1. +have [[_ [_ _ sW2'F] _] _ _ _] := BGsummaryC maxS complU1 ntW1. +rewrite -(setIidPr sW2'F) setIA (setIidPl (Fcore_sub_Msigma maxS)). +exact: typeP_cent_core_compl StypeP. +Qed. + +(* This is Peterfalvi (8.18). Note that part (a) is not actually used later. *) +Lemma FT_Dade_support_disjoint S T : + S \in 'M -> T \in 'M -> gval T \notin S :^: G -> + [/\ (*a*) FTsupports S T = ~~ [disjoint 'A1(S) & 'A(T)] + /\ {in 'A1(S) :&: 'A(T), forall x, + ~~ ('C[x] \subset S) /\ 'C[x] \subset T}, + (*b*) [exists x, FTsupports S (T :^ x)] = ~~ [disjoint 'A1~(S) & 'A~(T)] + & (*c*) [disjoint 'A1~(S) & 'A~(T)] \/ [disjoint 'A1~(T) & 'A~(S)]]. +Proof. +move: S T; pose NC S T := gval T \notin S :^: G. +have part_a2 S T (maxS : S \in 'M) (maxT : T \in 'M) (ncST : NC S T) : + {in 'A1(S) :&: 'A(T), forall x, ~~ ('C[x] \subset S) /\ 'C[x] \subset T}. +- move=> x /setIP[/setD1P[ntx Ss_x] ATx]. + have coxTs: coprime #[x] #|T`_\s|. + apply: (coprime_dvdl (order_dvdG Ss_x)). + by have [_ ->] := FT_Dade_support_partition. + have [z /setD1P[ntz Ts_z] /setD1P[_ /setIP[Tn_x czx]]] := bigcupP ATx. + set n := FTtype T != 1%N in Tn_x. + have typeT: FTtype T == n.+1. + have notTs_x: x \notin T`_\s. + apply: contra ntx => Ts_x. + by rewrite -order_eq1 -dvdn1 -(eqnP coxTs) dvdn_gcd dvdnn order_dvdG. + apply: contraLR ATx => typeT; rewrite FTsupp_eq1 // ?inE ?ntx //. + move: (FTtype_range T) typeT; rewrite -mem_iota /n. + by do 5!case/predU1P=> [-> // | ]. + have defTs: T`_\s = T`_\F. + by apply/esym/Fcore_eq_FTcore; rewrite // (eqP typeT); case n. + have [U Ux defTn]: exists2 U : {group gT}, x \in U & T`_\F ><| U = T^`(n)%g. + have [[U K] /= complU] := kappa_witness maxT. + have defTn: T`_\s ><| U = T^`(n)%g. + by rewrite def_FTcore // (sdprod_FTder maxT complU). + have nsTsTn: T`_\s <| T^`(n)%g by case/sdprod_context: defTn. + have [sTsTn nTsTn] := andP nsTsTn. + have hallTs: \pi(T`_\s).-Hall(T^`(n)%g) T`_\s. + by rewrite defTs (pHall_subl _ (der_sub n T) (Fcore_Hall T)) //= -defTs. + have hallU: \pi(T`_\s)^'.-Hall(T^`(n)%g) U. + by apply/sdprod_Hall_pcoreP; rewrite /= (normal_Hall_pcore hallTs). + have solTn: solvable T^`(n)%g := solvableS (der_sub n T) (mmax_sol maxT). + rewrite coprime_sym coprime_pi' // in coxTs. + have [|y Tn_y] := Hall_subJ solTn hallU _ coxTs; rewrite cycle_subG //. + exists (U :^ y)%G; rewrite // -defTs. + by rewrite -(normsP nTsTn y Tn_y) -sdprodJ defTn conjGid. + have uniqCx: 'M('C[x]) = [set T]. + have:= FTtypeI_II_facts maxT typeT defTn; rewrite !ltnS leq_b1 -cent_set1. + case=> _ -> //; first by rewrite -cards_eq0 cards1. + by rewrite sub1set !inE ntx. + by apply/trivgPn; exists z; rewrite //= -defTs inE Ts_z cent_set1 cent1C. + split; last by case/mem_uniq_mmax: uniqCx. + by apply: contra ncST => /(eq_uniq_mmax uniqCx maxS)->; exact: orbit_refl. +have part_a1 S T (maxS : S \in 'M) (maxT : T \in 'M) (ncST : NC S T) : + FTsupports S T = ~~ [disjoint 'A1(S) & 'A(T)]. +- apply/existsP/pred0Pn=> [[x /and3P[ASx not_sCxS sCxT]] | [x /andP[A1Sx Atx]]]. + have [_ [/subsetP]] := FTsupport_facts maxS; set D := finset _. + have Dx: x \in D by rewrite !inE ASx. + move=> /(_ x Dx) A1x /(_ x Dx)uniqCx /(_ x Dx)[_ _ /setDP[ATx _] _]. + by rewrite (eq_uniq_mmax uniqCx maxT sCxT); exists x; exact/andP. + exists x; rewrite (subsetP (FTsupp1_sub maxS)) //=. + by apply/andP/part_a2=> //; exact/setIP. +have part_b S T (maxS : S \in 'M) (maxT : T \in 'M) (ncST : NC S T) : + [exists x, FTsupports S (T :^ x)] = ~~ [disjoint 'A1~(S) & 'A~(T)]. +- apply/existsP/pred0Pn=> [[x] | [y /andP[/= A1GSy AGTy]]]. + rewrite part_a1 ?mmaxJ // => [/pred0Pn[y /andP/=[A1Sy ATyx]]|]; last first. + by rewrite /NC -(rcoset_id (in_setT x)) orbit_rcoset. + rewrite FTsuppJ mem_conjg in ATyx; exists (y ^ x^-1); apply/andP; split. + by apply/bigcupP; exists y => //; rewrite mem_imset2 ?rcoset_refl ?inE. + apply/bigcupP; exists (y ^ x^-1) => //. + by rewrite mem_class_support ?rcoset_refl. + have{AGTy} [x2 ATx2 x2R_yG] := bigcupP AGTy. + have [sCx2T | not_sCx2T] := boolP ('C[x2] \subset T); last first. + have [_ _ _ [injA1G pGI pGP]] := FT_Dade_support_partition. + have{pGI pGP} tiA1g: trivIset [set 'A1~(M) | M : {group gT} in 'M^G]. + case: FTtypeP_pair_cases => [/forall_inP/pGI/and3P[] // | [M [L]]]. + by case=> _ W W1 W2 defW1 /pGP[]/and3P[_ /(trivIsetS (subsetUr _ _))]. + have [_ _ injMG sM_MG] := mmax_transversalP gT. + have [_ [sDA1T _] _] := FTsupport_facts maxT. + have [[z1 maxSz] [z2 maxTz]] := (sM_MG S maxS, sM_MG T maxT). + case/imsetP: ncST; exists (z1 * z2^-1)%g; first by rewrite inE. + rewrite conjsgM; apply/(canRL (conjsgK _))/congr_group/injA1G=> //. + apply/eqP/idPn=> /(trivIsetP tiA1g)/pred0Pn[]; try exact: mem_imset. + exists y; rewrite !FT_Dade1_supportJ /= A1GSy andbT. + by apply/bigcupP; exists x2; rewrite // (subsetP sDA1T) ?inE ?ATx2. + have{x2R_yG} /imsetP[z _ def_y]: y \in x2 ^: G. + by rewrite /'R_T {}sCx2T mul1g class_support_set1l in x2R_yG. + have{A1GSy} [x1 A1Sx1] := bigcupP A1GSy; rewrite {y}def_y -mem_conjgV. + rewrite class_supportGidr ?inE {z}//. + case/imset2P=> _ z /rcosetP[y Hy ->] _ def_x2. + exists z^-1%g; rewrite part_a1 ?mmaxJ //; last first. + by rewrite /NC (orbit_transr _ (mem_orbit _ _ _)) ?inE. + apply/pred0Pn; exists x1; rewrite /= A1Sx1 FTsuppJ mem_conjgV; apply/bigcupP. + pose ddS := FT_Dade1_hyp maxS; have [/andP[sA1S _] _ notA1_1 _ _] := ddS. + have [ntx1 Sx1] := (memPn notA1_1 _ A1Sx1, subsetP sA1S _ A1Sx1). + have [coHS defCx1] := (Dade_coprime ddS A1Sx1 A1Sx1, Dade_sdprod ddS A1Sx1). + rewrite def_FTsignalizer1 // in coHS defCx1. + have[u Ts_u /setD1P[_ cT'ux2]] := bigcupP ATx2. + exists u => {Ts_u}//; rewrite 2!inE -(conj1g z) (can_eq (conjgK z)) ntx1. + suffices{u cT'ux2} ->: x1 = (y * x1).`_(\pi('R_S x1)^'). + by rewrite -consttJ -def_x2 groupX. + have /setIP[_ /cent1P cx1y]: y \in 'C_G[x1]. + by case/sdprod_context: defCx1 => /andP[/subsetP->]. + rewrite consttM // (constt1P _) ?p_eltNK ?(mem_p_elt (pgroup_pi _)) // mul1g. + have piR'_Cx1: \pi('R_S x1)^'.-group 'C_S[x1] by rewrite coprime_pi' in coHS. + by rewrite constt_p_elt ?(mem_p_elt piR'_Cx1) // inE Sx1 cent1id. +move=> S T maxS maxT ncST; split; first split; auto. +apply/orP/idPn; rewrite negb_or -part_b // => /andP[suppST /negP[]]. +without loss{suppST} suppST: T maxT ncST / FTsupports S T. + move=> IH; case/existsP: suppST => x /IH {IH}. + rewrite FT_Dade1_supportJ (orbit_transr _ (mem_orbit _ _ _)) ?in_setT //. + by rewrite mmaxJ => ->. +have{suppST} [y /and3P[ASy not_sCyS sCyT]] := existsP suppST. +have Dy: y \in [set z in 'A0(S) | ~~ ('C[z] \subset S)] by rewrite !inE ASy. +have [_ [_ /(_ y Dy) uCy] /(_ y Dy)[_ coTcS _ typeT]] := FTsupport_facts maxS. +rewrite -mem_iota -(eq_uniq_mmax uCy maxT sCyT) !inE in coTcS typeT. +apply/negbNE; rewrite -part_b /NC 1?orbit_sym // negb_exists. +apply/forallP=> x; rewrite part_a1 ?mmaxJ ?negbK //; last first. + by rewrite /NC (orbit_transr _ (mem_orbit _ _ _)) ?in_setT // orbit_sym. +rewrite -setI_eq0 -subset0 FTsuppJ -bigcupJ big_distrr; apply/bigcupsP=> z Sxz. +rewrite conjD1g /= -setDIl coprime_TIg ?setDv //= cardJg. +rewrite -(Fcore_eq_FTcore maxT _) ?inE ?orbA; last by have [->] := typeT. +by rewrite (coprimegS _ (coTcS z _)) ?(subsetP (FTsupp1_sub0 _)) ?setSI ?gFsub. +Qed. + +(* A corollary to the above, which Peterfalvi derives from (8.17a) (i.e., *) +(* FT_Dade_support_partition) in the proof of (12.16). *) +Lemma FT_Dade1_support_disjoint S T : + S \in 'M -> T \in 'M -> gval T \notin S :^: G -> [disjoint 'A1~(S) & 'A1~(T)]. +Proof. +move=> maxS maxT /FT_Dade_support_disjoint[] // _ _ tiA1A. +without loss{tiA1A maxT}: S T maxS / [disjoint 'A1~(T) & 'A~(S)]. + by move=> IH_ST; case: tiA1A => /IH_ST; first rewrite disjoint_sym; apply. +by rewrite disjoint_sym; apply/disjoint_trans/FT_Dade_supportS/FTsupp1_sub. +Qed. + +End Eight. + +Notation FT_Dade0 maxM := (Dade (FT_Dade0_hyp maxM)). +Notation FT_Dade maxM := (Dade (FT_Dade_hyp maxM)). +Notation FT_Dade1 maxM := (Dade (FT_Dade1_hyp maxM)). +Notation FT_DadeF maxM := (Dade (FT_DadeF_hyp maxM)). + |
