aboutsummaryrefslogtreecommitdiff
path: root/mathcomp
diff options
context:
space:
mode:
authorEnrico Tassi2018-04-17 16:57:13 +0200
committerEnrico Tassi2018-04-17 16:57:13 +0200
commiteaa90cf9520e43d0b05fc6431a479e6b9559ef0e (patch)
tree8499953a468a8d8be510dd0d60232cbd8984c1ec /mathcomp
parentc1ec9cd8e7e50f73159613c492aad4c6c40bc3aa (diff)
move odd_order to its own repository
Diffstat (limited to 'mathcomp')
-rw-r--r--mathcomp/Make34
l---------mathcomp/odd_order/AUTHORS1
-rw-r--r--mathcomp/odd_order/BGappendixAB.v516
-rw-r--r--mathcomp/odd_order/BGappendixC.v760
-rw-r--r--mathcomp/odd_order/BGsection1.v1343
-rw-r--r--mathcomp/odd_order/BGsection10.v1503
-rw-r--r--mathcomp/odd_order/BGsection11.v443
-rw-r--r--mathcomp/odd_order/BGsection12.v2686
-rw-r--r--mathcomp/odd_order/BGsection13.v1123
-rw-r--r--mathcomp/odd_order/BGsection14.v2520
-rw-r--r--mathcomp/odd_order/BGsection15.v1511
-rw-r--r--mathcomp/odd_order/BGsection16.v1368
-rw-r--r--mathcomp/odd_order/BGsection2.v1161
-rw-r--r--mathcomp/odd_order/BGsection3.v1832
-rw-r--r--mathcomp/odd_order/BGsection4.v1416
-rw-r--r--mathcomp/odd_order/BGsection5.v534
-rw-r--r--mathcomp/odd_order/BGsection6.v322
-rw-r--r--mathcomp/odd_order/BGsection7.v979
-rw-r--r--mathcomp/odd_order/BGsection8.v401
-rw-r--r--mathcomp/odd_order/BGsection9.v476
l---------mathcomp/odd_order/CeCILL-B1
l---------mathcomp/odd_order/INSTALL1
-rw-r--r--mathcomp/odd_order/Make36
-rw-r--r--mathcomp/odd_order/Makefile25
-rw-r--r--mathcomp/odd_order/PFsection1.v762
-rw-r--r--mathcomp/odd_order/PFsection10.v1230
-rw-r--r--mathcomp/odd_order/PFsection11.v1203
-rw-r--r--mathcomp/odd_order/PFsection12.v1373
-rw-r--r--mathcomp/odd_order/PFsection13.v2199
-rw-r--r--mathcomp/odd_order/PFsection14.v1271
-rw-r--r--mathcomp/odd_order/PFsection2.v830
-rw-r--r--mathcomp/odd_order/PFsection3.v1864
-rw-r--r--mathcomp/odd_order/PFsection4.v994
-rw-r--r--mathcomp/odd_order/PFsection5.v1609
-rw-r--r--mathcomp/odd_order/PFsection6.v1345
-rw-r--r--mathcomp/odd_order/PFsection7.v828
-rw-r--r--mathcomp/odd_order/PFsection8.v1141
-rw-r--r--mathcomp/odd_order/PFsection9.v2211
l---------mathcomp/odd_order/README1
-rw-r--r--mathcomp/odd_order/descr6
-rw-r--r--mathcomp/odd_order/opam16
-rw-r--r--mathcomp/odd_order/stripped_odd_order_theorem.v209
-rw-r--r--mathcomp/odd_order/wielandt_fixpoint.v659
43 files changed, 0 insertions, 40743 deletions
diff --git a/mathcomp/Make b/mathcomp/Make
index 1db29ba..cf52650 100644
--- a/mathcomp/Make
+++ b/mathcomp/Make
@@ -46,40 +46,6 @@ fingroup/morphism.v
fingroup/perm.v
fingroup/presentation.v
fingroup/quotient.v
-odd_order/BGappendixAB.v
-odd_order/BGappendixC.v
-odd_order/BGsection10.v
-odd_order/BGsection11.v
-odd_order/BGsection12.v
-odd_order/BGsection13.v
-odd_order/BGsection14.v
-odd_order/BGsection15.v
-odd_order/BGsection16.v
-odd_order/BGsection1.v
-odd_order/BGsection2.v
-odd_order/BGsection3.v
-odd_order/BGsection4.v
-odd_order/BGsection5.v
-odd_order/BGsection6.v
-odd_order/BGsection7.v
-odd_order/BGsection8.v
-odd_order/BGsection9.v
-odd_order/PFsection10.v
-odd_order/PFsection11.v
-odd_order/PFsection12.v
-odd_order/PFsection13.v
-odd_order/PFsection14.v
-odd_order/PFsection1.v
-odd_order/PFsection2.v
-odd_order/PFsection3.v
-odd_order/PFsection4.v
-odd_order/PFsection5.v
-odd_order/PFsection6.v
-odd_order/PFsection7.v
-odd_order/PFsection8.v
-odd_order/PFsection9.v
-odd_order/stripped_odd_order_theorem.v
-odd_order/wielandt_fixpoint.v
real_closed/all_real_closed.v
real_closed/bigenough.v
real_closed/cauchyreals.v
diff --git a/mathcomp/odd_order/AUTHORS b/mathcomp/odd_order/AUTHORS
deleted file mode 120000
index b55a98d..0000000
--- a/mathcomp/odd_order/AUTHORS
+++ /dev/null
@@ -1 +0,0 @@
-../../etc/AUTHORS \ No newline at end of file
diff --git a/mathcomp/odd_order/BGappendixAB.v b/mathcomp/odd_order/BGappendixAB.v
deleted file mode 100644
index eb708a6..0000000
--- a/mathcomp/odd_order/BGappendixAB.v
+++ /dev/null
@@ -1,516 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq div.
-From mathcomp
-Require Import fintype bigop prime finset ssralg fingroup morphism.
-From mathcomp
-Require Import automorphism quotient gfunctor commutator zmodp center pgroup.
-From mathcomp
-Require Import sylow gseries nilpotent abelian maximal.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation mxabelem.
-From mathcomp
-Require Import BGsection1 BGsection2.
-
-(******************************************************************************)
-(* This file contains the useful material in B & G, appendices A and B, i.e., *)
-(* the proof of the p-stability properties and the ZL-Theorem (the Puig *)
-(* replacement for the Glaubermann ZJ-theorem). The relevant definitions are *)
-(* given in BGsection1. *)
-(* Theorem A.4(a) has not been formalised: it is a result on external *)
-(* p-stability, which concerns faithful representations of group with a *)
-(* trivial p-core on a field of characteristic p. It's the historical concept *)
-(* that was studied by Hall and Higman, but it's not used for FT. Note that *)
-(* the finite field case can be recovered from A.4(c) with a semi-direct *)
-(* product. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Local Open Scope ring_scope.
-Import GroupScope GRing.Theory.
-
-Section AppendixA.
-
-Implicit Type gT : finGroupType.
-Implicit Type p : nat.
-
-Import MatrixGenField.
-
-(* This is B & G, Theorem A.4(c) (in Appendix A, not section 16!). We follow *)
-(* both B & G and Gorenstein in using the general form of the p-stable *)
-(* property. We could simplify the property because the conditions under *)
-(* which we prove p-stability are inherited by sections (morphic image in our *)
-(* framework), and restrict to the case where P is normal in G. (Clearly the *)
-(* 'O_p^'(G) * P <| G premise plays no part in the proof.) *)
-(* Theorems A.1-A.3 are essentially inlined in this proof. *)
-
-Theorem odd_p_stable gT p (G : {group gT}) : odd #|G| -> p.-stable G.
-Proof.
-move: gT G.
-pose p_xp gT (E : {group gT}) x := p.-elt x && (x \in 'C([~: E, [set x]])).
-suffices IH gT (E : {group gT}) x y (G := <<[set x; y]>>) :
- [&& odd #|G|, p.-group E & G \subset 'N(E)] -> p_xp gT E x && p_xp gT E y ->
- p.-group (G / 'C(E)).
-- move=> gT G oddG P A pP /andP[/mulGsubP[_ sPG] _] /andP[sANG pA] cRA.
- apply/subsetP=> _ /morphimP[x Nx Ax ->]; have NGx := subsetP sANG x Ax.
- apply: Baer_Suzuki => [|_ /morphimP[y Ny NGy ->]]; first exact: mem_quotient.
- rewrite -morphJ // -!morphim_set1 -?[<<_>>]morphimY ?sub1set ?groupJ //.
- set G1 := _ <*> _; rewrite /pgroup -(card_isog (second_isog _)); last first.
- by rewrite join_subG !sub1set Nx groupJ.
- have{Nx NGx Ny NGy} [[Gx Nx] [Gy Ny]] := (setIP NGx, setIP NGy).
- have sG1G: G1 \subset G by rewrite join_subG !sub1set groupJ ?andbT.
- have nPG1: G1 \subset 'N(P) by rewrite join_subG !sub1set groupJ ?andbT.
- rewrite -setIA setICA (setIidPr sG1G).
- rewrite (card_isog (second_isog _)) ?norms_cent //.
- apply: IH => //; first by rewrite pP nPG1 (oddSg sG1G).
- rewrite /p_xp -{2}(normP Ny) -conjg_set1 -conjsRg centJ memJ_conjg.
- rewrite p_eltJ andbb (mem_p_elt pA) // -sub1set centsC (sameP commG1P trivgP).
- by rewrite -cRA !commgSS ?sub1set.
-move: {2}_.+1 (ltnSn #|E|) => n; elim: n => // n IHn in gT E x y G *.
-rewrite ltnS => leEn /and3P[oddG pE nEG] /and3P[/andP[p_x cRx] p_y cRy].
-have [Gx Gy]: x \in G /\ y \in G by apply/andP; rewrite -!sub1set -join_subG.
-apply: wlog_neg => p'Gc; apply/pgroupP=> q q_pr qGc; apply/idPn => p'q.
-have [Q sylQ] := Sylow_exists q [group of G].
-have [sQG qQ]: Q \subset G /\ q.-group Q by case/and3P: sylQ.
-have{qQ p'q} p'Q: p^'.-group Q by apply: sub_in_pnat qQ => q' _ /eqnP->.
-have{q q_pr sylQ qGc} ncEQ: ~~ (Q \subset 'C(E)).
- apply: contraL qGc => cEQ; rewrite -p'natE // -partn_eq1 //.
- have nCQ: Q \subset 'N('C(E)) by apply: subset_trans (normG _).
- have sylQc: q.-Sylow(G / 'C(E)) (Q / 'C(E)) by rewrite morphim_pSylow.
- by rewrite -(card_Hall sylQc) -trivg_card1 (sameP eqP trivgP) quotient_sub1.
-have solE: solvable E := pgroup_sol pE.
-have ntE: E :!=: 1 by apply: contra ncEQ; move/eqP->; rewrite cents1.
-have{Q ncEQ p'Q sQG} minE_EG: minnormal E (E <*> G).
- apply/mingroupP; split=> [|D]; rewrite join_subG ?ntE ?normG //.
- case/and3P=> ntD nDE nDG sDE; have nDGi := subsetP nDG.
- apply/eqP; rewrite eqEcard sDE leqNgt; apply: contra ncEQ => ltDE.
- have nDQ: Q \subset 'N(D) by rewrite (subset_trans sQG).
- have cDQ: Q \subset 'C(D).
- rewrite -quotient_sub1 ?norms_cent // ?[_ / _]card1_trivg //.
- apply: pnat_1 (morphim_pgroup _ p'Q); apply: pgroupS (quotientS _ sQG) _.
- apply: IHn (leq_trans ltDE leEn) _ _; first by rewrite oddG (pgroupS sDE).
- rewrite /p_xp p_x p_y /=; apply/andP.
- by split; [move: cRx | move: cRy]; apply: subsetP; rewrite centS ?commSg.
- apply: (stable_factor_cent cDQ) solE; rewrite ?(pnat_coprime pE) //.
- apply/and3P; split; rewrite // -quotient_cents2 // centsC.
- rewrite -quotient_sub1 ?norms_cent ?quotient_norms ?(subset_trans sQG) //=.
- rewrite [(_ / _) / _]card1_trivg //=.
- apply: pnat_1 (morphim_pgroup _ (morphim_pgroup _ p'Q)).
- apply: pgroupS (quotientS _ (quotientS _ sQG)) _.
- have defGq: G / D = <<[set coset D x; coset D y]>>.
- by rewrite quotient_gen -1?gen_subG ?quotientU ?quotient_set1 ?nDGi.
- rewrite /= defGq IHn ?(leq_trans _ leEn) ?ltn_quotient // -?defGq.
- by rewrite quotient_odd // quotient_pgroup // quotient_norms.
- rewrite /p_xp -!sub1set !morph_p_elt -?quotient_set1 ?nDGi //=.
- by rewrite -!quotientR ?quotient_cents ?sub1set ?nDGi.
-have abelE: p.-abelem E.
- by rewrite -is_abelem_pgroup //; case: (minnormal_solvable minE_EG _ solE).
-have cEE: abelian E by case/and3P: abelE.
-have{minE_EG} minE: minnormal E G.
- case/mingroupP: minE_EG => _ minE; apply/mingroupP; rewrite ntE.
- split=> // D ntD sDE; apply: minE => //; rewrite join_subG cents_norm //.
- by rewrite centsC (subset_trans sDE).
-have nCG: G \subset 'N('C_G(E)) by rewrite normsI ?normG ?norms_cent.
-suffices{p'Gc} pG'c: p.-group (G / 'C_G(E))^`(1).
- have [Pc sylPc sGc'Pc]:= Sylow_superset (der_subS _ _) pG'c.
- have nsPc: Pc <| G / 'C_G(E) by rewrite sub_der1_normal ?(pHall_sub sylPc).
- case/negP: p'Gc; rewrite /pgroup -(card_isog (second_isog _)) ?norms_cent //.
- rewrite setIC; apply: pgroupS (pHall_pgroup sylPc) => /=.
- rewrite sub_quotient_pre // join_subG !sub1set !(subsetP nCG, inE) //=.
- by rewrite !(mem_normal_Hall sylPc) ?mem_quotient ?morph_p_elt ?(subsetP nCG).
-have defC := rker_abelem abelE ntE nEG; rewrite /= -/G in defC.
-set rG := abelem_repr _ _ _ in defC.
-case ncxy: (rG x *m rG y == rG y *m rG x).
- have Cxy: [~ x, y] \in 'C_G(E).
- rewrite -defC inE groupR //= !repr_mxM ?groupM ?groupV // mul1mx -/rG.
- by rewrite (eqP ncxy) -!repr_mxM ?groupM ?groupV // mulKg mulVg repr_mx1.
- rewrite [_^`(1)](commG1P _) ?pgroup1 //= quotient_gen -gen_subG //= -/G.
- rewrite !gen_subG centsC gen_subG quotient_cents2r ?gen_subG //= -/G.
- rewrite /commg_set imset2Ul !imset2_set1l !imsetU !imset_set1.
- by rewrite !subUset andbC !sub1set !commgg group1 /= -invg_comm groupV Cxy.
-pose Ax : 'M(E) := rG x - 1; pose Ay : 'M(E) := rG y - 1.
-have Ax2: Ax *m Ax = 0.
- apply/row_matrixP=> i; apply/eqP; rewrite row_mul mulmxBr mulmx1.
- rewrite row0 subr_eq0 -(inj_eq (@rVabelem_inj _ _ _ abelE ntE)).
- rewrite rVabelemJ // conjgE -(centP cRx) ?mulKg //.
- rewrite linearB /= addrC row1 rowE rVabelemD rVabelemN rVabelemJ //=.
- by rewrite mem_commg ?set11 ?mem_rVabelem.
-have Ay2: Ay *m Ay = 0.
- apply/row_matrixP=> i; apply/eqP; rewrite row_mul mulmxBr mulmx1.
- rewrite row0 subr_eq0 -(inj_eq (@rVabelem_inj _ _ _ abelE ntE)).
- rewrite rVabelemJ // conjgE -(centP cRy) ?mulKg //.
- rewrite linearB /= addrC row1 rowE rVabelemD rVabelemN rVabelemJ //=.
- by rewrite mem_commg ?set11 ?mem_rVabelem.
-pose A := Ax *m Ay + Ay *m Ax.
-have cAG: centgmx rG A.
- rewrite /centgmx gen_subG subUset !sub1set !inE Gx Gy /=; apply/andP.
- rewrite -[rG x](subrK 1%R) -[rG y](subrK 1%R) -/Ax -/Ay.
- rewrite 2!(mulmxDl _ 1 A) 2!(mulmxDr A _ 1) !mulmx1 !mul1mx.
- rewrite !(inj_eq (addIr A)) ![_ *m A]mulmxDr ![A *m _]mulmxDl.
- by rewrite -!mulmxA Ax2 Ay2 !mulmx0 !mulmxA Ax2 Ay2 !mul0mx !addr0 !add0r.
-have irrG: mx_irreducible rG by apply/abelem_mx_irrP.
-pose rAG := gen_repr irrG cAG; pose inFA := in_gen irrG cAG.
-pose valFA := @val_gen _ _ _ _ _ _ irrG cAG.
-set dA := gen_dim A in rAG inFA valFA.
-rewrite -(rker_abelem abelE ntE nEG) -/rG -(rker_gen irrG cAG) -/rAG.
-have dA_gt0: dA > 0 by rewrite (gen_dim_gt0 irrG cAG).
-have irrAG: mx_irreducible rAG by apply: gen_mx_irr.
-have: dA <= 2.
- case Ax0: (Ax == 0).
- by rewrite subr_eq0 in Ax0; case/eqP: ncxy; rewrite (eqP Ax0) mulmx1 mul1mx.
- case/rowV0Pn: Ax0 => v; case/submxP => u def_v nzv.
- pose U := col_mx v (v *m Ay); pose UA := <<inFA _ U>>%MS.
- pose rvalFA := @rowval_gen _ _ _ _ _ _ irrG cAG.
- have Umod: mxmodule rAG UA.
- rewrite /mxmodule gen_subG subUset !sub1set !inE Gx Gy /= andbC.
- apply/andP; split; rewrite (eqmxMr _ (genmxE _)) -in_genJ // genmxE.
- rewrite submx_in_gen // -[rG y](subrK 1%R) -/Ay mulmxDr mulmx1.
- rewrite addmx_sub // mul_col_mx -mulmxA Ay2 mulmx0.
- by rewrite -!addsmxE addsmx0 addsmxSr.
- rewrite -[rG x](subrK 1%R) -/Ax mulmxDr mulmx1 in_genD mul_col_mx.
- rewrite -mulmxA -[Ay *m Ax](addKr (Ax *m Ay)) (mulmxDr v _ A) -mulmxN.
- rewrite mulmxA {1 2}def_v -(mulmxA u) Ax2 mulmx0 mul0mx add0r.
- pose B := A; rewrite -(mul0mx _ B) -mul_col_mx -[B](mxval_groot irrG cAG).
- rewrite {B} -[_ 0 v](in_genK irrG cAG) -val_genZ val_genK.
- rewrite addmx_sub ?scalemx_sub ?submx_in_gen //.
- by rewrite -!addsmxE adds0mx addsmxSl.
- have nzU: UA != 0.
- rewrite -mxrank_eq0 genmxE mxrank_eq0; apply/eqP.
- move/(canRL ((in_genK _ _) _)); rewrite val_gen0; apply/eqP.
- by rewrite -submx0 -addsmxE addsmx_sub submx0 negb_and nzv.
- case/mx_irrP: irrAG => _ /(_ UA Umod nzU)/eqnP <-.
- by rewrite genmxE rank_leq_row.
-rewrite leq_eqVlt ltnS leq_eqVlt ltnNge dA_gt0 orbF orbC; case/pred2P=> def_dA.
- rewrite [_^`(1)](commG1P _) ?pgroup1 // quotient_cents2r // gen_subG.
- apply/subsetP=> zt; case/imset2P=> z t Gz Gt ->{zt}.
- rewrite !inE groupR //= mul1mx; have Gtz := groupM Gt Gz.
- rewrite -(inj_eq (can_inj (mulKmx (repr_mx_unit rAG Gtz)))) mulmx1.
- rewrite [eq_op]lock -repr_mxM ?groupR ?groupM // -commgC !repr_mxM // -lock.
- apply/eqP; move: (rAG z) (rAG t); rewrite /= -/dA def_dA => Az At.
- by rewrite [Az]mx11_scalar scalar_mxC.
-move: (kquo_repr _) (kquo_mx_faithful rAG) => /=; set K := rker _.
-rewrite def_dA => r2G; move/der1_odd_GL2_charf; move/implyP.
-rewrite quotient_odd //= -/G; apply: etrans; apply: eq_pgroup => p'.
-have [p_pr _ _] := pgroup_pdiv pE ntE.
-by rewrite (fmorph_char (gen_rmorphism _ _)) (charf_eq (char_Fp _)).
-Qed.
-
-Section A5.
-
-Variables (gT : finGroupType) (p : nat) (G P X : {group gT}).
-
-Hypotheses (oddG : odd #|G|) (solG : solvable G) (pP : p.-group P).
-Hypotheses (nsPG : P <| G) (sXG : X \subset G).
-Hypotheses (genX : generated_by (p_norm_abelian p P) X).
-
-Let C := 'C_G(P).
-Let defN : 'N_G(P) = G. Proof. by rewrite (setIidPl _) ?normal_norm. Qed.
-Let nsCG : C <| G. Proof. by rewrite -defN subcent_normal. Qed.
-Let nCG := normal_norm nsCG.
-Let nCX := subset_trans sXG nCG.
-
-(* This is B & G, Theorem A.5.1; it does not depend on the solG assumption. *)
-Theorem odd_abelian_gen_stable : X / C \subset 'O_p(G / C).
-Proof.
-case/exists_eqP: genX => gX defX.
-rewrite -defN sub_quotient_pre // -defX gen_subG.
-apply/bigcupsP=> A gX_A; have [_ pA nAP cAA] := and4P gX_A.
-have{gX_A} sAX: A \subset X by rewrite -defX sub_gen ?bigcup_sup.
-rewrite -sub_quotient_pre ?(subset_trans sAX nCX) //=.
-rewrite odd_p_stable ?normalM ?pcore_normal //.
- by rewrite /psubgroup pA defN (subset_trans sAX sXG).
-by apply/commG1P; rewrite (subset_trans _ cAA) // commg_subr.
-Qed.
-
-(* This is B & G, Theorem A.5.2. *)
-Theorem odd_abelian_gen_constrained :
- 'O_p^'(G) = 1 -> 'C_('O_p(G))(P) \subset P -> X \subset 'O_p(G).
-Proof.
-set Q := 'O_p(G) => p'G1 sCQ_P.
-have sPQ: P \subset Q by rewrite pcore_max.
-have defQ: 'O_{p^', p}(G) = Q by rewrite pseries_pop2.
-have pQ: p.-group Q by apply: pcore_pgroup.
-have sCQ: 'C_G(Q) \subset Q.
- by rewrite -{2}defQ solvable_p_constrained //= defQ /pHall pQ indexgg subxx.
-have pC: p.-group C.
- apply/pgroupP=> q q_pr; case/Cauchy=> // u Cu q_u; apply/idPn=> p'q.
- suff cQu: u \in 'C_G(Q).
- case/negP: p'q; have{q_u}: q %| #[u] by rewrite q_u.
- by apply: pnatP q q_pr => //; apply: mem_p_elt pQ _; apply: (subsetP sCQ).
- have [Gu cPu] := setIP Cu; rewrite inE Gu /= -cycle_subG.
- rewrite coprime_nil_faithful_cent_stab ?(pgroup_nil pQ) //= -/C -/Q.
- - by rewrite cycle_subG; apply: subsetP Gu; rewrite normal_norm ?pcore_normal.
- - by rewrite (pnat_coprime pQ) // [#|_|]q_u pnatE.
- have sPcQu: P \subset 'C_Q(<[u]>) by rewrite subsetI sPQ centsC cycle_subG.
- by apply: subset_trans (subset_trans sCQ_P sPcQu); rewrite setIS // centS.
-rewrite -(quotientSGK nCX) ?pcore_max // -pquotient_pcore //.
-exact: odd_abelian_gen_stable.
-Qed.
-
-End A5.
-
-End AppendixA.
-
-Section AppendixB.
-
-Local Notation "X --> Y" := (generated_by (norm_abelian X) Y)
- (at level 70, no associativity) : group_scope.
-
-Variable gT : finGroupType.
-Implicit Types G H A : {group gT}.
-Implicit Types D E : {set gT}.
-Implicit Type p : nat.
-
-Lemma Puig_char G : 'L(G) \char G.
-Proof. exact: gFchar. Qed.
-
-Lemma center_Puig_char G : 'Z('L(G)) \char G.
-Proof. by rewrite !gFchar_trans. Qed.
-
-(* This is B & G, Lemma B.1(a). *)
-Lemma Puig_succS G D E : D \subset E -> 'L_[G](E) \subset 'L_[G](D).
-Proof.
-move=> sDE; apply: Puig_max (Puig_succ_sub _ _).
-exact: norm_abgenS sDE (Puig_gen _ _).
-Qed.
-
-(* This is part of B & G, Lemma B.1(b) (see also BGsection1.Puig1). *)
-Lemma Puig_sub_even m n G : m <= n -> 'L_{m.*2}(G) \subset 'L_{n.*2}(G).
-Proof.
-move/subnKC <-; move: {n}(n - m)%N => n.
-by elim: m => [|m IHm] /=; rewrite ?sub1G ?Puig_succS.
-Qed.
-
-(* This is part of B & G, Lemma B.1(b). *)
-Lemma Puig_sub_odd m n G : m <= n -> 'L_{n.*2.+1}(G) \subset 'L_{m.*2.+1}(G).
-Proof. by move=> le_mn; rewrite Puig_succS ?Puig_sub_even. Qed.
-
-(* This is part of B & G, Lemma B.1(b). *)
-Lemma Puig_sub_even_odd m n G : 'L_{m.*2}(G) \subset 'L_{n.*2.+1}(G).
-Proof.
-elim: n m => [|n IHn] m; first by rewrite Puig1 Puig_at_sub.
-by case: m => [|m]; rewrite ?sub1G ?Puig_succS ?IHn.
-Qed.
-
-(* This is B & G, Lemma B.1(c). *)
-Lemma Puig_limit G :
- exists m, forall k, m <= k ->
- 'L_{k.*2}(G) = 'L_*(G) /\ 'L_{k.*2.+1}(G) = 'L(G).
-Proof.
-pose L2G m := 'L_{m.*2}(G); pose n := #|G|.
-have []: #|L2G n| <= n /\ n <= n by rewrite subset_leq_card ?Puig_at_sub.
-elim: {1 2 3}n => [| m IHm leLm1 /ltnW]; first by rewrite leqNgt cardG_gt0.
-have [eqLm le_mn|] := eqVneq (L2G m.+1) (L2G m); last first.
- rewrite eq_sym eqEcard Puig_sub_even ?leqnSn // -ltnNge => lt_m1_m.
- exact: IHm (leq_trans lt_m1_m leLm1).
-have{eqLm} eqLm k: m <= k -> 'L_{k.*2}(G) = L2G m.
- rewrite leq_eqVlt => /predU1P[-> // |]; elim: k => // k IHk.
- by rewrite leq_eqVlt => /predU1P[<- //| ltmk]; rewrite -eqLm !PuigS IHk.
-by exists m => k le_mk; rewrite Puig_def PuigS /Puig_inf /= !eqLm.
-Qed.
-
-(* This is B & G, Lemma B.1(d), second part; the first part is covered by *)
-(* BGsection1.Puig_inf_sub. *)
-Lemma Puig_inf_sub_Puig G : 'L_*(G) \subset 'L(G).
-Proof. exact: Puig_sub_even_odd. Qed.
-
-(* This is B & G, Lemma B.1(e). *)
-Lemma abelian_norm_Puig n G A :
- n > 0 -> abelian A -> A <| G -> A \subset 'L_{n}(G).
-Proof.
-case: n => // n _ cAA /andP[sAG nAG].
-rewrite PuigS sub_gen // bigcup_sup // inE sAG /norm_abelian cAA andbT.
-exact: subset_trans (Puig_at_sub n G) nAG.
-Qed.
-
-(* This is B & G, Lemma B.1(f), first inclusion. *)
-Lemma sub_cent_Puig_at n p G :
- n > 0 -> p.-group G -> 'C_G('L_{n}(G)) \subset 'L_{n}(G).
-Proof.
-move=> n_gt0 pG.
-have /ex_maxgroup[M /(max_SCN pG)SCN_M]: exists M, (gval M <| G) && abelian M.
- by exists 1%G; rewrite normal1 abelian1.
-have{SCN_M} [cMM [nsMG defCM]] := (SCN_abelian SCN_M, SCN_P SCN_M).
-have sML: M \subset 'L_{n}(G) by apply: abelian_norm_Puig.
-by apply: subset_trans (sML); rewrite -defCM setIS // centS.
-Qed.
-
-(* This is B & G, Lemma B.1(f), second inclusion. *)
-Lemma sub_center_cent_Puig_at n G : 'Z(G) \subset 'C_G('L_{n}(G)).
-Proof. by rewrite setIS ?centS ?Puig_at_sub. Qed.
-
-(* This is B & G, Lemma B.1(f), third inclusion (the fourth is trivial). *)
-Lemma sub_cent_Puig_inf p G : p.-group G -> 'C_G('L_*(G)) \subset 'L_*(G).
-Proof. by apply: sub_cent_Puig_at; rewrite double_gt0. Qed.
-
-(* This is B & G, Lemma B.1(f), fifth inclusion (the sixth is trivial). *)
-Lemma sub_cent_Puig p G : p.-group G -> 'C_G('L(G)) \subset 'L(G).
-Proof. exact: sub_cent_Puig_at. Qed.
-
-(* This is B & G, Lemma B.1(f), final remark (we prove the contrapositive). *)
-Lemma trivg_center_Puig_pgroup p G : p.-group G -> 'Z('L(G)) = 1 -> G :=: 1.
-Proof.
-move=> pG LG1; apply/(trivg_center_pgroup pG)/trivgP.
-rewrite -(trivg_center_pgroup (pgroupS (Puig_sub _) pG) LG1).
-by apply: subset_trans (sub_cent_Puig pG); apply: sub_center_cent_Puig_at.
-Qed.
-
-(* This is B & G, Lemma B.1(g), second part; the first part is simply the *)
-(* definition of 'L(G) in terms of 'L_*(G). *)
-Lemma Puig_inf_def G : 'L_*(G) = 'L_[G]('L(G)).
-Proof.
-have [k defL] := Puig_limit G.
-by case: (defL k) => // _ <-; case: (defL k.+1) => [|<- //]; apply: leqnSn.
-Qed.
-
-(* This is B & G, Lemma B.2. *)
-Lemma sub_Puig_eq G H : H \subset G -> 'L(G) \subset H -> 'L(H) = 'L(G).
-Proof.
-move=> sHG sLG_H; apply/setP/subset_eqP/andP.
-have sLH_G := subset_trans (Puig_succ_sub _ _) sHG.
-have gPuig := norm_abgenS _ (Puig_gen _ _).
-have [[kG defLG] [kH defLH]] := (Puig_limit G, Puig_limit H).
-have [/defLG[_ {1}<-] /defLH[_ <-]] := (leq_maxl kG kH, leq_maxr kG kH).
-split; do [elim: (maxn _ _) => [|k IHk /=]; first by rewrite !Puig1].
- rewrite doubleS !(PuigS _.+1) Puig_max ?gPuig // Puig_max ?gPuig //.
- exact: subset_trans (Puig_sub_even_odd _.+1 _ _) sLG_H.
-rewrite doubleS Puig_max // -!PuigS Puig_def gPuig //.
-by rewrite Puig_inf_def Puig_max ?gPuig ?sLH_G.
-Qed.
-
-Lemma norm_abgen_pgroup p X G :
- p.-group G -> X --> G -> generated_by (p_norm_abelian p X) G.
-Proof.
-move=> pG /exists_eqP[gG defG].
-have:= subxx G; rewrite -{1 3}defG gen_subG /= => /bigcupsP-sGG.
-apply/exists_eqP; exists gG; congr <<_>>; apply: eq_bigl => A.
-by rewrite andbA andbAC andb_idr // => /sGG/pgroupS->.
-Qed.
-
-Variables (p : nat) (G S : {group gT}).
-Hypotheses (oddG : odd #|G|) (solG : solvable G) (sylS : p.-Sylow(G) S).
-Hypothesis p'G1 : 'O_p^'(G) = 1.
-
-Let T := 'O_p(G).
-Let nsTG : T <| G := pcore_normal _ _.
-Let pT : p.-group T := pcore_pgroup _ _.
-Let pS : p.-group S := pHall_pgroup sylS.
-Let sSG := pHall_sub sylS.
-
-(* This is B & G, Lemma B.3. *)
-Lemma pcore_Sylow_Puig_sub : 'L_*(S) \subset 'L_*(T) /\ 'L(T) \subset 'L(S).
-Proof.
-have [[kS defLS] [kT defLT]] := (Puig_limit S, Puig_limit [group of T]).
-have [/defLS[<- <-] /defLT[<- <-]] := (leq_maxl kS kT, leq_maxr kS kT).
-have sL_ := subset_trans (Puig_succ_sub _ _).
-elim: (maxn kS kT) => [|k [_ sL1]]; first by rewrite !Puig1 pcore_sub_Hall.
-have{sL1} gL: 'L_{k.*2.+1}(T) --> 'L_{k.*2.+2}(S).
- exact: norm_abgenS sL1 (Puig_gen _ _).
-have sCT_L: 'C_T('L_{k.*2.+1}(T)) \subset 'L_{k.*2.+1}(T).
- exact: sub_cent_Puig_at pT.
-have{sCT_L} sLT: 'L_{k.*2.+2}(S) \subset T.
- apply: odd_abelian_gen_constrained sCT_L => //.
- - exact: pgroupS (Puig_at_sub _ _) pT.
- - exact: gFnormal_trans nsTG.
- - exact: sL_ sSG.
- by rewrite norm_abgen_pgroup // (pgroupS _ pS) ?Puig_at_sub.
-have sL2: 'L_{k.*2.+2}(S) \subset 'L_{k.*2.+2}(T) by apply: Puig_max.
-split; [exact: sL2 | rewrite doubleS; apply: subset_trans (Puig_succS _ sL2) _].
-by rewrite Puig_max -?PuigS ?Puig_gen // sL_ // pcore_sub_Hall.
-Qed.
-
-Let Y := 'Z('L(T)).
-Let L := 'L(S).
-
-(* This is B & G, Theorem B.4(b). *)
-Theorem Puig_center_normal : 'Z(L) <| G.
-Proof.
-have [sLiST sLTS] := pcore_Sylow_Puig_sub.
-have sLiLT: 'L_*(T) \subset 'L(T) by apply: Puig_sub_even_odd.
-have sZY: 'Z(L) \subset Y.
- rewrite subsetI andbC subIset ?centS ?orbT //=.
- suffices: 'C_S('L_*(S)) \subset 'L(T).
- by apply: subset_trans; rewrite setISS ?Puig_sub ?centS ?Puig_sub_even_odd.
- apply: subset_trans (subset_trans sLiST sLiLT).
- by apply: sub_cent_Puig_at pS; rewrite double_gt0.
-have chY: Y \char G by rewrite !gFchar_trans.
-have nsCY_G: 'C_G(Y) <| G by rewrite char_normal 1?subcent_char ?char_refl.
-have [C defC sCY_C nsCG] := inv_quotientN nsCY_G (pcore_normal p _).
-have sLG: L \subset G by rewrite gFsub_trans ?(pHall_sub sylS).
-have nsL_nCS: L <| 'N_G(C :&: S).
- have sYLiS: Y \subset 'L_*(S).
- rewrite abelian_norm_Puig ?double_gt0 ?center_abelian //.
- apply: normalS (pHall_sub sylS) (char_normal chY).
- by rewrite subIset // (subset_trans sLTS) ?Puig_sub.
- have gYL: Y --> L := norm_abgenS sYLiS (Puig_gen _ _).
- have sLCS: L \subset C :&: S.
- rewrite subsetI Puig_sub andbT.
- rewrite -(quotientSGK _ sCY_C) ?(subset_trans sLG) ?normal_norm // -defC.
- rewrite odd_abelian_gen_stable ?char_normal ?norm_abgen_pgroup //.
- by rewrite (pgroupS _ pT) ?subIset // Puig_sub.
- by rewrite (pgroupS _ pS) ?Puig_sub.
- rewrite -[L](sub_Puig_eq _ sLCS) ?subsetIr // gFnormal_trans ?normalSG //.
- by rewrite subIset // sSG orbT.
-have sylCS: p.-Sylow(C) (C :&: S) := Sylow_setI_normal nsCG sylS.
-have{defC} defC: 'C_G(Y) * (C :&: S) = C.
- apply/eqP; rewrite eqEsubset mulG_subG sCY_C subsetIl /=.
- have nCY_C: C \subset 'N('C_G(Y)).
- exact: subset_trans (normal_sub nsCG) (normal_norm nsCY_G).
- rewrite -quotientSK // -defC /= -pseries1.
- rewrite -(pseries_catr_id [:: p : nat_pred]) (pseries_rcons_id [::]) /=.
- rewrite pseries1 /= pseries1 defC pcore_sub_Hall // morphim_pHall //.
- by rewrite subIset ?nCY_C.
-have defG: 'C_G(Y) * 'N_G(C :&: S) = G.
- have sCS_N: C :&: S \subset 'N_G(C :&: S).
- by rewrite subsetI normG subIset // sSG orbT.
- by rewrite -(mulSGid sCS_N) mulgA defC (Frattini_arg _ sylCS).
-have nsZ_N: 'Z(L) <| 'N_G(C :&: S) := gFnormal_trans _ nsL_nCS.
-rewrite /normal subIset ?sLG //= -{1}defG mulG_subG /=.
-rewrite cents_norm ?normal_norm // centsC.
-by rewrite (subset_trans sZY) // centsC subsetIr.
-Qed.
-
-End AppendixB.
-
-Section Puig_factorization.
-
-Variables (gT : finGroupType) (p : nat) (G S : {group gT}).
-Hypotheses (oddG : odd #|G|) (solG : solvable G) (sylS : p.-Sylow(G) S).
-
-(* This is B & G, Theorem B.4(a). *)
-Theorem Puig_factorization : 'O_p^'(G) * 'N_G('Z('L(S))) = G.
-Proof.
-set D := 'O_p^'(G); set Z := 'Z(_); have [sSG pS _] := and3P sylS.
-have sSN: S \subset 'N(D) by rewrite (subset_trans sSG) ?gFnorm.
-have p'D: p^'.-group D := pcore_pgroup _ _.
-have tiSD: S :&: D = 1 := coprime_TIg (pnat_coprime pS p'D).
-have def_Zq: Z / D = 'Z('L(S / D)).
- rewrite !quotientE -(setIid S) -(morphim_restrm sSN); set f := restrm _ _.
- have injf: 'injm f by rewrite ker_restrm ker_coset tiSD.
- rewrite -!(injmF _ injf) ?Puig_sub //= morphim_restrm.
- by rewrite (setIidPr _) // subIset ?Puig_sub.
-have{def_Zq} nZq: Z / D <| G / D.
- have sylSq: p.-Sylow(G / D) (S / D) by apply: morphim_pHall.
- rewrite def_Zq (Puig_center_normal _ _ sylSq) ?quotient_odd ?quotient_sol //.
- exact: trivg_pcore_quotient.
-have sZS: Z \subset S by rewrite subIset ?Puig_sub.
-have sZN: Z \subset 'N_G(Z) by rewrite subsetI normG (subset_trans sZS).
-have nDZ: Z \subset 'N(D) by rewrite (subset_trans sZS).
-rewrite -(mulSGid sZN) mulgA -(norm_joinEr nDZ) (@Frattini_arg p) //= -/D -/Z.
- rewrite -cosetpre_normal quotientK ?quotientGK ?pcore_normal // in nZq.
- by rewrite norm_joinEr.
-rewrite /pHall -divgS joing_subr ?(pgroupS sZS) /= ?norm_joinEr //= -/Z.
-by rewrite TI_cardMg ?mulnK //; apply/trivgP; rewrite /= setIC -tiSD setSI.
-Qed.
-
-End Puig_factorization.
-
-
-
-
-
diff --git a/mathcomp/odd_order/BGappendixC.v b/mathcomp/odd_order/BGappendixC.v
deleted file mode 100644
index 3cfb101..0000000
--- a/mathcomp/odd_order/BGappendixC.v
+++ /dev/null
@@ -1,760 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype choice ssrnat seq div fintype.
-From mathcomp
-Require Import tuple finfun bigop ssralg finset prime binomial poly polydiv.
-From mathcomp
-Require Import fingroup morphism quotient automorphism action finalg zmodp.
-From mathcomp
-Require Import gfunctor gproduct cyclic commutator pgroup abelian frobenius.
-From mathcomp
-Require Import BGsection1.
-From mathcomp
-Require Import matrix mxalgebra mxabelem vector falgebra fieldext galois.
-From mathcomp
-Require Import finfield ssrnum algC classfun character integral_char inertia.
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory FinRing.Theory Num.Theory.
-Local Open Scope ring_scope.
-
-Section AppendixC.
-
-Variables (gT : finGroupType) (p q : nat) (H P P0 U Q : {group gT}).
-Let nU := ((p ^ q).-1 %/ p.-1)%N.
-
-(* External statement of the finite field assumption. *)
-CoInductive finFieldImage : Prop :=
- FinFieldImage (F : finFieldType) (sigma : {morphism P >-> F}) of
- isom P [set: F] sigma & sigma @*^-1 <[1 : F]> = P0
- & exists2 sigmaU : {morphism U >-> {unit F}},
- 'injm sigmaU & {in P & U, morph_act 'J 'U sigma sigmaU}.
-
-(* These correspond to hypothesis (A) of B & G, Appendix C, Theorem C. *)
-Hypotheses (pr_p : prime p) (pr_q : prime q) (coUp1 : coprime nU p.-1).
-Hypotheses (defH : P ><| U = H) (fieldH : finFieldImage).
-Hypotheses (oP : #|P| = (p ^ q)%N) (oU : #|U| = nU).
-
-(* These correspond to hypothesis (B) of B & G, Appendix C, Theorem C. *)
-Hypotheses (abelQ : q.-abelem Q) (nQP0 : P0 \subset 'N(Q)).
-Hypothesis nU_P0Q : exists2 y, y \in Q & P0 :^ y \subset 'N(U).
-
-Section ExpandHypotheses.
-
-(* Negation of the goal of B & G, Appendix C, Theorem C. *)
-Hypothesis ltqp : (q < p)%N.
-
-(* From the fieldH assumption. *)
-Variables (fT : finFieldType) (charFp : p \in [char fT]).
-Local Notation F := (PrimeCharType charFp).
-Local Notation galF := [splittingFieldType 'F_p of F].
-Let Fpq : {vspace F} := fullv.
-Let Fp : {vspace F} := 1%VS.
-
-Hypothesis oF : #|F| = (p ^ q)%N.
-Let oF_p : #|'F_p| = p. Proof. exact: card_Fp. Qed.
-Let oFp : #|Fp| = p. Proof. by rewrite card_vspace1. Qed.
-Let oFpq : #|Fpq| = (p ^ q)%N. Proof. by rewrite card_vspacef. Qed.
-Let dimFpq : \dim Fpq = q. Proof. by rewrite primeChar_dimf oF pfactorK. Qed.
-
-Variables (sigma : {morphism P >-> F}) (sigmaU : {morphism U >-> {unit F}}).
-Hypotheses (inj_sigma : 'injm sigma) (inj_sigmaU : 'injm sigmaU).
-Hypothesis im_sigma : sigma @* P = [set: F].
-Variable s : gT.
-Hypotheses (sP0P : P0 \subset P) (sigma_s : sigma s = 1) (defP0 : <[s]> = P0).
-
-Let psi u : F := val (sigmaU u).
-Let inj_psi : {in U &, injective psi}.
-Proof. by move=> u v Uu Uv /val_inj/(injmP inj_sigmaU)->. Qed.
-
-Hypothesis sigmaJ : {in P & U, forall x u, sigma (x ^ u) = sigma x * psi u}.
-
-Let Ps : s \in P. Proof. by rewrite -cycle_subG defP0. Qed.
-Let P0s : s \in P0. Proof. by rewrite -defP0 cycle_id. Qed.
-
-Let nz_psi u : psi u != 0. Proof. by rewrite -unitfE (valP (sigmaU u)). Qed.
-
-Let sigma1 : sigma 1%g = 0. Proof. exact: morph1. Qed.
-Let sigmaM : {in P &, {morph sigma : x1 x2 / (x1 * x2)%g >-> x1 + x2}}.
-Proof. exact: morphM. Qed.
-Let sigmaV : {in P, {morph sigma : x / x^-1%g >-> - x}}.
-Proof. exact: morphV. Qed.
-Let sigmaX n : {in P, {morph sigma : x / (x ^+ n)%g >-> x *+ n}}.
-Proof. exact: morphX. Qed.
-
-Let psi1 : psi 1%g = 1. Proof. by rewrite /psi morph1. Qed.
-Let psiM : {in U &, {morph psi : u1 u2 / (u1 * u2)%g >-> u1 * u2}}.
-Proof. by move=> u1 u2 Uu1 Uu2; rewrite /psi morphM. Qed.
-Let psiV : {in U, {morph psi : u / u^-1%g >-> u^-1}}.
-Proof. by move=> u Uu; rewrite /psi morphV. Qed.
-Let psiX n : {in U, {morph psi : u / (u ^+ n)%g >-> u ^+ n}}.
-Proof. by move=> u Uu; rewrite /psi morphX // val_unitX. Qed.
-
-Let sigmaE := (sigma1, sigma_s, mulr1, mul1r,
- (sigmaJ, sigmaX, sigmaM, sigmaV), (psi1, psiX, psiM, psiV)).
-
-Let psiE u : u \in U -> psi u = sigma (s ^ u).
-Proof. by move=> Uu; rewrite !sigmaE. Qed.
-
-Let nPU : U \subset 'N(P). Proof. by have [] := sdprodP defH. Qed.
-Let memJ_P : {in P & U, forall x u, x ^ u \in P}.
-Proof. by move=> x u Px Uu; rewrite /= memJ_norm ?(subsetP nPU). Qed.
-Let in_PU := (memJ_P, in_group).
-
-Let sigmaP0 : sigma @* P0 =i Fp.
-Proof.
-rewrite -defP0 morphim_cycle // sigma_s => x.
-apply/cycleP/vlineP=> [] [n ->]; first by exists n%:R; rewrite scaler_nat.
-by exists (val n); rewrite -{1}[n]natr_Zp -in_algE rmorph_nat zmodXgE.
-Qed.
-
-Let nt_s : s != 1%g.
-Proof. by rewrite -(morph_injm_eq1 inj_sigma) // sigmaE oner_eq0. Qed.
-
-Let p_gt0 : (0 < p)%N. Proof. exact: prime_gt0. Qed.
-Let q_gt0 : (0 < q)%N. Proof. exact: prime_gt0. Qed.
-Let p1_gt0 : (0 < p.-1)%N. Proof. by rewrite -subn1 subn_gt0 prime_gt1. Qed.
-
-(* This is B & G, Appendix C, Remark I. *)
-Let not_dvd_q_p1 : ~~ (q %| p.-1)%N.
-Proof.
-rewrite -prime_coprime // -[q]card_ord -sum1_card -coprime_modl -modn_summ.
-have:= coUp1; rewrite /nU predn_exp mulKn //= -coprime_modl -modn_summ.
-congr (coprime (_ %% _) _); apply: eq_bigr => i _.
-by rewrite -{1}[p](subnK p_gt0) subn1 -modnXm modnDl modnXm exp1n.
-Qed.
-
-(* This is the first assertion of B & G, Appendix C, Remark V. *)
-Let odd_p : odd p.
-Proof.
-by apply: contraLR ltqp => /prime_oddPn-> //; rewrite -leqNgt prime_gt1.
-Qed.
-
-(* This is the second assertion of B & G, Appendix C, Remark V. *)
-Let odd_q : odd q.
-Proof.
-apply: contraR not_dvd_q_p1 => /prime_oddPn-> //.
-by rewrite -subn1 dvdn2 odd_sub ?odd_p.
-Qed.
-
-Let qgt2 : (2 < q)%N. Proof. by rewrite odd_prime_gt2. Qed.
-Let pgt4 : (4 < p)%N. Proof. by rewrite odd_geq ?(leq_ltn_trans qgt2). Qed.
-Let qgt1 : (1 < q)%N. Proof. exact: ltnW. Qed.
-
-Local Notation Nm := (galNorm Fp Fpq).
-Local Notation uval := (@FinRing.uval _).
-
-Let cycFU (FU : {group {unit F}}) : cyclic FU.
-Proof. exact: field_unit_group_cyclic. Qed.
-Let cUU : abelian U.
-Proof. by rewrite cyclic_abelian // -(injm_cyclic inj_sigmaU) ?cycFU. Qed.
-
-(* This is B & G, Appendix C, Remark VII. *)
-Let im_psi (x : F) : (x \in psi @: U) = (Nm x == 1).
-Proof.
-have /cyclicP[u0 defFU]: cyclic [set: {unit F}] by apply: cycFU.
-have o_u0: #[u0] = (p ^ q).-1 by rewrite orderE -defFU card_finField_unit oF.
-have ->: psi @: U = uval @: (sigmaU @* U) by rewrite morphimEdom -imset_comp.
-have /set1P[->]: (sigmaU @* U)%G \in [set <[u0 ^+ (#[u0] %/ nU)]>%G].
- rewrite -cycle_sub_group ?inE; last first.
- by rewrite o_u0 -(divnK (dvdn_pred_predX p q)) dvdn_mulr.
- by rewrite -defFU subsetT card_injm //= oU.
-rewrite divnA ?dvdn_pred_predX // -o_u0 mulKn //.
-have [/= alpha alpha_gen Dalpha] := finField_galois_generator (subvf Fp).
-have{Dalpha} Dalpha x1: x1 != 0 -> x1 / alpha x1 = x1^-1 ^+ p.-1.
- move=> nz_x1; rewrite -[_ ^+ _](mulVKf nz_x1) -exprS Dalpha ?memvf // exprVn.
- by rewrite dimv1 oF_p prednK ?prime_gt0.
-apply/idP/(Hilbert's_theorem_90 alpha_gen (memvf _)) => [|[u [_ nz_u] ->]].
- case/imsetP=> /= _ /cycleP[n ->] ->; rewrite expgAC; set u := (u0 ^+ n)%g.
- have nz_u: (val u)^-1 != 0 by rewrite -unitfE unitrV (valP u).
- by exists (val u)^-1; rewrite ?memvf ?Dalpha //= invrK val_unitX.
-have /cycleP[n Du]: (insubd u0 u)^-1%g \in <[u0]> by rewrite -defFU inE.
-have{Du} Du: u^-1 = val (u0 ^+ n)%g by rewrite -Du /= insubdK ?unitfE.
-by rewrite Dalpha // Du -val_unitX mem_imset // expgAC mem_cycle.
-Qed.
-
-(* This is B & G, Appendix C, Remark VIII. *)
-Let defFU : sigmaU @* U \x [set u | uval u \in Fp] = [set: {unit F}].
-Proof.
-have fP v: in_alg F (uval v) \is a GRing.unit by rewrite rmorph_unit ?(valP v).
-pose f (v : {unit 'F_p}) := FinRing.unit F (fP v).
-have fM: {in setT &, {morph f: v1 v2 / (v1 * v2)%g}}.
- by move=> v1 v2 _ _; apply: val_inj; rewrite /= -in_algE rmorphM.
-pose galFpU := Morphism fM @* [set: {unit 'F_p}].
-have ->: [set u | uval u \in Fp] = galFpU.
- apply/setP=> u; rewrite inE /galFpU morphimEdom.
- apply/idP/imsetP=> [|[v _ ->]]; last by rewrite /= rpredZ // memv_line.
- case/vlineP=> v Du; have nz_v: v != 0.
- by apply: contraTneq (valP u) => v0; rewrite unitfE /= Du v0 scale0r eqxx.
- exists (insubd (1%g : {unit 'F_p}) v); rewrite ?inE //.
- by apply: val_inj; rewrite /= insubdK ?unitfE.
-have oFpU: #|galFpU| = p.-1.
- rewrite card_injm ?card_finField_unit ?oF_p //.
- by apply/injmP=> v1 v2 _ _ []/(fmorph_inj [rmorphism of in_alg F])/val_inj.
-have oUU: #|sigmaU @* U| = nU by rewrite card_injm.
-rewrite dprodE ?coprime_TIg ?oUU ?oFpU //; last first.
- by rewrite (sub_abelian_cent2 (cyclic_abelian (cycFU [set: _]))) ?subsetT.
-apply/eqP; rewrite eqEcard subsetT coprime_cardMg oUU oFpU //=.
-by rewrite card_finField_unit oF divnK ?dvdn_pred_predX.
-Qed.
-
-(* This is B & G, Appendix C, Remark IX. *)
-Let frobH : [Frobenius H = P ><| U].
-Proof.
-apply/Frobenius_semiregularP=> // [||u /setD1P[ntu Uu]].
-- by rewrite -(morphim_injm_eq1 inj_sigma) // im_sigma finRing_nontrivial.
-- rewrite -cardG_gt1 oU ltn_divRL ?dvdn_pred_predX // mul1n -!subn1.
- by rewrite ltn_sub2r ?(ltn_exp2l 0) ?(ltn_exp2l 1) ?prime_gt1.
-apply/trivgP/subsetP=> x /setIP[Px /cent1P/commgP].
-rewrite inE -!(morph_injm_eq1 inj_sigma) ?(sigmaE, in_PU) //.
-rewrite -mulrN1 addrC -mulrDr mulf_eq0 subr_eq0 => /orP[] // /idPn[].
-by rewrite (inj_eq val_inj (sigmaU u) 1%g) morph_injm_eq1.
-Qed.
-
-(* From the abelQ assumption of Peterfalvi, Theorem (14.2) to the assumptions *)
-(* of part (B) of the assumptions of Theorem C. *)
-Let p'q : q != p. Proof. by rewrite ltn_eqF. Qed.
-Let cQQ : abelian Q. Proof. exact: abelem_abelian abelQ. Qed.
-Let p'Q : p^'.-group Q. Proof. exact: pi_pgroup (abelem_pgroup abelQ) _. Qed.
-
-Let pP : p.-group P. Proof. by rewrite /pgroup oP pnat_exp ?pnat_id. Qed.
-Let coQP : coprime #|Q| #|P|. Proof. exact: p'nat_coprime p'Q pP. Qed.
-Let sQP0Q : [~: Q, P0] \subset Q. Proof. by rewrite commg_subl. Qed.
-
-(* This is B & G, Appendix C, Remark X. *)
-Let defQ : 'C_Q(P0) \x [~: Q, P0] = Q.
-Proof. by rewrite dprodC coprime_abelian_cent_dprod // (coprimegS sP0P). Qed.
-
-(* This is B & G, Appendix C, Remark XI. *)
-Let nU_P0QP0 : exists2 y, y \in [~: Q, P0] & P0 :^ y \subset 'N(U).
-Proof.
-have [_ /(mem_dprod defQ)[z [y [/setIP[_ cP0z] QP0y -> _]]]] := nU_P0Q.
-by rewrite conjsgM (normsP (cent_sub P0)) //; exists y.
-Qed.
-
-Let E := [set x : galF | Nm x == 1 & Nm (2%:R - x) == 1].
-
-Let E_1 : 1 \in E.
-Proof. by rewrite !inE -addrA subrr addr0 galNorm1 eqxx. Qed.
-
-(* This is B & G, Appendix C, Lemma C.1. *)
-Let Einv_gt1_le_pq : E = [set x^-1 | x in E] -> (1 < #|E|)%N -> (p <= q)%N.
-Proof.
-rewrite (cardsD1 1) E_1 ltnS card_gt0 => Einv /set0Pn[/= a /setD1P[not_a1 Ea]].
-pose tau (x : F) := (2%:R - x)^-1.
-have Etau x: x \in E -> tau x \in E.
- rewrite inE => Ex; rewrite Einv (mem_imset (fun y => y^-1)) //.
- by rewrite inE andbC opprD addNKr opprK.
-pose Pa := \prod_(beta in 'Gal(Fpq / Fp)) (beta (1 - a) *: 'X + 1).
-have galPoly_roots: all (root (Pa - 1)) (enum Fp).
- apply/allP=> x; rewrite mem_enum => /vlineP[b ->].
- rewrite rootE !hornerE horner_prod subr_eq0 /=; apply/eqP.
- pose h k := (1 - a) *+ k + 1; transitivity (Nm (h b)).
- apply: eq_bigr => beta _; rewrite !(rmorphB, rmorphD, rmorphMn) rmorph1 /=.
- by rewrite -mulr_natr -scaler_nat natr_Zp hornerD hornerZ hornerX hornerC.
- elim: (b : nat) => [|k IHk]; first by rewrite /h add0r galNorm1.
- suffices{IHk}: h k / h k.+1 \in E.
- rewrite inE -invr_eq1 => /andP[/eqP <- _].
- by rewrite galNormM galNormV /= [galNorm _ _ (h k)]IHk mul1r invrK.
- elim: k => [|k IHk]; first by rewrite /h add0r mul1r addrAC Etau.
- have nz_hk1: h k.+1 != 0.
- apply: contraTneq IHk => ->; rewrite invr0 mulr0.
- by rewrite inE galNorm0 eq_sym oner_eq0.
- congr (_ \in E): (Etau _ IHk); apply: canLR (@invrK _) _; rewrite invfM invrK.
- apply: canRL (mulKf nz_hk1) _; rewrite mulrC mulrBl divfK // mulrDl mul1r.
- by rewrite {2}/h mulrS -2!addrA addrK addrAC -mulrSr.
-have sizePa: size Pa = q.+1.
- have sizePaX (beta : {rmorphism F -> F}) : size (beta (1 - a) *: 'X + 1) = 2.
- rewrite -mul_polyC size_MXaddC oner_eq0 andbF size_polyC fmorph_eq0.
- by rewrite subr_eq0 eq_sym (negbTE not_a1).
- rewrite size_prod => [|i _]; last by rewrite -size_poly_eq0 sizePaX.
- rewrite (eq_bigr (fun _ => 2)) => [|beta _]; last by rewrite sizePaX.
- rewrite sum_nat_const muln2 -addnn -addSn addnK.
- by rewrite -galois_dim ?finField_galois ?subvf // dimv1 divn1 dimFpq.
-have sizePa1: size (Pa - 1) = q.+1.
- by rewrite size_addl // size_opp size_poly1 sizePa.
-have nz_Pa1 : Pa - 1 != 0 by rewrite -size_poly_eq0 sizePa1.
-by rewrite -ltnS -oFp -sizePa1 cardE max_poly_roots ?enum_uniq.
-Qed.
-
-(* This is B & G, Appendix C, Lemma C.2. *)
-Let E_gt1 : (1 < #|E|)%N.
-Proof.
-have [q_gt4 | q_le4] := ltnP 4 q.
- pose inK x := enum_rank_in (classes1 H) (x ^: H).
- have inK_E x: x \in H -> enum_val (inK x) = x ^: H.
- by move=> Hx; rewrite enum_rankK_in ?mem_classes.
- pose j := inK s; pose k := inK (s ^+ 2)%g; pose e := gring_classM_coef j j k.
- have cPP: abelian P by rewrite -(injm_abelian inj_sigma) ?zmod_abelian.
- have Hs: s \in H by rewrite -(sdprodW defH) -[s]mulg1 mem_mulg.
- have DsH n: (s ^+ n) ^: H = (s ^+ n) ^: U.
- rewrite -(sdprodW defH) classM (abelian_classP _ cPP) ?groupX //.
- by rewrite class_support_set1l.
- have injJU: {in U &, injective (conjg s)}.
- by move=> u v Uu Uv eq_s_uv; apply/inj_psi; rewrite ?psiE ?eq_s_uv.
- have ->: #|E| = e.
- rewrite /e /gring_classM_coef !inK_E ?groupX //.
- transitivity #|[set u in U | s^-1 ^ u * s ^+ 2 \in s ^: U]%g|.
- rewrite -(card_in_imset (sub_in2 _ inj_psi)) => [|u /setIdP[] //].
- apply: eq_card => x; rewrite inE -!im_psi.
- apply/andP/imsetP=> [[/imsetP[u Uu ->] /imsetP[v Uv Dv]]{x} | ].
- exists u; rewrite // inE Uu /=; apply/imsetP; exists v => //.
- by apply: (injmP inj_sigma); rewrite ?(sigmaE, in_PU) // mulN1r addrC.
- case=> u /setIdP[Uu /imsetP[v Uv /(congr1 sigma)]].
- rewrite ?(sigmaE, in_PU) // mulN1r addrC => Dv ->.
- by rewrite Dv !mem_imset.
- rewrite DsH (DsH 1%N) expg1; have [w Uw ->] := repr_class U (s ^+ 2).
- pose f u := (s ^ (u * w), (s^-1 ^ u * s ^+ 2) ^ w).
- rewrite -(@card_in_imset _ _ f) => [|u v]; last first.
- by move=> /setIdP[Uu _] /setIdP[Uv _] [/injJU/mulIg-> //]; apply: groupM.
- apply: eq_card => [[x1 x2]]; rewrite inE -andbA.
- apply/imsetP/and3P=> [[u /setIdP[Uu sUs2u'] [-> ->]{x1 x2}] | []].
- rewrite /= conjgM -(rcoset_id Uw) class_rcoset !memJ_conjg mem_orbit //.
- by rewrite sUs2u' -conjMg conjVg mulKVg.
- case/imsetP=> u Uu /= -> sUx2 /eqP/(canRL (mulKg _)) Dx2.
- exists (u * w^-1)%g; last first.
- by rewrite /f /= conjMg -conjgM mulgKV conjVg -Dx2.
- rewrite inE !in_PU // Uw -(memJ_conjg _ w) -class_rcoset rcoset_id //.
- by rewrite conjMg -conjgM mulgKV conjVg -Dx2.
- pose chi_s2 i := 'chi[H]_i s ^+ 2 * ('chi_i (s ^+ 2)%g)^* / 'chi_i 1%g.
- have De: e%:R = #|U|%:R / #|P|%:R * (\sum_i chi_s2 i).
- have Ks: s \in enum_val j by rewrite inK_E ?class_refl.
- have Ks2: (s ^+ 2)%g \in enum_val k by rewrite inK_E ?groupX ?class_refl.
- rewrite (gring_classM_coef_sum_eq Ks Ks Ks2) inK_E //; congr (_ * _).
- have ->: #|s ^: H| = #|U| by rewrite (DsH 1%N) (card_in_imset injJU).
- by rewrite -(sdprod_card defH) mulnC !natrM invfM mulrA mulfK ?neq0CG.
- pose linH := [pred i | P \subset cfker 'chi[H]_i].
- have nsPH: P <| H by have [] := sdprod_context defH.
- have sum_linH: \sum_(i in linH) chi_s2 i = #|U|%:R.
- have isoU: U \isog H / P := sdprod_isog defH.
- have abHbar: abelian (H / P) by rewrite -(isog_abelian isoU).
- rewrite (card_isog isoU) -(card_Iirr_abelian abHbar) -sumr_const.
- rewrite (reindex _ (mod_Iirr_bij nsPH)) /chi_s2 /=.
- apply: eq_big => [i | i _]; rewrite ?mod_IirrE ?cfker_mod //.
- have lin_i: ('chi_i %% P)%CF \is a linear_char.
- exact/cfMod_lin_char/char_abelianP.
- rewrite lin_char1 // divr1 -lin_charX // -normCK.
- by rewrite normC_lin_char ?groupX ?expr1n.
- have degU i: i \notin linH -> 'chi_i 1%g = #|U|%:R.
- case/(Frobenius_Ind_irrP (FrobeniusWker frobH)) => {i}i _ ->.
- rewrite cfInd1 ?normal_sub // -(index_sdprod defH) lin_char1 ?mulr1 //.
- exact/char_abelianP.
- have ub_linH' m (s_m := (s ^+ m)%g):
- (0 < m < 5)%N -> \sum_(i in predC linH) `|'chi_i s_m| ^+ 2 <= #|P|%:R.
- - case/andP=> m_gt0 m_lt5; have{m_gt0 m_lt5} P1sm: s_m \in P^#.
- rewrite !inE groupX // -order_dvdn -(order_injm inj_sigma) // sigmaE.
- by rewrite andbT order_primeChar ?oner_neq0 ?gtnNdvd ?(leq_trans m_lt5).
- have ->: #|P| = (#|P| * (s_m \in s_m ^: H))%N by rewrite class_refl ?muln1.
- have{P1sm} /eqP <-: 'C_H[s ^+ m] == P.
- rewrite eqEsubset (Frobenius_cent1_ker frobH) // subsetI normal_sub //=.
- by rewrite sub_cent1 groupX // (subsetP cPP).
- rewrite mulrnA -second_orthogonality_relation ?groupX // big_mkcond.
- by apply: ler_sum => i _; rewrite normCK; case: ifP; rewrite ?mul_conjC_ge0.
- have sqrtP_gt0: 0 < sqrtC #|P|%:R :> algC by rewrite sqrtC_gt0 ?gt0CG.
- have{De ub_linH'}:
- `|(#|P| * e)%:R - #|U|%:R ^+ 2| <= #|P|%:R * sqrtC #|P|%:R :> algC.
- rewrite natrM De mulrCA mulrA divfK ?neq0CG // (bigID linH) /= sum_linH.
- rewrite mulrDr addrC addKr mulrC mulr_suml /chi_s2.
- rewrite (ler_trans (ler_norm_sum _ _ _)) // -ler_pdivr_mulr // mulr_suml.
- apply: ler_trans (ub_linH' 1%N isT); apply: ler_sum => i linH'i.
- rewrite ler_pdivr_mulr // degU ?divfK ?neq0CG //.
- rewrite normrM -normrX norm_conjC ler_wpmul2l ?normr_ge0 //.
- rewrite -ler_sqr ?qualifE ?normr_ge0 ?(@ltrW _ 0) // sqrtCK.
- apply: ler_trans (ub_linH' 2 isT); rewrite (bigD1 i) ?ler_paddr //=.
- by apply: sumr_ge0 => i1 _; rewrite exprn_ge0 ?normr_ge0.
- rewrite natrM real_ler_distl ?rpredB ?rpredM ?rpred_nat // => /andP[lb_Pe _].
- rewrite -ltC_nat -(ltr_pmul2l (gt0CG P)) {lb_Pe}(ltr_le_trans _ lb_Pe) //.
- rewrite ltr_subr_addl (@ler_lt_trans _ ((p ^ q.-1)%:R ^+ 2)) //; last first.
- rewrite -!natrX ltC_nat ltn_sqr oU ltn_divRL ?dvdn_pred_predX //.
- rewrite -(subnKC qgt1) /= -!subn1 mulnBr muln1 -expnSr.
- by rewrite ltn_sub2l ?(ltn_exp2l 0) // prime_gt1.
- rewrite -mulrDr -natrX -expnM muln2 -subn1 doubleB -addnn -addnBA // subn2.
- rewrite expnD natrM -oP ler_wpmul2l ?ler0n //.
- apply: ler_trans (_ : 2%:R * sqrtC #|P|%:R <= _).
- rewrite mulrDl mul1r ler_add2l -(@expr_ge1 _ 2) ?(ltrW sqrtP_gt0) // sqrtCK.
- by rewrite oP natrX expr_ge1 ?ler0n ?ler1n.
- rewrite -ler_sqr ?rpredM ?rpred_nat ?qualifE ?(ltrW sqrtP_gt0) //.
- rewrite exprMn sqrtCK -!natrX -natrM leC_nat -expnM muln2 oP.
- rewrite -(subnKC q_gt4) doubleS (expnS p _.*2.+1) -(subnKC pgt4) leq_mul //.
- by rewrite ?leq_exp2l // !doubleS !ltnS -addnn leq_addl.
-have q3: q = 3 by apply/eqP; rewrite eqn_leq qgt2 andbT -ltnS -(odd_ltn 5).
-rewrite (cardsD1 1) E_1 ltnS card_gt0; apply/set0Pn => /=.
-pose f (c : 'F_p) : {poly 'F_p} := 'X * ('X - 2%:R%:P) * ('X - c%:P) + ('X - 1).
-have fc0 c: (f c).[0] = -1 by rewrite !hornerE.
-have fc2 c: (f c).[2%:R] = 1 by rewrite !(subrr, hornerE) /= addrK.
-have /existsP[c nz_fc]: [exists c, ~~ [exists d, root (f c) d]].
- have nz_f_0 c: ~~ root (f c) 0 by rewrite /root fc0 oppr_eq0.
- rewrite -negb_forall; apply/negP=> /'forall_existsP/fin_all_exists[/= rf rfP].
- suffices inj_rf: injective rf.
- by have /negP[] := nz_f_0 (invF inj_rf 0); rewrite -{2}[0](f_invF inj_rf).
- move=> a b eq_rf_ab; apply/oppr_inj/(addrI (rf a)).
- have: (f a).[rf a] = (f b).[rf a] by rewrite {2}eq_rf_ab !(rootP _).
- rewrite !(hornerXsubC, hornerD, hornerM) hornerX => /addIr/mulfI-> //.
- rewrite mulf_neq0 ?subr_eq0 1?(contraTneq _ (rfP a)) // => -> //.
- by rewrite /root fc2.
-have{nz_fc} /= nz_fc: ~~ root (f c) _ by apply/forallP; rewrite -negb_exists.
-have sz_fc_lhs: size ('X * ('X - 2%:R%:P) * ('X - c%:P)) = 4.
- by rewrite !(size_mul, =^~ size_poly_eq0) ?size_polyX ?size_XsubC.
-have sz_fc: size (f c) = 4 by rewrite size_addl ?size_XsubC sz_fc_lhs.
-have irr_fc: irreducible_poly (f c) by apply: cubic_irreducible; rewrite ?sz_fc.
-have fc_monic : f c \is monic.
- rewrite monicE lead_coefDl ?size_XsubC ?sz_fc_lhs // -monicE.
- by rewrite !monicMl ?monicXsubC ?monicX.
-pose inF := [rmorphism of in_alg F]; pose fcF := map_poly inF (f c).
-have /existsP[a fcFa_0]: [exists a : F, root fcF a].
- suffices: ~~ coprimep (f c) ('X ^+ #|F| - 'X).
- apply: contraR; rewrite -(coprimep_map inF) negb_exists => /forallP-nz_fcF.
- rewrite -/fcF rmorphB rmorphX /= map_polyX finField_genPoly.
- elim/big_rec: _ => [|x gF _ co_fcFg]; first exact: coprimep1.
- by rewrite coprimep_mulr coprimep_XsubC nz_fcF.
- have /irredp_FAdjoin[L dimL [z /coprimep_root fcz0 _]] := irr_fc.
- pose finL := [vectType 'F_p of FinFieldExtType L].
- set fcL := map_poly _ _ in fcz0; pose inL := [rmorphism of in_alg L].
- rewrite -(coprimep_map inL) -/fcL rmorphB rmorphX /= map_polyX.
- apply: contraL (fcz0 _) _; rewrite hornerD hornerN hornerXn hornerX subr_eq0.
- have ->: #|F| = #|{: finL}%VS| by rewrite oF card_vspace dimL sz_fc oF_p q3.
- by rewrite card_vspacef (expf_card (z : finL)).
-have Fp_fcF: fcF \is a polyOver Fp.
- by apply/polyOverP => i; rewrite coef_map /= memvZ ?memv_line.
-pose G := 'Gal(Fpq / Fp).
-have galG: galois Fp Fpq by rewrite finField_galois ?subvf.
-have oG: #|G| = 3 by rewrite -galois_dim // dimv1 dimFpq q3.
-have Fp'a: a \notin Fp.
- by apply: contraL fcFa_0 => /vlineP[d ->]; rewrite fmorph_root.
-have DfcF: fcF = \prod_(beta in G) ('X - (beta a)%:P).
- pose Pa : {poly F} := minPoly Fp a.
- have /eqP szPa: size Pa == 4.
- rewrite size_minPoly eqSS.
- rewrite (sameP eqP (prime_nt_dvdP _ _)) ?adjoin_deg_eq1 //.
- by rewrite adjoin_degreeE dimv1 divn1 -q3 -dimFpq field_dimS ?subvf.
- have dvd_Pa_fcF: Pa %| fcF by apply: minPoly_dvdp fcFa_0.
- have{dvd_Pa_fcF} /eqP <-: Pa == fcF.
- rewrite -eqp_monic ?monic_minPoly ?monic_map // -dvdp_size_eqp //.
- by rewrite szPa size_map_poly sz_fc.
- have [r [srG /map_uniq Ur defPa]]:= galois_factors (subvf _) galG a (memvf a).
- rewrite -/Pa big_map in defPa; rewrite defPa big_uniq //=.
- apply/eq_bigl/subset_cardP=> //; apply/eqP.
- by rewrite -eqSS (card_uniqP Ur) oG -szPa defPa size_prod_XsubC.
-exists a; rewrite !inE; apply/and3P; split.
-- by apply: contraNneq Fp'a => ->; apply: mem1v.
-- apply/eqP; transitivity ((- 1) ^+ #|G| * fcF.[inF 0]).
- rewrite DfcF horner_prod -prodrN; apply: eq_bigr => beta _.
- by rewrite rmorph0 hornerXsubC add0r opprK.
- by rewrite -signr_odd mulr_sign oG horner_map fc0 rmorphN1 opprK.
-apply/eqP; transitivity (fcF.[inF 2%:R]); last by rewrite horner_map fc2 rmorph1.
-rewrite DfcF horner_prod; apply: eq_bigr => beta _.
-by rewrite hornerXsubC rmorphB !rmorph_nat.
-Qed.
-
-Section AppendixC3.
-
-Import GroupScope.
-
-Variables y : gT.
-Hypotheses (QP0y : y \in [~: Q, P0]) (nUP0y : P0 :^ y \subset 'N(U)).
-Let Qy : y \in Q. Proof. by rewrite (subsetP sQP0Q). Qed.
-
-Let t := s ^ y.
-Let P1 := P0 :^ y.
-
-(* This is B & G, Appendix C, Lemma C.3, Step 1. *)
-Let splitH x :
- x \in H ->
- exists2 u, u \in U & exists2 v, v \in U & exists2 s1, s1 \in P0
- & x = u * s1 * v.
-Proof.
-case/(mem_sdprod defH) => z [v [Pz Uv -> _]].
-have [-> | nt_z] := eqVneq z 1.
- by exists 1 => //; exists v => //; exists 1; rewrite ?mulg1.
-have nz_z: sigma z != 0 by rewrite (morph_injm_eq1 inj_sigma).
-have /(mem_dprod defFU)[]: finField_unit nz_z \in setT := in_setT _.
-move=> _ [w [/morphimP[u Uu _ ->] Fp_w /(congr1 val)/= Dz _]].
-have{Fp_w Dz} [n Dz]: exists n, sigma z = sigma ((s ^+ n) ^ u).
- move: Fp_w; rewrite {}Dz inE => /vlineP[n ->]; exists n.
- by rewrite -{1}(natr_Zp n) scaler_nat mulr_natr conjXg !sigmaE ?in_PU.
-exists u^-1; last exists (u * v); rewrite ?groupV ?groupM //.
-exists (s ^+ n); rewrite ?groupX // mulgA; congr (_ * _).
-by apply: (injmP inj_sigma); rewrite -?mulgA ?in_PU.
-Qed.
-
-(* This is B & G, Appendix C, Lemma C.3, Step 2. *)
-Let not_splitU s1 s2 u :
- s1 \in P0 -> s2 \in P0 -> u \in U -> s1 * u * s2 \in U ->
- (s1 == 1) && (s2 == 1) || (u == 1) && (s1 * s2 == 1).
-Proof.
-move=> P0s1 P0s2 Uu; have [_ _ _ tiPU] := sdprodP defH.
-have [Ps1 Ps2]: s1 \in P /\ s2 \in P by rewrite !(subsetP sP0P).
-have [-> | nt_s1 /=] := altP (s1 =P 1).
- by rewrite mul1g groupMl // -in_set1 -set1gE -tiPU inE Ps2 => ->.
-have [-> | nt_u /=] := altP (u =P 1).
- by rewrite mulg1 -in_set1 -set1gE -tiPU inE (groupM Ps1).
-rewrite (conjgC _ u) -mulgA groupMl // => Us12; case/negP: nt_u.
-rewrite -(morph_injm_eq1 inj_sigmaU) // -in_set1 -set1gE.
-have [_ _ _ <-] := dprodP defFU; rewrite !inE mem_morphim //= -/(psi u).
-have{Us12}: s1 ^ u * s2 == 1.
- by rewrite -in_set1 -set1gE -tiPU inE Us12 andbT !in_PU.
-rewrite -(morph_injm_eq1 inj_sigma) ?(in_PU, sigmaE) // addr_eq0.
-move/eqP/(canRL (mulKf _))->; rewrite ?morph_injm_eq1 //.
-by rewrite mulrC rpred_div ?rpredN //= -sigmaP0 mem_morphim.
-Qed.
-
-(* This is B & G, Appendix C, Lemma C.3, Step 3. *)
-Let tiH_P1 t1 : t1 \in P1^# -> H :&: H :^ t1 = U.
-Proof.
-case/setD1P=>[nt_t1 P1t1]; set X := H :&: _.
-have [nsPH sUH _ _ tiPU] := sdprod_context defH.
-have sUX: U \subset X.
- by rewrite subsetI sUH -(normsP nUP0y t1 P1t1) conjSg.
-have defX: (P :&: X) * U = X.
- by rewrite setIC group_modr // (sdprodW defH) setIAC setIid.
-have [tiPX | ntPX] := eqVneq (P :&: X) 1; first by rewrite -defX tiPX mul1g.
-have irrPU: acts_irreducibly U P 'J.
- apply/mingroupP; (split=> [|V /andP[ntV]]; rewrite astabsJ) => [|nVU sVP].
- by have [_ ->] := Frobenius_context frobH.
- apply/eqP; rewrite eqEsubset sVP; apply/subsetP=> x Px.
- have [-> // | ntx] := eqVneq x 1.
- have [z Vz ntz] := trivgPn _ ntV; have Pz := subsetP sVP z Vz.
- have nz_z: sigma z != 0%R by rewrite morph_injm_eq1.
- have uP: (sigma x / sigma z)%R \is a GRing.unit.
- by rewrite unitfE mulf_neq0 ?invr_eq0 ?morph_injm_eq1.
- have: FinRing.unit F uP \in setT := in_setT _.
- case/(mem_dprod defFU)=> _ [s1 [/morphimP[u Uu _ ->]]].
- rewrite inE => /vlineP[n Ds1] /(congr1 val)/= Dx _.
- suffices ->: x = (z ^ u) ^+ n by rewrite groupX ?memJ_norm ?(subsetP nVU).
- apply: (injmP inj_sigma); rewrite ?(in_PU, sigmaE) //.
- by rewrite -mulr_natr -scaler_nat natr_Zp -Ds1 -mulrA -Dx mulrC divfK.
-have{ntPX defX irrPU} defX: X :=: H.
- rewrite -(sdprodW defH) -defX; congr (_ * _).
- have [_ -> //] := mingroupP irrPU; rewrite ?subsetIl //= -/X astabsJ ntPX.
- by rewrite normsI // normsG.
-have nHt1: t1 \in 'N(H) by rewrite -groupV inE sub_conjgV; apply/setIidPl.
-have oP0: #|P0| = p by rewrite -(card_injm inj_sigma) // (eq_card sigmaP0) oFp.
-have{nHt1} nHP1: P1 \subset 'N(H).
- apply: prime_meetG; first by rewrite cardJg oP0.
- by apply/trivgPn; exists t1; rewrite // inE P1t1.
-have{nHP1} nPP1: P1 \subset 'N(P).
- have /Hall_pi hallP: Hall H P by apply: Frobenius_ker_Hall frobH.
- by rewrite -(normal_Hall_pcore hallP nsPH) gFnorm_trans.
-have sylP0: p.-Sylow(Q <*> P0) P0.
- rewrite /pHall -divgS joing_subr ?(pgroupS sP0P) //=.
- by rewrite norm_joinEr // coprime_cardMg ?(coprimegS sP0P) ?mulnK.
-have sP1QP0: P1 \subset Q <*> P0.
- by rewrite conj_subG ?joing_subr ?mem_gen // inE Qy.
-have nP10: P1 \subset 'N(P0).
- have: P1 \subset 'N(P :&: (Q <*> P0)) by rewrite normsI // normsG.
- by rewrite norm_joinEr // -group_modr // setIC coprime_TIg // mul1g.
-have eqP10: P1 :=: P0.
- apply/eqP; rewrite eqEcard cardJg leqnn andbT.
- rewrite (comm_sub_max_pgroup (Hall_max sylP0)) //; last exact: normC.
- by rewrite pgroupJ (pHall_pgroup sylP0).
-have /idPn[] := prime_gt1 pr_p.
-rewrite -oP0 cardG_gt1 negbK -subG1 -(Frobenius_trivg_cent frobH) subsetI sP0P.
-apply/commG1P/trivgP; rewrite -tiPU commg_subI // subsetI ?subxx //.
-by rewrite sP0P -eqP10.
-Qed.
-
-(* This is B & G, Appendix C, Lemma C.3, Step 4. *)
-Fact BGappendixC3_Ediv : E = [set x^-1 | x in E]%R.
-Proof.
-suffices sEV_E: [set x^-1 | x in E]%R \subset E.
- by apply/esym/eqP; rewrite eqEcard sEV_E card_imset //=; apply: invr_inj.
-have /mulG_sub[/(subset_trans sP0P)/subsetP-sP0H /subsetP-sUH] := sdprodW defH.
-have Hs := sP0H s P0s; have P1t: t \in P1 by rewrite memJ_conjg.
-have nUP1 t1: t1 \in P1 -> U :^ t1 = U by move/(subsetP nUP0y)/normP.
-have nUtn n u: u \in U -> u ^ (t ^+ n) \in U.
- by rewrite -mem_conjgV nUP1 ?groupV ?groupX.
-have nUtVn n u: u \in U -> u ^ (t ^- n) \in U.
- by rewrite -mem_conjg nUP1 ?groupX.
-have Qsti i: s ^- i * t ^+ i \in Q.
- by rewrite -conjXg -commgEl (subsetP sQP0Q) // commGC mem_commg ?groupX.
-pose is_sUs m a j n u s1 v :=
- [/\ a \in U, u \in U, v \in U, s1 \in P0
- & s ^+ m * a ^ t ^+ j * s ^- n = u * s1 * v].
-have split_sUs m a j n:
- a \in U -> exists u, exists s1, exists v, is_sUs m a j n u s1 v.
-- move=> Ua; suffices: s ^+ m * a ^ t ^+ j * s ^- n \in H.
- by case/splitH=> u Uu [v Uv [s1 P0s1 Dusv1]]; exists u, s1, v.
- by rewrite 2?groupM ?groupV ?groupX // sUH ?nUtn.
-have nt_sUs m j n a u s1 v:
- (m == n.+1) || (n == m.+1) -> is_sUs m a j n u s1 v -> s1 != 1.
-- move/pred2P=> Dmn [Ua Uu Uv _ Dusv]; have{Dmn}: s ^+ m != s ^+ n.
- by case: Dmn => ->; last rewrite eq_sym; rewrite expgS eq_mulgV1 ?mulgK.
- apply: contraNneq => s1_1; rewrite {s1}s1_1 mulg1 in Dusv.
- have:= groupM Uu Uv; rewrite -Dusv => /(not_splitU _ _ (nUtn j a Ua))/orP.
- by rewrite !in_group // eq_invg1 -eq_mulgV1 => -[]// /andP[? /eqP->].
-have sUs_modP m a j n u s1 v: is_sUs m a j n u s1 v -> a ^ t ^+ j = u * v.
- have [nUP /isom_inj/injmP/=quoUP_inj] := sdprod_isom defH.
- case=> Ua Uu Uv P0s1 /(congr1 (coset P)); rewrite (conjgCV u) -(mulgA _ u).
- rewrite coset_kerr ?groupV 2?coset_kerl ?groupX //; last first.
- by rewrite -mem_conjg (normsP nUP) // (subsetP sP0P).
- by move/quoUP_inj->; rewrite ?nUtn ?groupM.
-have expUMp u v Uu Uv := expgMn p (centsP cUU u v Uu Uv).
-have sUsXp m a j n u s1 v:
- is_sUs m a j n u s1 v -> is_sUs m (a ^+ p) j n (u ^+ p) s1 (v ^+ p).
-- move=> Dusv; have{Dusv} [/sUs_modP Duv [Ua Uu Vv P0s1 Dusv]] := (Dusv, Dusv).
- split; rewrite ?groupX //; move: P0s1 Dusv; rewrite -defP0 => /cycleP[k ->].
- rewrite conjXg -!(mulgA _ (s ^+ k)) ![s ^+ k * _]conjgC 2!mulgA -expUMp //.
- rewrite {}Duv ![s ^+ m * _]conjgC !conjXg -![_ * _ * s ^- n]mulgA.
- move/mulgI/(congr1 (Frobenius_aut charFp \o sigma))=> /= Duv_p.
- congr (_ * _); apply/(injmP inj_sigma); rewrite ?in_PU //.
- by rewrite !{1}sigmaE ?in_PU // rmorphB !rmorphMn rmorph1 in Duv_p *.
-have odd_P: odd #|P| by rewrite oP odd_exp odd_p orbT.
-suffices EpsiV a: a \in U -> psi a \in E -> psi (a^-1 ^ t ^+ 3) \in E.
- apply/subsetP => _ /imsetP[x Ex ->].
- have /imsetP[a Ua Dx]: x \in psi @: U by rewrite im_psi; case/setIdP: Ex.
- suffices: psi (a^-1 ^ t ^+ (3 * #|P|)) \in E.
- rewrite Dx -psiV // -{2}(conjg1 a^-1); congr (psi (_ ^ _) \in E).
- by apply/eqP; rewrite -order_dvdn orderJ dvdn_mull ?order_dvdG.
- rewrite -(odd_double_half #|P|) odd_P addnC.
- elim: _./2 => [|n /EpsiV/EpsiV/=]; first by rewrite EpsiV -?Dx.
- by rewrite conjVg invgK -!conjgM -!expgD -!mulnSr !(groupV, nUtn) //; apply.
-move=> Ua Ea; have{Ea} [b Ub Dab]: exists2 b, b \in U & psi a + psi b = 2%:R.
- case/setIdP: Ea => _; rewrite -im_psi => /imsetP[b Ub Db]; exists b => //.
- by rewrite -Db addrC subrK.
-(* In the book k is arbitrary in Fp; however only k := 3 is used. *)
-have [u2 [s2 [v2 usv2P]]] := split_sUs 3 (a * _) 2 1%N (groupM Ua (groupVr Ub)).
-have{Ua} [u1 [s1 [v1 usv1P]]] := split_sUs 1%N a^-1 3 2 (groupVr Ua).
-have{Ub} [u3 [s3 [v3 usv3P]]] := split_sUs 2 b 1%N 3 Ub.
-pose s2def w1 w2 w3 := t * s2^-1 * t = w1 * s3 * w2 * t ^+ 2 * s1 * w3.
-pose w1 := v2 ^ t^-1 * u3; pose w2 := v3 * u1 ^ t ^- 2; pose w3 := v1 * u2 ^ t.
-have stXC m n: (m <= n)%N -> s ^- n ^ t ^+ m = s ^- m ^ t ^+ n * s ^- (n - m).
- move/subnK=> Dn; apply/(mulgI (s ^- (n - m) * t ^+ n))/(mulIg (t ^+ (n - m))).
- rewrite -{1}[in t ^+ n]Dn expgD !mulgA !mulgK -invMg -2!mulgA -!expgD.
- by rewrite addnC Dn (centsP (abelem_abelian abelQ)) ?mulgA.
-wlog suffices Ds2: a b u1 v1 u2 v2 u3 v3 @w1 @w2 @w3 Dab usv1P usv2P usv3P /
- s2def w1 w2 w3; last first.
-- apply/esym; rewrite -[_ * t]mulgA [_ * t]conjgC mulgA -(expgS _ 1) conjVg.
- rewrite /w2 mulgA; apply: (canRL (mulKVg _)); rewrite 2!mulgA -conjgE.
- rewrite conjMg conjgKV /w3 mulgA; apply: (canLR (mulgKV _)).
- rewrite /w1 -4!mulgA (mulgA u1) (mulgA u3) conjMg -conjgM mulKg -mulgA.
- have [[[Ua _ _ _ <-] [_ _ _ _ Ds2]] [Ub _ _ _ <-]] := (usv1P, usv2P, usv3P).
- apply: (canLR (mulKVg _)); rewrite -!invMg -!conjMg -{}Ds2 groupV in Ua *.
- rewrite -[t]expg1 2!conjMg -conjgM -expgS 2!conjMg -conjgM -expgSr mulgA.
- apply: (canLR (mulgK _)); rewrite 2!invMg -!conjVg invgK invMg invgK -4!mulgA.
- rewrite (mulgA _ s) stXC // mulgKV -!conjMg stXC // mulgKV -conjMg conjgM.
- apply: (canLR (mulKVg _)); rewrite -2!conjVg 2!mulgA -conjMg (stXC 1%N) //.
- rewrite mulgKV -conjgM -expgSr -mulgA -!conjMg; congr (_ ^ t ^+ 3).
- apply/(canLR (mulKVg _))/(canLR (mulgK _))/(canLR invgK).
- rewrite -!mulgA (mulgA _ b) mulgA invMg -!conjVg !invgK.
- by apply/(injmP inj_sigma); rewrite 1?groupM ?sigmaE ?memJ_P.
-have [[Ua Uu1 Uv1 P0s1 Dusv1] /sUs_modP-Duv1] := (usv1P, usv1P).
-have [[_ Uu2 Uv2 P0s2 _] [Ub Uu3 Uv3 P0s3 _]] := (usv2P, usv3P).
-suffices /(congr1 sigma): s ^+ 2 = s ^ v1 * s ^ a^-1 ^ t ^+ 3.
- rewrite inE sigmaX // sigma_s sigmaM ?memJ_P -?psiE ?nUtn // => ->.
- by rewrite addrK -!im_psi !mem_imset ?nUtn.
-rewrite groupV in Ua; have [Hs1 Hs3]: s1 \in H /\ s3 \in H by rewrite !sP0H.
-have nt_s1: s1 != 1 by apply: nt_sUs usv1P.
-have nt_s3: s3 != 1 by apply: nt_sUs usv3P.
-have{sUsXp} Ds2p: s2def (w1 ^+ p) (w2 ^+ p) (w3 ^+ p).
- have [/sUsXp-usv1pP /sUsXp-usv2pP /sUsXp-usv3pP] := And3 usv1P usv2P usv3P.
- rewrite expUMp ?groupV // !expgVn in usv1pP usv2pP.
- rewrite !(=^~ conjXg _ _ p, expUMp) ?groupV -1?[t]expg1 ?nUtn ?nUtVn //.
- apply: Ds2 usv1pP usv2pP usv3pP => //.
- by rewrite !psiX // -!Frobenius_autE -rmorphD Dab rmorph_nat.
-have{Ds2} Ds2: s2def w1 w2 w3 by apply: Ds2 usv1P usv2P usv3P.
-wlog [Uw1 Uw2 Uw3]: w1 w2 w3 Ds2p Ds2 / [/\ w1 \in U, w2 \in U & w3 \in U].
- by move/(_ w1 w2 w3)->; rewrite ?(nUtVn, nUtVn 1%N, nUtn 1%N, in_group).
-have{Ds2p} Dw3p: (w2 ^- p * w1 ^- p.-1 ^ s3 * w2) ^ t ^+ 2 = w3 ^+ p.-1 ^ s1^-1.
- rewrite -[w1 ^+ _](mulKg w1) -[w3 ^+ _](mulgK w3) -expgS -expgSr !prednK //.
- rewrite -(canLR (mulKg _) Ds2p) -(canLR (mulKg _) Ds2) 6!invMg !invgK.
- by rewrite mulgA mulgK [2]lock /conjg !mulgA mulVg mul1g mulgK.
-have w_id w: w \in U -> w ^+ p.-1 == 1 -> w = 1.
- by move=> Uw /eqP/(canRL_in (expgK _) Uw)->; rewrite ?expg1n ?oU.
-have{Uw3} Dw3: w3 = 1.
- apply: w_id => //; have:= @not_splitU s1^-1^-1 s1^-1 (w3 ^+ p.-1).
- rewrite !groupV mulVg eqxx andbT {2}invgK (negPf nt_s1) groupX //= => -> //.
- have /tiH_P1 <-: t ^+ 2 \in P1^#.
- rewrite 2!inE groupX // andbT -order_dvdn gtnNdvd // orderJ.
- by rewrite odd_gt2 ?order_gt1 // orderE defP0 (oddSg sP0P).
- by rewrite -mulgA -conjgE inE -{2}Dw3p memJ_conjg !in_group ?Hs1 // sUH.
-have{Dw3p} Dw2p: w2 ^+ p.-1 = w1 ^- p.-1 ^ s3.
- apply/(mulIg w2)/eqP; rewrite -expgSr prednK // eq_mulVg1 mulgA.
- by rewrite (canRL (conjgK _) Dw3p) Dw3 expg1n !conj1g.
-have{Uw1} Dw1: w1 = 1.
- apply: w_id => //; have:= @not_splitU s3^-1 s3 (w1 ^- p.-1).
- rewrite mulVg (negPf nt_s3) andbF -mulgA -conjgE -Dw2p !in_group //=.
- by rewrite eqxx andbT eq_invg1 /= => ->.
-have{w1 w2 w3 Dw1 Dw3 w_id Uw2 Dw2p Ds2} Ds2: t * s2^-1 * t = s3 * t ^+ 2 * s1.
- by rewrite Ds2 Dw3 [w2]w_id ?mulg1 ?Dw2p ?Dw1 ?mul1g // expg1n invg1 conj1g.
-have /centsP abP0: abelian P0 by rewrite -defP0 cycle_abelian.
-have QP0ys := memJ_norm y (subsetP (commg_normr P0 Q) _ _).
-have{QP0ys} memQP0 := (QP0ys, groupV, groupM); have nQ_P0 := subsetP nQP0.
-have sQP0_Q: [~: Q, P0] \subset Q by rewrite commg_subl.
-have /centsP abQP0 := abelianS sQP0_Q (abelem_abelian abelQ).
-have{s2def} Ds312: s3 * s1 * s2 = 1.
- apply/set1P; rewrite -set1gE -(coprime_TIg coQP) inE.
- rewrite coset_idr ?(subsetP sP0P) ?nQ_P0 ?groupM //.
- rewrite -mulgA -[s2](mulgK s) [_ * s]abP0 // -[s2](mulKVg s).
- rewrite -!mulgA [s * _]mulgA [s1 * _]mulgA [s1 * _]abP0 ?groupM //.
- rewrite 2!(mulgA s3) [s^-1 * _]mulgA !(morphM, morphV) ?nQ_P0 ?in_group //=.
- have ->: coset Q s = coset Q t by rewrite coset_kerl ?groupV ?coset_kerr.
- have nQt: t \in 'N(Q) by rewrite -(conjGid Qy) normJ memJ_conjg nQ_P0.
- rewrite -morphV // -!morphM ?(nQt, groupM) ?groupV // ?nQ_P0 //= -Ds2.
- by rewrite 2!mulgA mulgK mulgKV mulgV morph1.
-pose x := (y ^ s3)^-1 * y ^ s^-1 * (y ^ (s * s1)^-1)^-1 * y.
-have{abP0} Dx: x ^ s^-1 = x.
- rewrite 3!conjMg !conjVg -!conjgM -!invMg (mulgA s) -(expgS _ 1).
- rewrite [x]abQP0 ?memQP0 // [rhs in y * rhs]abQP0 ?memQP0 //.
- apply/(canRL (mulKVg _)); rewrite 4!mulgA; congr (_ * _).
- rewrite [RHS]abQP0 ?memQP0 //; apply/(canRL (mulgK _))/eqP.
- rewrite -3!mulgA [rhs in y^-1 * rhs]abQP0 ?memQP0 // -eq_invg_sym eq_invg_mul.
- apply/eqP; transitivity (t ^+ 2 * s1 * (t^-1 * s2 * t^-1) * s3); last first.
- by rewrite -[s2]invgK -!invMg mulgA Ds2 -(mulgA s3) invMg mulKVg mulVg.
- rewrite (canRL (mulKg _) Ds312) -2![_ * t^-1]mulgA.
- have Dt1 si: si \in P0 -> t^-1 = (s^-1 ^ si) ^ y.
- by move=> P0si; rewrite {2}/conjg -conjVg -(abP0 si) ?groupV ?mulKg.
- by rewrite {1}(Dt1 s1) // (Dt1 s3^-1) ?groupV // -conjXg /conjg !{1}gnorm.
-have{Dx memQP0} Dx1: x = 1.
- apply/set1P; rewrite -set1gE; have [_ _ _ <-] := dprodP defQ.
- rewrite setIAC (setIidPr sQP0_Q) inE -{2}defP0 -cycleV cent_cycle.
- by rewrite (sameP cent1P commgP) commgEl Dx mulVg eqxx !memQP0.
-pose t1 := s1 ^ y; pose t3 := s3 ^ y.
-have{x Dx1} Ds13: s1 * (t * t1)^-1 = (t3 * t)^-1 * s3.
- by apply/eqP; rewrite eq_sym eq_mulVg1 invMg invgK -Dx1 /x /conjg !gnorm.
-suffices Ds1: s1 = s^-1.
- rewrite -(canLR (mulKg _) (canRL (mulgKV _) Dusv1)) Ds1 Duv1.
- by rewrite !invMg invgK /conjg !gnorm.
-have [_ _ /trivgPn[u Uu nt_u] _ _] := Frobenius_context frobH.
-apply: (conjg_inj y); apply: contraNeq nt_u.
-rewrite -/t1 conjVg -/t eq_mulVg1 -invMg => nt_tt1.
-have Hu := sUH u Uu; have P1tt1: t * t1 \in P1 by rewrite groupM ?memJ_conjg.
-have /tiH_P1 defU: (t * t1)^-1 \in P1^# by rewrite 2!inE nt_tt1 groupV.
-suffices: (u ^ s1) ^ (t * t1)^-1 \in U.
- rewrite -mem_conjg nUP1 // conjgE mulgA => /(not_splitU _ _ Uu).
- by rewrite groupV (negPf nt_s1) andbF mulVg eqxx andbT /= => /(_ _ _)/eqP->.
-rewrite -defU inE memJ_conjg -conjgM Ds13 conjgM groupJ ?(groupJ _ Hs1) //.
-by rewrite sUH // -mem_conjg nUP1 // groupM ?memJ_conjg.
-Qed.
-
-End AppendixC3.
-
-Fact BGappendixC_inner_subproof : (p <= q)%N.
-Proof.
-have [y QP0y nUP0y] := nU_P0QP0.
-by apply: Einv_gt1_le_pq E_gt1; apply: BGappendixC3_Ediv nUP0y.
-Qed.
-
-End ExpandHypotheses.
-
-(* This is B & G, Appendix C, Theorem C. *)
-Theorem prime_dim_normed_finField : (p <= q)%N.
-Proof.
-apply: wlog_neg; rewrite -ltnNge => ltqp.
-have [F sigma /isomP[inj_sigma im_sigma] defP0] := fieldH.
-case=> sigmaU inj_sigmaU sigmaJ.
-have oF: #|F| = (p ^ q)%N by rewrite -cardsT -im_sigma card_injm.
-have charFp: p \in [char F] := card_finCharP oF pr_p.
-have sP0P: P0 \subset P by rewrite -defP0 subsetIl.
-pose s := invm inj_sigma 1%R.
-have sigma_s: sigma s = 1%R by rewrite invmK ?im_sigma ?inE.
-have{defP0} defP0: <[s]> = P0.
- by rewrite -morphim_cycle /= ?im_sigma ?inE // morphim_invmE.
-exact: BGappendixC_inner_subproof defP0 sigmaJ.
-Qed.
-
-End AppendixC.
diff --git a/mathcomp/odd_order/BGsection1.v b/mathcomp/odd_order/BGsection1.v
deleted file mode 100644
index 3230da2..0000000
--- a/mathcomp/odd_order/BGsection1.v
+++ /dev/null
@@ -1,1343 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div fintype.
-From mathcomp
-Require Import bigop prime binomial finset fingroup morphism perm automorphism.
-From mathcomp
-Require Import quotient action gproduct gfunctor commutator.
-From mathcomp
-Require Import ssralg finalg zmodp cyclic center pgroup finmodule gseries.
-From mathcomp
-Require Import nilpotent sylow abelian maximal hall extremal.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation mxabelem.
-
-(******************************************************************************)
-(* This file contains most of the material in B & G, section 1, including the *)
-(* definitions: *)
-(* p.-length_1 G == the upper p-series of G has length <= 1, i.e., *)
-(* 'O_{p^',p,p^'}(G) = G *)
-(* p_elt_gen p G == the subgroup of G generated by its p-elements. *)
-(* This file currently covers B & G 1.3-4, 1.6, 1.8-1.21, and also *)
-(* Gorenstein 8.1.3 and 2.8.1 (maximal order of a p-subgroup of GL(2,p)). *)
-(* This file also provides, mostly for future reference, the following *)
-(* definitions, drawn from Gorenstein, Chapter 8, and B & G, Appendix B: *)
-(* p.-constrained G <-> the p',p core of G contains the centralisers of *)
-(* all its Sylow p-subgroups. The Hall-Higman Lemma *)
-(* 1.2.3 (B & G, 1.15a) asserts that this holds for *)
-(* all solvable groups. *)
-(* p.-stable G <-> a rather group theoretic generalization of the *)
-(* Hall-Higman type condition that in a faithful *)
-(* p-modular linear representation of G no p-element *)
-(* has a quadratic minimal polynomial, to groups G *)
-(* with a non-trivial p-core. *)
-(* p.-abelian_constrained <-> the p',p core of G contains all the normal *)
-(* abelian subgroups of the Sylow p-subgroups of G. *)
-(* It is via this property and the ZL theorem (the *)
-(* substitute for the ZJ theorem) that the *)
-(* p-stability of groups of odd order is exploited *)
-(* in the proof of the Odd Order Theorem. *)
-(* generated_by p G == G is generated by a set of subgroups satisfying *)
-(* p : pred {group gT} *)
-(* norm_abelian X A == A is abelian and normalised by X. *)
-(* p_norm_abelian p X A == A is an abelian p-group normalised by X. *)
-(* 'L_[G](X) == the group generated by the abelian subgroups of G *)
-(* normalized by X. *)
-(* 'L_{n}(G) == the Puig group series, defined by the recurrence *)
-(* 'L_{0}(G) = 1, 'L_{n.+1}(G) = 'L_[G]('L_{n}(G)). *)
-(* 'L_*(G) == the lower limit of the Puig series. *)
-(* 'L(G) == the Puig subgroup: the upper limit of the Puig *)
-(* series: 'L(G) = 'L_[G]('L_*(G)) and conversely. *)
-(* The following notation is used locally here and in AppendixB, but is NOT *)
-(* exported: *)
-(* D --> G == G is generated by abelian groups normalised by D *)
-(* := generated_by (norm_abelian D) G *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope.
-
-Section Definitions.
-
-Variables (n : nat) (gT : finGroupType).
-Implicit Type p : nat.
-
-Definition plength_1 p (G : {set gT}) := 'O_{p^', p, p^'}(G) == G.
-
-Definition p_elt_gen p (G : {set gT}) := <<[set x in G | p.-elt x]>>.
-
-Definition p_constrained p (G : {set gT}) :=
- forall P : {group gT},
- p.-Sylow('O_{p^',p}(G)) P ->
- 'C_G(P) \subset 'O_{p^',p}(G).
-
-Definition p_abelian_constrained p (G : {set gT}) :=
- forall S A : {group gT},
- p.-Sylow(G) S -> abelian A -> A <| S ->
- A \subset 'O_{p^',p}(G).
-
-Definition p_stable p (G : {set gT}) :=
- forall P A : {group gT},
- p.-group P -> 'O_p^'(G) * P <| G ->
- p.-subgroup('N_G(P)) A -> [~: P, A, A] = 1 ->
- A / 'C_G(P) \subset 'O_p('N_G(P) / 'C_G(P)).
-
-Definition generated_by (gp : pred {group gT}) (E : {set gT}) :=
- [exists gE : {set {group gT}}, <<\bigcup_(G in gE | gp G) G>> == E].
-
-Definition norm_abelian (D : {set gT}) : pred {group gT} :=
- fun A => (D \subset 'N(A)) && abelian A.
-
-Definition p_norm_abelian p (D : {set gT}) : pred {group gT} :=
- fun A => p.-group A && norm_abelian D A.
-
-Definition Puig_succ (D E : {set gT}) :=
- <<\bigcup_(A in subgroups D | norm_abelian E A) A>>.
-
-Definition Puig_rec D := iter n (Puig_succ D) 1.
-
-End Definitions.
-
-(* This must be defined outside a Section to avoid spurrious delta-reduction *)
-Definition Puig_at := nosimpl Puig_rec.
-
-Definition Puig_inf (gT : finGroupType) (G : {set gT}) := Puig_at #|G|.*2 G.
-
-Definition Puig (gT : finGroupType) (G : {set gT}) := Puig_at #|G|.*2.+1 G.
-
-Notation "p .-length_1" := (plength_1 p)
- (at level 2, format "p .-length_1") : group_scope.
-
-Notation "p .-constrained" := (p_constrained p)
- (at level 2, format "p .-constrained") : group_scope.
-Notation "p .-abelian_constrained" := (p_abelian_constrained p)
- (at level 2, format "p .-abelian_constrained") : group_scope.
-Notation "p .-stable" := (p_stable p)
- (at level 2, format "p .-stable") : group_scope.
-
-Notation "''L_[' G ] ( L )" := (Puig_succ G L)
- (at level 8, format "''L_[' G ] ( L )") : group_scope.
-Notation "''L_{' n } ( G )" := (Puig_at n G)
- (at level 8, format "''L_{' n } ( G )") : group_scope.
-Notation "''L_*' ( G )" := (Puig_inf G)
- (at level 8, format "''L_*' ( G )") : group_scope.
-Notation "''L' ( G )" := (Puig G)
- (at level 8, format "''L' ( G )") : group_scope.
-
-Section BGsection1.
-
-Implicit Types (gT : finGroupType) (p : nat).
-
-(* This is B & G, Lemma 1.1, first part. *)
-Lemma minnormal_solvable_abelem gT (M G : {group gT}) :
- minnormal M G -> solvable M -> is_abelem M.
-Proof. by move=> minM solM; case: (minnormal_solvable minM (subxx _) solM). Qed.
-
-(* This is B & G, Lemma 1.2, second part. *)
-Lemma minnormal_solvable_Fitting_center gT (M G : {group gT}) :
- minnormal M G -> M \subset G -> solvable M -> M \subset 'Z('F(G)).
-Proof.
-have nZG: 'Z('F(G)) <| G by rewrite !gFnormal_trans.
-move=> minM sMG solM; have[/andP[ntM nMG] minM'] := mingroupP minM.
-apply/setIidPl/minM'; last exact: subsetIl.
-apply/andP; split; last by rewrite normsI // normal_norm.
-apply: meet_center_nil => //; first by apply: Fitting_nil.
-apply/andP; split; last exact: gFsub_trans.
-apply: Fitting_max; rewrite // /normal ?sMG //; apply: abelian_nil.
-by move: (minnormal_solvable_abelem minM solM) => /abelem_abelian.
-Qed.
-
-Lemma sol_chief_abelem gT (G V U : {group gT}) :
- solvable G -> chief_factor G V U -> is_abelem (U / V).
-Proof.
-move=> solG chiefUV; have minUV := chief_factor_minnormal chiefUV.
-have [|//] := minnormal_solvable minUV (quotientS _ _) (quotient_sol _ solG).
-by case/and3P: chiefUV.
-Qed.
-
-Section HallLemma.
-
-Variables (gT : finGroupType) (G G' : {group gT}).
-
-Hypothesis solG : solvable G.
-Hypothesis nsG'G : G' <| G.
-
-Let sG'G : G' \subset G. Proof. exact: normal_sub. Qed.
-Let nG'G : G \subset 'N(G'). Proof. exact: normal_norm. Qed.
-Let nsF'G : 'F(G') <| G. Proof. exact: gFnormal_trans. Qed.
-
-Let Gchief (UV : {group gT} * {group gT}) := chief_factor G UV.2 UV.1.
-Let H := \bigcap_(UV | Gchief UV) 'C(UV.1 / UV.2 | 'Q).
-Let H' :=
- G' :&: \bigcap_(UV | Gchief UV && (UV.1 \subset 'F(G'))) 'C(UV.1 / UV.2 | 'Q).
-
-(* This is B & G Proposition 1.2, non trivial inclusion of the first equality.*)
-Proposition Fitting_stab_chief : 'F(G') \subset H.
-Proof.
-apply/bigcapsP=> [[U V] /= chiefUV].
-have minUV: minnormal (U / V) (G / V) := chief_factor_minnormal chiefUV.
-have{chiefUV} [/=/maxgroupp/andP[_ nVG] sUG nUG] := and3P chiefUV.
-have solUV: solvable (U / V) by rewrite quotient_sol // (solvableS sUG).
-have{solUV minUV}: U / V \subset 'Z('F(G / V)).
- exact: minnormal_solvable_Fitting_center minUV (quotientS V sUG) solUV.
-rewrite sub_astabQ gFsub_trans ?(subset_trans sG'G) //=.
-case/subsetIP=> _; rewrite centsC; apply: subset_trans.
-by rewrite Fitting_max ?quotient_normal ?quotient_nil ?Fitting_nil.
-Qed.
-
-(* This is B & G Proposition 1.2, non trivial inclusion of the second *)
-(* equality. *)
-Proposition chief_stab_sub_Fitting : H' \subset 'F(G').
-Proof.
-without loss: / {K | [min K | K <| G & ~~ (K \subset 'F(G'))] & K \subset H'}.
- move=> IH; apply: wlog_neg => s'H'F; apply/IH/mingroup_exists=> {IH}/=.
- rewrite /normal subIset ?sG'G ?normsI ?norms_bigcap {s'H'F}//.
- apply/bigcapsP=> /= U /andP[/and3P[/maxgroupp/andP/=[_ nU2G] _ nU1G] _].
- exact: subset_trans (actsQ nU2G nU1G) (astab_norm 'Q (U.1 / U.2)).
-case=> K /mingroupP[/andP[nsKG s'KF] minK] /subsetIP[sKG' nFK].
-have [[Ks chiefKs defK] sKG]:= (chief_series_exists nsKG, normal_sub nsKG).
-suffices{nsKG s'KF} cKsK: (K.-central).-series 1%G Ks.
- by rewrite Fitting_max ?(normalS _ sG'G) ?(centrals_nil cKsK) in s'KF.
-move: chiefKs; rewrite -!(rev_path _ _ Ks) {}defK.
-case: {Ks}(rev _) => //= K1 Kr /andP[chiefK1 chiefKr].
-have [/maxgroupp/andP[/andP[sK1K ltK1K] nK1G] _] := andP chiefK1.
-suffices{chiefK1} cKrK: [rel U V | central_factor K V U].-series K1 Kr.
- have cKK1: abelian (K / K1) := abelem_abelian (sol_chief_abelem solG chiefK1).
- by rewrite /central_factor subxx sK1K der1_min //= (subset_trans sKG).
-have{minK ltK1K nK1G} sK1F: K1 \subset 'F(G').
- have nsK1G: K1 <| G by rewrite /normal (subset_trans sK1K).
- by apply: contraR ltK1K => s'K1F; rewrite (minK K1) ?nsK1G.
-elim: Kr K1 chiefKr => //= K2 Kr IHr K1 /andP[chiefK2 chiefKr] in sK1F sK1K *.
-have [/maxgroupp/andP[/andP[sK21 _] /(subset_trans sKG)nK2K] _] := andP chiefK2.
-rewrite /central_factor sK1K {}IHr ?(subset_trans sK21) {chiefKr}// !andbT.
-rewrite commGC -sub_astabQR ?(subset_trans _ nK2K) //.
-exact/(subset_trans nFK)/(bigcap_inf (K1, K2))/andP.
-Qed.
-
-End HallLemma.
-
-(* This is B & G, Proposition 1.3 (due to P. Hall). *)
-Proposition cent_sub_Fitting gT (G : {group gT}) :
- solvable G -> 'C_G('F(G)) \subset 'F(G).
-Proof.
-move=> solG; apply: subset_trans (chief_stab_sub_Fitting solG _) => //.
-rewrite subsetI subsetIl; apply/bigcapsP=> [[U V]] /=.
-case/andP=> /andP[/maxgroupp/andP[_ nVG] _] sUF.
-by rewrite astabQ (subset_trans _ (morphpre_cent _ _)) // setISS ?centS.
-Qed.
-
-(* This is B & G, Proposition 1.4, for internal actions. *)
-Proposition coprime_trivg_cent_Fitting gT (A G : {group gT}) :
- A \subset 'N(G) -> coprime #|G| #|A| -> solvable G ->
- 'C_A(G) = 1 -> 'C_A('F(G)) = 1.
-Proof.
-move=> nGA coGA solG regAG; without loss cycA: A nGA coGA regAG / cyclic A.
- move=> IH; apply/trivgP/subsetP=> a; rewrite -!cycle_subG subsetI.
- case/andP=> saA /setIidPl <-.
- rewrite {}IH ?cycle_cyclic ?(coprimegS saA) ?(subset_trans saA) //.
- by apply/trivgP; rewrite -regAG setSI.
-pose X := G <*> A; pose F := 'F(X); pose pi := \pi(A); pose Q := 'O_pi(F).
-have pi'G: pi^'.-group G by rewrite /pgroup -coprime_pi' //= coprime_sym.
-have piA: pi.-group A by apply: pgroup_pi.
-have oX: #|X| = (#|G| * #|A|)%N by rewrite [X]norm_joinEr ?coprime_cardMg.
-have hallG: pi^'.-Hall(X) G.
- by rewrite /pHall -divgS joing_subl //= pi'G pnatNK oX mulKn.
-have nsGX: G <| X by rewrite /normal joing_subl join_subG normG.
-have{oX pi'G piA} hallA: pi.-Hall(X) A.
- by rewrite /pHall -divgS joing_subr //= piA oX mulnK.
-have nsQX: Q <| X by rewrite !gFnormal_trans.
-have{solG cycA} solX: solvable X.
- rewrite (series_sol nsGX) {}solG /= norm_joinEr // quotientMidl //.
- by rewrite morphim_sol // abelian_sol // cyclic_abelian.
-have sQA: Q \subset A.
- by apply: normal_sub_max_pgroup (Hall_max hallA) (pcore_pgroup _ _) nsQX.
-have pi'F: 'O_pi(F) = 1.
- suff cQG: G \subset 'C(Q) by apply/trivgP; rewrite -regAG subsetI sQA centsC.
- apply/commG1P/trivgP; rewrite -(coprime_TIg coGA) subsetI commg_subl.
- rewrite (subset_trans sQA) // (subset_trans _ sQA) // commg_subr.
- by rewrite (subset_trans _ (normal_norm nsQX)) ?joing_subl.
-have sFG: F \subset G.
- have /dprodP[_ defF _ _]: _ = F := nilpotent_pcoreC pi (Fitting_nil _).
- by rewrite (sub_normal_Hall hallG) ?gFsub //= -defF pi'F mul1g pcore_pgroup.
-have <-: F = 'F(G).
- apply/eqP; rewrite eqEsubset -{1}(setIidPr sFG) FittingS ?joing_subl //=.
- by rewrite Fitting_max ?Fitting_nil // gFnormal_trans.
-apply/trivgP; rewrite /= -(coprime_TIg coGA) subsetI subsetIl andbT.
-apply: subset_trans (subset_trans (cent_sub_Fitting solX) sFG).
-by rewrite setSI ?joing_subr.
-Qed.
-
-(* A "contrapositive" of Proposition 1.4 above. *)
-Proposition coprime_cent_Fitting gT (A G : {group gT}) :
- A \subset 'N(G) -> coprime #|G| #|A| -> solvable G ->
- 'C_A('F(G)) \subset 'C(G).
-Proof.
-move=> nGA coGA solG; apply: subset_trans (subsetIr A _); set C := 'C_A(G).
-rewrite -quotient_sub1 /= -/C; last first.
- by rewrite subIset // normsI ?normG // norms_cent.
-apply: subset_trans (quotient_subcent _ _ _) _; rewrite /= -/C.
-have nCG: G \subset 'N(C) by rewrite cents_norm // centsC subsetIr.
-rewrite /= -(setIidPr (Fitting_sub _)) -[(G :&: _) / _](morphim_restrm nCG).
-rewrite injmF //=; last first.
- by rewrite ker_restrm ker_coset setIA (coprime_TIg coGA) subIset ?subxx.
-rewrite morphim_restrm -quotientE setIid.
-rewrite coprime_trivg_cent_Fitting ?quotient_norms ?coprime_morph //=.
- exact: morphim_sol.
-rewrite -strongest_coprime_quotient_cent ?trivg_quotient ?solG ?orbT //.
- by rewrite -setIA subsetIl.
-by rewrite coprime_sym -setIA (coprimegS (subsetIl _ _)).
-Qed.
-
-(* B & G Proposition 1.5 is covered by several lemmas in hall.v : *)
-(* 1.5a -> coprime_Hall_exists (internal action) *)
-(* ext_coprime_Hall_exists (general group action) *)
-(* 1.5b -> coprime_Hall_subset (internal action) *)
-(* ext_coprime_Hall_subset (general group action) *)
-(* 1.5c -> coprime_Hall_trans (internal action) *)
-(* ext_coprime_Hall_trans (general group action) *)
-(* 1.5d -> coprime_quotient_cent (internal action) *)
-(* ext_coprime_quotient_cent (general group action) *)
-(* several stronger variants are proved for internal action *)
-(* 1.5e -> coprime_comm_pcore (internal action only) *)
-
-(* A stronger variant of B & G, Proposition 1.6(a). *)
-Proposition coprimeR_cent_prod gT (A G : {group gT}) :
- A \subset 'N(G) -> coprime #|[~: G, A]| #|A| -> solvable [~: G, A] ->
- [~: G, A] * 'C_G(A) = G.
-Proof.
-move=> nGA coRA solR; apply/eqP; rewrite eqEsubset mulG_subG commg_subl nGA.
-rewrite subsetIl -quotientSK ?commg_norml //=.
-rewrite coprime_norm_quotient_cent ?commg_normr //=.
-by rewrite subsetI subxx quotient_cents2r.
-Qed.
-
-(* This is B & G, Proposition 1.6(a). *)
-Proposition coprime_cent_prod gT (A G : {group gT}) :
- A \subset 'N(G) -> coprime #|G| #|A| -> solvable G ->
- [~: G, A] * 'C_G(A) = G.
-Proof.
-move=> nGA; have sRG: [~: G, A] \subset G by rewrite commg_subl.
-rewrite -(Lagrange sRG) coprime_mull => /andP[coRA _] /(solvableS sRG).
-exact: coprimeR_cent_prod.
-Qed.
-
-(* This is B & G, Proposition 1.6(b). *)
-Proposition coprime_commGid gT (A G : {group gT}) :
- A \subset 'N(G) -> coprime #|G| #|A| -> solvable G ->
- [~: G, A, A] = [~: G, A].
-Proof.
-move=> nGA coGA solG; apply/eqP; rewrite eqEsubset commSg ?commg_subl //.
-have nAC: 'C_G(A) \subset 'N(A) by rewrite subIset ?cent_sub ?orbT.
-rewrite -{1}(coprime_cent_prod nGA) // commMG //=; first 1 last.
- by rewrite !normsR // subIset ?normG.
-by rewrite (commG1P (subsetIr _ _)) mulg1.
-Qed.
-
-(* This is B & G, Proposition 1.6(c). *)
-Proposition coprime_commGG1P gT (A G : {group gT}) :
- A \subset 'N(G) -> coprime #|G| #|A| -> solvable G ->
- [~: G, A, A] = 1 -> A \subset 'C(G).
-Proof.
-by move=> nGA coGA solG; rewrite centsC coprime_commGid // => /commG1P.
-Qed.
-
-(* This is B & G, Proposition 1.6(d), TI-part, from finmod.v *)
-Definition coprime_abel_cent_TI := coprime_abel_cent_TI.
-
-(* This is B & G, Proposition 1.6(d) (direct product) *)
-Proposition coprime_abelian_cent_dprod gT (A G : {group gT}) :
- A \subset 'N(G) -> coprime #|G| #|A| -> abelian G ->
- [~: G, A] \x 'C_G(A) = G.
-Proof.
-move=> nGA coGA abelG; rewrite dprodE ?coprime_cent_prod ?abelian_sol //.
- by rewrite subIset 1?(subset_trans abelG) // centS // commg_subl.
-by apply/trivgP; rewrite /= setICA coprime_abel_cent_TI ?subsetIr.
-Qed.
-
-(* This is B & G, Proposition 1.6(e), which generalises Aschbacher (24.3). *)
-Proposition coprime_abelian_faithful_Ohm1 gT (A G : {group gT}) :
- A \subset 'N(G) -> coprime #|G| #|A| -> abelian G ->
- A \subset 'C('Ohm_1(G)) -> A \subset 'C(G).
-Proof.
-move=> nGA coGA cGG; rewrite !(centsC A) => cAG1.
-have /dprodP[_ defG _ tiRC] := coprime_abelian_cent_dprod nGA coGA cGG.
-have sRG: [~: G, A] \subset G by rewrite commg_subl.
-rewrite -{}defG -(setIidPl sRG) TI_Ohm1 ?mul1g ?subsetIr //.
-by apply/trivgP; rewrite -{}tiRC setIS // subsetI Ohm_sub.
-Qed.
-
-(* B & G, Lemma 1.7 is covered by several lemmas in maximal.v : *)
-(* 1.7a -> Phi_nongen *)
-(* 1.7b -> Phi_quotient_abelem *)
-(* 1.7c -> trivg_Phi *)
-(* 1.7d -> Phi_joing *)
-
-(* This is B & G, Proposition 1.8, or Aschbacher 24.1. Note that the coprime *)
-(* assumption is slightly weaker than requiring that A be a p'-group. *)
-Proposition coprime_cent_Phi gT p (A G : {group gT}) :
- p.-group G -> coprime #|G| #|A| -> [~: G, A] \subset 'Phi(G) ->
- A \subset 'C(G).
-Proof.
-move=> pG coGA sRphi; rewrite centsC; apply/setIidPl.
-rewrite -['C_G(A)]genGid; apply/Phi_nongen/eqP.
-rewrite eqEsubset join_subG Phi_sub subsetIl -genM_join sub_gen //=.
-rewrite -{1}(coprime_cent_prod _ coGA) ?(pgroup_sol pG) ?mulSg //.
-by rewrite -commg_subl (subset_trans sRphi) ?Phi_sub.
-Qed.
-
-(* This is B & G, Proposition 1.9, base (and most common) case, for internal *)
-(* coprime action. *)
-Proposition stable_factor_cent gT (A G H : {group gT}) :
- A \subset 'C(H) -> stable_factor A H G ->
- coprime #|G| #|A| -> solvable G ->
- A \subset 'C(G).
-Proof.
-move=> cHA /and3P[sRH sHG nHG] coGA solG.
-suffices: G \subset 'C_G(A) by rewrite subsetI subxx centsC.
-rewrite -(quotientSGK nHG) ?subsetI ?sHG 1?centsC //.
-by rewrite coprime_quotient_cent ?cents_norm ?subsetI ?subxx ?quotient_cents2r.
-Qed.
-
-(* This is B & G, Proposition 1.9 (for internal coprime action) *)
-Proposition stable_series_cent gT (A G : {group gT}) s :
- last 1%G s :=: G -> (A.-stable).-series 1%G s ->
- coprime #|G| #|A| -> solvable G ->
- A \subset 'C(G).
-Proof.
-move=> <-{G}; elim/last_ind: s => /= [|s G IHs]; first by rewrite cents1.
-rewrite last_rcons rcons_path /= => /andP[/IHs{IHs}].
-move: {s}(last _ _) => H IH_H nHGA coGA solG; have [_ sHG _] := and3P nHGA.
-by rewrite (stable_factor_cent _ nHGA) ?IH_H ?(solvableS sHG) ?(coprimeSg sHG).
-Qed.
-
-(* This is B & G, Proposition 1.10. *)
-Proposition coprime_nil_faithful_cent_stab gT (A G : {group gT}) :
- A \subset 'N(G) -> coprime #|G| #|A| -> nilpotent G ->
- let C := 'C_G(A) in 'C_G(C) \subset C -> A \subset 'C(G).
-Proof.
-move=> nGA coGA nilG C; rewrite subsetI subsetIl centsC /= -/C => cCA.
-pose N := 'N_G(C); have sNG: N \subset G by rewrite subsetIl.
-have sCG: C \subset G by rewrite subsetIl.
-suffices cNA : A \subset 'C(N).
- rewrite centsC (sameP setIidPl eqP) -(nilpotent_sub_norm nilG sCG) //= -/C.
- by rewrite subsetI subsetIl centsC.
-have{nilG} solN: solvable N by rewrite (solvableS sNG) ?nilpotent_sol.
-rewrite (stable_factor_cent cCA) ?(coprimeSg sNG) /stable_factor //= -/N -/C.
-rewrite subcent_normal subsetI (subset_trans (commSg A sNG)) ?commg_subl //=.
-rewrite comm_norm_cent_cent 1?centsC ?subsetIr // normsI // !norms_norm //.
-by rewrite cents_norm 1?centsC ?subsetIr.
-Qed.
-
-(* B & G, Theorem 1.11, via Aschbacher 24.7 rather than Gorenstein 5.3.10. *)
-Theorem coprime_odd_faithful_Ohm1 gT p (A G : {group gT}) :
- p.-group G -> A \subset 'N(G) -> coprime #|G| #|A| -> odd #|G| ->
- A \subset 'C('Ohm_1(G)) -> A \subset 'C(G).
-Proof.
-move=> pG nGA coGA oddG; rewrite !(centsC A) => cAG1.
-have [-> | ntG] := eqsVneq G 1; first exact: sub1G.
-have{oddG ntG} [p_pr oddp]: prime p /\ odd p.
- have [p_pr p_dv_G _] := pgroup_pdiv pG ntG.
- by rewrite !odd_2'nat in oddG *; rewrite pnatE ?(pgroupP oddG).
-without loss defR: G pG nGA coGA cAG1 / [~: G, A] = G.
- move=> IH; have solG := pgroup_sol pG.
- rewrite -(coprime_cent_prod nGA) ?mul_subG ?subsetIr //=.
- have sRG: [~: G, A] \subset G by rewrite commg_subl.
- rewrite IH ?coprime_commGid ?(pgroupS sRG) ?commg_normr ?(coprimeSg sRG) //.
- by apply: subset_trans cAG1; apply: OhmS.
-have [|[defPhi defG'] defC] := abelian_charsimple_special pG coGA defR.
- apply/bigcupsP=> H /andP[chH abH]; have sHG := char_sub chH.
- have nHA := char_norm_trans chH nGA.
- rewrite centsC coprime_abelian_faithful_Ohm1 ?(coprimeSg sHG) //.
- by rewrite centsC (subset_trans (OhmS 1 sHG)).
-have abelZ: p.-abelem 'Z(G) by apply: center_special_abelem.
-have cAZ: {in 'Z(G), centralised A} by apply/centsP; rewrite -defC subsetIr.
-have cGZ: {in 'Z(G), centralised G} by apply/centsP; rewrite subsetIr.
-have defG1: 'Ohm_1(G) = 'Z(G).
- apply/eqP; rewrite eqEsubset -{1}defC subsetI Ohm_sub cAG1 /=.
- by rewrite -(Ohm1_id abelZ) OhmS ?center_sub.
-rewrite (subset_trans _ (subsetIr G _)) // defC -defG1 -{1}defR gen_subG /=.
-apply/subsetP=> _ /imset2P[x a Gx Aa ->]; rewrite commgEl.
-set u := x^-1; set v := x ^ a; pose w := [~ v, u].
-have [Gu Gv]: u \in G /\ v \in G by rewrite groupV memJ_norm ?(subsetP nGA).
-have Zw: w \in 'Z(G) by rewrite -defG' mem_commg.
-rewrite (OhmE 1 pG) mem_gen // !inE expn1 groupM //=.
-rewrite expMg_Rmul /commute ?(cGZ w) // bin2odd // expgM.
-case/(abelemP p_pr): abelZ => _ /(_ w)-> //.
-rewrite expg1n mulg1 expgVn -conjXg (sameP commgP eqP) cAZ // -defPhi.
-by rewrite (Phi_joing pG) joingC mem_gen // inE (Mho_p_elt 1) ?(mem_p_elt pG).
-Qed.
-
-(* This is B & G, Corollary 1.12. *)
-Corollary coprime_odd_faithful_cent_abelem gT p (A G E : {group gT}) :
- E \in 'E_p(G) -> p.-group G ->
- A \subset 'N(G) -> coprime #|G| #|A| -> odd #|G| ->
- A \subset 'C('Ldiv_p('C_G(E))) -> A \subset 'C(G).
-Proof.
-case/pElemP=> sEG abelE pG nGA coGA oddG cCEA.
-have [-> | ntG] := eqsVneq G 1; first by rewrite cents1.
-have [p_pr _ _] := pgroup_pdiv pG ntG.
-have{cCEA} cCEA: A \subset 'C('Ohm_1('C_G(E))).
- by rewrite (OhmE 1 (pgroupS _ pG)) ?subsetIl ?cent_gen.
-apply: coprime_nil_faithful_cent_stab (pgroup_nil pG) _ => //.
-rewrite subsetI subsetIl centsC /=; set CC := 'C_G(_).
-have sCCG: CC \subset G := subsetIl _ _; have pCC := pgroupS sCCG pG.
-rewrite (coprime_odd_faithful_Ohm1 pCC) ?(coprimeSg sCCG) ?(oddSg sCCG) //.
- by rewrite !(normsI, norms_cent, normG).
-rewrite (subset_trans cCEA) // centS // OhmS // setIS // centS //.
-rewrite subsetI sEG /= centsC (subset_trans cCEA) // centS //.
-have cEE: abelian E := abelem_abelian abelE.
-by rewrite -{1}(Ohm1_id abelE) OhmS // subsetI sEG.
-Qed.
-
-(* This is B & G, Theorem 1.13. *)
-Theorem critical_odd gT p (G : {group gT}) :
- p.-group G -> odd #|G| -> G :!=: 1 ->
- {H : {group gT} |
- [/\ H \char G, [~: H, G] \subset 'Z(H), nil_class H <= 2, exponent H = p
- & p.-group 'C(H | [Aut G])]}.
-Proof.
-move=> pG oddG ntG; have [H krH]:= Thompson_critical pG.
-have [chH sPhiZ sGH_Z scH] := krH; have clH := critical_class2 krH.
-have sHG := char_sub chH; set D := 'Ohm_1(H)%G; exists D.
-have chD: D \char G := char_trans (Ohm_char 1 H) chH.
-have sDH: D \subset H := Ohm_sub 1 H.
-have sDG_Z: [~: D, G] \subset 'Z(D).
- rewrite subsetI commg_subl char_norm // commGC.
- apply: subset_trans (subset_trans sGH_Z _); first by rewrite commgS.
- by rewrite subIset // orbC centS.
-rewrite nil_class2 !(subset_trans (commgS D _) sDG_Z) ?(char_sub chD) {sDH}//.
-have [p_pr p_dv_G _] := pgroup_pdiv pG ntG; have odd_p := dvdn_odd p_dv_G oddG.
-split=> {chD sDG_Z}//.
- apply/prime_nt_dvdP=> //; last by rewrite exponent_Ohm1_class2 ?(pgroupS sHG).
- rewrite -dvdn1 -trivg_exponent /= Ohm1_eq1; apply: contraNneq ntG => H1.
- by rewrite -(setIidPl (cents1 G)) -{1}H1 scH H1 center1.
-apply/pgroupP=> q q_pr /Cauchy[] //= f.
-rewrite astab_ract => /setIdP[Af cDf] ofq; apply: wlog_neg => p'q.
-suffices: f \in 'C(H | [Aut G]).
- move/(mem_p_elt (critical_p_stab_Aut krH pG))/pnatP=> -> //.
- by rewrite ofq.
-rewrite astab_ract inE Af; apply/astabP=> x Hx; rewrite /= /aperm /=.
-rewrite nil_class2 in clH; have pH := pgroupS sHG pG.
-have /p_natP[i ox]: p.-elt x by apply: mem_p_elt Hx.
-have{ox}: x ^+ (p ^ i) = 1 by rewrite -ox expg_order.
-elim: i x Hx => [|[|i] IHi] x Hx xp1.
-- by rewrite [x]xp1 -(autmE Af) morph1.
-- by apply: (astabP cDf); rewrite (OhmE 1 pH) mem_gen // !inE Hx xp1 eqxx.
-have expH': {in H &, forall y z, [~ y, z] ^+ p = 1}.
- move=> y z Hy Hz; apply/eqP.
- have /setIP[_ cHyz]: [~ y, z] \in 'Z(H) by rewrite (subsetP clH) // mem_commg.
- rewrite -commXg; last exact/commute_sym/(centP cHyz).
- suffices /setIP[_ cHyp]: y ^+ p \in 'Z(H) by apply/commgP/(centP cHyp).
- rewrite (subsetP sPhiZ) // (Phi_joing pH) mem_gen // inE orbC.
- by rewrite (Mho_p_elt 1) ?(mem_p_elt pH).
-have Hfx: f x \in H.
- case/charP: chH => _ /(_ _ (injm_autm Af) (im_autm Af)) <-.
- by rewrite -{1}(autmE Af) mem_morphim // (subsetP sHG).
-set y := x^-1 * f x; set z := [~ f x, x^-1].
-have Hy: y \in H by rewrite groupM ?groupV.
-have /centerP[_ Zz]: z \in 'Z(H) by rewrite (subsetP clH) // mem_commg ?groupV.
-have fy: f y = y.
- apply: (IHi); first by rewrite groupM ?groupV.
- rewrite expMg_Rmul; try by apply: commute_sym; apply: Zz; rewrite ?groupV.
- rewrite -/z bin2odd ?odd_exp // {3}expnS -mulnA expgM expH' ?groupV //.
- rewrite expg1n mulg1 expgVn -(autmE Af) -morphX ?(subsetP sHG) //= autmE.
- rewrite IHi ?mulVg ?groupX // {2}expnS expgM -(expgM x _ p) -expnSr.
- by rewrite xp1 expg1n.
-have /eqP: (f ^+ q) x = x * y ^+ q.
- elim: (q) => [|j IHj]; first by rewrite perm1 mulg1.
- rewrite expgSr permM {}IHj -(autmE Af).
- rewrite morphM ?morphX ?groupX ?(subsetP sHG) //= autmE.
- by rewrite fy expgS mulgA mulKVg.
-rewrite -{1}ofq expg_order perm1 eq_mulVg1 mulKg -order_dvdn.
-case: (primeP q_pr) => _ dv_q /dv_q; rewrite order_eq1 -eq_mulVg1.
-case/pred2P=> // oyq; case/negP: p'q.
-by apply: (pgroupP pH); rewrite // -oyq order_dvdG.
-Qed.
-
-Section CoprimeQuotientPgroup.
-
-(* This is B & G, Lemma 1.14, which we divide in four lemmas, each one giving *)
-(* the (sub)centraliser or (sub)normaliser of a quotient by a coprime p-group *)
-(* acting on it. Note that we weaken the assumptions of B & G -- M does not *)
-(* need to be normal in G, T need not be a subgroup of G, p need not be a *)
-(* prime, and M only needs to be coprime with T. Note also that the subcenter *)
-(* quotient lemma is special case of a lemma in coprime_act. *)
-
-Variables (gT : finGroupType) (p : nat) (T M G : {group gT}).
-Hypothesis pT : p.-group T.
-Hypotheses (nMT : T \subset 'N(M)) (coMT : coprime #|M| #|T|).
-
-(* This is B & G, Lemma 1.14, for a global normaliser. *)
-Lemma coprime_norm_quotient_pgroup : 'N(T / M) = 'N(T) / M.
-Proof.
-have [-> | ntT] := eqsVneq T 1; first by rewrite quotient1 !norm1 quotientT.
-have [p_pr _ [m oMpm]] := pgroup_pdiv pT ntT.
-apply/eqP; rewrite eqEsubset morphim_norms // andbT; apply/subsetP=> Mx.
-case: (cosetP Mx) => x Nx ->{Mx} nTqMx.
-have sylT: p.-Sylow(M <*> T) T.
- rewrite /pHall pT -divgS joing_subr //= norm_joinEr ?coprime_cardMg //.
- rewrite mulnK // ?p'natE -?prime_coprime // coprime_sym.
- by rewrite -(@coprime_pexpr m.+1) -?oMpm.
-have sylTx: p.-Sylow(M <*> T) (T :^ x).
- have nMTx: x \in 'N(M <*> T).
- rewrite norm_joinEr // inE -quotientSK ?conj_subG ?mul_subG ?normG //.
- by rewrite quotientJ // quotientMidl (normP nTqMx).
- by rewrite pHallE /= -{1}(normP nMTx) conjSg cardJg -pHallE.
-have{sylT sylTx} [ay] := Sylow_trans sylT sylTx.
-rewrite /= joingC norm_joinEl //; case/imset2P=> a y Ta.
-rewrite -groupV => My ->{ay} defTx; rewrite -(coset_kerr x My).
-rewrite mem_morphim //; first by rewrite groupM // (subsetP (normG M)).
-by rewrite inE !(conjsgM, defTx) conjsgK conjGid.
-Qed.
-
-(* This is B & G, Lemma 1.14, for a global centraliser. *)
-Lemma coprime_cent_quotient_pgroup : 'C(T / M) = 'C(T) / M.
-Proof.
-symmetry; rewrite -quotientInorm -quotientMidl -['C(T / M)]cosetpreK.
-congr (_ / M); set Cq := _ @*^-1 _; set C := 'N_('C(T))(M).
-suffices <-: 'N_Cq(T) = C.
- rewrite setIC group_modl ?sub_cosetpre //= -/Cq; apply/setIidPr.
- rewrite -quotientSK ?subsetIl // cosetpreK.
- by rewrite -coprime_norm_quotient_pgroup cent_sub.
-apply/eqP; rewrite eqEsubset subsetI -sub_quotient_pre ?subsetIr //.
-rewrite quotientInorm quotient_cents //= andbC subIset ?cent_sub //=.
-have nMC': 'N_Cq(T) \subset 'N(M) by rewrite subIset ?subsetIl.
-rewrite subsetI nMC' andbT (sameP commG1P trivgP) /=.
-rewrite -(coprime_TIg coMT) subsetI commg_subr subsetIr andbT.
-by rewrite -quotient_cents2 ?sub_quotient_pre ?subsetIl.
-Qed.
-
-Hypothesis sMG : M \subset G.
-
-(* This is B & G, Lemma 1.14, for a local normaliser. *)
-Lemma coprime_subnorm_quotient_pgroup : 'N_(G / M)(T / M) = 'N_G(T) / M.
-Proof. by rewrite quotientGI -?coprime_norm_quotient_pgroup. Qed.
-
-(* This is B & G, Lemma 1.14, for a local centraliser. *)
-Lemma coprime_subcent_quotient_pgroup : 'C_(G / M)(T / M) = 'C_G(T) / M.
-Proof. by rewrite quotientGI -?coprime_cent_quotient_pgroup. Qed.
-
-End CoprimeQuotientPgroup.
-
-Section Constrained.
-
-Variables (gT : finGroupType) (p : nat) (G : {group gT}).
-
-(* This is B & G, Proposition 1.15a (Lemma 1.2.3 of P. Hall & G. Higman). *)
-Proposition solvable_p_constrained : solvable G -> p.-constrained G.
-Proof.
-move=> solG P sylP; have [sPO pP _] := and3P sylP; pose K := 'O_p^'(G).
-have nKG: G \subset 'N(K) by rewrite normal_norm ?pcore_normal.
-have nKC: 'C_G(P) \subset 'N(K) by rewrite subIset ?nKG.
-rewrite -(quotientSGK nKC) //; last first.
- by rewrite /= -pseries1 (pseries_sub_catl [::_]).
-apply: subset_trans (quotient_subcent _ _ _) _; rewrite /= -/K.
-suffices ->: P / K = 'O_p(G / K).
- rewrite quotient_pseries2 -Fitting_eq_pcore ?trivg_pcore_quotient // -/K.
- by rewrite cent_sub_Fitting ?morphim_sol.
-apply/eqP; rewrite eqEcard -(part_pnat_id (pcore_pgroup _ _)).
-have sylPK: p.-Sylow('O_p(G / K)) (P / K).
- rewrite -quotient_pseries2 morphim_pHall //.
- exact: subset_trans (subset_trans sPO (pseries_sub _ _)) nKG.
-by rewrite -(card_Hall sylPK) leqnn -quotient_pseries2 quotientS.
-Qed.
-
-(* This is Gorenstein, Proposition 8.1.3. *)
-Proposition p_stable_abelian_constrained :
- p.-constrained G -> p.-stable G -> p.-abelian_constrained G.
-Proof.
-move=> constrG stabG P A sylP cAA /andP[sAP nAP].
-have [sPG pP _] := and3P sylP; have sAG := subset_trans sAP sPG.
-set K2 := 'O_{p^', p}(G); pose K1 := 'O_p^'(G); pose Q := P :&: K2.
-have sQG: Q \subset G by rewrite subIset ?sPG.
-have nK1G: G \subset 'N(K1) by rewrite normal_norm ?pcore_normal.
-have nsK2G: K2 <| G := pseries_normal _ _; have [sK2G nK2G] := andP nsK2G.
-have sylQ: p.-Sylow(K2) Q by rewrite /Q setIC (Sylow_setI_normal nsK2G).
-have defK2: K1 * Q = K2.
- have sK12: K1 \subset K2 by rewrite /K1 -pseries1 (pseries_sub_catl [::_]).
- apply/eqP; rewrite eqEsubset mulG_subG /= sK12 subsetIr /=.
- rewrite -quotientSK ?(subset_trans sK2G) //= quotientIG //= -/K1 -/K2.
- rewrite subsetI subxx andbT quotient_pseries2.
- by rewrite pcore_sub_Hall // morphim_pHall // ?(subset_trans sPG).
-have{cAA} rQAA_1: [~: Q, A, A] = 1.
- by apply/commG1P; apply: subset_trans cAA; rewrite commg_subr subIset // nAP.
-have nK2A := subset_trans sAG nK2G.
-have sAN: A \subset 'N_G(Q) by rewrite subsetI sAG normsI // normsG.
-have{stabG rQAA_1 defK2 sQG} stabA: A / 'C_G(Q) \subset 'O_p('N_G(Q) / 'C_G(Q)).
- apply: stabG; rewrite //= /psubgroup -/Q ?sAN ?(pgroupS _ pP) ?subsetIl //.
- by rewrite defK2 pseries_normal.
-rewrite -quotient_sub1 //= -/K2 -(setIidPr sAN).
-have nK2N: 'N_G(Q) \subset 'N(K2) by rewrite subIset ?nK2G.
-rewrite -[_ / _](morphim_restrm nK2N); set qK2 := restrm _ _.
-have{constrG} fqKp: 'ker (coset 'C_G(Q)) \subset 'ker qK2.
- by rewrite ker_restrm !ker_coset subsetI subcent_sub constrG.
-rewrite -(morphim_factm fqKp (subcent_norm _ _)) -(quotientE A _).
-apply: subset_trans {stabA}(morphimS _ stabA) _.
-apply: subset_trans (morphim_pcore _ _ _) _.
-rewrite morphim_factm morphim_restrm setIid -quotientE.
-rewrite /= -quotientMidl /= -/K2 (Frattini_arg _ sylQ) ?pseries_normal //.
-by rewrite -quotient_pseries //= (pseries_rcons_id [::_]) trivg_quotient.
-Qed.
-
-End Constrained.
-
-(* This is B & G, Proposition 1.15b (due to D. Goldschmith). *)
-Proposition p'core_cent_pgroup gT p (G R : {group gT}) :
- p.-subgroup(G) R -> solvable G -> 'O_p^'('C_G(R)) \subset 'O_p^'(G).
-Proof.
-case/andP=> sRG pR solG.
-without loss p'G1: gT G R sRG pR solG / 'O_p^'(G) = 1.
- have nOG_CR: 'C_G(R) \subset 'N('O_p^'(G)) by rewrite subIset ?gFnorm.
- move=> IH; rewrite -quotient_sub1 ?gFsub_trans //.
- apply: subset_trans (morphimF _ _ nOG_CR) _; rewrite /= -quotientE.
- rewrite -(coprime_subcent_quotient_pgroup pR) ?pcore_sub //; first 1 last.
- - by rewrite (subset_trans sRG) ?gFnorm.
- - by rewrite coprime_sym (pnat_coprime _ (pcore_pgroup _ _)).
- have p'Gq1 : 'O_p^'(G / 'O_p^'(G)) = 1 := trivg_pcore_quotient p^' G.
- by rewrite -p'Gq1 IH ?morphimS ?morphim_pgroup ?morphim_sol.
-set M := 'O_p^'('C_G(R)); pose T := 'O_p(G).
-have /subsetIP[sMG cMR]: M \subset 'C_G(R) by apply: pcore_sub.
-have [p'M pT]: p^'.-group M /\ p.-group T by rewrite !pcore_pgroup.
-have nRT: R \subset 'N(T) by rewrite (subset_trans sRG) ?gFnorm.
-have pRT: p.-group (R <*> T).
- rewrite -(pquotient_pgroup pT) ?join_subG ?nRT ?normG //=.
- by rewrite norm_joinEl // quotientMidr morphim_pgroup.
-have nRT_M: M \subset 'N(R <*> T).
- by rewrite normsY ?(cents_norm cMR) // (subset_trans sMG) ?gFnorm.
-have coRT_M: coprime #|R <*> T| #|M| := pnat_coprime pRT p'M.
-have cMcR: 'C_(R <*> T)(R) \subset 'C(M).
- apply/commG1P; apply/trivgP; rewrite -(coprime_TIg coRT_M) subsetI commg_subr.
- rewrite (subset_trans (commSg _ (subsetIl _ _))) ?commg_subl //= -/M.
- by apply: subset_trans (gFnorm _ _); rewrite setSI // join_subG sRG pcore_sub.
-have cRT_M: M \subset 'C(R <*> T).
- rewrite coprime_nil_faithful_cent_stab ?(pgroup_nil pRT) //= -/M.
- rewrite subsetI subsetIl (subset_trans _ cMcR) // ?setIS ?centS //.
- by rewrite subsetI joing_subl centsC.
-have sMT: M \subset T.
- have defT: 'F(G) = T := Fitting_eq_pcore p'G1.
- rewrite -defT (subset_trans _ (cent_sub_Fitting solG)) // defT subsetI sMG.
- by rewrite (subset_trans cRT_M) // centY subsetIr.
-by rewrite -(setIidPr sMT) p'G1 coprime_TIg // (pnat_coprime pT).
-Qed.
-
-(* This is B & G, Proposition 1.16, second assertion. Contrary to the text, *)
-(* we derive this directly, rather than by induction on the first, because *)
-(* this is actually how the proof is done in Gorenstein. Note that the non *)
-(* cyclic assumption for A is not needed here. *)
-Proposition coprime_abelian_gen_cent gT (A G : {group gT}) :
- abelian A -> A \subset 'N(G) -> coprime #|G| #|A| ->
- <<\bigcup_(B : {group gT} | cyclic (A / B) && (B <| A)) 'C_G(B)>> = G.
-Proof.
-move=> abelA nGA coGA; symmetry; move: {2}_.+1 (ltnSn #|G|) => n.
-elim: n gT => // n IHn gT in A G abelA nGA coGA *; rewrite ltnS => leGn.
-without loss nilG: G nGA coGA leGn / nilpotent G.
- move=> {IHn} IHn; apply/eqP; rewrite eqEsubset gen_subG.
- apply/andP; split; last by apply/bigcupsP=> B _; apply: subsetIl.
- pose T := [set P : {group gT} | Sylow G P & A \subset 'N(P)].
- rewrite -{1}(@Sylow_transversal_gen _ T G) => [|P | p _]; first 1 last.
- - by rewrite inE -!andbA; case/and4P.
- - have [//|P sylP nPA] := sol_coprime_Sylow_exists p (abelian_sol abelA) nGA.
- by exists P; rewrite ?inE ?(p_Sylow sylP).
- rewrite gen_subG; apply/bigcupsP=> P {T}/setIdP[/SylowP[p _ sylP] nPA].
- have [sPG pP _] := and3P sylP.
- rewrite (IHn P) ?(pgroup_nil pP) ?(coprimeSg sPG) ?genS //.
- by apply/bigcupsP=> B cycBq; rewrite (bigcup_max B) ?setSI.
- by rewrite (leq_trans (subset_leq_card sPG)).
-apply/eqP; rewrite eqEsubset gen_subG.
-apply/andP; split; last by apply/bigcupsP=> B _; apply: subsetIl.
-have [Z1 | ntZ] := eqsVneq 'Z(G) 1.
- by rewrite (TI_center_nil _ (normal_refl G)) ?Z1 ?(setIidPr _) ?sub1G.
-have{ntZ} [M /= minM] := minnormal_exists ntZ (gFnorm_trans _ nGA).
-rewrite subsetI centsC => /andP[sMG /cents_norm nMG].
-have coMA := coprimeSg sMG coGA; have{nilG} solG := nilpotent_sol nilG.
-have [nMA ntM abelM] := minnormal_solvable minM sMG solG.
-set GC := <<_>>; have sMGC: M \subset GC.
- rewrite sub_gen ?(bigcup_max 'C_A(M)%G) //=; last first.
- by rewrite subsetI sMG centsC subsetIr.
- case/is_abelemP: abelM => p _ abelM; rewrite -(rker_abelem abelM ntM nMA).
- rewrite rker_normal -(setIidPl (quotient_abelian _ _)) ?center_kquo_cyclic //.
- exact/abelem_mx_irrP.
-rewrite -(quotientSGK nMG sMGC).
-have: A / M \subset 'N(G / M) by rewrite morphim_norms.
-move/IHn->; rewrite ?morphim_abelian ?coprime_morph {IHn}//; first 1 last.
- by rewrite (leq_trans _ leGn) ?ltn_quotient.
-rewrite gen_subG; apply/bigcupsP=> Bq; rewrite andbC => /andP[].
-have: M :&: A = 1 by rewrite coprime_TIg.
-move/(quotient_isom nMA); case/isomP=> /=; set qM := restrm _ _ => injqM <-.
-move=> nsBqA; have sBqA := normal_sub nsBqA.
-rewrite -(morphpreK sBqA) /= -/qM; set B := qM @*^-1 Bq.
-move: nsBqA; rewrite -(morphpre_normal sBqA) ?injmK //= -/B => nsBA.
-rewrite -(morphim_quotm _ nsBA) /= -/B injm_cyclic ?injm_quotm //= => cycBA.
-rewrite morphim_restrm -quotientE morphpreIdom -/B; have sBA := normal_sub nsBA.
-rewrite -coprime_quotient_cent ?(coprimegS sBA, subset_trans sBA) //= -/B.
-by rewrite quotientS ?sub_gen // (bigcup_max [group of B]) ?cycBA.
-Qed.
-
-(* B & G, Proposition 1.16, first assertion. *)
-Proposition coprime_abelian_gen_cent1 gT (A G : {group gT}) :
- abelian A -> ~~ cyclic A -> A \subset 'N(G) -> coprime #|G| #|A| ->
- <<\bigcup_(a in A^#) 'C_G[a]>> = G.
-Proof.
-move=> abelA ncycA nGA coGA.
-apply/eqP; rewrite eq_sym eqEsubset /= gen_subG.
-apply/andP; split; last by apply/bigcupsP=> B _; apply: subsetIl.
-rewrite -{1}(coprime_abelian_gen_cent abelA nGA) ?genS //.
-apply/bigcupsP=> B; have [-> | /trivgPn[a Ba n1a]] := eqsVneq B 1.
- by rewrite injm_cyclic ?coset1_injm ?norms1 ?(negbTE ncycA).
-case/and3P=> _ sBA _; rewrite (bigcup_max a) ?inE ?n1a ?(subsetP sBA) //.
-by rewrite setIS // -cent_set1 centS // sub1set.
-Qed.
-
-Section Focal_Subgroup.
-
-Variables (gT : finGroupType) (G S : {group gT}) (p : nat).
-Hypothesis sylS : p.-Sylow(G) S.
-
-Import finalg FiniteModule GRing.Theory.
-
-(* This is B & G, Theorem 1.17 ("Focal Subgroup Theorem", D. G. Higman), also *)
-(* Gorenstein Theorem 7.3.4 and Aschbacher (37.4). *)
-Theorem focal_subgroup_gen :
- S :&: G^`(1) = <<[set [~ x, u] | x in S, u in G & x ^ u \in S]>>.
-Proof.
-set K := <<_>>; set G' := G^`(1); have [sSG coSiSG] := andP (pHall_Hall sylS).
-apply/eqP; rewrite eqEsubset gen_subG andbC; apply/andP; split.
- apply/subsetP=> _ /imset2P[x u Sx /setIdP[Gu Sxu] ->].
- by rewrite inE groupM ?groupV // mem_commg // (subsetP sSG).
-apply/subsetP=> g /setIP[Sg G'g]; have Gg := subsetP sSG g Sg.
-have nKS: S \subset 'N(K).
- rewrite norms_gen //; apply/subsetP=> y Sy; rewrite inE.
- apply/subsetP=> _ /imsetP[_ /imset2P[x u Sx /setIdP[Gu Sxu] ->] ->].
- have Gy: y \in G := subsetP sSG y Sy.
- by rewrite conjRg mem_imset2 ?groupJ // inE -conjJg /= 2?groupJ.
-set alpha := restrm_morphism nKS (coset_morphism K).
-have alphim: (alpha @* S) = (S / K) by rewrite morphim_restrm setIid.
-have abelSK : abelian (alpha @* S).
- rewrite alphim sub_der1_abelian // genS //.
- apply/subsetP=> _ /imset2P[x y Sx Sy ->].
- by rewrite mem_imset2 // inE (subsetP sSG) ?groupJ.
-set ker_trans := 'ker (transfer G abelSK).
-have G'ker : G' \subset ker_trans.
- rewrite gen_subG; apply/subsetP=> h; case/imset2P=> h1 h2 Gh1 Gh2 ->{h}.
- by rewrite !inE groupR // morphR //; apply/commgP; apply: addrC.
-have transg0: transfer G abelSK g = 0%R.
- by move/kerP: (subsetP G'ker g G'g); apply.
-have partX := rcosets_cycle_partition sSG Gg.
-have trX := transversalP partX; set X := transversal _ _ in trX.
-have /and3P[_ sXG _] := trX.
-have gGSeq0: (fmod abelSK (alpha g) *+ #|G : S| = 0)%R.
- rewrite -transg0 (transfer_cycle_expansion sSG abelSK Gg trX).
- rewrite -(sum_index_rcosets_cycle sSG Gg trX) -sumrMnr /restrm.
- apply: eq_bigr=> x Xx; rewrite -[(_ *+ _)%R]morphX ?mem_morphim //=.
- rewrite -morphX //= /restrm; congr fmod.
- apply/rcoset_kercosetP; rewrite /= -/K.
- - by rewrite (subsetP nKS) ?groupX.
- - rewrite (subsetP nKS) // conjgE invgK mulgA -mem_rcoset.
- exact: mulg_exp_card_rcosets.
- rewrite mem_rcoset -{1}[g ^+ _]invgK -conjVg -commgEl mem_gen ?mem_imset2 //.
- by rewrite groupV groupX.
- rewrite inE conjVg !groupV (subsetP sXG) //= conjgE invgK mulgA -mem_rcoset.
- exact: mulg_exp_card_rcosets.
-move: (congr_fmod gGSeq0).
-rewrite fmval0 morphX ?inE //= fmodK ?mem_morphim // /restrm /=.
-move/((congr1 (expgn^~ (expg_invn (S / K) #|G : S|))) _).
-rewrite expg1n expgK ?mem_quotient ?coprime_morphl // => Kg1.
-by rewrite coset_idr ?(subsetP nKS).
-Qed.
-
-(* This is B & G, Theorem 1.18 (due to Burnside). *)
-Theorem Burnside_normal_complement :
- 'N_G(S) \subset 'C(S) -> 'O_p^'(G) ><| S = G.
-Proof.
-move=> cSN; set K := 'O_p^'(G); have [sSG pS _] := and3P sylS.
-have /andP[sKG nKG]: K <| G by apply: pcore_normal.
-have{nKG} nKS := subset_trans sSG nKG.
-have p'K: p^'.-group K by apply: pcore_pgroup.
-have{pS p'K} tiKS: K :&: S = 1 by rewrite setIC coprime_TIg ?(pnat_coprime pS).
-suffices{tiKS nKS} hallK: p^'.-Hall(G) K.
- rewrite sdprodE //= -/K; apply/eqP; rewrite eqEcard ?mul_subG //=.
- by rewrite TI_cardMg //= (card_Hall sylS) (card_Hall hallK) mulnC partnC.
-pose G' := G^`(1); have nsG'G : G' <| G by rewrite der_normalS.
-suffices{K sKG} p'G': p^'.-group G'.
- have nsG'K: G' <| K by rewrite (normalS _ sKG) ?pcore_max.
- rewrite -(pquotient_pHall p'G') -?pquotient_pcore //= -/G'.
- by rewrite nilpotent_pcore_Hall ?abelian_nil ?der_abelian.
-suffices{nsG'G} tiSG': S :&: G' = 1.
- have sylG'S : p.-Sylow(G') (G' :&: S) by rewrite (Sylow_setI_normal _ sylS).
- rewrite /pgroup -[#|_|](partnC p) ?cardG_gt0 // -{sylG'S}(card_Hall sylG'S).
- by rewrite /= setIC tiSG' cards1 mul1n part_pnat.
-apply/trivgP; rewrite /= focal_subgroup_gen ?(p_Sylow sylS) // gen_subG.
-apply/subsetP=> _ /imset2P[x u Sx /setIdP[Gu Sxu] ->].
-have cSS y: y \in S -> S \subset 'C_G[y].
- rewrite subsetI sSG -cent_set1 centsC sub1set; apply: subsetP.
- by apply: subset_trans cSN; rewrite subsetI sSG normG.
-have{cSS} [v]: exists2 v, v \in 'C_G[x ^ u | 'J] & S :=: (S :^ u) :^ v.
- have sylSu : p.-Sylow(G) (S :^ u) by rewrite pHallJ.
- have [sSC sCG] := (cSS _ Sxu, subsetIl G 'C[x ^ u]).
- rewrite astab1J; apply: (@Sylow_trans p); apply: pHall_subl sCG _ => //=.
- by rewrite -conjg_set1 normJ -(conjGid Gu) -conjIg conjSg cSS.
-rewrite in_set1 -conjsgM => /setIP[Gv /astab1P cx_uv] nSuv.
-apply/conjg_fixP; rewrite -cx_uv /= -conjgM; apply: astabP Sx.
-by rewrite astabJ (subsetP cSN) // !inE -nSuv groupM /=.
-Qed.
-
-(* This is B & G, Corollary 1.19(a). *)
-Corollary cyclic_Sylow_tiVsub_der1 :
- cyclic S -> S :&: G^`(1) = 1 \/ S \subset G^`(1).
-Proof.
-move=> cycS; have [sSG pS _] := and3P sylS.
-have nsSN: S <| 'N_G(S) by rewrite normalSG.
-have hallSN: Hall 'N_G(S) S.
- by apply: pHall_Hall (pHall_subl _ _ sylS); rewrite ?subsetIl ?normal_sub.
-have /splitsP[K /complP[tiSK /= defN]] := SchurZassenhaus_split hallSN nsSN.
-have sKN: K \subset 'N_G(S) by rewrite -defN mulG_subr.
-have [sKG nSK] := subsetIP sKN.
-have coSK: coprime #|S| #|K|.
- by case/andP: hallSN => sSN; rewrite -divgS //= -defN TI_cardMg ?mulKn.
-have:= coprime_abelian_cent_dprod nSK coSK (cyclic_abelian cycS).
-case/(cyclic_pgroup_dprod_trivg pS cycS) => [[_ cSK]|[_ <-]]; last first.
- by right; rewrite commgSS.
-have cSN: 'N_G(S) \subset 'C(S).
- by rewrite -defN mulG_subG -abelianE cyclic_abelian // centsC -cSK subsetIr.
-have /sdprodP[_ /= defG _ _] := Burnside_normal_complement cSN.
-set Q := 'O_p^'(G) in defG; have nQG: G \subset 'N(Q) := gFnorm _ _.
-left; rewrite coprime_TIg ?(pnat_coprime pS) //.
-apply: pgroupS (pcore_pgroup _ G); rewrite /= -/Q.
-rewrite -quotient_sub1 ?gFsub_trans ?quotientR //= -/Q.
-rewrite -defG quotientMidl (sameP trivgP commG1P) -abelianE.
-by rewrite morphim_abelian ?cyclic_abelian.
-Qed.
-
-End Focal_Subgroup.
-
-(* This is B & G, Corollary 1.19(b). *)
-Corollary Zgroup_der1_Hall gT (G : {group gT}) :
- Zgroup G -> Hall G G^`(1).
-Proof.
-move=> ZgG; set G' := G^`(1).
-rewrite /Hall der_sub coprime_sym coprime_pi' ?cardG_gt0 //=.
-apply/pgroupP=> p p_pr pG'; have [P sylP] := Sylow_exists p G.
-have cycP: cyclic P by have:= forallP ZgG P; rewrite (p_Sylow sylP).
-case: (cyclic_Sylow_tiVsub_der1 sylP cycP) => [tiPG' | sPG'].
- have: p.-Sylow(G') (P :&: G').
- by rewrite setIC (Sylow_setI_normal _ sylP) ?gFnormal.
- move/card_Hall/eqP; rewrite /= tiPG' cards1 eq_sym.
- by rewrite partn_eq1 ?cardG_gt0 // p'natE ?pG'.
-rewrite inE /= mem_primes p_pr indexg_gt0 -?p'natE // -partn_eq1 //.
-have sylPq: p.-Sylow(G / G') (P / G') by rewrite morphim_pHall ?normsG.
-rewrite -card_quotient ?gFnorm // -(card_Hall sylPq) -trivg_card1.
-by rewrite /= -quotientMidr mulSGid ?trivg_quotient.
-Qed.
-
-(* This is Aschbacher (39.2). *)
-Lemma cyclic_pdiv_normal_complement gT (S G : {group gT}) :
- (pdiv #|G|).-Sylow(G) S -> cyclic S -> exists H : {group gT}, H ><| S = G.
-Proof.
-set p := pdiv _ => sylS cycS; have cSS := cyclic_abelian cycS.
-exists 'O_p^'(G)%G; apply: Burnside_normal_complement => //.
-have [-> | ntS] := eqsVneq S 1; first apply: cents1.
-have [sSG pS p'iSG] := and3P sylS; have [pr_p _ _] := pgroup_pdiv pS ntS.
-rewrite -['C(S)]mulg1 -ker_conj_aut -morphimSK ?subsetIr // setIC morphimIdom.
-set A_G := _ @* _; pose A := Aut S.
-have [_ [_ [cAA _ oAp' _]] _] := cyclic_pgroup_Aut_structure pS cycS ntS.
-have{cAA cSS p'iSG} /setIidPl <-: A_G \subset 'O_p^'(A).
- rewrite pcore_max -?sub_abelian_normal ?Aut_conj_aut //=.
- apply: pnat_dvd p'iSG; rewrite card_morphim ker_conj_aut /= setIC.
- have sSN: S \subset 'N_G(S) by rewrite subsetI sSG normG.
- by apply: dvdn_trans (indexSg sSN (subsetIl G 'N(S))); apply: indexgS.
-rewrite coprime_TIg ?sub1G // coprime_morphl // coprime_sym coprime_pi' //.
-apply/pgroupP=> q pr_q q_dv_G; rewrite !inE mem_primes gtnNdvd ?andbF // oAp'.
-by rewrite prednK ?prime_gt0 ?pdiv_min_dvd ?prime_gt1.
-Qed.
-
-(* This is Aschbacher (39.3). *)
-Lemma Zgroup_metacyclic gT (G : {group gT}) : Zgroup G -> metacyclic G.
-Proof.
-elim: {G}_.+1 {-2}G (ltnSn #|G|) => // n IHn G; rewrite ltnS => leGn ZgG.
-have{n IHn leGn} solG: solvable G.
- have [-> | ntG] := eqsVneq G 1; first apply: solvable1.
- have [S sylS] := Sylow_exists (pdiv #|G|) G.
- have cycS: cyclic S := forall_inP ZgG S (p_Sylow sylS).
- have [H defG] := cyclic_pdiv_normal_complement sylS cycS.
- have [nsHG _ _ _ _] := sdprod_context defG; rewrite (series_sol nsHG) andbC.
- rewrite -(isog_sol (sdprod_isog defG)) (abelian_sol (cyclic_abelian cycS)).
- rewrite metacyclic_sol ?IHn ?(ZgroupS _ ZgG) ?normal_sub //.
- rewrite (leq_trans _ leGn) // -(sdprod_card defG) ltn_Pmulr // cardG_gt1.
- by rewrite -rank_gt0 (rank_Sylow sylS) p_rank_gt0 pi_pdiv cardG_gt1.
-pose K := 'F(G)%G; apply/metacyclicP; exists K.
-have nsKG: K <| G := Fitting_normal G; have [sKG nKG] := andP nsKG.
-have cycK: cyclic K by rewrite nil_Zgroup_cyclic ?Fitting_nil ?(ZgroupS sKG).
-have cKK: abelian K := cyclic_abelian cycK.
-have{solG cKK} defK: 'C_G(K) = K.
- by apply/setP/subset_eqP; rewrite cent_sub_Fitting // subsetI sKG.
-rewrite cycK nil_Zgroup_cyclic ?morphim_Zgroup ?abelian_nil //.
-rewrite -defK -ker_conj_aut (isog_abelian (first_isog_loc _ _)) //.
-exact: abelianS (Aut_conj_aut K G) (Aut_cyclic_abelian cycK).
-Qed.
-
-(* This is B & G, Theorem 1.20 (Maschke's Theorem) for internal action on *)
-(* elementary abelian subgroups; a more general case, for linear *)
-(* represenations on matrices, can be found in mxrepresentation.v. *)
-Theorem Maschke_abelem gT p (G V U : {group gT}) :
- p.-abelem V -> p^'.-group G -> U \subset V ->
- G \subset 'N(V) -> G \subset 'N(U) ->
- exists2 W : {group gT}, U \x W = V & G \subset 'N(W).
-Proof.
-move=> pV p'G sUV nVG nUG.
-have splitU: [splits V, over U] := abelem_splits pV sUV.
-case/and3P: pV => pV abV; have cUV := subset_trans sUV abV.
-have sVVG := joing_subl V G.
-have{nUG} nUVG: U <| V <*> G.
- by rewrite /(U <| _) join_subG (subset_trans sUV) // cents_norm // centsC.
-rewrite -{nUVG}(Gaschutz_split nUVG) ?(abelianS sUV) // in splitU; last first.
- rewrite -divgS ?joing_subl //= norm_joinEr //.
- have coVG: coprime #|V| #|G| := pnat_coprime pV p'G.
- by rewrite coprime_cardMg // mulnC mulnK // (coprimeSg sUV).
-case/splitsP: splitU => WG /complP[tiUWG /= defVG].
-exists (WG :&: V)%G.
- rewrite dprodE; last by rewrite setIA tiUWG (setIidPl _) ?sub1G.
- by rewrite group_modl // defVG (setIidPr _).
- by rewrite subIset // orbC centsC cUV.
-rewrite (subset_trans (joing_subr V _)) // -defVG mul_subG //.
- by rewrite cents_norm ?(subset_trans cUV) ?centS ?subsetIr.
-rewrite normsI ?normG // (subset_trans (mulG_subr U _)) //.
-by rewrite defVG join_subG normG.
-Qed.
-
-Section Plength1.
-
-Variables (gT : finGroupType) (p : nat).
-Implicit Types G H : {group gT}.
-
-(* Some basic properties of p.-length_1 that are direct consequences of their *)
-(* definition using p-series. *)
-
-Lemma plength1_1 : p.-length_1 (1 : {set gT}).
-Proof. by rewrite -[_ 1]subG1 pseries_sub. Qed.
-
-Lemma plength1_p'group G : p^'.-group G -> p.-length_1 G.
-Proof.
-move=> p'G; rewrite [p.-length_1 G]eqEsubset pseries_sub /=.
-by rewrite -{1}(pcore_pgroup_id p'G) -pseries1 pseries_sub_catl.
-Qed.
-
-Lemma plength1_nonprime G : ~~ prime p -> p.-length_1 G.
-Proof.
-move=> not_p_pr; rewrite plength1_p'group // p'groupEpi mem_primes.
-by rewrite (negPf not_p_pr).
-Qed.
-
-Lemma plength1_pcore_quo_Sylow G (Gb := G / 'O_p^'(G)) :
- p.-length_1 G = p.-Sylow(Gb) 'O_p(Gb).
-Proof.
-rewrite /plength_1 eqEsubset pseries_sub /=.
-rewrite (pseries_rcons _ [:: _; _]) -sub_quotient_pre ?gFnorm //=.
-rewrite /pHall pcore_sub pcore_pgroup /= -card_quotient ?gFnorm //=.
-rewrite -quotient_pseries2 /= {}/Gb -(pseries1 _ G).
-rewrite (card_isog (third_isog _ _ _)) ?pseries_normal ?pseries_sub_catl //.
-apply/idP/idP=> p'Gbb; last by rewrite (pcore_pgroup_id p'Gbb).
-exact: pgroupS p'Gbb (pcore_pgroup _ _).
-Qed.
-
-Lemma plength1_pcore_Sylow G :
- 'O_p^'(G) = 1 -> p.-length_1 G = p.-Sylow(G) 'O_p(G).
-Proof.
-move=> p'G1; rewrite plength1_pcore_quo_Sylow -quotient_pseries2.
-by rewrite p'G1 pseries_pop2 // pquotient_pHall ?normal1 ?pgroup1.
-Qed.
-
-(* This is the characterization given in Section 10 of B & G, p. 75, just *)
-(* before Theorem 10.6. *)
-Lemma plength1_pseries2_quo G : p.-length_1 G = p^'.-group (G / 'O_{p^', p}(G)).
-Proof.
-rewrite /plength_1 eqEsubset pseries_sub lastI pseries_rcons /=.
-rewrite -sub_quotient_pre ?gFnorm //.
-by apply/idP/idP=> pl1G; rewrite ?pcore_pgroup_id ?(pgroupS pl1G) ?pcore_pgroup.
-Qed.
-
-(* This is B & G, Lemma 1.21(a). *)
-Lemma plength1S G H : H \subset G -> p.-length_1 G -> p.-length_1 H.
-Proof.
-rewrite /plength_1 => sHG pG1; rewrite eqEsubset pseries_sub.
-by apply: subset_trans (pseriesS _ sHG); rewrite (eqP pG1) (setIidPr _).
-Qed.
-
-Lemma plength1_quo G H : p.-length_1 G -> p.-length_1 (G / H).
-Proof.
-rewrite /plength_1 => pG1; rewrite eqEsubset pseries_sub.
-by rewrite -{1}(eqP pG1) morphim_pseries.
-Qed.
-
-(* This is B & G, Lemma 1.21(b). *)
-Lemma p'quo_plength1 G H :
- H <| G -> p^'.-group H -> p.-length_1 (G / H) = p.-length_1 G.
-Proof.
-rewrite /plength_1 => nHG p'H; apply/idP/idP; last exact: plength1_quo.
-move=> pGH1; rewrite eqEsubset pseries_sub.
-have nOG: 'O_{p^'}(G) <| G by apply: pseries_normal.
-rewrite -(quotientSGK (normal_norm nOG)) ?(pseries_sub_catl [:: _]) //.
-have [|f f_inj im_f] := third_isom _ nHG nOG.
- by rewrite /= pseries1 pcore_max.
-rewrite (quotient_pseries_cat [:: _]) -{}im_f //= -injmF //.
-rewrite {f f_inj}morphimS // pseries1 -pquotient_pcore // -pseries1 /=.
-by rewrite -quotient_pseries_cat /= (eqP pGH1).
-Qed.
-
-(* This is B & G, Lemma 1.21(c). *)
-Lemma pquo_plength1 G H :
- H <| G -> p.-group H -> 'O_p^'(G / H) = 1->
- p.-length_1 (G / H) = p.-length_1 G.
-Proof.
-rewrite /plength_1 => nHG pH trO; apply/idP/idP; last exact: plength1_quo.
-rewrite (pseries_pop _ trO) => pGH1; rewrite eqEsubset pseries_sub /=.
-rewrite pseries_pop //; last first.
- apply/eqP; rewrite -subG1; have <-: H :&: 'O_p^'(G) = 1.
- by apply: coprime_TIg; apply: pnat_coprime (pcore_pgroup _ _).
- rewrite setIC subsetI subxx -quotient_sub1.
- by rewrite -trO morphim_pcore.
- exact/gFsub_trans/normal_norm.
-have nOG: 'O_{p}(G) <| G by apply: pseries_normal.
-rewrite -(quotientSGK (normal_norm nOG)) ?(pseries_sub_catl [:: _]) //.
-have [|f f_inj im_f] := third_isom _ nHG nOG.
- by rewrite /= pseries1 pcore_max.
-rewrite (quotient_pseries [::_]) -{}im_f //= -injmF //.
-rewrite {f f_inj}morphimS // pseries1 -pquotient_pcore // -(pseries1 p) /=.
-by rewrite -quotient_pseries /= (eqP pGH1).
-Qed.
-
-Canonical p_elt_gen_group A : {group gT} :=
- Eval hnf in [group of p_elt_gen p A].
-
-(* Note that p_elt_gen could be a functor. *)
-Lemma p_elt_gen_normal G : p_elt_gen p G <| G.
-Proof.
-apply/normalP; split=> [|x Gx].
- by rewrite gen_subG; apply/subsetP=> x; rewrite inE; case/andP.
-rewrite -genJ; congr <<_>>; apply/setP=> y; rewrite mem_conjg !inE.
-by rewrite p_eltJ -mem_conjg conjGid.
-Qed.
-
-(* This is B & G, Lemma 1.21(d). *)
-Lemma p_elt_gen_length1 G :
- p.-length_1 G = p^'.-Hall(p_elt_gen p G) 'O_p^'(p_elt_gen p G).
-Proof.
-rewrite /pHall pcore_sub pcore_pgroup pnatNK /= /plength_1.
-have nUG := p_elt_gen_normal G; have [sUG nnUG]:= andP nUG.
-apply/idP/idP=> [p1G | pU].
- apply: (@pnat_dvd _ #|p_elt_gen p G : 'O_p^'(G)|).
- by rewrite -[#|_ : 'O_p^'(G)|]indexgI indexgS ?pcoreS.
- apply: (@pnat_dvd _ #|'O_p(G / 'O_{p^'}(G))|); last exact: pcore_pgroup.
- rewrite -card_quotient; last first.
- by rewrite (subset_trans sUG) // normal_norm ?pcore_normal.
- rewrite -quotient_pseries pseries1 cardSg ?morphimS //=.
- rewrite gen_subG; apply/subsetP=> x; rewrite inE; case/andP=> Gx p_x.
- have nOx: x \in 'N('O_{p^',p}(G)).
- by apply: subsetP Gx; rewrite normal_norm ?pseries_normal.
- rewrite coset_idr //; apply/eqP; rewrite -[coset _ x]expg1 -order_dvdn.
- rewrite [#[_]](@pnat_1 p) //; first exact: morph_p_elt.
- apply: mem_p_elt (pcore_pgroup _ (G / _)) _.
- by rewrite /= -quotient_pseries /= (eqP p1G); apply/morphimP; exists x.
-have nOG: 'O_{p^', p}(G) <| G by apply: pseries_normal.
-rewrite eqEsubset pseries_sub.
-rewrite -(quotientSGK (normal_norm nOG)) ?(pseries_sub_catl [:: _; _]) //=.
-rewrite (quotient_pseries [::_; _]) pcore_max //.
-rewrite /pgroup card_quotient ?normal_norm //.
-apply: pnat_dvd (indexgS G (_ : p_elt_gen p G \subset _)) _; last first.
- case p_pr: (prime p); last by rewrite p'natEpi // mem_primes p_pr.
- rewrite -card_quotient // p'natE //; apply/negP=> /Cauchy[] // Ux.
- case/morphimP=> x Nx Gx -> /= oUx_p; have:= prime_gt1 p_pr.
- rewrite -(part_pnat_id (pnat_id p_pr)) -{1}oUx_p {oUx_p} -order_constt.
- rewrite -morph_constt //= coset_id ?order1 //.
- by rewrite mem_gen // inE groupX // p_elt_constt.
-have nOU: p_elt_gen p G \subset 'N('O_{p^'}(G)).
- by rewrite (subset_trans sUG) // normal_norm ?pseries_normal.
-rewrite -(quotientSGK nOU) ?(pseries_sub_catl [:: _]) //=.
-rewrite (quotient_pseries [::_]) pcore_max ?morphim_normal //.
-rewrite /pgroup card_quotient //= pseries1; apply: pnat_dvd pU.
-by apply: indexgS; rewrite pcore_max ?pcore_pgroup // gFnormal_trans.
-Qed.
-
-End Plength1.
-
-(* This is B & G, Lemma 1.21(e). *)
-Lemma quo2_plength1 gT p (G H K : {group gT}) :
- H <| G -> K <| G -> H :&: K = 1 ->
- p.-length_1 (G / H) && p.-length_1 (G / K) = p.-length_1 G.
-Proof.
-move=> nHG nKG trHK.
-have [p_pr | p_nonpr] := boolP (prime p); last by rewrite !plength1_nonprime.
-apply/andP/idP=> [[pH1 pK1] | pG1]; last by rewrite !plength1_quo.
-pose U := p_elt_gen p G; have nU : U <| G by apply: p_elt_gen_normal.
-have exB (N : {group gT}) :
- N <| G -> p.-length_1 (G / N) ->
- exists B : {group gT},
- [/\ U \subset 'N(B),
- forall x, x \in B -> #[x] = p -> x \in N
- & forall Q : {group gT}, p^'.-subgroup(U) Q -> Q \subset B].
-- move=> nsNG; have [sNG nNG] := andP nsNG.
- rewrite p_elt_gen_length1 // (_ : p_elt_gen _ _ = U / N); last first.
- rewrite /quotient morphim_gen -?quotientE //; last first.
- by rewrite setIdE subIset ?nNG.
- congr <<_>>; apply/setP=> Nx; rewrite inE setIdE quotientGI // inE.
- apply: andb_id2l => /morphimP[x NNx Gx ->{Nx}] /=.
- apply/idP/idP=> [pNx | /morphimP[y NNy]]; last first.
- by rewrite inE => p_y ->; apply: morph_p_elt.
- rewrite -(constt_p_elt pNx) -morph_constt // mem_morphim ?groupX //.
- by rewrite inE p_elt_constt.
- have nNU: U \subset 'N(N) := subset_trans (normal_sub nU) nNG.
- have nN_UN: U <*> N \subset 'N(N) by rewrite gen_subG subUset normG nNU.
- case/(inv_quotientN _): (pcore_normal p^' [group of U <*> N / N]) => /= [|B].
- by rewrite /normal sub_gen ?subsetUr.
- rewrite /= quotientYidr //= /U => defB sNB; case/andP=> sB nB hallB.
- exists B; split=> [| x Ux p_x | Q /andP[sQU p'Q]].
- - by rewrite (subset_trans (sub_gen _) nB) ?subsetUl.
- - have nNx: x \in 'N(N) by rewrite (subsetP nN_UN) ?(subsetP sB).
- apply: coset_idr => //; rewrite -[coset N x](consttC p).
- rewrite !(constt1P _) ?mulg1 // ?p_eltNK.
- by rewrite morph_p_elt // /p_elt p_x pnat_id.
- have: coset N x \in B / N by apply/morphimP; exists x.
- by apply: mem_p_elt; rewrite /= -defB pcore_pgroup.
- rewrite -(quotientSGK (subset_trans sQU nNU) sNB).
- by rewrite -defB (sub_Hall_pcore hallB) ?quotientS ?quotient_pgroup.
-have{pH1} [A [nAU pA p'A]] := exB H nHG pH1.
-have{pK1 exB} [B [nBU pB p'B]] := exB K nKG pK1.
-rewrite p_elt_gen_length1 //; apply: normal_max_pgroup_Hall (pcore_normal _ _).
-apply/maxgroupP; split; first by rewrite /psubgroup pcore_sub pcore_pgroup.
-move=> Q p'Q sOQ; apply/eqP; rewrite eqEsubset sOQ andbT.
-apply: subset_trans (_ : U :&: (A :&: B) \subset _); last rewrite /U.
- by rewrite !subsetI p'A ?p'B //; case/andP: p'Q => ->.
-apply: pcore_max; last by rewrite /normal subsetIl !normsI ?normG.
-rewrite /pgroup p'natE //.
-apply/negP=> /Cauchy[] // x /setIP[_ /setIP[Ax Bx]] oxp.
-suff: x \in 1%G by move/set1P=> x1; rewrite -oxp x1 order1 in p_pr.
-by rewrite /= -trHK inE pA ?pB.
-Qed.
-
-(* B & G Lemma 1.22 is covered by sylow.normal_pgroup. *)
-
-(* Encapsulation of the use of the order of GL_2(p), via abelem groups. *)
-Lemma logn_quotient_cent_abelem gT p (A E : {group gT}) :
- A \subset 'N(E) -> p.-abelem E -> logn p #|E| <= 2 ->
- logn p #|A : 'C_A(E)| <= 1.
-Proof.
-move=> nEA abelE maxdimE; have [-> | ntE] := eqsVneq E 1.
- by rewrite (setIidPl (cents1 _)) indexgg logn1.
-pose rP := abelem_repr abelE ntE nEA.
-have [p_pr _ _] := pgroup_pdiv (abelem_pgroup abelE) ntE.
-have ->: 'C_A(E) = 'ker (reprGLm rP) by rewrite ker_reprGLm rker_abelem.
-rewrite -card_quotient ?ker_norm // (card_isog (first_isog _)).
-apply: leq_trans (dvdn_leq_log _ _ (cardSg (subsetT _))) _ => //.
-rewrite logn_card_GL_p ?(dim_abelemE abelE) //.
-by case: logn maxdimE; do 2?case.
-Qed.
-
-End BGsection1.
-
-Section PuigSeriesGroups.
-
-Implicit Type gT : finGroupType.
-
-Canonical Puig_succ_group gT (D E : {set gT}) := [group of 'L_[D](E)].
-
-Fact Puig_at_group_set n gT D : @group_set gT 'L_{n}(D).
-Proof. by case: n => [|n]; apply: groupP. Qed.
-
-Canonical Puig_at_group n gT D := Group (@Puig_at_group_set n gT D).
-Canonical Puig_inf_group gT (D : {set gT}) := [group of 'L_*(D)].
-Canonical Puig_group gT (D : {set gT}) := [group of 'L(D)].
-
-End PuigSeriesGroups.
-
-Notation "''L_[' G ] ( L )" := (Puig_succ_group G L) : Group_scope.
-Notation "''L_{' n } ( G )" := (Puig_at_group n G)
- (at level 8, format "''L_{' n } ( G )") : Group_scope.
-Notation "''L_*' ( G )" := (Puig_inf_group G) : Group_scope.
-Notation "''L' ( G )" := (Puig_group G) : Group_scope.
-
-(* Elementary properties of the Puig series. *)
-Section PuigBasics.
-
-Variable gT : finGroupType.
-Implicit Types (D E : {set gT}) (G H : {group gT}).
-
-Lemma Puig0 D : 'L_{0}(D) = 1. Proof. by []. Qed.
-Lemma PuigS n D : 'L_{n.+1}(D) = 'L_[D]('L_{n}(D)). Proof. by []. Qed.
-Lemma Puig_recE n D : Puig_rec n D = 'L_{n}(D). Proof. by []. Qed.
-Lemma Puig_def D : 'L(D) = 'L_[D]('L_*(D)). Proof. by []. Qed.
-
-Local Notation "D --> E" := (generated_by (norm_abelian D) E)
- (at level 70, no associativity) : group_scope.
-
-Lemma Puig_gen D E : E --> 'L_[D](E).
-Proof. by apply/existsP; exists (subgroups D). Qed.
-
-Lemma Puig_max G D E : D --> E -> E \subset G -> E \subset 'L_[G](D).
-Proof.
-case/existsP=> gE /eqP <-{E}; rewrite !gen_subG.
-move/bigcupsP=> sEG; apply/bigcupsP=> A gEA; have [_ abnA]:= andP gEA.
-by rewrite sub_gen // bigcup_sup // inE sEG.
-Qed.
-
-Lemma norm_abgenS D1 D2 E : D1 \subset D2 -> D2 --> E -> D1 --> E.
-Proof.
-move=> sD12 /exists_eqP[gE <-{E}].
-apply/exists_eqP; exists [set A in gE | norm_abelian D2 A].
-congr <<_>>; apply: eq_bigl => A; rewrite !inE.
-apply: andb_idr => /and3P[_ nAD cAA].
-by apply/andP; rewrite (subset_trans sD12).
-Qed.
-
-Lemma Puig_succ_sub G D : 'L_[G](D) \subset G.
-Proof. by rewrite gen_subG; apply/bigcupsP=> A /andP[]; rewrite inE. Qed.
-
-Lemma Puig_at_sub n G : 'L_{n}(G) \subset G.
-Proof. by case: n => [|n]; rewrite ?sub1G ?Puig_succ_sub. Qed.
-
-(* This is B & G, Lemma B.1(d), first part. *)
-Lemma Puig_inf_sub G : 'L_*(G) \subset G.
-Proof. exact: Puig_at_sub. Qed.
-
-Lemma Puig_sub G : 'L(G) \subset G.
-Proof. exact: Puig_at_sub. Qed.
-
-(* This is part of B & G, Lemma B.1(b). *)
-Lemma Puig1 G : 'L_{1}(G) = G.
-Proof.
-apply/eqP; rewrite eqEsubset Puig_at_sub; apply/subsetP=> x Gx.
-rewrite -cycle_subG sub_gen // -[<[x]>]/(gval _) bigcup_sup //=.
-by rewrite inE cycle_subG Gx /= /norm_abelian cycle_abelian sub1G.
-Qed.
-
-End PuigBasics.
-
-(* Functoriality of the Puig series. *)
-
-Fact Puig_at_cont n : GFunctor.iso_continuous (Puig_at n).
-Proof.
-elim: n => [|n IHn] aT rT G f injf; first by rewrite morphim1.
-have IHnS := Puig_at_sub n; pose func_n := [igFun by IHnS & !IHn].
-rewrite !PuigS sub_morphim_pre ?Puig_succ_sub // gen_subG; apply/bigcupsP=> A.
-rewrite inE => /and3P[sAG nAL cAA]; rewrite -sub_morphim_pre ?sub_gen //.
-rewrite -[f @* A]/(gval _) bigcup_sup // inE morphimS // /norm_abelian.
-rewrite morphim_abelian // -['L_{n}(_)](injmF func_n injf) //=.
-by rewrite morphim_norms.
-Qed.
-
-Canonical Puig_at_igFun n := [igFun by Puig_at_sub^~ n & !Puig_at_cont n].
-
-Fact Puig_inf_cont : GFunctor.iso_continuous Puig_inf.
-Proof.
-by move=> aT rT G f injf; rewrite /Puig_inf card_injm // Puig_at_cont.
-Qed.
-
-Canonical Puig_inf_igFun := [igFun by Puig_inf_sub & !Puig_inf_cont].
-
-Fact Puig_cont : GFunctor.iso_continuous Puig.
-Proof. by move=> aT rT G f injf; rewrite /Puig card_injm // Puig_at_cont. Qed.
-
-Canonical Puig_igFun := [igFun by Puig_sub & !Puig_cont].
diff --git a/mathcomp/odd_order/BGsection10.v b/mathcomp/odd_order/BGsection10.v
deleted file mode 100644
index dbe9c6b..0000000
--- a/mathcomp/odd_order/BGsection10.v
+++ /dev/null
@@ -1,1503 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq div path fintype.
-From mathcomp
-Require Import bigop finset prime fingroup morphism perm automorphism quotient.
-From mathcomp
-Require Import action gproduct gfunctor pgroup cyclic center commutator.
-From mathcomp
-Require Import gseries nilpotent sylow abelian maximal hall.
-From mathcomp
-Require Import BGsection1 BGsection3 BGsection4 BGsection5 BGsection6.
-From mathcomp
-Require Import BGsection7 BGsection9.
-
-(******************************************************************************)
-(* This file covers B & G, section 10, including with the definitions: *)
-(* \alpha(M) == the primes p such that M has p-rank at least 3. *)
-(* \beta(M) == the primes p in \alpha(M) such that Sylow p-subgroups of M *)
-(* are not narrow (see BGsection5), i.e., such that M contains *)
-(* no maximal elementary abelian subgroups of rank 2. In a *)
-(* minimal counter-example G, \beta(M) is the intersection of *)
-(* \alpha(M) and \beta(G). Note that B & G refers to primes in *)
-(* \beta(G) as ``ideal'' primes, somewhat inconsistently. *)
-(* \sigma(M) == the primes p such that there exists a p-Sylow subgroup P *)
-(* of M whose normaliser (in the minimal counter-example) is *)
-(* contained in M. *)
-(* M`_\alpha == the \alpha(M)-core of M. *)
-(* M`_\beta == the \beta(M)-core of M. *)
-(* M`_\sigma == the \sigma(M)-core of M. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope.
-
-Reserved Notation "\alpha ( M )" (at level 2, format "\alpha ( M )").
-Reserved Notation "\beta ( M )" (at level 2, format "\beta ( M )").
-Reserved Notation "\sigma ( M )" (at level 2, format "\sigma ( M )").
-
-Reserved Notation "M `_ \alpha" (at level 3, format "M `_ \alpha").
-Reserved Notation "M `_ \beta" (at level 3, format "M `_ \beta").
-Reserved Notation "M `_ \sigma" (at level 3, format "M `_ \sigma").
-
-Section Def.
-
-Variable gT : finGroupType.
-Implicit Type p : nat.
-
-Variable M : {set gT}.
-
-Definition alpha := [pred p | 2 < 'r_p(M)].
-Definition alpha_core := 'O_alpha(M).
-Canonical Structure alpha_core_group := Eval hnf in [group of alpha_core].
-
-Definition beta :=
- [pred p | [forall (P : {group gT} | p.-Sylow(M) P), ~~ p.-narrow P]].
-Definition beta_core := 'O_beta(M).
-Canonical Structure beta_core_group := Eval hnf in [group of beta_core].
-
-Definition sigma :=
- [pred p | [exists (P : {group gT} | p.-Sylow(M) P), 'N(P) \subset M]].
-Definition sigma_core := 'O_sigma(M).
-Canonical Structure sigma_core_group := Eval hnf in [group of sigma_core].
-
-End Def.
-
-Notation "\alpha ( M )" := (alpha M) : group_scope.
-Notation "M `_ \alpha" := (alpha_core M) : group_scope.
-Notation "M `_ \alpha" := (alpha_core_group M) : Group_scope.
-
-Notation "\beta ( M )" := (beta M) : group_scope.
-Notation "M `_ \beta" := (beta_core M) : group_scope.
-Notation "M `_ \beta" := (beta_core_group M) : Group_scope.
-
-Notation "\sigma ( M )" := (sigma M) : group_scope.
-Notation "M `_ \sigma" := (sigma_core M) : group_scope.
-Notation "M `_ \sigma" := (sigma_core_group M) : Group_scope.
-
-Section CoreTheory.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Implicit Type x : gT.
-Implicit Type P : {group gT}.
-
-Section GenericCores.
-
-Variables H K : {group gT}.
-
-Lemma sigmaJ x : \sigma(H :^ x) =i \sigma(H).
-Proof.
-move=> p; apply/exists_inP/exists_inP=> [] [P sylP sNH]; last first.
- by exists (P :^ x)%G; rewrite ?pHallJ2 // normJ conjSg.
-by exists (P :^ x^-1)%G; rewrite ?normJ ?sub_conjgV // -(pHallJ2 _ _ _ x) actKV.
-Qed.
-
-Lemma MsigmaJ x : (H :^ x)`_\sigma = H`_\sigma :^ x.
-Proof. by rewrite /sigma_core -(eq_pcore H (sigmaJ x)) pcoreJ. Qed.
-
-Lemma alphaJ x : \alpha(H :^ x) =i \alpha(H).
-Proof. by move=> p; rewrite !inE /= p_rankJ. Qed.
-
-Lemma MalphaJ x : (H :^ x)`_\alpha = H`_\alpha :^ x.
-Proof. by rewrite /alpha_core -(eq_pcore H (alphaJ x)) pcoreJ. Qed.
-
-Lemma betaJ x : \beta(H :^ x) =i \beta(H).
-Proof.
-move=> p; apply/forall_inP/forall_inP=> nnSylH P sylP.
- by rewrite -(@narrowJ _ _ _ x) nnSylH ?pHallJ2.
-by rewrite -(@narrowJ _ _ _ x^-1) nnSylH // -(pHallJ2 _ _ _ x) actKV.
-Qed.
-
-Lemma MbetaJ x : (H :^ x)`_\beta = H`_\beta :^ x.
-Proof. by rewrite /beta_core -(eq_pcore H (betaJ x)) pcoreJ. Qed.
-
-End GenericCores.
-
-(* This remark appears at the start (p. 70) of B & G, Section 10, just after *)
-(* the definition of ideal, which we do not include, since it is redundant *)
-(* with the notation p \in \beta(G) that is used later. *)
-Remark not_narrow_ideal p P : p.-Sylow(G) P -> ~~ p.-narrow P -> p \in \beta(G).
-Proof.
-move=> sylP nnP; apply/forall_inP=> Q sylQ.
-by have [x _ ->] := Sylow_trans sylP sylQ; rewrite narrowJ.
-Qed.
-
-Section MaxCores.
-
-Variables M : {group gT}.
-Hypothesis maxM : M \in 'M.
-
-(* This is the first inclusion in the remark following the preliminary *)
-(* definitions in B & G, p. 70. *)
-Remark beta_sub_alpha : {subset \beta(M) <= \alpha(M)}.
-Proof.
-move=> p; rewrite !inE /= => /forall_inP nnSylM.
-have [P sylP] := Sylow_exists p M; have:= nnSylM P sylP.
-by rewrite negb_imply (p_rank_Sylow sylP) => /andP[].
-Qed.
-
-Remark alpha_sub_sigma : {subset \alpha(M) <= \sigma(M)}.
-Proof.
-move=> p a_p; have [P sylP] := Sylow_exists p M; have [sPM pP _ ] := and3P sylP.
-have{a_p} rP: 2 < 'r(P) by rewrite (rank_Sylow sylP).
-apply/exists_inP; exists P; rewrite ?uniq_mmax_norm_sub //.
-exact: def_uniq_mmax (rank3_Uniqueness (mFT_pgroup_proper pP) rP) maxM sPM.
-Qed.
-
-Remark beta_sub_sigma : {subset \beta(M) <= \sigma(M)}.
-Proof. by move=> p; move/beta_sub_alpha; apply: alpha_sub_sigma. Qed.
-
-Remark Mbeta_sub_Malpha : M`_\beta \subset M`_\alpha.
-Proof. exact: sub_pcore beta_sub_alpha. Qed.
-
-Remark Malpha_sub_Msigma : M`_\alpha \subset M`_\sigma.
-Proof. exact: sub_pcore alpha_sub_sigma. Qed.
-
-Remark Mbeta_sub_Msigma : M`_\beta \subset M`_\sigma.
-Proof. exact: sub_pcore beta_sub_sigma. Qed.
-
-(* This is the first part of the remark just above B & G, Theorem 10.1. *)
-Remark norm_sigma_Sylow p P :
- p \in \sigma(M) -> p.-Sylow(M) P -> 'N(P) \subset M.
-Proof.
-case/exists_inP=> Q sylQ sNPM sylP.
-by case: (Sylow_trans sylQ sylP) => m mM ->; rewrite normJ conj_subG.
-Qed.
-
-(* This is the second part of the remark just above B & G, Theorem 10.1. *)
-Remark sigma_Sylow_G p P : p \in \sigma(M) -> p.-Sylow(M) P -> p.-Sylow(G) P.
-Proof.
-move=> sMp sylP; apply: (mmax_sigma_Sylow maxM) => //.
-exact: norm_sigma_Sylow sMp sylP.
-Qed.
-
-Lemma sigma_Sylow_neq1 p P : p \in \sigma(M) -> p.-Sylow(M) P -> P :!=: 1.
-Proof.
-move=> sMp /(norm_sigma_Sylow sMp); apply: contraTneq => ->.
-by rewrite norm1 subTset -properT mmax_proper.
-Qed.
-
-Lemma sigma_sub_pi : {subset \sigma(M) <= \pi(M)}.
-Proof.
-move=> p sMp; have [P sylP]:= Sylow_exists p M.
-by rewrite -p_rank_gt0 -(rank_Sylow sylP) rank_gt0 (sigma_Sylow_neq1 sMp sylP).
-Qed.
-
-Lemma predI_sigma_alpha : [predI \sigma(M) & \alpha(G)] =i \alpha(M).
-Proof.
-move=> p; rewrite inE /= -(andb_idl (@alpha_sub_sigma p)).
-apply: andb_id2l => sMp; have [P sylP] := Sylow_exists p M.
-by rewrite !inE -(rank_Sylow sylP) -(rank_Sylow (sigma_Sylow_G sMp sylP)).
-Qed.
-
-Lemma predI_sigma_beta : [predI \sigma(M) & \beta(G)] =i \beta(M).
-Proof.
-move=> p; rewrite inE /= -(andb_idl (@beta_sub_sigma p)).
-apply: andb_id2l => sMp; apply/idP/forall_inP=> [bGp P sylP | nnSylM].
- exact: forall_inP bGp P (sigma_Sylow_G sMp sylP).
-have [P sylP] := Sylow_exists p M.
-exact: not_narrow_ideal (sigma_Sylow_G sMp sylP) (nnSylM P sylP).
-Qed.
-
-End MaxCores.
-
-End CoreTheory.
-
-Section Ten.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-
-Implicit Type p : nat.
-Implicit Type A E H K M N P Q R S V W X Y : {group gT}.
-
-(* This is B & G, Theorem 10.1(d); note that we do not assume M is maximal. *)
-Theorem sigma_Sylow_trans M p X g :
- p \in \sigma(M) -> p.-Sylow(M) X -> X :^ g \subset M -> g \in M.
-Proof.
-move=> sMp sylX sXgM; have pX := pHall_pgroup sylX.
-have [|h hM /= sXghX] := Sylow_Jsub sylX sXgM; first by rewrite pgroupJ.
-by rewrite -(groupMr _ hM) (subsetP (norm_sigma_Sylow _ sylX)) ?inE ?conjsgM.
-Qed.
-
-(* This is B & G, Theorem 10.1 (a, b, c). *)
-(* Part (e) of Theorem 10.1 is obviously stated incorrectly, and this is *)
-(* difficult to correct because it is not used in the rest of the proof. *)
-Theorem sigma_group_trans M p X :
- M \in 'M -> p \in \sigma(M) -> p.-group X ->
- [/\ (*a*) forall g, X \subset M -> X :^ g \subset M ->
- exists2 c, c \in 'C(X) & exists2 m, m \in M & g = c * m,
- (*b*) [transitive 'C(X), on [set Mg in M :^: G | X \subset Mg] | 'Js ]
- & (*c*) X \subset M -> 'C(X) * 'N_M(X) = 'N(X)].
-Proof.
-move=> maxM sMp pX; have defNM := norm_mmax maxM.
-pose OM (Y : {set gT}) : {set {set gT}} := [set Mg in M :^: G | Y \subset Mg].
-pose trM (Y : {set gT}) := [transitive 'C(Y), on OM Y | 'Js].
-have actsOM Y: [acts 'N(Y), on OM Y | 'Js].
- apply/actsP=> z nYz Q; rewrite !inE -{1}(normP nYz) conjSg.
- by rewrite (acts_act (acts_orbit _ _ _)) ?inE.
-have OMid Y: (gval M \in OM Y) = (Y \subset M) by rewrite inE orbit_refl.
-have ntOM Y: p.-group Y -> exists B, gval B \in OM Y.
- have [S sylS] := Sylow_exists p M; have sSM := pHall_sub sylS.
- have sylS_G := sigma_Sylow_G maxM sMp sylS.
- move=> pY; have [g Gg sXSg] := Sylow_subJ sylS_G (subsetT Y) pY.
- by exists (M :^ g)%G; rewrite inE mem_orbit // (subset_trans sXSg) ?conjSg.
-have maxOM Y H: gval H \in OM Y -> H \in 'M.
- by case/setIdP=> /imsetP[g _ /val_inj->]; rewrite mmaxJ.
-have part_c Y H: trM Y -> gval H \in OM Y -> 'C(Y) * 'N_H(Y) = 'N(Y).
- move=> trMY O_H; rewrite -(norm_mmax (maxOM Y H O_H)) -(astab1Js H) setIC.
- have [sCN nCN] := andP (cent_normal Y); rewrite -normC 1?subIset ?nCN //.
- by apply/(subgroup_transitiveP O_H); rewrite ?(atrans_supgroup sCN) ?actsOM.
-suffices trMX: trM X.
- do [split; rewrite // -OMid] => [g O_M sXgM |]; last exact: part_c.
- have O_Mg': M :^ g^-1 \in OM X by rewrite inE mem_orbit -?sub_conjg ?inE.
- have [c Cc /= Mc] := atransP2 trMX O_M O_Mg'; exists c^-1; rewrite ?groupV //.
- by exists (c * g); rewrite ?mulKg // -defNM inE conjsgM -Mc conjsgKV.
-elim: {X}_.+1 {-2}X (ltnSn (#|G| - #|X|)) => // n IHn X geXn in pX *.
-have{n IHn geXn} IHX Y: X \proper Y -> p.-group Y -> trM Y.
- move=> ltXY; apply: IHn; rewrite -ltnS (leq_trans _ geXn) // ltnS.
- by rewrite ltn_sub2l ?(leq_trans (proper_card ltXY)) // cardsT max_card.
-have [-> | ntX] := eqsVneq X 1.
- rewrite /trM cent1T /OM setIdE (setIidPl _) ?atrans_orbit //.
- by apply/subsetP=> Mg; case/imsetP=> g _ ->; rewrite inE sub1G.
-pose L := 'N(X)%G; have ltLG := mFT_norm_proper ntX (mFT_pgroup_proper pX).
-have IH_L: {in OM X &, forall B B',
- B != B' -> exists2 X1, X \proper gval X1 & p.-Sylow(B :&: L) X1}.
-- move=> _ _ /setIdP[/imsetP[a Ga ->] sXMa] /setIdP[/imsetP[b Gb ->] sXMb].
- move=> neqMab.
- have [S sylS sXS] := Sylow_superset sXMa pX; have [sSMa pS _] := and3P sylS.
- have [defS | ltXS] := eqVproper sXS.
- case/eqP: neqMab; apply: (canRL (actKV _ _)); apply: (act_inj 'Js a).
- rewrite /= -conjsgM [_ :^ _]conjGid ?(sigma_Sylow_trans _ sylS) ?sigmaJ //.
- by rewrite -defS conjsgM conjSg sub_conjgV.
- have pSL: p.-group (S :&: L) := pgroupS (subsetIl _ _) pS.
- have [X1 sylX1 sNX1] := Sylow_superset (setSI L sSMa) pSL; exists X1 => //.
- by rewrite (proper_sub_trans (nilpotent_proper_norm (pgroup_nil pS) _)).
-have [M1 O_M1] := ntOM X pX; apply/imsetP; exists (gval M1) => //; apply/eqP.
-rewrite eqEsubset andbC acts_sub_orbit ?(subset_trans (cent_sub X)) // O_M1 /=.
-apply/subsetP=> M2 O_M2.
-have [-> | neqM12] := eqsVneq M1 M2; first exact: orbit_refl.
-have [|X2 ltXX2 sylX2] := IH_L _ _ O_M2 O_M1; first by rewrite eq_sym.
-have{IH_L neqM12} [X1 ltXX1 sylX1] := IH_L _ _ O_M1 O_M2 neqM12.
-have [[sX1L1 pX1 _] [sX2L2 pX2 _]] := (and3P sylX1, and3P sylX2).
-have [[sX1M1 sX1L] [sX2M2 sX2L]] := (subsetIP sX1L1, subsetIP sX2L2).
-have [P sylP sX1P] := Sylow_superset sX1L pX1; have [sPL pP _] := and3P sylP.
-have [M0 O_M0] := ntOM P pP; have [MG_M0 sPM0] := setIdP O_M0.
-have [t Lt sX2Pt] := Sylow_subJ sylP sX2L pX2.
-have [sX1M0 ltXP] := (subset_trans sX1P sPM0, proper_sub_trans ltXX1 sX1P).
-have M0C_M1: gval M1 \in orbit 'Js 'C(X) M0.
- rewrite (subsetP (imsetS _ (centS (proper_sub ltXX1)))) // -orbitE.
- by rewrite (atransP (IHX _ ltXX1 pX1)) inE ?MG_M0 //; case/setIdP: O_M1 => ->.
-have M0tC_M2: M2 \in orbit 'Js 'C(X) (M0 :^ t).
- rewrite (subsetP (imsetS _ (centS (proper_sub ltXX2)))) // -orbitE.
- rewrite (atransP (IHX _ ltXX2 pX2)) inE; first by case/setIdP: O_M2 => ->.
- rewrite (acts_act (acts_orbit _ _ _)) ?inE ?MG_M0 //.
- by rewrite (subset_trans sX2Pt) ?conjSg.
-rewrite (orbit_eqP M0C_M1) (orbit_transl _ M0tC_M2).
-have maxM0 := maxOM _ _ O_M0; have ltMG := mmax_proper maxM0.
-have [rPgt2 | rPle2] := ltnP 2 'r(P).
- have uP: P \in 'U by rewrite rank3_Uniqueness ?(mFT_pgroup_proper pP).
- have uP_M0: 'M(P) = [set M0] := def_uniq_mmax uP maxM0 sPM0.
- by rewrite conjGid ?orbit_refl ?(subsetP (sub_uniq_mmax uP_M0 sPL ltLG)).
-have pl1L: p.-length_1 L.
- have [oddL]: odd #|L| /\ 'r_p(L) <= 2 by rewrite mFT_odd -(rank_Sylow sylP).
- by case/rank2_der1_complement; rewrite ?mFT_sol ?plength1_pseries2_quo.
-have [|u v nLPu Lp'_v ->] := imset2P (_ : t \in 'N_L(P) * 'O_p^'(L)).
- by rewrite normC ?plength1_Frattini // subIset ?gFnorm.
-rewrite actM (orbit_transl _ (mem_orbit _ _ _)); last first.
- have coLp'X: coprime #|'O_p^'(L)| #|X| := p'nat_coprime (pcore_pgroup _ _) pX.
- apply: subsetP Lp'_v; have [sLp'L nLp'L] := andP (pcore_normal p^' L).
- rewrite -subsetIidl -coprime_norm_cent ?subsetIidl //.
- exact: subset_trans (normG X) nLp'L.
-have [|w x nM0Pw cPx ->] := imset2P (_ : u \in 'N_M0(P) * 'C(P)).
- rewrite normC ?part_c ?IHX //; first by case/setIP: nLPu.
- by rewrite setIC subIset ?cent_norm.
-rewrite actM /= conjGid ?mem_orbit //; last by case/setIP: nM0Pw.
-by rewrite (subsetP (centS (subset_trans (proper_sub ltXX1) sX1P))).
-Qed.
-
-Section OneMaximal.
-
-Variable M : {group gT}.
-Hypothesis maxM : M \in 'M.
-
-Let ltMG := mmax_proper maxM.
-Let solM := mmax_sol maxM.
-
-Let aMa : \alpha(M).-group (M`_\alpha). Proof. exact: pcore_pgroup. Qed.
-Let nsMaM : M`_\alpha <| M. Proof. exact: pcore_normal. Qed.
-Let sMaMs : M`_\alpha \subset M`_\sigma. Proof. exact: Malpha_sub_Msigma. Qed.
-
-Let F := 'F(M / M`_\alpha).
-Let nsFMa : F <| M / M`_\alpha. Proof. exact: Fitting_normal. Qed.
-
-Let alpha'F : \alpha(M)^'.-group F.
-Proof.
-rewrite -[F](nilpotent_pcoreC \alpha(M) (Fitting_nil _)) -Fitting_pcore /=.
-by rewrite trivg_pcore_quotient (trivgP (Fitting_sub 1)) dprod1g pcore_pgroup.
-Qed.
-
-Let Malpha_quo_sub_Fitting : M^`(1) / M`_\alpha \subset F.
-Proof.
-have [/= K defF sMaK nsKM] := inv_quotientN nsMaM nsFMa; rewrite -/F in defF.
-have [sKM _] := andP nsKM; have nsMaK: M`_\alpha <| K := normalS sMaK sKM nsMaM.
-have [[_ nMaK] [_ nMaM]] := (andP nsMaK, andP nsMaM).
-have hallMa: \alpha(M).-Hall(K) M`_\alpha.
- by rewrite /pHall sMaK pcore_pgroup -card_quotient -?defF.
-have [H hallH] := Hall_exists \alpha(M)^' (solvableS sKM solM).
-have{hallH} defK := sdprod_normal_p'HallP nsMaK hallH hallMa.
-have{defK} [_ sHK defK nMaH tiMaH] := sdprod_context defK.
-have{defK} isoHF: H \isog F by rewrite [F]defF -defK quotientMidl quotient_isog.
-have{sHK nMaH} sHM := subset_trans sHK sKM.
-have{tiMaH isoHF sHM H} rF: 'r(F) <= 2.
- rewrite -(isog_rank isoHF); have [p p_pr -> /=] := rank_witness H.
- have [|a_p] := leqP 'r_p(M) 2; first exact: leq_trans (p_rankS p sHM).
- rewrite 2?leqW // leqNgt p_rank_gt0 /= (card_isog isoHF) /= -/F.
- exact: contraL (pnatPpi alpha'F) a_p.
-by rewrite quotient_der // rank2_der1_sub_Fitting ?mFT_quo_odd ?quotient_sol.
-Qed.
-
-Let sigma_Hall_sub_der1 H : \sigma(M).-Hall(M) H -> H \subset M^`(1).
-Proof.
-move=> hallH; have [sHM sH _] := and3P hallH.
-rewrite -(Sylow_gen H) gen_subG; apply/bigcupsP=> P /SylowP[p p_pr sylP].
-have [-> | ntP] := eqsVneq P 1; first by rewrite sub1G.
-have [sPH pP _] := and3P sylP; have{ntP} [_ p_dv_P _] := pgroup_pdiv pP ntP.
-have{p_dv_P} s_p: p \in \sigma(M) := pgroupP (pgroupS sPH sH) p p_pr p_dv_P.
-have{sylP} sylP: p.-Sylow(M) P := subHall_Sylow hallH s_p sylP.
-have [sPM nMP] := (pHall_sub sylP, norm_sigma_Sylow s_p sylP).
-have sylP_G := sigma_Sylow_G maxM s_p sylP.
-have defG': G^`(1) = G.
- have [_ simpG] := simpleP _ (mFT_simple gT).
- by have [?|//] := simpG _ (der_normal 1 _); case/derG1P: (mFT_nonAbelian gT).
-rewrite -subsetIidl -{1}(setIT P) -defG'.
-rewrite (focal_subgroup_gen sylP_G) (focal_subgroup_gen sylP) genS //.
-apply/subsetP=> _ /imset2P[x g Px /setIdP[Gg Pxg] ->].
-pose X := <[x]>; have sXM : X \subset M by rewrite cycle_subG (subsetP sPM).
-have sXgM: X :^ g \subset M by rewrite -cycleJ cycle_subG (subsetP sPM).
-have [trMX _ _] := sigma_group_trans maxM s_p (mem_p_elt pP Px).
-have [c cXc [m Mm def_g]] := trMX _ sXM sXgM; rewrite cent_cycle in cXc.
-have def_xg: x ^ g = x ^ m by rewrite def_g conjgM /conjg -(cent1P cXc) mulKg.
-by rewrite commgEl def_xg -commgEl mem_imset2 // inE Mm -def_xg.
-Qed.
-
-(* This is B & G, Theorem 10.2(a1). *)
-Theorem Malpha_Hall : \alpha(M).-Hall(M) M`_\alpha.
-Proof.
-have [H hallH] := Hall_exists \sigma(M) solM; have [sHM sH _] := and3P hallH.
-rewrite (subHall_Hall hallH (alpha_sub_sigma maxM)) // /pHall pcore_pgroup /=.
-rewrite -(card_quotient (subset_trans sHM (normal_norm nsMaM))) -pgroupE.
-rewrite (subset_trans sMaMs) ?pcore_sub_Hall ?(pgroupS _ alpha'F) //=.
-exact: subset_trans (quotientS _ (sigma_Hall_sub_der1 hallH)) _.
-Qed.
-
-(* This is B & G, Theorem 10.2(b1). *)
-Theorem Msigma_Hall : \sigma(M).-Hall(M) M`_\sigma.
-Proof.
-have [H hallH] := Hall_exists \sigma(M) solM; have [sHM sH _] := and3P hallH.
-rewrite /M`_\sigma (normal_Hall_pcore hallH) // -(quotientGK nsMaM).
-rewrite -(quotientGK (normalS _ sHM nsMaM)) ?cosetpre_normal //; last first.
- by rewrite (subset_trans sMaMs) ?pcore_sub_Hall.
-have hallHa: \sigma(M).-Hall(F) (H / M`_\alpha).
- apply: pHall_subl (subset_trans _ Malpha_quo_sub_Fitting) (Fitting_sub _) _.
- by rewrite quotientS ?sigma_Hall_sub_der1.
- exact: quotient_pHall (subset_trans sHM (normal_norm nsMaM)) hallH.
-rewrite (nilpotent_Hall_pcore (Fitting_nil _) hallHa) /=.
-exact: char_normal_trans (pcore_char _ _) nsFMa.
-Qed.
-
-Lemma pi_Msigma : \pi(M`_\sigma) =i \sigma(M).
-Proof.
-move=> p; apply/idP/idP=> [|s_p /=]; first exact: pnatPpi (pcore_pgroup _ _).
-by rewrite (card_Hall Msigma_Hall) pi_of_part // inE /= sigma_sub_pi.
-Qed.
-
-(* This is B & G, Theorem 10.2(b2). *)
-Theorem Msigma_Hall_G : \sigma(M).-Hall(G) M`_\sigma.
-Proof.
-rewrite pHallE subsetT /= eqn_dvd {1}(card_Hall Msigma_Hall).
-rewrite partn_dvd ?cardG_gt0 ?cardSg ?subsetT //=.
-apply/dvdn_partP; rewrite ?part_gt0 // => p.
-rewrite pi_of_part ?cardG_gt0 // => /andP[_ s_p].
-rewrite partn_part => [|q /eqnP-> //].
-have [P sylP] := Sylow_exists p M; have [sPM pP _] := and3P sylP.
-rewrite -(card_Hall (sigma_Sylow_G _ _ sylP)) ?cardSg //.
-by rewrite (sub_Hall_pcore Msigma_Hall) ?(pi_pgroup pP).
-Qed.
-
-(* This is B & G, Theorem 10.2(a2). *)
-Theorem Malpha_Hall_G : \alpha(M).-Hall(G) M`_\alpha.
-Proof.
-apply: subHall_Hall Msigma_Hall_G (alpha_sub_sigma maxM) _.
-exact: pHall_subl sMaMs (pcore_sub _ _) Malpha_Hall.
-Qed.
-
-(* This is B & G, Theorem 10.2(c). *)
-Theorem Msigma_der1 : M`_\sigma \subset M^`(1).
-Proof. exact: sigma_Hall_sub_der1 Msigma_Hall. Qed.
-
-(* This is B & G, Theorem 10.2(d1). *)
-Theorem Malpha_quo_rank2 : 'r(M / M`_\alpha) <= 2.
-Proof.
-have [p p_pr ->] := rank_witness (M / M`_\alpha).
-have [P sylP] := Sylow_exists p M; have [sPM pP _] := and3P sylP.
-have nMaP := subset_trans sPM (normal_norm nsMaM).
-rewrite -(rank_Sylow (quotient_pHall nMaP sylP)) /= leqNgt.
-have [a_p | a'p] := boolP (p \in \alpha(M)).
- by rewrite quotientS1 ?rank1 ?(sub_Hall_pcore Malpha_Hall) ?(pi_pgroup pP).
-rewrite -(isog_rank (quotient_isog _ _)) ?coprime_TIg ?(rank_Sylow sylP) //.
-exact: pnat_coprime aMa (pi_pnat pP _).
-Qed.
-
-(* This is B & G, Theorem 10.2(d2). *)
-Theorem Malpha_quo_nil : nilpotent (M^`(1) / M`_\alpha).
-Proof. exact: nilpotentS Malpha_quo_sub_Fitting (Fitting_nil _). Qed.
-
-(* This is B & G, Theorem 10.2(e). *)
-Theorem Msigma_neq1 : M`_\sigma :!=: 1.
-Proof.
-without loss Ma1: / M`_\alpha = 1.
- by case: eqP => // Ms1 -> //; apply/trivgP; rewrite -Ms1 Malpha_sub_Msigma.
-have{Ma1} rFM: 'r('F(M)) <= 2.
- rewrite (leq_trans _ Malpha_quo_rank2) // Ma1.
- by rewrite -(isog_rank (quotient1_isog _)) rankS ?Fitting_sub.
-pose q := max_pdiv #|M|; pose Q := 'O_q(M)%G.
-have sylQ: q.-Sylow(M) Q := rank2_max_pcore_Sylow (mFT_odd M) solM rFM.
-have piMq: q \in \pi(M) by rewrite pi_max_pdiv cardG_gt1 mmax_neq1.
-have{piMq} ntQ: Q :!=: 1 by rewrite -rank_gt0 (rank_Sylow sylQ) p_rank_gt0.
-rewrite (subG1_contra _ ntQ) ?(sub_Hall_pcore Msigma_Hall) ?pcore_sub //.
-rewrite (pi_pgroup (pcore_pgroup _ _)) //; apply/exists_inP; exists Q => //.
-by rewrite (mmax_normal maxM) ?pcore_normal.
-Qed.
-
-(* This is B & G, Lemma 10.3. *)
-Theorem cent_alpha'_uniq X :
- X \subset M -> \alpha(M)^'.-group X -> 'r('C_(M`_\alpha)(X)) >= 2 ->
- 'C_M(X)%G \in 'U.
-Proof.
-have ltM_G := sub_proper_trans (subsetIl M _) ltMG.
-move=> sXM a'X; have [p p_pr -> rCX] := rank_witness 'C_(M`_\alpha)(X).
-have{rCX} [B EpB] := p_rank_geP rCX; have{EpB} [sBCX abelB dimB] := pnElemP EpB.
-have [[sBMa cXB] [pB cBB _]] := (subsetIP sBCX, and3P abelB).
-have rMa: 1 < 'r_p(M`_\alpha) by rewrite -dimB -p_rank_abelem ?p_rankS.
-have{rMa} a_p: p \in \alpha(M) by rewrite (pnatPpi aMa) // -p_rank_gt0 ltnW.
-have nBX: X \subset 'N(B) by rewrite cents_norm // centsC.
-have coMaX: coprime #|M`_\alpha| #|X| := pnat_coprime aMa a'X.
-have [sMaM nMaM] := andP nsMaM; have solMa := solvableS sMaM solM.
-have nMaX := subset_trans sXM nMaM.
-have [P [sylP nPX sBP]] := coprime_Hall_subset nMaX coMaX solMa sBMa pB nBX.
-have [sPMa pP _] := and3P sylP; have sPM := subset_trans sPMa sMaM.
-have EpCB: B \in 'E_p^2('C_P(B)) by rewrite !inE subsetI sBP abelB dimB !andbT.
-have: 1 < 'r_p('C_P(B)) by apply/p_rank_geP; exists B.
-rewrite leq_eqVlt; case: ltngtP => // rCPB _.
- apply: (uniq_mmaxS (subset_trans sBCX (setSI _ sMaM))) => //=.
- have pCPB := pgroupS (subsetIl P 'C(B)) pP; rewrite -rank_pgroup // in rCPB.
- have: 2 < 'r('C(B)) by rewrite (leq_trans rCPB) ?rankS ?subsetIr.
- by apply: cent_rank3_Uniqueness; rewrite -dimB -rank_abelem.
-have cPX: P \subset 'C(X).
- have EpPB: B \in 'E_p(P) by apply/pElemP.
- have coPX: coprime #|P| #|X| := coprimeSg sPMa coMaX.
- rewrite centsC (coprime_odd_faithful_cent_abelem EpPB) ?mFT_odd //.
- rewrite -(setIid 'C(B)) setIA (pmaxElem_LdivP p_pr _) 1?centsC //.
- by rewrite (subsetP (p_rankElem_max _ _)) -?rCPB.
-have sylP_M := subHall_Sylow Malpha_Hall a_p sylP.
-have{sylP_M} rP: 2 < 'r(P) by rewrite (rank_Sylow sylP_M).
-by rewrite rank3_Uniqueness ?(leq_trans rP (rankS _)) //= subsetI sPM.
-Qed.
-
-Variable p : nat.
-
-(* This is B & G, Lemma 10.4(a). *)
-(* We omit the redundant assumption p \in \pi(M). *)
-Lemma der1_quo_sigma' : p %| #|M / M^`(1)| -> p \in \sigma(M)^'.
-Proof.
-apply: contraL => /= s_p; have piMp := sigma_sub_pi maxM s_p.
-have p_pr: prime p by move: piMp; rewrite mem_primes; case/andP.
-rewrite -p'natE ?(pi'_p'nat _ s_p) // -pgroupE -partG_eq1.
-rewrite -(card_Hall (quotient_pHall _ Msigma_Hall)) /=; last first.
- exact/gFsub_trans/gFnorm.
-by rewrite quotientS1 ?cards1 // Msigma_der1.
-Qed.
-
-Hypothesis s'p : p \in \sigma(M)^'.
-
-(* This is B & G, Lemma 10.4(b). *)
-(* We do not need the assumption M`_\alpha != 1; the assumption p \in \pi(M) *)
-(* is restated as P != 1. *)
-Lemma cent1_sigma'_Zgroup P :
- p.-Sylow(M) P -> P :!=: 1 ->
- exists x,
- [/\ x \in 'Ohm_1('Z(P))^#, 'M('C[x]) != [set M] & Zgroup 'C_(M`_\alpha)[x]].
-Proof.
-move=> sylP ntP; have [sPM pP _] := and3P sylP; have nilP := pgroup_nil pP.
-set T := 'Ohm_1('Z(P)); have charT: T \char P by rewrite !gFchar_trans.
-suffices [x Tx not_uCx]: exists2 x, x \in T^# & 'M('C[x]) != [set M].
- exists x; split=> //; rewrite odd_rank1_Zgroup ?mFT_odd //= leqNgt.
- apply: contra not_uCx; rewrite -cent_cycle; set X := <[x]> => rCMaX.
- have{Tx} [ntX Tx] := setD1P Tx; rewrite -cycle_eq1 -/X in ntX.
- have sXP: X \subset P by rewrite cycle_subG (subsetP (char_sub charT)).
- rewrite (@def_uniq_mmaxS _ M 'C_M(X)) ?subsetIr ?mFT_cent_proper //.
- apply: def_uniq_mmax; rewrite ?subsetIl //.
- rewrite cent_alpha'_uniq ?(subset_trans sXP) ?(pi_pgroup (pgroupS sXP pP)) //.
- by apply: contra s'p; apply: alpha_sub_sigma.
-apply/exists_inP; rewrite -negb_forall_in; apply: contra s'p.
-move/forall_inP => uCT; apply/exists_inP; exists P => //.
-apply/subsetP=> u nPu; have [y Ty]: exists y, y \in T^#.
- by apply/set0Pn; rewrite setD_eq0 subG1 Ohm1_eq1 center_nil_eq1.
-rewrite -(norm_mmax maxM) (sameP normP eqP) (inj_eq (@group_inj gT)) -in_set1.
-have Tyu: y ^ u \in T^#.
- by rewrite memJ_norm // normD1 (subsetP (char_norms charT)).
-by rewrite -(eqP (uCT _ Tyu)) -conjg_set1 normJ mmax_ofJ (eqP (uCT _ Ty)) set11.
-Qed.
-
-(* This is B & G, Lemma 10.4(c), part 1. *)
-(* The redundant assumption p \in \pi(M) is omitted. *)
-Lemma sigma'_rank2_max : 'r_p(M) = 2 -> 'E_p^2(M) \subset 'E*_p(G).
-Proof.
-move=> rpM; apply: contraR s'p => /subsetPn[A Ep2A not_maxA].
-have{Ep2A} [sAM abelA dimA] := pnElemP Ep2A; have [pA _ _] := and3P abelA.
-have [P sylP sAP] := Sylow_superset sAM pA; have [_ pP _] := and3P sylP.
-apply/exists_inP; exists P; rewrite ?uniq_mmax_norm_sub //.
-apply: def_uniq_mmaxS (mFT_pgroup_proper pP) (def_uniq_mmax _ _ sAM) => //.
-by rewrite (@nonmaxElem2_Uniqueness _ p) // !(not_maxA, inE) abelA dimA subsetT.
-Qed.
-
-(* This is B & G, Lemma 10.4(c), part 2 *)
-(* The redundant assumption p \in \pi(M) is omitted. *)
-Lemma sigma'_rank2_beta' : 'r_p(M) = 2 -> p \notin \beta(G).
-Proof.
-move=> rpM; rewrite -[p \in _]negb_exists_in negbK; apply/exists_inP.
-have [A Ep2A]: exists A, A \in 'E_p^2(M) by apply/p_rank_geP; rewrite rpM.
-have [_ abelA dimA] := pnElemP Ep2A; have [pA _] := andP abelA.
-have [P sylP sAP] := Sylow_superset (subsetT _) pA.
-exists P; rewrite ?inE //; apply/implyP=> _; apply/set0Pn.
-exists A; rewrite 3!inE abelA dimA sAP (subsetP (pmaxElemS _ (subsetT P))) //.
-by rewrite inE (subsetP (sigma'_rank2_max rpM)) // inE.
-Qed.
-
-(* This is B & G, Lemma 10.5, part 1; the condition on X has been weakened, *)
-(* because the proof of Lemma 12.2(a) requires the stronger result. *)
-Lemma sigma'_norm_mmax_rank2 X : p.-group X -> 'N(X) \subset M -> 'r_p(M) = 2.
-Proof.
-move=> pX sNX_M; have sXM: X \subset M := subset_trans (normG X) sNX_M.
-have [P sylP sXP] := Sylow_superset sXM pX; have [sPM pP _] := and3P sylP.
-apply: contraNeq s'p; case: ltngtP => // rM _; last exact: alpha_sub_sigma.
-apply/exists_inP; exists P; rewrite ?(subset_trans _ sNX_M) ?char_norms //.
-rewrite sub_cyclic_char // (odd_pgroup_rank1_cyclic pP) ?mFT_odd //.
-by rewrite (p_rank_Sylow sylP).
-Qed.
-
-(* This is B & G, Lemma 10.5, part 2. We omit the second claim of B & G 10.5 *)
-(* as it is an immediate consequence of sigma'_rank2_beta' (i.e., 10.4(c)). *)
-Lemma sigma'1Elem_sub_p2Elem X :
- X \in 'E_p^1(G) -> 'N(X) \subset M ->
- exists2 A, A \in 'E_p^2(G) & X \subset A.
-Proof.
-move=> EpX sNXM; have sXM := subset_trans (normG X) sNXM.
-have [[_ abelX dimX] p_pr] := (pnElemP EpX, pnElem_prime EpX).
-have pX := abelem_pgroup abelX; have rpM2 := sigma'_norm_mmax_rank2 pX sNXM.
-have [P sylP sXP] := Sylow_superset sXM pX; have [sPM pP _] := and3P sylP.
-pose T := 'Ohm_1('Z(P)); pose A := X <*> T; have nilP := pgroup_nil pP.
-have charT: T \char P by apply/gFchar_trans/gFchar.
-have neqTX: T != X.
- apply: contraNneq s'p => defX; apply/exists_inP; exists P => //.
- by rewrite (subset_trans _ sNXM) // -defX char_norms.
-have rP: 'r(P) = 2 by rewrite (rank_Sylow sylP) rpM2.
-have ntT: T != 1 by rewrite Ohm1_eq1 center_nil_eq1 // -rank_gt0 rP.
-have sAP: A \subset P by rewrite join_subG sXP char_sub.
-have cTX: T \subset 'C(X) := centSS (Ohm_sub 1 _) sXP (subsetIr P _).
-have{cTX} defA: X \* T = A by rewrite cprodEY.
-have{defA} abelA : p.-abelem A.
- have pZ: p.-group 'Z(P) := pgroupS (center_sub P) pP.
- by rewrite (cprod_abelem _ defA) abelX Ohm1_abelem ?center_abelian.
-exists [group of A]; last exact: joing_subl.
-rewrite !inE subsetT abelA eqn_leq -{1}rP -{1}(rank_abelem abelA) rankS //=.
-rewrite -dimX (properG_ltn_log (pgroupS sAP pP)) // /proper join_subG subxx.
-rewrite joing_subl /=; apply: contra ntT => sTX; rewrite eqEsubset sTX in neqTX.
-by rewrite -(setIidPr sTX) prime_TIg ?(card_pnElem EpX).
-Qed.
-
-End OneMaximal.
-
-(* This is B & G, Theorem 10.6. *)
-Theorem mFT_proper_plength1 p H : H \proper G -> p.-length_1 H.
-Proof.
-case/mmax_exists=> M /setIdP[maxM sHM].
-suffices{H sHM}: p.-length_1 M by apply: plength1S.
-have [solM oddM] := (mmax_sol maxM, mFT_odd M).
-have [rpMle2 | a_p] := leqP 'r_p(M) 2.
- by rewrite plength1_pseries2_quo; case/rank2_der1_complement: rpMle2.
-pose Ma := M`_\alpha; have hallMa: \alpha(M).-Hall(M) Ma := Malpha_Hall maxM.
-have [[K hallK] [sMaM aMa _]] := (Hall_exists \alpha(M)^' solM, and3P hallMa).
-have defM: Ma ><| K = M by apply/sdprod_Hall_pcoreP.
-have{aMa} coMaK: coprime #|Ma| #|K| := pnat_coprime aMa (pHall_pgroup hallK).
-suffices{a_p hallMa}: p.-length_1 Ma.
- rewrite !p_elt_gen_length1 /p_elt_gen setIdE /= -/Ma -(setIidPl sMaM) -setIA.
- rewrite -(setIdE M) (setIidPr _) //; apply/subsetP=> x; case/setIdP=> Mx p_x.
- by rewrite (mem_Hall_pcore hallMa) /p_elt ?(pi_pnat p_x).
-have{sMaM} <-: [~: Ma, K] = Ma.
- have sMaMs: Ma \subset M`_\sigma := Malpha_sub_Msigma maxM.
- have sMaM': Ma \subset M^`(1) := subset_trans sMaMs (Msigma_der1 maxM).
- by have [] := coprime_der1_sdprod defM coMaK (solvableS sMaM solM) sMaM'.
-have [q q_pr q_dv_Mq]: {q | prime q & q %| #|M / M^`(1)| }.
- apply: pdivP; rewrite card_quotient ?der_norm // indexg_gt1 proper_subn //.
- by rewrite (sol_der1_proper solM) ?mmax_neq1.
-have s'q: q \in \sigma(M)^' by apply: der1_quo_sigma' q_dv_Mq.
-have [Q sylQ] := Sylow_exists q K; have [sQK qQ _] := and3P sylQ.
-have a'q: q \in \alpha(M)^' by apply: contra s'q; apply: alpha_sub_sigma.
-have{a'q sylQ hallK} sylQ: q.-Sylow(M) Q := subHall_Sylow hallK a'q sylQ.
-have{q_dv_Mq} ntQ: Q :!=: 1.
- rewrite -rank_gt0 (rank_Sylow sylQ) p_rank_gt0 mem_primes q_pr cardG_gt0.
- exact: dvdn_trans q_dv_Mq (dvdn_quotient _ _).
-have{s'q sylQ ntQ} [x [Q1x _ ZgCx]] := cent1_sigma'_Zgroup maxM s'q sylQ ntQ.
-have{Q1x} [ntx Q1x] := setD1P Q1x.
-have sZQ := center_sub Q; have{sQK} sZK := subset_trans sZQ sQK.
-have{sZK} Kx: x \in K by rewrite (subsetP sZK) // (subsetP (Ohm_sub 1 _)).
-have{sZQ qQ} abelQ1 := Ohm1_abelem (pgroupS sZQ qQ) (center_abelian Q).
-have{q q_pr Q abelQ1 Q1x} ox: prime #[x] by rewrite (abelem_order_p abelQ1).
-move: Kx ox ZgCx; rewrite -cycle_subG -cent_cycle.
-exact: odd_sdprod_Zgroup_cent_prime_plength1 solM oddM defM coMaK.
-Qed.
-
-Section OneSylow.
-
-Variables (p : nat) (P : {group gT}).
-Hypothesis sylP_G: p.-Sylow(G) P.
-Let pP : p.-group P := pHall_pgroup sylP_G.
-
-(* This is an B & G, Corollary 10.7(a), second part (which does not depend on *)
-(* a particular complement). *)
-Corollary mFT_Sylow_der1 : P \subset 'N(P)^`(1).
-Proof.
-have [-> | ntP] := eqsVneq P 1; first exact: sub1G.
-have ltNG: 'N(P) \proper G := mFT_norm_proper ntP (mFT_pgroup_proper pP).
-have [M /setIdP[/= maxM sNM]] := mmax_exists ltNG.
-have [ltMG solM] := (mmax_proper maxM, mmax_sol maxM).
-have [pl1M sPM] := (mFT_proper_plength1 p ltMG, subset_trans (normG P) sNM).
-have sylP := pHall_subl sPM (subsetT M) sylP_G.
-have sMp: p \in \sigma(M) by apply/exists_inP; exists P.
-apply: subset_trans (dergS 1 (subsetIr M 'N(P))) => /=.
-apply: plength1_Sylow_sub_der1 sylP pl1M (subset_trans _ (Msigma_der1 maxM)).
-by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) ?(pi_pgroup pP).
-Qed.
-
-(* This is B & G, Corollary 10.7(a), first part. *)
-Corollary mFT_Sylow_sdprod_commg V : P ><| V = 'N(P) -> [~: P, V] = P.
-Proof.
-move=> defV; have sPN' := mFT_Sylow_der1.
-have sylP := pHall_subl (normG P) (subsetT 'N(P)) sylP_G.
-have [|//] := coprime_der1_sdprod defV _ (pgroup_sol pP) sPN'.
-by rewrite (coprime_sdprod_Hall_l defV) // (pHall_Hall sylP).
-Qed.
-
-(* This is B & G, Corollary 10.7(b). *)
-Corollary mFT_rank2_Sylow_cprod :
- 'r(P) < 3 -> ~~ abelian P ->
- exists2 S, [/\ ~~ abelian (gval S), logn p #|S| = 3 & exponent S %| p]
- & exists2 C, cyclic (gval C) & S \* C = P /\ 'Ohm_1(C) = 'Z(S).
-Proof.
-move=> rP not_cPP; have sylP := pHall_subl (normG P) (subsetT 'N(P)) sylP_G.
-have ntP: P :!=: 1 by apply: contraNneq not_cPP => ->; apply: abelian1.
-have ltNG: 'N(P) \proper G := mFT_norm_proper ntP (mFT_pgroup_proper pP).
-have [V hallV] := Hall_exists p^' (mFT_sol ltNG); have [_ p'V _] := and3P hallV.
-have defNP: P ><| V = 'N(P) := sdprod_normal_p'HallP (normalG P) hallV sylP.
-have defP: [~: P, V] = P := mFT_Sylow_sdprod_commg defNP.
-have [_] := rank2_coprime_comm_cprod pP (mFT_odd _) ntP rP defP p'V (mFT_odd _).
-case=> [/idPn// | [S esS [C [mulSC cycC defC1]]]].
-exists S => //; exists C => //; split=> //; rewrite defC1.
-have sSP: S \subset P by case/cprodP: mulSC => _ /mulG_sub[].
-have [[not_cSS dimS _] pS] := (esS, pgroupS sSP pP).
-by have [||[]] := p3group_extraspecial pS; rewrite ?dimS.
-Qed.
-
-(* This is B & G, Corollary 10.7(c). *)
-Corollary mFT_sub_Sylow_trans : forall Q x,
- Q \subset P -> Q :^ x \subset P -> exists2 y, y \in 'N(P) & Q :^ x = Q :^ y.
-Proof.
-move=> Q x; have [-> /trivgP-> /trivgP-> | ntP sQP sQxP] := eqsVneq P 1.
- by exists 1; rewrite ?group1 ?conjs1g.
-have ltNG: 'N(P) \proper G := mFT_norm_proper ntP (mFT_pgroup_proper pP).
-have [M /=] := mmax_exists ltNG; case/setIdP=> maxM sNM.
-have [ltMG solM] := (mmax_proper maxM, mmax_sol maxM).
-have [pl1M sPM] := (mFT_proper_plength1 p ltMG, subset_trans (normG P) sNM).
-have sylP := pHall_subl sPM (subsetT M) sylP_G.
-have sMp: p \in \sigma(M) by apply/exists_inP; exists P.
-have [transCQ _ _] := sigma_group_trans maxM sMp (pgroupS sQP pP).
-have [||q cQq [u Mu defx]] := transCQ x; try exact: subset_trans _ sPM.
-have nQC := normP (subsetP (cent_sub Q) _ _).
-have [|q' cMQq' [y nMPy defu]] := plength1_Sylow_trans sylP pl1M solM sQP Mu.
- by rewrite defx conjsgM nQC in sQxP.
-have [[_ nPy] [_ cQq']] := (setIP nMPy, setIP cMQq').
-by exists y; rewrite // defx defu !conjsgM 2?nQC.
-Qed.
-
-(* This is B & G, Corollary 10.7(d). *)
-Corollary mFT_subnorm_Sylow Q : Q \subset P -> p.-Sylow('N(Q)) 'N_P(Q).
-Proof.
-move=> sQP; have pQ := pgroupS sQP pP.
-have [S /= sylS] := Sylow_exists p 'N(Q); have [sNS pS _] := and3P sylS.
-have sQS: Q \subset S := normal_sub_max_pgroup (Hall_max sylS) pQ (normalG Q).
-have [x _ sSxP] := Sylow_Jsub sylP_G (subsetT S) pS.
-have sQxP: Q :^ x \subset P by rewrite (subset_trans _ sSxP) ?conjSg.
-have [y nPy defQy] := mFT_sub_Sylow_trans sQP sQxP.
-have nQxy: x * y^-1 \in 'N(Q) by rewrite inE conjsgM defQy actK.
-have sSxyP: S :^ (x * y^-1) \subset P by rewrite conjsgM sub_conjgV (normP nPy).
-have sylSxy: p.-Sylow('N(Q)) (S :^ (x * y^-1)) by rewrite pHallJ.
-have pNPQ: p.-group 'N_P(Q) := pgroupS (subsetIl P 'N(Q)) pP.
-by rewrite (sub_pHall sylSxy pNPQ) ?subsetIr // subsetI sSxyP (@pHall_sub _ p).
-Qed.
-
-(* This is B & G, Corollary 10.7(e). *)
-Corollary mFT_Sylow_normalS Q R :
- p.-group R -> Q \subset P :&: R -> Q <| 'N(P) -> Q <| 'N(R).
-Proof.
-move=> pR /subsetIP[sQP sQR] /andP[nQP nQ_NP].
-have [x _ sRxP] := Sylow_Jsub sylP_G (subsetT R) pR.
-rewrite /normal normsG //; apply/subsetP=> y nRy.
-have sQxP: Q :^ x \subset P by rewrite (subset_trans _ sRxP) ?conjSg.
-have sQyxP: Q :^ (y * x) \subset P.
- by rewrite actM (subset_trans _ sRxP) // -(normP nRy) !conjSg.
-have [t tNP defQx] := mFT_sub_Sylow_trans sQP sQxP.
-have [z zNP defQxy] := mFT_sub_Sylow_trans sQP sQyxP.
-by rewrite inE -(conjSg _ _ x) -actM /= defQx defQxy !(normsP nQ_NP).
-Qed.
-
-End OneSylow.
-
-Section AnotherMaximal.
-
-Variable M : {group gT}.
-Hypothesis maxM : M \in 'M.
-
-Let solM : solvable M := mmax_sol maxM.
-Let ltMG : M \proper G := mmax_proper maxM.
-
-Let sMbMs : M`_\beta \subset M`_\sigma := Mbeta_sub_Msigma maxM.
-Let nsMbM : M`_\beta <| M := pcore_normal _ _.
-
-Let hallMs : \sigma(M).-Hall(M) M`_\sigma := Msigma_Hall maxM.
-Let nsMsM : M`_\sigma <| M := pcore_normal _ M.
-Let sMsM' : M`_\sigma \subset M^`(1) := Msigma_der1 maxM.
-
-Lemma Mbeta_der1 : M`_\beta \subset M^`(1).
-Proof. exact: subset_trans sMbMs sMsM'. Qed.
-
-Let sM'M : M^`(1) \subset M := der_sub 1 M.
-Let nsMsM' : M`_\sigma <| M^`(1) := normalS sMsM' sM'M nsMsM.
-Let nsMbM' : M`_\beta <| M^`(1) := normalS Mbeta_der1 sM'M nsMbM.
-Let nMbM' := normal_norm nsMbM'.
-
-(* This is B & G, Lemma 10.8(c). *)
-Lemma beta_max_pdiv p :
- p \notin \beta(M) ->
- [/\ p^'.-Hall(M^`(1)) 'O_p^'(M^`(1)),
- p^'.-Hall(M`_\sigma) 'O_p^'(M`_\sigma)
- & forall q, q \in \pi(M / 'O_p^'(M)) -> q <= p].
-Proof.
-rewrite !inE -negb_exists_in negbK => /exists_inP[P sylP nnP].
-have [|ncM' p_max] := narrow_der1_complement_max_pdiv (mFT_odd M) solM sylP nnP.
- by rewrite mFT_proper_plength1 ?implybT.
-by rewrite -(pcore_setI_normal _ nsMsM') (Hall_setI_normal nsMsM').
-Qed.
-
-(* This is B & G, Lemma 10.8(a), first part. *)
-Lemma Mbeta_Hall : \beta(M).-Hall(M) M`_\beta.
-Proof.
-have [H hallH] := Hall_exists \beta(M) solM; have [sHM bH _]:= and3P hallH.
-rewrite [M`_\beta](sub_pHall hallH) ?pcore_pgroup ?pcore_sub //=.
-rewrite -(setIidPl sMbMs) pcore_setI_normal ?pcore_normal //.
-have sH: \sigma(M).-group H := sub_pgroup (beta_sub_sigma maxM) bH.
-have sHMs: H \subset M`_\sigma by rewrite (sub_Hall_pcore hallMs).
-rewrite -pcoreNK -bigcap_p'core subsetI sHMs.
-apply/bigcapsP=> p b'p; have [_ hallKp' _] := beta_max_pdiv b'p.
-by rewrite (sub_Hall_pcore hallKp') ?(pi_p'group bH).
-Qed.
-
-(* This is B & G, Lemma 10.8(a), second part. *)
-Lemma Mbeta_Hall_G : \beta(M).-Hall(G) M`_\beta.
-Proof.
-apply: (subHall_Hall (Msigma_Hall_G maxM) (beta_sub_sigma maxM)).
-exact: pHall_subl sMbMs (pcore_sub _ _) Mbeta_Hall.
-Qed.
-
-(* This is an equivalent form of B & G, Lemma 10.8(b), which is used directly *)
-(* later in the proof (e.g., Corollary 10.9a below, and Lemma 12.11), and is *)
-(* proved as an intermediate step of the proof of of 12.8(b). *)
-Lemma Mbeta_quo_nil : nilpotent (M^`(1) / M`_\beta).
-Proof.
-have /and3P[_ bMb b'M'Mb] := pHall_subl Mbeta_der1 sM'M Mbeta_Hall.
-apply: nilpotentS (Fitting_nil (M^`(1) / M`_\beta)) => /=.
-rewrite -{1}[_ / _]Sylow_gen gen_subG.
-apply/bigcupsP=> Q /SylowP[q _ /and3P[sQM' qQ _]].
-apply: subset_trans (pcore_sub q _).
-rewrite p_core_Fitting -pcoreNK -bigcap_p'core subsetI sQM' /=.
-apply/bigcapsP=> [[p /= _] q'p]; have [b_p | b'p] := boolP (p \in \beta(M)).
- by rewrite pcore_pgroup_id ?(pi'_p'group _ b_p) // /pgroup card_quotient.
-have p'Mb: p^'.-group M`_\beta := pi_p'group bMb b'p.
-rewrite sub_Hall_pcore ?(pi_p'group qQ) {Q qQ sQM'}//.
-rewrite pquotient_pcore ?quotient_pHall 1?gFsub_trans //.
-by have [-> _ _] := beta_max_pdiv b'p.
-Qed.
-
-(* This is B & G, Lemma 10.8(b), generalized to arbitrary beta'-subgroups of *)
-(* M^`(1) (which includes Hall beta'-subgroups of M^`(1) and M`_\beta). *)
-Lemma beta'_der1_nil H : \beta(M)^'.-group H -> H \subset M^`(1) -> nilpotent H.
-Proof.
-move=> b'H sHM'; have [_ bMb _] := and3P Mbeta_Hall.
-have{b'H} tiMbH: M`_\beta :&: H = 1 := coprime_TIg (pnat_coprime bMb b'H).
-rewrite {tiMbH}(isog_nil (quotient_isog (subset_trans sHM' nMbM') tiMbH)).
-exact: nilpotentS (quotientS _ sHM') Mbeta_quo_nil.
-Qed.
-
-(* This is B & G, Corollary 10.9(a). *)
-Corollary beta'_cent_Sylow p q X :
- p \notin \beta(M) -> q \notin \beta(M) -> q.-group X ->
- (p != q) && (X \subset M^`(1)) || (p < q) && (X \subset M) ->
- [/\ (*a1*) exists2 P, p.-Sylow(M`_\sigma) (gval P) & X \subset 'C(P),
- (*a2*) p \in \alpha(M) -> 'C_M(X)%G \in 'U
- & (*a3*) q.-Sylow(M^`(1)) X ->
- exists2 P, p.-Sylow(M^`(1)) (gval P) & P \subset 'N_M(X)^`(1)].
-Proof.
-move=> b'p b'q qX q'p_sXM'; pose pq : nat_pred := pred2 p q.
-have [q'p sXM]: p \in q^' /\ X \subset M.
- case/orP: q'p_sXM' => /andP[q'p /subset_trans-> //].
- by rewrite !inE neq_ltn q'p.
-have sXM'M: X <*> M^`(1) \subset M by rewrite join_subG sXM.
-have solXM': solvable (X <*> M^`(1)) := solvableS sXM'M solM.
-have pqX: pq.-group X by rewrite (pi_pgroup qX) ?inE ?eqxx ?orbT.
-have{solXM' pqX} [W /= hallW sXW] := Hall_superset solXM' (joing_subl _ _) pqX.
-have [sWXM' pqW _] := and3P hallW; have sWM := subset_trans sWXM' sXM'M.
-have{b'q} b'W: \beta(M)^'.-group W. (* GG -- Coq diverges on b'p <> b'q *)
- by apply: sub_pgroup pqW => r /pred2P[]->; [apply: b'p | apply: b'q].
-have nilM'W: nilpotent (M^`(1) :&: W).
- by rewrite beta'_der1_nil ?subsetIl ?(pgroupS (subsetIr _ _)).
-have{nilM'W} nilW: nilpotent W.
- do [case/orP: q'p_sXM'=> /andP[]] => [_ sXM' | lt_pq _].
- by rewrite -(setIidPr sWXM') (joing_idPr sXM').
- pose Wq := 'O_p^'(M) :&: W; pose Wp := 'O_p(M^`(1) :&: W).
- have nMp'M := char_norm (pcore_char p^' M).
- have nMp'W := subset_trans sWM nMp'M.
- have sylWq: q.-Sylow(W) Wq.
- have [sWqMp' sWp'W] := subsetIP (subxx Wq).
- have [Q sylQ] := Sylow_exists q W; have [sQW qQ _] := and3P sylQ.
- rewrite [Wq](sub_pHall sylQ _ _ (subsetIr _ W)) //= -/Wq.
- apply/pgroupP=> r r_pr r_dv_Wp'.
- have:= pgroupP (pgroupS sWqMp' (pcore_pgroup _ _)) r r_pr r_dv_Wp'.
- by apply/implyP; rewrite implyNb; apply: (pgroupP (pgroupS sWp'W pqW)).
- have [[_ _ max_p] sQM] := (beta_max_pdiv b'p, subset_trans sQW sWM).
- rewrite subsetI sQW -quotient_sub1 ?(subset_trans sQM nMp'M) //.
- apply: contraLR lt_pq; rewrite -leqNgt andbT subG1 -rank_gt0.
- rewrite (rank_pgroup (quotient_pgroup _ qQ)) p_rank_gt0 => piQb_q.
- exact: max_p (piSg (quotientS _ sQM) piQb_q).
- have nM'W: W \subset 'N(M^`(1)) by rewrite (subset_trans sWM) ?der_norm.
- have qWWM': q.-group (W / (M^`(1) :&: W)).
- rewrite (isog_pgroup _ (second_isog _)) ?(pgroupS (quotientS _ sWXM')) //=.
- by rewrite (quotientYidr (subset_trans sXW nM'W)) quotient_pgroup.
- have{qWWM'} sylWp: p.-Sylow(W) Wp.
- rewrite /pHall pcore_pgroup gFsub_trans ?subsetIr //=.
- rewrite -(Lagrange_index (subsetIr _ _) (pcore_sub _ _)) pnat_mul //.
- rewrite -(divgS (pcore_sub _ _)) -card_quotient ?normsI ?normG //= -pgroupE.
- rewrite (pi_p'group qWWM') //= -(dprod_card (nilpotent_pcoreC p nilM'W)).
- by rewrite mulKn ?cardG_gt0 // -pgroupE pcore_pgroup.
- have [[sWqW qWq _] [sWpW pWp _]] := (and3P sylWq, and3P sylWp).
- have <-: Wp * Wq = W.
- apply/eqP; rewrite eqEcard mul_subG //= -(partnC q (cardG_gt0 W)).
- rewrite (coprime_cardMg (p'nat_coprime (pi_pnat pWp _) qWq)) //.
- rewrite (card_Hall sylWp) (card_Hall sylWq) -{2}(part_pnat_id pqW) -partnI.
- rewrite mulnC (@eq_partn _ p) // => r.
- by rewrite !inE andb_orl andbN orbF; apply: andb_idr; move/eqP->.
- apply: nilpotentS (mul_subG _ _) (Fitting_nil W).
- rewrite Fitting_max ?(pgroup_nil pWp) //.
- by rewrite gFnormal_trans //= setIC norm_normalI.
- by rewrite Fitting_max ?(pgroup_nil qWq) //= setIC norm_normalI.
-have part1: exists2 P : {group gT}, p.-Sylow(M`_\sigma) P & X \subset 'C(P).
- have sMsXM' := subset_trans sMsM' (joing_subr X _).
- have nsMsXM': M`_\sigma <| X <*> M^`(1) := normalS sMsXM' sXM'M nsMsM.
- have sylWp: p.-Hall(M`_\sigma) ('O_p(W) :&: M`_\sigma).
- rewrite setIC (Sylow_setI_normal nsMsXM') //.
- exact: subHall_Sylow hallW (predU1l _ _) (nilpotent_pcore_Hall p nilW).
- have [_ _ cWpWp' _] := dprodP (nilpotent_pcoreC p nilW).
- exists ('O_p(W) :&: M`_\sigma)%G; rewrite ?(centSS _ _ cWpWp') ?subsetIl //.
- by rewrite (sub_Hall_pcore (nilpotent_pcore_Hall _ _)) ?(pi_p'group qX).
-split=> // [a_p | {part1}sylX].
- have ltCMX_G := sub_proper_trans (subsetIl M 'C(X)) ltMG.
- have [P sylP cPX] := part1; have s_p := alpha_sub_sigma maxM a_p.
- have{sylP} sylP := subHall_Sylow hallMs s_p sylP.
- apply: rank3_Uniqueness ltCMX_G (leq_trans a_p _).
- by rewrite -(rank_Sylow sylP) rankS //= subsetI (pHall_sub sylP) // centsC.
-do [move: sWXM'; rewrite (joing_idPr (pHall_sub sylX)) => sWM'] in hallW.
-have nMbX: X \subset 'N(M`_\beta) := subset_trans sXM (normal_norm nsMbM).
-have nsMbXM : M`_\beta <*> X <| M.
- rewrite -{2}(quotientGK nsMbM) -quotientYK ?cosetpre_normal //=.
- rewrite (eq_Hall_pcore _ (quotient_pHall nMbX sylX)); last first.
- exact: nilpotent_pcore_Hall Mbeta_quo_nil.
- by rewrite gFnormal_trans ?quotient_normal ?gFnormal.
-pose U := 'N_M(X); have defM: M`_\beta * U = M.
- have sXU : X \subset U by rewrite subsetI sXM normG.
- rewrite -[U](mulSGid sXU) /= -/U mulgA -norm_joinEr //.
- apply: Frattini_arg nsMbXM (pHall_subl (joing_subr _ X) _ sylX).
- by rewrite join_subG Mbeta_der1 (pHall_sub sylX).
-have sWpU: 'O_p(W) \subset U.
- rewrite gFsub_trans // subsetI sWM normal_norm //=.
- have sylX_W: q.-Sylow(W) X := pHall_subl sXW sWM' sylX.
- by rewrite (eq_Hall_pcore (nilpotent_pcore_Hall q nilW) sylX_W) pcore_normal.
-have sylWp: p.-Sylow(M^`(1)) 'O_p(W).
- exact: subHall_Sylow hallW (predU1l _ _) (nilpotent_pcore_Hall p nilW).
-exists 'O_p(W)%G; rewrite //= -(setIidPl (pHall_sub sylWp)).
-rewrite (pprod_focal_coprime defM) ?pcore_normal ?subsetIr //.
-exact: pnat_coprime (pcore_pgroup _ _) (pi_pnat (pcore_pgroup _ _) _).
-Qed.
-
-(* This is B & G, Corollary 10.9(b). *)
-Corollary nonuniq_norm_Sylow_pprod p H S :
- H \in 'M -> H :!=: M -> p.-Sylow(G) S -> 'N(S) \subset H :&: M ->
- M`_\beta * (H :&: M) = M /\ \alpha(M) =i \beta(M).
-Proof.
-move=> maxH neqHM sylS_G sN_HM; have [sNH sNM] := subsetIP sN_HM.
-have [sSM sSH] := (subset_trans (normG S) sNM, subset_trans (normG S) sNH).
-have [sylS pS] := (pHall_subl sSM (subsetT M) sylS_G, pHall_pgroup sylS_G).
-have sMp: p \in \sigma(M) by apply/exists_inP; exists S.
-have aM'p: p \in \alpha(M)^'.
- apply: contra neqHM; rewrite !inE -(rank_Sylow sylS) => rS.
- have uniqS: S \in 'U := rank3_Uniqueness (mFT_pgroup_proper pS) rS.
- by rewrite (eq_uniq_mmax (def_uniq_mmax uniqS maxM sSM) maxH sSH).
-have sSM': S \subset M^`(1).
- by rewrite (subset_trans _ sMsM') ?(sub_Hall_pcore hallMs) ?(pi_pgroup pS).
-have nMbS := subset_trans sSM (normal_norm nsMbM).
-have nMbSM: M`_\beta <*> S <| M.
- rewrite -{2}(quotientGK nsMbM) -quotientYK ?cosetpre_normal //=.
- have sylS_M' := pHall_subl sSM' sM'M sylS.
- rewrite (eq_Hall_pcore _ (quotient_pHall nMbS sylS_M')); last first.
- exact: nilpotent_pcore_Hall Mbeta_quo_nil.
- by rewrite gFnormal_trans ?quotient_normal ?gFnormal.
-have defM: M`_\beta * 'N_M(S) = M.
- have sSNM: S \subset 'N_M(S) by rewrite subsetI sSM normG.
- rewrite -(mulSGid sSNM) /= mulgA -norm_joinEr //.
- by rewrite (Frattini_arg _ (pHall_subl _ _ sylS_G)) ?joing_subr ?subsetT.
-split=> [|q].
- apply/eqP; rewrite setIC eqEsubset mulG_subG subsetIl pcore_sub /=.
- by rewrite -{1}defM mulgS ?setIS.
-apply/idP/idP=> [aMq|]; last exact: beta_sub_alpha.
-apply: contraR neqHM => bM'q; have bM'p := contra (@beta_sub_alpha _ M p) aM'p.
-have [|_ uniqNM _] := beta'_cent_Sylow bM'q bM'p pS.
- by apply: contraR aM'p; rewrite sSM'; case: eqP => //= <- _.
-rewrite (eq_uniq_mmax (def_uniq_mmax (uniqNM aMq) maxM (subsetIl _ _)) maxH) //.
-by rewrite subIset ?(subset_trans (cent_sub _)) ?orbT.
-Qed.
-
-(* This is B & G, Proposition 10.10. *)
-Proposition max_normed_2Elem_signaliser p q (A Q : {group gT}) :
- p != q -> A \in 'E_p^2(G) :&: 'E*_p(G) -> Q \in |/|*(A; q) ->
- q %| #|'C(A)| ->
- exists2 P : {group gT}, p.-Sylow(G) P /\ A \subset P
- & [/\ (*a*) 'O_p^'('C(P)) * ('N(P) :&: 'N(Q)) = 'N(P),
- (*b*) P \subset 'N(Q)^`(1)
- & (*c*) q.-narrow Q -> P \subset 'C(Q)].
-Proof.
-move=> neq_pq /setIP[Ep2A EpmA] maxQ piCAq.
-have [_ abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
-have [p_pr oA] := (pnElem_prime Ep2A, card_pnElem Ep2A).
-have{dimA} rA2: 'r(A) = 2 by rewrite (rank_abelem abelA).
-have{EpmA} ncA: normed_constrained A.
- have ntA: A :!=: 1 by rewrite -rank_gt0 rA2.
- exact: plength_1_normed_constrained ntA EpmA (mFT_proper_plength1 _).
-pose pi := \pi(A); pose K := 'O_pi^'('C(A)).
-have def_pi : pi =i (p : nat_pred).
- by move=> r; rewrite !inE /= oA primes_exp ?primes_prime ?inE.
-have pi'q : q \notin pi by rewrite def_pi !inE eq_sym.
-have transKA: [transitive K, on |/|*(A; q) | 'JG].
- by rewrite normed_constrained_rank2_trans // (center_idP cAA) rA2.
-have [P0 sylP0 sAP0] := Sylow_superset (subsetT _) pA.
-have pP0: p.-group P0 := pHall_pgroup sylP0.
-have piP0: pi.-group P0 by rewrite (eq_pgroup _ def_pi).
-have{pP0} snAP0: A <|<| P0 := nilpotent_subnormal (pgroup_nil pP0) sAP0.
-have{pi'q snAP0 ncA piP0} [//|] := normed_trans_superset ncA pi'q snAP0 piP0.
-rewrite /= -/pi -/K => -> transKP submaxPA maxPfactoring.
-have{transKP} [Q0 maxQ0 _] := imsetP transKP.
-have{transKA} [k Kk defQ] := atransP2 transKA (subsetP submaxPA _ maxQ0) maxQ.
-set P := P0 :^ k; have{sylP0} sylP: p.-Sylow(G) P by rewrite pHallJ ?in_setT.
-have nAK: K \subset 'N(A) by rewrite cents_norm ?pcore_sub.
-have{sAP0 nAK K Kk} sAP: A \subset P by rewrite -(normsP nAK k Kk) conjSg.
-exists [group of P] => //.
-have{maxPfactoring} [sPNQ' defNP] := maxPfactoring _ maxQ0.
-move/(congr1 ('Js%act^~ k)): defNP sPNQ'; rewrite -(conjSg _ _ k) /=.
-rewrite conjsMg !conjIg !conjsRg -!derg1 -!normJ -pcoreJ -centJ -/P.
-rewrite -(congr_group defQ) (eq_pcore _ (eq_negn def_pi)) => defNP sPNQ'.
-have{sPNQ'} sPNQ': P \subset 'N(Q)^`(1).
- by rewrite (setIidPl (mFT_Sylow_der1 sylP)) in sPNQ'.
-split=> // narrowQ; have [-> | ntQ] := eqsVneq Q 1; first exact: cents1.
-pose AutQ := conj_aut Q @* 'N(Q).
-have qQ: q.-group Q by case/mem_max_normed: maxQ.
-have ltNG: 'N(Q) \proper G by rewrite mFT_norm_proper // (mFT_pgroup_proper qQ).
-have{ltNG} qAutQ': q.-group AutQ^`(1).
- have qAutQq: q.-group 'O_q(AutQ) := pcore_pgroup _ _.
- rewrite (pgroupS _ qAutQq) // der1_min ?gFnorm //.
- have solAutQ: solvable AutQ by rewrite morphim_sol -?mFT_sol_proper.
- have [oddQ oddAutQ]: odd #|Q| /\ odd #|AutQ| by rewrite morphim_odd mFT_odd.
- by have /(Aut_narrow qQ)[] := Aut_conj_aut Q 'N(Q).
-have nQP: P \subset 'N(Q) := subset_trans sPNQ' (der_sub 1 _).
-rewrite (sameP setIidPl eqP) eqEsubset subsetIl /=.
-rewrite -quotient_sub1 ?normsI ?normG ?norms_cent //= -ker_conj_aut subG1.
-rewrite trivg_card1 (card_isog (first_isog_loc _ _)) //= -trivg_card1 -subG1.
-have q'AutP: q^'.-group (conj_aut Q @* P).
- by rewrite morphim_pgroup //; apply: pi_pnat (pHall_pgroup sylP) _.
-rewrite -(coprime_TIg (pnat_coprime qAutQ' q'AutP)) subsetI subxx.
-by rewrite /= -morphim_der // morphimS.
-Qed.
-
-(* Notation for Proposition 11, which is the last to appear in this segment. *)
-Local Notation sigma' := \sigma(gval M)^'.
-
-(* This is B & G, Proposition 10.11(a). *)
-Proposition sigma'_not_uniq K : K \subset M -> sigma'.-group K -> K \notin 'U.
-Proof.
-move=> sKM sg'K; have [E hallE sKE] := Hall_superset solM sKM sg'K.
-have [sEM sg'E _] := and3P hallE.
-have rEle2: 'r(E) <= 2.
- have [q _ ->] := rank_witness E; rewrite leqNgt; apply/negP=> rEgt2.
- have: q \in sigma' by rewrite (pnatPpi sg'E) // -p_rank_gt0 -(subnKC rEgt2).
- by rewrite inE /= alpha_sub_sigma //; apply: leq_trans (p_rankS q sEM).
-have [E1 | ntE]:= eqsVneq E 1.
- by apply: contraL (@uniq_mmax_neq1 _ K) _; rewrite -subG1 -E1.
-pose p := max_pdiv #|E|; pose P := 'O_p(E).
-have piEp: p \in \pi(E) by rewrite pi_max_pdiv cardG_gt1.
-have sg'p: p \in sigma' by rewrite (pnatPpi sg'E).
-have sylP: p.-Sylow(E) P.
- rewrite rank2_max_pcore_Sylow ?mFT_odd ?(solvableS sEM solM) //.
- exact: leq_trans (rankS (Fitting_sub E)) rEle2.
-apply: contra (sg'p) => uniqK; apply/existsP; exists [group of P].
-have defMK := def_uniq_mmax uniqK maxM (subset_trans sKE sEM).
-rewrite (subHall_Sylow hallE) // (sub_uniq_mmax defMK) //; last first.
- rewrite mFT_norm_proper ?(mFT_pgroup_proper (pcore_pgroup _ _)) //.
- by rewrite -cardG_gt1 (card_Hall sylP) p_part_gt1.
-by rewrite (subset_trans sKE) // gFnorm.
-Qed.
-
-(* This is B & G, Proposition 10.11(b). *)
-Proposition sub'cent_sigma_rank1 K :
- K \subset M -> sigma'.-group K -> 'r('C_K(M`_\sigma)) <= 1.
-Proof.
-move=> sKM sg'K; rewrite leqNgt; apply/rank_geP=> [[A /nElemP[p Ep2A]]].
-have p_pr := pnElem_prime Ep2A.
-have [sACKMs abelA dimA] := pnElemP Ep2A; rewrite subsetI centsC in sACKMs.
-have{sACKMs} [sAK cAMs]: A \subset K /\ M`_\sigma \subset 'C(A) := andP sACKMs.
-have sg'p: p \in sigma'.
- by rewrite (pgroupP (pgroupS sAK sg'K)) // (card_pnElem Ep2A) dvdn_mull.
-have [Ms1 | [q q_pr q_dvd_Ms]] := trivgVpdiv M`_\sigma.
- by case/eqP: (Msigma_neq1 maxM).
-have sg_q: q \in \sigma(M) := pgroupP (pcore_pgroup _ _) _ q_pr q_dvd_Ms.
-have neq_pq: p != q by apply: contraNneq sg'p => ->.
-have [Q sylQ] := Sylow_exists q M`_\sigma; have [sQMs qQ _] := and3P sylQ.
-have cAQ: Q \subset 'C(A) := subset_trans sQMs cAMs.
-have{q_dvd_Ms} q_dv_CA: q %| #|'C(A)|.
- rewrite (dvdn_trans _ (cardSg cAQ)) // -(part_pnat_id (pnat_id q_pr)).
- by rewrite (card_Hall sylQ) partn_dvd.
-have{cAQ} maxQ: Q \in |/|*(A; q).
- rewrite inE; apply/maxgroupP; rewrite qQ cents_norm 1?centsC //.
- split=> // Y /andP[qY _] sQY; apply: sub_pHall qY sQY (subsetT Y).
- by rewrite (subHall_Sylow (Msigma_Hall_G maxM)).
-have sNQM: 'N(Q) \subset M.
- by rewrite (norm_sigma_Sylow sg_q) // (subHall_Sylow hallMs).
-have rCAle2: 'r('C(A)) <= 2.
- apply: contraR (sigma'_not_uniq sKM sg'K); rewrite -ltnNge => rCAgt2.
- apply: uniq_mmaxS sAK (sub_mmax_proper maxM sKM) _.
- by apply: cent_rank3_Uniqueness rCAgt2; rewrite (rank_abelem abelA) dimA.
-have max2A: A \in 'E_p^2(G) :&: 'E*_p(G).
- rewrite 3!inE subsetT abelA dimA; apply/pmaxElemP; rewrite inE subsetT.
- split=> // Y /pElemP[_ abelY /eqVproper[]//ltAY].
- have [pY cYY _] := and3P abelY.
- suffices: 'r_p('C(A)) > 2 by rewrite ltnNge (leq_trans (p_rank_le_rank p _)).
- rewrite -dimA (leq_trans (properG_ltn_log pY ltAY)) //.
- by rewrite logn_le_p_rank // inE centsC (subset_trans (proper_sub ltAY)).
-have{rCAle2 cAMs} Ma1: M`_\alpha = 1.
- apply: contraTeq rCAle2; rewrite -rank_gt0 -ltnNge.
- have [r _ ->] := rank_witness M`_\alpha; rewrite p_rank_gt0.
- move/(pnatPpi (pcore_pgroup _ _))=> a_r; apply: (leq_trans a_r).
- have [R sylR] := Sylow_exists r M`_\sigma.
- have sylR_M: r.-Sylow(M) R.
- by rewrite (subHall_Sylow (Msigma_Hall maxM)) ?alpha_sub_sigma.
- rewrite -(p_rank_Sylow sylR_M) (p_rank_Sylow sylR).
- by rewrite (leq_trans (p_rank_le_rank r _)) // rankS // centsC.
-have{Ma1} nilM': nilpotent M^`(1).
- by rewrite (isog_nil (quotient1_isog _)) -Ma1 Malpha_quo_nil.
-have{max2A maxQ neq_pq q_dv_CA} [P [sylP sAP] sPNQ']:
- exists2 P : {group gT}, p.-Sylow(G) P /\ A \subset P & P \subset 'N(Q)^`(1).
-- by case/(max_normed_2Elem_signaliser neq_pq): maxQ => // P ? []; exists P.
-have{sNQM} defP: 'O_p(M^`(1)) = P.
- rewrite (nilpotent_Hall_pcore nilM' (pHall_subl _ _ sylP)) ?subsetT //.
- by rewrite (subset_trans sPNQ') ?dergS.
-have nsPM: P <| M by rewrite -defP !gFnormal_trans.
-have sPM := normal_sub nsPM.
-case/exists_inP: sg'p; exists P; first exact: pHall_subl (subsetT M) sylP.
-by rewrite (mmax_normal maxM) // -rank_gt0 ltnW // -dimA -rank_abelem ?rankS.
-Qed.
-
-(* This is B & G, Proposition 10.11(c). *)
-Proposition sub'cent_sigma_cyclic K (Y := 'C_K(M`_\sigma) :&: M^`(1)) :
- K \subset M -> sigma'.-group K -> cyclic Y /\ Y <| M.
-Proof.
-move=> sKM sg'K; pose Z := 'O_sigma'('F(M)).
-have nsZM: Z <| M by rewrite !gFnormal_trans.
-have [sZM nZM] := andP nsZM; have Fnil := Fitting_nil M.
-have rZle1: 'r(Z) <= 1.
- apply: leq_trans (rankS _) (sub'cent_sigma_rank1 sZM (pcore_pgroup _ _)).
- rewrite subsetI subxx (sameP commG1P trivgP) /=.
- rewrite -(TI_pcoreC \sigma(M) M 'F(M)) subsetI commg_subl commg_subr.
- by rewrite (subset_trans sZM) ?gFnorm ?gFsub_trans.
-have{rZle1} cycZ: cyclic Z.
- have nilZ: nilpotent Z := nilpotentS (gFsub _ _) Fnil.
- by rewrite nil_Zgroup_cyclic // odd_rank1_Zgroup // mFT_odd.
-have cZM': M^`(1) \subset 'C_M(Z).
- rewrite der1_min ?normsI ?normG ?norms_cent //= -ker_conj_aut.
- rewrite (isog_abelian (first_isog_loc _ _)) //.
- by rewrite (abelianS (Aut_conj_aut _ _)) // Aut_cyclic_abelian.
-have sYF: Y \subset 'F(M).
- apply: subset_trans (cent_sub_Fitting (mmax_sol maxM)).
- have [_ /= <- _ _] := dprodP (nilpotent_pcoreC \sigma(M) Fnil).
- by rewrite centM setICA setISS // setIC subIset ?centS // pcore_Fitting.
-have{sYF} sYZ: Y \subset Z.
- rewrite (sub_Hall_pcore (nilpotent_pcore_Hall _ Fnil)) //=.
- by rewrite -setIA (pgroupS (subsetIl K _)).
-by rewrite (cyclicS sYZ cycZ) (char_normal_trans _ nsZM) // sub_cyclic_char.
-Qed.
-
-(* This is B & G, Proposition 10.11(d). *)
-Proposition commG_sigma'_1Elem_cyclic p K P (K0 := [~: K, P]) :
- K \subset M -> sigma'.-group K -> p \in sigma' -> P \in 'E_p^1('N_M(K)) ->
- 'C_(M`_\sigma)(P) = 1 -> p^'.-group K -> abelian K ->
- [/\ K0 \subset 'C(M`_\sigma), cyclic K0 & K0 <| M].
-Proof.
-move=> sKM sg'K sg'p EpP regP p'K cKK.
-have nK0P: P \subset 'N(K0) := commg_normr P K.
-have p_pr := pnElem_prime EpP; have [sPMN _ oP] := pnElemPcard EpP.
-have [sPM nKP]: P \subset M /\ P \subset 'N(K) by apply/subsetIP.
-have /andP[sMsM nMsM]: M`_\sigma <| M := pcore_normal _ _.
-have sK0K: K0 \subset K by rewrite commg_subl.
-have [sK0M sg'K0]:= (subset_trans sK0K sKM, pgroupS sK0K sg'K).
-have [nMsK0 nMsP] := (subset_trans sK0M nMsM, subset_trans sPM nMsM).
-have coKP: coprime #|K| #|P| by rewrite oP coprime_sym prime_coprime -?p'natE.
-have coK0Ms: coprime #|K0| #|M`_\sigma|.
- by rewrite coprime_sym (pnat_coprime (pcore_pgroup _ _)).
-have nilK0Ms: nilpotent (K0 <*> M`_\sigma).
- have mulK0MsP: K0 <*> M`_\sigma ><| P = K0 <*> M`_\sigma <*> P.
- rewrite sdprodEY ?normsY // coprime_TIg //= norm_joinEl //.
- rewrite coprime_cardMg // coprime_mull (coprimeSg sK0K) //.
- by rewrite oP (pnat_coprime (pcore_pgroup _ _)) ?pnatE.
- apply: (prime_Frobenius_sol_kernel_nil mulK0MsP); rewrite ?oP //=.
- by rewrite (solvableS _ solM) // !join_subG sK0M pcore_sub.
- rewrite norm_joinEl // -subcent_TImulg ?subsetI ?nK0P //.
- by rewrite coprime_abel_cent_TI ?mul1g.
- exact: coprime_TIg.
-have cMsK0: K0 \subset 'C(M`_\sigma).
- rewrite (sub_nilpotent_cent2 nilK0Ms) ?joing_subl ?joing_subr //.
- exact: pnat_coprime (pcore_pgroup _ _) sg'K0.
-have [cycY nsYM] := sub'cent_sigma_cyclic sK0M sg'K0.
-set Y := _ :&: _ in cycY nsYM.
-have sK0Y: K0 \subset Y by rewrite !subsetI subxx cMsK0 commgSS.
-split=> //; first exact: cyclicS sK0Y cycY.
-by apply: char_normal_trans nsYM; rewrite sub_cyclic_char.
-Qed.
-
-End AnotherMaximal.
-
-(* This is B & G, Lemma 10.12. *)
-Lemma sigma_disjoint M H :
- M \in 'M -> H \in 'M -> gval H \notin M :^: G ->
- [/\ (*a*) M`_\alpha :&: H`_\sigma = 1,
- [predI \alpha(M) & \sigma(H)] =i pred0
- & (*b*) nilpotent M`_\sigma ->
- M`_\sigma :&: H`_\sigma = 1
- /\ [predI \sigma(M) & \sigma(H)] =i pred0].
-Proof.
-move=> maxM maxH notjMH.
-suffices sigmaMHnil p: p \in [predI \sigma(M) & \sigma(H)] ->
- p \notin \alpha(M) /\ ~~ nilpotent M`_\sigma.
-- have a2: [predI \alpha(M) & \sigma(H)] =i pred0.
- move=> p; apply/andP=> [[/= aMp sHp]].
- by case: (sigmaMHnil p); rewrite /= ?aMp // inE /= alpha_sub_sigma.
- split=> // [|nilMs].
- rewrite coprime_TIg // (pnat_coprime (pcore_pgroup _ _)) //.
- apply: sub_in_pnat (pcore_pgroup _ _) => p _ sHp.
- by apply: contraFN (a2 p) => aMp; rewrite inE /= sHp andbT.
- have b2: [predI \sigma(M) & \sigma(H)] =i pred0.
- by move=> p; apply/negP; case/sigmaMHnil => _; rewrite nilMs.
- rewrite coprime_TIg // (pnat_coprime (pcore_pgroup _ _)) //.
- apply: sub_in_pnat (pcore_pgroup _ _) => p _ sHp.
- by apply: contraFN (b2 p) => bMp; rewrite inE /= sHp andbT.
-case/andP=> sMp sHp; have [S sylS]:= Sylow_exists p M.
-have [sSM pS _] := and3P sylS.
-have sylS_G: p.-Sylow(G) S := sigma_Sylow_G maxM sMp sylS.
-have [g sSHg]: exists g, S \subset H :^ g.
- have [Sg' sylSg']:= Sylow_exists p H.
- have [g _ ->] := Sylow_trans (sigma_Sylow_G maxH sHp sylSg') sylS_G.
- by exists g; rewrite conjSg (pHall_sub sylSg').
-have{notjMH} neqHgM: H :^ g != M.
- by apply: contraNneq notjMH => <-; rewrite orbit_sym mem_orbit ?in_setT.
-do [split; apply: contra neqHgM] => [|nilMs].
- rewrite !inE -(p_rank_Sylow sylS) -rank_pgroup //= => rS_gt3.
- have uniqS: S \in 'U := rank3_Uniqueness (mFT_pgroup_proper pS) rS_gt3.
- have defUS: 'M(S) = [set M] := def_uniq_mmax uniqS maxM sSM.
- by rewrite (eq_uniq_mmax defUS _ sSHg) ?mmaxJ.
-have nsSM: S <| M.
- have nsMsM: M`_\sigma <| M by apply: pcore_normal.
- have{sylS} sylS: p.-Sylow(M`_\sigma) S.
- apply: pHall_subl (pcore_sub _ _) sylS => //.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) ?(pi_pgroup pS).
- by rewrite (nilpotent_Hall_pcore nilMs sylS) gFnormal_trans.
-have sNS_Hg: 'N(S) \subset H :^ g.
- rewrite -sub_conjgV -normJ (norm_sigma_Sylow sHp) //.
- by rewrite (pHall_subl _ (subsetT _)) ?sub_conjgV // pHallJ ?in_setT.
-have ltHg: H :^ g \proper G by rewrite mmax_proper ?mmaxJ //.
-rewrite (mmax_max maxM ltHg) // -(mmax_normal maxM nsSM) //.
-by apply: contraTneq sNS_Hg => ->; rewrite norm1 proper_subn.
-Qed.
-
-(* This is B & G, Lemma 10.13. *)
-Lemma basic_p2maxElem_structure p A P :
- A \in 'E_p^2(G) :&: 'E*_p(G) -> p.-group P -> A \subset P -> ~~ abelian P ->
- let Z0 := ('Ohm_1('Z(P)))%G in
- [/\ (*a*) Z0 \in 'E_p^1(A),
- (*b*) exists Y : {group gT},
- [/\ cyclic Y, Z0 \subset Y
- & forall A0, A0 \in 'E_p^1(A) :\ Z0 -> A0 \x Y = 'C_P(A)]
- & (*c*) [transitive 'N_P(A), on 'E_p^1(A) :\ Z0| 'JG]].
-Proof.
-case/setIP=> Ep2A maxA pP sAP not_cPP Z0; set E1A := 'E_p^1(A).
-have p_pr: prime p := pnElem_prime Ep2A; have [_ abelA dimA] := pnElemP Ep2A.
-have [oA [pA cAA _]] := (card_pnElem Ep2A, and3P abelA).
-have [p_gt0 p_gt1] := (prime_gt0 p_pr, prime_gt1 p_pr).
-have{maxA} maxA S:
- p.-group S -> A \subset S -> A \in 'E*_p(S) /\ 'Ohm_1('C_S(A)) = A.
-- move=> pS sAS; suff maxAS: A \in 'E*_p(S) by rewrite (Ohm1_cent_max maxAS).
- by rewrite (subsetP (pmaxElemS p (subsetT S))) // inE maxA inE.
-have [S sylS sPS] := Sylow_superset (subsetT P) pP.
-pose Z1 := 'Ohm_1('Z(S))%G; have sZ1Z: Z1 \subset 'Z(S) := Ohm_sub 1 _.
-have [pS sAS] := (pHall_pgroup sylS, subset_trans sAP sPS).
-have [maxAS defC1] := maxA S pS sAS; set C := 'C_S(A) in defC1.
-have sZ0A: Z0 \subset A by rewrite -defC1 OhmS // setISS // centS.
-have sZ1A: Z1 \subset A by rewrite -defC1 OhmS // setIS // centS.
-have [pZ0 pZ1]: p.-group Z0 /\ p.-group Z1 by split; apply: pgroupS pA.
-have sZ10: Z1 \subset Z0.
- rewrite -[gval Z1]Ohm_id OhmS // subsetI (subset_trans sZ1A) //=.
- by rewrite (subset_trans sZ1Z) // subIset // centS ?orbT.
-have ntZ1: Z1 :!=: 1.
- have: A :!=: 1 by rewrite -cardG_gt1 oA (ltn_exp2l 0).
- apply: contraNneq; rewrite -subG1 -(setIidPr sZ1Z) => /TI_Ohm1.
- by rewrite setIid => /(trivg_center_pgroup pS) <-.
-have EpZ01: abelian C -> Z1 = Z0 /\ Z0 \in E1A.
- move=> cCC; have [eqZ0A | ltZ0A] := eqVproper sZ0A.
- rewrite (abelianS _ cCC) // in not_cPP.
- by rewrite subsetI sPS centsC -eqZ0A gFsub_trans ?subsetIr.
- have leZ0p: #|Z0| <= p ^ 1.
- by rewrite (card_pgroup pZ0) leq_exp2l // -ltnS -dimA properG_ltn_log.
- have [_ _ [e oZ1]] := pgroup_pdiv pZ1 ntZ1.
- have{e oZ1}: #|Z1| >= p by rewrite oZ1 (leq_exp2l 1).
- rewrite (geq_leqif (leqif_trans (subset_leqif_card sZ10) (leqif_eq leZ0p))).
- rewrite [E1A]p1ElemE // !inE sZ0A; case/andP=> sZ01 ->.
- by split=> //; apply/eqP; rewrite -val_eqE eqEsubset sZ10.
-have [A1 neqA1Z EpA1]: exists2 A1, A1 != Z1 & #|Z1| = p -> A1 \in E1A.
- have [oZ1 |] := #|Z1| =P p; last by exists 1%G; rewrite // eq_sym.
- have [A1 defA]:= abelem_split_dprod abelA sZ1A.
- have{defA} [_ defA _ tiA1Z1] := dprodP defA.
- have EpZ1: Z1 \in E1A by rewrite [E1A]p1ElemE // !inE sZ1A /= oZ1.
- suffices: A1 \in E1A by exists A1; rewrite // eq_sym; apply/(TIp1ElemP EpZ1).
- rewrite [E1A]p1ElemE // !inE -defA mulG_subr /=.
- by rewrite -(mulKn #|A1| p_gt0) -{1}oZ1 -TI_cardMg // defA oA mulKn.
-pose cplA1C Y := [/\ cyclic Y, Z0 \subset Y, A1 \x Y = C & abelian C].
-have [Y [{cplA1C} cycY sZ0Y defC cCC]]: exists Y, cplA1C Y.
- have [rSgt2 | rSle2] := ltnP 2 'r(S).
- rewrite (rank_pgroup pS) in rSgt2; have oddS := mFT_odd S.
- have max2AS: A \in 'E_p^2(S) :&: 'E*_p(S) by rewrite 3!inE sAS abelA dimA.
- have oZ1: #|Z1| = p by case/Ohm1_ucn_p2maxElem: max2AS => // _ [].
- have{EpA1} EpA1 := EpA1 oZ1; have [sA1A abelA1 oA1] := pnElemPcard EpA1.
- have EpZ1: Z1 \in E1A by rewrite [E1A]p1ElemE // !inE sZ1A /= oZ1.
- have [_ defA cA1Z tiA1Z] := dprodP (p2Elem_dprodP Ep2A EpA1 EpZ1 neqA1Z).
- have defC: 'C_S(A1) = C.
- rewrite /C -defA centM setICA setIC ['C_S(Z1)](setIidPl _) // centsC.
- by rewrite (subset_trans sZ1Z) ?subsetIr.
- have rCSA1: 'r_p('C_S(A1)) <= 2.
- by rewrite defC -p_rank_Ohm1 defC1 (p_rank_abelem abelA) dimA.
- have sA1S := subset_trans sA1A sAS.
- have nnS: p.-narrow S by apply/implyP=> _; apply/set0Pn; exists A.
- have [] := narrow_cent_dprod pS oddS rSgt2 nnS oA1 sA1S rCSA1.
- set Y := _ :&: _; rewrite {}defC => cycY _ _ defC; exists [group of Y].
- have cCC: abelian C; last split=> //.
- apply/center_idP; rewrite -(center_dprod defC).
- rewrite (center_idP (abelem_abelian abelA1)).
- by rewrite (center_idP (cyclic_abelian cycY)).
- have{EpZ01} [<- _] := EpZ01 cCC; rewrite subsetI (subset_trans sZ1Z) //.
- by rewrite setIS ?centS ?gFsub_trans.
- have not_cSS := contra (abelianS sPS) not_cPP.
- have:= mFT_rank2_Sylow_cprod sylS rSle2 not_cSS.
- case=> E [_ dimE3 eE] [Y cycY [defS defY1]].
- have [[_ mulEY cEY] cYY] := (cprodP defS, cyclic_abelian cycY).
- have defY: 'Z(S) = Y.
- case/cprodP: (center_cprod defS) => _ <- _.
- by rewrite (center_idP cYY) -defY1 mulSGid ?Ohm_sub.
- have pY: p.-group Y by rewrite -defY (pgroupS (center_sub S)).
- have sES: E \subset S by rewrite -mulEY mulG_subl.
- have pE := pgroupS sES pS.
- have defS1: 'Ohm_1(S) = E.
- apply/eqP; rewrite (OhmE 1 pS) eqEsubset gen_subG andbC.
- rewrite sub_gen; last by rewrite subsetI sES sub_LdivT.
- apply/subsetP=> ey /LdivP[]; rewrite -mulEY.
- case/imset2P=> e y Ee Yy -> eyp; rewrite groupM //.
- rewrite (subsetP (center_sub E)) // -defY1 (OhmE 1 pY) mem_gen //.
- rewrite expgMn in eyp; last by red; rewrite -(centsP cEY).
- by rewrite (exponentP eE) // mul1g in eyp; rewrite !inE Yy eyp eqxx.
- have sAE: A \subset E by rewrite -defS1 -(Ohm1_id abelA) OhmS.
- have defC: A * Y = C.
- rewrite /C -mulEY setIC -group_modr; last first.
- by rewrite -defY subIset // orbC centS.
- congr (_ * _); apply/eqP; rewrite /= setIC eqEcard subsetI sAE.
- have pCEA: p.-group 'C_E(A) := pgroupS (subsetIl E _) pE.
- rewrite -abelianE cAA (card_pgroup pCEA) oA leq_exp2l //= leqNgt.
- apply: contraL cycY => dimCEA3.
- have sAZE: A \subset 'Z(E).
- rewrite subsetI sAE // centsC (sameP setIidPl eqP) eqEcard subsetIl /=.
- by rewrite (card_pgroup pE) (card_pgroup pCEA) dimE3 leq_exp2l.
- rewrite abelian_rank1_cyclic // -ltnNge (rank_pgroup pY).
- by rewrite (p_rank_abelian p cYY) defY1 -dimA lognSg.
- have cAY: Y \subset 'C(A) by apply: centSS cEY.
- have cCC: abelian C by rewrite -defC abelianM cAA cYY.
- have{EpZ01} [eqZ10 EpZ1] := EpZ01 cCC; rewrite -eqZ10 in EpZ1.
- have sZ0Y: Z0 \subset Y by rewrite -eqZ10 -defY Ohm_sub.
- have{EpA1} EpA1 := EpA1 (card_pnElem EpZ1).
- have [sA1A _ oA1] := pnElemPcard EpA1.
- have [_ defA _ tiA1Z] := dprodP (p2Elem_dprodP Ep2A EpA1 EpZ1 neqA1Z).
- exists Y; split; rewrite // dprodE ?(centSS _ sA1A cAY) ?prime_TIg ?oA1 //.
- by rewrite -(mulSGid sZ0Y) -eqZ10 mulgA defA.
- apply: contraL cycY => sA1Y; rewrite abelian_rank1_cyclic // -ltnNge.
- by rewrite -dimA -rank_abelem ?rankS // -defA eqZ10 mul_subG.
-have{EpZ01} [eqZ10 EpZ0] := EpZ01 cCC; have oZ0 := card_pnElem EpZ0.
-have{EpA1} EpA1: A1 \in E1A by rewrite EpA1 ?eqZ10.
-have [sA1A _ oA1] := pnElemPcard EpA1; rewrite {}eqZ10 in neqA1Z.
-have [_ defA _ tiA1Z] := dprodP (p2Elem_dprodP Ep2A EpA1 EpZ0 neqA1Z).
-split=> //; first exists (P :&: Y)%G.
- have sPY_Y := subsetIr P Y; rewrite (cyclicS sPY_Y) //.
- rewrite subsetI (subset_trans sZ0A) //= sZ0Y.
- split=> // A0 /setD1P[neqA0Z EpA0]; have [sA0A _ _] := pnElemP EpA0.
- have [_ mulA0Z _ tiA0Z] := dprodP (p2Elem_dprodP Ep2A EpA0 EpZ0 neqA0Z).
- have{defC} [_ defC cA1Y tiA1Y] := dprodP defC.
- rewrite setIC -{2}(setIidPr sPS) setIAC.
- apply: dprod_modl (subset_trans sA0A sAP); rewrite -defC dprodE /=.
- - by rewrite -(mulSGid sZ0Y) !mulgA mulA0Z defA.
- - rewrite (centSS (subxx Y) sA0A) // -defA centM subsetI cA1Y /=.
- by rewrite sub_abelian_cent ?cyclic_abelian.
- rewrite setIC -(setIidPr sA0A) setIA -defA -group_modr //.
- by rewrite (setIC Y) tiA1Y mul1g setIC.
-apply/imsetP; exists A1; first by rewrite 2!inE neqA1Z.
-apply/eqP; rewrite eq_sym eqEcard; apply/andP; split.
- apply/subsetP=> _ /imsetP[x /setIP[Px nAx] ->].
- rewrite 2!inE /E1A -(normP nAx) pnElemJ EpA1 andbT -val_eqE /=.
- have nZ0P: P \subset 'N(Z0) by rewrite !gFnorm_trans.
- by rewrite -(normsP nZ0P x Px) (inj_eq (@conjsg_inj _ x)).
-have pN: p.-group 'N_P(_) := pgroupS (subsetIl P _) pP.
-have defCPA: 'N_('N_P(A))(A1) = 'C_P(A).
- apply/eqP; rewrite eqEsubset andbC subsetI setIS ?cent_sub //.
- rewrite subIset /=; last by rewrite orbC cents_norm ?centS.
- rewrite setIAC (subset_trans (subsetIl _ _)) //= subsetI subsetIl /=.
- rewrite -defA centM subsetI andbC subIset /=; last first.
- by rewrite centsC gFsub_trans ?subsetIr.
- have nC_NP: 'N_P(A1) \subset 'N('C(A1)) by rewrite norms_cent ?subsetIr.
- rewrite -quotient_sub1 // subG1 trivg_card1.
- rewrite (pnat_1 (quotient_pgroup _ (pN _))) //.
- rewrite -(card_isog (second_isog nC_NP)) /= (setIC 'C(A1)).
- by apply: p'group_quotient_cent_prime; rewrite ?subsetIr ?oA1.
-have sCN: 'C_P(A) \subset 'N_P(A) by rewrite setIS ?cent_sub.
-have nA_NCPA: 'N_P('C_P(A)) \subset 'N_P(A).
- have [_ defCPA1] := maxA P pP sAP.
- by rewrite -[in 'N(A)]defCPA1 setIS // gFnorm_trans.
-rewrite card_orbit astab1JG /= {}defCPA.
-rewrite -(leq_add2l (Z0 \in E1A)) -cardsD1 EpZ0 (card_p1Elem_p2Elem Ep2A) ltnS.
-rewrite dvdn_leq ?(pfactor_dvdn 1) ?indexg_gt0 // -divgS // logn_div ?cardSg //.
-rewrite subn_gt0 properG_ltn_log ?pN //= (proper_sub_trans _ nA_NCPA) //.
-rewrite (nilpotent_proper_norm (pgroup_nil pP)) // properEneq subsetIl andbT.
-by apply: contraNneq not_cPP => <-; rewrite (abelianS (setSI _ sPS)).
-Qed.
-
-(* This is B & G, Proposition 10.14(a). *)
-Proposition beta_not_narrow p : p \in \beta(G) ->
- [disjoint 'E_p^2(G) & 'E*_p(G)]
- /\ (forall P, p.-Sylow(G) P -> [disjoint 'E_p^2(P) & 'E*_p(P)]).
-Proof.
-move/forall_inP=> nnG.
-have nnSyl P: p.-Sylow(G) P -> [disjoint 'E_p^2(P) & 'E*_p(P)].
- by move/nnG; rewrite negb_imply negbK setI_eq0 => /andP[].
-split=> //; apply/pred0Pn=> [[E /andP[/= Ep2E EpmE]]].
-have [_ abelE dimE]:= pnElemP Ep2E; have pE := abelem_pgroup abelE.
-have [P sylP sEP] := Sylow_superset (subsetT E) pE.
-case/pred0Pn: (nnSyl P sylP); exists E; rewrite /= 2!inE sEP abelE dimE /=.
-by rewrite (subsetP (pmaxElemS p (subsetT P))) // inE EpmE inE.
-Qed.
-
-(* This is B & G, Proposition 10.14(b). *)
-Proposition beta_noncyclic_uniq p R :
- p \in \beta(G) -> p.-group R -> 'r(R) > 1 -> R \in 'U.
-Proof.
-move=> b_p pR rRgt1; have [P sylP sRP] := Sylow_superset (subsetT R) pR.
-rewrite (rank_pgroup pR) in rRgt1; have [A Ep2A] := p_rank_geP rRgt1.
-have [sAR abelA dimA] := pnElemP Ep2A; have p_pr := pnElem_prime Ep2A.
-case: (pickP [pred F in 'E_p(P) | A \proper F]) => [F | maxA]; last first.
- have [_ nnSyl] := beta_not_narrow b_p; case/pred0Pn: (nnSyl P sylP).
- exists A; rewrite /= (subsetP (pnElemS p 2 sRP)) //.
- apply/pmaxElemP; split=> [|F EpF]; first by rewrite inE (subset_trans sAR).
- by case/eqVproper=> [// | ltAF]; case/andP: (maxA F).
-case/andP=> /pElemP[_ abelF] ltAF; have [pF cFF _] := and3P abelF.
-apply: uniq_mmaxS sAR (mFT_pgroup_proper pR) _.
-have rCAgt2: 'r('C(A)) > 2.
- rewrite -dimA (leq_trans (properG_ltn_log pF ltAF)) // -(rank_abelem abelF).
- by rewrite rankS // centsC (subset_trans (proper_sub ltAF)).
-by apply: cent_rank3_Uniqueness rCAgt2; rewrite (rank_abelem abelA) dimA.
-Qed.
-
-(* This is B & G, Proposition 10.14(c). *)
-Proposition beta_subnorm_uniq p P X :
- p \in \beta(G) -> p.-Sylow(G) P -> X \subset P -> 'N_P(X)%G \in 'U.
-Proof.
-move=> b_p sylP sXP; set Q := 'N_P(X)%G.
-have pP := pHall_pgroup sylP; have pQ: p.-group Q := pgroupS (subsetIl _ _) pP.
-have [| rQle1] := ltnP 1 'r(Q); first exact: beta_noncyclic_uniq pQ.
-have cycQ: cyclic Q.
- by rewrite (odd_pgroup_rank1_cyclic pQ) ?mFT_odd -?rank_pgroup.
-have defQ: P :=: Q.
- apply: (nilpotent_sub_norm (pgroup_nil pP) (subsetIl _ _)).
- by rewrite setIS // char_norms // sub_cyclic_char // subsetI sXP normG.
-have:= forall_inP b_p P; rewrite inE negb_imply ltnNge; move/(_ sylP).
-by rewrite defQ -(rank_pgroup pQ) (leq_trans rQle1).
-Qed.
-
-(* This is B & G, Proposition 10.14(d). *)
-Proposition beta_norm_sub_mmax M Y :
- M \in 'M -> \beta(M).-subgroup(M) Y -> Y :!=: 1 -> 'N(Y) \subset M.
-Proof.
-move=> maxM /andP[sYM bY] ntY.
-have [F1 | [q q_pr q_dv_FY]] := trivgVpdiv 'F(Y).
- by rewrite -(trivg_Fitting (solvableS sYM (mmax_sol maxM))) F1 eqxx in ntY.
-pose X := 'O_q(Y); have qX: q.-group X := pcore_pgroup q _.
-have ntX: X != 1.
- apply: contraTneq q_dv_FY => X1; rewrite -p'natE // -partn_eq1 //.
- rewrite -(card_Hall (nilpotent_pcore_Hall q (Fitting_nil Y))).
- by rewrite /= p_core_Fitting -/X X1 cards1.
-have bMq: q \in \beta(M) by apply: (pgroupP (pgroupS (Fitting_sub Y) bY)).
-have b_q: q \in \beta(G) by move: bMq; rewrite -predI_sigma_beta //; case/andP.
-have sXM: X \subset M := gFsub_trans _ sYM.
-have [P sylP sXP] := Sylow_superset sXM qX; have [sPM qP _] := and3P sylP.
-have sylPG: q.-Sylow(G) P by rewrite (sigma_Sylow_G maxM) ?beta_sub_sigma.
-have uniqNX: 'M('N_P(X)) = [set M].
- apply: def_uniq_mmax => //; last by rewrite subIset ?sPM.
- exact: (beta_subnorm_uniq b_q).
-rewrite (subset_trans (char_norms (pcore_char q Y))) //.
-rewrite (sub_uniq_mmax uniqNX) ?subsetIr // mFT_norm_proper //.
-by rewrite (sub_mmax_proper maxM).
-Qed.
-
-End Ten.
-
-
diff --git a/mathcomp/odd_order/BGsection11.v b/mathcomp/odd_order/BGsection11.v
deleted file mode 100644
index ae376c3..0000000
--- a/mathcomp/odd_order/BGsection11.v
+++ /dev/null
@@ -1,443 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq div path fintype.
-From mathcomp
-Require Import bigop finset prime fingroup morphism perm automorphism quotient.
-From mathcomp
-Require Import action gproduct gfunctor pgroup cyclic center commutator.
-From mathcomp
-Require Import gseries nilpotent sylow abelian maximal hall.
-From mathcomp
-Require Import BGsection1 BGsection3 BGsection4 BGsection5 BGsection6.
-From mathcomp
-Require Import BGsection7 BGsection10.
-
-(******************************************************************************)
-(* This file covers B & G, section 11; it has only one definition: *)
-(* exceptional_FTmaximal p M A0 A <=> *)
-(* p, M and A0 satisfy the conditions of Hypothesis 11.1 in B & G, i.e., *)
-(* M is an "exceptional" maximal subgroup in the terminology of B & G. *)
-(* In addition, A is elementary abelian p-subgroup of M of rank 2, that *)
-(* contains A0. The existence of A is guaranteed by Lemma 10.5, but as *)
-(* in the only two lemmas that make use of the results in this section *)
-(* (Lemma 12.3 and Theorem 12.5) A is known, we elected to make the *)
-(* dependency on A explicit. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope.
-
-Section Section11.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-
-Implicit Types p q r : nat.
-Implicit Types A E H K M N P Q R S T U V W X Y : {group gT}.
-
-Variables (p : nat) (M A0 A P : {group gT}).
-
-(* This definition corresponsd to Hypothesis 11.1, where the condition on A *)
-(* has been made explicit. *)
-Definition exceptional_FTmaximal :=
- [/\ p \in \sigma(M)^', A \in 'E_p^2(M), A0 \in 'E_p^1(A) & 'N(A0) \subset M].
-
-Hypotheses (maxM : M \in 'M) (excM : exceptional_FTmaximal).
-Hypotheses (sylP : p.-Sylow(M) P) (sAP : A \subset P).
-
-(* Splitting the excM hypothesis. *)
-Let sM'p : p \in \sigma(M)^'. Proof. by case: excM. Qed.
-Let Ep2A : A \in 'E_p^2(M). Proof. by case: excM. Qed.
-Let Ep1A0 : A0 \in 'E_p^1(A). Proof. by case: excM. Qed.
-Let sNA0_M : 'N(A0) \subset M. Proof. by case: excM. Qed.
-
-(* Arithmetics of p. *)
-Let p_pr : prime p := pnElem_prime Ep2A.
-Let p_gt1 : p > 1 := prime_gt1 p_pr.
-Let p_gt0 : p > 0 := prime_gt0 p_pr.
-
-(* Group orders. *)
-Let oA : #|A| = (p ^ 2)%N := card_pnElem Ep2A.
-Let oA0 : #|A0| = p := card_pnElem Ep1A0.
-
-(* Structure of A. *)
-Let abelA : p.-abelem A. Proof. by case/pnElemP: Ep2A. Qed.
-Let pA : p.-group A := abelem_pgroup abelA.
-Let cAA : abelian A := abelem_abelian abelA.
-
-(* Various set inclusions. *)
-Let sA0A : A0 \subset A. Proof. by case/pnElemP: Ep1A0. Qed.
-Let sPM : P \subset M := pHall_sub sylP.
-Let sAM : A \subset M := subset_trans sAP sPM.
-Let sCA0_M : 'C(A0) \subset M := subset_trans (cent_sub A0) sNA0_M.
-Let sCA_M : 'C(A) \subset M := subset_trans (centS sA0A) sCA0_M.
-
-(* Alternative E_p^1 memberships for A0; the first is the one used to state *)
-(* Hypothesis 11.1 in B & G, the second is the form expected by Lemma 10.5. *)
-(* Note that #|A0| = p (oA0 above) would wokr just as well. *)
-Let Ep1A0_M : A0 \in 'E_p^1(M) := subsetP (pnElemS p 1 sAM) A0 Ep1A0.
-Let Ep1A0_G : A0 \in 'E_p^1(G) := subsetP (pnElemS p 1 (subsetT M)) A0 Ep1A0_M.
-
-(* This does not depend on exceptionalM, and could move to Section 10. *)
-Lemma sigma'_Sylow_contra : p \in \sigma(M)^' -> ~~ ('N(P) \subset M).
-Proof. by apply: contra => sNM; apply/exists_inP; exists P. Qed.
-
-(* First preliminary remark of Section 11; only depends on sM'p and sylP. *)
-Let not_sNP_M: ~~ ('N(P) \subset M) := sigma'_Sylow_contra sM'p.
-
-(* Second preliminary remark of Section 11; only depends on sM'p, Ep1A0_M, *)
-(* and sNA0_M. *)
-Lemma p_rank_exceptional : 'r_p(M) = 2.
-Proof. exact: sigma'_norm_mmax_rank2 (pgroupS sA0A pA) _. Qed.
-Let rM := p_rank_exceptional.
-
-(* Third preliminary remark of Section 11. *)
-Lemma exceptional_pmaxElem : A \in 'E*_p(G).
-Proof.
-have [_ _ dimA]:= pnElemP Ep2A.
-apply/pmaxElemP; split=> [|E EpE sAE]; first by rewrite !inE subsetT.
-have [//|ltAE]: A :=: E \/ A \proper E := eqVproper sAE.
-have [_ abelE] := pElemP EpE; have [pE cEE _] := and3P abelE.
-suffices: logn p #|E| <= 'r_p(M) by rewrite leqNgt rM -dimA properG_ltn_log.
-by rewrite logn_le_p_rank // inE (subset_trans cEE) ?(subset_trans (centS sAE)).
-Qed.
-Let EpmA := exceptional_pmaxElem.
-
-(* This is B & G, Lemma 11.1. *)
-Lemma exceptional_TIsigmaJ g q Q1 Q2 :
- g \notin M -> A \subset M :^ g ->
- q.-Sylow(M`_\sigma) Q1 -> A \subset 'N(Q1) ->
- q.-Sylow(M`_\sigma :^ g) Q2 -> A \subset 'N(Q2) ->
- (*a*) Q1 :&: Q2 = 1
- /\ (*b*) (forall X, X \in 'E_p^1(A) -> 'C_Q1(X) = 1 \/ 'C_Q2(X) = 1).
-Proof.
-move=> notMg sAMg sylQ1 nQ1A sylQ2 nQ2A.
-have [-> | ntQ1] := eqsVneq Q1 1.
- by split=> [|? _]; last left; apply: (setIidPl (sub1G _)).
-have [sQ1Ms qQ1 _] := and3P sylQ1.
-have{qQ1} [q_pr q_dv_Q1 _] := pgroup_pdiv qQ1 ntQ1.
-have{sQ1Ms q_dv_Q1} sMq: q \in \sigma(M).
- exact: pgroupP (pgroupS sQ1Ms (pcore_pgroup _ _)) q q_pr q_dv_Q1.
-have{sylQ1} sylQ1: q.-Sylow(M) Q1.
- by rewrite (subHall_Sylow (Msigma_Hall maxM)).
-have sQ1M := pHall_sub sylQ1.
-have{sylQ2} sylQ2g': q.-Sylow(M) (Q2 :^ g^-1).
- by rewrite (subHall_Sylow (Msigma_Hall _)) // -(pHallJ2 _ _ _ g) actKV.
-have sylQ2: q.-Sylow(G) Q2.
- by rewrite -(pHallJ _ _ (in_setT g^-1)) (sigma_Sylow_G maxM).
-suffices not_Q1_CA_Q2: gval Q2 \notin Q1 :^: 'O_\pi(A)^'('C(A)).
- have ncA: normed_constrained A.
- have ntA: A :!=: 1 by rewrite -cardG_gt1 oA (ltn_exp2l 0).
- exact: plength_1_normed_constrained ntA EpmA (mFT_proper_plength1 _).
- have q'A: q \notin \pi(A).
- by apply: contraL sMq; move/(pnatPpi pA); move/eqnP->.
- have maxnAq Q: q.-Sylow(G) Q -> A \subset 'N(Q) -> Q \in |/|*(A; q).
- move=> sylQ; case/(max_normed_exists (pHall_pgroup sylQ)) => R maxR sQR.
- have [qR _] := mem_max_normed maxR.
- by rewrite -(group_inj (sub_pHall sylQ qR sQR (subsetT R))).
- have maxQ1 := maxnAq Q1 (sigma_Sylow_G maxM sMq sylQ1) nQ1A.
- have maxQ2 := maxnAq Q2 sylQ2 nQ2A.
- have transCAQ := normed_constrained_meet_trans ncA q'A _ _ maxQ1 maxQ2.
- split=> [|X EpX].
- apply: contraNeq not_Q1_CA_Q2 => ntQ12; apply/imsetP.
- apply: transCAQ (sAM) (mmax_proper maxM) _ _.
- by rewrite (setIidPl sQ1M).
- by apply: contraNneq ntQ12 => tiQ2M; rewrite setIC -subG1 -tiQ2M setIS.
- apply/pred2P; apply: contraR not_Q1_CA_Q2; case/norP=> ntCQ1 ntCQ2.
- have [sXA _ oX] := pnElemPcard EpX.
- apply/imsetP; apply: transCAQ (centSS _ sXA cAA) _ ntCQ1 ntCQ2 => //.
- by rewrite mFT_cent_proper // -cardG_gt1 oX prime_gt1.
-apply: contra notMg; case/imsetP=> k cAk defQ2.
-have{cAk} Mk := subsetP sCA_M k (subsetP (pcore_sub _ _) k cAk).
-have{k Mk defQ2} sQ2M: Q2 \subset M by rewrite defQ2 conj_subG.
-have [sQ2g'M qQ2g' _] := and3P sylQ2g'.
-by rewrite (sigma_Sylow_trans _ sylQ2g') // actKV.
-Qed.
-
-(* This is B & G, Corollary 11.2. *)
-Corollary exceptional_TI_MsigmaJ g :
- g \notin M -> A \subset M :^ g ->
- (*a*) M`_\sigma :&: M :^ g = 1
- /\ (*b*) M`_\sigma :&: 'C(A0 :^ g) = 1.
-Proof.
-move=> notMg sAMg; set Ms := M`_\sigma; set H := [group of Ms :&: M :^ g].
-have [H1 | ntH] := eqsVneq H 1.
- by split=> //; apply/trivgP; rewrite -H1 setIS //= centJ conjSg.
-pose q := pdiv #|H|.
-suffices: #|H|`_q == 1%N by rewrite p_part_eq1 pi_pdiv cardG_gt1 ntH.
-have nsMsM: Ms <| M := pcore_normal _ _; have [_ nMsM] := andP nsMsM.
-have sHMs: H \subset Ms := subsetIl _ _.
-have sHMsg: H \subset Ms :^ g.
- rewrite -sub_conjgV (sub_Hall_pcore (Msigma_Hall _)) //.
- by rewrite pgroupJ (pgroupS sHMs) ?pcore_pgroup.
- by rewrite sub_conjgV subsetIr.
-have nMsA := subset_trans sAM nMsM.
-have nHA: A \subset 'N(H) by rewrite normsI // normsG.
-have nMsgA: A \subset 'N(Ms :^ g) by rewrite normJ (subset_trans sAMg) ?conjSg.
-have coMsA: coprime #|Ms| #|A|.
- by rewrite oA coprime_expr ?(pnat_coprime (pcore_pgroup _ _)) ?pnatE.
-have coHA: coprime #|H| #|A| := coprimeSg sHMs coMsA.
-have coMsgA: coprime #|Ms :^ g| #|A| by rewrite cardJg.
-have solA: solvable A := abelian_sol cAA.
-have [Q0 sylQ0 nQ0A] := sol_coprime_Sylow_exists q solA nHA coHA.
-have [sQ0H qQ0 _] := and3P sylQ0.
-have supQ0 := sol_coprime_Sylow_subset _ _ solA (subset_trans sQ0H _) qQ0 nQ0A.
-have [Q1 [sylQ1 nQ1A sQ01]] := supQ0 _ nMsA coMsA sHMs.
-have [Q2 [sylQ2 nQ2A sQ02]] := supQ0 _ nMsgA coMsgA sHMsg.
-have tiQ12: Q1 :&: Q2 = 1.
- by have [-> _] := exceptional_TIsigmaJ notMg sAMg sylQ1 nQ1A sylQ2 nQ2A.
-by rewrite -(card_Hall sylQ0) -trivg_card1 -subG1 -tiQ12 subsetI sQ01.
-Qed.
-
-(* This is B & G, Theorem 11.3. *)
-Theorem exceptional_sigma_nil : nilpotent M`_\sigma.
-Proof.
-have [g nPg notMg] := subsetPn not_sNP_M.
-set Ms := M`_\sigma; set F := Ms <*> A0 :^ g.
-have sA0gM: A0 :^ g \subset M.
- by rewrite (subset_trans _ sPM) // -(normP nPg) conjSg (subset_trans sA0A).
-have defF: Ms ><| A0 :^ g = F.
- rewrite sdprodEY ?coprime_TIg //.
- by rewrite (subset_trans sA0gM) ?gFnorm.
- by rewrite cardJg oA0 (pnat_coprime (pcore_pgroup _ _)) ?pnatE.
-have regA0g: 'C_Ms(A0 :^ g) = 1.
- case/exceptional_TI_MsigmaJ: notMg => //.
- by rewrite -sub_conjgV (subset_trans _ sPM) // sub_conjgV (normP _).
-rewrite (prime_Frobenius_sol_kernel_nil defF) ?cardJg ?oA0 //.
-by rewrite (solvableS _ (mmax_sol maxM)) // join_subG pcore_sub.
-Qed.
-
-(* This is B & G, Corollary 11.4. *)
-Corollary exceptional_sigma_uniq H :
- H \in 'M(A) -> H`_\sigma :&: M `_\sigma != 1 -> H :=: M.
-Proof.
-rewrite setIC => /setIdP[maxH sAH] ntMsHs.
-have [g _ defH]: exists2 g, g \in G & H :=: M :^ g.
- apply/imsetP; apply: contraR ntMsHs => /sigma_disjoint[] // _ _.
- by case/(_ exceptional_sigma_nil)=> ->.
-rewrite defH conjGid //; apply: contraR ntMsHs => notMg.
-have [|tiMsMg _] := exceptional_TI_MsigmaJ notMg; first by rewrite -defH.
-by rewrite -subG1 -tiMsMg -defH setIS ?pcore_sub.
-Qed.
-
-(* This is B & G, Theorem 11.5. *)
-Theorem exceptional_Sylow_abelian P1 : p.-Sylow(M) P1 -> abelian P1.
-Proof.
-have nregA Q: gval Q != 1 -> A \subset 'N(Q) -> coprime #|Q| #|A| ->
- exists2 X, X \in 'E_p^1(A) & 'C_Q(X) != 1.
-- move=> ntQ nQA coQA; apply/exists_inP; apply: contraR ntQ.
- rewrite negb_exists_in -subG1; move/forall_inP=> regA.
- have ncycA: ~~ cyclic A by rewrite (abelem_cyclic abelA) oA pfactorK.
- rewrite -(coprime_abelian_gen_cent1 _ _ nQA) // gen_subG.
- apply/bigcupsP=> x /setD1P[ntx Ax].
- apply/negPn; rewrite /= -cent_cycle subG1 regA // p1ElemE // !inE.
- by rewrite cycle_subG Ax /= -orderE (abelem_order_p abelA).
-suffices{P1} cPP: abelian P.
- by move=> sylP1; have [m _ ->] := Sylow_trans sylP sylP1; rewrite abelianJ.
-have [g nPg notMg] := subsetPn not_sNP_M.
-pose Ms := M`_\sigma; pose q := pdiv #|Ms|; have pP := pHall_pgroup sylP.
-have nMsP: P \subset 'N(Ms) by rewrite (subset_trans sPM) ?gFnorm.
-have coMsP: coprime #|Ms| #|P|.
- exact: pnat_coprime (pcore_pgroup _ _) (pi_pnat pP sM'p).
-have [Q1 sylQ1 nQ1P]:= sol_coprime_Sylow_exists q (pgroup_sol pP) nMsP coMsP.
-have ntQ1: Q1 :!=: 1.
- rewrite -cardG_gt1 (card_Hall sylQ1) p_part_gt1 pi_pdiv cardG_gt1.
- by rewrite Msigma_neq1.
-have nQ1A: A \subset 'N(Q1) := subset_trans sAP nQ1P.
-have coQ1A: coprime #|Q1| #|A|.
- by rewrite (coprimeSg (pHall_sub sylQ1)) // (coprimegS sAP).
-have [X1 EpX1 nregX11] := nregA _ ntQ1 nQ1A coQ1A.
-pose Q2 := Q1 :^ g; have sylQ2: q.-Sylow(Ms :^ g) Q2 by rewrite pHallJ2.
-have{ntQ1} ntQ2: Q2 != 1 by rewrite -!cardG_gt1 cardJg in ntQ1 *.
-have nQ2A: A \subset 'N(Q2) by rewrite (subset_trans sAP) ?norm_conj_norm.
-have{coQ1A} coQ2A: coprime #|Q2| #|A| by rewrite cardJg.
-have{nregA ntQ2 coQ2A} [X2 EpX2 nregX22] := nregA _ ntQ2 nQ2A coQ2A.
-have [|_ regA]:= exceptional_TIsigmaJ notMg _ sylQ1 nQ1A sylQ2 nQ2A.
- by rewrite (subset_trans sAP) // -(normP nPg) conjSg.
-have regX21: 'C_Q1(X2) = 1 by case: (regA X2) nregX22 => // ->; rewrite eqxx.
-have regX12: 'C_Q2(X1) = 1 by case: (regA X1) nregX11 => // ->; rewrite eqxx.
-pose X := 'Ohm_1('Z(P))%G.
-have eqCQ12_X: ('C_Q1(X) == 1) = ('C_Q2(X) == 1).
- rewrite -(inj_eq (@conjsg_inj _ g)) conjs1g conjIg -/Q2 -centJ (normP _) //.
- by rewrite (subsetP (gFnorm_trans _ _) g nPg) ?gFnorms.
-have{EpX1} EpX1: X1 \in 'E_p^1(A) :\ X.
- rewrite 2!inE EpX1 andbT; apply: contraNneq nregX11 => defX1.
- by rewrite defX1 eqCQ12_X -defX1 regX12.
-have{EpX2 eqCQ12_X} EpX2: X2 \in 'E_p^1(A) :\ X.
- rewrite 2!inE EpX2 andbT; apply: contraNneq nregX22 => defX2.
- by rewrite defX2 -eqCQ12_X -defX2 regX21.
-apply: contraR nregX11 => not_cPP.
-have{not_cPP} transNPA: [transitive 'N_P(A), on 'E_p^1(A) :\ X | 'JG].
- have [|_ _]:= basic_p2maxElem_structure _ pP sAP not_cPP; last by [].
- by rewrite inE (subsetP (pnElemS p 2 (subsetT M))).
-have [y PnAy ->] := atransP2 transNPA EpX2 EpX1; have [Py _] := setIP PnAy.
-by rewrite centJ -(normsP nQ1P y Py) -conjIg regX21 conjs1g.
-Qed.
-
-(* This is B & G, Corollary 11.6. *)
-Corollary exceptional_structure (Ms := M`_\sigma) :
- [/\ (*a*) A :=: 'Ohm_1(P),
- (*b*) 'C_Ms(A) = 1
- & (*c*) exists2 A1, A1 \in 'E_p^1(A) & exists2 A2, A2 \in 'E_p^1(A) &
- [/\ A1 :!=: A2, 'C_Ms(A1) = 1 & 'C_Ms(A2) = 1]].
-Proof.
-pose iMNA := #|'N(A) : M|.
-have defA: A :=: 'Ohm_1(P).
- apply/eqP; rewrite eqEcard -{1}(Ohm1_id abelA) OhmS //= oA -rM.
- rewrite -(p_rank_Sylow sylP) p_rank_abelian ?exceptional_Sylow_abelian //.
- by rewrite -card_pgroup // (pgroupS _ (pHall_pgroup sylP)) ?Ohm_sub.
-have iMNAgt1: iMNA > 1.
- rewrite indexg_gt1 defA; apply: contra (subset_trans _) not_sNP_M.
- by rewrite char_norms ?Ohm_char.
-have iMNAgt2: iMNA > 2.
- pose q := pdiv iMNA; have q_iMNA: q %| iMNA := pdiv_dvd iMNA.
- rewrite (leq_trans _ (dvdn_leq (ltnW _) q_iMNA)) // ltn_neqAle eq_sym.
- rewrite (sameP eqP (prime_oddPn _)) ?prime_gt1 ?pdiv_prime //.
- by rewrite (dvdn_odd q_iMNA) // (dvdn_odd (dvdn_indexg _ _)) ?mFT_odd.
-rewrite [iMNA](cardD1 (gval M)) orbit_refl !ltnS lt0n in iMNAgt1 iMNAgt2.
-have{iMNAgt1} [Mg1 /= NM_Mg1] := pred0Pn iMNAgt1.
-rewrite (cardD1 Mg1) inE /= NM_Mg1 ltnS lt0n in iMNAgt2.
-have{iMNAgt2} [Mg2 /= NM_Mg2] := pred0Pn iMNAgt2.
-case/andP: NM_Mg1 => neM_Mg1 /rcosetsP[g1 nAg1 defMg1].
-have{neM_Mg1} notMg1: g1 \notin M.
- by apply: contra neM_Mg1 => M_g1; rewrite defMg1 rcoset_id.
-case/and3P: NM_Mg2 => neMg12 neM_Mg2 /rcosetsP[g2 nAg2 defMg2].
-have{neM_Mg2} notMg2: g2 \notin M.
- by apply: contra neM_Mg2 => M_g2; rewrite defMg2 rcoset_id.
-pose A1 := (A0 :^ g1)%G; pose A2 := (A0 :^ g2)%G.
-have EpA1: A1 \in 'E_p^1(A) by rewrite -(normP nAg1) pnElemJ.
-have EpA2: A2 \in 'E_p^1(A) by rewrite -(normP nAg2) pnElemJ.
-have{neMg12} neqA12: A1 :!=: A2.
- rewrite -(canF_eq (conjsgKV g2)) -conjsgM (sameP eqP normP).
- rewrite (contra (subsetP sNA0_M _)) // -mem_rcoset.
- by apply: contra neMg12 => g1Mg2; rewrite defMg1 defMg2 (rcoset_eqP g1Mg2).
-have{notMg1 nAg1} regA1: 'C_Ms(A1) = 1.
- by case/exceptional_TI_MsigmaJ: notMg1; rewrite // -(normP nAg1) conjSg.
-have{notMg2 nAg2} regA2: 'C_Ms(A2) = 1.
- by case/exceptional_TI_MsigmaJ: notMg2; rewrite // -(normP nAg2) conjSg.
-split=> //; last by exists A1 => //; exists A2 => //.
-by apply/trivgP; rewrite -regA1 setIS ?centS //; case/pnElemP: EpA1.
-Qed.
-
-(* This is B & G, Theorem 11.7 (the main result on exceptional subgroups). *)
-Theorem exceptional_mul_sigma_normal : M`_\sigma <*> A <| M.
-Proof.
-set Ms := M`_\sigma; have pP := pHall_pgroup sylP; have solM := mmax_sol maxM.
-have [E hallE sPE] := Hall_superset solM sPM (pi_pnat pP sM'p).
-have sAE := subset_trans sAP sPE; have [sEM s'E _] := and3P hallE.
-have [_ _ dimA] := pnElemP Ep2A.
-have rE: 'r(E) = 2.
- apply/eqP; rewrite eqn_leq -{2}dimA -rank_abelem ?rankS // andbT leqNgt.
- have [q q_pr ->]:= rank_witness E; apply/negP=> rqEgt2.
- have piEq: q \in \pi(E) by rewrite -p_rank_gt0 -(subnKC rqEgt2).
- case/negP: (pnatPpi s'E piEq); rewrite /= alpha_sub_sigma // !inE.
- by rewrite (leq_trans rqEgt2) ?p_rankS.
-have rFEle2: 'r('F(E)) <= 2 by rewrite -rE rankS ?Fitting_sub.
-have solE := solvableS sEM solM; have oddE := mFT_odd E.
-pose tau : nat_pred := [pred q | q > p]; pose K := 'O_tau(E).
-have hallK: tau.-Hall(E) K by rewrite rank2_ge_pcore_Hall.
-pose ptau : nat_pred := [pred q | q >= p]; pose KP := K <*> P.
-have nKP: P \subset 'N(K) by rewrite (subset_trans sPE) ?gFnorm.
-have coKP: coprime #|K| #|P|.
- by rewrite (pnat_coprime (pcore_pgroup _ _)) ?(pi_pnat pP) //= !inE ltnn.
-have hallKP: ptau.-Hall(E) KP.
- rewrite pHallE join_subG pcore_sub sPE /= norm_joinEr ?coprime_cardMg //.
- apply/eqP; rewrite -(partnC tau (part_gt0 _ _)) (card_Hall sylP).
- rewrite (card_Hall hallK) partn_part => [|q]; last exact: leqW.
- rewrite (card_Hall hallE) -!partnI; congr (_ * _)%N; apply: eq_partn => q.
- by rewrite 4!inE andbC /= 8!inE -leqNgt -eqn_leq eq_sym; case: eqP => // <-.
-have nsKP_E: KP <| E.
- by rewrite [KP](eq_Hall_pcore _ hallKP) ?pcore_normal ?rank2_ge_pcore_Hall.
-have [cKA | not_cKA]:= boolP (A \subset 'C(K)).
- pose KA := K <*> A; have defKA: K \x A = KA.
- by rewrite dprodEY // coprime_TIg // (coprimegS sAP).
- have defA: 'Ohm_1(P) = A by case exceptional_structure.
- have{defA} defA: 'Ohm_1('O_p(KP)) = A.
- apply/eqP; rewrite -defA eqEsubset OhmS /=; last first.
- rewrite pcore_sub_Hall ?(pHall_subl _ _ sylP) ?joing_subr //.
- exact: subset_trans (pHall_sub hallKP) sEM.
- rewrite -Ohm_id defA OhmS // pcore_max // /normal join_subG.
- rewrite (subset_trans sAP) ?joing_subr // cents_norm 1?centsC //=.
- by rewrite -defA gFnorm.
- have nMsE: E \subset 'N(Ms) by rewrite (subset_trans sEM) ?gFnorm.
- have tiMsE: Ms :&: E = 1.
- by rewrite coprime_TIg ?(pnat_coprime (pcore_pgroup _ _)).
- have <-: Ms * E = M.
- apply/eqP; rewrite eqEcard mulG_subG pcore_sub sEM /= TI_cardMg //.
- by rewrite (card_Hall hallE) (card_Hall (Msigma_Hall maxM)) ?partnC.
- rewrite norm_joinEr -?quotientK ?(subset_trans sAE) //= cosetpre_normal.
- by rewrite quotient_normal // -defA !gFnormal_trans.
-pose q := pdiv #|K : 'C_K(A)|.
-have q_pr: prime q by rewrite pdiv_prime // indexg_gt1 subsetI subxx centsC.
-have [nKA coKA] := (subset_trans sAP nKP, coprimegS sAP coKP).
-have [Q sylQ nQA]: exists2 Q : {group gT}, q.-Sylow(K) Q & A \subset 'N(Q).
- by apply: sol_coprime_Sylow_exists => //; apply: (pgroup_sol pA).
-have [sQK qQ q'iQK] := and3P sylQ; have [sKE tauK _]:= and3P hallK.
-have{q'iQK} not_cQA: ~~ (A \subset 'C(Q)).
- apply: contraL q'iQK => cQA; rewrite p'natE // negbK.
- rewrite -(Lagrange_index (subsetIl K 'C(A))) ?dvdn_mulr ?pdiv_dvd //.
- by rewrite subsetI sQK centsC.
-have ntQ: Q :!=: 1 by apply: contraNneq not_cQA => ->; apply: cents1.
-have q_dv_K: q %| #|K| := dvdn_trans (pdiv_dvd _) (dvdn_indexg _ _).
-have sM'q: q \in (\sigma(M))^' := pgroupP (pgroupS sKE s'E) q q_pr q_dv_K.
-have{q_dv_K} tau_q: q \in tau := pgroupP tauK q q_pr q_dv_K.
-have sylQ_E: q.-Sylow(E) Q := subHall_Sylow hallK tau_q sylQ.
-have sylQ_M: q.-Sylow(M) Q := subHall_Sylow hallE sM'q sylQ_E.
-have q'p: p != q by rewrite neq_ltn [p < q]tau_q.
-suffices nregQ: 'C_Q(A) != 1.
- have ncycQ: ~~ cyclic Q.
- apply: contra not_cQA => cycQ.
- rewrite (coprime_odd_faithful_Ohm1 qQ) ?mFT_odd ?(coprimeSg sQK) //.
- rewrite centsC; apply: contraR nregQ => not_sQ1_CA.
- rewrite setIC TI_Ohm1 // setIC prime_TIg //.
- by rewrite (Ohm1_cyclic_pgroup_prime cycQ qQ ntQ).
- have {ncycQ} rQ: 'r_q(Q) = 2.
- apply/eqP; rewrite eqn_leq ltnNge -odd_pgroup_rank1_cyclic ?mFT_odd //.
- by rewrite -rE -rank_pgroup ?rankS // (pHall_sub sylQ_E).
- have [B Eq2B]: exists B, B \in 'E_q^2(Q) by apply/p_rank_geP; rewrite rQ.
- have maxB: B \in 'E*_q(G).
- apply: subsetP (subsetP (pnElemS q 2 (pHall_sub sylQ_M)) B Eq2B).
- by rewrite sigma'_rank2_max // -(p_rank_Sylow sylQ_M).
- have CAq: q %| #|'C(A)|.
- apply: dvdn_trans (cardSg (subsetIr Q _)).
- by have [_ ? _] := pgroup_pdiv (pgroupS (subsetIl Q _) qQ) nregQ.
- have [Qstar maxQstar sQ_Qstar] := max_normed_exists qQ nQA.
- have [|Qm] := max_normed_2Elem_signaliser q'p _ maxQstar CAq.
- by rewrite inE (subsetP (pnElemS p 2 (subsetT M))).
- case=> _ sAQm [_ _ cQstarQm]; rewrite (centSS sAQm sQ_Qstar) // in not_cQA.
- apply: cQstarQm; apply/implyP=> _; apply/set0Pn; exists B.
- have{Eq2B} Eq2B := subsetP (pnElemS q 2 sQ_Qstar) B Eq2B.
- rewrite inE Eq2B (subsetP (pmaxElemS q (subsetT _))) // inE maxB inE.
- by have [? _ _] := pnElemP Eq2B.
-pose Q0 := 'Z(Q); have sQ0Q: Q0 \subset Q by apply: gFsub.
-have nQ0A: A \subset 'N(Q0) by apply: gFnorm_trans.
-have ntQ0: Q0 != 1 by apply: contraNneq ntQ => /(trivg_center_pgroup qQ)->.
-apply: contraNneq (sM'q) => regQ; apply/exists_inP; exists Q => //.
-suffices nsQ0M: Q0 <| M by rewrite -(mmax_normal _ nsQ0M) ?gFnorms.
-have sQ0M: Q0 \subset M := subset_trans sQ0Q (pHall_sub sylQ_M).
-have qQ0: q.-group Q0 := pgroupS sQ0Q qQ.
-have p'Q0: p^'.-group Q0 by apply: (pi_pnat qQ0); rewrite eq_sym in q'p.
-have sM'Q0: \sigma(M)^'.-group Q0 := pi_pnat qQ0 sM'q.
-have cQ0Q0: abelian Q0 := center_abelian Q.
-have defQ0: [~: A, Q0] = Q0.
- rewrite -{2}[Q0](coprime_abelian_cent_dprod nQ0A) //.
- by rewrite setIAC regQ setI1g dprodg1 commGC.
- by rewrite (coprimeSg (subset_trans sQ0Q sQK)).
-have [_ _ [A1 EpA1 [A2 EpA2 [neqA12 regA1 regA2]]]] := exceptional_structure.
-have defA: A1 \x A2 = A by apply/(p2Elem_dprodP Ep2A EpA1 EpA2).
-have{defQ0} defQ0: [~: A1, Q0] * [~: A2, Q0] = Q0.
- have{defA} [[_ defA cA12 _] [sA2A _ _]] := (dprodP defA, pnElemP EpA2).
- by rewrite -commMG ?defA // normsR ?(cents_norm cA12) // (subset_trans sA2A).
-have sA_NQ0: A \subset 'N_M(Q0) by rewrite subsetI sAM.
-have sEpA_EpN := subsetP (pnElemS p 1 sA_NQ0).
-have nsRQ0 := commG_sigma'_1Elem_cyclic maxM sQ0M sM'Q0 sM'p (sEpA_EpN _ _).
-rewrite -defQ0 -!(commGC Q0).
-by apply: normalM; [case/nsRQ0: EpA1 | case/nsRQ0: EpA2].
-Qed.
-
-End Section11.
diff --git a/mathcomp/odd_order/BGsection12.v b/mathcomp/odd_order/BGsection12.v
deleted file mode 100644
index ea39e9d..0000000
--- a/mathcomp/odd_order/BGsection12.v
+++ /dev/null
@@ -1,2686 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq choice div fintype.
-From mathcomp
-Require Import path bigop finset prime fingroup morphism perm automorphism.
-From mathcomp
-Require Import quotient action gproduct gfunctor pgroup cyclic commutator.
-From mathcomp
-Require Import center gseries nilpotent sylow abelian maximal hall frobenius.
-From mathcomp
-Require Import BGsection1 BGsection3 BGsection4 BGsection5 BGsection6.
-From mathcomp
-Require Import BGsection7 BGsection9 BGsection10 BGsection11.
-
-(******************************************************************************)
-(* This file covers B & G, section 12; it defines the prime sets for the *)
-(* complements of M`_\sigma in a maximal group M: *)
-(* \tau1(M) == the set of p not in \pi(M^`(1)) (thus not in \sigma(M)), *)
-(* such that M has p-rank 1. *)
-(* \tau2(M) == the set of p not in \sigma(M), such that M has p-rank 2. *)
-(* \tau3(M) == the set of p not in \sigma(M), but in \pi(M^`(1)), such *)
-(* that M has p-rank 1. *)
-(* We also define the following helper predicate, which encapsulates the *)
-(* notation conventions defined at the beginning of B & G, Section 12: *)
-(* sigma_complement M E E1 E2 E3 <=> *)
-(* E is a Hall \sigma(M)^'-subgroup of M, the Ei are Hall *)
-(* \tau_i(M)-subgroups of E, and E2 * E1 is a group. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope.
-Section Definitions.
-
-Variables (gT : finGroupType) (M : {set gT}).
-Local Notation sigma' := \sigma(M)^'.
-
-Definition tau1 := [pred p in sigma' | 'r_p(M) == 1%N & ~~ (p %| #|M^`(1)|)].
-Definition tau2 := [pred p in sigma' | 'r_p(M) == 2].
-Definition tau3 := [pred p in sigma' | 'r_p(M) == 1%N & p %| #|M^`(1)|].
-
-Definition sigma_complement E E1 E2 E3 :=
- [/\ sigma'.-Hall(M) E, tau1.-Hall(E) E1, tau2.-Hall(E) E2, tau3.-Hall(E) E3
- & group_set (E2 * E1)].
-
-End Definitions.
-
-Notation "\tau1 ( M )" := (tau1 M)
- (at level 2, format "\tau1 ( M )") : group_scope.
-Notation "\tau2 ( M )" := (tau2 M)
- (at level 2, format "\tau2 ( M )") : group_scope.
-Notation "\tau3 ( M )" := (tau3 M)
- (at level 2, format "\tau3 ( M )") : group_scope.
-
-Section Section12.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Implicit Types p q r : nat.
-Implicit Types A E H K M Mstar N P Q R S T U V W X Y Z : {group gT}.
-
-Section Introduction.
-
-Variables M E : {group gT}.
-Hypotheses (maxM : M \in 'M) (hallE : \sigma(M)^'.-Hall(M) E).
-
-Lemma tau1J x : \tau1(M :^ x) =i \tau1(M).
-Proof. by move=> p; rewrite 3!inE sigmaJ p_rankJ derg1 -conjsRg cardJg. Qed.
-
-Lemma tau2J x : \tau2(M :^ x) =i \tau2(M).
-Proof. by move=> p; rewrite 3!inE sigmaJ p_rankJ. Qed.
-
-Lemma tau3J x : \tau3(M :^ x) =i \tau3(M).
-Proof. by move=> p; rewrite 3!inE sigmaJ p_rankJ derg1 -conjsRg cardJg. Qed.
-
-Lemma tau2'1 : {subset \tau1(M) <= \tau2(M)^'}.
-Proof. by move=> p; rewrite !inE; case/and3P=> ->; move/eqP->. Qed.
-
-Lemma tau3'1 : {subset \tau1(M) <= \tau3(M)^'}.
-Proof. by move=> p; rewrite !inE; case/and3P=> -> ->. Qed.
-
-Lemma tau3'2 : {subset \tau2(M) <= \tau3(M)^'}.
-Proof. by move=> p; rewrite !inE; case/andP=> ->; move/eqP->. Qed.
-
-Lemma ex_sigma_compl : exists F : {group gT}, \sigma(M)^'.-Hall(M) F.
-Proof. exact: Hall_exists (mmax_sol maxM). Qed.
-
-Let s'E : \sigma(M)^'.-group E := pHall_pgroup hallE.
-Let sEM : E \subset M := pHall_sub hallE.
-
-(* For added convenience, this lemma does NOT depend on the maxM assumption. *)
-Lemma sigma_compl_sol : solvable E.
-Proof.
-have [-> | [p p_pr pE]] := trivgVpdiv E; first exact: solvable1.
-rewrite (solvableS sEM) // mFT_sol // properT.
-apply: contraNneq (pgroupP s'E p p_pr pE) => ->.
-have [P sylP] := Sylow_exists p [set: gT].
-by apply/exists_inP; exists P; rewrite ?subsetT.
-Qed.
-Let solE := sigma_compl_sol.
-
-Let exHallE pi := exists Ei : {group gT}, pi.-Hall(E) Ei.
-Lemma ex_tau13_compl : exHallE \tau1(M) /\ exHallE \tau3(M).
-Proof. by split; apply: Hall_exists. Qed.
-
-Lemma ex_tau2_compl E1 E3 :
- \tau1(M).-Hall(E) E1 -> \tau3(M).-Hall(E) E3 ->
- exists2 E2 : {group gT}, \tau2(M).-Hall(E) E2 & sigma_complement M E E1 E2 E3.
-Proof.
-move=> hallE1 hallE3; have [sE1E t1E1 _] := and3P hallE1.
-pose tau12 := [predU \tau1(M) & \tau2(M)].
-have t12E1: tau12.-group E1 by apply: sub_pgroup t1E1 => p t1p; apply/orP; left.
-have [E21 hallE21 sE1E21] := Hall_superset solE sE1E t12E1.
-have [sE21E t12E21 _] := and3P hallE21.
-have [E2 hallE2] := Hall_exists \tau2(M) (solvableS sE21E solE).
-have [sE2E21 t2E2 _] := and3P hallE2.
-have hallE2_E: \tau2(M).-Hall(E) E2.
- by apply: subHall_Hall hallE21 _ hallE2 => p t2p; apply/orP; right.
-exists E2 => //; split=> //.
-suffices ->: E2 * E1 = E21 by apply: groupP.
-have coE21: coprime #|E2| #|E1| := sub_pnat_coprime tau2'1 t2E2 t1E1.
-apply/eqP; rewrite eqEcard mul_subG ?coprime_cardMg //=.
-rewrite -(partnC \tau1(M) (cardG_gt0 E21)) (card_Hall hallE2) mulnC.
-rewrite (card_Hall (pHall_subl sE1E21 sE21E hallE1)) leq_pmul2r //.
-rewrite dvdn_leq // sub_in_partn // => p t12p t1'p.
-by apply: contraLR (pnatPpi t12E21 t12p) => t2'p; apply/norP.
-Qed.
-
-Lemma coprime_sigma_compl : coprime #|M`_\sigma| #|E|.
-Proof. exact: pnat_coprime (pcore_pgroup _ _) (pHall_pgroup hallE). Qed.
-Let coMsE := coprime_sigma_compl.
-
-Lemma pi_sigma_compl : \pi(E) =i [predD \pi(M) & \sigma(M)].
-Proof. by move=> p; rewrite /= (card_Hall hallE) pi_of_part // !inE andbC. Qed.
-
-Lemma sdprod_sigma : M`_\sigma ><| E = M.
-Proof.
-rewrite sdprodE ?coprime_TIg ?(subset_trans sEM) ?gFnorm //.
-apply/eqP; rewrite eqEcard mul_subG ?pcore_sub ?coprime_cardMg //=.
-by rewrite (card_Hall (Msigma_Hall maxM)) (card_Hall hallE) partnC.
-Qed.
-
-(* The preliminary remarks in the introduction of B & G, section 12. *)
-
-Remark der1_sigma_compl : M^`(1) :&: E = E^`(1).
-Proof.
-have [nsMsM _ defM _ _] := sdprod_context sdprod_sigma.
-by rewrite setIC (pprod_focal_coprime defM _ (subxx E)) ?(setIidPr _) ?der_sub.
-Qed.
-
-Remark partition_pi_mmax p :
- (p \in \pi(M)) =
- [|| p \in \tau1(M), p \in \tau2(M), p \in \tau3(M) | p \in \sigma(M)].
-Proof.
-symmetry; rewrite 2!orbA -!andb_orr orbAC -andb_orr orNb andbT.
-rewrite orb_andl orNb /= -(orb_idl ((alpha_sub_sigma maxM) p)) orbA orbC -orbA.
-rewrite !(eq_sym 'r_p(M)) -!leq_eqVlt p_rank_gt0 orb_idl //.
-exact: sigma_sub_pi.
-Qed.
-
-Remark partition_pi_sigma_compl p :
- (p \in \pi(E)) = [|| p \in \tau1(M), p \in \tau2(M) | p \in \tau3(M)].
-Proof.
-rewrite pi_sigma_compl inE /= partition_pi_mmax !andb_orr /=.
-by rewrite andNb orbF !(andbb, andbA) -2!andbA.
-Qed.
-
-Remark tau2E p : (p \in \tau2(M)) = (p \in \pi(E)) && ('r_p(E) == 2).
-Proof.
-have [P sylP] := Sylow_exists p E.
-rewrite -(andb_idl (pnatPpi s'E)) -p_rank_gt0 -andbA; apply: andb_id2l => s'p.
-have sylP_M := subHall_Sylow hallE s'p sylP.
-by rewrite -(p_rank_Sylow sylP_M) (p_rank_Sylow sylP); case: posnP => // ->.
-Qed.
-
-Remark tau3E p : (p \in \tau3(M)) = (p \in \pi(E^`(1))) && ('r_p(E) == 1%N).
-Proof.
-have [P sylP] := Sylow_exists p E.
-have hallE': \sigma(M)^'.-Hall(M^`(1)) E^`(1).
- by rewrite -der1_sigma_compl setIC (Hall_setI_normal _ hallE) ?der_normal.
-rewrite 4!inE -(andb_idl (pnatPpi (pHall_pgroup hallE'))) -andbA.
-apply: andb_id2l => s'p; have sylP_M := subHall_Sylow hallE s'p sylP.
-rewrite -(p_rank_Sylow sylP_M) (p_rank_Sylow sylP) andbC; apply: andb_id2r.
-rewrite eqn_leq p_rank_gt0 mem_primes => /and3P[_ p_pr _].
-rewrite (card_Hall hallE') pi_of_part 3?inE ?mem_primes ?cardG_gt0 //=.
-by rewrite p_pr inE /= s'p andbT.
-Qed.
-
-Remark tau1E p :
- (p \in \tau1(M)) = [&& p \in \pi(E), p \notin \pi(E^`(1)) & 'r_p(E) == 1%N].
-Proof.
-rewrite partition_pi_sigma_compl; apply/idP/idP=> [t1p|].
- have [s'p rpM _] := and3P t1p; have [P sylP] := Sylow_exists p E.
- have:= tau3'1 t1p; rewrite t1p /= inE /= tau3E -(p_rank_Sylow sylP).
- by rewrite (p_rank_Sylow (subHall_Sylow hallE s'p sylP)) rpM !andbT.
-rewrite orbC andbC -andbA => /and3P[not_piE'p /eqP rpE].
-by rewrite tau3E tau2E rpE (negPf not_piE'p) andbF.
-Qed.
-
-(* Generate a rank 2 elementary abelian tau2 subgroup in a given complement. *)
-Lemma ex_tau2Elem p :
- p \in \tau2(M) -> exists2 A, A \in 'E_p^2(E) & A \in 'E_p^2(M).
-Proof.
-move=> t2p; have [A Ep2A] := p_rank_witness p E.
-have <-: 'r_p(E) = 2 by apply/eqP; move: t2p; rewrite tau2E; case/andP.
-by exists A; rewrite // (subsetP (pnElemS p _ sEM)).
-Qed.
-
-(* A converse to the above Lemma: if E has an elementary abelian subgroup of *)
-(* order p^2, then p must be in tau2. *)
-Lemma sigma'2Elem_tau2 p A : A \in 'E_p^2(E) -> p \in \tau2(M).
-Proof.
-move=> Ep2A; have rE: 'r_p(E) > 1 by apply/p_rank_geP; exists A.
-have: p \in \pi(E) by rewrite -p_rank_gt0 ltnW.
-rewrite partition_pi_sigma_compl orbCA => /orP[] //.
-by rewrite -!andb_orr eqn_leq leqNgt (leq_trans rE) ?andbF ?p_rankS.
-Qed.
-
-(* This is B & G, Lemma 12.1(a). *)
-Lemma der1_sigma_compl_nil : nilpotent E^`(1).
-Proof.
-have sE'E := der_sub 1 E.
-have nMaE: E \subset 'N(M`_\alpha) by rewrite (subset_trans sEM) ?gFnorm.
-have tiMaE': M`_\alpha :&: E^`(1) = 1.
- by apply/trivgP; rewrite -(coprime_TIg coMsE) setISS ?Malpha_sub_Msigma.
-rewrite (isog_nil (quotient_isog (subset_trans sE'E nMaE) tiMaE')).
-by rewrite (nilpotentS (quotientS _ (dergS 1 sEM))) ?Malpha_quo_nil.
-Qed.
-
-(* This is B & G, Lemma 12.1(g). *)
-Lemma tau2_not_beta p :
- p \in \tau2(M) -> p \notin \beta(G) /\ {subset 'E_p^2(M) <= 'E*_p(G)}.
-Proof.
-case/andP=> s'p /eqP rpM; split; first exact: sigma'_rank2_beta' rpM.
-by apply/subsetP; apply: sigma'_rank2_max.
-Qed.
-
-End Introduction.
-
-Arguments tau2'1 {M} [x].
-Arguments tau3'1 {M} [x].
-Arguments tau3'2 {M} [x].
-
-(* This is the rest of B & G, Lemma 12.1 (parts b, c, d,e, and f). *)
-Lemma sigma_compl_context M E E1 E2 E3 :
- M \in 'M -> sigma_complement M E E1 E2 E3 ->
- [/\ (*b*) E3 \subset E^`(1) /\ E3 <| E,
- (*c*) E2 :==: 1 -> E1 :!=: 1,
- (*d*) cyclic E1 /\ cyclic E3,
- (*e*) E3 ><| (E2 ><| E1) = E /\ E3 ><| E2 ><| E1 = E
- & (*f*) 'C_E3(E) = 1].
-Proof.
-move=> maxM [hallE hallE1 hallE2 hallE3 groupE21].
-have [sEM solM] := (pHall_sub hallE, mmax_sol maxM).
-have [[sE1E t1E1 _] [sE3E t3E3 _]] := (and3P hallE1, and3P hallE3).
-have tiE'E1: E^`(1) :&: E1 = 1.
- rewrite coprime_TIg // coprime_pi' ?cardG_gt0 //.
- by apply: sub_pgroup t1E1 => p; rewrite (tau1E maxM hallE) => /and3P[].
-have cycE1: cyclic E1.
- apply: nil_Zgroup_cyclic.
- rewrite odd_rank1_Zgroup ?mFT_odd //; apply: wlog_neg; rewrite -ltnNge.
- have [p p_pr ->]:= rank_witness E1; move/ltnW; rewrite p_rank_gt0.
- move/(pnatPpi t1E1); rewrite (tau1E maxM hallE) => /and3P[_ _ /eqP <-].
- by rewrite p_rankS.
- rewrite abelian_nil // /abelian (sameP commG1P trivgP) -tiE'E1.
- by rewrite subsetI (der_sub 1) (dergS 1).
-have solE: solvable E := solvableS sEM solM.
-have nilE': nilpotent E^`(1) := der1_sigma_compl_nil maxM hallE.
-have nsE'piE pi: 'O_pi(E^`(1)) <| E by rewrite !gFnormal_trans.
-have SylowE3 P: Sylow E3 P -> [/\ cyclic P, P \subset E^`(1) & 'C_P(E) = 1].
-- case/SylowP=> p p_pr sylP; have [sPE3 pP _] := and3P sylP.
- have [-> | ntP] := eqsVneq P 1.
- by rewrite cyclic1 sub1G (setIidPl (sub1G _)).
- have t3p: p \in \tau3(M).
- rewrite (pnatPpi t3E3) // -p_rank_gt0 -(p_rank_Sylow sylP) -rank_pgroup //.
- by rewrite rank_gt0.
- have sPE: P \subset E := subset_trans sPE3 sE3E.
- have cycP: cyclic P.
- rewrite (odd_pgroup_rank1_cyclic pP) ?mFT_odd //.
- rewrite (tau3E maxM hallE) in t3p.
- by case/andP: t3p => _ /eqP <-; rewrite p_rankS.
- have nEp'E: E \subset 'N('O_p^'(E)) by apply: gFnorm.
- have nEp'P := subset_trans sPE nEp'E.
- have sylP_E := subHall_Sylow hallE3 t3p sylP.
- have nsEp'P_E: 'O_p^'(E) <*> P <| E.
- rewrite sub_der1_normal ?join_subG ?pcore_sub //=.
- rewrite norm_joinEr // -quotientSK ?gFsub_trans //=.
- have [_ /= <- _ _] := dprodP (nilpotent_pcoreC p nilE').
- rewrite -quotientMidr -mulgA (mulSGid (pcore_max _ _)) ?pcore_pgroup //=.
- rewrite quotientMidr quotientS //.
- apply: subset_trans (pcore_sub_Hall sylP_E).
- by rewrite pcore_max ?pcore_pgroup ?nsE'piE.
- have nEP_sol: solvable 'N_E(P) by rewrite (solvableS _ solE) ?subsetIl.
- have [K hallK] := Hall_exists p^' nEP_sol; have [sKNEP p'K _] := and3P hallK.
- have coPK: coprime #|P| #|K| := pnat_coprime pP p'K.
- have sP_NEP: P \subset 'N_E(P) by rewrite subsetI sPE normG.
- have mulPK: P * K = 'N_E(P).
- apply/eqP; rewrite eqEcard mul_subG //= coprime_cardMg // (card_Hall hallK).
- by rewrite (card_Hall (pHall_subl sP_NEP (subsetIl E _) sylP_E)) partnC.
- have{sKNEP} [sKE nPK] := subsetIP sKNEP; have nEp'K := subset_trans sKE nEp'E.
- have defE: 'O_p^'(E) <*> K * P = E.
- have sP_Ep'P: P \subset 'O_p^'(E) <*> P := joing_subr _ _.
- have sylP_Ep'P := pHall_subl sP_Ep'P (normal_sub nsEp'P_E) sylP_E.
- rewrite -{2}(Frattini_arg nsEp'P_E sylP_Ep'P) /= !norm_joinEr //.
- by rewrite -mulgA (normC nPK) -mulPK -{1}(mulGid P) !mulgA.
- have ntPE': P :&: E^`(1) != 1.
- have sylPE' := Hall_setI_normal (der_normal 1 E) sylP_E.
- rewrite -rank_gt0 (rank_Sylow sylPE') p_rank_gt0.
- by rewrite (tau3E maxM hallE) in t3p; case/andP: t3p.
- have defP := coprime_abelian_cent_dprod nPK coPK (cyclic_abelian cycP).
- have{defP} [[PK1 _]|[regKP defP]] := cyclic_pgroup_dprod_trivg pP cycP defP.
- have coP_Ep'K: coprime #|P| #|'O_p^'(E) <*> K|.
- rewrite (pnat_coprime pP) // -pgroupE norm_joinEr //.
- by rewrite pgroupM pcore_pgroup.
- rewrite -subG1 -(coprime_TIg coP_Ep'K) setIS ?der1_min // in ntPE'.
- rewrite -{1}defE mulG_subG normG normsY // cents_norm //.
- exact/commG1P.
- by rewrite -{2}defE quotientMidl quotient_abelian ?cyclic_abelian.
- split=> //; first by rewrite -defP commgSS.
- by apply/trivgP; rewrite -regKP setIS ?centS.
-have sE3E': E3 \subset E^`(1).
- by rewrite -(Sylow_gen E3) gen_subG; apply/bigcupsP=> P; case/SylowE3.
-have cycE3: cyclic E3.
- rewrite nil_Zgroup_cyclic ?(nilpotentS sE3E') //.
- by apply/forall_inP => P; case/SylowE3.
-have regEE3: 'C_E3(E) = 1.
- have [// | [p p_pr]] := trivgVpdiv 'C_E3(E).
- case/Cauchy=> // x /setIP[]; rewrite -!cycle_subG => sXE3 cEX ox.
- have pX: p.-elt x by rewrite /p_elt ox pnat_id.
- have [P sylP sXP] := Sylow_superset sXE3 pX.
- suffices: <[x]> == 1 by case/idPn; rewrite cycle_eq1 -order_gt1 ox prime_gt1.
- rewrite -subG1; case/SylowE3: (p_Sylow sylP) => _ _ <-.
- by rewrite subsetI sXP.
-have nsE3E: E3 <| E.
- have hallE3_E' := pHall_subl sE3E' (der_sub 1 E) hallE3.
- by rewrite (nilpotent_Hall_pcore nilE' hallE3_E') /=.
-have [sE2E t2E2 _] := and3P hallE2; have [_ nE3E] := andP nsE3E.
-have coE21: coprime #|E2| #|E1| := sub_pnat_coprime tau2'1 t2E2 t1E1.
-have coE31: coprime #|E3| #|E1| := sub_pnat_coprime tau3'1 t3E3 t1E1.
-have coE32: coprime #|E3| #|E2| := sub_pnat_coprime tau3'2 t3E3 t2E2.
-have{groupE21} defE: E3 ><| (E2 ><| E1) = E.
- have defE21: E2 * E1 = E2 <*> E1 by rewrite -genM_join gen_set_id.
- have sE21E: E2 <*> E1 \subset E by rewrite join_subG sE2E.
- have nE3E21 := subset_trans sE21E nE3E.
- have coE312: coprime #|E3| #|E2 <*> E1|.
- by rewrite -defE21 coprime_cardMg // coprime_mulr coE32.
- have nE21: E1 \subset 'N(E2).
- rewrite (subset_trans (joing_subr E2 E1)) ?sub_der1_norm ?joing_subl //.
- rewrite /= -{2}(mulg1 E2) -(setIidPr (der_sub 1 _)) /=.
- rewrite -(coprime_mulG_setI_norm defE21) ?gFnorm //.
- by rewrite mulgSS ?subsetIl // -tiE'E1 setIC setSI ?dergS.
- rewrite (sdprodEY nE21) ?sdprodE ?coprime_TIg //=.
- apply/eqP; rewrite eqEcard mul_subG // coprime_cardMg //= -defE21.
- rewrite -(partnC \tau3(M) (cardG_gt0 E)) (card_Hall hallE3) leq_mul //.
- rewrite coprime_cardMg // (card_Hall hallE1) (card_Hall hallE2).
- rewrite -[#|E|`__](partnC \tau2(M)) ?leq_mul ?(partn_part _ tau3'2) //.
- rewrite -partnI dvdn_leq // sub_in_partn // => p piEp; apply/implyP.
- rewrite inE /= -negb_or /= orbC implyNb orbC.
- by rewrite -(partition_pi_sigma_compl maxM hallE).
-split=> // [/eqP E2_1|]; last split=> //.
- apply: contraTneq (sol_der1_proper solM (subxx _) (mmax_neq1 maxM)) => E1_1.
- case/sdprodP: (sdprod_sigma maxM hallE) => _ defM _ _.
- rewrite properE der_sub /= negbK -{1}defM mulG_subG Msigma_der1 //.
- by rewrite -defE E1_1 E2_1 !sdprodg1 (subset_trans sE3E') ?dergS //.
-case/sdprodP: defE => [[_ E21 _ defE21]]; rewrite defE21 => defE nE321 tiE321.
-have{defE21} [_ defE21 nE21 tiE21] := sdprodP defE21.
-have [nE32 nE31] := (subset_trans sE2E nE3E, subset_trans sE1E nE3E).
-rewrite [E3 ><| _]sdprodEY ? sdprodE ?coprime_TIg ?normsY //=.
- by rewrite norm_joinEr // -mulgA defE21.
-by rewrite norm_joinEr // coprime_cardMg // coprime_mull coE31.
-Qed.
-
-(* This is B & G, Lemma 12.2(a). *)
-Lemma prime_class_mmax_norm M p X :
- M \in 'M -> p.-group X -> 'N(X) \subset M ->
- (p \in \sigma(M)) || (p \in \tau2(M)).
-Proof.
-move=> maxM pX sNM; rewrite -implyNb; apply/implyP=> sM'p.
-by rewrite 3!inE /= sM'p (sigma'_norm_mmax_rank2 _ _ pX).
-Qed.
-
-(* This is B & G, Lemma 12.2(b). *)
-Lemma mmax_norm_notJ M Mstar p X :
- M \in 'M -> Mstar \in 'M ->
- p.-group X -> X \subset M -> 'N(X) \subset Mstar ->
- [|| [&& p \in \sigma(M) & M :!=: Mstar], p \in \tau1(M) | p \in \tau3(M)] ->
- gval Mstar \notin M :^: G.
-Proof.
-move: Mstar => H maxM maxH pX sXM sNH; apply: contraL => MG_H.
-have [x Gx defH] := imsetP MG_H.
-have [sMp | sM'p] := boolP (p \in \sigma(M)); last first.
- have:= prime_class_mmax_norm maxH pX sNH.
- rewrite defH /= sigmaJ tau2J !negb_or (negPf sM'p) /= => t2Mp.
- by rewrite (contraL (@tau2'1 _ p)) // [~~ _]tau3'2.
-rewrite 3!inE sMp 3!inE sMp orbF negbK.
-have [_ transCX _] := sigma_group_trans maxM sMp pX.
-set maxMX := finset _ in transCX.
-have maxMX_H: gval H \in maxMX by rewrite inE MG_H (subset_trans (normG X)).
-have maxMX_M: gval M \in maxMX by rewrite inE orbit_refl.
-have [y cXy ->] := atransP2 transCX maxMX_H maxMX_M.
-by rewrite /= conjGid // (subsetP sNH) // (subsetP (cent_sub X)).
-Qed.
-
-(* This is B & G, Lemma 12.3. *)
-Lemma nonuniq_p2Elem_cent_sigma M Mstar p A A0 :
- M \in 'M -> Mstar \in 'M -> Mstar :!=: M -> A \in 'E_p^2(M) ->
- A0 \in 'E_p^1(A) -> 'N(A0) \subset Mstar ->
- [/\ (*a*) p \notin \sigma(M) -> A \subset 'C(M`_\sigma :&: Mstar)
- & (*b*) p \notin \alpha(M) -> A \subset 'C(M`_\alpha :&: Mstar)].
-Proof.
-move: Mstar => H maxM maxH neqMH Ep2A EpA0 sNH.
-have p_pr := pnElem_prime Ep2A.
-have [sAM abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
-have [sA0A _ _] := pnElemP EpA0; have pA0 := pgroupS sA0A pA.
-have sAH: A \subset H.
- by apply: subset_trans (cents_norm _) sNH; apply: subset_trans (centS sA0A).
-have nsHsH: H`_\sigma <| H by apply: pcore_normal.
-have [sHsH nHsH] := andP nsHsH; have nHsA := subset_trans sAH nHsH.
-have nsHsA_H: H`_\sigma <*> A <| H.
- have [sHp | sH'p] := boolP (p \in \sigma(H)).
- rewrite (joing_idPl _) ?pcore_normal //.
- by rewrite (sub_Hall_pcore (Msigma_Hall _)) // (pi_pgroup pA).
- have [P sylP sAP] := Sylow_superset sAH pA.
- have excH: exceptional_FTmaximal p H A0 A by split=> //; apply/pnElemP.
- exact: exceptional_mul_sigma_normal excH sylP sAP.
-have cAp' K:
- p^'.-group K -> A \subset 'N(K) -> K \subset H ->
- [~: K, A] \subset K :&: H`_\sigma.
-- move=> p'K nKA sKH; have nHsK := subset_trans sKH nHsH.
- rewrite subsetI commg_subl nKA /= -quotient_sub1 ?comm_subG // quotientR //=.
- have <-: K / H`_\sigma :&: A / H`_\sigma = 1.
- by rewrite setIC coprime_TIg ?coprime_morph ?(pnat_coprime pA p'K).
- rewrite subsetI commg_subl commg_subr /= -{2}(quotientYidr nHsA).
- by rewrite !quotient_norms //= joingC (subset_trans sKH) ?normal_norm.
-have [sMp | sM'p] := boolP (p \in \sigma(M)).
- split=> // aM'p; have notMGH: gval H \notin M :^: G.
- apply: mmax_norm_notJ maxM maxH pA0 (subset_trans sA0A sAM) sNH _.
- by rewrite sMp eq_sym neqMH.
- rewrite centsC (sameP commG1P trivgP).
- apply: subset_trans (cAp' _ _ _ (subsetIr _ _)) _.
- - exact: pi_p'group (pgroupS (subsetIl _ _) (pcore_pgroup _ _)) aM'p.
- - by rewrite (normsI _ (normsG sAH)) // (subset_trans sAM) ?gFnorm.
- by rewrite setIAC; case/sigma_disjoint: notMGH => // -> _ _; apply: subsetIl.
-suffices cMaA: A \subset 'C(M`_\sigma :&: H).
- by rewrite !{1}(subset_trans cMaA) ?centS ?setSI // Malpha_sub_Msigma.
-have [sHp | sH'p] := boolP (p \in \sigma(H)); last first.
- apply/commG1P; apply: contraNeq neqMH => ntA_MsH.
- have [P sylP sAP] := Sylow_superset sAH pA.
- have excH: exceptional_FTmaximal p H A0 A by split=> //; apply/pnElemP.
- have maxAM: M \in 'M(A) by apply/setIdP.
- rewrite (exceptional_sigma_uniq maxH excH sylP sAP maxAM) //.
- apply: contraNneq ntA_MsH => tiMsHs; rewrite -subG1.
- have [sHsA_H nHsA_H] := andP nsHsA_H.
- have <-: H`_\sigma <*> A :&: M`_\sigma = 1.
- apply/trivgP; rewrite -tiMsHs subsetI subsetIr /=.
- rewrite -quotient_sub1 ?subIset ?(subset_trans sHsA_H) //.
- rewrite quotientGI ?joing_subl //= joingC quotientYidr //.
- rewrite setIC coprime_TIg ?coprime_morph //.
- rewrite (pnat_coprime (pcore_pgroup _ _)) // (card_pnElem Ep2A).
- by rewrite pnat_exp ?orbF ?pnatE.
- rewrite commg_subI // subsetI ?joing_subr ?subsetIl.
- by rewrite (subset_trans sAM) ?gFnorm.
- by rewrite setIC subIset ?nHsA_H.
-have sAHs: A \subset H`_\sigma.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxH)) // (pi_pgroup pA).
-have [S sylS sAS] := Sylow_superset sAHs pA; have [sSHs pS _] := and3P sylS.
-have nsHaH: H`_\alpha <| H := pcore_normal _ _; have [_ nHaH] := andP nsHaH.
-have nHaS := subset_trans (subset_trans sSHs sHsH) nHaH.
-have nsHaS_H: H`_\alpha <*> S <| H.
- rewrite -{2}(quotientGK nsHaH) (norm_joinEr nHaS) -quotientK //.
- rewrite cosetpre_normal; apply: char_normal_trans (quotient_normal _ nsHsH).
- rewrite /= (nilpotent_Hall_pcore _ (quotient_pHall _ sylS)) ?pcore_char //.
- exact: nilpotentS (quotientS _ (Msigma_der1 maxH)) (Malpha_quo_nil maxH).
-rewrite (sameP commG1P trivgP).
-have <-: H`_\alpha <*> S :&: M`_\sigma = 1.
- have: gval M \notin H :^: G.
- by apply: contra sM'p; case/imsetP=> x _ ->; rewrite sigmaJ.
- case/sigma_disjoint=> // _ ti_aHsM _.
- rewrite setIC coprime_TIg ?(pnat_coprime (pcore_pgroup _ _)) //=.
- rewrite norm_joinEr // [pnat _ _]pgroupM (pi_pgroup pS) // andbT.
- apply: sub_pgroup (pcore_pgroup _ _) => q aHq.
- by apply: contraFN (ti_aHsM q) => sMq; rewrite inE /= aHq.
-rewrite commg_subI // subsetI ?subsetIl.
- by rewrite (subset_trans sAS) ?joing_subr ?(subset_trans sAM) ?gFnorm.
-by rewrite setIC subIset 1?normal_norm.
-Qed.
-
-(* This is B & G, Proposition 12.4. *)
-Proposition p2Elem_mmax M p A :
- M \in 'M -> A \in 'E_p^2(M) ->
- (*a*) 'C(A) \subset M
- /\ (*b*) ([forall A0 in 'E_p^1(A), 'M('N(A0)) != [set M]] ->
- [/\ p \in \sigma(M), M`_\alpha = 1 & nilpotent M`_\sigma]).
-Proof.
-move=> maxM Ep2A; have p_pr := pnElem_prime Ep2A.
-have [sAM abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
-have [EpAnonuniq |] := altP forall_inP; last first.
- rewrite negb_forall_in; case/exists_inP=> A0 EpA0; rewrite negbK.
- case/eqP/mem_uniq_mmax=> _ sNA0_M; rewrite (subset_trans _ sNA0_M) //.
- by have [sA0A _ _] := pnElemP EpA0; rewrite cents_norm // centS.
-have{EpAnonuniq} sCMkApCA y: y \in A^# ->
- [/\ 'r('C_M(<[y]>)) <= 2,
- p \in \sigma(M)^' -> 'C_(M`_\sigma)[y] \subset 'C_M(A)
- & p \in \alpha(M)^' -> 'C_(M`_\alpha)[y] \subset 'C_M(A)].
-- case/setD1P=> nty Ay; pose Y := <[y]>%G.
- rewrite -cent_cycle -[<[y]>]/(gval Y).
- have EpY: Y \in 'E_p^1(A).
- by rewrite p1ElemE // 2!inE cycle_subG Ay -orderE (abelem_order_p abelA) /=.
- have [sYA abelY dimY] := pnElemP EpY; have [pY _] := andP abelY.
- have [H maxNYH neqHM]: exists2 H, H \in 'M('N(Y)) & H \notin [set M].
- apply/subsetPn; rewrite subset1 negb_or EpAnonuniq //=.
- apply/set0Pn; have [|H] := (@mmax_exists _ 'N(Y)); last by exists H.
- rewrite mFT_norm_proper ?(mFT_pgroup_proper pY) //.
- by rewrite -rank_gt0 (rank_abelem abelY) dimY.
- have{maxNYH} [maxH sNYH] := setIdP maxNYH; rewrite inE -val_eqE /= in neqHM.
- have ->: 'r('C_M(Y)) <= 2.
- apply: contraR neqHM; rewrite -ltnNge => rCMYgt2.
- have uniqCMY: 'C_M(Y)%G \in 'U.
- by rewrite rank3_Uniqueness ?(sub_mmax_proper maxM) ?subsetIl.
- have defU: 'M('C_M(Y)) = [set M] by apply: def_uniq_mmax; rewrite ?subsetIl.
- rewrite (eq_uniq_mmax defU maxH) ?subIset //.
- by rewrite orbC (subset_trans (cent_sub Y)).
- have [cAMs cAMa] := nonuniq_p2Elem_cent_sigma maxM maxH neqHM Ep2A EpY sNYH.
- do 2!rewrite {1}subsetI {1}(subset_trans (subsetIl _ _) (pcore_sub _ _)).
- have sCYH: 'C(Y) \subset H := subset_trans (cent_sub Y) sNYH.
- by split=> // [/cAMs | /cAMa]; rewrite centsC; apply/subset_trans/setIS.
-have ntA: A :!=: 1 by rewrite -rank_gt0 (rank_abelem abelA) dimA.
-have ncycA: ~~ cyclic A by rewrite (abelem_cyclic abelA) dimA.
-have rCMAle2: 'r('C_M(A)) <= 2.
- have [y Ay]: exists y, y \in A^# by apply/set0Pn; rewrite setD_eq0 subG1.
- have [rCMy _ _] := sCMkApCA y Ay; apply: leq_trans rCMy.
- by rewrite rankS // setIS // centS // cycle_subG; case/setIdP: Ay.
-have sMp: p \in \sigma(M).
- apply: contraFT (ltnn 1) => sM'p; rewrite -dimA -(rank_abelem abelA).
- suffices cMsA: A \subset 'C(M`_\sigma).
- by rewrite -(setIidPl cMsA) sub'cent_sigma_rank1 // (pi_pgroup pA).
- have nMsA: A \subset 'N(M`_\sigma) by rewrite (subset_trans sAM) ?gFnorm.
- rewrite centsC /= -(coprime_abelian_gen_cent1 _ _ nMsA) //; last first.
- exact: pnat_coprime (pcore_pgroup _ _) (pi_pnat pA _).
- rewrite gen_subG; apply/bigcupsP=> y; case/sCMkApCA=> _ sCMsyCA _.
- by rewrite (subset_trans (sCMsyCA sM'p)) ?subsetIr.
-have [P sylP sAP] := Sylow_superset sAM pA; have [sPM pP _] := and3P sylP.
-pose Z := 'Ohm_1('Z(P)).
-have sZA: Z \subset A.
- have maxA: A \in 'E*_p('C_M(A)).
- have sACMA: A \subset 'C_M(A) by rewrite subsetI sAM.
- rewrite (subsetP (p_rankElem_max _ _)) // !inE abelA sACMA.
- rewrite eqn_leq logn_le_p_rank /=; last by rewrite !inE sACMA abelA.
- by rewrite dimA (leq_trans (p_rank_le_rank _ _)).
- rewrite [Z](OhmE 1 (pgroupS (center_sub P) pP)) gen_subG.
- rewrite -(pmaxElem_LdivP p_pr maxA) -(setIA M) setIid setSI //=.
- by rewrite setISS // centS.
-have{ntA} ntZ: Z != 1.
- by rewrite Ohm1_eq1 (center_nil_eq1 (pgroup_nil pP)) (subG1_contra sAP).
-have rPle2: 'r(P) <= 2.
- have [z Zz ntz]: exists2 z, z \in Z & z \notin [1].
- by apply/subsetPn; rewrite subG1.
- have [|rCMz _ _] := sCMkApCA z; first by rewrite inE ntz (subsetP sZA).
- rewrite (leq_trans _ rCMz) ?rankS // subsetI sPM centsC cycle_subG.
- by rewrite (subsetP _ z Zz) // gFsub_trans ?subsetIr.
-have aM'p: p \in \alpha(M)^'.
- by rewrite !inE -leqNgt -(p_rank_Sylow sylP) -rank_pgroup.
-have sMaCMA: M`_\alpha \subset 'C_M(A).
-have nMaA: A \subset 'N(M`_\alpha) by rewrite (subset_trans sAM) ?gFnorm.
- rewrite -(coprime_abelian_gen_cent1 _ _ nMaA) //; last first.
- exact: (pnat_coprime (pcore_pgroup _ _) (pi_pnat pA _)).
- rewrite gen_subG; apply/bigcupsP=> y; case/sCMkApCA=> _ _ sCMayCA.
- by rewrite (subset_trans (sCMayCA aM'p)) ?subsetIr.
-have Ma1: M`_\alpha = 1.
- have [q q_pr rMa]:= rank_witness M`_\alpha.
- apply: contraTeq rCMAle2; rewrite -ltnNge -rank_gt0 rMa p_rank_gt0 => piMa_q.
- have aMq: q \in \alpha(M) := pnatPpi (pcore_pgroup _ _) piMa_q.
- apply: leq_trans (rankS sMaCMA); rewrite rMa.
- have [Q sylQ] := Sylow_exists q M`_\alpha; rewrite -(p_rank_Sylow sylQ).
- by rewrite (p_rank_Sylow (subHall_Sylow (Malpha_Hall maxM) aMq sylQ)).
-have nilMs: nilpotent M`_\sigma.
- rewrite (nilpotentS (Msigma_der1 maxM)) // (isog_nil (quotient1_isog _)).
- by rewrite -Ma1 Malpha_quo_nil.
-rewrite (subset_trans (cents_norm (centS sZA))) ?(mmax_normal maxM) //=.
-have{sylP} sylP: p.-Sylow(M`_\sigma) P.
- apply: pHall_subl _ (pcore_sub _ _) sylP.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) // (pi_pgroup pP).
-by rewrite (nilpotent_Hall_pcore _ sylP) ?gFnormal_trans.
-Qed.
-
-(* This is B & G, Theorem 12.5(a) -- this part does not mention a specific *)
-(* rank 2 elementary abelian \tau_2(M) subgroup of M. *)
-
-Theorem tau2_Msigma_nil M p : M \in 'M -> p \in \tau2(M) -> nilpotent M`_\sigma.
-Proof.
-move=> maxM t2Mp; have [sM'p /eqP rpM] := andP t2Mp.
-have [A Ep2A] := p_rank_witness p M; rewrite rpM in Ep2A.
-have [_]:= p2Elem_mmax maxM Ep2A; rewrite -negb_exists_in [p \in _](negPf sM'p).
-have [[A0 EpA0 /eqP/mem_uniq_mmax[_ sNA0M _]] | _ [] //] := exists_inP.
-have{EpA0 sNA0M} excM: exceptional_FTmaximal p M A0 A by [].
-have [sAM abelA _] := pnElemP Ep2A; have [pA _] := andP abelA.
-have [P sylP sAP] := Sylow_superset sAM pA.
-exact: exceptional_sigma_nil maxM excM sylP sAP.
-Qed.
-
-(* This is B & G, Theorem 12.5 (b-f) -- the bulk of the Theorem. *)
-Theorem tau2_context M p A (Ms := M`_\sigma) :
- M \in 'M -> p \in \tau2(M) -> A \in 'E_p^2(M) ->
- [/\ (*b*) forall P, p.-Sylow(M) P ->
- abelian P
- /\ (A \subset P -> 'Ohm_1(P) = A /\ ~~ ('N(P) \subset M)),
- (*c*) Ms <*> A <| M,
- (*d*) 'C_Ms(A) = 1,
- (*e*) forall Mstar, Mstar \in 'M(A) :\ M -> Ms :&: Mstar = 1
- & (*f*) exists2 A1, A1 \in 'E_p^1(A) & 'C_Ms(A1) = 1].
-Proof.
-move=> maxM t2Mp Ep2A; have [sM'p _] := andP t2Mp.
-have [_]:= p2Elem_mmax maxM Ep2A; rewrite -negb_exists_in [p \in _](negPf sM'p).
-have [[A0 EpA0 /eqP/mem_uniq_mmax[_ sNA0M _]] | _ [] //] := exists_inP.
-have{EpA0 sNA0M} excM: exceptional_FTmaximal p M A0 A by [].
-have strM := exceptional_structure maxM excM.
-have [sAM abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
-have [P sylP sAP] := Sylow_superset sAM pA.
-have nsMsA_M : Ms <*> A <| M := exceptional_mul_sigma_normal maxM excM sylP sAP.
-have [_ regA [A1 EpA1 [_ _ [_ regA1 _]]]] := strM P sylP sAP.
-split=> // [P1 sylP1 | {P sylP sAP A0 excM}H| ]; last by exists A1.
- split=> [|sAP1]; first exact: (exceptional_Sylow_abelian _ excM sylP).
- split; first by case/strM: sylP1.
- by apply: contra sM'p => sNP1M; apply/exists_inP; exists P1; rewrite // ?inE.
-case/setD1P; rewrite -val_eqE /= => neqHM /setIdP[maxH sAH].
-apply/trivgP; rewrite -regA subsetI subsetIl /=.
-have Ep2A_H: A \in 'E_p^2(H) by apply/pnElemP.
-have [_]:= p2Elem_mmax maxH Ep2A_H; rewrite -negb_exists_in.
-have [[A0 EpA0 /eqP/mem_uniq_mmax[_ sNA0H _]]|_ [//|sHp _ nilHs]] := exists_inP.
- have [cMSH_A _]:= nonuniq_p2Elem_cent_sigma maxM maxH neqHM Ep2A EpA0 sNA0H.
- by rewrite centsC cMSH_A.
-have [P sylP sAP] := Sylow_superset sAH pA; have [sPH pP _] := and3P sylP.
-have sylP_Hs: p.-Sylow(H`_\sigma) P.
- rewrite (pHall_subl _ (pcore_sub _ _) sylP) //.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxH)) // (pi_pgroup pP).
-have nPH: H \subset 'N(P).
- by rewrite (nilpotent_Hall_pcore nilHs sylP_Hs) !gFnorm_trans ?normG.
-have coMsP: coprime #|M`_\sigma| #|P|.
- exact: pnat_coprime (pcore_pgroup _ _) (pi_pnat pP _).
-rewrite (sameP commG1P trivgP) -(coprime_TIg coMsP) commg_subI ?setIS //.
-by rewrite subsetI sAP (subset_trans sAM) ?gFnorm.
-Qed.
-
-(* This is B & G, Corollary 12.6 (a, b, c & f) -- i.e., the assertions that *)
-(* do not depend on the decomposition of the complement. *)
-Corollary tau2_compl_context M E p A (Ms := M`_\sigma) :
- M \in 'M -> \sigma(M)^'.-Hall(M) E -> p \in \tau2(M) -> A \in 'E_p^2(E) ->
- [/\ (*a*) A <| E /\ 'E_p^1(E) = 'E_p^1(A),
- (*b*) [/\ 'C(A) \subset E, 'N_M(A) = E & ~~ ('N(A) \subset M)],
- (*c*) forall X, X \in 'E_p^1(E) -> 'C_Ms(X) != 1 -> 'M('C(X)) = [set M]
- & (*f*) forall Mstar,
- Mstar \in 'M -> gval Mstar \notin M :^: G ->
- Ms :&: Mstar`_\sigma = 1
- /\ [predI \sigma(M) & \sigma(Mstar)] =i pred0].
-Proof.
-move=> maxM hallE t2Mp Ep2A; have [sEM sM'E _] := and3P hallE.
-have [p_pr [sM'p _]] := (pnElem_prime Ep2A, andP t2Mp).
-have [sAE abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
-have [_ mulMsE nMsE tiMsE] := sdprodP (sdprod_sigma maxM hallE).
-have Ep2A_M: A \in 'E_p^2(M) by rewrite (subsetP (pnElemS _ _ sEM)).
-have [syl_p_M nsMsAM regA tiMsMA _] := tau2_context maxM t2Mp Ep2A_M.
-have nMsA: A \subset 'N(Ms) := subset_trans sAE nMsE.
-have nsAE: A <| E.
- rewrite /normal sAE -(mul1g A) -tiMsE setIC group_modr // normsI ?normG //.
- by rewrite (subset_trans sEM) // -(norm_joinEr nMsA) normal_norm.
-have sAsylE P: p.-Sylow(E) P -> 'Ohm_1(P) = A /\ ~~ ('N(P) \subset M).
- move=> sylP; have sylP_M: p.-Sylow(M) P by apply: (subHall_Sylow hallE).
- have [_] := syl_p_M P sylP_M; apply.
- exact: subset_trans (pcore_max pA nsAE) (pcore_sub_Hall sylP).
-have not_sNA_M: ~~ ('N(A) \subset M).
- have [P sylP] := Sylow_exists p E; have [<-]:= sAsylE P sylP.
- exact/contra/subset_trans/gFnorms.
-have{sAsylE syl_p_M} defEpE: 'E_p^1(E) = 'E_p^1(A).
- apply/eqP; rewrite eqEsubset andbC pnElemS //.
- apply/subsetP=> X /pnElemP[sXE abelX dimX]; apply/pnElemP; split=> //.
- have [pX _ eX] := and3P abelX; have [P sylP sXP] := Sylow_superset sXE pX.
- have [<- _]:= sAsylE P sylP; have [_ pP _] := and3P sylP.
- by rewrite (OhmE 1 pP) sub_gen // subsetI sXP sub_LdivT.
-have defNMA: 'N_M(A) = E.
- rewrite -mulMsE setIC -group_modr ?normal_norm //= setIC.
- rewrite coprime_norm_cent ?regA ?mul1g //.
- exact: (pnat_coprime (pcore_pgroup _ _) (pi_pnat pA _)).
-have [sCAM _]: 'C(A) \subset M /\ _ := p2Elem_mmax maxM Ep2A_M.
-have sCAE: 'C(A) \subset E by rewrite -defNMA subsetI sCAM cent_sub.
-split=> // [X EpX | H maxH not_MGH]; last first.
- by case/sigma_disjoint: not_MGH => // _ _; apply; apply: tau2_Msigma_nil t2Mp.
-rewrite defEpE in EpX; have [sXA abelX dimX] := pnElemP EpX.
-have ntX: X :!=: 1 by rewrite -rank_gt0 (rank_abelem abelX) dimX.
-apply: contraNeq => neq_maxCX_M.
-have{neq_maxCX_M} [H]: exists2 H, H \in 'M('C(X)) & H \notin [set M].
- apply/subsetPn; rewrite subset1 negb_or neq_maxCX_M.
- by have [H maxH]:= mmax_exists (mFT_cent_proper ntX); apply/set0Pn; exists H.
-case/setIdP=> maxH sCXH neqHM.
-rewrite -subG1 -(tiMsMA H) ?setIS // inE neqHM inE maxH.
-exact: subset_trans (sub_abelian_cent cAA sXA) sCXH.
-Qed.
-
-(* This is B & G, Corollary 12.6 (d, e) -- the parts that apply to a *)
-(* particular decomposition of the complement. We included an easy consequece *)
-(* of part (a), that A is a subgroup of E2, as this is used implicitly later *)
-(* in sections 12 and 13. *)
-Corollary tau2_regular M E E1 E2 E3 p A (Ms := M`_\sigma) :
- M \in 'M -> sigma_complement M E E1 E2 E3 ->
- p \in \tau2(M) -> A \in 'E_p^2(E) ->
- [/\ (*d*) semiregular Ms E3,
- (*e*) semiregular Ms 'C_E1(A)
- & A \subset E2].
-Proof.
-move=> maxM complEi t2Mp Ep2A; have p_pr := pnElem_prime Ep2A.
-have [hallE hallE1 hallE2 hallE3 _] := complEi.
-have [sEM sM'E _] := and3P hallE; have [sM'p _] := andP t2Mp.
-have [sAE abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
-have Ep2A_M: A \in 'E_p^2(M) by rewrite (subsetP (pnElemS _ _ sEM)).
-have [_ _ _ tiMsMA _] := tau2_context maxM t2Mp Ep2A_M.
-have [[nsAE _] _ _ _] := tau2_compl_context maxM hallE t2Mp Ep2A.
-have [sCAM _]: 'C(A) \subset M /\ _ := p2Elem_mmax maxM Ep2A_M.
-have sAE2: A \subset E2.
- exact: normal_sub_max_pgroup (Hall_max hallE2) (pi_pnat pA _) nsAE.
-split=> // x /setD1P[ntx]; last first.
- case/setIP; rewrite -cent_cycle -!cycle_subG => sXE1 cAX.
- pose q := pdiv #[x]; have piXq: q \in \pi(#[x]) by rewrite pi_pdiv order_gt1.
- have [Q sylQ] := Sylow_exists q <[x]>; have [sQX qQ _] := and3P sylQ.
- have [sE1E t1E1 _] := and3P hallE1; have sQE1 := subset_trans sQX sXE1.
- have sQM := subset_trans sQE1 (subset_trans sE1E sEM).
- have [H /setIdP[maxH sNQH]]: {H | H \in 'M('N(Q))}.
- apply: mmax_exists; rewrite mFT_norm_proper ?(mFT_pgroup_proper qQ) //.
- by rewrite -rank_gt0 (rank_pgroup qQ) (p_rank_Sylow sylQ) p_rank_gt0.
- apply/trivgP; rewrite -(tiMsMA H) ?setIS //.
- by rewrite (subset_trans _ sNQH) ?cents_norm ?centS.
- rewrite 3!inE maxH /=; apply/andP; split.
- apply: contra_orbit (mmax_norm_notJ maxM maxH qQ sQM sNQH _).
- by rewrite (pnatPpi (pgroupS sXE1 t1E1)) ?orbT.
- by rewrite (subset_trans _ sNQH) ?cents_norm // centsC (subset_trans sQX).
-rewrite -cent_cycle -cycle_subG => sXE3.
-pose q := pdiv #[x]; have piXq: q \in \pi(#[x]) by rewrite pi_pdiv order_gt1.
-have [Q sylQ] := Sylow_exists q <[x]>; have [sQX qQ _] := and3P sylQ.
-have [sE3E t3E3 _] := and3P hallE3; have sQE3 := subset_trans sQX sXE3.
-have sQM := subset_trans sQE3 (subset_trans sE3E sEM).
-have [H /setIdP[maxH sNQH]]: {H | H \in 'M('N(Q))}.
- apply: mmax_exists; rewrite mFT_norm_proper ?(mFT_pgroup_proper qQ) //.
- by rewrite -rank_gt0 (rank_pgroup qQ) (p_rank_Sylow sylQ) p_rank_gt0.
-apply/trivgP; rewrite -(tiMsMA H) ?setIS //.
- by rewrite (subset_trans _ sNQH) ?cents_norm ?centS.
-rewrite 3!inE maxH /=; apply/andP; split.
- apply: contra_orbit (mmax_norm_notJ maxM maxH qQ sQM sNQH _).
- by rewrite (pnatPpi (pgroupS sXE3 t3E3)) ?orbT.
-rewrite (subset_trans _ sNQH) ?cents_norm // (subset_trans _ (centS sQE3)) //.
-have coE3A: coprime #|E3| #|A|.
- by rewrite (pnat_coprime t3E3 (pi_pnat pA _)) ?tau3'2.
-rewrite (sameP commG1P trivgP) -(coprime_TIg coE3A) subsetI commg_subl.
-have [[_ nsE3E] _ _ _ _] := sigma_compl_context maxM complEi.
-by rewrite commg_subr (subset_trans sE3E) ?(subset_trans sAE) ?normal_norm.
-Qed.
-
-(* This is B & G, Theorem 12.7. *)
-Theorem nonabelian_tau2 M E p A P0 (Ms := M`_\sigma) (A0 := 'C_A(Ms)%G) :
- M \in 'M -> \sigma(M)^'.-Hall(M) E -> p \in \tau2(M) -> A \in 'E_p^2(E) ->
- p.-group P0 -> ~~ abelian P0 ->
- [/\ (*a*) \tau2(M) =i (p : nat_pred),
- (*b*) #|A0| = p /\ Ms \x A0 = 'F(M),
- (*c*) forall X,
- X \in 'E_p^1(E) :\ A0 -> 'C_Ms(X) = 1 /\ ~~ ('C(X) \subset M)
- & (*d*) exists2 E0 : {group gT}, A0 ><| E0 = E
- & (*e*) forall x, x \in Ms^# -> {subset \pi('C_E0[x]) <= \tau1(M)}].
-Proof.
-rewrite {}/A0 => maxM hallE t2Mp Ep2A pP0 not_cP0P0 /=.
-have p_pr := pnElem_prime Ep2A.
-have [sEM sM'E _] := and3P hallE; have [sM'p _] := andP t2Mp.
-have [sAE abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
-have Ep2A_M: A \in 'E_p^2(M) by rewrite (subsetP (pnElemS _ _ sEM)).
-have [[E1 hallE1] [E3 hallE3]] := ex_tau13_compl hallE.
-have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
-have [regE3 _ sAE2] := tau2_regular maxM complEi t2Mp Ep2A.
-have [P sylP sAP] := Sylow_superset sAE2 pA; have [sPE2 pP _] := and3P sylP.
-have [S /= sylS sPS] := Sylow_superset (subsetT P) pP.
-have pS := pHall_pgroup sylS; have sAS := subset_trans sAP sPS.
-have sylP_E: p.-Sylow(E) P := subHall_Sylow hallE2 t2Mp sylP.
-have sylP_M: p.-Sylow(M) P := subHall_Sylow hallE sM'p sylP_E.
-have [syl_p_M _ regA _ _] := tau2_context maxM t2Mp Ep2A_M.
-have{syl_p_M} cPP: abelian P by case: (syl_p_M P).
-have{P0 pP0 not_cP0P0} not_cSS: ~~ abelian S.
- have [x _ sP0Sx] := Sylow_subJ sylS (subsetT P0) pP0.
- by apply: contra not_cP0P0 => cSS; rewrite (abelianS sP0Sx) ?abelianJ.
-have [defP | ltPS] := eqVproper sPS; first by rewrite -defP cPP in not_cSS.
-have [[nsAE defEp] [sCAE _ _] nregA _] :=
- tau2_compl_context maxM hallE t2Mp Ep2A.
-have defCSA: 'C_S(A) = P.
- apply: (sub_pHall sylP_E (pgroupS (subsetIl _ _) pS)).
- by rewrite subsetI sPS (sub_abelian_cent2 cPP).
- by rewrite subIset // sCAE orbT.
-have max2A: A \in 'E_p^2(G) :&: 'E*_p(G).
- by rewrite 3!inE subsetT abelA dimA; case: (tau2_not_beta maxM t2Mp) => _ ->.
-have def_t2: \tau2(M) =i (p : nat_pred).
- move=> q; apply/idP/idP=> [t2Mq |]; last by move/eqnP->.
- apply: contraLR (proper_card ltPS); rewrite !inE /= eq_sym -leqNgt => q'p.
- apply: wlog_neg => p'q; have [B EqB] := p_rank_witness q E.
- have{EqB} Eq2B: B \in 'E_q^2(E).
- by move: t2Mq; rewrite (tau2E hallE) => /andP[_ /eqP <-].
- have [sBE abelB dimB]:= pnElemP Eq2B; have [qB _] := andP abelB.
- have coBA: coprime #|B| #|A| by apply: pnat_coprime qB (pi_pnat pA _).
- have [[nsBE _] [sCBE _ _] _ _] := tau2_compl_context maxM hallE t2Mq Eq2B.
- have nBA: A \subset 'N(B) by rewrite (subset_trans sAE) ?normal_norm.
- have cAB: B \subset 'C(A).
- rewrite (sameP commG1P trivgP) -(coprime_TIg coBA) subsetI commg_subl nBA.
- by rewrite commg_subr (subset_trans sBE) ?normal_norm.
- have{cAB} qCA: q %| #|'C(A)|.
- by apply: dvdn_trans (cardSg cAB); rewrite (card_pnElem Eq2B) dvdn_mull.
- have [Q maxQ sBQ] := max_normed_exists qB nBA.
- have nnQ: q.-narrow Q.
- apply/implyP=> _; apply/set0Pn; exists B.
- rewrite 3!inE sBQ abelB dimB (subsetP (pmaxElemS q (subsetT Q))) //=.
- rewrite setIC 2!inE sBQ; case: (tau2_not_beta maxM t2Mq) => _ -> //.
- by rewrite (subsetP (pnElemS _ _ sEM)).
- have [P1 [sylP1 _] [_ _]] := max_normed_2Elem_signaliser q'p max2A maxQ qCA.
- move/(_ nnQ)=> cQP1; have sylP1_E: p.-Sylow(E) P1.
- apply: pHall_subl (subset_trans _ sCBE) (subsetT E) sylP1.
- exact: subset_trans (centS sBQ).
- rewrite (card_Hall sylS) -(card_Hall sylP1).
- by rewrite (card_Hall sylP_E) -(card_Hall sylP1_E).
-have coMsA: coprime #|Ms| #|A|.
- by apply: pnat_coprime (pcore_pgroup _ _) (pi_pnat pA _).
-have defMs: <<\bigcup_(X in 'E_p^1(A)) 'C_Ms(X)>> = Ms.
- have ncycA: ~~ cyclic A by rewrite (abelem_cyclic abelA) dimA.
- have [sAM _ _] := pnElemP Ep2A_M.
- have{sAM} nMsA: A \subset 'N(Ms) by rewrite (subset_trans sAM) ?gFnorm.
- apply/eqP; rewrite eqEsubset andbC gen_subG.
- rewrite -{1}[Ms](coprime_abelian_gen_cent1 cAA ncycA nMsA coMsA).
- rewrite genS; apply/bigcupsP=> x; rewrite ?subsetIl //; case/setD1P=> ntx Ax.
- rewrite /= -cent_cycle (bigcup_max <[x]>%G) // p1ElemE // .
- by rewrite 2!inE cycle_subG Ax /= -orderE (abelem_order_p abelA).
-have [A0 EpA0 nregA0]: exists2 A0, A0 \in 'E_p^1(A) & 'C_Ms(A0) != 1.
- apply/exists_inP; rewrite -negb_forall_in.
- apply: contra (Msigma_neq1 maxM); move/forall_inP => regAp.
- rewrite -/Ms -defMs -subG1 gen_subG; apply/bigcupsP=> X EpX.
- by rewrite subG1 regAp.
-have uniqCA0: 'M('C(A0)) = [set M].
- by rewrite nregA // (subsetP (pnElemS _ _ sAE)).
-have defSM: S :&: M = P.
- apply: sub_pHall (pgroupS (subsetIl S M) pS) _ (subsetIr S M) => //.
- by rewrite subsetI sPS (pHall_sub sylP_M).
-have{ltPS} not_sSM: ~~ (S \subset M).
- by rewrite (sameP setIidPl eqP) defSM proper_neq.
-have not_sA0Z: ~~ (A0 \subset 'Z(S)).
- apply: contra not_sSM; rewrite subsetI centsC; case/andP=> _ sS_CA0.
- by case/mem_uniq_mmax: uniqCA0 => _; apply: subset_trans sS_CA0.
-have [EpZ0 dxCSA transNSA] := basic_p2maxElem_structure max2A pS sAS not_cSS.
-do [set Z0 := 'Ohm_1('Z(S))%G; set EpA' := _ :\ Z0] in EpZ0 dxCSA transNSA.
-have sZ0Z: Z0 \subset 'Z(S) := Ohm_sub 1 _.
-have [sA0A _ _] := pnElemP EpA0; have sA0P := subset_trans sA0A sAP.
-have EpA'_A0: A0 \in EpA'.
- by rewrite 2!inE EpA0 andbT; apply: contraNneq not_sA0Z => ->.
-have{transNSA sAP not_sSM defSM} regA0' X:
- X \in 'E_p^1(E) :\ A0 -> 'C_Ms(X) = 1 /\ ~~ ('C(X) \subset M).
-- case/setD1P=> neqXA0 EpX.
- suffices not_sCXM: ~~ ('C(X) \subset M).
- split=> //; apply: contraNeq not_sCXM => nregX.
- by case/mem_uniq_mmax: (nregA X EpX nregX).
- have [sXZ | not_sXZ] := boolP (X \subset 'Z(S)).
- apply: contra (subset_trans _) not_sSM.
- by rewrite centsC (subset_trans sXZ) ?subsetIr.
- have EpA'_X: X \in EpA'.
- by rewrite 2!inE -defEp EpX andbT; apply: contraNneq not_sXZ => ->.
- have [g NSAg /= defX] := atransP2 transNSA EpA'_A0 EpA'_X.
- have{NSAg} [Sg nAg] := setIP NSAg.
- have neqMgM: M :^ g != M.
- rewrite (sameP eqP normP) (norm_mmax maxM); apply: contra neqXA0 => Mg.
- rewrite defX [_ == _](sameP eqP normP) (subsetP (cent_sub A0)) //.
- by rewrite (subsetP (centSS (subxx _) sA0P cPP)) // -defSM inE Sg.
- apply: contra neqMgM; rewrite defX centJ sub_conjg.
- by move/(eq_uniq_mmax uniqCA0) => defM; rewrite -{1}defM ?mmaxJ ?actKV.
-have{defMs} defA0: 'C_A(Ms) = A0.
- apply/eqP; rewrite eq_sym eqEcard subsetI sA0A (card_pnElem EpA0).
- have pCA: p.-group 'C_A(Ms) := pgroupS (subsetIl A _) pA.
- rewrite andbC (card_pgroup pCA) leq_exp2l ?prime_gt1 // -ltnS -dimA.
- rewrite properG_ltn_log //=; last first.
- rewrite properE subsetIl /= subsetI subxx centsC -(subxx Ms) -subsetI.
- by rewrite regA subG1 Msigma_neq1.
- rewrite centsC -defMs gen_subG (big_setD1 A0) //= subUset subsetIr /=.
- by apply/bigcupsP=> X; rewrite -defEp; case/regA0'=> -> _; rewrite sub1G.
-rewrite defA0 (group_inj defA0) (card_pnElem EpA0).
-have{dxCSA} [Y [cycY sZ0Y]] := dxCSA; move/(_ _ EpA'_A0)=> dxCSA.
-have defCP_Ms: 'C_P(Ms) = A0.
- move: dxCSA; rewrite defCSA => /dprodP[_ mulA0Y cA0Y tiA0Y].
- rewrite -mulA0Y -group_modl /=; last by rewrite -defA0 subsetIr.
- rewrite setIC TI_Ohm1 ?mulg1 // setIC.
- have pY: p.-group Y by rewrite (pgroupS _ pP) // -mulA0Y mulG_subr.
- have cYY: abelian Y := cyclic_abelian cycY.
- have ->: 'Ohm_1(Y) = Z0.
- apply/eqP; rewrite eq_sym eqEcard (card_pnElem EpZ0) /= -['Ohm_1(_)]Ohm_id.
- rewrite OhmS // (card_pgroup (pgroupS (Ohm_sub 1 Y) pY)).
- rewrite leq_exp2l ?prime_gt1 -?p_rank_abelian // -rank_pgroup //.
- by rewrite -abelian_rank1_cyclic.
- rewrite prime_TIg ?(card_pnElem EpZ0) // centsC (sameP setIidPl eqP) eq_sym.
- case: (regA0' Z0) => [|-> _]; last exact: Msigma_neq1.
- by rewrite 2!inE defEp EpZ0 andbT; apply: contraNneq not_sA0Z => <-.
-have [sPM pA0] := (pHall_sub sylP_M, pgroupS sA0A pA).
-have cMsA0: A0 \subset 'C(Ms) by rewrite -defA0 subsetIr.
-have nsA0M: A0 <| M.
- have [_ defM nMsE _] := sdprodP (sdprod_sigma maxM hallE).
- rewrite /normal (subset_trans sA0P) // -defM mulG_subG cents_norm 1?centsC //.
- by rewrite -defA0 normsI ?norms_cent // normal_norm.
-have defFM: Ms \x A0 = 'F(M).
- have nilF := Fitting_nil M.
- rewrite dprodE ?(coprime_TIg (coprimegS sA0A coMsA)) //.
- have [_ /= defFM cFpp' _] := dprodP (nilpotent_pcoreC p nilF).
- have defFp': 'O_p^'('F(M)) = Ms.
- apply/eqP; rewrite eqEsubset.
- rewrite (sub_Hall_pcore (Msigma_Hall maxM)); last by rewrite !gFsub_trans.
- rewrite /pgroup (sub_in_pnat _ (pcore_pgroup _ _)) => [|q piFq]; last first.
- have [Q sylQ] := Sylow_exists q 'F(M); have [sQF qQ _] := and3P sylQ.
- have ntQ: Q :!=: 1.
- rewrite -rank_gt0 (rank_pgroup qQ) (p_rank_Sylow sylQ) p_rank_gt0.
- by rewrite (piSg _ piFq) ?pcore_sub.
- have sNQM: 'N(Q) \subset M.
- rewrite (mmax_normal maxM) // (nilpotent_Hall_pcore nilF sylQ).
- by rewrite p_core_Fitting pcore_normal.
- apply/implyP; rewrite implyNb /= -def_t2 orbC.
- by rewrite (prime_class_mmax_norm maxM qQ).
- rewrite pcore_max ?(pi_p'group (pcore_pgroup _ _)) //.
- rewrite [_ <| _]andbC gFsub_trans ?gFnorm //.
- rewrite Fitting_max ?gFnormal ?(tau2_Msigma_nil _ t2Mp) //.
- rewrite p_core_Fitting defFp' centsC in defFM cFpp'.
- rewrite -defFM (centC cFpp'); congr (Ms * _).
- apply/eqP; rewrite eqEsubset pcore_max //.
- by rewrite -defCP_Ms subsetI cFpp' pcore_sub_Hall.
-split=> {defFM}//.
-have [[sE1E t1E1 _] t2E2] := (and3P hallE1, pHall_pgroup hallE2).
-have defE2: E2 :=: P by rewrite (sub_pHall sylP) // -(eq_pgroup _ def_t2) t2E2.
-have [[_ nsE3E] _ _ [defEr _] _] := sigma_compl_context maxM complEi.
-have [sE3E nE3E] := andP nsE3E; have{nE3E} nE3E := subset_trans _ nE3E.
-have [[_ E21 _ defE21]] := sdprodP defEr; rewrite defE21 => defE nE321 tiE321.
-rewrite defE2 in defE21; have{defE21} [_ defPE1 nPE1 tiPE1] := sdprodP defE21.
-have [P0 defP nP0E1]: exists2 P0 : {group gT}, A0 \x P0 = P & E1 \subset 'N(P0).
- have p'E1b: p^'.-group (E1 / 'Phi(P)).
- rewrite quotient_pgroup //; apply: sub_pgroup t1E1 => q /tau2'1.
- by rewrite inE /= def_t2.
- have defPhiP: 'Phi(P) = 'Phi(Y).
- have [_ _ cA0Y tiA0Y] := dprodP dxCSA.
- rewrite defCSA dprodEcp // in dxCSA.
- have [_ abelA0 _] := pnElemP EpA0; rewrite -trivg_Phi // in abelA0.
- by rewrite -(Phi_cprod pP dxCSA) (eqP abelA0) cprod1g.
- have abelPb := Phi_quotient_abelem pP; have sA0Pb := quotientS 'Phi(P) sA0P.
- have [||P0b] := Maschke_abelem abelPb p'E1b sA0Pb; rewrite ?quotient_norms //.
- by rewrite (subset_trans (subset_trans sE1E sEM)) ?normal_norm.
- case/dprodP=> _ defPb _ tiAP0b nP0E1b.
- have sP0Pb: P0b \subset P / 'Phi(P) by rewrite -defPb mulG_subr.
- have [P0 defP0b sPhiP0 sP0P] := inv_quotientS (Phi_normal P) sP0Pb.
- exists P0; last first.
- rewrite -(quotientSGK (char_norm_trans (Phi_char P) nPE1)); last first.
- by rewrite cents_norm ?(sub_abelian_cent2 cPP (Phi_sub P) sP0P).
- by rewrite quotient_normG -?defP0b ?(normalS _ _ (Phi_normal P)).
- rewrite dprodEY ?(sub_abelian_cent2 cPP) //.
- apply/eqP; rewrite eqEsubset join_subG sA0P sP0P /=.
- rewrite -(quotientSGK (normal_norm (Phi_normal P))) //=; last first.
- by rewrite sub_gen // subsetU // sPhiP0 orbT.
- rewrite cent_joinEr ?(sub_abelian_cent2 cPP) //.
- rewrite quotientMr //; last by rewrite (subset_trans sP0P) ?gFnorm.
- by rewrite -defP0b defPb.
- apply/trivgP; case/dprodP: dxCSA => _ _ _ <-.
- rewrite subsetI subsetIl (subset_trans _ (Phi_sub Y)) // -defPhiP.
- rewrite -quotient_sub1 ?subIset ?(subset_trans sA0P) ?gFnorm //.
- by rewrite quotientIG // -defP0b tiAP0b.
-have nA0E := subset_trans _ (subset_trans sEM (normal_norm nsA0M)).
-have{defP} [_ defAP0 _ tiAP0] := dprodP defP.
-have sP0P: P0 \subset P by rewrite -defAP0 mulG_subr.
-have sP0E := subset_trans sP0P (pHall_sub sylP_E).
-pose E0 := (E3 <*> (P0 <*> E1))%G.
-have sP0E1_E: P0 <*> E1 \subset E by rewrite join_subG sP0E.
-have sE0E: E0 \subset E by rewrite join_subG sE3E.
-have mulA0E0: A0 * E0 = E.
- rewrite /= (norm_joinEr (nE3E _ sP0E1_E)) mulgA -(normC (nA0E _ sE3E)).
- by rewrite /= -mulgA (norm_joinEr nP0E1) (mulgA A0) defAP0 defPE1.
-have tiA0E0: A0 :&: E0 = 1.
- rewrite cardMg_TI // mulA0E0 -defE /= (norm_joinEr (nE3E _ sP0E1_E)).
- rewrite !TI_cardMg //; last first.
- by apply/trivgP; rewrite -tiE321 setIS //= ?norm_joinEr // -defPE1 mulSg.
- rewrite mulnCA /= leq_mul // norm_joinEr //= -defPE1.
- rewrite !TI_cardMg //; last by apply/trivgP; rewrite -tiPE1 setSI.
- by rewrite mulnA -(TI_cardMg tiAP0) defAP0.
-have defAE0: A0 ><| E0 = E by rewrite sdprodE ?nA0E.
-exists E0 => // x /setD1P[ntx Ms_x] q piCE0x_q.
-have: q \in \pi(E) by apply: piSg piCE0x_q; rewrite subIset ?sE0E.
-rewrite mem_primes in piCE0x_q; case/and3P: piCE0x_q => q_pr _.
-case/Cauchy=> // z /setIP[E0z cxz] oz.
-have ntz: z != 1 by rewrite -order_gt1 oz prime_gt1.
-have ntCMs_z: 'C_Ms[z] != 1.
- apply: contraNneq ntx => reg_z; rewrite (sameP eqP set1gP) -reg_z inE Ms_x.
- by rewrite cent1C.
-rewrite (partition_pi_sigma_compl maxM hallE) def_t2.
-case/or3P => [-> // | pq | t3Mq].
- have EpA0'_z: <[z]>%G \in 'E_p^1(E) :\ A0.
- rewrite p1ElemE // !inE -orderE oz (eqnP pq) eqxx cycle_subG.
- rewrite (subsetP sE0E) // !andbT; apply: contraNneq ntz => eqA0z.
- by rewrite (sameP eqP set1gP) -tiA0E0 inE -eqA0z cycle_id E0z.
- have [reg_z _] := regA0' _ EpA0'_z.
- by rewrite -cent_cycle reg_z eqxx in ntCMs_z.
-rewrite regE3 ?eqxx // !inE ntz /= in ntCMs_z.
-by rewrite (mem_normal_Hall hallE3 nsE3E) ?(subsetP sE0E) // /p_elt oz pnatE.
-Qed.
-
-(* This is B & G, Theorem 12.8(c). This part does not use the decompotision *)
-(* of the complement, and needs to be proved ahead because it is used with *)
-(* different primes in \tau_2(M) in the main argument. We also include an *)
-(* auxiliary identity, which is needed in another part of the proof of 12.8. *)
-Theorem abelian_tau2_sub_Fitting M E p A S :
- M \in 'M -> \sigma(M)^'.-Hall(M) E ->
- p \in \tau2(M) -> A \in 'E_p^2(E) ->
- p.-Sylow(G) S -> A \subset S -> abelian S ->
- [/\ S \subset 'N(S)^`(1),
- 'N(S)^`(1) \subset 'F(E),
- 'F(E) \subset 'C(S),
- 'C(S) \subset E
- & 'F('N(A)) = 'F(E)].
-Proof.
-move=> maxM hallE t2Mp Ep2A sylS sAS cSS.
-have [sAE abelA dimA]:= pnElemP Ep2A; have [pA cAA _] := and3P abelA.
-have [sEM sM'E _] := and3P hallE.
-have Ep2A_M := subsetP (pnElemS p 2 sEM) A Ep2A.
-have eqFC H: A <| H -> 'C(A) \subset H -> 'F(H) = 'F('C(A)).
- move=> nsAH sCH; have [_ nAH] := andP nsAH.
- apply/eqP; rewrite eqEsubset !Fitting_max ?Fitting_nil //.
- by rewrite gFnormal_trans // /normal sCH norms_cent.
- apply: normalS sCH (Fitting_normal H).
- have [_ defF cFpFp' _] := dprodP (nilpotent_pcoreC p (Fitting_nil H)).
- have sAFp: A \subset 'O_p('F(H)) by rewrite p_core_Fitting pcore_max.
- have [x _ sFpSx] := Sylow_subJ sylS (subsetT _) (pcore_pgroup p 'F(H)).
- have cFpFp: abelian 'O_p('F(H)) by rewrite (abelianS sFpSx) ?abelianJ.
- by rewrite -defF mulG_subG (centSS _ _ cFpFp) // (centSS _ _ cFpFp').
-have [[nsAE _] [sCAE _] _ _ _] := tau2_compl_context maxM hallE t2Mp Ep2A.
-have eqFN_FE: 'F('N(A)) = 'F(E) by rewrite (eqFC E) // eqFC ?cent_sub ?normalG.
-have sN'FN: 'N(A)^`(1) \subset 'F('N(A)).
- rewrite rank2_der1_sub_Fitting ?mFT_odd //.
- rewrite ?mFT_sol // mFT_norm_proper ?(mFT_pgroup_proper pA) //.
- by rewrite -rank_gt0 (rank_abelem abelA) dimA.
- rewrite eqFN_FE (leq_trans (rankS (Fitting_sub E))) //.
- have [q q_pr ->]:= rank_witness E; apply: wlog_neg; rewrite -ltnNge => rEgt2.
- rewrite (leq_trans (p_rankS q sEM)) // leqNgt.
- apply: contra ((alpha_sub_sigma maxM) q) (pnatPpi sM'E _).
- by rewrite -p_rank_gt0 (leq_trans _ rEgt2).
-have sSE: S \subset E by rewrite (subset_trans _ sCAE) // (centSS _ _ cSS).
-have nA_NS: 'N(S) \subset 'N(A).
- have [ ] := tau2_context maxM t2Mp Ep2A_M; have sSM := subset_trans sSE sEM.
- have sylS_M: p.-Sylow(M) S := pHall_subl sSM (subsetT M) sylS.
- by case/(_ S) => // _ [// |<- _] _ _ _ _; apply: char_norms (Ohm_char 1 _).
-have sS_NS': S \subset 'N(S)^`(1) := mFT_Sylow_der1 sylS.
-have sNS'_FE: 'N(S)^`(1) \subset 'F(E).
- by rewrite -eqFN_FE (subset_trans (dergS 1 nA_NS)).
-split=> //; last by rewrite (subset_trans (centS sAS)).
-have sSFE := subset_trans sS_NS' sNS'_FE; have nilFE := Fitting_nil E.
-have sylS_FE := pHall_subl sSFE (subsetT 'F(E)) sylS.
-suff sSZF: S \subset 'Z('F(E)) by rewrite centsC (subset_trans sSZF) ?subsetIr.
-have [_ <- _ _] := dprodP (center_dprod (nilpotent_pcoreC p nilFE)).
-by rewrite -(nilpotent_Hall_pcore nilFE sylS_FE) (center_idP cSS) mulG_subl.
-Qed.
-
-(* This is B & G, Theorem 12.8(a,b,d,e) -- the bulk of the Theorem. We prove *)
-(* part (f) separately below, as it does not depend on a decomposition of the *)
-(* complement. *)
-Theorem abelian_tau2 M E E1 E2 E3 p A S (Ms := M`_\sigma) :
- M \in 'M -> sigma_complement M E E1 E2 E3 ->
- p \in \tau2(M) -> A \in 'E_p^2(E) ->
- p.-Sylow(G) S -> A \subset S -> abelian S ->
- [/\ (*a*) E2 <| E /\ abelian E2,
- (*b*) \tau2(M).-Hall(G) E2,
- (*d*) [/\ 'N(A) = 'N(S),
- 'N(S) = 'N(E2),
- 'N(E2) = 'N(E3 <*> E2)
- & 'N(E3 <*> E2) = 'N('F(E))]
- & (*e*) forall X, X \in 'E^1(E1) -> 'C_Ms(X) = 1 -> X \subset 'Z(E)].
-Proof.
-move=> maxM complEi t2Mp Ep2A sylS sAS cSS.
-have [hallE hallE1 hallE2 hallE3 _] := complEi.
-have [sEM sM'E _] := and3P hallE.
-have [sE1E t1E1 _] := and3P hallE1.
-have [sE2E t2E2 _] := and3P hallE2.
-have [sE3E t3E3 _] := and3P hallE3.
-have nilF: nilpotent 'F(E) := Fitting_nil E.
-have sylE2_sylG_ZFE q Q:
- q.-Sylow(E2) Q -> Q :!=: 1 -> q.-Sylow(G) Q /\ Q \subset 'Z('F(E)).
-- move=> sylQ ntQ; have [sQE2 qQ _] := and3P sylQ.
- have piQq: q \in \pi(Q) by rewrite -p_rank_gt0 -rank_pgroup // rank_gt0.
- have t2Mq: q \in \tau2(M) by rewrite (pnatPpi t2E2) // (piSg sQE2).
- have sylQ_E: q.-Sylow(E) Q := subHall_Sylow hallE2 t2Mq sylQ.
- have rqQ: 'r_q(Q) = 2.
- rewrite (tau2E hallE) !inE -(p_rank_Sylow sylQ_E) in t2Mq.
- by case/andP: t2Mq => _ /eqP.
- have [B Eq2B sBQ]: exists2 B, B \in 'E_q^2(E) & B \subset Q.
- have [B Eq2B] := p_rank_witness q Q; have [sBQ abelB rBQ] := pnElemP Eq2B.
- exists B; rewrite // !inE rBQ rqQ abelB !andbT.
- exact: subset_trans sBQ (pHall_sub sylQ_E).
- have [T /= sylT sQT] := Sylow_superset (subsetT Q) qQ.
- have qT: q.-group T := pHall_pgroup sylT.
- have cTT: abelian T.
- apply: wlog_neg => not_cTT.
- have [def_t2 _ _ _] := nonabelian_tau2 maxM hallE t2Mq Eq2B qT not_cTT.
- rewrite def_t2 !inE in t2Mp; rewrite (eqP t2Mp) in sylS.
- by have [x _ ->] := Sylow_trans sylS sylT; rewrite abelianJ.
- have sTF: T \subset 'F(E).
- have subF := abelian_tau2_sub_Fitting maxM hallE t2Mq Eq2B sylT.
- have [sTN' sN'F _ _ _] := subF (subset_trans sBQ sQT) cTT.
- exact: subset_trans sTN' sN'F.
- have sTE: T \subset E := subset_trans sTF (Fitting_sub E).
- have <-: T :=: Q by apply: (sub_pHall sylQ_E).
- have sylT_F: q.-Sylow('F(E)) T := pHall_subl sTF (subsetT _) sylT.
- have [_ <- _ _] := dprodP (center_dprod (nilpotent_pcoreC q nilF)).
- by rewrite -(nilpotent_Hall_pcore nilF sylT_F) (center_idP cTT) mulG_subl.
-have hallE2_G: \tau2(M).-Hall(G) E2.
- rewrite pHallE subsetT /= -(part_pnat_id t2E2); apply/eqnP.
- rewrite !(widen_partn _ (subset_leq_card (subsetT _))).
- apply: eq_bigr => q t2q; rewrite -!p_part.
- have [Q sylQ] := Sylow_exists q E2; have qQ := pHall_pgroup sylQ.
- have sylQ_E: q.-Sylow(E) Q := subHall_Sylow hallE2 t2q sylQ.
- have ntQ: Q :!=: 1.
- rewrite -rank_gt0 (rank_pgroup qQ) (p_rank_Sylow sylQ_E) p_rank_gt0.
- by rewrite (tau2E hallE) in t2q; case/andP: t2q.
- have [sylQ_G _] := sylE2_sylG_ZFE q Q sylQ ntQ.
- by rewrite -(card_Hall sylQ) -(card_Hall sylQ_G).
-have sE2_ZFE: E2 \subset 'Z('F(E)).
- rewrite -Sylow_gen gen_subG; apply/bigcupsP=> Q; case/SylowP=> q q_pr sylQ.
- have [-> | ntQ] := eqsVneq Q 1; first exact: sub1G.
- by have [_ ->] := sylE2_sylG_ZFE q Q sylQ ntQ.
-have cE2E2: abelian E2 := abelianS sE2_ZFE (center_abelian _).
-have sE2FE: E2 \subset 'F(E) := subset_trans sE2_ZFE (center_sub _).
-have nsE2E: E2 <| E.
- have hallE2_F := pHall_subl sE2FE (Fitting_sub E) hallE2.
- by rewrite (nilpotent_Hall_pcore nilF hallE2_F) !gFnormal_trans.
-have [_ _ [cycE1 cycE3] [_ defEl] _] := sigma_compl_context maxM complEi.
-have [[K _ defK _] _ _ _] := sdprodP defEl; rewrite defK in defEl.
-have [nsKE _ mulKE1 nKE1 _] := sdprod_context defEl; have [sKE _] := andP nsKE.
-have [nsE3K sE2K _ nE32 tiE32] := sdprod_context defK.
-rewrite -sdprodEY // defK.
-have{defK} defK: E3 \x E2 = K.
- rewrite dprodEsd // (sameP commG1P trivgP) -tiE32 subsetI commg_subr nE32.
- by rewrite commg_subl (subset_trans sE3E) ?normal_norm.
-have cKK: abelian K.
- by have [_ <- cE23 _] := dprodP defK; rewrite abelianM cE2E2 cyclic_abelian.
-have [_ sNS'F _ sCS_E defFN] :=
- abelian_tau2_sub_Fitting maxM hallE t2Mp Ep2A sylS sAS cSS.
-have{sCS_E} sSE2: S \subset E2.
- rewrite (sub_normal_Hall hallE2 nsE2E (subset_trans cSS sCS_E)).
- by rewrite (pi_pgroup (pHall_pgroup sylS)).
-have charS: S \char E2.
- have sylS_E2: p.-Sylow(E2) S := pHall_subl sSE2 (subsetT E2) sylS.
- by rewrite (nilpotent_Hall_pcore (abelian_nil cE2E2) sylS_E2) pcore_char.
-have nsSE: S <| E := char_normal_trans charS nsE2E; have [sSE nSE] := andP nsSE.
-have charA: A \char S.
- have Ep2A_M := subsetP (pnElemS p 2 sEM) A Ep2A.
- have sylS_M := pHall_subl (subset_trans sSE sEM) (subsetT M) sylS.
- have [] := tau2_context maxM t2Mp Ep2A_M; case/(_ S sylS_M)=> _ [//|<- _].
- by rewrite Ohm_char.
-have charE2: E2 \char K.
- have hallE2_K := pHall_subl sE2K sKE hallE2.
- by rewrite (nilpotent_Hall_pcore (abelian_nil cKK) hallE2_K) pcore_char.
-have coKE1: coprime #|K| #|E1|.
- rewrite -(dprod_card defK) coprime_mull (sub_pnat_coprime tau3'1 t3E3 t1E1).
- by rewrite (sub_pnat_coprime tau2'1 t2E2 t1E1).
-have hallK: Hall 'F(E) K.
- have hallK: Hall E K.
- by rewrite /Hall -divgS sKE //= -(sdprod_card defEl) mulKn.
- have sKFE: K \subset 'F(E) by rewrite Fitting_max ?abelian_nil.
- exact: pHall_Hall (pHall_subl sKFE (Fitting_sub E) (Hall_pi hallK)).
-have charK: K \char 'F(E).
- by rewrite (nilpotent_Hall_pcore nilF (Hall_pi hallK)) pcore_char.
-have{defFN} [eqNAS eqNSE2 eqNE2K eqNKF]:
- [/\ 'N(A) = 'N(S), 'N(S) = 'N(E2), 'N(E2) = 'N(K) & 'N(K) = 'N('F(E))].
- have: #|'N(A)| <= #|'N('F(E))|.
- by rewrite subset_leq_card // -defFN gFnorm.
- have leCN := subset_leqif_cards (@char_norms gT _ _ _).
- have trCN := leqif_trans (leCN _ _ _).
- have leq_KtoA := trCN _ _ _ _ charE2 (trCN _ _ _ _ charS (leCN _ _ charA)).
- rewrite (geq_leqif (trCN _ _ _ _ charK leq_KtoA)).
- by case/and4P; do 4!move/eqP->.
-split=> // X E1_1_X regX.
-have cK_NK': 'N(K)^`(1) \subset 'C(K).
- suffices sKZ: K \subset 'Z('F(E)).
- by rewrite -eqNE2K -eqNSE2 (centSS sNS'F sKZ) // centsC subsetIr.
- have{hallK} [pi hallK] := HallP hallK.
- have [_ <- _ _] := dprodP (center_dprod (nilpotent_pcoreC pi nilF)).
- by rewrite -(nilpotent_Hall_pcore nilF hallK) (center_idP cKK) mulG_subl.
-have [q EqX] := nElemP E1_1_X; have [sXE1 abelX dimX] := pnElemP EqX.
-have sXE := subset_trans sXE1 sE1E.
-have nKX := subset_trans sXE (normal_norm nsKE).
-have nCSX_NS: 'N(K) \subset 'N('C(K) * X).
- rewrite -(quotientGK (cent_normal _)) -quotientK ?norms_cent //.
- by rewrite morphpre_norms // sub_abelian_norm ?quotientS ?sub_der1_abelian.
-have nKX_NS: 'N(S) \subset 'N([~: K, X]).
- have CK_K_1: [~: 'C(K), K] = 1 by apply/commG1P.
- rewrite eqNSE2 eqNE2K commGC -[[~: X, K]]mul1g -CK_K_1.
- by rewrite -commMG ?CK_K_1 ?norms1 ?normsR.
-have not_sNKX_M: ~~ ('N([~: K, X]) \subset M).
- have [[sM'p _] sSM] := (andP t2Mp, subset_trans sSE sEM).
- apply: contra sM'p => sNKX_M; apply/existsP; exists S.
- by rewrite (pHall_subl sSM (subsetT _) sylS) // (subset_trans _ sNKX_M).
-have cKX: K \subset 'C(X).
- apply: contraR not_sNKX_M; rewrite (sameP commG1P eqP) => ntKX.
- rewrite (mmax_normal maxM) //.
- have [sKM sM'K] := (subset_trans sKE sEM, pgroupS sKE sM'E).
- have piE1q: q \in \pi(E1).
- by rewrite -p_rank_gt0 -dimX logn_le_p_rank // inE sXE1.
- have sM'q: q \in \sigma(M)^' by rewrite (pnatPpi sM'E) // (piSg sE1E).
- have EpX_NK: X \in 'E_q^1('N_M(K)).
- by apply: subsetP EqX; rewrite pnElemS // subsetI (subset_trans sE1E).
- have q'K: q^'.-group K.
- by rewrite p'groupEpi ?coprime_pi' // in coKE1 *; apply: (pnatPpi coKE1).
- by have []:= commG_sigma'_1Elem_cyclic maxM sKM sM'K sM'q EpX_NK regX.
-rewrite subsetI sXE /= -mulKE1 centM subsetI centsC cKX.
-exact: subset_trans sXE1 (cyclic_abelian cycE1).
-Qed.
-
-(* This is B & G, Theorem 12.8(f). *)
-Theorem abelian_tau2_norm_Sylow M E p A S :
- M \in 'M -> \sigma(M)^'.-Hall(M) E -> p \in \tau2(M) -> A \in 'E_p^2(E) ->
- p.-Sylow(G) S -> A \subset S -> abelian S ->
- forall X, X \subset 'N(S) -> 'C_S(X) <| 'N(S) /\ [~: S, X] <| 'N(S).
-Proof.
-move=> maxM hallE t2Mp Ep2A sylS sAS cSS X nSX.
-have [_ sNS'F sFCS _ _] :=
- abelian_tau2_sub_Fitting maxM hallE t2Mp Ep2A sylS sAS cSS.
-have{sNS'F sFCS} sNS'CS: 'N(S)^`(1) \subset 'C(S) := subset_trans sNS'F sFCS.
-have nCSX_NS: 'N(S) \subset 'N('C(S) * X).
- rewrite -quotientK ?norms_cent // -{1}(quotientGK (cent_normal S)).
- by rewrite morphpre_norms // sub_abelian_norm ?quotientS ?sub_der1_abelian.
-rewrite /normal subIset ?comm_subG ?normG //=; split.
- have ->: 'C_S(X) = 'C_S('C(S) * X).
- by rewrite centM setIA; congr (_ :&: _); rewrite (setIidPl _) // centsC.
- by rewrite normsI ?norms_cent.
-have CS_S_1: [~: 'C(S), S] = 1 by apply/commG1P.
-by rewrite commGC -[[~: X, S]]mul1g -CS_S_1 -commMG ?CS_S_1 ?norms1 ?normsR.
-Qed.
-
-(* This is B & G, Corollary 12.9. *)
-Corollary tau1_act_tau2 M E p A q Q (Ms := M`_\sigma) :
- M \in 'M -> \sigma(M)^'.-Hall(M) E -> p \in \tau2(M) -> A \in 'E_p^2(E) ->
- q \in \tau1(M) -> Q \in 'E_q^1(E) -> 'C_Ms(Q) = 1 -> [~: A, Q] != 1 ->
- let A0 := [~: A, Q]%G in let A1 := ('C_A(Q))%G in
- [/\ (*a*) [/\ A0 \in 'E_p^1(A), 'C_A(Ms) = A0 & A0 <| M],
- (*b*) gval A0 \notin A1 :^: G
- & (*c*) A1 \in 'E_p^1(A) /\ ~~ ('C(A1) \subset M)].
-Proof.
-move=> maxM hallE t2Mp Ep2A t1Mq EqQ regQ ntA0 A0 A1.
-have [sEM sM'E _] := and3P hallE.
-have [sAE abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
-have [sQE abelQ dimQ] := pnElemP EqQ; have [qQ _ _] := and3P abelQ.
-have [p_pr q_pr] := (pnElem_prime Ep2A, pnElem_prime EqQ).
-have p_gt1 := prime_gt1 p_pr.
-have Ep2A_M := subsetP (pnElemS p 2 sEM) A Ep2A.
-have [_ _ regA _ _] := tau2_context maxM t2Mp Ep2A_M.
-have [[nsAE _] _ _ _] := tau2_compl_context maxM hallE t2Mp Ep2A.
-have [_ nAE] := andP nsAE; have nAQ := subset_trans sQE nAE.
-have coAQ: coprime #|A| #|Q|.
- exact: sub_pnat_coprime tau2'1 (pi_pnat pA t2Mp) (pi_pnat qQ t1Mq).
-have defA: A0 \x A1 = A := coprime_abelian_cent_dprod nAQ coAQ cAA.
-have [_ _ _ tiA01] := dprodP defA.
-have [sAM sM'A] := (subset_trans sAE sEM, pgroupS sAE sM'E).
-have sM'q: q \in \sigma(M)^' by case/andP: t1Mq.
-have EqQ_NA: Q \in 'E_q^1('N_M(A)).
- by apply: subsetP EqQ; rewrite pnElemS // subsetI sEM.
-have q'A: q^'.-group A.
- rewrite p'groupEpi ?coprime_pi' // in coAQ *.
- by apply: (pnatPpi coAQ); rewrite -p_rank_gt0 (p_rank_abelem abelQ) dimQ.
-have [] := commG_sigma'_1Elem_cyclic maxM sAM sM'A sM'q EqQ_NA regQ q'A cAA.
-rewrite -[[~: A, Q]]/(gval A0) -/Ms => cMsA0 cycA0 nsA0M.
-have sA0A: A0 \subset A by rewrite commg_subl.
-have EpA0: A0 \in 'E_p^1(A).
- have abelA0 := abelemS sA0A abelA; have [pA0 _] := andP abelA0.
- rewrite p1ElemE // !inE sA0A -(Ohm1_id abelA0) /=.
- by rewrite (Ohm1_cyclic_pgroup_prime cycA0 pA0).
-have defA0: 'C_A(Ms) = A0.
- apply/eqP; rewrite eq_sym eqEcard subsetI sA0A cMsA0 (card_pnElem EpA0).
- have pCAMs: p.-group 'C_A(Ms) := pgroupS (subsetIl A _) pA.
- rewrite (card_pgroup pCAMs) leq_exp2l //= leqNgt.
- apply: contra (Msigma_neq1 maxM) => dimCAMs.
- rewrite eq_sym -regA (sameP eqP setIidPl) centsC (sameP setIidPl eqP).
- by rewrite eqEcard subsetIl (card_pnElem Ep2A) (card_pgroup pCAMs) leq_exp2l.
-have EpA1: A1 \in 'E_p^1(A).
- rewrite p1ElemE // !inE subsetIl -(eqn_pmul2l (ltnW p_gt1)).
- by rewrite -{1}[p](card_pnElem EpA0) (dprod_card defA) (card_pnElem Ep2A) /=.
-have defNA0: 'N(A0) = M by apply: mmax_normal.
-have not_cA0Q: ~~ (Q \subset 'C(A0)).
- apply: contra ntA0 => cA0Q.
- by rewrite -subG1 -tiA01 !subsetI subxx sA0A centsC cA0Q.
-have rqM: 'r_q(M) = 1%N by apply/eqP; case/and3P: t1Mq.
-have q'CA0: q^'.-group 'C(A0).
- have [S sylS sQS] := Sylow_superset (subset_trans sQE sEM) qQ.
- have qS := pHall_pgroup sylS; rewrite -(p_rank_Sylow sylS) in rqM.
- have cycS: cyclic S by rewrite (odd_pgroup_rank1_cyclic qS) ?mFT_odd ?rqM.
- have ntS: S :!=: 1 by rewrite -rank_gt0 (rank_pgroup qS) rqM.
- have defS1: 'Ohm_1(S) = Q.
- apply/eqP; rewrite eq_sym eqEcard -{1}(Ohm1_id abelQ) OhmS //=.
- by rewrite (card_pnElem EqQ) (Ohm1_cyclic_pgroup_prime cycS qS).
- have sylSC: q.-Sylow('C(A0)) 'C_S(A0).
- by rewrite (Hall_setI_normal _ sylS) // -defNA0 cent_normal.
- rewrite -partG_eq1 ?cardG_gt0 // -(card_Hall sylSC) -trivg_card1 /=.
- by rewrite setIC TI_Ohm1 // defS1 setIC prime_TIg ?(card_pnElem EqQ).
-do 2?split=> //.
- have: ~~ q^'.-group Q by rewrite /pgroup (card_pnElem EqQ) pnatE ?inE ?negbK.
- apply: contra; case/imsetP=> x _ defA01.
- rewrite defA01 centJ pgroupJ in q'CA0.
- by apply: pgroupS q'CA0; rewrite centsC subsetIr.
-have [S sylS sAS] := Sylow_superset (subsetT A) pA.
-have [cSS | not_cSS] := boolP (abelian S).
- have solE := sigma_compl_sol hallE.
- have [E1 hallE1 sQE1] := Hall_superset solE sQE (pi_pnat qQ t1Mq).
- have [E3 hallE3] := Hall_exists \tau3(M) solE.
- have [E2 _ complEi] := ex_tau2_compl hallE hallE1 hallE3.
- have [_ _ _ reg1Z] := abelian_tau2 maxM complEi t2Mp Ep2A sylS sAS cSS.
- have E1Q: Q \in 'E^1(E1).
- by apply/nElemP; exists q; rewrite // !inE sQE1 abelQ dimQ.
- rewrite (subset_trans (reg1Z Q E1Q regQ)) ?subIset // in not_cA0Q.
- by rewrite centS ?orbT // (subset_trans sA0A).
-have pS := pHall_pgroup sylS.
-have [_ _ not_cent_reg _] := nonabelian_tau2 maxM hallE t2Mp Ep2A pS not_cSS.
-case: (not_cent_reg A1); rewrite // 2!inE (subsetP (pnElemS p 1 sAE)) // andbT.
-by rewrite -val_eqE /= defA0 eq_sym; apply/(TIp1ElemP EpA0 EpA1).
-Qed.
-
-(* This is B & G, Corollary 12.10(a). *)
-Corollary sigma'_nil_abelian M N :
- M \in 'M -> N \subset M -> \sigma(M)^'.-group N -> nilpotent N -> abelian N.
-Proof.
-move=> maxM sNM sM'N /nilpotent_Fitting defN.
-apply/center_idP; rewrite -{2}defN -{defN}(center_bigdprod defN).
-apply: eq_bigr => p _; apply/center_idP; set P := 'O_p(N).
-have [-> | ntP] := eqVneq P 1; first exact: abelian1.
-have [pP sPN]: p.-group P /\ P \subset N by rewrite pcore_sub pcore_pgroup.
-have{sPN sNM sM'N} [sPM sM'P] := (subset_trans sPN sNM, pgroupS sPN sM'N).
-have{sPM sM'P} [E hallE sPE] := Hall_superset (mmax_sol maxM) sPM sM'P.
-suffices [S sylS cSS]: exists2 S : {group gT}, p.-Sylow(E) S & abelian S.
- by have [x _ sPS] := Sylow_subJ sylS sPE pP; rewrite (abelianS sPS) ?abelianJ.
-have{N P sPE pP ntP} piEp: p \in \pi(E).
- by rewrite (piSg sPE) // -p_rank_gt0 -rank_pgroup // rank_gt0.
-rewrite (partition_pi_sigma_compl maxM hallE) orbCA orbC -orbA in piEp.
-have [[E1 hallE1] [E3 hallE3]] := ex_tau13_compl hallE.
-have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
-have{complEi} [_ _ [cycE1 cycE3] _ _] := sigma_compl_context maxM complEi.
-have{piEp} [t1p | t3p | t2p] := or3P piEp.
-- have [S sylS] := Sylow_exists p E1.
- exists S; first exact: subHall_Sylow hallE1 t1p sylS.
- exact: abelianS (pHall_sub sylS) (cyclic_abelian cycE1).
-- have [S sylS] := Sylow_exists p E3.
- exists S; first exact: subHall_Sylow hallE3 t3p sylS.
- exact: abelianS (pHall_sub sylS) (cyclic_abelian cycE3).
-have [s'p rpM] := andP t2p; have [S sylS] := Sylow_exists p E; exists S => //.
-have sylS_M := subHall_Sylow hallE s'p sylS.
-have [A _ Ep2A] := ex_tau2Elem hallE t2p.
-by have [/(_ S sylS_M)[]] := tau2_context maxM t2p Ep2A.
-Qed.
-
-(* This is B & G, Corollary 12.10(b), first assertion. *)
-Corollary der_mmax_compl_abelian M E :
- M \in 'M -> \sigma(M)^'.-Hall(M) E -> abelian E^`(1).
-Proof.
-move=> maxM hallE; have [sEM s'E _] := and3P hallE.
-have sE'E := der_sub 1 E; have sE'M := subset_trans sE'E sEM.
-exact: sigma'_nil_abelian (pgroupS _ s'E) (der1_sigma_compl_nil maxM hallE).
-Qed.
-
-(* This is B & G, Corollary 12.10(b), second assertion. *)
-(* Note that we do not require the full decomposition of the complement. *)
-Corollary tau2_compl_abelian M E E2 :
- M \in 'M -> \sigma(M)^'.-Hall(M) E -> \tau2(M).-Hall(E) E2 -> abelian E2.
-Proof.
-move: E2 => F2 maxM hallE hallF2; have [sEM s'E _] := and3P hallE.
-have [[E1 hallE1] [E3 hallE3]] := ex_tau13_compl hallE.
-have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
-have solE: solvable E := sigma_compl_sol hallE.
-have{solE hallF2} [x _ ->{F2}] := Hall_trans solE hallF2 hallE2.
-have [-> | ntE] := eqsVneq E2 1; rewrite {x}abelianJ ?abelian1 //.
-have [[p p_pr rpE2] [sE2E t2E2 _]] := (rank_witness E2, and3P hallE2).
-have piE2p: p \in \pi(E2) by rewrite -p_rank_gt0 -rpE2 rank_gt0.
-have t2p := pnatPpi t2E2 piE2p; have [A Ep2A _] := ex_tau2Elem hallE t2p.
-have [_ abelA _] := pnElemP Ep2A; have [pA _] := andP abelA.
-have [S /= sylS sAS] := Sylow_superset (subsetT A) pA.
-have [cSS | not_cSS] := boolP (abelian S).
- by have [[_ cE2E2] _ _ _] := abelian_tau2 maxM complEi t2p Ep2A sylS sAS cSS.
-have pS := pHall_pgroup sylS.
-have [def_t2 _ _ _] := nonabelian_tau2 maxM hallE t2p Ep2A pS not_cSS.
-apply: sigma'_nil_abelian (subset_trans _ sEM) (pgroupS _ s'E) _ => //.
-by rewrite (eq_pgroup _ def_t2) in t2E2; apply: pgroup_nil t2E2.
-Qed.
-
-(* This is B & G, Corollary 12.10(c). *)
-(* We do not really need a full decomposition of the complement in the first *)
-(* part, but this reduces the number of assumptions. *)
-Corollary tau1_cent_tau2Elem_factor M E p A :
- M \in 'M -> \sigma(M)^'.-Hall(M) E -> p \in \tau2(M) -> A \in 'E_p^2(E) ->
- [/\ forall E1 E2 E3, sigma_complement M E E1 E2 E3 -> E3 * E2 \subset 'C_E(A),
- 'C_E(A) <| E
- & \tau1(M).-group (E / 'C_E(A))].
-Proof.
-move=> maxM hallE t2p Ep2A; have sEM: E \subset M := pHall_sub hallE.
-have nsAE: A <| E by case/(tau2_compl_context maxM): Ep2A => //; case.
-have [sAE nAE]: A \subset E /\ E \subset 'N(A) := andP nsAE.
-have nsCAE: 'C_E(A) <| E by rewrite norm_normalI ?norms_cent.
-have [[E1 hallE1] [E3 hallE3]] := ex_tau13_compl hallE.
-have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
-have{hallE1} [t1E1 sE3E] := (pHall_pgroup hallE1, pHall_sub hallE3).
-have{nsAE} sAE2: A \subset E2.
- apply: subset_trans (pcore_max _ nsAE) (pcore_sub_Hall hallE2).
- by apply: pi_pnat t2p; case/pnElemP: Ep2A => _; case/andP.
-have{complEi} defE: (E3 ><| E2) ><| E1 = E.
- by case/sigma_compl_context: complEi => // _ _ _ [_ ->].
-have [[K _ defK _] _ _ _] := sdprodP defE; rewrite defK in defE.
-have nsKE: K <| E by case/sdprod_context: defE.
-have [[sKE nKE] [_ mulE32 nE32 tiE32]] := (andP nsKE, sdprodP defK).
-have{sE3E} sK_CEA: K \subset 'C_E(A).
- have cE2E2: abelian E2 := tau2_compl_abelian maxM hallE hallE2.
- rewrite subsetI sKE -mulE32 mulG_subG (centsS sAE2 cE2E2) (sameP commG1P eqP).
- rewrite -subG1 -tiE32 subsetI commg_subl (subset_trans sAE2) //=.
- by rewrite (subset_trans _ sAE2) // commg_subr (subset_trans sE3E).
-split=> // [_ F2 F3 [_ _ hallF2 hallF3 _] | ].
- have solE: solvable E := solvableS sEM (mmax_sol maxM).
- have [x2 Ex2 ->] := Hall_trans solE hallF2 hallE2.
- have [x3 Ex3 ->] := Hall_trans solE hallF3 hallE3.
- rewrite mulG_subG !sub_conjg !(normsP (normal_norm nsCAE)) ?groupV //.
- by rewrite -mulG_subG mulE32.
-have [f <-] := homgP (homg_quotientS nKE (normal_norm nsCAE) sK_CEA).
-by rewrite morphim_pgroup // /pgroup -divg_normal // -(sdprod_card defE) mulKn.
-Qed.
-
-(* This is B & G, Corollary 12.10(d). *)
-Corollary norm_noncyclic_sigma M p P :
- M \in 'M -> p \in \sigma(M) -> p.-group P -> P \subset M -> ~~ cyclic P ->
- 'N(P) \subset M.
-Proof.
-move=> maxM sMp pP sPM ncycP.
-have [A Ep2A]: exists A, A \in 'E_p^2(P).
- by apply/p_rank_geP; rewrite ltnNge -odd_pgroup_rank1_cyclic ?mFT_odd.
-have [[sAP _ _] Ep2A_M] := (pnElemP Ep2A, subsetP (pnElemS p 2 sPM) A Ep2A).
-have sCAM: 'C(A) \subset M by case/p2Elem_mmax: Ep2A_M.
-have [_ _ <- //] := sigma_group_trans maxM sMp pP.
-by rewrite mulG_subG subsetIl (subset_trans (centS sAP)).
-Qed.
-
-(* This is B & G, Corollary 12.10(e). *)
-Corollary cent1_nreg_sigma_uniq M (Ms := M`_\sigma) x :
- M \in 'M -> x \in M^# -> \tau2(M).-elt x -> 'C_Ms[x] != 1 ->
- 'M('C[x]) = [set M].
-Proof.
-move=> maxM /setD1P[ntx]; rewrite -cycle_subG => sMX t2x.
-apply: contraNeq => MCx_neqM.
-have{MCx_neqM} [H maxCxH neqHM]: exists2 H, H \in 'M('C[x]) & H \notin [set M].
- apply/subsetPn; have [H MCxH] := mmax_exists (mFT_cent1_proper ntx).
- by rewrite eqEcard cards1 (cardD1 H) MCxH andbT in MCx_neqM.
-have sCxH: 'C[x] \subset H by case/setIdP: maxCxH.
-have s'x: \sigma(M)^'.-elt x by apply: sub_pgroup t2x => p; case/andP.
-have [E hallE sXE] := Hall_superset (mmax_sol maxM) sMX s'x.
-have [sEM solE] := (pHall_sub hallE, sigma_compl_sol hallE).
-have{sXE} [E2 hallE2 sXE2] := Hall_superset solE sXE t2x.
-pose p := pdiv #[x].
-have t2p: p \in \tau2(M) by rewrite (pnatPpi t2x) ?pi_pdiv ?order_gt1.
-have [A Ep2A sAE2]: exists2 A, A \in 'E_p^2(M) & A \subset E2.
- have [A Ep2A_E EpA] := ex_tau2Elem hallE t2p.
- have [sAE abelA _] := pnElemP Ep2A_E; have [pA _] := andP abelA.
- have [z Ez sAzE2] := Hall_Jsub solE hallE2 sAE (pi_pnat pA t2p).
- by exists (A :^ z)%G; rewrite // -(normsP (normsG sEM) z Ez) pnElemJ.
-have cE2E2: abelian E2 := tau2_compl_abelian maxM hallE hallE2.
-have cxA: A \subset 'C[x] by rewrite -cent_cycle (sub_abelian_cent2 cE2E2).
-have maxAH: H \in 'M(A) :\ M by rewrite inE neqHM (subsetP (mmax_ofS cxA)).
-have [_ _ _ tiMsMA _] := tau2_context maxM t2p Ep2A.
-by rewrite -subG1 -(tiMsMA H maxAH) setIS.
-Qed.
-
-(* This is B & G, Lemma 12.11. *)
-Lemma primes_norm_tau2Elem M E p A Mstar :
- M \in 'M -> \sigma(M)^'.-Hall(M) E -> p \in \tau2(M) -> A \in 'E_p^2(E) ->
- Mstar \in 'M('N(A)) ->
- [/\ (*a*) {subset \tau2(M) <= [predD \sigma(Mstar) & \beta(Mstar)]},
- (*b*) [predU \tau1(Mstar) & \tau2(Mstar)].-group (E / 'C_E(A))
- & (*c*) forall q, q \in \pi(E / 'C_E(A)) -> q \in \pi('C_E(A)) ->
- [/\ q \in \tau2(Mstar),
- exists2 P, P \in 'Syl_p(G) & P <| Mstar
- & exists Q, [/\ Q \in 'Syl_q(G), Q \subset Mstar & abelian Q]]].
-Proof.
-move=> maxM hallE t2Mp Ep2A; move: Mstar.
-have [sAE abelA dimA] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
-have ntA: A :!=: 1 by apply: (nt_pnElem Ep2A).
-have [sEM solE] := (pHall_sub hallE, sigma_compl_sol hallE).
-have [_ nsCA_E t1CEAb] := tau1_cent_tau2Elem_factor maxM hallE t2Mp Ep2A.
-have [sAM nCA_E] := (subset_trans sAE sEM, normal_norm nsCA_E).
-have part_a H:
- H \in 'M('N(A)) -> {subset \tau2(M) <= [predD \sigma(H) & \beta(H)]}.
-- case/setIdP=> maxH sNA_H q t2Mq.
- have sCA_H: 'C(A) \subset H := subset_trans (cent_sub A) sNA_H.
- have sAH := subset_trans cAA sCA_H.
- have sHp: p \in \sigma(H).
- have [// | t2Hp] := orP (prime_class_mmax_norm maxH pA sNA_H).
- apply: contraLR sNA_H => sH'p.
- have sH'A: \sigma(H)^'.-group A by apply: pi_pnat pA _.
- have [F hallF sAF] := Hall_superset (mmax_sol maxH) sAH sH'A.
- have Ep2A_F: A \in 'E_p^2(F) by apply/pnElemP.
- by have [_ [_ _ ->]]:= tau2_compl_context maxH hallF t2Hp Ep2A_F.
- rewrite inE /= -predI_sigma_beta //= negb_and /= orbC.
- have [-> /= _] := tau2_not_beta maxM t2Mq.
- have [B Eq2B]: exists B, B \in 'E_q^2('C(A)).
- have [E2 hallE2 sAE2] := Hall_superset solE sAE (pi_pnat pA t2Mp).
- have cE2E2: abelian E2 := tau2_compl_abelian maxM hallE hallE2.
- have [Q sylQ] := Sylow_exists q E2; have sQE2 := pHall_sub sylQ.
- have sylQ_E := subHall_Sylow hallE2 t2Mq sylQ.
- apply/p_rank_geP; apply: leq_trans (p_rankS q (centsS sAE2 cE2E2)).
- rewrite -(p_rank_Sylow sylQ) (p_rank_Sylow sylQ_E).
- by move: t2Mq; rewrite (tau2E hallE) => /andP[_ /eqP->].
- have [cAB abelB dimB] := pnElemP Eq2B; have sBH := subset_trans cAB sCA_H.
- have{Eq2B} Eq2B: B \in 'E_q^2(H) by apply/pnElemP.
- have rqHgt1: 'r_q(H) > 1 by apply/p_rank_geP; exists B.
- have piHq: q \in \pi(H) by rewrite -p_rank_gt0 ltnW.
- rewrite partition_pi_mmax // in piHq.
- case/or4P: piHq rqHgt1 => // [|t2Hq _|]; try by case/and3P=> _ /eqP->.
- have [_ _ regB _ _] := tau2_context maxH t2Hq Eq2B.
- case/negP: ntA; rewrite -subG1 -regB subsetI centsC cAB andbT.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxH)) // (pi_pgroup pA).
-have part_b H:
- H \in 'M('N(A)) -> [predU \tau1(H) & \tau2(H)].-group (E / 'C_E(A)).
-- move=> maxNA_H; have [maxH sNA_H] := setIdP maxNA_H.
- have [/= bH'p sHp] := andP (part_a H maxNA_H p t2Mp).
- have sCA_H: 'C(A) \subset H := subset_trans (cent_sub A) sNA_H.
- have sAH := subset_trans cAA sCA_H.
- apply/pgroupP=> q q_pr q_dv_CEAb; apply: contraR bH'p => t12H'q.
- have [Q sylQ] := Sylow_exists q E; have [sQE qQ _] := and3P sylQ.
- have nsAE: A <| E by case/(tau2_compl_context maxM): Ep2A => //; case.
- have nAE := normal_norm nsAE; have nAQ := subset_trans sQE nAE.
- have sAQ_A: [~: A, Q] \subset A by rewrite commg_subl.
- have ntAQ: [~: A, Q] != 1.
- apply: contraTneq q_dv_CEAb => /commG1P cAQ.
- have nCEA_Q := subset_trans sQE nCA_E.
- rewrite -p'natE // -partn_eq1 ?cardg_gt0 //.
- rewrite -(card_Hall (quotient_pHall nCEA_Q sylQ)) -trivg_card1 -subG1.
- by rewrite quotient_sub1 // subsetI sQE centsC.
- have sQH: Q \subset H := subset_trans nAQ sNA_H.
- have sHsubH' r X:
- r \in \sigma(H) -> X \subset H -> r.-group X -> X \subset H^`(1).
- + move=> sHr sXH rX; apply: subset_trans (Msigma_der1 maxH).
- by rewrite (sub_Hall_pcore (Msigma_Hall maxH)) // (pi_pgroup rX sHr).
- have sAH': A \subset H^`(1) by apply: sHsubH' pA.
- have{t12H'q} sQH': Q \subset H^`(1).
- have [sHq | sH'q] := boolP (q \in \sigma(H)); first exact: sHsubH' qQ.
- have{sH'q} sH'Q: \sigma(H)^'.-group Q by apply: (pi_pnat qQ).
- have{sH'Q} [F hallF sQF] := Hall_superset (mmax_sol maxH) sQH sH'Q.
- have [-> | ntQ] := eqsVneq Q 1; first exact: sub1G.
- have{t12H'q} t3Hq: q \in \tau3(H).
- apply: implyP t12H'q; rewrite implyNb -orbA.
- rewrite -(partition_pi_sigma_compl maxH hallF) -p_rank_gt0.
- by rewrite (leq_trans _ (p_rankS q sQF)) // -rank_pgroup // rank_gt0.
- have solF: solvable F := sigma_compl_sol hallF.
- have [F3 hallF3 sQF3] := Hall_superset solF sQF (pi_pnat qQ t3Hq).
- have [[F1 hallF1] _] := ex_tau13_compl hallF.
- have [F2 _ complFi] := ex_tau2_compl hallF hallF1 hallF3.
- have [[sF3H' _] _ _ _ _] := sigma_compl_context maxH complFi.
- exact: subset_trans sQF3 (subset_trans sF3H' (dergS 1 (pHall_sub hallF))).
- have hallHb: \beta(H).-Hall(H) H`_\beta := Mbeta_Hall maxH.
- have nilH'b: nilpotent (H^`(1) / H`_\beta) := Mbeta_quo_nil maxH.
- have{nilH'b} sAQ_Hb: [~: A, Q] \subset H`_\beta.
- rewrite commGC -quotient_cents2 ?gFnorm_trans ?normsG //=.
- rewrite (sub_nilpotent_cent2 nilH'b) ?quotientS ?coprime_morph //.
- rewrite (pnat_coprime (pi_pnat pA t2Mp) (pi_pnat qQ _)) ?tau2'1 //.
- by rewrite (pnatPpi t1CEAb) // mem_primes q_pr cardG_gt0.
- rewrite (pnatPpi (pHall_pgroup hallHb)) // (piSg sAQ_Hb) // -p_rank_gt0.
- by rewrite -(rank_pgroup (pgroupS sAQ_A pA)) rank_gt0.
-move=> H maxNA_H; split; last 1 [move=> q piCEAb_q piCEAq] || by auto.
-have [_ sHp]: _ /\ p \in \sigma(H) := andP (part_a H maxNA_H p t2Mp).
-have{maxNA_H} [maxH sNA_H] := setIdP maxNA_H.
-have{sNA_H} sCA_H: 'C(A) \subset H := subset_trans (cent_sub A) sNA_H.
-have{piCEAq} [Q0 EqQ0]: exists Q0, Q0 \in 'E_q^1('C_E(A)).
- by apply/p_rank_geP; rewrite p_rank_gt0.
-have [sQ0_CEA abelQ0 dimQ0]:= pnElemP EqQ0; have [qQ0 cQ0Q0 _] := and3P abelQ0.
-have{sQ0_CEA} [sQ0E cAQ0]: Q0 \subset E /\ Q0 \subset 'C(A).
- by apply/andP; rewrite -subsetI.
-have ntQ0: Q0 :!=: 1 by apply: (nt_pnElem EqQ0).
-have{t1CEAb} t1Mq: q \in \tau1(M) := pnatPpi t1CEAb piCEAb_q.
-have [Q sylQ sQ0Q] := Sylow_superset sQ0E qQ0; have [sQE qQ _] := and3P sylQ.
-have [E1 hallE1 sQE1] := Hall_superset solE sQE (pi_pnat qQ t1Mq).
-have rqE: 'r_q(E) = 1%N.
- by move: t1Mq; rewrite (tau1E maxM hallE) andbA andbC; case: eqP.
-have cycQ: cyclic Q.
- by rewrite (odd_pgroup_rank1_cyclic qQ) ?mFT_odd // (p_rank_Sylow sylQ) rqE.
-have sCAE: 'C(A) \subset E by case/(tau2_compl_context maxM): Ep2A => // _ [].
-have{sCAE} sylCQA: q.-Sylow('C(A)) 'C_Q(A).
- by apply: Hall_setI_normal sylQ; rewrite /= -(setIidPr sCAE).
-have{sylCQA} defNA: 'C(A) * 'N_('N(A))(Q0) = 'N(A).
- apply/eqP; rewrite eqEsubset mulG_subG cent_sub subsetIl /=.
- rewrite -{1}(Frattini_arg (cent_normal A) sylCQA) mulgS ?setIS ?char_norms //.
- by rewrite (sub_cyclic_char Q0 (cyclicS (subsetIl Q _) cycQ)) subsetI sQ0Q.
-have [L maxNQ0_L]: {L | L \in 'M('N(Q0))}.
- by apply: mmax_exists; rewrite mFT_norm_proper ?(mFT_pgroup_proper qQ0).
-have{maxNQ0_L} [maxL sNQ0_L] := setIdP maxNQ0_L.
-have sCQ0_L: 'C(Q0) \subset L := subset_trans (cent_sub Q0) sNQ0_L.
-have sAL: A \subset L by rewrite (subset_trans _ sCQ0_L) // centsC.
-have sCA_L: 'C(A) \subset L.
- by have /p2Elem_mmax[]: A \in 'E_p^2(L) by apply/pnElemP.
-have{sCA_L defNA} maxNA_L: L \in 'M('N(A)).
- by rewrite inE maxL -defNA setIC mul_subG // subIset ?sNQ0_L.
-have t2Lq: q \in \tau2(L).
- have /orP[sLq | //] := prime_class_mmax_norm maxL qQ0 sNQ0_L.
- by have /orP[/andP[/negP] | ] := pnatPpi (part_b L maxNA_L) piCEAb_q.
-have [cQQ [/= sL'q _]] := (cyclic_abelian cycQ, andP t2Lq).
-have sQL: Q \subset L := subset_trans (centsS sQ0Q cQQ) sCQ0_L.
-have [F hallF sQF] := Hall_superset (mmax_sol maxL) sQL (pi_pnat qQ sL'q).
-have [B Eq2B _] := ex_tau2Elem hallF t2Lq.
-have [_ sLp]: _ /\ p \in \sigma(L) := andP (part_a L maxNA_L p t2Mp).
-have{H sHp maxH sCA_H} <-: L :=: H.
- have sLHp: p \in [predI \sigma(L) & \sigma(H)] by apply/andP.
- have [_ transCA _] := sigma_group_trans maxH sHp pA.
- set S := finset _ in transCA; have sAH := subset_trans cAA sCA_H.
- suffices [SH SL]: gval H \in S /\ gval L \in S.
- have [c cAc -> /=]:= atransP2 transCA SH SL.
- by rewrite conjGid // (subsetP sCA_H).
- have [_ _ _ TIsL] := tau2_compl_context maxL hallF t2Lq Eq2B.
- apply/andP; rewrite !inE sAH sAL orbit_refl orbit_sym /= andbT.
- by apply: contraLR sLHp => /TIsL[] // _ ->.
-split=> //.
- exists ('O_p(L`_\sigma))%G; last by rewrite /= -pcoreI pcore_normal.
- rewrite inE (subHall_Sylow (Msigma_Hall_G maxL) sLp) //.
- by rewrite nilpotent_pcore_Hall // (tau2_Msigma_nil maxL t2Lq).
-have [Q1 sylQ1 sQQ1] := Sylow_superset (subsetT Q) qQ.
-have [sQ0Q1 qQ1] := (subset_trans sQ0Q sQQ1, pHall_pgroup sylQ1).
-have [cQ1Q1 | not_cQ1Q1] := boolP (abelian Q1).
- by exists Q1; rewrite inE (subset_trans (centsS sQ0Q1 cQ1Q1)).
-have [_ _ regB [F0 /=]] := nonabelian_tau2 maxL hallF t2Lq Eq2B qQ1 not_cQ1Q1.
-have{regB} ->: 'C_B(L`_\sigma) = Q0; last move=> defF _.
- apply: contraTeq sCQ0_L => neqQ0B; case: (regB Q0) => //.
- by rewrite 2!inE eq_sym neqQ0B; apply/pnElemP; rewrite (subset_trans sQ0Q).
-have{defF} defQ: Q0 \x (F0 :&: Q) = Q.
- rewrite dprodEsd ?(centSS (subsetIr F0 Q) sQ0Q) //.
- by rewrite (sdprod_modl defF sQ0Q) (setIidPr sQF).
-have [[/eqP/idPn//] | [_ eqQ0Q]] := cyclic_pgroup_dprod_trivg qQ cycQ defQ.
-have nCEA_Q := subset_trans sQE nCA_E.
-case/idPn: piCEAb_q; rewrite -p'natEpi -?partn_eq1 ?cardG_gt0 //.
-rewrite -(card_Hall (quotient_pHall nCEA_Q sylQ)) -trivg_card1 -subG1.
-by rewrite quotient_sub1 // subsetI sQE -eqQ0Q.
-Qed.
-
-(* This is a generalization of B & G, Theorem 12.12. *)
-(* In the B & G text, Theorem 12.12 only establishes the type F structure *)
-(* for groups of type I, whereas it is required for the derived groups of *)
-(* groups of type II (in the sense of Peterfalvi). Indeed this is exactly *)
-(* what is stated in Lemma 15.15(e) and then Theorem B(3). The proof of *)
-(* 15.15(c) cites 12.12 in the type I case (K = 1) and then loosely invokes *)
-(* a "short and easy argument" inside the proof of 12.12 for the K != 1 case. *)
-(* In fact, this involves copying roughly 25% of the proof, whereas the proof *)
-(* remains essentially unchanged when Theorem 12.12 is generalized to a *)
-(* normal Hall subgroup of E as below. *)
-(* Also, we simplify the argument for central tau2 Sylow subgroup S of U by *)
-(* by replacing the considerations on the abelian structure of S by a *)
-(* comparison of Mho^n-1(S) and Ohm_1(S) (with exponent S = p ^ n), as the *)
-(* former is needed anyway to prove regularity when S is not homocyclic. *)
-Theorem FTtypeF_complement M (Ms := M`_\sigma) E U :
- M \in 'M -> \sigma(M)^'.-Hall(M) E -> Hall E U -> U <| E -> U :!=: 1 ->
- {in U^#, forall e, [predU \tau1(M) & \tau3(M)].-elt e -> 'C_Ms[e] = 1} ->
- [/\ (*a*) exists A0 : {group gT},
- [/\ A0 <| U, abelian A0 & {in Ms^#, forall x, 'C_U[x] \subset A0}]
- & (*b*) exists E0 : {group gT},
- [/\ E0 \subset U, exponent E0 = exponent U
- & [Frobenius Ms <*> E0 = Ms ><| E0]]].
-Proof.
-set p13 := predU _ _ => maxM hallE /Hall_pi hallU nsUE ntU regU13.
-have [[E1 hallE1] [E3 hallE3]] := ex_tau13_compl hallE.
-have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
-have [[sE1E _] [sE2E t2E2 _]] := (andP hallE1, and3P hallE2).
-have [[_ nsE3E] _ [cycE1 _] [defE _] _] := sigma_compl_context maxM complEi.
-have [[[sE3E t3E3 _][_ nE3E]] [sUE _]] := (and3P hallE3, andP nsE3E, andP nsUE).
-have defM: Ms ><| E = M := sdprod_sigma maxM hallE.
-have [nsMsM sEM mulMsE nMsE tiMsE] := sdprod_context defM.
-have ntMs: Ms != 1 := Msigma_neq1 maxM.
-have{defM} defMsU: Ms ><| U = Ms <*> U := sdprod_subr defM sUE.
-pose U2 := (E2 :&: U)%G.
-have hallU2: \tau2(M).-Hall(U) U2 := Hall_setI_normal nsUE hallE2.
-have [U2_1 | ntU2] := eqsVneq U2 1.
- have frobMsU: [Frobenius Ms <*> U = Ms ><| U].
- apply/Frobenius_semiregularP=> // e Ue.
- apply: regU13 => //; case/setD1P: Ue => _; apply: mem_p_elt.
- have: \tau2(M)^'.-group U.
- by rewrite -partG_eq1 -(card_Hall hallU2) U2_1 cards1.
- apply: sub_in_pnat => p /(piSg sUE).
- by rewrite (partition_pi_sigma_compl maxM hallE) orbCA => /orP[] // /idPn.
- split; [exists 1%G; rewrite normal1 abelian1 | by exists U].
- by split=> //= x Ux; rewrite (Frobenius_reg_compl frobMsU).
-have [[sU2U t2U2 _] [p p_pr rU2]] := (and3P hallU2, rank_witness U2).
-have piU2p: p \in \pi(U2) by rewrite -p_rank_gt0 -rU2 rank_gt0.
-have t2p: p \in \tau2(M) := pnatPpi t2U2 piU2p.
-have [A Ep2A Ep2A_M] := ex_tau2Elem hallE t2p.
-have [sAE abelA _] := pnElemP Ep2A; have{abelA} [pA cAA _] := and3P abelA.
-have [S sylS sAS] := Sylow_superset (subsetT A) pA.
-have [cSS | not_cSS] := boolP (abelian S); last first.
- have [_] := nonabelian_tau2 maxM hallE t2p Ep2A (pHall_pgroup sylS) not_cSS.
- set A0 := ('C_A(_))%G => [] [oA0 _] _ {defE} [E0 defE regE0].
- have [nsA0E sE0E mulAE0 nAE0 tiAE0] := sdprod_context defE.
- have [P sylP] := Sylow_exists p U; have [sPU _] := andP sylP.
- have sylP_E := subHall_Sylow hallU (piSg sU2U piU2p) sylP.
- have pA0: p.-group A0 by rewrite /pgroup oA0 pnat_id.
- have sA0P: A0 \subset P.
- by apply: subset_trans (pcore_sub_Hall sylP_E); apply: pcore_max.
- have sA0U: A0 \subset U := subset_trans sA0P sPU.
- pose U0 := (E0 :&: U)%G.
- have defU: A0 ><| U0 = U by rewrite (sdprod_modl defE) // (setIidPr sUE).
- have piU0p: p \in \pi(U0).
- have:= lognSg p sAE; rewrite (card_pnElem Ep2A) pfactorK //.
- rewrite -logn_part -(card_Hall sylP_E) (card_Hall sylP) logn_part.
- rewrite -(sdprod_card defU) oA0 lognM // ?prime_gt0 // logn_prime // eqxx.
- by rewrite ltnS logn_gt0.
- have defM0: Ms ><| U0 = Ms <*> U0 := sdprod_subr defMsU (subsetIr _ _).
- have frobM0: [Frobenius Ms <*> U0 = Ms ><| U0].
- apply/Frobenius_semiregularP=> // [|e /setD1P[nte /setIP[E0e Ue]]].
- by rewrite -rank_gt0 (leq_trans _ (p_rank_le_rank p _)) ?p_rank_gt0.
- have [ | ] := boolP (p13.-elt e); first by apply: regU13; rewrite !inE nte.
- apply: contraNeq => /trivgPn[x /setIP[Ms_x cex] ntx].
- apply/pgroupP=> q q_pr q_dv_x; rewrite inE /= (regE0 x) ?inE ?ntx //.
- rewrite mem_primes q_pr cardG_gt0 (dvdn_trans q_dv_x) ?order_dvdG //.
- by rewrite inE E0e cent1C.
- have [nsA0U sU0U _ _ _] := sdprod_context defU.
- split; [exists A0 | exists U0].
- split=> // [|x Ms_x]; first by rewrite (abelianS (subsetIl A _) cAA).
- rewrite -(sdprodW defU) -group_modl ?(Frobenius_reg_compl frobM0) ?mulg1 //.
- by rewrite subIset //= orbC -cent_set1 centS // sub1set; case/setD1P: Ms_x.
- split=> //; apply/eqP; rewrite eqn_dvd exponentS //=.
- rewrite -(partnC p (exponent_gt0 U0)) -(partnC p (exponent_gt0 U)).
- apply: dvdn_mul; last first.
- rewrite (partn_exponentS sU0U) // -(sdprod_card defU) partnM ?cardG_gt0 //.
- by rewrite part_p'nat ?pnatNK // mul1n dvdn_part.
- have cPP: abelian P.
- have [/(_ P)[] //] := tau2_context maxM t2p Ep2A_M.
- by apply: subHall_Sylow hallE _ sylP_E; case/andP: t2p.
- have defP: A0 \x (U0 :&: P) = P.
- rewrite dprodEsd ?(sub_abelian_cent2 cPP) ?subsetIr //.
- by rewrite (sdprod_modl defU) // (setIidPr sPU).
- have sylP_U0: p.-Sylow(U0) (U0 :&: P).
- rewrite pHallE subsetIl /= -(eqn_pmul2l (cardG_gt0 A0)).
- rewrite (dprod_card defP) (card_Hall sylP) -(sdprod_card defU).
- by rewrite partnM // part_pnat_id.
- rewrite -(exponent_Hall sylP) -(dprod_exponent defP) (exponent_Hall sylP_U0).
- rewrite dvdn_lcm (dvdn_trans (exponent_dvdn A0)) //= oA0.
- apply: contraLR piU0p; rewrite -p'natE // -partn_eq1 // partn_part //.
- by rewrite partn_eq1 ?exponent_gt0 // pnat_exponent -p'groupEpi.
-have{t2p Ep2A sylS sAS cSS} [[nsE2E cE2E2] hallE2_G _ _]
- := abelian_tau2 maxM complEi t2p Ep2A sylS sAS cSS.
-clear p p_pr rU2 piU2p A S Ep2A_M sAE pA cAA.
-have nsU2U: U2 <| U by rewrite (normalS sU2U sUE) ?normalI.
-have cU2U2: abelian U2 := abelianS (subsetIl _ _) cE2E2.
-split.
- exists U2; rewrite -set1gE; split=> // x /setDP[Ms_x ntx].
- rewrite (sub_normal_Hall hallU2) ?subsetIl //=.
- apply: sub_in_pnat (pgroup_pi _) => q /(piSg (subsetIl U _))/(piSg sUE).
- rewrite (partition_pi_sigma_compl maxM) // orbCA => /orP[] // t13q.
- rewrite mem_primes => /and3P[q_pr _ /Cauchy[] // y /setIP[Uy cxy] oy].
- case/negP: ntx; rewrite -(regU13 y); first by rewrite inE Ms_x cent1C.
- by rewrite !inE -order_gt1 oy prime_gt1.
- by rewrite /p_elt oy pnatE.
-pose sylU2 S := (S :!=: 1) && Sylow U2 S.
-pose cyclicRegular Z S :=
- [/\ Z <| U, cyclic Z, 'C_Ms('Ohm_1(Z)) = 1 & exponent Z = exponent S].
-suffices /fin_all_exists[Z_ Z_P] S: exists Z, sylU2 S -> cyclicRegular Z S.
- pose Z2 := <<\bigcup_(S | sylU2 S) Z_ S>>.
- have sZU2: Z2 \subset U2.
- rewrite gen_subG; apply/bigcupsP=> S sylS.
- have [[/andP[sZE _] _ _ eq_expZS] [_ _ sSU2 _]] := (Z_P S sylS, and4P sylS).
- rewrite (sub_normal_Hall hallU2) // -pnat_exponent eq_expZS.
- by rewrite pnat_exponent (pgroupS sSU2 t2U2).
- have nZ2U: U \subset 'N(Z2).
- by rewrite norms_gen ?norms_bigcup //; apply/bigcapsP => S /Z_P[/andP[]].
- have solU: solvable U := solvableS sUE (sigma_compl_sol hallE).
- have [U31 hallU31] := Hall_exists \tau2(M)^' solU.
- have [[sU31U t2'U31 _] t2Z2] := (and3P hallU31, pgroupS sZU2 t2U2).
- pose U0 := (Z2 <*> U31)%G; have /joing_sub[sZ2U0 sU310] := erefl (gval U0).
- have sU0U: U0 \subset U by rewrite join_subG (subset_trans sZU2).
- have nsZ2U0: Z2 <| U0 by rewrite /normal sZ2U0 (subset_trans sU0U).
- have defU0: Z2 * U31 = U0 by rewrite -norm_joinEr // (subset_trans sU31U).
- have [hallZ2 hallU31_0] := coprime_mulpG_Hall defU0 t2Z2 t2'U31.
- have expU0U: exponent U0 = exponent U.
- have exp_t2c U' := partnC \tau2(M) (exponent_gt0 U').
- rewrite -(exp_t2c U) -(exponent_Hall hallU31) -(exponent_Hall hallU2).
- rewrite -{}exp_t2c -(exponent_Hall hallU31_0) -(exponent_Hall hallZ2).
- congr (_ * _)%N; apply/eqP; rewrite eqn_dvd exponentS //=.
- apply/dvdn_partP=> [|p]; first exact: exponent_gt0.
- have [S sylS] := Sylow_exists p U2; rewrite -(exponent_Hall sylS).
- rewrite pi_of_exponent -p_rank_gt0 -(rank_Sylow sylS) rank_gt0 => ntS.
- have{sylS} sylS: sylU2 S by rewrite /sylU2 ntS (p_Sylow sylS).
- by have /Z_P[_ _ _ <-] := sylS; rewrite exponentS ?sub_gen ?(bigcup_max S).
- exists U0; split=> //.
- have ntU0: U0 :!=: 1 by rewrite trivg_exponent expU0U -trivg_exponent.
- apply/Frobenius_semiregularP=> //; first by rewrite (sdprod_subr defMsU).
- apply: semiregular_sym => x /setD1P[ntx Ms_x]; apply: contraNeq ntx.
- rewrite -rank_gt0; have [p p_pr ->] := rank_witness [group of 'C_U0[x]].
- rewrite -in_set1 -set1gE p_rank_gt0 => piCp.
- have [e /setIP[U0e cxe] oe]: {e | e \in 'C_U0[x] & #[e] = p}.
- by move: piCp; rewrite mem_primes p_pr cardG_gt0; apply: Cauchy.
- have nte: e != 1 by rewrite -order_gt1 oe prime_gt1.
- have{piCp} piUp: p \in \pi(U).
- by rewrite -pi_of_exponent -expU0U pi_of_exponent (piSg _ piCp) ?subsetIl.
- have:= piSg sUE piUp; rewrite (partition_pi_sigma_compl maxM) // orbCA orbC.
- case/orP=> [t13p | t2p].
- rewrite -(regU13 e) 1?inE ?Ms_x 1?cent1C //.
- by rewrite inE nte (subsetP sU0U).
- by rewrite /p_elt oe pnatE.
- have Z2e: e \in Z2 by rewrite (mem_normal_Hall hallZ2) // /p_elt oe pnatE.
- have [S sylS] := Sylow_exists p U2; have [sSU2 pS _] := and3P sylS.
- have sylS_U: p.-Sylow(U) S := subHall_Sylow hallU2 t2p sylS.
- have ntS: S :!=: 1 by rewrite -rank_gt0 (rank_Sylow sylS_U) p_rank_gt0.
- have sylS_U2: sylU2 S by rewrite /sylU2 ntS (p_Sylow sylS).
- have [nsZU cycZ regZ1 eqexpZS] := Z_P S sylS_U2.
- suffices defZ1: 'Ohm_1(Z_ S) == <[e]>.
- by rewrite -regZ1 (eqP defZ1) cent_cycle inE Ms_x cent1C.
- have pZ: p.-group (Z_ S) by rewrite -pnat_exponent eqexpZS pnat_exponent.
- have sylZ: p.-Sylow(Z2) (Z_ S).
- have:= sZU2; rewrite pHallE /Z2 /= -bigprodGE (bigD1 S) //=.
- set Z2' := (\prod_(T | _) _)%G => /joing_subP[sZ_U2 sZ2'_U2].
- rewrite joing_subl cent_joinEl ?(sub_abelian_cent2 cU2U2) //=.
- suffices p'Z2': p^'.-group Z2'.
- rewrite coprime_cardMg ?(pnat_coprime pZ) //.
- by rewrite partnM // part_pnat_id // part_p'nat // muln1.
- elim/big_ind: Z2' sZ2'_U2 => [_||T /andP[sylT neqTS]]; first exact: pgroup1.
- move=> X Y IHX IHY /joing_subP[sXU2 sYU2] /=.
- by rewrite cent_joinEl ?(sub_abelian_cent2 cU2U2) // pgroupM IHX ?IHY.
- have /Z_P[_ _ _ expYT _] := sylT.
- have{sylT} [_ /SylowP[q _ sylT]] := andP sylT.
- rewrite -pnat_exponent expYT pnat_exponent.
- apply: (pi_pnat (pHall_pgroup sylT)); apply: contraNneq neqTS => eq_qp.
- have defOE2 := nilpotent_Hall_pcore (abelian_nil cU2U2).
- by rewrite -val_eqE /= (defOE2 _ _ sylS) (defOE2 _ _ sylT) eq_qp.
- have nZZ2 := normalS (pHall_sub sylZ) (subset_trans sZU2 sU2U) nsZU.
- have Ze: e \in Z_ S by rewrite (mem_normal_Hall sylZ) // /p_elt oe pnat_id.
- rewrite (eq_subG_cyclic cycZ) ?Ohm_sub ?cycle_subG // -orderE oe.
- by rewrite (Ohm1_cyclic_pgroup_prime _ pZ) //; apply/trivgPn; exists e.
-case: (sylU2 S) / andP => [[ntS /SylowP[p p_pr sylS_U2]]|]; last by exists E.
-have [sSU2 pS _] := and3P sylS_U2; have [sSE2 sSU] := subsetIP sSU2.
-have piSp: p \in \pi(S) by rewrite -p_rank_gt0 -rank_pgroup ?rank_gt0.
-have t2p: p \in \tau2(M) := pnatPpi t2U2 (piSg sSU2 piSp).
-have sylS_U: p.-Sylow(U) S := subHall_Sylow hallU2 t2p sylS_U2.
-have sylS_E: p.-Sylow(E) S := subHall_Sylow hallU (piSg sSU piSp) sylS_U.
-have sylS: p.-Sylow(E2) S := pHall_subl sSE2 sE2E sylS_E.
-have sylS_G: p.-Sylow(G) S := subHall_Sylow hallE2_G t2p sylS.
-have [cSS [/= s'p rpM]] := (abelianS sSU2 cU2U2, andP t2p).
-have sylS_M: p.-Sylow(M) S := subHall_Sylow hallE s'p sylS_E.
-have rpS: 'r_p(S) = 2 by apply/eqP; rewrite (p_rank_Sylow sylS_M).
-have [A] := p_rank_witness p S; rewrite rpS -(setIidPr (pHall_sub sylS_E)).
-rewrite pnElemI setIC 2!inE => /andP[sAS Ep2A].
-have [[nsAE defEp] _ nregEp_uniq _] := tau2_compl_context maxM hallE t2p Ep2A.
-have [_ sNS'FE _ sCSE _]
- := abelian_tau2_sub_Fitting maxM hallE t2p Ep2A sylS_G sAS cSS.
-have [_ _ [defNS _ _ _] regE1subZ]
- := abelian_tau2 maxM complEi t2p Ep2A sylS_G sAS cSS.
-have nSE: E \subset 'N(S) by rewrite -defNS normal_norm.
-have [sSE nSU] := (subset_trans sSE2 sE2E, subset_trans sUE nSE).
-have n_subNS := abelian_tau2_norm_Sylow maxM hallE t2p Ep2A sylS_G sAS cSS.
-have not_sNS_M: ~~ ('N(S) \subset M).
- by apply: contra s'p => sNS_M; apply/exists_inP; exists S; rewrite // inE.
-have regNNS Z (Z1 := 'Ohm_1(Z)%G):
- Z \subset S -> cyclic Z -> Z :!=: 1 -> 'N(S) \subset 'N(Z1) -> 'C_Ms(Z1) = 1.
-- move=> sZS cycZ ntZ nZ1_NS; apply: contraNeq not_sNS_M => nregZ1.
- have sZ1S: Z1 \subset S by apply: gFsub_trans.
- have EpZ1: Z1 \in 'E_p^1(E).
- rewrite p1ElemE // !inE (subset_trans sZ1S) //=.
- by rewrite (Ohm1_cyclic_pgroup_prime _ (pgroupS sZS pS)).
- have /= uCZ1 := nregEp_uniq _ EpZ1 nregZ1.
- apply: (subset_trans nZ1_NS); apply: (sub_uniq_mmax uCZ1 (cent_sub _)).
- by rewrite mFT_norm_proper ?(mFT_pgroup_proper (pgroupS sZ1S pS)) ?Ohm1_eq1.
-have [_ nsCEA t1CEAb] := tau1_cent_tau2Elem_factor maxM hallE t2p Ep2A.
-have [cSU | not_cSU] := boolP (U \subset 'C(S)).
- pose n := logn p (exponent S); pose Sn := 'Mho^n.-1(S)%G.
- have n_gt0: 0 < n by rewrite -pi_of_exponent -logn_gt0 in piSp.
- have expS: (exponent S = p ^ n.-1 * p)%N.
- rewrite -expnSr prednK -?p_part //.
- by rewrite part_pnat_id ?pnat_exponent ?expg_exponent.
- have sSnS1: Sn \subset 'Ohm_1(S).
- rewrite (OhmE 1 pS) /= (MhoE _ pS); apply/genS/subsetP=> _ /imsetP[x Sx ->].
- by rewrite !inE groupX //= -expgM -expS expg_exponent.
- have sSZ: S \subset 'Z(U) by rewrite subsetI sSU centsC.
- have{sSZ} nsZU z: z \in S -> <[z]> <| U.
- by move=> Sz; rewrite sub_center_normal ?cycle_subG ?(subsetP sSZ).
- have [homoS | ltSnS1] := eqVproper sSnS1.
- have Ep2A_M := subsetP (pnElemS p 2 sEM) A Ep2A.
- have [_ _ _ _ [A1 EpA1 regA1]] := tau2_context maxM t2p Ep2A_M.
- have [sA1A _ oA1] := pnElemPcard EpA1.
- have /cyclicP[zn defA1]: cyclic A1 by rewrite prime_cyclic ?oA1.
- have [z Sz def_zn]: exists2 z, z \in S & zn = z ^+ (p ^ n.-1).
- apply/imsetP; rewrite -(MhoEabelian _ pS cSS) homoS (OhmE 1 pS).
- rewrite mem_gen // !inE -cycle_subG -defA1 (subset_trans sA1A) //=.
- by rewrite -oA1 defA1 expg_order.
- have oz: #[z] = exponent S.
- by rewrite expS; apply: orderXpfactor; rewrite // -def_zn orderE -defA1.
- exists <[z]>%G; split; rewrite ?cycle_cyclic ?exponent_cycle ?nsZU //.
- by rewrite (Ohm_p_cycle _ (mem_p_elt pS Sz)) subn1 oz -def_zn -defA1.
- have [z Sz /esym oz] := exponent_witness (abelian_nil cSS).
- exists <[z]>%G; split; rewrite ?cycle_cyclic ?exponent_cycle ?nsZU //.
- have ntz: <[z]> != 1 by rewrite trivg_card1 -orderE oz -dvdn1 -trivg_exponent.
- rewrite regNNS ?cycle_cyclic ?cycle_subG //=.
- suffices /eqP->: 'Ohm_1(<[z]>) == Sn by apply: char_norms; apply: gFchar.
- have [p_z pS1] := (mem_p_elt pS Sz, pgroupS (Ohm_sub 1 S) pS).
- rewrite eqEcard (Ohm1_cyclic_pgroup_prime _ p_z) ?cycle_cyclic //.
- rewrite (Ohm_p_cycle _ p_z) oz -/n subn1 cycle_subG Mho_p_elt //=.
- rewrite (card_pgroup (pgroupS sSnS1 pS1)) (leq_exp2l _ 1) ?prime_gt1 //.
- by rewrite -ltnS -rpS p_rank_abelian ?properG_ltn_log.
-have{not_cSU} [q q_pr piUq]: {q | prime q & q \in \pi(U / 'C(S))}.
- have [q q_pr rCE] := rank_witness (U / 'C(S)); exists q => //.
- by rewrite -p_rank_gt0 -rCE rank_gt0 -subG1 quotient_sub1 ?norms_cent.
-have{piUq} [piCESbq piUq]: q \in \pi(E / 'C_E(S)) /\ q \in \pi(U).
- rewrite /= setIC (card_isog (second_isog (norms_cent nSE))).
- by rewrite (piSg _ piUq) ?quotientS // (pi_of_dvd _ _ piUq) ?dvdn_quotient.
-have [Q1 sylQ1_U] := Sylow_exists q U; have [sQ1U qQ1 _] := and3P sylQ1_U.
-have sylQ1: q.-Sylow(E) Q1 := subHall_Sylow hallU piUq sylQ1_U.
-have sQ1E := subset_trans sQ1U sUE; have nSQ1 := subset_trans sQ1E nSE.
-have [Q sylQ sQ1Q] := Sylow_superset nSQ1 qQ1; have [nSQ qQ _] := and3P sylQ.
-have Ep2A_M := subsetP (pnElemS p 2 sEM) A Ep2A.
-have ltCQ1_S: 'C_S(Q1) \proper S.
- rewrite properE subsetIl /= subsetI subxx centsC -sQ1E -subsetI.
- have nCES_Q1: Q1 \subset 'N('C_E(S)) by rewrite (setIidPr sCSE) norms_cent.
- rewrite -quotient_sub1 // subG1 -rank_gt0.
- by rewrite (rank_Sylow (quotient_pHall nCES_Q1 sylQ1)) p_rank_gt0.
-have coSQ: coprime #|S| #|Q|.
- suffices p'q: q != p by rewrite (pnat_coprime pS) // (pi_pnat qQ).
- apply: contraNneq (proper_subn ltCQ1_S) => eq_qp; rewrite subsetI subxx.
- rewrite (sub_abelian_cent2 cE2E2) // (sub_normal_Hall hallE2) //.
- by rewrite (pi_pgroup qQ1) ?eq_qp.
-have not_sQ1CEA: ~~ (Q1 \subset 'C_E(A)).
- rewrite subsetI sQ1E; apply: contra (proper_subn ltCQ1_S) => /= cAQ1.
- rewrite subsetIidl centsC coprime_abelian_faithful_Ohm1 ?(coprimegS sQ1Q) //.
- by case: (tau2_context maxM t2p Ep2A_M); case/(_ S sylS_M)=> _ [|->] //.
-have t1q: q \in \tau1(M).
- rewrite (pnatPpi t1CEAb) // -p_rank_gt0.
- have nCEA_Q1: Q1 \subset 'N('C_E(A)) := subset_trans sQ1E (normal_norm nsCEA).
- rewrite -(rank_Sylow (quotient_pHall nCEA_Q1 sylQ1)) rank_gt0.
- by rewrite -subG1 quotient_sub1.
-have cycQ1: cyclic Q1.
- have [x _ sQ1E1x] := Hall_psubJ hallE1 t1q sQ1E qQ1.
- by rewrite (cyclicS sQ1E1x) ?cyclicJ.
-have defQ1: Q :&: E = Q1.
- apply: (sub_pHall sylQ1) (subsetIr Q E); last by rewrite subsetI sQ1Q.
- by rewrite (pgroupS (subsetIl Q _)).
-pose Q0 := 'C_Q(S); have nsQ0Q: Q0 <| Q by rewrite norm_normalI ?norms_cent.
-have [sQ0Q nQ0Q] := andP nsQ0Q; have nQ01 := subset_trans sQ1Q nQ0Q.
-have coSQ0: coprime #|S| #|Q0| := coprimegS sQ0Q coSQ.
-have ltQ01: Q0 \proper Q1.
- rewrite /proper -{1}defQ1 setIS //.
- apply: contra (proper_subn ltCQ1_S) => sQ10.
- by rewrite subsetIidl (centsS sQ10) // centsC subsetIr.
-have [X]: exists2 X, X \in subgroups Q & ('C_S(X) != 1) && ([~: S, X] != 1).
- apply/exists_inP; apply: contraFT (ltnn 1); rewrite negb_exists_in => irrS.
- have [sQ01 not_sQ10] := andP ltQ01.
- have qQb: q.-group (Q / Q0) by apply: quotient_pgroup.
- have ntQ1b: Q1 / Q0 != 1 by rewrite -subG1 quotient_sub1.
- have ntQb: Q / Q0 != 1 := subG1_contra (quotientS _ sQ1Q) ntQ1b.
- have{irrS} regQ: semiregular (S / Q0) (Q / Q0).
- move=> Q0x; rewrite 2!inE -cycle_subG -cycle_eq1 -cent_cycle andbC.
- case/andP; case/(inv_quotientS nsQ0Q)=> X /= -> {Q0x} sQ0X sXQ ntXb.
- have [nSX nQ0X] := (subset_trans sXQ nSQ, subset_trans sXQ nQ0Q).
- rewrite -quotient_TI_subcent ?(coprime_TIg coSQ0) //.
- apply: contraTeq (forallP irrS X) => ntCSXb; rewrite inE sXQ negbK.
- apply/andP; split.
- by apply: contraNneq ntCSXb => ->; rewrite quotient1.
- apply: contraNneq ntXb; move/commG1P => cXS.
- by rewrite quotientS1 // subsetI sXQ centsC.
- have{regQ} cycQb: cyclic (Q / Q0).
- have nSQb: Q / Q0 \subset 'N(S / Q0) by apply: quotient_norms.
- apply: odd_regular_pgroup_cyclic qQb (mFT_quo_odd _ _) _ nSQb regQ.
- rewrite -(isog_eq1 (quotient_isog _ _)) ?coprime_TIg 1?coprime_sym //.
- by rewrite cents_norm // centsC subsetIr.
- have rQ1: 'r(Q1) = 1%N.
- apply/eqP; rewrite (rank_Sylow sylQ1).
- by rewrite (tau1E maxM hallE) in t1q; case/and3P: t1q.
- have: 'r(Q) <= 1; last apply: leq_trans.
- have nQ0_Ohm1Q: 'Ohm_1(Q) \subset 'N(Q0) by apply: gFsub_trans.
- rewrite -rQ1 -rank_Ohm1 rankS // -(quotientSGK _ sQ01) //.
- rewrite (subset_trans (morphim_Ohm _ _ nQ0Q)) //= -quotientE -/Q0.
- rewrite -(cardSg_cyclic cycQb) ?Ohm_sub ?quotientS //.
- have [_ q_dv_Q1b _] := pgroup_pdiv (pgroupS (quotientS _ sQ1Q) qQb) ntQ1b.
- by rewrite (Ohm1_cyclic_pgroup_prime cycQb qQb ntQb).
- have ltNA_G: 'N(A) \proper G.
- by rewrite defNS mFT_norm_proper // (mFT_pgroup_proper pS).
- have [H maxNA_H] := mmax_exists ltNA_G.
- have nCEA_Q1 := subset_trans sQ1E (normal_norm nsCEA).
- have [_ _] := primes_norm_tau2Elem maxM hallE t2p Ep2A maxNA_H.
- case/(_ q)=> [||t2Hq [S2 sylS2 nsS2H] _].
- - rewrite -p_rank_gt0 -(rank_Sylow (quotient_pHall _ sylQ1)) //.
- by rewrite rank_gt0 -subG1 quotient_sub1.
- - rewrite -p_rank_gt0 -rQ1 (rank_pgroup qQ1) -p_rank_Ohm1 p_rankS //.
- have: 'Z(E) \subset 'C_E(A); last apply: subset_trans.
- by rewrite setIS ?centS // normal_sub.
- have [x Ex sQ1xE1] := Hall_pJsub hallE1 t1q sQ1E qQ1.
- rewrite -(conjSg _ _ x) ['Z(E) :^ x](normsP _ x Ex) ?gFnorm //.
- set Q11x := _ :^ x; have oQ11x: #|Q11x| = q.
- by rewrite cardJg (Ohm1_cyclic_pgroup_prime _ qQ1) // -rank_gt0 rQ1.
- apply: regE1subZ; rewrite /= -/Q11x.
- apply/nElemP; exists q; rewrite p1ElemE // !inE oQ11x.
- by rewrite (subset_trans _ sQ1xE1) //= conjSg Ohm_sub.
- have /cyclicP[y defQ11x]: cyclic Q11x by rewrite prime_cyclic ?oQ11x.
- rewrite defQ11x cent_cycle regU13 //.
- rewrite !inE -order_gt1 -cycle_subG /order -defQ11x oQ11x prime_gt1 //.
- by rewrite -(normsP (normal_norm nsUE) x Ex) conjSg gFsub_trans.
- by rewrite /p_elt /order -defQ11x oQ11x pnatE //; apply/orP; left.
- rewrite inE in sylS2; have [sS2H _]:= andP nsS2H.
- have sylS2_H := pHall_subl sS2H (subsetT H) sylS2.
- have [maxH sNS_H] := setIdP maxNA_H; rewrite /= defNS in sNS_H.
- have sylS_H := pHall_subl (subset_trans (normG S) sNS_H) (subsetT H) sylS_G.
- have defS2: S :=: S2 := uniq_normal_Hall sylS2_H nsS2H (Hall_max sylS_H).
- have sylQ_H: q.-Sylow(H) Q by rewrite -(mmax_normal maxH nsS2H) -defS2.
- by rewrite (rank_Sylow sylQ_H); case/andP: t2Hq => _ /eqP->.
-rewrite inE => sXQ /=; have nSX := subset_trans sXQ nSQ.
-set S1 := [~: S, X]; set S2 := 'C_S(X) => /andP[ntS2 ntS1].
-have defS12: S1 \x S2 = S.
- by apply: coprime_abelian_cent_dprod; rewrite ?(coprimegS sXQ).
-have /mulG_sub[sS1S sS2S] := dprodW defS12.
-have [cycS1 cycS2]: cyclic S1 /\ cyclic S2.
- apply/andP; rewrite !(abelian_rank1_cyclic (abelianS _ cSS)) //.
- rewrite -(leqif_add (leqif_geq _) (leqif_geq _)) ?rank_gt0 // addn1 -rpS.
- rewrite !(rank_pgroup (pgroupS _ pS)) ?(p_rank_abelian p (abelianS _ cSS)) //.
- by rewrite -lognM ?cardG_gt0 // (dprod_card (Ohm_dprod 1 defS12)).
-have [nsS2NS nsS1NS]: S2 <| 'N(S) /\ S1 <| 'N(S) := n_subNS X nSX.
-pose Z := if #|S1| < #|S2| then [group of S2] else [group of S1].
-have [ntZ sZS nsZN cycZ]: [/\ Z :!=: 1, Z \subset S, Z <| 'N(S) & cyclic Z].
- by rewrite /Z; case: ifP.
-have nsZU: Z <| U := normalS (subset_trans sZS sSU) nSU nsZN.
-exists Z; split=> //=.
- by rewrite regNNS // (char_norm_trans (Ohm_char 1 Z)) // normal_norm.
-rewrite -(dprod_exponent defS12) /= (fun_if val) fun_if !exponent_cyclic //=.
-rewrite (card_pgroup (pgroupS sS1S pS)) (card_pgroup (pgroupS sS2S pS)) //.
-by rewrite /= -/S1 -/S2 ltn_exp2l ?prime_gt1 // -fun_if expn_max.
-Qed.
-
-(* This is B & G, Theorem 12.13. *)
-Theorem nonabelian_Uniqueness p P : p.-group P -> ~~ abelian P -> P \in 'U.
-Proof.
-move=> pP not_cPP; have [M maxP_M] := mmax_exists (mFT_pgroup_proper pP).
-have sigma_p L: L \in 'M(P) -> p \in \sigma(L).
- case/setIdP=> maxL sPL; apply: contraR not_cPP => sL'p.
- exact: sigma'_nil_abelian maxL sPL (pi_pnat pP _) (pgroup_nil pP).
-have{maxP_M} [[maxM sPM] sMp] := (setIdP maxP_M, sigma_p M maxP_M).
-rewrite (uniq_mmax_subset1 maxM sPM); apply/subsetP=> H maxP_H; rewrite inE.
-have{sigma_p maxP_H} [[maxH sPH] sHp] := (setIdP maxP_H, sigma_p H maxP_H).
-without loss{pP sPH sPM} sylP: P not_cPP / p.-Sylow(M :&: H) P.
- move=> IH; have sP_MH: P \subset M :&: H by rewrite subsetI sPM.
- have [S sylS sPS] := Sylow_superset sP_MH pP.
- exact: IH (contra (abelianS sPS) not_cPP) sylS.
-have [sP_MH pP _] := and3P sylP; have [sPM sPH] := subsetIP sP_MH.
-have ncycP := contra (@cyclic_abelian _ _) not_cPP.
-have{sHp} sNMH: 'N(P) \subset M :&: H.
- by rewrite subsetI !(@norm_noncyclic_sigma _ p).
-have{sylP} sylP_M: p.-Sylow(M) P.
- have [S sylS sPS] := Sylow_superset sPM pP; have pS := pHall_pgroup sylS.
- have [-> // | ltPS] := eqVproper sPS.
- have /andP[sNP] := nilpotent_proper_norm (pgroup_nil pS) ltPS.
- rewrite (sub_pHall sylP _ sNP) ?subxx ?(pgroupS (subsetIl _ _)) //.
- by rewrite subIset // orbC sNMH.
-have{sMp} sylP_G: p.-Sylow(G) P := sigma_Sylow_G maxM sMp sylP_M.
-have sylP_H: p.-Sylow(H) P := pHall_subl sPH (subsetT H) sylP_G.
-have [rPgt2 | rPle2] := ltnP 2 'r(P).
- have uniqP: P \in 'U by rewrite rank3_Uniqueness ?(mFT_pgroup_proper pP).
- have defMP: 'M(P) = [set M] := def_uniq_mmax uniqP maxM sPM.
- by rewrite -val_eqE /= (eq_uniq_mmax defMP maxH).
-have rpP: 'r_p(P) = 2.
- apply/eqP; rewrite eqn_leq -{1}rank_pgroup // rPle2 ltnNge.
- by rewrite -odd_pgroup_rank1_cyclic ?mFT_odd.
-have:= mFT_rank2_Sylow_cprod sylP_G rPle2 not_cPP.
-case=> Q [not_cQQ dimQ eQ] [R cycR [defP defR1]].
-have sQP: Q \subset P by have /mulG_sub[] := cprodW defP.
-have pQ: p.-group Q := pgroupS sQP pP.
-have oQ: #|Q| = (p ^ 3)%N by rewrite (card_pgroup pQ) dimQ.
-have esQ: extraspecial Q by apply: (p3group_extraspecial pQ); rewrite ?dimQ.
-have p_pr := extraspecial_prime pQ esQ; have p_gt1 := prime_gt1 p_pr.
-pose Z := 'Z(Q)%G; have oZ: #|Z| = p := card_center_extraspecial pQ esQ.
-have nsZQ: Z <| Q := center_normal Q; have [sZQ nZQ] := andP nsZQ.
-have [[defPhiQ defQ'] _]: ('Phi(Q) = Z /\ Q^`(1) = Z) /\ _ := esQ.
-have defZ: 'Ohm_1 ('Z(P)) = Z.
- have [_ <- _] := cprodP (center_cprod defP).
- by rewrite (center_idP (cyclic_abelian cycR)) -defR1 mulSGid ?Ohm_sub.
-have ncycQ: ~~ cyclic Q := contra (@cyclic_abelian _ Q) not_cQQ.
-have rQgt1: 'r_p(Q) > 1.
- by rewrite ltnNge -(odd_pgroup_rank1_cyclic pQ) ?mFT_odd.
-have [A Ep2A]: exists A, A \in 'E_p^2(Q) by apply/p_rank_geP.
-wlog uniqNEpA: M H maxM maxH sP_MH sNMH sPM sPH sylP_M sylP_H /
- ~~ [exists A0 in 'E_p^1(A) :\ Z, 'M('N(A0)) == [set M]].
-- move=> IH; case: exists_inP (IH M H) => [[A0 EpA0 defMA0] _ | _ -> //].
- case: exists_inP {IH}(IH H M) => [[A1 EpA1 defMA1] _ | _]; last first.
- by rewrite setIC eq_sym => ->.
- have [sAQ abelA dimA] := pnElemP Ep2A; have sAP := subset_trans sAQ sQP.
- have transNP: [transitive 'N_P(A), on 'E_p^1(A) :\ Z | 'JG].
- have [|_ _] := basic_p2maxElem_structure _ pP sAP not_cPP.
- have Ep2A_G := subsetP (pnElemS p 2 (subsetT Q)) A Ep2A.
- rewrite inE Ep2A_G (subsetP (p_rankElem_max p G)) //.
- by rewrite -(p_rank_Sylow sylP_G) rpP.
- by rewrite (group_inj defZ).
- have [x NPx defA1] := atransP2 transNP EpA0 EpA1.
- have Mx: x \in M by rewrite (subsetP sPM) //; case/setIP: NPx.
- rewrite eq_sym -in_set1 -(group_inj (conjGid Mx)).
- by rewrite -(eqP defMA1) defA1 /= normJ mmax_ofJ (eqP defMA0) set11.
-apply: contraR uniqNEpA => neqHM; have sQM := subset_trans sQP sPM.
-suffices{A Ep2A} [ntMa nonuniqNZ]: M`_\alpha != 1 /\ 'M('N(Z)) != [set M].
- have [A0 EpA0 defMNA0]: exists2 A0, A0 \in 'E_p^1(A) & 'M('N(A0)) == [set M].
- apply/exists_inP; apply: contraR ntMa; rewrite negb_exists_in => uniqNA1.
- have{Ep2A} Ep2A: A \in 'E_p^2(M) := subsetP (pnElemS p 2 sQM) A Ep2A.
- by have [_ [//|_ ->]] := p2Elem_mmax maxM Ep2A.
- apply/exists_inP; exists A0; rewrite // 2!inE EpA0 andbT.
- by apply: contraNneq nonuniqNZ => <-.
-have coMaQ: coprime #|M`_\alpha| #|Q|.
- apply: pnat_coprime (pcore_pgroup _ _) (pi_pnat pQ _).
- by rewrite !inE -(p_rank_Sylow sylP_M) rpP.
-have nMaQ: Q \subset 'N(M`_\alpha) by rewrite (subset_trans sQM) ?gFnorm.
-have [coMaZ nMaZ] := (coprimegS sZQ coMaQ, subset_trans sZQ nMaQ).
-pose K := 'N_(M`_\alpha)(Z).
-have defKC: 'C_(M`_\alpha)(Z) = K by rewrite -coprime_norm_cent.
-have coKQ: coprime #|K| #|Q| := coprimeSg (subsetIl _ _) coMaQ.
-have nKQ: Q \subset 'N(K) by rewrite normsI ?norms_norm.
-have [coKZ nKZ] := (coprimegS sZQ coKQ, subset_trans sZQ nKQ).
-have sKH: K \subset H.
- have sZH := subset_trans sZQ (subset_trans sQP sPH).
- rewrite -(quotientSGK (subsetIr _ _) sZH) /= -/Z -/K.
- have cQQb: abelian (Q / Z) by rewrite -defQ' sub_der1_abelian.
- rewrite -(coprime_abelian_gen_cent cQQb) ?coprime_morph ?quotient_norms //.
- rewrite gen_subG /= -/K -/Z; apply/bigcupsP=> Ab; rewrite andbC; case/andP.
- case/(inv_quotientN nsZQ)=> A -> sZA nsAQ; have sAQ := normal_sub nsAQ.
- rewrite (isog_cyclic (third_isog _ _ _)) // -/Z => cycQA.
- have pA: p.-group A := pgroupS sAQ pQ.
- have rAgt1: 'r_p(A) > 1.
- have [-> // | ltAQ] := eqVproper sAQ.
- rewrite ltnNge -(odd_pgroup_rank1_cyclic pA) ?mFT_odd //.
- apply: contraL cycQA => cycA /=; have cAA := cyclic_abelian cycA.
- suff <-: Z :=: A by rewrite -defPhiQ (contra (@Phi_quotient_cyclic _ Q)).
- apply/eqP; rewrite eqEcard sZA /= oZ (card_pgroup pA) (leq_exp2l _ 1) //.
- by rewrite -abelem_cyclic // /abelem pA cAA (dvdn_trans (exponentS sAQ)).
- have [A1 EpA1] := p_rank_geP rAgt1.
- rewrite -(setIidPr (subset_trans sAQ (subset_trans sQP sPH))) pnElemI in EpA1.
- have{EpA1} [Ep2A1 sA1A]:= setIdP EpA1; rewrite inE in sA1A.
- have [sCA1_H _]: 'C(A1) \subset H /\ _ := p2Elem_mmax maxH Ep2A1.
- rewrite -quotient_TI_subcent ?(subset_trans sAQ) ?(coprime_TIg coKZ) //= -/K.
- by rewrite quotientS // subIset // orbC (subset_trans (centS sA1A)).
-have defM: M`_\alpha * (M :&: H) = M.
- rewrite setIC in sNMH *.
- have [defM eq_aM_bM] := nonuniq_norm_Sylow_pprod maxM maxH neqHM sylP_G sNMH.
- by rewrite [M`_\alpha](eq_pcore M eq_aM_bM).
-do [split; apply: contraNneq neqHM] => [Ma1 | uniqNZ].
- by rewrite -val_eqE /= (eq_mmax maxM maxH) // -defM Ma1 mul1g subsetIr.
-have [_ sNZM]: _ /\ 'N(Z) \subset M := mem_uniq_mmax uniqNZ.
-rewrite -val_eqE /= (eq_uniq_mmax uniqNZ maxH) //= -(setIidPr sNZM).
-have sZ_MH: Z \subset M :&: H := subset_trans sZQ (subset_trans sQP sP_MH).
-rewrite -(pprod_norm_coprime_prod defM) ?pcore_normal ?mmax_sol //.
-by rewrite mulG_subG /= defKC sKH setIAC subsetIr.
-Qed.
-
-(* This is B & G, Corollary 12.14. We have removed the redundant assumption *)
-(* p \in \sigma(M), and restricted the quantification over P to the part of *)
-(* the conclusion where it is mentioned. *)
-(* Usage note: it might be more convenient to state that P is a Sylow *)
-(* subgroup of M rather than M`_\sigma; check later use. *)
-Corollary cent_der_sigma_uniq M p X (Ms := M`_\sigma) :
- M \in 'M -> X \in 'E_p^1(M) -> (p \in \beta(M)) || (X \subset Ms^`(1)) ->
- 'M('C(X)) = [set M] /\ (forall P, p.-Sylow(Ms) P -> 'M(P) = [set M]).
-Proof.
-move=> maxM EpX bMp_sXMs'; have p_pr := pnElem_prime EpX.
-have [sXM abelX oX] := pnElemPcard EpX; have [pX _] := andP abelX.
-have ntX: X :!=: 1 := nt_pnElem EpX isT; have ltCXG := mFT_cent_proper ntX.
-have sMp: p \in \sigma(M).
- have [bMp | sXMs'] := orP bMp_sXMs'; first by rewrite beta_sub_sigma.
- rewrite -pnatE // -[p]oX; apply: pgroupS (subset_trans sXMs' (der_sub 1 _)) _.
- exact: pcore_pgroup.
-have hallMs: \sigma(M).-Hall(M) Ms by apply: Msigma_Hall.
-have sXMs: X \subset Ms by rewrite (sub_Hall_pcore hallMs) // /pgroup oX pnatE.
-have [P sylP sXP]:= Sylow_superset sXMs pX.
-have sylP_M: p.-Sylow(M) P := subHall_Sylow hallMs sMp sylP.
-have sylP_G := sigma_Sylow_G maxM sMp sylP_M.
-have [sPM pP _] := and3P sylP_M; have ltPG := mFT_pgroup_proper pP.
-suffices [-> uniqP]: 'M('C(X)) = [set M] /\ 'M(P) = [set M].
- split=> // Py sylPy; have [y Ms_y ->] := Sylow_trans sylP sylPy.
- rewrite (def_uniq_mmaxJ _ uniqP) (group_inj (conjGid _)) //.
- exact: subsetP (pcore_sub _ _) y Ms_y.
-have [rCPXgt2 | rCPXle2] := ltnP 2 'r_p('C_P(X)).
- have [sCPX_P sCPX_CX] := subsetIP (subxx 'C_P(X)).
- have [ltP ltCX] := (mFT_pgroup_proper pP, mFT_cent_proper ntX).
- have sCPX_M := subset_trans sCPX_P sPM.
- have ltCPX_G := sub_proper_trans sCPX_P ltPG.
- suff uniqCPX: 'M('C_P(X)) = [set M] by rewrite !(def_uniq_mmaxS _ _ uniqCPX).
- apply: (def_uniq_mmax (rank3_Uniqueness _ _)) => //.
- exact: leq_trans (p_rank_le_rank p _).
-have nnP: p.-narrow P.
- apply: wlog_neg; rewrite negb_imply; case/andP=> rP _.
- by apply/narrow_centP; rewrite ?mFT_odd //; exists X.
-have{bMp_sXMs'} [bM'p sXMs']: p \notin \beta(M) /\ X \subset Ms^`(1).
- move: bMp_sXMs'; rewrite !inE -negb_exists_in.
- by case: exists_inP => // [[]]; exists P.
-have defMs: 'O_p^'(Ms) ><| P = Ms.
- by have [_ hallMp' _] := beta_max_pdiv maxM bM'p; apply/sdprod_Hall_p'coreP.
-have{defMs} sXP': X \subset P^`(1).
- have{defMs} [_ defMs nMp'P tiMp'P] := sdprodP defMs.
- have [injMp'P imMp'P] := isomP (quotient_isom nMp'P tiMp'P).
- rewrite -(injmSK injMp'P) // morphim_der // {injMp'P}imMp'P morphim_restrm.
- rewrite (setIidPr sXP) /= -quotientMidl defMs -quotient_der ?quotientS //.
- by rewrite -defMs mul_subG ?normG.
-have [rPgt2 | rPle2] := ltnP 2 'r_p(P).
- case/eqP: ntX; rewrite -(setIidPl sXP').
- by case/(narrow_cent_dprod pP (mFT_odd P)): rCPXle2.
-have not_cPP: ~~ abelian P.
- by rewrite (sameP derG1P eqP) (subG1_contra sXP') ?ntX.
-have sXZ: X \subset 'Z(P).
- rewrite -rank_pgroup // in rPle2.
- have := mFT_rank2_Sylow_cprod sylP_G rPle2 not_cPP.
- case=> Q [not_cQQ dimQ _] [R]; move/cyclic_abelian=> cRR [defP _].
- have [_ mulQR _] := cprodP defP; have [sQP _] := mulG_sub mulQR.
- rewrite (subset_trans sXP') // -(der_cprod 1 defP) (derG1P cRR) cprodg1.
- have{dimQ} dimQ: logn p #|Q| <= 3 by rewrite dimQ.
- have [[_ ->] _] := p3group_extraspecial (pgroupS sQP pP) not_cQQ dimQ.
- by case/cprodP: (center_cprod defP) => _ <- _; apply: mulG_subl.
-have uniqP: 'M(P) = [set M].
- exact: def_uniq_mmax (nonabelian_Uniqueness pP not_cPP) maxM sPM.
-rewrite (def_uniq_mmaxS _ ltCXG uniqP) //.
-by rewrite centsC (subset_trans sXZ) // subsetIr.
-Qed.
-
-(* This is B & G, Proposition 12.15. *)
-Proposition sigma_subgroup_embedding M q X Mstar :
- M \in 'M -> q \in \sigma(M) -> X \subset M -> q.-group X -> X :!=: 1 ->
- Mstar \in 'M('N(X)) :\ M ->
- [/\ (*a*) gval Mstar \notin M :^: G,
- forall S, q.-Sylow(M :&: Mstar) S -> X \subset S ->
- (*b*) 'N(S) \subset M
- /\ (*c*) q.-Sylow(Mstar) S
- & if q \in \sigma(Mstar)
- (*d*) then
- [/\ (*1*) Mstar`_\beta * (M :&: Mstar) = Mstar,
- (*2*) {subset \tau1(Mstar) <= [predU \tau1(M) & \alpha(M)]}
- & (*3*) M`_\beta = M`_\alpha /\ M`_\alpha != 1]
- (*e*) else
- [/\ (*1*) q \in \tau2(Mstar),
- (*2*) {subset [predI \pi(M) & \sigma(Mstar)] <= \beta(Mstar)}
- & (*3*) \sigma(Mstar)^'.-Hall(Mstar) (M :&: Mstar)]].
-Proof.
-move: Mstar => H maxM sMq sXM qX ntX /setD1P[neqHM maxNX_H].
-have [q_pr _ _] := pgroup_pdiv qX ntX; have [maxH sNX_H] := setIdP maxNX_H.
-have sXH := subset_trans (normG X) sNX_H.
-have sX_MH: X \subset M :&: H by apply/subsetIP.
-have parts_bc S:
- q.-Sylow(M :&: H) S -> X \subset S -> 'N(S) \subset M /\ q.-Sylow(H) S.
-- move=> sylS sXS; have [sS_MH qS _] := and3P sylS.
- have [sSM sSH] := subsetIP sS_MH.
- have sNS_M: 'N(S) \subset M.
- have [cycS|] := boolP (cyclic S); last exact: norm_noncyclic_sigma qS _.
- have [T sylT sST] := Sylow_superset sSM qS; have [sTM qT _] := and3P sylT.
- rewrite -(nilpotent_sub_norm (pgroup_nil qT) sST).
- exact: norm_sigma_Sylow sylT.
- rewrite (sub_pHall sylS (pgroupS (subsetIl T _) qT)) //.
- by rewrite subsetI sST normG.
- by rewrite setISS // (subset_trans (char_norms _) sNX_H) // sub_cyclic_char.
- split=> //; have [T sylT sST] := Sylow_superset sSH qS.
- have [sTH qT _] := and3P sylT.
- rewrite -(nilpotent_sub_norm (pgroup_nil qT) sST) //.
- rewrite (sub_pHall sylS (pgroupS (subsetIl T _) qT)) //=.
- by rewrite subsetI sST normG.
- by rewrite /= setIC setISS.
-have [S sylS sXS] := Sylow_superset sX_MH qX; have [sS_MH qS _] := and3P sylS.
-have [sSM sSH] := subsetIP sS_MH; have [sNS_M sylS_H] := parts_bc S sylS sXS.
-have notMGH: gval H \notin M :^: G.
- by apply: mmax_norm_notJ maxM maxH qX sXM sNX_H _; rewrite sMq eq_sym neqHM.
-have /orP[sHq | t2Hq] := prime_class_mmax_norm maxH qX sNX_H; last first.
- have [/= sH'q rqH] := andP t2Hq; rewrite [q \in _](negPf sH'q); split=> //.
- have [A Eq2A] := p_rank_witness q S; have [sAS abelA dimA] := pnElemP Eq2A.
- rewrite (p_rank_Sylow sylS_H) (eqP rqH) in dimA; have [qA _] := andP abelA.
- have [sAH sAM] := (subset_trans sAS sSH, subset_trans sAS sSM).
- have [F hallF sAF] := Hall_superset (mmax_sol maxH) sAH (pi_pnat qA sH'q).
- have tiHsM: H`_\sigma :&: M = 1.
- have{Eq2A} Eq2A: A \in 'E_q^2(H) by apply/pnElemP.
- have [_ _ _ -> //] := tau2_context maxH t2Hq Eq2A.
- by rewrite 3!inE eq_sym neqHM maxM.
- have{Eq2A} Eq2A_F: A \in 'E_q^2(F) by apply/pnElemP.
- have [[nsAF _] [sCA_F _ _] _ TIsH]
- := tau2_compl_context maxH hallF t2Hq Eq2A_F.
- have sNA_M: 'N(A) \subset M.
- apply: norm_noncyclic_sigma maxM sMq qA sAM _.
- by rewrite (abelem_cyclic abelA) dimA.
- have ->: M :&: H = F.
- have [[_ <- _ _] [_ nAF]] := (sdprodP (sdprod_sigma maxH hallF), andP nsAF).
- by rewrite -(group_modr _ (subset_trans nAF sNA_M)) setIC tiHsM mul1g.
- split=> // p /andP[/= piMp sHp]; apply: wlog_neg => bH'p.
- have bM'q: q \notin \beta(M).
- by rewrite -predI_sigma_beta // inE /= sMq; case/tau2_not_beta: t2Hq.
- have sM'p: p \notin \sigma(M).
- rewrite orbit_sym in notMGH; have [_ TIsHM] := TIsH M maxM notMGH.
- by have:= TIsHM p; rewrite inE /= sHp /= => ->.
- have p'CA: p^'.-group 'C(A).
- by rewrite (pgroupS sCA_F) // (pi'_p'group (pHall_pgroup hallF)).
- have p_pr: prime p by rewrite mem_primes in piMp; case/andP: piMp.
- have [lt_pq | lt_qp | eq_pq] := ltngtP p q; last 1 first.
- - by rewrite eq_pq sMq in sM'p.
- - have bH'q: q \notin \beta(H) by apply: contra sH'q; apply: beta_sub_sigma.
- have [|[P sylP cPA] _ _] := beta'_cent_Sylow maxH bH'p bH'q qA.
- by rewrite lt_pq sAH orbT.
- have sylP_H := subHall_Sylow (Msigma_Hall maxH) sHp sylP.
- have piPp: p \in \pi(P).
- by rewrite -p_rank_gt0 (p_rank_Sylow sylP_H) p_rank_gt0 sigma_sub_pi.
- by rewrite centsC in cPA; case/eqnP: (pnatPpi (pgroupS cPA p'CA) piPp).
- have bM'p: p \notin \beta(M) by apply: contra sM'p; apply: beta_sub_sigma.
- have [P sylP] := Sylow_exists p M; have [sMP pP _] := and3P sylP.
- have [|[Q1 sylQ1 cQ1P] _ _] := beta'_cent_Sylow maxM bM'q bM'p pP.
- by rewrite lt_qp sMP orbT.
- have sylQ1_M := subHall_Sylow (Msigma_Hall maxM) sMq sylQ1.
- have [x Mx sAQ1x] := Sylow_subJ sylQ1_M sAM qA.
- have sPxCA: P :^ x \subset 'C(A) by rewrite (centsS sAQ1x) // centJ conjSg.
- have piPx_p: p \in \pi(P :^ x).
- by rewrite /= cardJg -p_rank_gt0 (p_rank_Sylow sylP) p_rank_gt0.
- by case/eqnP: (pnatPpi (pgroupS sPxCA p'CA) piPx_p).
-rewrite sHq; split=> //.
-have sNS_HM: 'N(S) \subset H :&: M by rewrite subsetI (norm_sigma_Sylow sHq).
-have sylS_G: q.-Sylow(G) S := sigma_Sylow_G maxH sHq sylS_H.
-have [defM eq_abM] := nonuniq_norm_Sylow_pprod maxM maxH neqHM sylS_G sNS_HM.
-rewrite setIC eq_sym in sNS_HM neqHM defM.
-have [defH eq_abH] := nonuniq_norm_Sylow_pprod maxH maxM neqHM sylS_G sNS_HM.
-rewrite [M`_\alpha](eq_pcore M eq_abM) -/M`_\beta.
-split=> // [r t1Hr|]; last first.
- split=> //; apply: contraNneq neqHM => Mb1.
- by rewrite -val_eqE /= (eq_mmax maxM maxH) // -defM Mb1 mul1g subsetIr.
-have [R sylR] := Sylow_exists r (M :&: H); have [sR_MH rR _] := and3P sylR.
-have [sRM sRH] := subsetIP sR_MH; have [sH'r rrH not_rH'] := and3P t1Hr.
-have bH'r: r \notin \beta(H).
- by apply: contra sH'r; rewrite -eq_abH; apply: alpha_sub_sigma.
-have sylR_H: r.-Sylow(H) R.
- rewrite pHallE sRH -defH -LagrangeMr partnM ?cardG_gt0 //.
- rewrite -(card_Hall sylR) part_p'nat ?mul1n ?(pnat_dvd (dvdn_indexg _ _)) //=.
- by rewrite (pi_p'nat (pcore_pgroup _ _)).
-rewrite inE /= orbC -implyNb eq_abM; apply/implyP=> bM'r.
-have sylR_M: r.-Sylow(M) R.
- rewrite pHallE sRM -defM -LagrangeMr partnM ?cardG_gt0 //.
- rewrite -(card_Hall sylR) part_p'nat ?mul1n ?(pnat_dvd (dvdn_indexg _ _)) //=.
- by rewrite (pi_p'nat (pcore_pgroup _ _)).
-have rrR: 'r_r(R) = 1%N by rewrite (p_rank_Sylow sylR_H) (eqP rrH).
-have piRr: r \in \pi(R) by rewrite -p_rank_gt0 rrR.
-suffices not_piM'r: r \notin \pi(M^`(1)).
- rewrite inE /= -(p_rank_Sylow sylR_M) rrR /= -negb_or /=.
- apply: contra not_piM'r; case/orP=> [sMr | rM'].
- have sRMs: R \subset M`_\sigma.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) ?(pi_pgroup rR).
- by rewrite (piSg (Msigma_der1 maxM)) // (piSg sRMs).
- by move: piRr; rewrite !mem_primes !cardG_gt0; case/andP=> ->.
-have coMbR: coprime #|M`_\beta| #|R|.
- exact: pnat_coprime (pcore_pgroup _ _) (pi_pnat rR _).
-have sylRM': r.-Sylow(M^`(1)) _ := Hall_setI_normal (der_normal 1 M) sylR_M.
-rewrite -p'groupEpi -partG_eq1 -(card_Hall sylRM') -trivg_card1 /=.
-rewrite (pprod_focal_coprime defM (pcore_normal _ _)) //.
-rewrite coprime_TIg ?(pnat_coprime rR (pgroupS (dergS 1 (subsetIr _ _)) _)) //.
-by rewrite p'groupEpi mem_primes (negPf not_rH') !andbF.
-Qed.
-
-(* This is B & G, Corollary 12.16. *)
-Corollary sigma_Jsub M Y :
- M \in 'M -> \sigma(M).-group Y -> Y :!=: 1 ->
- [/\ exists x, Y :^ x \subset M`_\sigma
- & forall E p H,
- \sigma(M)^'.-Hall(M) E -> p \in \pi(E) -> p \notin \beta(G) ->
- H \in 'M(Y) -> gval H \notin M :^: G ->
- [/\ (*a*) 'r_p('N_H(Y)) <= 1
- & (*b*) p \in \tau1(M) -> p \notin \pi(('N_H(Y))^`(1))]].
-Proof.
-move=> maxM sM_Y ntY.
-have ltYG: Y \proper G.
- have ltMsG: M`_\sigma \proper G.
- exact: sub_proper_trans (pcore_sub _ _) (mmax_proper maxM).
- rewrite properEcard subsetT (leq_ltn_trans _ (proper_card ltMsG)) //.
- rewrite dvdn_leq ?cardG_gt0 // (card_Hall (Msigma_Hall_G maxM)).
- by rewrite -(part_pnat_id sM_Y) partn_dvd // cardSg ?subsetT.
-have [q q_pr rFY] := rank_witness 'F(Y).
-have [X [ntX qX charX]]: exists X, [/\ gval X :!=: 1, q.-group X & X \char Y].
- exists ('O_q(Y))%G; rewrite pcore_pgroup pcore_char //.
- rewrite -rank_gt0 /= -p_core_Fitting.
- rewrite (rank_Sylow (nilpotent_pcore_Hall q (Fitting_nil Y))) -rFY.
- by rewrite rank_gt0 (trivg_Fitting (mFT_sol ltYG)).
-have sXY: X \subset Y := char_sub charX.
-have sMq: q \in \sigma(M).
- apply: (pnatPpi (pgroupS sXY sM_Y)).
- by rewrite -p_rank_gt0 -(rank_pgroup qX) rank_gt0.
-without loss sXMs: M maxM sM_Y sMq / X \subset M`_\sigma.
- move=> IH; have [Q sylQ] := Sylow_exists q M`_\sigma.
- have sQMs := pHall_sub sylQ.
- have sylQ_G := subHall_Sylow (Msigma_Hall_G maxM) sMq sylQ.
- have [x Gx sXQx] := Sylow_subJ sylQ_G (subsetT X) qX.
- have: X \subset M`_\sigma :^ x by rewrite (subset_trans sXQx) ?conjSg.
- rewrite -MsigmaJ => /IH; rewrite sigmaJ mmaxJ (eq_pgroup _ (sigmaJ _ _)).
- case=> // [[y sYyMx] parts_ab].
- split=> [|E p H hallE piEp bG'p maxY_H notMGH].
- by exists (y * x^-1); rewrite conjsgM sub_conjgV -MsigmaJ.
- have:= parts_ab (E :^ x)%G p H; rewrite tau1J /= cardJg pHallJ2.
- rewrite (eq_pHall _ _ (eq_negn (sigmaJ _ _))).
- by rewrite 2!orbit_sym (orbit_eqP (mem_orbit _ _ _)) //; apply.
-have pre_part_a E p H:
- \sigma(M)^'.-Hall(M) E -> p \in \pi(E) ->
- H \in 'M(Y) -> gval H \notin M :^: G -> 'r_p(H :&: M) <= 1.
-- move=> hallE piEp /setIdP[maxH sYH] notMGH; rewrite leqNgt.
- apply: contra ntX => /p_rank_geP[A /pnElemP[/subsetIP[sAH sAM] abelA dimA]].
- have{abelA dimA} Ep2A: A \in 'E_p^2(M) by apply/pnElemP.
- have rpMgt1: 'r_p(M) > 1 by apply/p_rank_geP; exists A.
- have t2Mp: p \in \tau2(M).
- move: piEp; rewrite (partition_pi_sigma_compl maxM hallE) orbCA orbC.
- by rewrite -2!andb_orr orNb eqn_leq leqNgt rpMgt1 !andbF.
- have sM'p := pnatPpi (pHall_pgroup hallE) piEp.
- have [_ _ _ tiMsH _] := tau2_context maxM t2Mp Ep2A.
- rewrite -subG1 -(tiMsH H); first by rewrite subsetI sXMs (subset_trans sXY).
- by rewrite 3!inE maxH (contra_orbit _ _ notMGH).
-have [sNX_M | not_sNX_M] := boolP ('N(X) \subset M).
- have sNY_M: 'N(Y) \subset M := subset_trans (char_norms charX) sNX_M.
- split=> [|E p H hallE piEp bG'p maxY_H notMGH]; last split.
- - exists 1; rewrite act1 (sub_Hall_pcore (Msigma_Hall maxM)) //.
- exact: subset_trans (normG Y) sNY_M.
- - rewrite (leq_trans (p_rankS p (setIS H sNY_M))) ?(pre_part_a E) //.
- case/and3P=> _ _; apply: contra; rewrite mem_primes => /and3P[_ _ pM'].
- by apply: dvdn_trans pM' (cardSg (dergS 1 _)); rewrite subIset ?sNY_M ?orbT.
-have [L maxNX_L] := mmax_exists (mFT_norm_proper ntX (mFT_pgroup_proper qX)).
-have [maxL sNX_L] := setIdP maxNX_L.
-have{maxNX_L} maxNX_L: L \in 'M('N(X)) :\ M.
- by rewrite 2!inE maxNX_L andbT; apply: contraNneq not_sNX_M => <-.
-have sXM := subset_trans sXMs (pcore_sub _ M).
-have [notMGL _ embedL] := sigma_subgroup_embedding maxM sMq sXM qX ntX maxNX_L.
-pose K := (if q \in \sigma(L) then L`_\beta else L`_\sigma)%G.
-have sM'K: \sigma(M)^'.-group K.
- rewrite orbit_sym in notMGL.
- rewrite /K; case: (boolP (q \in _)) embedL => [sLq _ | sL'q [t2Lq _ _]].
- have [_ TIaLsM _] := sigma_disjoint maxL maxM notMGL.
- apply: sub_pgroup (pcore_pgroup _ _) => p bLp.
- by apply: contraFN (TIaLsM p) => /= sMp; rewrite inE /= beta_sub_alpha.
- have [F hallF] := ex_sigma_compl maxL.
- have [A Ep2A _] := ex_tau2Elem hallF t2Lq.
- have [_ _ _ TIsLs] := tau2_compl_context maxL hallF t2Lq Ep2A.
- have{TIsLs} [_ TIsLsM] := TIsLs M maxM notMGL.
- apply: sub_pgroup (pcore_pgroup _ _) => p sLp.
- by apply: contraFN (TIsLsM p) => /= sMp; rewrite inE /= sLp.
-have defL: K * (M :&: L) = L.
- rewrite /K; case: (q \in _) embedL => [] [] // _ _.
- by move/(sdprod_Hall_pcoreP (Msigma_Hall maxL)); case/sdprodP.
-have sYL := subset_trans (char_norm charX) sNX_L.
-have [x sYxMs]: exists x, Y :^ x \subset M`_\sigma.
- have solML := solvableS (subsetIl M L) (mmax_sol maxM).
- have [H hallH] := Hall_exists \sigma(M) solML.
- have [sHM sHL] := subsetIP (pHall_sub hallH).
- have hallH_L: \sigma(M).-Hall(L) H.
- rewrite pHallE sHL -defL -LagrangeMr partnM ?cardG_gt0 //.
- rewrite -(card_Hall hallH) part_p'nat ?mul1n //=.
- exact: pnat_dvd (dvdn_indexg _ _) sM'K.
- have [x _ sYxH]:= Hall_Jsub (mmax_sol maxL) hallH_L sYL sM_Y.
- exists x; rewrite (sub_Hall_pcore (Msigma_Hall maxM)) ?pgroupJ //.
- exact: subset_trans sYxH sHM.
-split=> [|E p H hallE piEp bG'p maxY_H notMGH]; first by exists x.
-have p'K: p^'.-group K.
- have bL'p: p \notin \beta(L).
- by rewrite -predI_sigma_beta // negb_and bG'p orbT.
- rewrite /K; case: (q \in _) embedL => [_ | [_ bLp _]].
- by rewrite (pi_p'group (pcore_pgroup _ _)).
- rewrite (pi_p'group (pcore_pgroup _ _)) //; apply: contra bL'p => /= sLp.
- by rewrite bLp // inE /= (piSg (pHall_sub hallE)).
-have sNHY_L: 'N_H(Y) \subset L.
- by rewrite subIset ?(subset_trans (char_norms charX)) ?orbT.
-rewrite (leq_trans (p_rankS p sNHY_L)); last first.
- have [P sylP] := Sylow_exists p (M :&: L).
- have [_ sPL] := subsetIP (pHall_sub sylP).
- have{sPL} sylP_L: p.-Sylow(L) P.
- rewrite pHallE sPL -defL -LagrangeMr partnM ?cardG_gt0 //.
- rewrite -(card_Hall sylP) part_p'nat ?mul1n //=.
- exact: pnat_dvd (dvdn_indexg _ _) p'K.
- rewrite -(p_rank_Sylow sylP_L) {P sylP sylP_L}(p_rank_Sylow sylP).
- by rewrite /= setIC (pre_part_a E) // inE maxL.
-split=> // t1Mp; rewrite (contra ((piSg (dergS 1 sNHY_L)) p)) // -p'groupEpi.
-have nsKL: K <| L by rewrite /K; case: ifP => _; apply: pcore_normal.
-have [sKL nKL] := andP nsKL; have nKML := subset_trans (subsetIr M L) nKL.
-suffices: p^'.-group (K * (M :&: L)^`(1)).
- rewrite -norm_joinEr ?gFsub_trans //; apply: pgroupS => /=.
- rewrite norm_joinEr -?quotientSK ?gFsub_trans //= !quotient_der //.
- by rewrite -[in L / K]defL quotientMidl.
-rewrite pgroupM p'K (pgroupS (dergS 1 (subsetIl M L))) // p'groupEpi.
-by rewrite mem_primes andbA andbC negb_and; case/and3P: t1Mp => _ _ ->.
-Qed.
-
-(* This is B & G, Lemma 12.17. *)
-Lemma sigma_compl_embedding M E (Ms := M`_\sigma) :
- M \in 'M -> \sigma(M)^'.-Hall(M) E ->
- [/\ 'C_Ms(E) \subset Ms^`(1), [~: Ms, E] = Ms
- & forall g (MsMg := Ms :&: M :^ g), g \notin M ->
- [/\ cyclic MsMg, \beta(M)^'.-group MsMg & MsMg :&: Ms^`(1) = 1]].
-Proof.
-move=> maxM hallE; have [sEM s'E _] := and3P hallE.
-have solMs: solvable Ms := solvableS (pcore_sub _ _) (mmax_sol maxM).
-have defM := coprime_der1_sdprod (sdprod_sigma maxM hallE).
-have{s'E} coMsE: coprime #|Ms| #|E| := pnat_coprime (pcore_pgroup _ _) s'E.
-have{defM coMsE} [-> ->] := defM coMsE solMs (Msigma_der1 maxM).
-split=> // g MsMg notMg.
-have sMsMg: \sigma(M).-group MsMg := pgroupS (subsetIl _ _) (pcore_pgroup _ _).
-have EpMsMg p n X: X \in 'E_p^n(MsMg) -> n > 0 ->
- n = 1%N /\ ~~ ((p \in \beta(M)) || (X \subset Ms^`(1))).
-- move=> EpX n_gt0; have [sXMsMg abelX dimX] := pnElemP EpX.
- have [[sXMs sXMg] [pX _]] := (subsetIP sXMsMg, andP abelX).
- have sXM := subset_trans sXMs (pcore_sub _ _).
- have piXp: p \in \pi(X) by rewrite -p_rank_gt0 p_rank_abelem ?dimX.
- have sMp: p \in \sigma(M) := pnatPpi (pgroupS sXMs (pcore_pgroup _ _)) piXp.
- have not_sCX_M: ~~ ('C(X) \subset M).
- apply: contra notMg => sCX_M; rewrite -groupV.
- have [transCX _ _] := sigma_group_trans maxM sMp pX.
- have [|c CXc [m Mm ->]] := transCX g^-1 sXM; rewrite ?sub_conjgV //.
- by rewrite groupM // (subsetP sCX_M).
- have cycX: cyclic X.
- apply: contraR not_sCX_M => ncycX; apply: subset_trans (cent_sub _) _.
- exact: norm_noncyclic_sigma maxM sMp pX sXM ncycX.
- have n1: n = 1%N by apply/eqP; rewrite eqn_leq -{1}dimX -abelem_cyclic ?cycX.
- rewrite n1 in dimX *; split=> //; apply: contra not_sCX_M.
- by case/cent_der_sigma_uniq=> //; [apply/pnElemP | case/mem_uniq_mmax].
-have tiMsMg_Ms': MsMg :&: Ms^`(1) = 1.
- apply/eqP/idPn; rewrite -rank_gt0 => /rank_geP[X /nElemP[p]].
- case/pnElemP=> /subsetIP[sXMsMg sXMs'] abelX dimX.
- by case: (EpMsMg p 1%N X) => //; [apply/pnElemP | rewrite sXMs' orbT].
-split=> //; last first.
- apply: sub_in_pnat sMsMg => p.
- by rewrite -p_rank_gt0 => /p_rank_geP[X /EpMsMg[] // _ /norP[]].
-rewrite abelian_rank1_cyclic.
- by rewrite leqNgt; apply/rank_geP=> [[X /nElemP[p /EpMsMg[]]]].
-by rewrite (sameP derG1P trivgP) -tiMsMg_Ms' subsetI der_sub dergS ?subsetIl.
-Qed.
-
-(* This is B & G, Lemma 12.18. *)
-(* We corrected an omission in the text, which fails to quote Lemma 10.3 to *)
-(* justify the two p-rank inequalities (12.5) and (12.6), and indeed *)
-(* erroneously refers to 12.2(a) for (12.5). Note also that the loosely *)
-(* justified equalities of Ohm_1 subgroups are in fact unnecessary. *)
-Lemma cent_Malpha_reg_tau1 M p q P Q (Ma := M`_\alpha) :
- M \in 'M -> p \in \tau1(M) -> q \in p^' -> P \in 'E_p^1(M) -> Q :!=: 1 ->
- P \subset 'N(Q) -> 'C_Q(P) = 1 -> 'M('N(Q)) != [set M] ->
- [/\ (*a*) Ma != 1 -> q \notin \alpha(M) -> q.-group Q -> Q \subset M ->
- 'C_Ma(P) != 1 /\ 'C_Ma(Q <*> P) = 1
- & (*b*) q.-Sylow(M) Q ->
- [/\ \alpha(M) =i \beta(M), Ma != 1, q \notin \alpha(M),
- 'C_Ma(P) != 1 & 'C_Ma(Q <*> P) = 1]].
-Proof.
-move=> maxM t1p p'q EpP ntQ nQP regPQ nonuniqNQ.
-set QP := Q <*> P; set CaQP := 'C_Ma(QP); set part_a := _ -> _.
-have ssolM := solvableS _ (mmax_sol maxM).
-have [sPM abelP oP] := pnElemPcard EpP; have{abelP} [pP _] := andP abelP.
-have p_pr := pnElem_prime EpP; have [s'p _] := andP t1p.
-have a'p: p \in \alpha(M)^' by apply: contra s'p; apply: alpha_sub_sigma.
-have{a'p} [a'P t2'p] := (pi_pgroup pP a'p, tau2'1 t1p).
-have uniqCMX: 'M('C_M(_)) = [set M] := def_uniq_mmax _ maxM (subsetIl _ _).
-have nQ_CMQ: 'C_M(Q) \subset 'N(Q) by rewrite setIC subIset ?cent_sub.
-have part_a_holds: part_a.
- move=> ntMa a'q qQ sQM; have{p'q} p'Q := pi_pgroup qQ p'q.
- have{p'Q} coQP: coprime #|Q| #|P| by rewrite coprime_sym (pnat_coprime pP).
- have{a'q} a'Q: \alpha(M)^'.-group Q by rewrite (pi_pgroup qQ).
- have rCMaQle1: 'r('C_Ma(Q)) <= 1.
- rewrite leqNgt; apply: contra nonuniqNQ => rCMaQgt1; apply/eqP.
- apply: def_uniq_mmaxS (uniqCMX Q _) => //; last exact: cent_alpha'_uniq.
- exact: mFT_norm_proper (mFT_pgroup_proper qQ).
- have rCMaPle1: 'r('C_Ma(P)) <= 1.
- have: ~~ ('N(P) \subset M).
- by apply: contra (prime_class_mmax_norm maxM pP) _; apply/norP.
- rewrite leqNgt; apply: contra => rCMaPgt1.
- apply: (sub_uniq_mmax (uniqCMX P _)); first exact: cent_alpha'_uniq.
- by rewrite /= setIC subIset ?cent_sub.
- exact: mFT_norm_proper (nt_pnElem EpP _) (mFT_pgroup_proper pP).
- have [sMaM nMaM] := andP (pcore_normal _ M : Ma <| M).
- have aMa: \alpha(M).-group Ma by rewrite pcore_pgroup.
- have nMaQP: QP \subset 'N(Ma) by rewrite join_subG !(subset_trans _ nMaM).
- have{nMaM} coMaQP: coprime #|Ma| #|QP|.
- by rewrite (pnat_coprime aMa) ?[QP]norm_joinEr // [pnat _ _]pgroupM ?a'Q.
- pose r := pdiv #|if CaQP == 1 then Ma else CaQP|.
- have{ntMa} piMar: r \in \pi(Ma).
- rewrite /r; case: ifPn => [_| ntCaQP]; first by rewrite pi_pdiv cardG_gt1.
- by rewrite (piSg (subsetIl Ma 'C(QP))) // pi_pdiv cardG_gt1.
- have{aMa} a_r: r \in \alpha(M) := pnatPpi aMa piMar.
- have [r'Q r'P] : r^'.-group Q /\ r^'.-group P by rewrite !(pi'_p'group _ a_r).
- have [Rc /= sylRc] := Sylow_exists r [group of CaQP].
- have [sRcCaQP rRc _] := and3P sylRc; have [sRcMa cQPRc] := subsetIP sRcCaQP.
- have nRcQP: QP \subset 'N(Rc) by rewrite cents_norm // centsC.
- have{nMaQP rRc coMaQP sRcCaQP sRcMa nRcQP} [R [sylR nR_QP sRcR]] :=
- coprime_Hall_subset nMaQP coMaQP (ssolM _ sMaM) sRcMa rRc nRcQP.
- have{nR_QP} [[sRMa rR _] [nRQ nRP]] := (and3P sylR, joing_subP nR_QP).
- have{piMar} ntR: R :!=: 1 by rewrite -rank_gt0 (rank_Sylow sylR) p_rank_gt0.
- have [r_pr _ _] := pgroup_pdiv rR ntR.
- have sylR_M := subHall_Sylow (Malpha_Hall maxM) a_r sylR.
- have{rCMaQle1 a_r} not_cRQ: ~~ (Q \subset 'C(R)).
- apply: contraL rCMaQle1; rewrite centsC => cQR; rewrite -ltnNge ltnW //.
- by rewrite (leq_trans a_r) // -(rank_Sylow sylR_M) rankS // subsetI sRMa.
- have [R1 [charR1 _ _ expR1 rCR1_AutR]] := critical_odd rR (mFT_odd R) ntR.
- have [sR1R nR1R] := andP (char_normal charR1); have rR1 := pgroupS sR1R rR.
- have [nR1P nR1Q] := (char_norm_trans charR1 nRP, char_norm_trans charR1 nRQ).
- have [coR1Q coR1P] := (pnat_coprime rR1 r'Q, pnat_coprime rR1 r'P).
- have {rCR1_AutR not_cRQ} not_cR1Q: ~~ (Q \subset 'C(R1)).
- apply: contra not_cRQ => cR1Q; rewrite -subsetIidl.
- rewrite -quotient_sub1 ?normsI ?normG ?norms_cent // subG1 trivg_card1.
- rewrite (pnat_1 _ (quotient_pgroup _ r'Q)) //= -ker_conj_aut.
- rewrite (card_isog (first_isog_loc _ _)) //; apply: pgroupS rCR1_AutR.
- apply/subsetP=> za; case/morphimP=> z nRz Qz ->; rewrite inE Aut_aut inE.
- apply/subsetP=> x R1x; rewrite inE [_ x _]norm_conj_autE ?(subsetP sR1R) //.
- by rewrite /conjg -(centsP cR1Q z) ?mulKg.
- pose R0 := 'C_R1(Q); have sR0R1: R0 \subset R1 := subsetIl R1 'C(Q).
- have nR0P: P \subset 'N(R0) by rewrite normsI ?norms_cent.
- have nR0Q: Q \subset 'N(R0) by rewrite normsI ?norms_cent ?normG.
- pose R1Q := R1 <*> Q; have defR1Q: R1 * Q = R1Q by rewrite -norm_joinEr.
- have [[sR1_R1Q sQ_R1Q] tiR1Q] := (joing_sub (erefl R1Q), coprime_TIg coR1Q).
- have not_nilR1Q: ~~ nilpotent R1Q.
- by apply: contra not_cR1Q => /sub_nilpotent_cent2; apply.
- have not_nilR1Qb: ~~ nilpotent (R1Q / R0).
- apply: contra not_cR1Q => nilR1Qb.
- have [nilR1 solR1] := (pgroup_nil rR1, pgroup_sol rR1).
- rewrite centsC -subsetIidl -(nilpotent_sub_norm nilR1 sR0R1) //= -/R0.
- rewrite -(quotientSGK (subsetIr R1 _)) ?coprime_quotient_cent //= -/R0.
- rewrite quotientInorm subsetIidl /= centsC -/R0.
- by rewrite (sub_nilpotent_cent2 nilR1Qb) ?quotientS ?coprime_morph.
- have coR1QP: coprime #|R1Q| #|P|.
- by rewrite -defR1Q TI_cardMg // coprime_mull coR1P.
- have defR1QP: R1Q ><| P = R1Q <*> P.
- by rewrite sdprodEY ?normsY ?coprime_TIg.
- have sR1Ma := subset_trans sR1R sRMa; have sR1M := subset_trans sR1Ma sMaM.
- have solR1Q: solvable R1Q by rewrite ssolM // !join_subG sR1M.
- have solR1QP: solvable (R1Q <*> P) by rewrite ssolM // !join_subG sR1M sQM.
- have defCR1QP: 'C_R1Q(P) = 'C_R1(P).
- by rewrite -defR1Q -subcent_TImulg ?regPQ ?mulg1 //; apply/subsetIP.
- have ntCR1P: 'C_R1(P) != 1.
- apply: contraNneq not_nilR1Q => regPR1.
- by rewrite (prime_Frobenius_sol_kernel_nil defR1QP) ?oP ?defCR1QP.
- split; first exact: subG1_contra (setSI _ sR1Ma) ntCR1P.
- have{rCMaPle1} cycCRP: cyclic 'C_R(P).
- have rCRP: r.-group 'C_R(P) := pgroupS (subsetIl R _) rR.
- rewrite (odd_pgroup_rank1_cyclic rCRP) ?mFT_odd -?rank_pgroup {rCRP}//.
- by rewrite (leq_trans (rankS _) rCMaPle1) ?setSI.
- have{ntCR1P} oCR1P: #|'C_R1(P)| = r.
- have cycCR1P: cyclic 'C_R1(P) by rewrite (cyclicS _ cycCRP) ?setSI.
- apply: cyclic_abelem_prime ntCR1P => //.
- by rewrite abelemE ?cyclic_abelian // -expR1 exponentS ?subsetIl.
- apply: contraNeq not_nilR1Qb => ntCaQP.
- have{Rc sRcR sylRc cQPRc ntCaQP} ntCRQP: 'C_R(QP) != 1.
- suffices: Rc :!=: 1 by apply: subG1_contra; apply/subsetIP.
- rewrite -rank_gt0 (rank_Sylow sylRc) p_rank_gt0.
- by rewrite /r (negPf ntCaQP) pi_pdiv cardG_gt1.
- have defR1QPb: (R1Q / R0) ><| (P / R0) = R1Q <*> P / R0.
- have [_ <- nR1QP _] := sdprodP defR1QP; rewrite quotientMr //.
- by rewrite sdprodE ?quotient_norms // coprime_TIg ?coprime_morph.
- have tiPR0: R0 :&: P = 1 by rewrite coprime_TIg // (coprimeSg sR0R1).
- have prPb: prime #|P / R0| by rewrite -(card_isog (quotient_isog _ _)) ?oP.
- rewrite (prime_Frobenius_sol_kernel_nil defR1QPb) ?quotient_sol //.
- rewrite -coprime_quotient_cent ?(subset_trans sR0R1) // quotientS1 //=.
- rewrite defCR1QP -{2}(setIidPl sR1R) -setIA subsetI subsetIl.
- apply: subset_trans (setIS R (centS (joing_subl Q P))).
- rewrite -(cardSg_cyclic cycCRP) ?setIS ?setSI ?centS ?joing_subr // oCR1P.
- by have [_ -> _] := pgroup_pdiv (pgroupS (subsetIl R _) rR) ntCRQP.
-split=> // sylQ; have [sQM qQ _] := and3P sylQ.
-have ltQG := mFT_pgroup_proper qQ; have ltNQG := mFT_norm_proper ntQ ltQG.
-have{p'q} p'Q := pi_pgroup qQ p'q.
-have{p'Q} coQP: coprime #|Q| #|P| by rewrite coprime_sym (pnat_coprime pP).
-have sQM': Q \subset M^`(1).
- by rewrite -(coprime_cent_prod nQP) ?ssolM // regPQ mulg1 commgSS.
-have ntMa: Ma != 1.
- apply: contraNneq nonuniqNQ => Ma1.
- rewrite (mmax_normal maxM _ ntQ) ?mmax_sup_id //.
- have sylQ_M': q.-Sylow(M^`(1)) Q := pHall_subl sQM' (der_sub 1 M) sylQ.
- rewrite (nilpotent_Hall_pcore _ sylQ_M') ?gFnormal_trans //.
- by rewrite (isog_nil (quotient1_isog _)) -Ma1 Malpha_quo_nil.
-have a'q: q \notin \alpha(M).
- apply: contra nonuniqNQ => a_q.
- have uniqQ: Q \in 'U by rewrite rank3_Uniqueness ?(rank_Sylow sylQ).
- by rewrite (def_uniq_mmaxS _ _ (def_uniq_mmax _ _ sQM)) ?normG.
-have b'q := contra (@beta_sub_alpha _ M _) a'q.
-case: part_a_holds => // ntCaP regQP; split=> {ntCaP regQP}// r.
-apply/idP/idP=> [a_r | ]; last exact: beta_sub_alpha.
-apply: contraR nonuniqNQ => b'r; apply/eqP.
-apply: def_uniq_mmaxS (uniqCMX Q _) => //.
-have q'r: r != q by apply: contraNneq a'q => <-.
-by have [|_ -> //] := beta'_cent_Sylow maxM b'r b'q qQ; rewrite q'r sQM'.
-Qed.
-
-(* This is B & G, Lemma 12.19. *)
-(* We have used lemmas 10.8(b) and 10.2(c) rather than 10.9(a) as suggested *)
-(* in the text; this avoids a quantifier inversion! *)
-Lemma der_compl_cent_beta' M E :
- M \in 'M -> \sigma(M)^'.-Hall(M) E ->
- exists2 H : {group gT}, \beta(M)^'.-Hall(M`_\sigma) H & E^`(1) \subset 'C(H).
-Proof.
-move=> maxM hallE; have [sEM s'E _] := and3P hallE.
-have s'E': \sigma(M)^'.-group E^`(1) := pgroupS (der_sub 1 E) s'E.
-have b'E': \beta(M)^'.-group E^`(1).
- by apply: sub_pgroup s'E' => p; apply: contra; apply: beta_sub_sigma.
-have solM': solvable M^`(1) := solvableS (der_sub 1 M) (mmax_sol maxM).
-have [K hallK sE'K] := Hall_superset solM' (dergS 1 sEM) b'E'.
-exists (K :&: M`_\sigma)%G.
- apply: Hall_setI_normal hallK.
- exact: normalS (Msigma_der1 maxM) (der_sub 1 M) (pcore_normal _ M).
-have nilK: nilpotent K.
- by have [sKM' b'K _] := and3P hallK; apply: beta'_der1_nil sKM'.
-rewrite (sub_nilpotent_cent2 nilK) ?subsetIl ?(coprimeSg (subsetIr _ _)) //.
-exact: pnat_coprime (pcore_pgroup _ _) s'E'.
-Qed.
-
-End Section12.
-
-Arguments tau2'1 {gT M} [x].
-Arguments tau3'1 {gT M} [x].
-Arguments tau3'2 {gT M} [x].
-
diff --git a/mathcomp/odd_order/BGsection13.v b/mathcomp/odd_order/BGsection13.v
deleted file mode 100644
index de9ddaf..0000000
--- a/mathcomp/odd_order/BGsection13.v
+++ /dev/null
@@ -1,1123 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq div path fintype.
-From mathcomp
-Require Import bigop finset prime fingroup morphism perm automorphism quotient.
-From mathcomp
-Require Import action gproduct gfunctor pgroup cyclic center commutator.
-From mathcomp
-Require Import gseries nilpotent sylow abelian maximal hall frobenius.
-From mathcomp
-Require Import BGsection1 BGsection3 BGsection4 BGsection5 BGsection6.
-From mathcomp
-Require Import BGsection7 BGsection9 BGsection10 BGsection12.
-
-(******************************************************************************)
-(* This file covers B & G, section 13; the title subject of the section, *)
-(* prime and regular actions, was defined in the frobenius.v file. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope.
-
-Section Section13.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Implicit Types p q q_star r : nat.
-Implicit Types A E H K L M Mstar N P Q Qstar R S T U V W X Y Z : {group gT}.
-
-Section OneComplement.
-
-Variables M E : {group gT}.
-Hypotheses (maxM : M \in 'M) (hallE : \sigma(M)^'.-Hall(M) E).
-
-Let sEM : E \subset M := pHall_sub hallE.
-Let sM'E : \sigma(M)^'.-group E := pHall_pgroup hallE.
-
-(* This is B & G, Lemma 13.1. *)
-Lemma Msigma_setI_mmax_central p H :
- H \in 'M -> p \in \pi(E) -> p \in \pi(H) -> p \notin \tau1(H) ->
- [~: M`_\sigma :&: H, M :&: H] != 1 -> gval H \notin M :^: G ->
- [/\ (*a*) forall P, P \subset M :&: H -> p.-group P ->
- P \subset 'C(M`_\sigma :&: H),
- (*b*) p \notin \tau2(H)
- & (*c*) p \in \tau1(M) -> p \in \beta(G)].
-Proof.
-move=> maxH piEp piHp t1H'p; set R := [~: _, _] => ntR notMGH.
-have [q sMq piH'q]: exists2 q, q \in \sigma(M) & q \in \pi(H^`(1)).
- pose q := pdiv #|R|; have q_pr: prime q by rewrite pdiv_prime ?cardG_gt1.
- have q_dv : q %| _ := dvdn_trans (pdiv_dvd _) (cardSg _).
- exists q; last by rewrite mem_primes q_pr cardG_gt0 q_dv ?commgSS ?subsetIr.
- rewrite (pgroupP (pcore_pgroup _ M)) ?q_dv //.
- have sR_MsM: R \subset [~: M`_\sigma, M] by rewrite commgSS ?subsetIl.
- by rewrite (subset_trans sR_MsM) // commg_subl gFnorm.
-have [Y sylY] := Sylow_exists q H^`(1); have [sYH' qY _] := and3P sylY.
-have nsHbH: H`_\beta <| H := pcore_normal _ _; have [_ nHbH] := andP nsHbH.
-have sYH := subset_trans sYH' (der_sub 1 H); have nHbY := subset_trans sYH nHbH.
-have nsHbY_H: H`_\beta <*> Y <| H.
- rewrite -{2}(quotientGK nsHbH) -quotientYK ?cosetpre_normal //.
- have ->: Y / H`_\beta = 'O_q(H^`(1) / H`_\beta).
- by apply: nilpotent_Hall_pcore; rewrite ?Mbeta_quo_nil ?quotient_pHall.
- by rewrite quotient_der ?gFnormal_trans.
-have sYNY: Y \subset 'N_H(Y) by rewrite subsetI sYH normG.
-have{nsHbY_H} defH: H`_\beta * 'N_H(Y) = H.
- rewrite -(mulSGid sYNY) mulgA -(norm_joinEr nHbY).
- rewrite (Frattini_arg _ (pHall_subl _ _ sylY)) ?joing_subr //.
- by rewrite join_subG Mbeta_der1.
-have ntY: Y :!=: 1 by rewrite -cardG_gt1 (card_Hall sylY) p_part_gt1.
-have{ntY} [_] := sigma_Jsub maxM (pi_pgroup qY sMq) ntY.
-have maxY_H: H \in 'M(Y) by apply/setIdP.
-move/(_ E p H hallE piEp _ maxY_H notMGH) => b'p_t3Hp.
-case t2Hp: (p \in \tau2(H)).
- have b'p: p \notin \beta(G) by case/tau2_not_beta: t2Hp.
- have rpH: 'r_p(H) = 2 by apply/eqP; case/andP: t2Hp.
- have p'Hb: p^'.-group H`_\beta.
- rewrite (pi_p'group (pcore_pgroup _ H)) // inE /=.
- by rewrite -predI_sigma_beta // negb_and b'p orbT.
- case: b'p_t3Hp; rewrite // -(p_rank_p'quotient p'Hb) ?subIset ?nHbH //=.
- by rewrite -quotientMidl defH p_rank_p'quotient ?rpH.
-have [S sylS] := Sylow_exists p H; have [sSH pS _] := and3P sylS.
-have sSH': S \subset H^`(1).
- have [sHp | sH'p] := boolP (p \in \sigma(H)).
- apply: subset_trans (Msigma_der1 maxH).
- by rewrite (sub_Hall_pcore (Msigma_Hall _)) // (pi_pgroup pS).
- have sH'_S: \sigma(H)^'.-group S by rewrite (pi_pgroup pS).
- have [F hallF sSF] := Hall_superset (mmax_sol maxH) sSH sH'_S.
- have t3Hp: p \in \tau3(H).
- have:= partition_pi_sigma_compl maxH hallF p.
- by rewrite (pi_sigma_compl hallF) inE /= sH'p piHp (negPf t1H'p) t2Hp.
- have [[F1 hallF1] [F3 hallF3]] := ex_tau13_compl hallF.
- have [F2 _ complFi] := ex_tau2_compl hallF hallF1 hallF3.
- have [[sF3F' nsF3F] _ _ _ _] := sigma_compl_context maxH complFi.
- apply: subset_trans (subset_trans sF3F' (dergS 1 (pHall_sub hallF))).
- by rewrite (sub_normal_Hall hallF3) ?(pi_pgroup pS).
-have sylS_H' := pHall_subl sSH' (der_sub 1 H) sylS.
-split=> // [P sPMH pP | t1Mp]; last first.
- apply/idPn=> b'p; have [_ /(_ t1Mp)/negP[]] := b'p_t3Hp b'p.
- have p'Hb: p^'.-group H`_\beta.
- rewrite (pi_p'group (pcore_pgroup _ H)) // inE /=.
- by rewrite -predI_sigma_beta // negb_and b'p orbT.
- rewrite -p_rank_gt0 -(p_rank_p'quotient p'Hb) ?comm_subG ?subIset ?nHbH //=.
- rewrite quotient_der ?subIset ?nHbH // -quotientMidl defH -quotient_der //=.
- rewrite p_rank_p'quotient ?comm_subG // -(rank_Sylow sylS_H').
- by rewrite (rank_Sylow sylS) p_rank_gt0.
-have nsHaH: H`_\alpha <| H := pcore_normal _ _; have [_ nHaH] := andP nsHaH.
-have [sPM sPH] := subsetIP sPMH; have nHaS := subset_trans sSH nHaH.
-have nsHaS_H: H`_\alpha <*> S <| H.
- rewrite -[H in _ <| H](quotientGK nsHaH) -quotientYK ?cosetpre_normal //.
- have ->: S / H`_\alpha = 'O_p(H^`(1) / H`_\alpha).
- by apply: nilpotent_Hall_pcore; rewrite ?Malpha_quo_nil ?quotient_pHall.
- by rewrite quotient_der ?gFnormal_trans.
-have [sHaS_H nHaS_H] := andP nsHaS_H.
-have sP_HaS: P \subset H`_\alpha <*> S.
- have [x Hx sPSx] := Sylow_subJ sylS sPH pP; apply: subset_trans sPSx _.
- by rewrite sub_conjg (normsP nHaS_H) ?groupV ?joing_subr.
-have coHaS_Ms: coprime #|H`_\alpha <*> S| #|M`_\sigma|.
- rewrite (p'nat_coprime _ (pcore_pgroup _ _)) // -pgroupE norm_joinEr //.
- rewrite pgroupM andbC (pi_pgroup pS) ?(pnatPpi (pHall_pgroup hallE)) //=.
- apply: sub_pgroup (pcore_pgroup _ _) => r aHr.
- have [|_ ti_aH_sM _] := sigma_disjoint maxH maxM; first by rewrite orbit_sym.
- by apply: contraFN (ti_aH_sM r) => sMr; apply/andP.
-rewrite (sameP commG1P trivgP) -(coprime_TIg coHaS_Ms) commg_subI ?setIS //.
-by rewrite subsetI sP_HaS (subset_trans sPM) ?gFnorm.
-Qed.
-
-(* This is B & G, Corollary 13.2. *)
-Corollary cent_norm_tau13_mmax p P H :
- (p \in \tau1(M)) || (p \in \tau3(M)) ->
- P \subset M -> p.-group P -> H \in 'M('N(P)) ->
- [/\ (*a*) forall P1, P1 \subset M :&: H -> p.-group P1 ->
- P1 \subset 'C(M`_\sigma :&: H),
- (*b*) forall X, X \subset E :&: H -> \tau1(H)^'.-group X ->
- X \subset 'C(M`_\sigma :&: H)
- & (*c*) [~: M`_\sigma :&: H, M :&: H] != 1 ->
- p \in \sigma(H) /\ (p \in \tau1(M) -> p \in \beta(H))].
-Proof.
-move=> t13Mp sPM pP /setIdP[maxH sNP_H].
-have ntP: P :!=: 1.
- by apply: contraTneq sNP_H => ->; rewrite norm1 proper_subn ?mmax_proper.
-have st2Hp: (p \in \sigma(H)) || (p \in \tau2(H)).
- exact: (prime_class_mmax_norm maxH pP sNP_H).
-have not_MGH: gval H \notin M :^: G.
- apply: contraL st2Hp => /imsetP[x _ ->]; rewrite sigmaJ tau2J negb_or.
- by have:= t13Mp; rewrite -2!andb_orr !inE => /and3P[-> /eqP->].
-set R := [~: _, _]; have [/commG1P | ntR] := altP (R =P 1).
- rewrite centsC => cMH; split=> // X sX_EH _; apply: subset_trans cMH => //.
- by rewrite (subset_trans sX_EH) ?setSI.
-have piEp: p \in \pi(E).
- by rewrite (partition_pi_sigma_compl maxM) // orbCA t13Mp orbT.
-have piHp: p \in \pi(H).
- by rewrite (partition_pi_mmax maxH) orbCA orbC -!orbA st2Hp !orbT.
-have t1H'p: p \notin \tau1(H).
- by apply: contraL st2Hp; rewrite negb_or !inE => /and3P[-> /eqP->].
-case: (Msigma_setI_mmax_central maxH piEp) => // cMsH t2H'p b_p.
-split=> // [X sX_EH t1'X | _].
- have [sXE sXH] := subsetIP sX_EH.
- rewrite -(Sylow_gen X) gen_subG; apply/bigcupsP=> Q; case/SylowP=> q _ sylQ.
- have [-> | ntQ] := eqsVneq Q 1; first exact: sub1G.
- have piXq: q \in \pi(X) by rewrite -p_rank_gt0 -(rank_Sylow sylQ) rank_gt0.
- have [[piEq piHq] t1H'q] := (piSg sXE piXq, piSg sXH piXq, pnatPpi t1'X piXq).
- have [sQX qQ _] := and3P sylQ; have sXM := subset_trans sXE sEM.
- case: (Msigma_setI_mmax_central maxH piEq) => // -> //.
- by rewrite subsetI !(subset_trans sQX).
-rewrite (negPf t2H'p) orbF in st2Hp.
-by rewrite -predI_sigma_beta // {3}/in_mem /= st2Hp.
-Qed.
-
-(* This is B & G, Corollary 13.3(a). *)
-Lemma cyclic_primact_Msigma p P :
- p.-Sylow(E) P -> cyclic P -> semiprime M`_\sigma P.
-Proof.
-move=> sylP cycP x /setD1P[]; rewrite -cycle_eq1 -cycle_subG => ntX sXP.
-have [sPE pP _] := and3P sylP; rewrite -cent_cycle.
-have sPM := subset_trans sPE sEM; have sXM := subset_trans sXP sPM.
-have pX := pgroupS sXP pP; have ltXG := mFT_pgroup_proper pX.
-have t13p: (p \in \tau1(M)) || (p \in \tau3(M)).
- rewrite (tau1E maxM hallE) (tau3E maxM hallE) -p_rank_gt0 -(rank_Sylow sylP).
- rewrite eqn_leq rank_gt0 (subG1_contra sXP) //= andbT -andb_orl orNb.
- by rewrite -abelian_rank1_cyclic ?cyclic_abelian.
-have [H maxNH] := mmax_exists (mFT_norm_proper ntX ltXG).
-have [cMsX _ _] := cent_norm_tau13_mmax t13p sXM pX maxNH.
-have [_ sNH] := setIdP maxNH.
-apply/eqP; rewrite eqEsubset andbC setIS ?centS // subsetI subsetIl /= centsC.
-apply: subset_trans (cMsX P _ pP) (centS _).
- rewrite subsetI sPM (subset_trans (cents_norm _) sNH) //.
- by rewrite sub_abelian_cent // cyclic_abelian.
-by rewrite setIS // (subset_trans (cent_sub _) sNH).
-Qed.
-
-(* This is B & G, Corollary 13.3(b). *)
-Corollary tau3_primact_Msigma E3 :
- \tau3(M).-Hall(E) E3 -> semiprime M`_\sigma E3.
-Proof.
-move=> hallE3 x /setD1P[]; rewrite -cycle_eq1 -cycle_subG => ntX sXE3.
-have [sE3E t3E3 _] := and3P hallE3; rewrite -cent_cycle.
-have [[E1 hallE1] _] := ex_tau13_compl hallE.
-have [E2 _ complEi] := ex_tau2_compl hallE hallE1 hallE3.
-have [[sE3E' nsE3E] _ [_ cycE3] _ _] := sigma_compl_context maxM complEi.
-apply/eqP; rewrite eqEsubset andbC setIS ?centS // subsetI subsetIl /= centsC.
-pose p := pdiv #[x]; have p_pr: prime p by rewrite pdiv_prime ?cardG_gt1.
-have t3p: p \in \tau3(M) by rewrite (pgroupP (pgroupS sXE3 t3E3)) ?pdiv_dvd.
-have t13p: [|| p \in \tau1(M) | p \in \tau3(M)] by rewrite t3p orbT.
-have [y Xy oy]:= Cauchy p_pr (pdiv_dvd _).
-have ntY: <[y]> != 1 by rewrite -cardG_gt1 -orderE oy prime_gt1.
-have pY: p.-group <[y]> by rewrite /pgroup -orderE oy pnat_id.
-have [H maxNH] := mmax_exists (mFT_norm_proper ntY (mFT_pgroup_proper pY)).
-have sYE3: <[y]> \subset E3 by rewrite cycle_subG (subsetP sXE3).
-have sYE := subset_trans sYE3 sE3E; have sYM := subset_trans sYE sEM.
-have [_ cMsY _] := cent_norm_tau13_mmax t13p sYM pY maxNH.
-have [_ sNH] := setIdP maxNH.
-have sE3H': E3 \subset H^`(1).
- rewrite (subset_trans sE3E') ?dergS // (subset_trans _ sNH) ?normal_norm //.
- by rewrite (char_normal_trans _ nsE3E) // sub_cyclic_char.
-apply: subset_trans (cMsY E3 _ _) (centS _).
-- rewrite subsetI sE3E (subset_trans (cents_norm _) sNH) //.
- by rewrite sub_abelian_cent ?cyclic_abelian.
-- rewrite (pgroupS sE3H') //; apply/pgroupP=> q _ q_dv_H'.
- by rewrite !inE q_dv_H' !andbF.
-by rewrite setIS // (subset_trans _ sNH) // cents_norm ?centS ?cycle_subG.
-Qed.
-
-(* This is B & G, Theorem 13.4. *)
-(* Note how the non-structural steps in the proof (top of p. 99, where it is *)
-(* deduced that C_M_alpha(P) <= C_M_alpha(R) from q \notin \alpha, and then *)
-(* C_M_alpha(P) = C_M_alpha(R) from r \in tau_1(M) !!), are handled cleanly *)
-(* on lines 5-12 of the proof by a conditional expression for the former, and *)
-(* a without loss tactic for the latter. *)
-(* Also note that the references to 10.12 and 12.2 are garbled (some are *)
-(* missing, and some are exchanged!). *)
-Theorem cent_tau1Elem_Msigma p r P R (Ms := M`_\sigma) :
- p \in \tau1(M) -> P \in 'E_p^1(E) -> R \in 'E_r^1('C_E(P)) ->
- 'C_Ms(P) \subset 'C_Ms(R).
-Proof.
-have /andP[sMsM nMsM]: Ms <| M := pcore_normal _ M.
-have coMsE: coprime #|Ms| #|E| := coprime_sigma_compl hallE.
-pose Ma := M`_\alpha; have sMaMs: Ma \subset Ms := Malpha_sub_Msigma maxM.
-rewrite pnElemI -setIdE => t1Mp EpP /setIdP[ErR cPR].
-without loss symPR: p r P R EpP ErR cPR t1Mp /
- r \in \tau1(M) -> 'C_Ma(P) \subset 'C_Ma(R) -> 'C_Ma(P) = 'C_Ma(R).
-- move=> IH; apply: (IH p r) => // t1Mr sCaPR; apply/eqP; rewrite eqEsubset.
- rewrite sCaPR -(setIidPl sMaMs) -!setIA setIS ?(IH r p) 1?centsC // => _.
- by case/eqVproper; rewrite // /proper sCaPR andbF.
-do [rewrite !subsetI !subsetIl /=; set cRCaP := _ \subset _] in symPR *.
-pose Mz := 'O_(if cRCaP then \sigma(M) else \alpha(M))(M); pose C := 'C_Mz(P).
-suffices: C \subset 'C(R) by rewrite /C /Mz /cRCaP; case: ifP => // ->.
-have sMzMs: Mz \subset Ms by rewrite /Mz; case: ifP => // _.
-have sCMs: C \subset Ms by rewrite subIset ?sMzMs.
-have [[sPE abelP dimP] [sRE abelR dimR]] := (pnElemP EpP, pnElemP ErR).
-have [sPM sRM] := (subset_trans sPE sEM, subset_trans sRE sEM).
-have [[pP cPP _] [rR _]] := (and3P abelP, andP abelR).
-have coCR: coprime #|C| #|R| := coprimeSg sCMs (coprimegS sRE coMsE).
-have ntP: P :!=: 1 by apply: nt_pnElem EpP _.
-pose ST := [set S | Sylow C (gval S) & R \subset 'N(S)].
-have sST_CP S: S \in ST -> S \subset C by case/setIdP=> /SylowP[q _ /andP[]].
-rewrite -{sST_CP}[C](Sylow_transversal_gen sST_CP) => [|q _]; last first.
- have nMzR: R \subset 'N(Mz) by rewrite (subset_trans sRM) // gFnorm.
- have{nMzR} nCR: R \subset 'N(C) by rewrite normsI // norms_cent // cents_norm.
- have solC := solvableS (subset_trans sCMs sMsM) (mmax_sol maxM).
- have [S sylS nSR] := coprime_Hall_exists q nCR coCR solC.
- by exists S; rewrite // inE (p_Sylow sylS) nSR.
-rewrite gen_subG; apply/bigcupsP=> S /setIdP[/SylowP[q _ sylS] nSR] {ST}.
-have [sSC qS _] := and3P sylS.
-have [sSMs [sSMz cPS]] := (subset_trans sSC sCMs, subsetIP sSC).
-rewrite (sameP commG1P eqP) /=; set Q := [~: S, R]; apply/idPn => ntQ.
-have sQS: Q \subset S by [rewrite commg_subl]; have qQ := pgroupS sQS qS.
-have piQq: q \in \pi(Q) by rewrite -p_rank_gt0 -(rank_pgroup qQ) rank_gt0.
-have{piQq} [nQR piSq] := (commg_normr R S : R \subset 'N(Q), piSg sQS piQq).
-have [H maxNH] := mmax_exists (mFT_norm_proper ntP (mFT_pgroup_proper pP)).
-have [maxH sNH] := setIdP maxNH; have sCPH := subset_trans (cent_sub _) sNH.
-have [sPH sRH] := (subset_trans cPP sCPH, subset_trans cPR sCPH).
-have [sSM sSH] := (subset_trans sSMs sMsM, subset_trans cPS sCPH).
-have [sQM sQH] := (subset_trans sQS sSM, subset_trans sQS sSH).
-have ntMsH_R: [~: Ms :&: H, R] != 1.
- by rewrite (subG1_contra _ ntQ) ?commSg // subsetI sSMs.
-have sR_EH: R \subset E :&: H by apply/subsetIP.
-have ntMsH_MH: [~: Ms :&: H, M :&: H] != 1.
- by rewrite (subG1_contra _ ntMsH_R) ?commgS // (subset_trans sR_EH) ?setSI.
-have t13Mp: p \in [predU \tau1(M) & \tau3(M)] by apply/orP; left.
-have [_ cMsH_t1H' [//|sHp bHp]] := cent_norm_tau13_mmax t13Mp sPM pP maxNH.
-have{cMsH_t1H'} t1Hr: r \in \tau1(H).
- apply: contraR ntMsH_R => t1H'r; rewrite (sameP eqP commG1P) centsC.
- by rewrite cMsH_t1H' // (pi_pgroup rR).
-have ntCHaRQ: 'C_(H`_\alpha)(R <*> Q) != 1.
- rewrite centY (subG1_contra _ ntP) ?subsetI //= centsC cPR centsC.
- rewrite (subset_trans sQS cPS) (subset_trans _ (Mbeta_sub_Malpha H)) //.
- by rewrite (sub_Hall_pcore (Mbeta_Hall maxH)) // (pi_pgroup pP) ?bHp.
-have not_MGH: gval H \notin M :^: G.
- by apply: contraL sHp => /imsetP[x _ ->]; rewrite sigmaJ; case/andP: t1Mp.
-have neqHM: H :!=: M := contra_orbit _ _ not_MGH.
-have cSS: abelian S.
- apply: contraR neqHM => /(nonabelian_Uniqueness qS)uniqS.
- by rewrite (eq_uniq_mmax (def_uniq_mmax uniqS maxM sSM) maxH sSH).
-have tiQcR: 'C_Q(R) = 1 by rewrite coprime_abel_cent_TI // (coprimeSg sSC).
-have sMq: q \in \sigma(M) := pnatPpi (pcore_pgroup _ M) (piSg sSMs piSq).
-have aH'q: q \notin \alpha(H).
- have [|_ tiHaMs _] := sigma_disjoint maxH maxM; first by rewrite orbit_sym.
- by apply: contraFN (tiHaMs q) => aHq; apply/andP.
-have piRr: r \in \pi(R) by rewrite -p_rank_gt0 p_rank_abelem ?dimR.
-have ErH_R: R \in 'E_r^1(H) by rewrite !inE sRH abelR dimR.
-have{piRr} sM'r: r \in \sigma(M)^' := pnatPpi (pgroupS sRE sM'E) piRr.
-have r'q: q \in r^' by apply: contraTneq sMq => ->.
-have ntHa: H`_\alpha != 1 by rewrite (subG1_contra _ ntCHaRQ) ?subsetIl.
-have uniqNQ: 'M('N(Q)) = [set H].
- apply: contraNeq ntCHaRQ; rewrite joingC.
- by case/(cent_Malpha_reg_tau1 _ _ r'q ErH_R) => //; case=> //= _ -> _.
-have maxNQ_H: H \in 'M('N(Q)) :\ M by rewrite uniqNQ !inE neqHM /=.
-have{maxNQ_H} [_ _] := sigma_subgroup_embedding maxM sMq sQM qQ ntQ maxNQ_H.
-have [sHq [_ st1HM [_ ntMa]] | _ [_ _ sM'MH]] := ifP; last first.
- have piPp: p \in \pi(P) by rewrite -p_rank_gt0 p_rank_abelem ?dimP.
- have sPMH: P \subset M :&: H by apply/subsetIP.
- by have/negP[] := pnatPpi (pgroupS sPMH (pHall_pgroup sM'MH)) piPp.
-have{st1HM} t1Mr: r \in \tau1(M).
- by case/orP: (st1HM r t1Hr); rewrite //= (contraNF ((alpha_sub_sigma _) r)).
-have aM'q: q \notin \alpha(M).
- have [_ tiMaHs _] := sigma_disjoint maxM maxH not_MGH.
- by apply: contraFN (tiMaHs q) => aMq; apply/andP.
-have ErM_R: R \in 'E_r^1(M) by rewrite !inE sRM abelR dimR.
-have: 'M('N(Q)) != [set M] by rewrite uniqNQ (inj_eq (@set1_inj _)).
-case/(cent_Malpha_reg_tau1 _ _ r'q ErM_R) => //.
-case=> //= ntCMaP tiCMaPQ _; case/negP: ntCMaP.
-rewrite -subG1 -{}tiCMaPQ centY setICA subsetIidr /= -/Ma -/Q centsC.
-apply/commG1P/three_subgroup; apply/commG1P.
- by rewrite commGC (commG1P _) ?sub1G ?subsetIr.
-apply: subset_trans (subsetIr Ma _); rewrite /= -symPR //.
- rewrite commg_subl normsI //; last by rewrite norms_cent // cents_norm.
- by rewrite (subset_trans sSM) ?gFnorm.
-apply: contraR aM'q => not_cRCaP; apply: pnatPpi (pgroupS sSMz _) piSq.
-by rewrite (negPf not_cRCaP) pcore_pgroup.
-Qed.
-
-(* This is B & G, Theorem 13.5. *)
-Theorem tau1_primact_Msigma E1 : \tau1(M).-Hall(E) E1 -> semiprime M`_\sigma E1.
-Proof.
-move=> hallE1 x /setD1P[]; rewrite -cycle_eq1 -cycle_subG => ntX sXE1.
-rewrite -cent_cycle; have [sE1E t1E1 _] := and3P hallE1.
-have [_ [E3 hallE3]] := ex_tau13_compl hallE.
-have{hallE3} [E2 _ complEi] := ex_tau2_compl hallE hallE1 hallE3.
-have [_ _ [cycE1 _] _ _ {E2 E3 complEi}] := sigma_compl_context maxM complEi.
-apply/eqP; rewrite eqEsubset andbC setIS ?centS //= subsetI subsetIl /=.
-have [p _ rX] := rank_witness <[x]>; rewrite -rank_gt0 {}rX in ntX.
-have t1p: p \in \tau1(M) by rewrite (pnatPpi t1E1) // (piSg sXE1) -?p_rank_gt0.
-have{ntX} [P EpP] := p_rank_geP ntX; have{EpP} [sPX abelP dimP] := pnElemP EpP.
-have{sXE1} sPE1 := subset_trans sPX sXE1.
-have{dimP} EpP: P \in 'E_p^1(E) by rewrite !inE abelP dimP (subset_trans sPE1).
-apply: {x sPX abelP} subset_trans (setIS _ (centS sPX)) _; rewrite centsC.
-rewrite -(Sylow_gen E1) gen_subG; apply/bigcupsP=> S; case/SylowP=> r _ sylS.
-have [[sSE1 rS _] [-> | ntS]] := (and3P sylS, eqsVneq S 1); first exact: sub1G.
-have [cycS sSE] := (cyclicS sSE1 cycE1, subset_trans sSE1 sE1E).
-have /p_rank_geP[R ErR]: 0 < 'r_r(S) by rewrite -rank_pgroup ?rank_gt0.
-have{ErR} [sRS abelR dimR] := pnElemP ErR; have sRE1 := subset_trans sRS sSE1.
-have{abelR dimR} ErR: R \in 'E_r^1('C_E(P)).
- rewrite !inE abelR dimR (subset_trans sRE1) // subsetI sE1E.
- by rewrite sub_abelian_cent ?cyclic_abelian.
-rewrite centsC (subset_trans (cent_tau1Elem_Msigma t1p EpP ErR)) //.
-have [y defR]: exists y, R :=: <[y]> by apply/cyclicP; apply: cyclicS cycS.
-have sylS_E: r.-Sylow(E) S.
- apply: subHall_Sylow hallE1 (pnatPpi t1E1 _) (sylS).
- by rewrite -p_rank_gt0 -(rank_Sylow sylS) rank_gt0.
-rewrite defR cent_cycle (cyclic_primact_Msigma sylS_E cycS) ?subsetIr //.
-by rewrite !inE -cycle_subG -cycle_eq1 -defR (nt_pnElem ErR).
-Qed.
-
-(* This is B & G, Lemma 13.6. *)
-(* The wording at the top of the proof is misleading: it should say: by *)
-(* Corollary 12.14, it suffices to show that we can't have both q \in beta(M) *)
-(* and X \notsubset M_sigma^(1). Also, the reference to 12.13 should be 12.19 *)
-(* or 10.9 (we've used 12.19 here). *)
-Lemma cent_cent_Msigma_tau1_uniq E1 P q X (Ms := M`_\sigma) :
- \tau1(M).-Hall(E) E1 -> P \subset E1 -> P :!=: 1 ->
- X \in 'E_q^1('C_Ms(P)) ->
- 'M('C(X)) = [set M] /\ (forall S, q.-Sylow(Ms) S -> 'M(S) = [set M]).
-Proof.
-move=> hallE1 sPE1 ntP EqX; have [sE1E t1E1 _] := and3P hallE1.
-rewrite (cent_semiprime (tau1_primact_Msigma hallE1)) //= -/Ms in EqX.
-have{P ntP sPE1} ntE1 := subG1_contra sPE1 ntP.
-have /andP[sMsM nMsM]: Ms <| M := pcore_normal _ M.
-have coMsE: coprime #|Ms| #|E| := coprime_sigma_compl hallE.
-have [solMs nMsE] := (solvableS sMsM (mmax_sol maxM), subset_trans sEM nMsM).
-apply: cent_der_sigma_uniq => //.
- by move: EqX; rewrite -(setIidPr sMsM) -setIA pnElemI => /setIP[].
-have{EqX} [[sXcMsE1 abelX _] ntX] := (pnElemP EqX, nt_pnElem EqX isT).
-apply: contraR ntX => /norP[b'q not_sXMs']; rewrite -subG1.
-have [S sylS nSE] := coprime_Hall_exists q nMsE coMsE solMs.
-have{abelX} [[sSMs qS _] [qX _]] := (and3P sylS, andP abelX).
-have sScMsE': S \subset 'C_Ms(E^`(1)).
- have [H hallH cHE'] := der_compl_cent_beta' maxM hallE.
- have [Q sylQ] := Sylow_exists q H; have [sQH qQ _] := and3P sylQ.
- have{cHE' sQH} cQE' := centsS sQH cHE'; have sE'E := der_sub 1 E.
- have [nMsE' coMsE'] := (coprimegS sE'E coMsE, subset_trans sE'E nMsE).
- have{H hallH sylQ} sylQ := subHall_Sylow hallH b'q sylQ.
- have nSE' := subset_trans sE'E nSE; have nQE' := cents_norm cQE'.
- have [x cE'x ->] := coprime_Hall_trans coMsE' nMsE' solMs sylS nSE' sylQ nQE'.
- by rewrite conj_subG // subsetI (pHall_sub sylQ) centsC.
-without loss{qX} sXS: X sXcMsE1 not_sXMs' / X \subset S.
- have [nMsE1 coMsE1 IH] := (subset_trans sE1E nMsE, coprimegS sE1E coMsE).
- have [nSE1 [sXMs cE1X]] := (subset_trans sE1E nSE, subsetIP sXcMsE1).
- have [|Q [sylQ nQE1 sXQ]] := coprime_Hall_subset nMsE1 coMsE1 solMs sXMs qX.
- by rewrite cents_norm // centsC.
- have [//|x cE1x defS] := coprime_Hall_trans nMsE1 _ solMs sylS nSE1 sylQ nQE1.
- have Ms_x: x \in Ms by case/setIP: cE1x.
- rewrite -(conjs1g x^-1) -sub_conjg IH //; last by rewrite defS conjSg.
- by rewrite -(conjGid cE1x) conjSg.
- by rewrite -(normsP (der_norm 1 _) x) ?conjSg.
-have [sXMs cE1X] := subsetIP sXcMsE1.
-have [_ [E3 hallE3]] := ex_tau13_compl hallE.
-have{hallE3} [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
-have{not_sXMs' E3 complEi} ntE2: E2 :!=: 1.
- apply: contraNneq not_sXMs' => E2_1.
- have [[sE3E' _] _ _ [defE _] _] := sigma_compl_context maxM complEi.
- have [sCMsE_Ms' _ _] := sigma_compl_embedding maxM hallE.
- have{defE} [_ defE _ _] := sdprodP defE; rewrite E2_1 sdprod1g in defE.
- rewrite (subset_trans _ sCMsE_Ms') // -defE centM setIA subsetI.
- by rewrite (subset_trans (subset_trans sXS sScMsE')) ?setIS ?centS.
-have{ntE2 E2 hallE2} [p p_pr t2p]: exists2 p, prime p & p \in \tau2(M).
- have [[p p_pr rE2] [_ t2E2 _]] := (rank_witness E2, and3P hallE2).
- by exists p; rewrite ?(pnatPpi t2E2) // -p_rank_gt0 -rE2 rank_gt0.
-have [A Ep2A Ep2A_M] := ex_tau2Elem hallE t2p.
-have [_ _ tiCMsA _ _] := tau2_context maxM t2p Ep2A_M.
-have [[nsAE _] _ _ _] := tau2_compl_context maxM hallE t2p Ep2A.
-have [sAE abelA _] := pnElemP Ep2A; have [pA cAA _] := and3P abelA.
-have cCAE1_X: X \subset 'C('C_A(E1)).
- rewrite centsC; apply/subsetP=> y; case/setIP=> Ay cE1y.
- have [-> | nty] := eqVneq y 1; first exact: group1.
- have oY: #[y] = p := abelem_order_p abelA Ay nty.
- have [r _ rE1] := rank_witness E1.
- have{rE1} rE1: 'r_r(E1) > 0 by rewrite -rE1 rank_gt0.
- have [R ErR] := p_rank_geP rE1; have{ErR} [sRE1 abelR dimR] := pnElemP ErR.
- have t1r: r \in \tau1(M) by rewrite (pnatPpi t1E1) -?p_rank_gt0.
- have ErR: R \in 'E_r^1(E) by rewrite !inE abelR dimR (subset_trans sRE1).
- have EpY: <[y]>%G \in 'E_p^1('C_E(R)).
- rewrite p1ElemE // !inE -oY eqxx subsetI (centsS sRE1) cycle_subG //=.
- by rewrite (subsetP sAE).
- rewrite -sub_cent1 -cent_cycle (subset_trans sXcMsE1) //.
- apply: subset_trans (setIS _ (centS sRE1)) _.
- rewrite -subsetIidl setIAC subsetI subsetIr andbT.
- exact: cent_tau1Elem_Msigma t1r ErR EpY.
-have nAE1 := subset_trans sE1E (normal_norm nsAE).
-have coAE1: coprime #|A| #|E1|.
- by apply: pnat_coprime pA (pi_p'group t1E1 (contraL _ t2p)); apply: tau2'1.
-rewrite -tiCMsA -(coprime_cent_prod nAE1 coAE1) ?abelian_sol // centM setIA.
-rewrite subsetI cCAE1_X (subset_trans (subset_trans sXS sScMsE')) ?setIS //.
-by rewrite centS ?commgSS.
-Qed.
-
-End OneComplement.
-
-(* This is B & G, Lemma 13.7. *)
-(* We've had to plug a gap in this proof: on p. 100, l. 6-7 it is asserted *)
-(* the conclusion (E1 * E3 acts in a prime manner on M_sigma) follows from *)
-(* the fact that E1 and E3 have coprime orders and act in a prime manner with *)
-(* the same set of fixed points. This seems to imply the following argument: *)
-(* For any x \in M_sigma, *)
-(* C_(E1 * E3)[x] = C_E1[x] * C_E3[x] is either E1 * E3 or 1, *)
-(* i.e., E1 * E3 acts in a prime manner on M_sigma. *)
-(* This is improper because the distributivity of centralisers over coprime *)
-(* products only hold under normality conditions that do not hold in this *)
-(* instance. The correct argument, which involves using the prime action *)
-(* assumption a second time, only relies on the fact that E1 and E3 are Hall *)
-(* subgroups of the group E1 * E3. The fact that E3 <| E (Lemma 12.1(a)), *)
-(* implicitly needed to justify that E1 * E3 is a group, can also be used to *)
-(* simplify the argument, and we do so. *)
-Lemma tau13_primact_Msigma M E E1 E2 E3 :
- M \in 'M -> sigma_complement M E E1 E2 E3 -> ~ semiregular E3 E1 ->
- semiprime M`_\sigma (E3 <*> E1).
-Proof.
-move=> maxM complEi not_regE13; set Ms := M`_\sigma.
-have [hallE hallE1 hallE2 hallE3 _] := complEi.
-have [[sE1E t1E1 _] [sE3E t3E3 _]] := (and3P hallE1, and3P hallE3).
-have [[sEM _ _] [_ t2E2 _]] := (and3P hallE, and3P hallE2).
-have [[_ nsE3E] _ [_ cycE3] [defE _] tiE3cE]:= sigma_compl_context maxM complEi.
-have [[_ nE3E] [sMsM nMsM]] := (andP nsE3E, andP (pcore_normal _ M : Ms <| M)).
-have [P]: exists2 P, P \in 'E^1(E1) & 'C_E3(P) != 1.
- apply/exists_inP; rewrite -negb_forall_in; apply/forall_inP=> regE13.
- apply: not_regE13 => x /setD1P[]; rewrite -cycle_subG -cycle_eq1 -rank_gt0.
- case/rank_geP=> P E1xP sXE1; apply/trivgP; move: E1xP.
- rewrite /= -(setIidPr sXE1) nElemI -setIdE => /setIdP[E1_P sPX].
- by rewrite -(eqP (regE13 P E1_P)) -cent_cycle setIS ?centS.
-rewrite -{1}(setIidPr sE1E) nElemI -setIdE => /setIdP[/nElemP[p EpP] sPE1].
-rewrite -{1}(setIidPl sE3E) -setIA setIC -rank_gt0 => /rank_geP[R].
-rewrite nElemI -setIdE => /setIdP[/nElemP[r ErR] sRE3].
-have t1p: p \in \tau1(M).
- rewrite (pnatPpi (pgroupS sPE1 t1E1)) //= (card_p1Elem EpP).
- by rewrite pi_of_prime ?inE ?(pnElem_prime EpP) //.
-have prE1 := tau1_primact_Msigma maxM hallE hallE1.
-have prE3 := tau3_primact_Msigma maxM hallE hallE3.
-have sCsPR: 'C_Ms(P) \subset 'C_Ms(R) by apply: cent_tau1Elem_Msigma EpP ErR.
-have [eqCsPR | ltCsPR] := eqVproper sCsPR.
- move=> x; case/setD1P; rewrite -cycle_eq1 -cycle_subG => ntX sXE31.
- apply/eqP; rewrite -cent_cycle eqEsubset andbC setIS ?centS //=.
- have eqCsE13: 'C_Ms(E1) = 'C_Ms(E3).
- rewrite -(cent_semiprime prE1 sPE1) ?(nt_pnElem EpP) //.
- by rewrite -(cent_semiprime prE3 sRE3) ?(nt_pnElem ErR).
- rewrite centY setICA eqCsE13 -setICA setIid.
- have sE31E: E3 <*> E1 \subset E by apply/joing_subP.
- have nE3E1 := subset_trans sE1E nE3E.
- pose y := x.`_\tau1(M); have sYX: <[y]> \subset <[x]> := cycleX x _.
- have sXE := subset_trans sXE31 sE31E; have sYE := subset_trans sYX sXE.
- have [t1'x | not_t1'x] := boolP (\tau1(M)^'.-elt x).
- rewrite (cent_semiprime prE3 _ ntX) // (sub_normal_Hall hallE3) //.
- apply: pnat_dvd t3E3; rewrite -(Gauss_dvdr _ (p'nat_coprime t1'x t1E1)).
- by rewrite mulnC (dvdn_trans _ (dvdn_cardMg _ _)) -?norm_joinEr ?cardSg.
- have{not_t1'x} ntY: #[y] != 1%N by rewrite order_constt partn_eq1.
- apply: subset_trans (setIS _ (centS sYX)) _.
- have [solE nMsE] := (sigma_compl_sol hallE, subset_trans sEM nMsM).
- have [u Eu sYuE1] := Hall_Jsub solE hallE1 sYE (p_elt_constt _ _).
- rewrite -(conjSg _ _ u) !conjIg -!centJ (normsP nMsE) ?(normsP nE3E) //=.
- by rewrite -eqCsE13 (cent_semiprime prE1 sYuE1) // trivg_card1 cardJg.
-have ntCsR: 'C_Ms(R) != 1.
- by rewrite -proper1G (sub_proper_trans _ ltCsPR) ?sub1G.
-have ntR: R :!=: 1 by rewrite (nt_pnElem ErR).
-have [cEPR abelR dimR] := pnElemP ErR; have [rR _ _] := and3P abelR.
-have{cEPR} [sRE cPR] := subsetIP cEPR; have sRM := subset_trans sRE sEM.
-have E2_1: E2 :=: 1.
- have [x defR] := cyclicP (cyclicS sRE3 cycE3).
- apply: contraNeq ntCsR; rewrite -rank_gt0; have [q _ ->] := rank_witness E2.
- rewrite p_rank_gt0 defR cent_cycle. move/(pnatPpi t2E2) => t2q.
- have [A Eq2A _] := ex_tau2Elem hallE t2q.
- have [-> //] := tau2_regular maxM complEi t2q Eq2A.
- by rewrite !inE -cycle_subG -cycle_eq1 -defR sRE3 (nt_pnElem ErR).
-have nRE: E \subset 'N(R) by rewrite (char_norm_trans _ nE3E) ?sub_cyclic_char.
-have [H maxNH] := mmax_exists (mFT_norm_proper ntR (mFT_pgroup_proper rR)).
-have [maxH sNH] := setIdP maxNH; have sEH := subset_trans nRE sNH.
-have ntCsR_P: [~: 'C_Ms(R), P] != 1.
- rewrite (sameP eqP commG1P); apply: contra (proper_subn ltCsPR).
- by rewrite subsetI subsetIl.
-have sCsR_MsH: 'C_Ms(R) \subset Ms :&: H.
- exact: setIS Ms (subset_trans (cent_sub R) sNH).
-have ntMsH_P: [~: Ms :&: H, P] != 1 by rewrite (subG1_contra _ ntCsR_P) ?commSg.
-have tiE1cMsH: 'C_E1(Ms :&: H) = 1.
- apply: contraNeq (proper_subn ltCsPR) => ntCE1MsH.
- rewrite (cent_semiprime prE1 sPE1) ?(nt_pnElem EpP) //.
- rewrite -(cent_semiprime prE1 (subsetIl _ _) ntCE1MsH) /=.
- by rewrite subsetI subsetIl centsC subIset // orbC centS.
-have t3r: r \in \tau3(M).
- by rewrite (pnatPpi t3E3) ?(piSg sRE3) // -p_rank_gt0 p_rank_abelem ?dimR.
-have t13r: (r \in \tau1(M)) || (r \in \tau3(M)) by rewrite t3r orbT.
-have [sE1H sRH] := (subset_trans sE1E sEH, subset_trans sRE sEH).
-have [_ ct1H'R [|sHr _]] := cent_norm_tau13_mmax maxM hallE t13r sRM rR maxNH.
- rewrite (subG1_contra _ ntMsH_P) // commgS // (subset_trans sPE1) //.
- by rewrite subsetI (subset_trans sE1E).
-have t1H_E1: \tau1(H).-group E1.
- apply/pgroupP=> q q_pr /Cauchy[] // x E1x ox.
- apply: contraLR (prime_gt1 q_pr) => t1H'q; rewrite -ox cardG_gt1 negbK.
- rewrite -subG1 -tiE1cMsH subsetI cycle_subG E1x /= ct1H'R //.
- by rewrite (setIidPl sEH) cycle_subG (subsetP sE1E).
- by rewrite /pgroup -orderE ox pnatE.
-have sH'_E1: \sigma(H)^'.-group E1 by apply: sub_pgroup t1H_E1 => q /andP[].
-have [F hallF sE1F] := Hall_superset (mmax_sol maxH) sE1H sH'_E1.
-have [F1 hallF1 sE1F1] := Hall_superset (sigma_compl_sol hallF) sE1F t1H_E1.
-have{sHr} sRHs: R \subset H`_\sigma.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxH)) ?(pi_pgroup rR).
-have cRE1: E1 \subset 'C(R).
- rewrite centsC (centsS sE1F1) // -subsetIidl subsetI subxx -sRHs -subsetI.
- have prF1 := tau1_primact_Msigma maxH hallF hallF1.
- rewrite -(cent_semiprime prF1 (subset_trans sPE1 sE1F1)); last first.
- exact: nt_pnElem EpP _.
- by rewrite subsetI sRHs.
-case/negP: ntR; rewrite -subG1 -tiE3cE subsetI sRE3 centsC -(sdprodW defE).
-by rewrite E2_1 sdprod1g mul_subG // sub_abelian_cent ?cyclic_abelian.
-Qed.
-
-(* This is B & G, Lemma 13.8. *)
-(* We had to plug a significant hole in the proof text: in the sixth *)
-(* paragraph of the proof, it is asserted that because M = N_M(Q)M_alpha and *)
-(* r is in pi(C_M(P)), P centralises some non-trivial r-subgroup of N_M(Q). *)
-(* This does not seem to follow directly, even taking into account that r is *)
-(* not in alpha(M): while it is true that N_M(Q) contains a Sylow r-subgroup *)
-(* of M, this subgroup does not need to contain an r-group centralized by P. *)
-(* We can only establish the required result by making use of the fact that M *)
-(* has a normal p-complement K (because p is in tau_1(M)), as then N_K(Q) *)
-(* will contain a p-invariant Sylow r-subgroup S of K and M (coprime action) *)
-(* and then any r-subgroup of M centralised by P will be in K, and hence *)
-(* conjugate in C_K(P) to a subgroup of S (coprime action again). *)
-Lemma tau1_mmaxI_asymmetry M Mstar p P q Q q_star Qstar :
- (*1*) [/\ M \in 'M, Mstar \in 'M & gval Mstar \notin M :^: G] ->
- (*2*) [/\ p \in \tau1(M), p \in \tau1(Mstar) & P \in 'E_p^1(M :&: Mstar)] ->
- (*3*) [/\ q.-Sylow(M :&: Mstar) Q, q_star.-Sylow(M :&: Mstar) Qstar,
- P \subset 'N(Q) & P \subset 'N(Qstar)] ->
- (*4*) 'C_Q(P) = 1 /\ 'C_Qstar(P) = 1 ->
- (*5*) 'N(Q) \subset Mstar /\ 'N(Qstar) \subset M ->
- False.
-Proof.
-move: Mstar q_star Qstar => L u U. (* Abbreviate Mstar by L, Qstar by U. *)
-move=> [maxM maxL notMGL] [t1Mp t1Lp EpP] [sylQ sylU nQP nUP].
-move=> [regPQ regPU] [sNQL sNUM]; rewrite setIC in sylU. (* for symmetry *)
-have notLGM: gval M \notin L :^: G by rewrite orbit_sym. (* for symmetry *)
-have{EpP} [ntP [sPML abelP dimP]] := (nt_pnElem EpP isT, pnElemP EpP).
-have{sPML} [[sPM sPL] [pP _ _]] := (subsetIP sPML, and3P abelP).
-have solCP: solvable 'C(P) by rewrite mFT_sol ?mFT_cent_proper.
-pose Qprops M q Q := [&& q.-Sylow(M) Q, q != p, q \notin \beta(M),
- 'C_(M`_\beta)(P) != 1 & 'C_(M`_\beta)(P <*> Q) == 1].
-have{sylQ sylU} [hypQ hypU]: Qprops M q Q /\ Qprops L u U.
- apply/andP; apply/nandP=> not_hypQ.
- without loss{not_hypQ}: L u U M q Q maxM maxL notMGL notLGM t1Mp t1Lp sPM sPL
- sylQ sylU nQP nUP regPQ regPU sNQL sNUM / ~~ Qprops M q Q.
- - by move=> IH; case: not_hypQ; [apply: (IH L u U) | apply: (IH M q Q)].
- case/and5P; have [_ qQ _] := and3P sylQ.
- have{sylQ} sylQ: q.-Sylow(M) Q.
- by rewrite -Sylow_subnorm -(setIidPr sNQL) setIA Sylow_subnorm.
- have ntQ: Q :!=: 1.
- by apply: contraTneq sNQL => ->; rewrite norm1 proper_subn ?mmax_proper.
- have p'q: q != p.
- apply: contraNneq ntQ => def_q; rewrite (trivg_center_pgroup qQ) //.
- apply/trivgP; rewrite -regPQ setIS // centS //.
- by rewrite (norm_sub_max_pgroup (Hall_max sylQ)) ?def_q.
- have EpP: P \in 'E_p^1(M) by apply/pnElemP.
- have [|_ [// | abM]] := cent_Malpha_reg_tau1 maxM t1Mp p'q EpP ntQ nQP regPQ.
- apply: contraNneq notMGL => uniqNQ.
- by rewrite (eq_uniq_mmax uniqNQ) ?orbit_refl.
- by rewrite joingC /alpha_core abM !(eq_pcore _ abM) => _ -> -> ->.
-have bML_CMbP: forall M L, [predU \beta(M) & \beta(L)].-group 'C_(M`_\beta)(P).
- move=> ? ?; apply: pgroupS (subsetIl _ _) (sub_pgroup _ (pcore_pgroup _ _)).
- by move=> ?; rewrite !inE => ->.
-have [H hallH sCMbP_H] := Hall_superset solCP (subsetIr _ _) (bML_CMbP M L).
-have [[s _ rFH] [cPH bH _]] := (rank_witness 'F(H), and3P hallH).
-have{sCMbP_H rFH cPH} piFHs: s \in \pi('F(H)).
- rewrite -p_rank_gt0 -rFH rank_gt0 (trivg_Fitting (solvableS cPH solCP)).
- by rewrite (subG1_contra sCMbP_H) //; case/and5P: hypQ.
-without loss{bH} bMs: L u U M q Q maxM maxL notMGL notLGM t1Mp t1Lp sPM sPL
- nQP nUP regPQ regPU sNQL sNUM hypQ hypU hallH / s \in \beta(M).
-- move=> IH; have:= pnatPpi bH (piSg (Fitting_sub H) piFHs).
- case/orP; [apply: IH hypQ hypU hallH | apply: IH hypU hypQ _] => //.
- by apply: etrans (eq_pHall _ _ _) hallH => ?; apply: orbC.
-without loss{bML_CMbP} sCMbP_H: H hallH piFHs / 'C_(M`_\beta)(P) \subset H.
- have [x cPx sCMbP_Hx] := Hall_subJ solCP hallH (subsetIr _ _) (bML_CMbP M L).
- by move=> IH; apply: IH sCMbP_Hx; rewrite ?pHallJ //= FittingJ cardJg.
-pose X := 'O_s(H); have sylX := nilpotent_pcore_Hall s (Fitting_nil H).
-have{piFHs sylX} ntX: X != 1.
- by rewrite -rank_gt0 /= -p_core_Fitting (rank_Sylow sylX) p_rank_gt0.
-have [[cPH bH _] [sXH nXH]] := (and3P hallH, andP (pcore_normal s H : X <| H)).
-have [cPX sX] := (subset_trans sXH cPH, pcore_pgroup s H : s.-group X).
-have{hypQ} [sylQ p'q bM'q ntCMbP] := and5P hypQ; apply: negP.
-apply: subG1_contra (ntX); rewrite /= centY !subsetI (subset_trans _ cPH) //=.
-have nsMbM : M`_\beta <| M := pcore_normal _ M; have [sMbM nMbM] := andP nsMbM.
-have hallMb := Mbeta_Hall maxM; have [_ bMb _] := and3P hallMb.
-have{ntX} sHM: H \subset M.
- have [g sXMg]: exists g, X \subset M :^ g.
- have [S sylS] := Sylow_exists s M`_\beta; have [sSMb _ _] := and3P sylS.
- have sylS_G := subHall_Sylow (Mbeta_Hall_G maxM) bMs sylS.
- have [g _ sXSg] := Sylow_subJ sylS_G (subsetT X) sX.
- by exists g; rewrite (subset_trans sXSg) // conjSg (subset_trans sSMb).
- have [t _ rFC] := rank_witness 'F('C_(M`_\beta)(P)).
- pose Y := 'O_t('C_(M`_\beta)(P)).
- have [sYC tY] := (pcore_sub t _ : Y \subset _, pcore_pgroup t _ : t.-group Y).
- have sYMb := subset_trans sYC (subsetIl _ _); have bMY := pgroupS sYMb bMb.
- have{rFC} ntY: Y != 1.
- rewrite -rank_gt0 /= -p_core_Fitting.
- rewrite (rank_Sylow (nilpotent_pcore_Hall t (Fitting_nil _))) -rFC.
- by rewrite rank_gt0 (trivg_Fitting (solvableS (subsetIr _ _) solCP)).
- have bMt: t \in \beta(M).
- by rewrite (pnatPpi bMY) // -p_rank_gt0 -rank_pgroup ?rank_gt0.
- have sHMg: H \subset M :^ g.
- rewrite (subset_trans nXH) // beta_norm_sub_mmax ?mmaxJ // /psubgroup sXMg.
- by rewrite (pi_pgroup sX) 1?betaJ.
- have sYMg: Y \subset M :^ g := subset_trans (subset_trans sYC sCMbP_H) sHMg.
- have sNY_M: 'N(Y) \subset M.
- by rewrite beta_norm_sub_mmax // /psubgroup (subset_trans sYMb).
- have [_ trCY _] := sigma_group_trans maxM (beta_sub_sigma maxM bMt) tY.
- have [|| h cYh /= defMg] := (atransP2 trCY) M (M :^ g).
- - by rewrite inE orbit_refl (subset_trans (normG _) sNY_M).
- - by rewrite inE mem_orbit ?in_setT.
- by rewrite defMg conjGid // (subsetP sNY_M) ?(subsetP (cent_sub _)) in sHMg.
-have sXMb: X \subset M`_\beta.
- by rewrite (sub_Hall_pcore hallMb) ?(subset_trans sXH sHM) ?(pi_pgroup sX).
-rewrite sXMb (sameP commG1P eqP) /= -/X -subG1.
-have [sQL [sQM qQ _]] := (subset_trans (normG Q) sNQL, and3P sylQ).
-have nsLbL : L`_\beta <| L := pcore_normal _ L; have [sLbL nLbL] := andP nsLbL.
-have nLbQ := subset_trans sQL nLbL.
-have [<- ti_aLsM _] := sigma_disjoint maxL maxM notLGM.
-rewrite subsetI (subset_trans _ (Mbeta_sub_Msigma maxM)) ?andbT; last first.
- by rewrite (subset_trans (commgSS sXMb sQM)) // commg_subl nMbM.
-have defQ: [~: Q, P] = Q.
- rewrite -{2}(coprime_cent_prod nQP) ?(pgroup_sol qQ) ?regPQ ?mulg1 //.
- by rewrite (p'nat_coprime (pi_pnat qQ _) pP).
-suffices sXL: X \subset L.
- apply: subset_trans (Mbeta_sub_Malpha L).
- rewrite -quotient_sub1 ?comm_subG ?quotientR ?(subset_trans _ nLbL) //.
- have <-: (M`_\beta :&: L) / L`_\beta :&: 'O_q(L^`(1) / L`_\beta) = 1.
- rewrite coprime_TIg // coprime_morphl // (coprimeSg (subsetIl _ _)) //.
- exact: pnat_coprime (pcore_pgroup _ _) (pi_pnat (pcore_pgroup _ _) _).
- rewrite commg_subI // subsetI.
- rewrite quotientS /=; last by rewrite subsetI sXMb.
- by rewrite quotient_der ?gFnorm_trans ?normsG ?quotientS.
- rewrite (sub_Hall_pcore (nilpotent_pcore_Hall _ (Mbeta_quo_nil _))) //.
- rewrite quotient_pgroup ?quotient_norms //.
- by rewrite normsI ?(subset_trans sQM nMbM) ?normsG.
- by rewrite quotientS // -defQ commgSS // (subset_trans nQP).
-have{hypU} [r bLr piHr]: exists2 r, r \in \beta(L) & r \in \pi(H).
- have [_ _ _] := and5P hypU; rewrite -rank_gt0.
- have [r _ ->] := rank_witness 'C_(L`_\beta)(P); rewrite p_rank_gt0 => piCr _.
- have [piLb_r piCPr] := (piSg (subsetIl _ _) piCr, piSg (subsetIr _ _) piCr).
- have bLr: r \in \beta(L) := pnatPpi (pcore_pgroup _ L) piLb_r.
- exists r; rewrite //= (card_Hall hallH) pi_of_part // inE /= piCPr.
- by rewrite inE /= bLr orbT.
-have sM'r: r \notin \sigma(M).
- by apply: contraFN (ti_aLsM r) => sMr; rewrite inE /= beta_sub_alpha.
-have defM: M`_\beta * 'N_M(Q) = M.
- have nMbQ := subset_trans sQM nMbM.
- have nsMbQ_M: M`_\beta <*> Q <| M.
- rewrite -{2}(quotientGK nsMbM) -quotientYK ?cosetpre_normal //.
- suffices ->: Q / M`_\beta = 'O_q(M^`(1) / M`_\beta).
- by rewrite quotient_der ?nMbM ?gFnormal_trans.
- apply: nilpotent_Hall_pcore; first exact: Mbeta_quo_nil.
- rewrite quotient_pHall // (pHall_subl _ _ sylQ) ?gFsub //.
- by rewrite -defQ commgSS // (subset_trans nUP).
- have sylQ_MbQ := pHall_subl (joing_subr _ Q) (normal_sub nsMbQ_M) sylQ.
- rewrite -{3}(Frattini_arg nsMbQ_M sylQ_MbQ) /= norm_joinEr // -mulgA.
- by congr (_ * _); rewrite mulSGid // subsetI sQM normG.
-have [[sM'p _ not_pM'] [sL'p _]] := (and3P t1Mp, andP t1Lp).
-have{not_pM'} [R ErR nQR]: exists2 R, R \in 'E_r^1('C_M(P)) & R \subset 'N(Q).
- have p'r: r \in p^' by apply: contraNneq sL'p => <-; apply: beta_sub_sigma.
- have p'M': p^'.-group M^`(1).
- by rewrite p'groupEpi mem_primes (negPf not_pM') !andbF.
- pose K := 'O_p^'(M); have [sKM nKM] := andP (pcore_normal _ M : K <| M).
- have hallK: p^'.-Hall(M) K.
- rewrite -(pquotient_pHall _ (der_normal 1 M)) ?quotient_pgroup //.
- rewrite -pquotient_pcore ?der_normal // nilpotent_pcore_Hall //.
- by rewrite abelian_nil ?der_abelian.
- by rewrite (normalS _ sKM) ?pcore_max ?der_normal.
- have sMbK: M`_\beta \subset K.
- by rewrite (subset_trans (Mbeta_der1 maxM)) // pcore_max ?der_normal.
- have coKP: coprime #|K| #|P| := p'nat_coprime (pcore_pgroup _ M) pP.
- have [solK sNK] := (solvableS sKM (mmax_sol maxM), subsetIl K 'N(Q)).
- have [nKP coNP] := (subset_trans sPM nKM, coprimeSg sNK coKP).
- have nNP: P \subset 'N('N_K(Q)) by rewrite normsI // norms_norm.
- have [S sylS nSP] := coprime_Hall_exists r nNP coNP (solvableS sNK solK).
- have /subsetIP[sSK nQS]: S \subset 'N_K(Q) := pHall_sub sylS.
- have sylS_K: r.-Sylow(K) S.
- rewrite pHallE sSK /= -/K -(setIidPr sKM) -defM -group_modl // setIAC.
- rewrite (setIidPr sKM) -LagrangeMr partnM // -(card_Hall sylS).
- rewrite part_p'nat ?mul1n 1?(pnat_dvd (dvdn_indexg _ _)) //.
- by apply: (pi_p'nat bMb); apply: contra sM'r; apply: beta_sub_sigma.
- have rC: 'r_r('C_M(P)) > 0 by rewrite p_rank_gt0 (piSg _ piHr) // subsetI sHM.
- have{rC} [R ErR] := p_rank_geP rC; have [sRcMP abelR _] := pnElemP ErR.
- have{sRcMP abelR} [[sRM cPR] [rR _]] := (subsetIP sRcMP, andP abelR).
- have nRP: P \subset 'N(R) by rewrite cents_norm 1?centsC.
- have sRK: R \subset K by rewrite sub_Hall_pcore ?(pi_pgroup rR).
- have [T [sylT nTP sRT]] := coprime_Hall_subset nKP coKP solK sRK rR nRP.
- have [x cKPx defS] := coprime_Hall_trans nKP coKP solK sylS_K nSP sylT nTP.
- rewrite -(conjGid (subsetP (setSI _ sKM) x cKPx)).
- by exists (R :^ x)%G; rewrite ?pnElemJ ?(subset_trans _ nQS) // defS conjSg.
-have [sRcMP abelR _] := pnElemP ErR; have ntR := nt_pnElem ErR isT.
-have{sRcMP abelR} [[sRM cPR] [rR _]] := (subsetIP sRcMP, andP abelR).
-have sNR_L: 'N(R) \subset L.
- by rewrite beta_norm_sub_mmax /psubgroup ?(subset_trans nQR) ?(pi_pgroup rR).
-have sPR_M: P <*> R \subset M by rewrite join_subG (subset_trans nUP).
-have sM'_PR: \sigma(M)^'.-group (P <*> R).
- by rewrite cent_joinEr // pgroupM (pi_pgroup rR) // (pi_pgroup pP).
-have [E hallE sPRE] := Hall_superset (mmax_sol maxM) sPR_M sM'_PR.
-have{sPRE} [sPE sRE] := joing_subP sPRE.
-have EpP: P \in 'E_p^1(E) by apply/pnElemP.
-have{ErR} ErR: R \in 'E_r^1('C_E(P)).
- by rewrite -(setIidPr (pHall_sub hallE)) setIAC pnElemI inE ErR inE.
-apply: subset_trans (cents_norm (subset_trans _ (subsetIr M`_\sigma _))) sNR_L.
-apply: subset_trans (cent_tau1Elem_Msigma maxM hallE t1Mp EpP ErR).
-by rewrite subsetI cPX (subset_trans sXMb) ?Mbeta_sub_Msigma.
-Qed.
-
-(* This is B & G, Theorem 13.9. *)
-Theorem sigma_partition M Mstar :
- M \in 'M -> Mstar \in 'M -> gval Mstar \notin M :^: G ->
- [predI \sigma(M) & \sigma(Mstar)] =i pred0.
-Proof.
-move: Mstar => L maxM maxL notMGL q; apply/andP=> [[/= sMq sLq]].
-have [E hallE] := ex_sigma_compl maxM; have [sEM sM'E _] := and3P hallE.
-have [_ _ nMsE _] := sdprodP (sdprod_sigma maxM hallE).
-have coMsE: coprime #|M`_\sigma| #|E| := pnat_coprime (pcore_pgroup _ _) sM'E.
-have [|S sylS nSE] := coprime_Hall_exists q nMsE coMsE.
- exact: solvableS (pcore_sub _ _) (mmax_sol maxM).
-have [sSMs qS _] := and3P sylS.
-have sylS_M := subHall_Sylow (Msigma_Hall maxM) sMq sylS.
-have ntS: S :!=: 1.
- by rewrite -rank_gt0 (rank_Sylow sylS_M) p_rank_gt0 sigma_sub_pi.
-without loss sylS_L: L maxL sLq notMGL / q.-Sylow(L) S.
- have sylS_G := sigma_Sylow_G maxM sMq sylS_M.
- have [T sylT] := Sylow_exists q L; have sylT_G := sigma_Sylow_G maxL sLq sylT.
- have [x Gx ->] := Sylow_trans sylT_G (sigma_Sylow_G maxM sMq sylS_M).
- case/(_ (L :^ x)%G); rewrite ?mmaxJ ?sigmaJ ?pHallJ2 //.
- by rewrite (orbit_transl _ (mem_orbit 'Js L Gx)).
-have [[sSL _] [[E1 hallE1] [E3 hallE3]]] := (andP sylS_L, ex_tau13_compl hallE).
-have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
-have E2_1: E2 :==: 1.
- apply: contraR ntS; rewrite -rank_gt0; have [p _ ->] := rank_witness E2.
- rewrite p_rank_gt0 => /(pnatPpi (pHall_pgroup hallE2))t2p.
- have [A Ep2A _] := ex_tau2Elem hallE t2p.
- have [_ _ _ ti_sM] := tau2_compl_context maxM hallE t2p Ep2A.
- rewrite -subG1; have [<- _] := ti_sM L maxL notMGL; rewrite subsetI sSMs /=.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxL) sSL) (pi_pgroup qS).
-have: E1 :!=: 1 by have [_ -> //] := sigma_compl_context maxM complEi.
-rewrite -rank_gt0; have [p _ ->] := rank_witness E1; case/p_rank_geP=> P EpP.
-have [[sPE1 abelP dimP] [sE1E t1E1 _]] := (pnElemP EpP, and3P hallE1).
-have ntP: P :!=: 1 by rewrite (nt_pnElem EpP).
-have piPp: p \in \pi(P) by rewrite -p_rank_gt0 ?p_rank_abelem ?dimP.
-have t1Mp: p \in \tau1(M) by rewrite (pnatPpi _ (piSg sPE1 _)).
-have sPE := subset_trans sPE1 sE1E; have sPM := subset_trans sPE sEM.
-have [sNM sNL] := (norm_sigma_Sylow sMq sylS_M, norm_sigma_Sylow sLq sylS_L).
-have nSP := subset_trans sPE nSE; have sPL := subset_trans nSP sNL.
-have regPS: 'C_S(P) = 1.
- apply: contraNeq (contra_orbit _ _ notMGL); rewrite -rank_gt0.
- rewrite (rank_pgroup (pgroupS _ qS)) ?subsetIl //; case/p_rank_geP=> Q /=.
- rewrite -(setIidPr sSMs) setIAC pnElemI; case/setIdP=> EqQ _.
- have [_ uniqSq] := cent_cent_Msigma_tau1_uniq maxM hallE hallE1 sPE1 ntP EqQ.
- by rewrite (eq_uniq_mmax (uniqSq S sylS) maxL sSL).
-have t1Lp: p \in \tau1(L).
- have not_cMsL_P: ~~ (P \subset 'C(M`_\sigma :&: L)).
- apply: contra ntS => cMsL_P; rewrite -subG1 -regPS subsetIidl centsC.
- by rewrite (subset_trans cMsL_P) ?centS // subsetI sSMs.
- apply: contraR (not_cMsL_P) => t1L'p.
- have [piEp piLp] := (piSg sPE piPp, piSg sPL piPp).
- have [] := Msigma_setI_mmax_central maxM hallE maxL piEp piLp t1L'p _ notMGL.
- apply: contraNneq not_cMsL_P; move/commG1P; rewrite centsC.
- by apply: subset_trans; rewrite subsetI sPM.
- by move->; rewrite ?(abelem_pgroup abelP) // subsetI sPM.
-case: (@tau1_mmaxI_asymmetry M L p P q S q S) => //.
- by rewrite !inE subsetI sPM sPL abelP dimP.
-by rewrite (pHall_subl _ (subsetIl M L) sylS_M) // subsetI (pHall_sub sylS_M).
-Qed.
-
-(* This is B & G, Theorem 13.10. *)
-Theorem tau13_regular M E E1 E2 E3 p P :
- M \in 'M -> sigma_complement M E E1 E2 E3 ->
- P \in 'E_p^1(E1) -> ~~ (P \subset 'C(E3)) ->
- [/\ (*a*) semiregular E3 E1,
- (*b*) semiregular M`_\sigma E3
- & (*c*) 'C_(M`_\sigma)(P) != 1].
-Proof.
-move=> maxM complEi EpP not_cE3P.
-have nsMsM: M`_\sigma <| M := pcore_normal _ M; have [sMsM nMsM] := andP nsMsM.
-have [hallMs sMaMs] := (Msigma_Hall maxM, Malpha_sub_Msigma maxM).
-have [[sE3E' nsE3E] _ [_ cycE3] _ _] := sigma_compl_context maxM complEi.
-have [hallE hallE1 _ hallE3] := complEi.
-have [[_ sM_Ms _] [sEM sM'E _]] := (and3P hallMs, and3P hallE).
-have [[sE1E t1E1 _] [sE3E t3E3 _] _] := (and3P hallE1, and3P hallE3).
-have [sPE1 abelP dimP] := pnElemP EpP; have [pP _ _] := and3P abelP.
-have [ntP t1MP] := (nt_pnElem EpP isT, pgroupS sPE1 t1E1).
-have sPE := subset_trans sPE1 sE1E; have sPM := subset_trans sPE sEM.
-have piPp: p \in \pi(P) by rewrite -p_rank_gt0 p_rank_abelem ?dimP.
-have t1Mp: p \in \tau1(M) := pnatPpi t1MP piPp.
-have [Q sylQ not_cPQ]: exists2 Q, Sylow E3 (gval Q) & ~~ (P \subset 'C(Q)).
- apply/exists_inP; rewrite -negb_forall_in; apply: contra not_cE3P.
- move/forall_inP=> cPE3; rewrite centsC -(Sylow_gen E3) gen_subG.
- by apply/bigcupsP=> Q sylQ; rewrite centsC cPE3.
-have{sylQ} [q q_pr sylQ] := SylowP _ _ sylQ; have [sQE3 qQ _] := and3P sylQ.
-have ntQ: Q :!=: 1 by apply: contraNneq not_cPQ => ->; apply: cents1.
-have t3Mq: q \in \tau3(M).
- by rewrite (pnatPpi t3E3) // -p_rank_gt0 -(rank_Sylow sylQ) rank_gt0.
-have nQP: P \subset 'N(Q).
- rewrite (subset_trans sPE) ?normal_norm //.
- by rewrite (char_normal_trans _ nsE3E) ?sub_cyclic_char.
-have regPQ: 'C_Q(P) = 1.
- apply: contraNeq not_cPQ; rewrite setIC => /meet_Ohm1.
- rewrite setIC => /prime_meetG/=/implyP.
- rewrite (Ohm1_cyclic_pgroup_prime (cyclicS sQE3 cycE3) qQ) // q_pr centsC.
- apply: (coprime_odd_faithful_Ohm1 qQ) nQP _ (mFT_odd _).
- exact: sub_pnat_coprime tau3'1 (pgroupS sQE3 t3E3) t1MP.
-have sQE' := subset_trans sQE3 sE3E'.
-have sQM := subset_trans (subset_trans sQE3 sE3E) sEM.
-have [L maxNL] := mmax_exists (mFT_norm_proper ntQ (mFT_pgroup_proper qQ)).
-have [maxL sNQL] := setIdP maxNL; have sQL := subset_trans (normG Q) sNQL.
-have notMGL: gval L \notin M :^: G.
- by apply: mmax_norm_notJ maxM maxL qQ sQM sNQL _; rewrite t3Mq !orbT.
-have [ntCMaP tiCMaQP]: 'C_(M`_\alpha)(P) != 1 /\ 'C_(M`_\alpha)(Q <*> P) = 1.
- have EpMP: P \in 'E_p^1(M) by apply/pnElemP.
- have p'q: q != p by apply: contraNneq (tau3'1 t1Mp) => <-.
- have [|_ [] //] := cent_Malpha_reg_tau1 maxM t1Mp p'q EpMP ntQ nQP regPQ.
- by apply: contraTneq maxNL => ->; rewrite inE (contra_orbit _ _ notMGL).
- have sM'q: q \in \sigma(M)^' by case/andP: t3Mq.
- exact: subHall_Sylow hallE sM'q (subHall_Sylow hallE3 t3Mq sylQ).
-split=> [x E1x | x E3x |]; last exact: subG1_contra (setSI _ sMaMs) ntCMaP.
- apply: contraNeq ntCMaP => ntCE3X.
- have prE31: semiprime M`_\sigma (E3 <*> E1).
- apply: tau13_primact_Msigma maxM complEi _ => regE13.
- by rewrite regE13 ?eqxx in ntCE3X.
- rewrite -subG1 -tiCMaQP /= -(setIidPl sMaMs) -!setIA setIS //.
- rewrite (cent_semiprime prE31 _ ntP) ?setIS ?centS //=.
- by rewrite -!genM_join genS ?mulgSS.
- by rewrite sub_gen // subsetU // sPE1 orbT.
-have prE3 := tau3_primact_Msigma maxM hallE hallE3.
-apply/eqP; apply/idPn; rewrite prE3 {x E3x}// -rank_gt0.
-have [u _ -> ruC] := rank_witness 'C_(M`_\sigma)(E3).
-have sCMs := subsetIl M`_\sigma 'C(E3).
-have sMu: u \in \sigma(M) by rewrite (pnatPpi (pgroupS sCMs _)) -?p_rank_gt0.
-have nCE: E \subset 'N('C_(M`_\sigma)(E3)).
- by rewrite normsI ?norms_cent ?(normal_norm nsE3E) // (subset_trans sEM).
-have coCE := coprimeSg sCMs (pnat_coprime (pcore_pgroup _ _) sM'E).
-have solC := solvableS (subset_trans sCMs sMsM) (mmax_sol maxM).
-have{nCE coCE solC} [U sylU nUE] := coprime_Hall_exists u nCE coCE solC.
-have ntU: U :!=: 1 by rewrite -rank_gt0 (rank_Sylow sylU).
-have cMsL_Q: Q \subset 'C(M`_\sigma :&: L).
- have t13q: (q \in \tau1(M)) || (q \in \tau3(M)) by rewrite t3Mq orbT.
- have [-> //] := cent_norm_tau13_mmax maxM hallE t13q sQM qQ maxNL.
- by rewrite subsetI sQM.
-rewrite /= -(cent_semiprime prE3 sQE3 ntQ) in sylU.
-have [sUMs cQU] := subsetIP (pHall_sub sylU).
-have{cMsL_Q} sylU_MsL: u.-Sylow(M`_\sigma :&: L) U.
- apply: pHall_subl sylU; last by rewrite subsetI subsetIl centsC.
- by rewrite subsetI sUMs (subset_trans (cents_norm _) sNQL).
-have sylU_ML: u.-Sylow(M :&: L) U.
- apply: subHall_Sylow sMu sylU_MsL.
- by rewrite /= -(setIidPl sMsM) -setIA (setI_normal_Hall nsMsM) ?subsetIl.
-have [sUML uU _] := and3P sylU_ML; have{sUML} [sUM sUL] := subsetIP sUML.
-have [sNUM regPU]: 'N(U) \subset M /\ 'C_U(P) = 1.
- have [bMu | bM'u] := boolP (u \in \beta(M)).
- have [bM_U sMbMa] := (pi_pgroup uU bMu, Mbeta_sub_Malpha M).
- split; first by rewrite beta_norm_sub_mmax /psubgroup ?sUM.
- apply/trivgP; rewrite -tiCMaQP centY setIA setSI // subsetI cQU.
- by rewrite (subset_trans _ sMbMa) // (sub_Hall_pcore (Mbeta_Hall maxM)).
- have sylU_Ms: u.-Sylow(M`_\sigma) U.
- have [H hallH cHE'] := der_compl_cent_beta' maxM hallE.
- rewrite pHallE sUMs (card_Hall sylU) eqn_dvd.
- rewrite partn_dvd ?cardG_gt0 ?cardSg ?subsetIl //=.
- rewrite -(@partn_part u \beta(M)^') => [|v /eqnP-> //].
- rewrite -(card_Hall hallH) partn_dvd ?cardG_gt0 ?cardSg //.
- by rewrite subsetI (pHall_sub hallH) centsC (subset_trans sQE').
- split; first exact: norm_sigma_Sylow (subHall_Sylow hallMs sMu sylU_Ms).
- apply: contraNeq (contra_orbit _ _ notMGL); rewrite -rank_gt0.
- rewrite (rank_pgroup (pgroupS _ uU)) ?subsetIl // => /p_rank_geP[X] /=.
- rewrite -(setIidPr sUMs) setIAC pnElemI -setIdE => /setIdP[EuX sXU].
- have [_ uniqU] := cent_cent_Msigma_tau1_uniq maxM hallE hallE1 sPE1 ntP EuX.
- by rewrite (eq_uniq_mmax (uniqU U sylU_Ms) maxL).
-have sPL := subset_trans nQP sNQL.
-have sPML: P \subset M :&: L by apply/subsetIP.
-have t1Lp: p \in \tau1(L).
- have not_cMsL_P: ~~ (P \subset 'C(M`_\sigma :&: L)).
- apply: contra ntU => cMsL_P; rewrite -subG1 -regPU subsetIidl.
- by rewrite centsC (centsS (pHall_sub sylU_MsL)).
- apply: contraR (not_cMsL_P) => t1L'p.
- have [piEp piLp] := (piSg sPE piPp, piSg sPL piPp).
- case: (Msigma_setI_mmax_central maxM hallE maxL piEp piLp) => // [|->] //.
- apply: contraNneq not_cMsL_P => /commG1P.
- by rewrite centsC; apply: subset_trans sPML.
-have EpMLP: P \in 'E_p^1(M :&: L) by apply/pnElemP.
-case: (@tau1_mmaxI_asymmetry M L p P q Q u U) => //.
-have [sylQ_E [sM'q _]] := (subHall_Sylow hallE3 t3Mq sylQ, andP t3Mq).
-have sylQ_M := subHall_Sylow hallE sM'q sylQ_E.
-have sQML: Q \subset M :&: L by apply/subsetIP.
-by rewrite (subset_trans sPE nUE) (pHall_subl sQML _ sylQ_M) ?subsetIl.
-Qed.
-
-(* This is B & G, Corollary 13.11. *)
-Corollary tau13_nonregular M E E1 E2 E3 :
- M \in 'M -> sigma_complement M E E1 E2 E3 -> ~ semiregular M`_\sigma E3 ->
- [/\ (*a*) E1 :!=: 1,
- (*b*) E3 ><| E1 = E,
- (*c*) semiprime M`_\sigma E
- & (*d*) forall X, X \in 'E^1(E) -> X <| E].
-Proof.
-move=> maxM complEi not_regE3Ms.
-have [hallE hallE1 hallE2 hallE3 _] := complEi.
-have [[sE1E t1E1 _] [sE3E t3E3 _]] := (and3P hallE1, and3P hallE3).
-have{hallE2} E2_1: E2 :==: 1.
- apply/idPn; rewrite -rank_gt0; have [p _ ->] := rank_witness E2.
- rewrite p_rank_gt0 => /(pnatPpi (pHall_pgroup hallE2))t2p.
- have [A Ep2A _] := ex_tau2Elem hallE t2p.
- by apply: not_regE3Ms; case: (tau2_regular maxM complEi t2p Ep2A).
-have [_ ntE1 [cycE1 cycE3] [defE _] _] := sigma_compl_context maxM complEi.
-rewrite (eqP E2_1) sdprod1g in defE; have{ntE1} ntE1 := ntE1 E2_1.
-have [nsE3E _ mulE31 nE31 _] := sdprod_context defE.
-have cE3E1 P: P \in 'E^1(E1) -> P \subset 'C(E3).
- by case/nElemP=> p EpP; apply/idPn => /(tau13_regular maxM complEi EpP)[].
-split=> // [|X EpX].
- rewrite -mulE31 -norm_joinEr //.
- have [-> | ntE3] := eqsVneq E3 1.
- by rewrite joing1G; apply: (tau1_primact_Msigma maxM hallE hallE1).
- apply: tau13_primact_Msigma maxM complEi _ => regE13.
- have:= ntE1; rewrite -rank_gt0; case/rank_geP=> P EpP.
- have cPE3: E3 \subset 'C(P) by rewrite centsC cE3E1.
- have [p Ep1P] := nElemP EpP; have [sPE1 _ _] := pnElemP Ep1P.
- have ntP: P :!=: 1 by apply: (nt_pnElem Ep1P).
- by case/negP: ntE3; rewrite -(setIidPl cPE3) (cent_semiregular regE13 _ ntP).
-have [p Ep1X] := nElemP EpX; have [sXE abelX oX] := pnElemPcard Ep1X.
-have [p_pr ntX] := (pnElem_prime Ep1X, nt_pnElem Ep1X isT).
-have tau31p: p \in [predU \tau3(M) & \tau1(M)].
- rewrite (pgroupP (pgroupS sXE _)) ?oX // -mulE31 pgroupM.
- rewrite (sub_pgroup _ t3E3) => [|q t3q]; last by rewrite inE /= t3q.
- by rewrite (sub_pgroup _ t1E1) // => q t1q; rewrite inE /= t1q orbT.
-have [/= t3p | t1p] := orP tau31p.
- rewrite (char_normal_trans _ nsE3E) ?sub_cyclic_char //.
- by rewrite (sub_normal_Hall hallE3) // (pi_pgroup (abelem_pgroup abelX)).
-have t1X := pi_pgroup (abelem_pgroup abelX) t1p.
-have [e Ee sXeE1] := Hall_Jsub (sigma_compl_sol hallE) hallE1 sXE t1X.
-rewrite /normal sXE -(conjSg _ _ e) conjGid //= -normJ -mulE31 mulG_subG.
-rewrite andbC sub_abelian_norm ?cyclic_abelian ?cents_norm // centsC cE3E1 //.
-rewrite -(setIidPr sE1E) nElemI !inE sXeE1 andbT.
-by rewrite -(pnElemJ e) conjGid // def_pnElem in Ep1X; case/setIP: Ep1X.
-Qed.
-
-(* This is B & G, Lemma 13.12. *)
-Lemma tau12_regular M E p q P A :
- M \in 'M -> \sigma(M)^'.-Hall(M) E ->
- p \in \tau1(M) -> P \in 'E_p^1(E) -> q \in \tau2(M) -> A \in 'E_q^2(E) ->
- 'C_A(P) != 1 ->
- 'C_(M`_\sigma)(P) = 1.
-Proof.
-move=> maxM hallE t1p EpP t2q Eq2A ntCAP; apply: contraNeq (ntCAP) => ntCMsP.
-have [[nsAE _] _ uniq_cMs _] := tau2_compl_context maxM hallE t2q Eq2A.
-have [sPE abelP dimP] := pnElemP EpP; have [pP _] := andP abelP.
-have ntP: P :!=: 1 by apply: nt_pnElem EpP _.
-have [solE t1P] := (sigma_compl_sol hallE, pi_pgroup pP t1p).
-have [E1 hallE1 sPE1] := Hall_superset solE sPE t1P.
-have [_ [E3 hallE3]] := ex_tau13_compl hallE.
-have [E2 _ complEi] := ex_tau2_compl hallE hallE1 hallE3.
-have not_cAP: ~~ (P \subset 'C(A)).
- have [_ regCE1A _] := tau2_regular maxM complEi t2q Eq2A.
- apply: contra ntCMsP => cAP; rewrite (cent_semiregular regCE1A _ ntP) //.
- exact/subsetIP.
-have [sAE abelA dimA] := pnElemP Eq2A; have [qA _] := andP abelA.
-pose Y := 'C_A(P)%G; have{abelA dimA} EqY: Y \in 'E_q^1('C_E(P)).
- have sYA: Y \subset A := subsetIl A _; have abelY := abelemS sYA abelA.
- rewrite !inE setSI // abelY eqn_leq -{2}rank_abelem // rank_gt0 -ltnS -dimA.
- by rewrite properG_ltn_log //= /proper subsetIl subsetIidl centsC.
-have ntCMsY: 'C_(M`_\sigma)(Y) != 1.
- by apply: subG1_contra ntCMsP; apply: cent_tau1Elem_Msigma t1p EpP EqY.
-have EqEY: Y \in 'E_q^1(E) by rewrite pnElemI in EqY; case/setIP: EqY.
-have uniqCY := uniq_cMs _ EqEY ntCMsY.
-have [ntA nAE] := (nt_pnElem Eq2A isT, normal_norm nsAE).
-have [L maxNL] := mmax_exists (mFT_norm_proper ntA (mFT_pgroup_proper qA)).
-have [sLq t12Lp]: q \in \sigma(L) /\ (p \in \tau1(L)) || (p \in \tau2(L)).
- have [sLt2 t12cA' _] := primes_norm_tau2Elem maxM hallE t2q Eq2A maxNL.
- split; first by have /andP[] := sLt2 q t2q.
- apply: pnatPpi (pgroupS (quotientS _ sPE) t12cA') _.
- rewrite -p_rank_gt0 -rank_pgroup ?quotient_pgroup // rank_gt0.
- rewrite -subG1 quotient_sub1 ?subsetI ?sPE // (subset_trans sPE) //.
- by rewrite normsI ?normG ?norms_cent.
-have [maxL sNL] := setIdP maxNL; have sEL := subset_trans nAE sNL.
-have sL'p: p \in \sigma(L)^' by move: t12Lp; rewrite -andb_orr => /andP[].
-have [sPL sL'P] := (subset_trans sPE sEL, pi_pgroup pP sL'p).
-have{sL'P} [F hallF sPF] := Hall_superset (mmax_sol maxL) sPL sL'P.
-have solF := sigma_compl_sol hallF.
-have [sAL sL_A] := (subset_trans (normG A) sNL, pi_pgroup qA sLq).
-have sALs: A \subset L`_\sigma by rewrite (sub_Hall_pcore (Msigma_Hall maxL)).
-have neqLM: L != M by apply: contraTneq sLq => ->; case/andP: t2q.
-have{t12Lp} [t1Lp | t2Lp] := orP t12Lp.
- have [F1 hallF1 sPF1] := Hall_superset solF sPF (pi_pgroup pP t1Lp).
- have EqLsY: Y \in 'E_q^1('C_(L`_\sigma)(P)).
- by rewrite !inE setSI //; case/pnElemP: EqY => _ -> ->.
- have [defL _] := cent_cent_Msigma_tau1_uniq maxL hallF hallF1 sPF1 ntP EqLsY.
- by rewrite -in_set1 -uniqCY defL set11 in neqLM.
-have sCPL: 'C(P) \subset L.
- have [B Ep2B _] := ex_tau2Elem hallF t2Lp.
- have EpFP: P \in 'E_p^1(F) by apply/pnElemP.
- have [_ _ uniq_cLs _] := tau2_compl_context maxL hallF t2Lp Ep2B.
- by case/mem_uniq_mmax: (uniq_cLs _ EpFP (subG1_contra (setSI _ sALs) ntCAP)).
-have Eq2MA: A \in 'E_q^2(M).
- by move: Eq2A; rewrite -(setIidPr (pHall_sub hallE)) pnElemI => /setIP[].
-have [_ _ _ tiMsL _] := tau2_context maxM t2q Eq2MA.
-by case/negP: ntCMsP; rewrite -subG1 -(tiMsL L) ?setIS // 3!inE neqLM maxL.
-Qed.
-
-(* This is B & G, Lemma 13.13. *)
-Lemma tau13_nonregular_sigma M E p P :
- M \in 'M -> \sigma(M)^'.-Hall(M) E ->
- P \in 'E_p^1(E) -> (p \in \tau1(M)) || (p \in \tau3(M)) ->
- 'C_(M`_\sigma)(P) != 1 ->
- {in 'M('N(P)), forall Mstar, p \in \sigma(Mstar)}.
-Proof.
-move=> maxM hallE EpP t13Mp ntCMsP L maxNL /=.
-have [maxL sNL] := setIdP maxNL.
-have [sPE abelP dimP] := pnElemP EpP; have [pP _] := andP abelP.
-have [solE ntP] := (sigma_compl_sol hallE, nt_pnElem EpP isT).
-have /orP[// | t2Lp] := prime_class_mmax_norm maxL pP sNL.
-have:= ntCMsP; rewrite -rank_gt0 => /rank_geP[Q /nElemP[q EqQ]].
-have [sQcMsP abelQ dimQ] := pnElemP EqQ; have [sQMs cPQ] := subsetIP sQcMsP.
-have piQq: q \in \pi(Q) by rewrite -p_rank_gt0 p_rank_abelem ?dimQ.
-have sMq: q \in \sigma(M) := pnatPpi (pgroupS sQMs (pcore_pgroup _ M)) piQq.
-have rpM: 'r_p(M) = 1%N by move: t13Mp; rewrite -2!andb_orr andbCA; case: eqP.
-have sL'q: q \notin \sigma(L).
- have notMGL: gval L \notin M :^: G.
- by apply: contraL t2Lp => /imsetP[x _ ->]; rewrite tau2J 2!inE rpM andbF.
- by apply: contraFN (sigma_partition maxM maxL notMGL q) => sLq; apply/andP.
-have [[sL'p _] [qQ _]] := (andP t2Lp, andP abelQ).
-have sL'PQ: \sigma(L)^'.-group (P <*> Q).
- by rewrite cent_joinEr // pgroupM (pi_pgroup pP) // (pi_pgroup qQ).
-have sPQ_L: P <*> Q \subset L.
- by rewrite (subset_trans _ sNL) // join_subG normG cents_norm.
-have{sPQ_L sL'PQ} [F hallF sPQF] := Hall_superset (mmax_sol maxL) sPQ_L sL'PQ.
-have{sPQF} [sPF sQF] := joing_subP sPQF.
-have [A Ep2A _] := ex_tau2Elem hallF t2Lp.
-have [[nsAF defA1] _ _ _] := tau2_compl_context maxL hallF t2Lp Ep2A.
-have EpAP: P \in 'E_p^1(A) by rewrite -defA1; apply/pnElemP.
-have{EpAP} sPA: P \subset A by case/pnElemP: EpAP.
-have sCQM: 'C(Q) \subset M.
- suffices: 'M('C(Q)) = [set M] by case/mem_uniq_mmax.
- have [t1Mp | t3Mp] := orP t13Mp.
- have [E1 hallE1 sPE1] := Hall_superset solE sPE (pi_pgroup pP t1Mp).
- by have [] := cent_cent_Msigma_tau1_uniq maxM hallE hallE1 sPE1 ntP EqQ.
- have [E3 hallE3 sPE3] := Hall_superset solE sPE (pi_pgroup pP t3Mp).
- have [[E1 hallE1] _] := ex_tau13_compl hallE; have [sE1E _] := andP hallE1.
- have [E2 _ complEi] := ex_tau2_compl hallE hallE1 hallE3.
- have [regE3 | ntE1 _ prE _] := tau13_nonregular maxM complEi.
- by rewrite (cent_semiregular regE3 sPE3 ntP) eqxx in ntCMsP.
- rewrite /= (cent_semiprime prE) // -(cent_semiprime prE sE1E ntE1) in EqQ.
- by have [] := cent_cent_Msigma_tau1_uniq maxM hallE hallE1 _ ntE1 EqQ.
-have not_cQA: ~~ (A \subset 'C(Q)).
- have [_ abelA dimA] := pnElemP Ep2A; apply: contraFN (ltnn 1) => cQA.
- by rewrite -dimA -p_rank_abelem // -rpM p_rankS ?(subset_trans cQA sCQM).
-have t1Lq: q \in \tau1(L).
- have [_ nsCF t1Fb] := tau1_cent_tau2Elem_factor maxL hallF t2Lp Ep2A.
- rewrite (pnatPpi (pgroupS (quotientS _ sQF) t1Fb)) //.
- rewrite -p_rank_gt0 -rank_pgroup ?quotient_pgroup // rank_gt0.
- rewrite -subG1 quotient_sub1 ?(subset_trans _ (normal_norm nsCF)) //.
- by rewrite subsetI sQF centsC.
-have defP: 'C_A(Q) = P.
- apply/eqP; rewrite eq_sym eqEcard subsetI sPA centsC cPQ /=.
- have [_ abelA dimA] := pnElemP Ep2A; have [pA _] := andP abelA.
- rewrite (card_pgroup (pgroupS _ pA)) ?subsetIl // (card_pgroup pP) dimP.
- rewrite leq_exp2l ?prime_gt1 ?(pnElem_prime EpP) //.
- by rewrite -ltnS -dimA properG_ltn_log // /proper subsetIl subsetIidl.
-have EqFQ: Q \in 'E_q^1(F) by apply/pnElemP.
-have regQLs: 'C_(L`_\sigma)(Q) = 1.
- by rewrite (tau12_regular maxL hallF t1Lq EqFQ t2Lp Ep2A) // defP.
-have ntAQ: [~: A, Q] != 1 by rewrite (sameP eqP commG1P).
-have [_ _ [_]] := tau1_act_tau2 maxL hallF t2Lp Ep2A t1Lq EqFQ regQLs ntAQ.
-by case/negP; rewrite /= defP (subset_trans (cent_sub P)).
-Qed.
-
-End Section13.
-
diff --git a/mathcomp/odd_order/BGsection14.v b/mathcomp/odd_order/BGsection14.v
deleted file mode 100644
index bc6f9e2..0000000
--- a/mathcomp/odd_order/BGsection14.v
+++ /dev/null
@@ -1,2520 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq div path fintype.
-From mathcomp
-Require Import bigop finset prime fingroup morphism perm automorphism quotient.
-From mathcomp
-Require Import action gproduct gfunctor pgroup cyclic center commutator.
-From mathcomp
-Require Import gseries nilpotent sylow abelian maximal hall frobenius.
-From mathcomp
-Require Import ssralg ssrnum ssrint rat.
-From mathcomp
-Require Import BGsection1 BGsection3 BGsection4 BGsection5 BGsection6.
-From mathcomp
-Require Import BGsection7 BGsection9 BGsection10 BGsection12 BGsection13.
-
-(******************************************************************************)
-(* This file covers B & G, section 14, starting with the definition of the *)
-(* sigma-decomposition of elements, sigma-supergroups, and basic categories *)
-(* of maximal subgroups: *)
-(* sigma_decomposition x == the set of nontrivial constituents x.`_\sigma(M), *)
-(* with M ranging over maximal sugroups of G. *)
-(* (x is the product of these). *)
-(* \ell_\sigma[x] == #|sigma_decomposition x|. *)
-(* 'M_\sigma(X) == the set of maximal subgroups M such that X is a *)
-(* a subset of M`_\sigma. *)
-(* 'M_\sigma[x] := 'M_\sigma(<[x]>) *)
-(* \kappa(M) == the set of primes p in \tau1(M) or \tau3(M), such *)
-(* that 'C_(M`_\sigma)(P) != 1 for some subgroup of *)
-(* M of order p, i.e., the primes for which M fails *)
-(* to be a Frobenius group. *)
-(* kappa_complement M U K <-> U and K are respectively {kappa, sigma}'- and *)
-(* kappa-Hall subgroups of M, whose product is a *)
-(* sigma-complement of M. This corresponds to the *)
-(* notation introduced at the start of section 15 in *)
-(* B & G, but is needed here to capture the use of *)
-(* bound variables of 14.2(a) in the statement of *)
-(* Lemma 14.12. *)
-(* 'M_'F == the set of maximal groups M for which \kappa(M) *)
-(* is empty, i.e., the maximal groups of Frobenius *)
-(* type (in the final classification, this becomes *)
-(* Type I). *)
-(* 'M_'P == the complement to 'M_'F in 'M, i.e., the set of M *)
-(* for which at least E1 has a proper prime action *)
-(* on M`_\sigma. *)
-(* 'M_'P1 == the set of maximal subgroups M such that \pi(M) *)
-(* is the disjoint union of \sigma(M) and \kappa(M), *)
-(* i.e., for which the entire complement acts in a *)
-(* prime manner (this troublesome subset of 'M_'P is *)
-(* ultimately refined into Types III-V in the final *)
-(* classification). *)
-(* 'M_'P2 == the complement to 'M_'P1 in 'M_'P; this becomes *)
-(* Type II in the final classification. *)
-(* 'N[x] == if x != 1 and 'M_\sigma[x] > 1, the unique group *)
-(* in 'M('C[x]) (see B & G, Theorem 14.4), and the *)
-(* trivial group otherwise. *)
-(* 'R[x] := 'C_('N[x]`_\sigma)[x]; if \ell_\sigma[x] == 1, *)
-(* this is the normal Hall subgroup of 'C[x] that *)
-(* acts sharply transitively by conjugagtion on *)
-(* 'M`_\sigma[x] (again, by Theorem 14.4). *)
-(* M^~~ == the union of all the cosets x *: 'R[x], with x *)
-(* ranging over (M`_\sigma)^#. This will become the *)
-(* support set for the Dade isometry for M in the *)
-(* character theory part of the proof. *)
-(* It seems 'R[x] and 'N[x]`_\sigma play a somewhat the role of a signalizer *)
-(* functor in the FT proof; in particular 'R[x] will be used to construct the *)
-(* Dade isometry in the character theory part of the proof. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Local Open Scope ring_scope.
-Local Open Scope nat_scope.
-Import GRing.Theory Num.Theory GroupScope.
-
-Section Definitons.
-
-Variable gT : minSimpleOddGroupType.
-Implicit Type x : gT.
-Implicit Type M X : {set gT}.
-
-Definition sigma_decomposition x :=
- [set x.`_\sigma(M) | M : {group gT} in 'M]^#.
-Definition sigma_length x := #|sigma_decomposition x|.
-
-Definition sigma_mmax_of X := [set M in 'M | X \subset M`_\sigma].
-
-Definition FT_signalizer_base x :=
- if #|sigma_mmax_of <[x]>| > 1 then odflt 1%G (pick (mem 'M('C[x]))) else 1%G.
-
-Definition FT_signalizer x := 'C_((FT_signalizer_base x)`_\sigma)[x].
-
-Definition sigma_cover M := \bigcup_(x in (M`_\sigma)^#) x *: FT_signalizer x.
-
-Definition tau13 M := [predU \tau1(M) & \tau3(M)].
-
-Fact kappa_key : unit. Proof. by []. Qed.
-Definition kappa_def M : nat_pred :=
- [pred p in tau13 M | [exists P in 'E_p^1(M), 'C_(M`_\sigma)(P) != 1]].
-Definition kappa := locked_with kappa_key kappa_def.
-Canonical kappa_unlockable := [unlockable fun kappa].
-
-Definition sigma_kappa M := [predU \sigma(M) & kappa M].
-
-Definition kappa_complement (M U K : {set gT}) :=
- [/\ (sigma_kappa M)^'.-Hall(M) U, (kappa M).-Hall(M) K & group_set (U * K)].
-
-Definition TypeF_maxgroups := [set M in 'M | (kappa M)^'.-group M].
-
-Definition TypeP_maxgroups := 'M :\: TypeF_maxgroups.
-
-Definition TypeP1_maxgroups :=
- [set M in TypeP_maxgroups | (sigma_kappa M).-group M].
-
-Definition TypeP2_maxgroups := TypeP_maxgroups :\: TypeP1_maxgroups.
-
-End Definitons.
-
-Notation "\ell_ \sigma ( x )" := (sigma_length x)
- (at level 8, format "\ell_ \sigma ( x )") : group_scope.
-
-Notation "''M_' \sigma ( X )" := (sigma_mmax_of X)
- (at level 8, format "''M_' \sigma ( X )") : group_scope.
-
-Notation "''M_' \sigma [ x ]" := (sigma_mmax_of <[x]>)
- (at level 8, format "''M_' \sigma [ x ]") : group_scope.
-
-Notation "''N' [ x ]" := (FT_signalizer_base x)
- (at level 8, format "''N' [ x ]") : group_scope.
-
-Notation "''R' [ x ]" := (FT_signalizer x)
- (at level 8, format "''R' [ x ]") : group_scope.
-
-Notation "M ^~~" := (sigma_cover M)
- (at level 2, format "M ^~~") : group_scope.
-
-Notation "\tau13 ( M )" := (tau13 M)
- (at level 8, format "\tau13 ( M )") : group_scope.
-
-Notation "\kappa ( M )" := (kappa M)
- (at level 8, format "\kappa ( M )") : group_scope.
-
-Notation "\sigma_kappa ( M )" := (sigma_kappa M)
- (at level 8, format "\sigma_kappa ( M )") : group_scope.
-
-Notation "''M_' ''F'" := (TypeF_maxgroups _)
- (at level 2, format "''M_' ''F'") : group_scope.
-
-Notation "''M_' ''P'" := (TypeP_maxgroups _)
- (at level 2, format "''M_' ''P'") : group_scope.
-
-Notation "''M_' ''P1'" := (TypeP1_maxgroups _)
- (at level 2, format "''M_' ''P1'") : group_scope.
-
-Notation "''M_' ''P2'" := (TypeP2_maxgroups _)
- (at level 2, format "''M_' ''P2'") : group_scope.
-
-Section Section14.
-
-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}.
-
-(* Basic properties of the sigma decomposition. *)
-Lemma mem_sigma_decomposition x M (xM := x.`_\sigma(M)) :
- M \in 'M -> xM != 1 -> xM \in sigma_decomposition x.
-Proof. by move=> maxM nt_xM; rewrite !inE nt_xM; apply: mem_imset. Qed.
-
-Lemma sigma_decompositionJ x z :
- sigma_decomposition (x ^ z) = sigma_decomposition x :^ z.
-Proof.
-rewrite conjD1g -[_ :^ z]imset_comp; congr _^#.
-by apply: eq_in_imset => M maxM; rewrite /= consttJ.
-Qed.
-
-Lemma ell_sigmaJ x z : \ell_\sigma(x ^ z) = \ell_\sigma(x).
-Proof. by rewrite /sigma_length sigma_decompositionJ cardJg. Qed.
-
-Lemma sigma_mmaxJ M (X : {set gT}) z :
- ((M :^ z)%G \in 'M_\sigma(X :^ z)) = (M \in 'M_\sigma(X)).
-Proof. by rewrite inE mmaxJ MsigmaJ conjSg !inE. Qed.
-
-Lemma card_sigma_mmaxJ (X : {set gT}) z :
- #|'M_\sigma(X :^ z)| = #|'M_\sigma(X)|.
-Proof.
-rewrite -(card_setact 'JG _ z^-1) setactVin ?inE //.
-by apply: eq_card => M; rewrite inE sigma_mmaxJ.
-Qed.
-
-Lemma sigma_decomposition_constt' x M (sM := \sigma(M)) :
- M \in 'M -> sigma_decomposition x.`_sM^' = sigma_decomposition x :\ x.`_sM.
-Proof.
-move=> maxM; apply/setP=> y; rewrite !inE andbCA; apply: andb_id2l => nty.
-apply/imsetP/andP=> [ | [neq_y_xM /imsetP]] [L maxL def_y].
- have not_sMy: ~~ sM.-elt y.
- apply: contra nty => sMy; rewrite -order_eq1 (pnat_1 sMy) // def_y.
- by apply: p_eltX; apply: p_elt_constt.
- split; first by apply: contraNneq not_sMy => ->; apply: p_elt_constt.
- have notMGL: gval L \notin M :^: G.
- apply: contra not_sMy; rewrite def_y; case/imsetP=> z _ ->.
- by rewrite (eq_constt _ (sigmaJ M z)) p_elt_constt.
- apply/imsetP; exists L; rewrite // def_y sub_in_constt // => p _ sLp.
- by apply: contraFN (sigma_partition maxM maxL notMGL p) => sMp; apply/andP.
-exists L; rewrite ?sub_in_constt // => p _ sLp.
-suffices notMGL: gval L \notin M :^: G.
- by apply: contraFN (sigma_partition maxM maxL notMGL p) => sMp; apply/andP.
-apply: contra neq_y_xM; rewrite def_y => /imsetP[z _ ->].
-by rewrite (eq_constt _ (sigmaJ M z)).
-Qed.
-
-(* General remarks about the sigma-decomposition, p. 105 of B & G. *)
-Remark sigma_mmax_exists p :
- p \in \pi(G) -> {M : {group gT} | M \in 'M & p \in \sigma(M)}.
-Proof.
-move=> piGp; have [P sylP] := Sylow_exists p [set: gT].
-have ntP: P :!=: 1 by rewrite -rank_gt0 (rank_Sylow sylP) p_rank_gt0.
-have ltPG: P \proper G := mFT_pgroup_proper (pHall_pgroup sylP).
-have [M maxNM] := mmax_exists (mFT_norm_proper ntP ltPG).
-have{maxNM} [maxM sNM] := setIdP maxNM; have sPM := subset_trans (normG P) sNM.
-have{sylP} sylP := pHall_subl sPM (subsetT M) sylP.
-by exists M => //; apply/exists_inP; exists P.
-Qed.
-
-Lemma ell_sigma0P x : reflect (x = 1) (\ell_\sigma(x) == 0).
-Proof.
-rewrite cards_eq0 setD_eq0.
-apply: (iffP idP) => [x1 | ->]; last first.
- by apply/subsetP=> _ /imsetP[M _ ->]; rewrite constt1 inE.
-rewrite -(prod_constt x) big1_seq //= => p _; apply: contraTeq x1 => nt_xp.
-have piXp: p \in \pi(#[x]) by rewrite -p_part_gt1 -order_constt order_gt1.
-have [M maxM sMp] := sigma_mmax_exists (piSg (subsetT _) piXp).
-apply/subsetPn; exists (x.`_(\sigma(M))); first exact: mem_imset.
-by rewrite (sameP set1P constt1P); apply: contraL sMp => /pnatPpi; apply.
-Qed.
-
-Remark sigma_decomposition_subG x H :
- x \in H -> sigma_decomposition x \subset H.
-Proof.
-by move=> Hx; apply/subsetP=> _ /setD1P[_ /imsetP[M _ ->]]; apply: groupX.
-Qed.
-
-Remark prod_sigma_decomposition x :
- \prod_(x_sM in sigma_decomposition x) x_sM = x.
-Proof.
-rewrite -big_filter filter_index_enum; set e := enum _.
-have: uniq e := enum_uniq _; have: e =i sigma_decomposition x := mem_enum _.
-elim: {x}e (x) => [|y e IHe] x def_e /= Ue.
- by rewrite big_nil (ell_sigma0P x _) //; apply/pred0P; apply: fsym.
-have{Ue} [not_e_y Ue] := andP Ue.
-have [nty] := setD1P (etrans (fsym def_e y) (mem_head _ _)).
-case/imsetP=> M maxM def_y; rewrite big_cons -(consttC \sigma(M) x) -def_y.
-congr (y * _); apply: IHe Ue => z; rewrite sigma_decomposition_constt' //.
-rewrite -def_y inE -def_e !inE andb_orr andNb andb_idl //.
-by apply: contraTneq => ->.
-Qed.
-
-Lemma ell1_decomposition x :
- \ell_\sigma(x) == 1%N -> sigma_decomposition x = [set x].
-Proof.
-case/cards1P=> y sdx_y.
-by rewrite -{2}[x]prod_sigma_decomposition sdx_y big_set1.
-Qed.
-
-Lemma Msigma_ell1 M x :
- M \in 'M -> x \in (M`_\sigma)^# -> \ell_\sigma(x) == 1%N.
-Proof.
-move=> maxM /setD1P[ntx Ms_x]; apply/cards1P.
-have sMx: \sigma(M).-elt x := mem_p_elt (pcore_pgroup _ _) Ms_x.
-have def_xM: x.`_(\sigma(M)) = x := constt_p_elt sMx.
-exists x; apply/eqP; rewrite eqEsubset sub1set !inE ntx -setD_eq0 /=.
-rewrite -{2 3}def_xM -sigma_decomposition_constt' // (constt1P _) ?p_eltNK //.
-by rewrite -cards_eq0 (sameP (ell_sigma0P 1) eqP) eqxx; apply: mem_imset.
-Qed.
-
-Remark ell_sigma1P x :
- reflect (x != 1 /\ 'M_\sigma[x] != set0) (\ell_\sigma(x) == 1%N).
-Proof.
-apply: (iffP idP) => [ell1x | [ntx]]; last first.
- case/set0Pn=> M /setIdP[maxM]; rewrite cycle_subG => Ms_x.
- by rewrite (Msigma_ell1 maxM) // in_setD1 ntx.
-have sdx_x: x \in sigma_decomposition x by rewrite ell1_decomposition ?set11.
-have{sdx_x} [ntx sdx_x] := setD1P sdx_x; split=> //; apply/set0Pn.
-have{sdx_x} [M maxM def_x] := imsetP sdx_x; rewrite // -cycle_eq1 in ntx.
-have sMx: \sigma(M).-elt x by rewrite def_x p_elt_constt.
-have [[z sXzMs] _] := sigma_Jsub maxM sMx ntx.
-by exists (M :^ z^-1)%G; rewrite inE mmaxJ maxM MsigmaJ -sub_conjg.
-Qed.
-
-Remark ell_sigma_le1 x :(\ell_\sigma(x) <= 1) = ('M_\sigma[x] != set0).
-Proof.
-rewrite -[_ <= 1](mem_iota 0 2) !inE (sameP (ell_sigma0P x) eqP).
-rewrite (sameP (ell_sigma1P x) andP); case: eqP => //= ->; symmetry.
-have [M max1M] := mmax_exists (mFT_pgroup_proper (@pgroup1 gT 2)).
-have [maxM _] := setIdP max1M; apply/set0Pn; exists M.
-by rewrite inE maxM cycle1 sub1G.
-Qed.
-
-(* Basic properties of \kappa and the maximal group subclasses. *)
-Lemma kappaJ M x : \kappa(M :^ x) =i \kappa(M).
-Proof.
-move=> p; rewrite unlock 3!{1}inE /= tau1J tau3J; apply: andb_id2l => _.
-apply/exists_inP/exists_inP=> [] [P EpP ntCMsP].
- rewrite -(conjsgK x M); exists (P :^ x^-1)%G; first by rewrite pnElemJ.
- by rewrite MsigmaJ centJ -conjIg -subG1 sub_conjg conjs1g subG1.
-exists (P :^ x)%G; first by rewrite pnElemJ.
-by rewrite MsigmaJ centJ -conjIg -subG1 sub_conjg conjs1g subG1.
-Qed.
-
-Lemma kappa_tau13 M p : p \in \kappa(M) -> (p \in \tau1(M)) || (p \in \tau3(M)).
-Proof. by rewrite unlock => /andP[]. Qed.
-
-Lemma kappa_sigma' M : {subset \kappa(M) <= \sigma(M)^'}.
-Proof. by move=> p /kappa_tau13/orP[] /andP[]. Qed.
-
-Remark rank_kappa M p : p \in \kappa(M) -> 'r_p(M) = 1%N.
-Proof. by case/kappa_tau13/orP=> /and3P[_ /eqP]. Qed.
-
-Lemma kappa_pi M : {subset \kappa(M) <= \pi(M)}.
-Proof. by move=> p kMp; rewrite -p_rank_gt0 rank_kappa. Qed.
-
-Remark kappa_nonregular M p P :
- p \in \kappa(M) -> P \in 'E_p^1(M) -> 'C_(M`_\sigma)(P) != 1.
-Proof.
-move=> kMp EpP; have rpM := rank_kappa kMp.
-have [sPM abelP oP] := pnElemPcard EpP; have [pP _] := andP abelP.
-have [Q EpQ nregQ]: exists2 Q, Q \in 'E_p^1(M) & 'C_(M`_\sigma)(Q) != 1.
- by apply/exists_inP; rewrite unlock in kMp; case/andP: kMp.
-have [sQM abelQ oQ] := pnElemPcard EpQ; have [pQ _] := andP abelQ.
-have [S sylS sQS] := Sylow_superset sQM pQ; have [_ pS _] := and3P sylS.
-have [x Mx sPxS] := Sylow_Jsub sylS sPM pP.
-rewrite -(inj_eq (@conjsg_inj _ x)) conjs1g conjIg -centJ.
-rewrite (normsP (normal_norm (pcore_normal _ _))) // (subG1_contra _ nregQ) //.
-rewrite setIS ?centS // -(cardSg_cyclic _ sPxS sQS) ?cardJg ?oP ?oQ //.
-by rewrite (odd_pgroup_rank1_cyclic pS) ?mFT_odd // (p_rank_Sylow sylS) rpM.
-Qed.
-
-Lemma ex_kappa_compl M K :
- M \in 'M -> \kappa(M).-Hall(M) K ->
- exists U : {group gT}, kappa_complement M U K.
-Proof.
-move=> maxM hallK; have [sKM kK _] := and3P hallK.
-have s'K: \sigma(M)^'.-group K := sub_pgroup (@kappa_sigma' M) kK.
-have [E hallE sKE] := Hall_superset (mmax_sol maxM) sKM s'K.
-pose sk' := \sigma_kappa(M)^'.
-have [U hallU] := Hall_exists sk' (sigma_compl_sol hallE).
-exists U; split=> //.
- by apply: subHall_Hall hallE _ hallU => p; case/norP.
-suffices ->: U * K = E by apply: groupP.
-have [[sUE sk'U _] [sEM s'E _]] := (and3P hallU, and3P hallE).
-apply/eqP; rewrite eqEcard mulG_subG sUE sKE /= coprime_cardMg; last first.
- by apply: p'nat_coprime (sub_pgroup _ sk'U) kK => p; case/norP.
-rewrite -(partnC \kappa(M) (cardG_gt0 E)) -{2}(part_pnat_id s'E) mulnC.
-rewrite -(card_Hall (pHall_subl sKE sEM hallK)) leq_mul // -partnI.
-by rewrite -(@eq_partn sk') -?(card_Hall hallU) // => p; apply: negb_or.
-Qed.
-
-Lemma FtypeP M : reflect (M \in 'M /\ \kappa(M) =i pred0) (M \in 'M_'F).
-Proof.
-do [apply: (iffP setIdP) => [] [maxM k'M]; split] => // [p|].
- by apply/idP=> /= kMp; case/negP: (pnatPpi k'M (kappa_pi kMp)).
-by apply/pgroupP=> p _ _; rewrite inE /= k'M.
-Qed.
-
-Lemma PtypeP M : reflect (M \in 'M /\ exists p, p \in \kappa(M)) (M \in 'M_'P).
-Proof.
-apply: (iffP setDP) => [[maxM kM] | [maxM [p kMp]]]; split => //.
- rewrite inE maxM !negb_and cardG_gt0 /= all_predC negbK in kM.
- by have [p _ kMp] := hasP kM; exists p.
-by apply/FtypeP=> [[_ kM0]]; rewrite kM0 in kMp.
-Qed.
-
-Lemma trivg_kappa M K :
- M \in 'M -> \kappa(M).-Hall(M) K -> (K :==: 1) = (M \in 'M_'F).
-Proof.
-by move=> maxM hallK; rewrite inE maxM trivg_card1 (card_Hall hallK) partG_eq1.
-Qed.
-
-(* Could go in Section 10. *)
-Lemma not_sigma_mmax M : M \in 'M -> ~~ \sigma(M).-group M.
-Proof.
-move=> maxM; apply: contraL (mmax_sol maxM); rewrite negb_forall_in => sM.
-apply/existsP; exists M; rewrite mmax_neq1 // subsetIidl andbT.
-apply: subset_trans (Msigma_der1 maxM).
-by rewrite (sub_Hall_pcore (Msigma_Hall maxM)).
-Qed.
-
-Lemma trivg_kappa_compl M U K :
- M \in 'M -> kappa_complement M U K -> (U :==: 1) = (M \in 'M_'P1).
-Proof.
-move=> maxM [hallU _ _]; symmetry.
-rewrite 3!inE maxM /= trivg_card1 (card_Hall hallU) partG_eq1 pgroupNK andbT.
-apply: andb_idl => skM; apply: contra (not_sigma_mmax maxM).
-by apply: sub_in_pnat => p /(pnatPpi skM)/orP[] // kMp /negP.
-Qed.
-
-Lemma FtypeJ M x : ((M :^ x)%G \in 'M_'F) = (M \in 'M_'F).
-Proof. by rewrite inE mmaxJ pgroupJ (eq_p'group _ (kappaJ M x)) !inE. Qed.
-
-Lemma PtypeJ M x : ((M :^ x)%G \in 'M_'P) = (M \in 'M_'P).
-Proof. by rewrite !in_setD mmaxJ FtypeJ. Qed.
-
-Lemma P1typeJ M x : ((M :^ x)%G \in 'M_'P1) = (M \in 'M_'P1).
-Proof.
-rewrite inE PtypeJ pgroupJ [M \in 'M_'P1]inE; congr (_ && _).
-by apply: eq_pgroup => p; rewrite inE /= kappaJ sigmaJ.
-Qed.
-
-Lemma P2typeJ M x : ((M :^ x)%G \in 'M_'P2) = (M \in 'M_'P2).
-Proof. by rewrite in_setD PtypeJ P1typeJ -in_setD. Qed.
-
-(* This is B & G, Lemma 14.1. *)
-Lemma sigma'_kappa'_facts M p S (A := 'Ohm_1(S)) (Ms := M`_\sigma) :
- M \in 'M -> p.-Sylow(M) S ->
- [&& p \in \pi(M), p \notin \sigma(M) & p \notin \kappa(M)] ->
- [/\ M \in 'M_'F :|: 'M_'P2, logn p #|A| <= 2, 'C_Ms(A) = 1 & nilpotent Ms].
-Proof.
-move=> maxM sylS /and3P[piMp sM'p kM'p]; have [sSM pS _] := and3P sylS.
-rewrite 8!(maxM, inE) /= !andbT negb_and orb_andr orbN andbT negbK.
-rewrite (contra (fun skM => pnatPpi skM piMp)) ?orbT; last exact/norP.
-rewrite partition_pi_mmax // (negPf sM'p) orbF orbCA in piMp.
-have{piMp} [t2p | t13p] := orP piMp.
- rewrite (tau2_Msigma_nil maxM t2p); have [_ rpM] := andP t2p.
- have{rpM} rS: 2 <= 'r_p(S) by rewrite (p_rank_Sylow sylS) (eqP rpM).
- have [B EpB] := p_rank_geP rS; have{EpB} [sBS abelB dimB] := pnElemP EpB.
- have EpB: B \in 'E_p^2(M) by rewrite !inE abelB dimB (subset_trans sBS).
- have [defB _ regB _ _] := tau2_context maxM t2p EpB.
- by rewrite /A -dimB; have [_ [|->]] := defB S sylS.
-have [ntS cycS]: S :!=: 1 /\ cyclic S.
- rewrite (odd_pgroup_rank1_cyclic pS) ?mFT_odd // (p_rank_Sylow sylS).
- apply/andP; rewrite -rank_gt0 (rank_Sylow sylS) -eqn_leq eq_sym.
- by rewrite -2!andb_orr orNb andbT inE /= sM'p in t13p.
-have [p_pr _ _] := pgroup_pdiv pS ntS.
-have oA: #|A| = p by rewrite (Ohm1_cyclic_pgroup_prime cycS pS).
-have sAM: A \subset M by apply: gFsub_trans.
-have regA: 'C_Ms(A) = 1.
- apply: contraNeq kM'p => nregA; rewrite unlock; apply/andP; split=> //.
- by apply/exists_inP; exists [group of A]; rewrite ?p1ElemE // !inE sAM oA /=.
-have defMsA: Ms ><| A = Ms <*> A.
- rewrite sdprodEY ?coprime_TIg ?(subset_trans sAM) ?gFnorm // oA.
- by rewrite (pnat_coprime (pcore_pgroup _ _)) ?pnatE.
-rewrite (prime_Frobenius_sol_kernel_nil defMsA) ?oA ?(pfactorK 1) //.
-by rewrite (solvableS _ (mmax_sol maxM)) // join_subG pcore_sub.
-Qed.
-
-Lemma notP1type_Msigma_nil M :
- (M \in 'M_'F) || (M \in 'M_'P2) -> nilpotent M`_\sigma.
-Proof.
-move=> notP1maxM; suffices [maxM]: M \in 'M /\ ~~ \sigma_kappa(M).-group M.
- rewrite negb_and cardG_gt0 => /allPn[p piMp /norP[s'p k'p]].
- by have [S /sigma'_kappa'_facts[] //] := Sylow_exists p M; apply/and3P.
-have [/setIdP[maxM k'M] | /setDP[PmaxM]] := orP notP1maxM; last first.
- by rewrite inE PmaxM; case/setDP: PmaxM.
-split=> //; apply: contra (not_sigma_mmax maxM).
-by apply: sub_in_pnat => p piMp /orP[] // /idPn[]; apply: (pnatPpi k'M).
-Qed.
-
-(* This is B & G, Proposition 14.2. *)
-Proposition Ptype_structure M K (Ms := M`_\sigma) (Kstar := 'C_Ms(K)) :
- M \in 'M_'P -> \kappa(M).-Hall(M) K ->
- [/\ (*a*) exists2 U : {group gT},
- kappa_complement M U K /\ Ms ><| (U ><| K) = M
- & [/\ abelian U, semiprime Ms K & semiregular U K],
- (*b*) (*1.2*) K \x Kstar = 'N_M(K)
- /\ {in 'E^1(K), forall X,
- (*1.1*) 'N_M(X) = 'N_M(K)
- /\ (*2*) {in 'M('N(X)), forall Mstar, X \subset Mstar`_\sigma}},
- (*c*) Kstar != 1 /\ {in 'E^1(Kstar), forall X, 'M('C(X)) = [set M]},
- [/\ (*d*) {in ~: M, forall g, Kstar :&: M :^ g = 1}
- /\ {in M :\: 'N_M(K), forall g, K :&: K :^ g = 1},
- (*e*) {in \pi(Kstar), forall p S,
- p.-Sylow(M) S -> 'M(S) = [set M] /\ ~~ (S \subset Kstar)}
- & (*f*) forall Y, \sigma(M).-group Y -> Y :&: Kstar != 1 -> Y \subset Ms]
- & (*g*) M \in 'M_'P2 ->
- [/\ \sigma(M) =i \beta(M), prime #|K|, nilpotent Ms
- & normedTI Ms^# G M]].
-Proof.
-move: @Kstar => Ks PmaxM hallK; have [maxM notFmaxM] := setDP PmaxM.
-have sMs: \sigma(M).-group M`_\sigma := pcore_pgroup _ M.
-have{notFmaxM} ntK: K :!=: 1 by rewrite (trivg_kappa maxM).
-have [sKM kK _] := and3P hallK; have s'K := sub_pgroup (@kappa_sigma' M) kK.
-have solM := mmax_sol maxM; have [E hallE sKE] := Hall_superset solM sKM s'K.
-have [[sEM s'E _] [_ [E3 hallE3]]] := (and3P hallE, ex_tau13_compl hallE).
-have [F1 hallF1] := Hall_exists \tau1(M) (solvableS sKM solM).
-have [[sF1K t1F1 _] solE] := (and3P hallF1, sigma_compl_sol hallE).
-have [E1 hallE1 sFE1] := Hall_superset solE (subset_trans sF1K sKE) t1F1.
-have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
-have [[_ nsE3E] _ [cycE1 _] [defEl defE] _] := sigma_compl_context maxM complEi.
-have [sE1E t1E1 _] := and3P hallE1; have sE1M := subset_trans sE1E sEM.
-have [sE3E t3E3 _] := and3P hallE3; have sE3M := subset_trans sE3E sEM.
-set part_a := exists2 U, _ & _; pose b1_hyp := {in 'E^1(K), forall X, X <| K}.
-have [have_a nK1K ntE1 sE1K]: [/\ part_a, b1_hyp, E1 :!=: 1 & E1 \subset K].
- have [t1K | not_t1K] := boolP (\tau1(M).-group K).
- have sKE1: K \subset E1 by rewrite (sub_pHall hallF1 t1K).
- have prE1 := tau1_primact_Msigma maxM hallE hallE1.
- have st1k: {subset \tau1(M) <= \kappa(M)}.
- move=> p t1p; rewrite unlock 3!inE /= t1p /=.
- have [X]: exists X, X \in 'E_p^1(E1).
- apply/p_rank_geP; rewrite p_rank_gt0 /= (card_Hall hallE1).
- by rewrite pi_of_part // inE /= (partition_pi_sigma_compl maxM) ?t1p.
- rewrite -(setIidPr sE1M) pnElemI -setIdE => /setIdP[EpX sXE1].
- pose q := pdiv #|K|; have piKq: q \in \pi(K) by rewrite pi_pdiv cardG_gt1.
- have /p_rank_geP[Y]: 0 < 'r_q(K) by rewrite p_rank_gt0.
- rewrite -(setIidPr sKM) pnElemI -setIdE => /setIdP[EqY sYK].
- have ntCMsY := kappa_nonregular (pnatPpi kK piKq) EqY.
- have [ntY sYE1] := (nt_pnElem EqY isT, subset_trans sYK sKE1).
- apply/exists_inP; exists X; rewrite ?(subG1_contra _ ntCMsY) //=.
- by rewrite (cent_semiprime prE1 sYE1 ntY) ?setIS ?centS.
- have defK := sub_pHall hallK (sub_pgroup st1k t1E1) sKE1 sE1M.
- split=> [|X||]; rewrite ?defK //; last first.
- rewrite -defK; case/nElemP=> p /pnElemP[sXE1 _ _].
- by rewrite char_normal // sub_cyclic_char.
- have [[U _ defU _] _ _ _] := sdprodP defE; rewrite defU in defE.
- have [nsUE _ mulUE1 nUE1 _] := sdprod_context defE.
- have [[_ V _ defV] _] := sdprodP defEl; rewrite defV.
- have [_ <- nE21 _] := sdprodP defV => /mulGsubP[nE32 nE31] _.
- have regUK: semiregular U K.
- move=> y /setD1P[]; rewrite -cycle_subG -cent_cycle -order_gt1.
- rewrite -pi_pdiv; move: (pdiv _) => p pi_y_p Ky.
- have piKp := piSg Ky pi_y_p; have t1p := pnatPpi t1K piKp.
- move: pi_y_p; rewrite -p_rank_gt0 => /p_rank_geP[Y] /=.
- rewrite -{1}(setIidPr (subset_trans Ky sKE)) pnElemI -setIdE.
- case/setIdP=> EpY sYy; have EpMY := subsetP (pnElemS _ _ sEM) Y EpY.
- apply: contraNeq (kappa_nonregular (pnatPpi kK piKp) EpMY).
- move/(subG1_contra (setIS U (centS sYy))).
- have{y sYy Ky} sYE1 := subset_trans sYy (subset_trans Ky sKE1).
- have ntY: Y :!=: 1 by apply: (nt_pnElem EpY).
- rewrite -subG1 /=; have [_ <- _ tiE32] := sdprodP defU.
- rewrite -subcent_TImulg ?subsetI ?(subset_trans sYE1) // mulG_subG.
- rewrite !subG1 /= => /nandP[nregE3Y | nregE2Y].
- have pr13 := cent_semiprime (tau13_primact_Msigma maxM complEi _).
- rewrite pr13 ?(subset_trans sYE1) ?joing_subr //; last first.
- by move/cent_semiregular=> regE31; rewrite regE31 ?eqxx in nregE3Y.
- pose q := pdiv #|'C_E3(Y)|.
- have piE3q: q \in \pi(E3).
- by rewrite (piSg (subsetIl E3 'C(Y))) // pi_pdiv cardG_gt1.
- have /p_rank_geP[X]: 0 < 'r_q(M :&: E3).
- by rewrite (setIidPr sE3M) p_rank_gt0.
- rewrite pnElemI -setIdE => /setIdP[EqX sXE3].
- rewrite -subG1 -(_ : 'C_Ms(X) = 1) ?setIS ?centS //.
- by rewrite (subset_trans sXE3) ?joing_subl.
- apply: contraTeq (pnatPpi t3E3 piE3q) => nregMsX; apply: tau3'1.
- suffices kq: q \in \kappa(M).
- rewrite (pnatPpi t1K) //= (card_Hall hallK) pi_of_part //.
- by rewrite inE /= kappa_pi.
- rewrite unlock 3!inE /= (pnatPpi t3E3 piE3q) orbT /=.
- by apply/exists_inP; exists X.
- pose q := pdiv #|'C_E2(Y)|; have [sE2E t2E2 _] := and3P hallE2.
- have piCE2Yq: q \in \pi('C_E2(Y)) by rewrite pi_pdiv cardG_gt1.
- have [X]: exists X, X \in 'E_q^1(E :&: 'C_E2(Y)).
- by apply/p_rank_geP; rewrite /= setIA (setIidPr sE2E) p_rank_gt0.
- rewrite pnElemI -setIdE => /setIdP[EqX sXcE2Y].
- have t2q:= pnatPpi t2E2 (piSg (subsetIl _ _) piCE2Yq).
- have [A Eq2A _] := ex_tau2Elem hallE t2q.
- have [[_ defEq1] _ _ _] := tau2_compl_context maxM hallE t2q Eq2A.
- rewrite (tau12_regular maxM hallE t1p EpY t2q Eq2A) //.
- rewrite (subG1_contra _ (nt_pnElem EqX _)) // subsetI.
- rewrite defEq1 in EqX; case/pnElemP: EqX => -> _ _.
- by rewrite (subset_trans sXcE2Y) ?subsetIr.
- have [defM [sUE _]] := (sdprod_sigma maxM hallE, andP nsUE).
- have hallU: \sigma_kappa(M)^'.-Hall(M) U.
- suffices: [predI \sigma(M)^' & \kappa(M)^'].-Hall(M) U.
- by apply: etrans; apply: eq_pHall=> p; rewrite inE /= negb_or.
- apply: subHall_Hall hallE _ _ => [p|]; first by case/andP.
- rewrite pHallE partnI (part_pnat_id s'E) -pHallE.
- have hallK_E: \kappa(M).-Hall(E) K := pHall_subl sKE sEM hallK.
- by apply/(sdprod_normal_pHallP nsUE hallK_E); rewrite -defK.
- exists U; [rewrite -{2}defK defE | rewrite -{1}defK]; split=> //.
- by split; rewrite // -defK mulUE1 groupP.
- apply: abelianS (der_mmax_compl_abelian maxM hallE).
- rewrite -(coprime_cent_prod nUE1) ?(solvableS sUE) //.
- by rewrite {2}defK (cent_semiregular regUK) // mulg1 commgSS.
- by rewrite (coprime_sdprod_Hall_r defE); apply: pHall_Hall hallE1.
- move: not_t1K; rewrite negb_and cardG_gt0 => /allPn[p piKp t1'p].
- have kp := pnatPpi kK piKp; have t3p := kappa_tau13 kp.
- rewrite [p \in _](negPf t1'p) /= in t3p.
- have [X]: exists X, X \in 'E_p^1(K) by apply/p_rank_geP; rewrite p_rank_gt0.
- rewrite -{1}(setIidPr sKM) pnElemI -setIdE => /setIdP[EpX sXK].
- have sXE3: X \subset E3.
- rewrite (sub_normal_Hall hallE3) ?(subset_trans sXK) ?(pi_pgroup _ t3p) //.
- by case/pnElemP: EpX => _ /andP[].
- have [nregX ntX] := (kappa_nonregular kp EpX, nt_pnElem EpX isT).
- have [regE3|ntE1 {defE}defE prE nE1_E] := tau13_nonregular maxM complEi.
- by case/eqP: nregX; rewrite (cent_semiregular regE3).
- have defK: E :=: K.
- apply: (sub_pHall hallK _ sKE sEM); apply/pgroupP=> q q_pr q_dv_E.
- have{q_dv_E} piEq: q \in \pi(E) by rewrite mem_primes q_pr cardG_gt0.
- rewrite unlock; apply/andP; split=> /=.
- apply: pnatPpi piEq; rewrite -pgroupE -(sdprodW defE).
- rewrite pgroupM (sub_pgroup _ t3E3) => [|r t3r]; last by apply/orP; right.
- by rewrite (sub_pgroup _ t1E1) // => r t1r; apply/orP; left.
- have:= piEq; rewrite -p_rank_gt0 => /p_rank_geP[Y].
- rewrite -{1}(setIidPr sEM) pnElemI -setIdE => /setIdP[EqY sYE].
- rewrite (cent_semiprime prE) ?(subset_trans sXK) // in nregX.
- apply/exists_inP; exists Y => //; apply: subG1_contra nregX.
- by rewrite setIS ?centS.
- have defM := sdprod_sigma maxM hallE.
- rewrite /b1_hyp -defK; split=> //; exists 1%G; last first.
- by split; [apply: abelian1 | rewrite -defK | apply: semiregular1l].
- rewrite sdprod1g; do 2?split=> //; rewrite ?mul1g ?groupP -?defK //.
- rewrite pHallE sub1G cards1 eq_sym partG_eq1 pgroupNK /=.
- have{defM} [_ defM _ _] := sdprodP defM; rewrite -{2}defM defK pgroupM.
- rewrite (sub_pgroup _ sMs) => [|r sr]; last by apply/orP; left.
- by rewrite (sub_pgroup _ kK) // => r kr; apply/orP; right.
-set part_b := _ /\ _; set part_c := _ /\ _; set part_d := _ /\ _.
-have [U [complUK defM] [cUU prMsK regUK]] := have_a.
-have [hallU _ _] := complUK; have [sUM sk'U _] := and3P hallU.
-have have_b: part_b.
- have coMsU: coprime #|Ms| #|U|.
- by rewrite (pnat_coprime sMs (sub_pgroup _ sk'U)) // => p; case/norP.
- have{defM} [[_ F _ defF]] := sdprodP defM; rewrite defF.
- have [_ <- nUK _] := sdprodP defF; rewrite mulgA mulG_subG => defM.
- case/andP=> nMsU nMsK _.
- have coMsU_K: coprime #|Ms <*> U| #|K|.
- rewrite norm_joinEr // (p'nat_coprime _ kK) // -pgroupE.
- rewrite pgroupM // (sub_pgroup _ sMs) => [|r]; last first.
- by apply: contraL; apply: kappa_sigma'.
- by apply: sub_pgroup _ sk'U => r /norP[].
- have defNK X: X <| K -> X :!=: 1 -> 'N_M(X) = Ks * K.
- case/andP=> sXK nXK ntX; rewrite -defM -(norm_joinEr nMsU).
- rewrite setIC -group_modr // setIC.
- rewrite coprime_norm_cent ?(subset_trans sXK) ?normsY //; last first.
- by rewrite (coprimegS sXK).
- rewrite /= norm_joinEr -?subcent_TImulg ?(coprime_TIg coMsU) //; last first.
- by rewrite subsetI !(subset_trans sXK).
- by rewrite (cent_semiregular regUK) // mulg1 (cent_semiprime prMsK).
- rewrite /part_b dprodE ?subsetIr //; last first.
- rewrite setICA setIA (coprime_TIg (coprimeSg _ coMsU_K)) ?setI1g //.
- by rewrite joing_subl.
- rewrite -centC ?subsetIr // defNK //; split=> // X Eq1X.
- have [q EqX] := nElemP Eq1X; have ntX := nt_pnElem EqX isT.
- have:= EqX; rewrite -{1}(setIidPr sKE) pnElemI -setIdE.
- case/setIdP=> EqEX sXK; split; first by rewrite defNK ?nK1K.
- have [_ abelX dimX] := pnElemP EqX; have [qX _] := andP abelX.
- have kq: q \in \kappa(M).
- by rewrite (pnatPpi kK (piSg sXK _)) // -p_rank_gt0 p_rank_abelem ?dimX.
- have nregX := kappa_nonregular kq (subsetP (pnElemS _ _ sEM) _ EqEX).
- have sq := tau13_nonregular_sigma maxM hallE EqEX (kappa_tau13 kq) nregX.
- move=> H maxNH; have [maxH sNXH] := setIdP maxNH.
- rewrite (sub_Hall_pcore (Msigma_Hall maxH)) ?(subset_trans (normG X)) //.
- exact: pi_pgroup qX (sq H maxNH).
-have have_c: part_c.
- pose p := pdiv #|E1|; have piE1p: p \in \pi(E1) by rewrite pi_pdiv cardG_gt1.
- have:= piE1p; rewrite -p_rank_gt0 => /p_rank_geP[Y].
- rewrite -(setIidPr sE1M) pnElemI -setIdE => /setIdP[EpY sYE1].
- have [sYK ntY] := (subset_trans sYE1 sE1K, nt_pnElem EpY isT).
- split=> [|X /nElemP[q]].
- rewrite /Ks -(cent_semiprime prMsK sYK) //.
- exact: kappa_nonregular (pnatPpi kK (piSg sE1K piE1p)) EpY.
- rewrite /= -(cent_semiprime prMsK sYK) // => EqX.
- by have [] := cent_cent_Msigma_tau1_uniq maxM hallE hallE1 sYE1 ntY EqX.
-have [[defNK defK1] [_ uniqKs]] := (have_b, have_c).
-have have_d: part_d.
- split=> g.
- rewrite inE; apply: contraNeq; rewrite -rank_gt0.
- case/rank_geP=> X; rewrite nElemI -setIdE -groupV => /setIdP[EpX sXMg].
- have [_ sCXMs] := mem_uniq_mmax (uniqKs _ EpX).
- case/nElemP: EpX => p /pnElemP[/subsetIP[sXMs _] abelX dimX].
- have [[pX _] sXM] := (andP abelX, subset_trans sXMs (pcore_sub _ _)).
- have piXp: p \in \pi(X) by rewrite -p_rank_gt0 p_rank_abelem ?dimX.
- have sp := pnatPpi sMs (piSg sXMs piXp).
- have [def_g _ _] := sigma_group_trans maxM sp pX.
- have [|c cXc [m Mm ->]] := def_g g^-1 sXM; first by rewrite sub_conjgV.
- by rewrite groupM // (subsetP sCXMs).
- case/setDP=> Mg; apply: contraNeq; rewrite -rank_gt0 /=.
- case/rank_geP=> X; rewrite nElemI -setIdE => /setIdP[EpX sXKg].
- have [<- _] := defK1 X EpX; rewrite 2!inE Mg /=.
- have{EpX} [p EpX] := nElemP EpX; have [_ abelX dimX] := pnElemP EpX.
- have defKp1: {in 'E_p^1(K), forall Y, 'Ohm_1('O_p(K)) = Y}.
- move=> Y EpY; have E1K_Y: Y \in 'E^1(K) by apply/nElemP; exists p.
- have piKp: p \in \pi(K) by rewrite -p_rank_gt0; apply/p_rank_geP; exists Y.
- have [pKp sKpK] := (pcore_pgroup p K, pcore_sub p K).
- have cycKp: cyclic 'O_p(K).
- rewrite (odd_pgroup_rank1_cyclic pKp) ?mFT_odd //.
- by rewrite -(rank_kappa (pnatPpi kK piKp)) p_rankS ?(subset_trans sKpK).
- have [sYK abelY oY] := pnElemPcard EpY; have [pY _] := andP abelY.
- have sYKp: Y \subset 'O_p(K) by rewrite pcore_max ?nK1K.
- apply/eqP; rewrite eq_sym eqEcard -{1}(Ohm1_id abelY) OhmS //= oY.
- rewrite (Ohm1_cyclic_pgroup_prime cycKp pKp) ?(subG1_contra sYKp) //=.
- exact: nt_pnElem EpY _.
- rewrite sub_conjg -[X :^ _]defKp1 ?(defKp1 X) //.
- by rewrite !inE sub_conjgV sXKg abelemJ abelX cardJg dimX.
-split=> {part_a part_b part_c have_a have_b have_c}//; first split=> //.
-- move=> q; rewrite /Ks -(cent_semiprime prMsK sE1K ntE1) => picMsE1q.
- have sq := pnatPpi (pcore_pgroup _ M) (piSg (subsetIl _ _) picMsE1q).
- move: picMsE1q; rewrite -p_rank_gt0; case/p_rank_geP=> y EqY S sylS.
- have [sSM qS _] := and3P sylS.
- have sSMs: S \subset M`_\sigma.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) ?(pi_pgroup qS).
- have sylS_Ms: q.-Sylow(M`_\sigma) S := pHall_subl sSMs (pcore_sub _ M) sylS.
- have [_]:= cent_cent_Msigma_tau1_uniq maxM hallE hallE1 (subxx _) ntE1 EqY.
- move/(_ S sylS_Ms) => uniqS; split=> //; rewrite subsetI sSMs /=.
- pose p := pdiv #|E1|; have piE1p: p \in \pi(E1) by rewrite pi_pdiv cardG_gt1.
- have [s'p _] := andP (pnatPpi t1E1 piE1p).
- have [P sylP] := Sylow_exists p E1; have [sPE1 pP _] := and3P sylP.
- apply: contra (s'p) => cE1S; apply/exists_inP; exists P.
- exact: subHall_Sylow s'p (subHall_Sylow hallE1 (pnatPpi t1E1 piE1p) sylP).
- apply: (sub_uniq_mmax uniqS); first by rewrite cents_norm // (centsS sPE1).
- apply: mFT_norm_proper (mFT_pgroup_proper pP).
- by rewrite -rank_gt0 (rank_Sylow sylP) p_rank_gt0.
-- move=> Y sY ntYKs; have ntY: Y :!=:1 := subG1_contra (subsetIl _ _) ntYKs.
- have [[x sYxMs] _] := sigma_Jsub maxM sY ntY; rewrite sub_conjg in sYxMs.
- suffices Mx': x^-1 \in M by rewrite (normsP _ _ Mx') ?gFnorm in sYxMs.
- rewrite -(setCK M) inE; apply: contra ntYKs => M'x'.
- rewrite setIC -(setIidPr sYxMs) -/Ms -[Ms](setIidPr (pcore_sub _ _)).
- by rewrite conjIg !setIA; have [-> // _] := have_d; rewrite !setI1g.
-rewrite inE PmaxM andbT -(trivg_kappa_compl maxM complUK) => ntU.
-have [regMsU nilMs]: 'C_Ms(U) = 1 /\ nilpotent Ms.
- pose p := pdiv #|U|; have piUp: p \in \pi(U) by rewrite pi_pdiv cardG_gt1.
- have sk'p := pnatPpi sk'U piUp.
- have [S sylS] := Sylow_exists p U; have [sSU _] := andP sylS.
- have sylS_M := subHall_Sylow hallU sk'p sylS.
- have [|_ _ regMsS1 nilMs] := sigma'_kappa'_facts maxM sylS_M.
- by rewrite -negb_or (piSg sUM).
- by split=> //; apply/trivgP; rewrite -regMsS1 setIS ?centS ?gFsub_trans.
-have [[_ F _ defF] _ _ _] := sdprodP defM; rewrite defF in defM.
-have hallMs: \sigma(M).-Hall(M) Ms by apply: Msigma_Hall.
-have hallF: \sigma(M)^'.-Hall(M) F by apply/(sdprod_Hall_pcoreP hallMs).
-have frF: [Frobenius F = U ><| K] by apply/Frobenius_semiregularP.
-have ntMs: Ms != 1 by apply: Msigma_neq1.
-have prK: prime #|K|.
- have [solF [_ _ nMsF _]] := (sigma_compl_sol hallF, sdprodP defM).
- have solMs: solvable Ms := solvableS (pcore_sub _ _) (mmax_sol maxM).
- have coMsF: coprime #|Ms| #|F|.
- by rewrite (coprime_sdprod_Hall_r defM) (pHall_Hall hallF).
- by have [] := Frobenius_primact frF solF nMsF solMs ntMs coMsF prMsK.
-have eq_sb: \sigma(M) =i \beta(M).
- suffices bMs: \beta(M).-group Ms.
- move=> p; apply/idP/idP=> [sp|]; last exact: beta_sub_sigma.
- rewrite (pnatPpi bMs) //= (card_Hall (Msigma_Hall maxM)) pi_of_part //.
- by rewrite inE /= sigma_sub_pi.
- have [H hallH cHF'] := der_compl_cent_beta' maxM hallF.
- rewrite -pgroupNK -partG_eq1 -(card_Hall hallH) -trivg_card1 -subG1.
- rewrite -regMsU subsetI (pHall_sub hallH) centsC (subset_trans _ cHF') //.
- have [solU [_ mulUK nUK _]] := (abelian_sol cUU, sdprodP defF).
- have coUK: coprime #|U| #|K|.
- rewrite (p'nat_coprime (sub_pgroup _ (pHall_pgroup hallU)) kK) // => p.
- by case/norP.
- rewrite -(coprime_cent_prod nUK) // (cent_semiregular regUK) // mulg1.
- by rewrite -mulUK commgSS ?mulG_subl ?mulG_subr.
-split=> //; apply/normedTI_P; rewrite setD_eq0 subG1 setTI normD1 gFnorm.
-split=> // g _; rewrite -setI_eq0 conjD1g -setDIl setD_eq0 subG1 /= -/Ms.
-have [_ _ b'MsMg] := sigma_compl_embedding maxM hallE.
-apply: contraR => notMg; have{b'MsMg notMg} [_ b'MsMg _] := b'MsMg g notMg.
-rewrite -{2}(setIidPr (pHall_sub hallMs)) conjIg setIA coprime_TIg // cardJg.
-by apply: p'nat_coprime b'MsMg _; rewrite -(eq_pnat _ eq_sb).
-Qed.
-
-(* This is essentially the skolemized form of 14.2(a). *)
-Lemma kappa_compl_context M U K :
- M \in 'M -> kappa_complement M U K ->
- [/\ \sigma(M)^'.-Hall(M) (U <*> K),
- M`_\sigma ><| (U ><| K) = M,
- semiprime M`_\sigma K,
- semiregular U K
- & K :!=: 1 -> abelian U].
-Proof.
-move=> maxM [hallU hallK gsetUK]; set E := U <*> K.
-have mulUK: U * K = E by rewrite -(gen_set_id gsetUK) genM_join.
-have [[sKM kK _] [sUM sk'U _]] := (and3P hallK, and3P hallU).
-have tiUK: U :&: K = 1.
- by apply: coprime_TIg (p'nat_coprime (sub_pgroup _ sk'U) kK) => p; case/norP.
-have hallE: \sigma(M)^'.-Hall(M) E.
- rewrite pHallE /= -/E -mulUK mul_subG //= TI_cardMg //.
- rewrite -(partnC \kappa(M) (part_gt0 _ _)) (partn_part _ (@kappa_sigma' M)).
- apply/eqP; rewrite -partnI -(card_Hall hallK) mulnC; congr (_ * _)%N.
- by rewrite (card_Hall hallU); apply: eq_partn => p; apply: negb_or.
-have [K1 | ntK] := altP (K :=P: 1).
- rewrite K1 sdprodg1 -{1}(mulg1 U) -{1}K1 mulUK sdprod_sigma //.
- by split=> //; first apply: semiregular_prime; apply: semiregular1r.
-have PmaxM: M \in 'M_'P by rewrite inE maxM -(trivg_kappa maxM hallK) andbT.
-have [[V [complV defM] [cVV prK regK]] _ _ _ _] := Ptype_structure PmaxM hallK.
-have [[_ F _ defF] _ _ _] := sdprodP defM; rewrite defF in defM.
-have hallF: \sigma(M)^'.-Hall(M) F.
- exact/(sdprod_Hall_pcoreP (Msigma_Hall maxM)).
-have [a Ma /= defFa] := Hall_trans (mmax_sol maxM) hallE hallF.
-have [hallV _ _] := complV; set sk' := \sigma_kappa(M)^' in hallU hallV sk'U.
-have [nsVF sKF _ _ _] := sdprod_context defF.
-have [[[sVF _] [sFM _]] [sEM _]] := (andP nsVF, andP hallF, andP hallE).
-have hallV_F: sk'.-Hall(F) V := pHall_subl sVF sFM hallV.
-have hallU_E: sk'.-Hall(E) U := pHall_subl (joing_subl _ _) sEM hallU.
-have defV: 'O_sk'(F) = V := normal_Hall_pcore hallV_F nsVF.
-have hallEsk': sk'.-Hall(E) 'O_sk'(E).
- by rewrite [E]defFa pcoreJ pHallJ2 /= defV.
-have defU: 'O_sk'(E) = U by rewrite (eq_Hall_pcore hallEsk' hallU_E).
-have nUE: E \subset 'N(U) by rewrite -defU gFnorm.
-have hallK_E: \kappa(M).-Hall(E) K := pHall_subl (joing_subr _ _) sEM hallK.
-have hallK_F: \kappa(M).-Hall(F) K := pHall_subl sKF sFM hallK.
-have hallKa_E: \kappa(M).-Hall(E) (K :^ a) by rewrite [E]defFa pHallJ2.
-have [b Eb /= defKab] := Hall_trans (sigma_compl_sol hallE) hallK_E hallKa_E.
-have defVa: V :^ a = U by rewrite -defV -pcoreJ -defFa defU.
-split=> // [| x Kx | _]; last by rewrite -defVa abelianJ.
- by rewrite [U ><| K]sdprodEY ?sdprod_sigma //; case/joing_subP: nUE.
-rewrite -(conjgKV (a * b) x) -(normsP nUE b Eb) -defVa -conjsgM.
-rewrite -cent_cycle cycleJ centJ -conjIg cent_cycle regK ?conjs1g //.
-by rewrite -mem_conjg conjD1g conjsgM -defKab.
-Qed.
-
-(* This is B & G, Corollary 14.3. *)
-Corollary pi_of_cent_sigma M x x' :
- M \in 'M -> x \in (M`_\sigma)^# ->
- x' \in ('C_M[x])^# -> \sigma(M)^'.-elt x' ->
- (*1*) \kappa(M).-elt x' /\ 'C[x] \subset M
- \/ (*2*) [/\ \tau2(M).-elt x', \ell_\sigma(x') == 1%N & 'M('C[x']) = [set M]].
-Proof.
-move: x' => y maxM /setD1P[ntx Ms_x] /setD1P[nty cMxy] s'y.
-have [My cxy] := setIP cMxy.
-have [t2y | not_t2y] := boolP (\tau2(M).-elt y); [right | left].
- have uniqCy: 'M('C[y]) = [set M]; last split=> //.
- apply: cent1_nreg_sigma_uniq; rewrite // ?inE ?nty //.
- by apply/trivgPn; exists x; rewrite // inE Ms_x cent1C.
- pose p := pdiv #[y]; have piYp: p \in \pi(#[y]) by rewrite pi_pdiv order_gt1.
- have t2p := pnatPpi t2y piYp; have [E hallE] := ex_sigma_compl maxM.
- have [A Ep2A _] := ex_tau2Elem hallE t2p.
- have pA: p.-group A by case/pnElemP: Ep2A => _ /andP[].
- have ntA: A :!=: 1 by rewrite (nt_pnElem Ep2A).
- have [H maxNH] := mmax_exists (mFT_norm_proper ntA (mFT_pgroup_proper pA)).
- have [st2MsH _ _] := primes_norm_tau2Elem maxM hallE t2p Ep2A maxNH.
- have [maxH _] := setIdP maxNH.
- have sHy: \sigma(H).-elt y by apply: sub_p_elt t2y => q /st2MsH/andP[].
- rewrite /sigma_length (cardsD1 y.`_(\sigma(H))).
- rewrite mem_sigma_decomposition //; last by rewrite constt_p_elt.
- rewrite eqSS -sigma_decomposition_constt' //.
- by apply/ell_sigma0P; rewrite (constt1P _) ?p_eltNK.
-have{not_t2y} [p piYp t2'p]: exists2 p, p \in \pi(#[y]) & p \notin \tau2(M).
- by apply/allPn; rewrite negb_and cardG_gt0 in not_t2y.
-have sYM: <[y]> \subset M by rewrite cycle_subG.
-have piMp: p \in \pi(M) := piSg sYM piYp.
-have t13p: p \in [predU \tau1(M) & \tau3(M)].
- move: piMp; rewrite partition_pi_mmax // (negPf t2'p) /= orbA.
- by case/orP=> // sMy; case/negP: (pnatPpi s'y piYp).
-have [X]: exists X, X \in 'E_p^1(<[y]>) by apply/p_rank_geP; rewrite p_rank_gt0.
-rewrite -(setIidPr sYM) pnElemI -setIdE => /setIdP[EpX sXy].
-have kp: p \in \kappa(M).
- rewrite unlock; apply/andP; split=> //; apply/exists_inP; exists X => //.
- apply/trivgPn; exists x; rewrite // inE Ms_x (subsetP (centS sXy)) //.
- by rewrite cent_cycle cent1C.
-have [sXM abelX dimX] := pnElemP EpX; have [pX _] := andP abelX.
-have [K hallK sXK] := Hall_superset (mmax_sol maxM) sXM (pi_pgroup pX kp).
-have PmaxM: M \in 'M_'P.
- by rewrite 2!inE maxM andbT; apply: contraL kp => k'M; apply: (pnatPpi k'M).
-have [_ [defNK defNX] [_ uniqCKs] _ _] := Ptype_structure PmaxM hallK.
-have{defNX} sCMy_nMK: 'C_M[y] \subset 'N_M(K).
- have [|<- _] := defNX X.
- by apply/nElemP; exists p; rewrite !inE sXK abelX dimX.
- by rewrite setIS // cents_norm // -cent_cycle centS.
-have [[sMK kK _] [_ mulKKs cKKs _]] := (and3P hallK, dprodP defNK).
-have s'K: \sigma(M)^'.-group K := sub_pgroup (@kappa_sigma' M) kK.
-have sMs: \sigma(M).-group M`_\sigma := pcore_pgroup _ M.
-have sKs: \sigma(M).-group 'C_(M`_\sigma)(K) := pgroupS (subsetIl _ _) sMs.
-have{s'K sKs} [hallK_N hallKs] := coprime_mulGp_Hall mulKKs s'K sKs.
-split.
- rewrite (mem_p_elt kK) // (mem_normal_Hall hallK_N) ?normal_subnorm //.
- by rewrite (subsetP sCMy_nMK) // inE My cent1id.
-have Mx: x \in M := subsetP (pcore_sub _ _) x Ms_x.
-have sxKs: <[x]> \subset 'C_(M`_\sigma)(K).
- rewrite cycle_subG (mem_normal_Hall hallKs) ?(mem_p_elt sMs) //=.
- by rewrite -mulKKs /normal mulG_subr mulG_subG normG cents_norm // centsC.
- by rewrite (subsetP sCMy_nMK) // inE Mx cent1C.
-have /rank_geP[Z]: 0 < 'r(<[x]>) by rewrite rank_gt0 cycle_eq1.
-rewrite /= -(setIidPr sxKs) nElemI -setIdE => /setIdP[E1KsZ sZx].
-have [_ sCZM] := mem_uniq_mmax (uniqCKs Z E1KsZ).
-by rewrite (subset_trans _ sCZM) // -cent_cycle centS.
-Qed.
-
-(* This is B & G, Theorem 14.4. *)
-(* We are omitting the first half of part (a), since we have taken it as our *)
-(* definition of 'R[x]. *)
-Theorem FT_signalizer_context x (N := 'N[x]) (R := 'R[x]) :
- \ell_\sigma(x) == 1%N ->
- [/\ [/\ [transitive R, on 'M_\sigma[x] | 'JG],
- #|R| = #|'M_\sigma[x]|,
- R <| 'C[x]
- & Hall 'C[x] R]
- & #|'M_\sigma[x]| > 1 ->
- [/\ 'M('C[x]) = [set N],
- (*a*) R :!=: 1,
- (*c1*) \tau2(N).-elt x,
- (*f*) N \in 'M_'F :|: 'M_'P2
- & {in 'M_\sigma[x], forall M,
- [/\ (*b*) R ><| 'C_(M :&: N)[x] = 'C[x],
- (*c2*) {subset \tau2(N) <= \sigma(M)},
- (*d*) {subset [predI \pi(M) & \sigma(N)] <= \beta(N)}
- & (*e*) \sigma(N)^'.-Hall(N) (M :&: N)]}]].
-Proof.
-rewrite {}/N {}/R => ell1x; have [ntx ntMSx] := ell_sigma1P x ell1x.
-have [M MSxM] := set0Pn _ ntMSx; have [maxM Ms_x] := setIdP MSxM.
-rewrite cycle_subG in Ms_x; have sMx := mem_p_elt (pcore_pgroup _ M) Ms_x.
-have Mx: x \in M := subsetP (pcore_sub _ _) x Ms_x.
-have [MSx_le1 | MSx_gt1] := leqP _ 1.
- rewrite /'R[x] /'N[x] ltnNge MSx_le1 (trivgP (pcore_sub _ _)) setI1g normal1.
- have <-: [set M] = 'M_\sigma[x].
- by apply/eqP; rewrite eqEcard sub1set MSxM cards1.
- by rewrite /Hall atrans_acts_card ?imset_set1 ?cards1 ?sub1G ?coprime1n.
-have [q pi_x_q]: exists q, q \in \pi(#[x]).
- by exists (pdiv #[x]); rewrite pi_pdiv order_gt1.
-have{sMx} sMq: q \in \sigma(M) := pnatPpi sMx pi_x_q.
-have [X EqX]: exists X, X \in 'E_q^1(<[x]>).
- by apply/p_rank_geP; rewrite p_rank_gt0.
-have [sXx abelX dimX] := pnElemP EqX; have [qX cXX _] := and3P abelX.
-have ntX: X :!=: 1 := nt_pnElem EqX isT.
-have sXM: X \subset M by rewrite (subset_trans sXx) ?cycle_subG.
-have [N maxNX_N] := mmax_exists (mFT_norm_proper ntX (mFT_pgroup_proper qX)).
-have [maxN sNX_N] := setIdP maxNX_N; pose R := 'C_(N`_\sigma)[x]%G.
-have sCX_N: 'C(X) \subset N := subset_trans (cent_sub X) sNX_N.
-have sCx_N: 'C[x] \subset N by rewrite -cent_cycle (subset_trans (centS sXx)).
-have sMSx_MSX: 'M_\sigma[x] \subset 'M_\sigma(X).
- apply/subsetP=> M1 /setIdP[maxM1 sxM1].
- by rewrite inE maxM1 (subset_trans sXx).
-have nsRCx: R <| 'C[x] by rewrite /= setIC (normalGI sCx_N) ?pcore_normal.
-have hallR: \sigma(N).-Hall('C[x]) R.
- exact: setI_normal_Hall (pcore_normal _ _) (Msigma_Hall maxN) sCx_N.
-have transCX: [transitive 'C(X), on 'M_\sigma(X) | 'JG].
- have [_ trCX _ ] := sigma_group_trans maxM sMq qX.
- case/imsetP: trCX => _ /setIdP[/imsetP[y _ ->] sXMy] trCX.
- have maxMy: (M :^ y)%G \in 'M by rewrite mmaxJ.
- have sXMys: X \subset (M :^ y)`_\sigma.
- by rewrite (sub_Hall_pcore (Msigma_Hall _)) // (pi_pgroup qX) ?sigmaJ.
- apply/imsetP; exists (M :^ y)%G; first exact/setIdP.
- apply/setP=> Mz; apply/setIdP/imsetP=> [[maxMz sXMzs] | [z cXz -> /=]].
- suffices: gval Mz \in orbit 'Js 'C(X) (M :^ y).
- by case/imsetP=> z CXz /group_inj->; exists z.
- rewrite -trCX inE andbC (subset_trans sXMzs) ?pcore_sub //=.
- apply/idPn => /(sigma_partition maxM maxMz)/=/(_ q)/idP[].
- rewrite inE /= sMq (pnatPpi (pgroupS sXMzs (pcore_pgroup _ _))) //.
- by rewrite -p_rank_gt0 p_rank_abelem ?dimX.
- by rewrite mmaxJ -(normP (subsetP (cent_sub X) z cXz)) MsigmaJ conjSg.
-have MSX_M: M \in 'M_\sigma(X) := subsetP sMSx_MSX M MSxM.
-have not_sCX_M: ~~ ('C(X) \subset M).
- apply: contraL MSx_gt1 => sCX_M.
- rewrite -leqNgt (leq_trans (subset_leq_card sMSx_MSX)) //.
- rewrite -(atransP transCX _ MSX_M) card_orbit astab1JG.
- by rewrite (setIidPl (normsG sCX_M)) indexgg.
-have neqNM: N :!=: M by apply: contraNneq not_sCX_M => <-.
-have maxNX'_N: N \in 'M('N(X)) :\ M by rewrite 2!inE neqNM.
-have [notMGN _] := sigma_subgroup_embedding maxM sMq sXM qX ntX maxNX'_N.
-have sN'q: q \notin \sigma(N).
- by apply: contraFN (sigma_partition maxM maxN notMGN q) => sNq; apply/andP.
-rewrite (negPf sN'q) => [[t2Nq s_piM_bN hallMN]].
-have defN: N`_\sigma ><| (M :&: N) = N.
- exact/(sdprod_Hall_pcoreP (Msigma_Hall maxN)).
-have Nx: x \in N by rewrite (subsetP sCx_N) ?cent1id.
-have MNx: x \in M :&: N by rewrite inE Mx.
-have sN'x: \sigma(N)^'.-elt x by rewrite (mem_p_elt (pHall_pgroup hallMN)).
-have /andP[sNsN nNsN]: N`_\sigma <| N := pcore_normal _ _.
-have nNs_x: x \in 'N(N`_\sigma) := subsetP nNsN x Nx.
-have defCx: R ><| 'C_(M :&: N)[x] = 'C[x].
- rewrite -{2}(setIidPr sCx_N) /= -cent_cycle (subcent_sdprod defN) //.
- by rewrite subsetI andbC normsG ?cycle_subG.
-have transR: [transitive R, on 'M_\sigma[x] | 'JG].
- apply/imsetP; exists M => //; apply/setP=> L.
- apply/idP/imsetP=> [MSxL | [u Ru ->{L}]]; last first.
- have [_ cxu] := setIP Ru; rewrite /= -cent_cycle in cxu.
- by rewrite -(normsP (cent_sub _) u cxu) sigma_mmaxJ.
- have [u cXu defL] := atransP2 transCX MSX_M (subsetP sMSx_MSX _ MSxL).
- have [_ mulMN nNsMN tiNsMN] := sdprodP defN.
- have:= subsetP sCX_N u cXu; rewrite -mulMN -normC //.
- case/imset2P=> v w /setIP[Mv _] Ns_w def_u; exists w => /=; last first.
- by apply: group_inj; rewrite defL /= def_u conjsgM (conjGid Mv).
- rewrite inE Ns_w -groupV (sameP cent1P commgP) -in_set1 -set1gE -tiNsMN.
- rewrite setICA setIC (setIidPl sNsN) inE groupMl ?groupV //.
- rewrite memJ_norm // groupV Ns_w /= -(norm_mmax maxM) inE sub_conjg.
- rewrite invg_comm -(conjSg _ _ w) -{2}(conjGid Mx) -!conjsgM -conjg_Rmul.
- rewrite -conjgC conjsgM -(conjGid Mv) -(conjsgM M) -def_u.
- rewrite -[M :^ u](congr_group defL) conjGid // -cycle_subG.
- by have [_ Ls_x] := setIdP MSxL; rewrite (subset_trans Ls_x) ?pcore_sub.
-have oR: #|R| = #|'M_\sigma[x]|.
- rewrite -(atransP transR _ MSxM) card_orbit astab1JG (norm_mmax maxM).
- rewrite -setIAC /= -{3}(setIidPl sNsN) -(setIA _ N) -(setIC M).
- by have [_ _ _ ->] := sdprodP defN; rewrite setI1g indexg1.
-have ntR: R :!=: 1 by rewrite -cardG_gt1 oR.
-have [y Ns_y CNy_x]: exists2 y, y \in (N`_\sigma)^# & x \in ('C_N[y])^#.
- have [y Ry nty] := trivgPn _ ntR; have [Ns_y cxy] := setIP Ry.
- by exists y; rewrite 2!inE ?nty // inE Nx cent1C ntx.
-have kN'q: q \notin \kappa(N).
- rewrite (contra (@kappa_tau13 N q)) // negb_or (contraL (@tau2'1 _ _ _)) //.
- exact: tau3'2.
-have [[kNx _] | [t2Nx _ uniqN]] := pi_of_cent_sigma maxN Ns_y CNy_x sN'x.
- by case/idPn: (pnatPpi kNx pi_x_q).
-have defNx: 'N[x] = N.
- apply/set1P; rewrite -uniqN /'N[x] MSx_gt1.
- by case: pickP => // /(_ N); rewrite uniqN /= set11.
-rewrite /'R[x] {}defNx -(erefl (gval R)) (pHall_Hall hallR).
-split=> // _; split=> // [|L MSxL].
- rewrite !(maxN, inE) /=; case: (pgroup _ _) => //=; rewrite andbT.
- apply: contra kN'q => skN_N; have:= pnatPpi (mem_p_elt skN_N Nx) pi_x_q.
- by case/orP=> //=; rewrite (negPf sN'q).
-have [u Ru ->{L MSxL}] := atransP2 transR MSxM MSxL; rewrite /= cardJg.
-have [Ns_u cxu] := setIP Ru; have Nu := subsetP sNsN u Ns_u.
-rewrite -{1}(conjGid Ru) -(conjGid cxu) -{1 6 7}(conjGid Nu) -!conjIg pHallJ2.
-split=> // [|p t2Np].
- rewrite /= -(setTI 'C[x]) -!(setICA setT) -!morphim_conj.
- exact: injm_sdprod (subsetT _) (injm_conj _ _) defCx.
-have [A Ep2A _] := ex_tau2Elem hallMN t2Np.
-have [[nsAMN _] _ _ _] := tau2_compl_context maxN hallMN t2Np Ep2A.
-have{Ep2A} Ep2A: A \in 'E_p^2(M) by move: Ep2A; rewrite pnElemI; case/setIP.
-have rpM: 'r_p(M) > 1 by apply/p_rank_geP; exists A.
-have: p \in \pi(M) by rewrite -p_rank_gt0 ltnW.
-rewrite sigmaJ partition_pi_mmax // !orbA; case/orP=> //.
-rewrite orbAC -2!andb_orr -(subnKC rpM) andbF /= => t2Mp.
-case/negP: ntX; rewrite -subG1 (subset_trans sXx) //.
-have [_ _ <- _ _] := tau2_context maxM t2Mp Ep2A.
-have [[sAM abelA _] [_ nAMN]] := (pnElemP Ep2A, andP nsAMN).
-rewrite -coprime_norm_cent ?(subset_trans sAM) ?gFnorm //.
- by rewrite cycle_subG inE Ms_x (subsetP nAMN).
-have [[sM'p _] [pA _]] := (andP t2Mp, andP abelA).
-exact: pnat_coprime (pcore_pgroup _ _) (pi_pgroup pA sM'p).
-Qed.
-
-(* A useful supplement to Theorem 14.4. *)
-Lemma cent1_sub_uniq_sigma_mmax x M :
- #|'M_\sigma[x]| == 1%N -> M \in 'M_\sigma[x] -> 'C[x] \subset M.
-Proof.
-move: M => M0 /cards1P[M defMSx] MS_M0; move: MS_M0 (MS_M0).
-rewrite {1}defMSx => /set1P->{M0} MSxM; have [maxM _] := setIdP MSxM.
-rewrite -(norm_mmax maxM); apply/normsP=> y cxy; apply: congr_group.
-by apply/set1P; rewrite -defMSx -(mulKg y x) (cent1P cxy) cycleJ sigma_mmaxJ.
-Qed.
-
-Remark cent_FT_signalizer x : x \in 'C('R[x]).
-Proof. by rewrite -sub_cent1 subsetIr. Qed.
-
-(* Because the definition of 'N[x] uses choice, we can only prove it commutes *)
-(* with conjugation now that we have established that the choice is unique. *)
-Lemma FT_signalizer_baseJ x z : 'N[x ^ z] :=: 'N[x] :^ z.
-Proof.
-case MSx_gt1: (#|'M_\sigma[x]| > 1); last first.
- by rewrite /'N[x] /'N[_] cycleJ card_sigma_mmaxJ MSx_gt1 conjs1g.
-have [x1 | ntx] := eqVneq x 1.
- rewrite x1 conj1g /'N[1] /= norm1.
- case: pickP => [M maxTM | _]; last by rewrite if_same conjs1g.
- by have [maxM] := setIdP maxTM; case/idPn; rewrite proper_subn ?mmax_proper.
-apply: congr_group; apply/eqP; rewrite eq_sym -in_set1.
-have ell1xz: \ell_\sigma(x ^ z) == 1%N.
- by rewrite ell_sigmaJ; apply/ell_sigma1P; rewrite -cards_eq0 -lt0n ltnW.
-have [_ [|<- _ _ _ _]] := FT_signalizer_context ell1xz.
- by rewrite cycleJ card_sigma_mmaxJ.
-rewrite -conjg_set1 normJ mmax_ofJ; rewrite ell_sigmaJ in ell1xz.
-by have [_ [//|-> _ _ _ _]] := FT_signalizer_context ell1xz; apply: set11.
-Qed.
-
-Lemma FT_signalizerJ x z : 'R[x ^ z] :=: 'R[x] :^ z.
-Proof.
-by rewrite /'R[x] /'R[_] FT_signalizer_baseJ MsigmaJ -conjg_set1 normJ conjIg.
-Qed.
-
-Lemma sigma_coverJ x z : x ^ z *: 'R[x ^ z] = (x *: 'R[x]) :^ z.
-Proof. by rewrite FT_signalizerJ conjsMg conjg_set1. Qed.
-
-Lemma sigma_supportJ M z : (M :^ z)^~~ = M^~~ :^ z.
-Proof.
-rewrite -bigcupJ /_^~~ MsigmaJ -conjD1g (big_imset _ (in2W (act_inj 'J z))) /=.
-by apply: eq_bigr => x _; rewrite sigma_coverJ.
-Qed.
-
-(* This is the remark imediately above B & G, Lemma 14.5; note the adjustment *)
-(* allowing for the case x' = 1. *)
-Remark sigma_cover_decomposition x x' :
- \ell_\sigma(x) == 1%N -> x' \in 'R[x] ->
- sigma_decomposition (x * x') = x |: [set x']^#.
-Proof.
-move=> ell1x Rx'; have [-> | ntx'] := eqVneq x' 1.
- by rewrite mulg1 setDv setU0 ell1_decomposition.
-rewrite setDE (setIidPl _) ?sub1set ?inE // setUC.
-have ntR: #|'R[x]| > 1 by rewrite cardG_gt1; apply/trivgPn; exists x'.
-have [Ns_x' cxx'] := setIP Rx'; move/cent1P in cxx'.
-have [[_ <- _ _] [//| maxN _ t2Nx _ _]] := FT_signalizer_context ell1x.
-have{maxN} [maxN _] := mem_uniq_mmax maxN.
-have sNx' := mem_p_elt (pcore_pgroup _ _) Ns_x'.
-have sN'x: \sigma('N[x])^'.-elt x by apply: sub_p_elt t2Nx => p /andP[].
-have defx': (x * x').`_\sigma('N[x]) = x'.
- by rewrite consttM // (constt1P sN'x) mul1g constt_p_elt.
-have sd_xx'_x': x' \in sigma_decomposition (x * x').
- by rewrite 2!inE ntx' -{1}defx'; apply: mem_imset.
-rewrite -(setD1K sd_xx'_x') -{3}defx' -sigma_decomposition_constt' ?consttM //.
-by rewrite constt_p_elt // (constt1P _) ?p_eltNK ?mulg1 // ell1_decomposition.
-Qed.
-
-(* This is the simplified form of remark imediately above B & G, Lemma 14.5. *)
-Remark nt_sigma_cover_decomposition x x' :
- \ell_\sigma(x) == 1%N -> x' \in 'R[x]^# ->
- sigma_decomposition (x * x') = [set x; x'].
-Proof.
-move=> ell1x /setD1P[ntx' Rx']; rewrite sigma_cover_decomposition //.
-by rewrite setDE (setIidPl _) ?sub1set ?inE // setUC.
-Qed.
-
-Remark mem_sigma_cover_decomposition x g :
- \ell_\sigma(x) == 1%N -> g \in x *: 'R[x] -> x \in sigma_decomposition g.
-Proof.
-by move=> ell1x /lcosetP[x' Rx' ->]; rewrite sigma_cover_decomposition ?setU11.
-Qed.
-
-Remark ell_sigma_cover x g :
- \ell_\sigma(x) == 1%N -> g \in x *: 'R[x] -> \ell_\sigma(g) <= 2.
-Proof.
-move=> ell1x /lcosetP[x' Rx' ->].
-rewrite /(\ell_\sigma(_)) sigma_cover_decomposition // cardsU1.
-by rewrite (leq_add (leq_b1 _)) // -(cards1 x') subset_leq_card ?subsetDl.
-Qed.
-
-Remark ell_sigma_support M g : M \in 'M -> g \in M^~~ -> \ell_\sigma(g) <= 2.
-Proof.
-by move=> maxM /bigcupP[x Msx]; apply: ell_sigma_cover; apply: Msigma_ell1 Msx.
-Qed.
-
-(* This is B & G, Lemma 14.5(a). *)
-Lemma sigma_cover_disjoint x y :
- \ell_\sigma(x) == 1%N -> \ell_\sigma(y) == 1%N -> x != y ->
- [disjoint x *: 'R[x] & y *: 'R[y]].
-Proof.
-move=> ell1x ell1y neq_xy; apply/pred0P=> g /=.
-have [[ntx _] [nty _]] := (ell_sigma1P x ell1x, ell_sigma1P y ell1y).
-apply: contraNF (ntx) => /andP[/lcosetP[x' Rxx' ->{g}] /= yRy_xx'].
-have def_y: y = x'.
- apply: contraTeq (mem_sigma_cover_decomposition ell1y yRy_xx') => neq_yx'.
- by rewrite sigma_cover_decomposition // !inE negb_or nty eq_sym neq_xy.
-have [[_ <- _ _] [|uniqCx _ _ _ _]] := FT_signalizer_context ell1x.
- by rewrite cardG_gt1; apply/trivgPn; exists x'; rewrite // -def_y.
-have{uniqCx} [maxNx sCxNx] := mem_uniq_mmax uniqCx.
-have Rx_y: y \in 'R[x] by [rewrite def_y]; have [Nxs_y cxy] := setIP Rx_y.
-have Ry_x: x \in 'R[y].
- by rewrite -def_y -(cent1P cxy) mem_lcoset mulKg in yRy_xx'.
-have MSyNx: 'N[x] \in 'M_\sigma[y] by rewrite inE maxNx cycle_subG.
-have [[_ <- _ _] [|uniqCy _ _ _]] := FT_signalizer_context ell1y.
- by rewrite cardG_gt1; apply/trivgPn; exists x.
-have{uniqCy} [_ sCyNy] := mem_uniq_mmax uniqCy.
-case/(_ 'N[x] MSyNx)=> /sdprodP[_ _ _ tiRyNx] _ _ _.
-rewrite -in_set1 -set1gE -tiRyNx -setIA (setIidPr sCyNy) inE Ry_x /=.
-by rewrite inE cent1C cxy (subsetP sCxNx) ?cent1id.
-Qed.
-
-(* This is B & G, Lemma 14.5(b). *)
-Lemma sigma_support_disjoint M1 M2 :
- M1 \in 'M -> M2 \in 'M -> gval M2 \notin M1 :^: G -> [disjoint M1^~~ & M2^~~].
-Proof.
-move=> maxM1 maxM2 notM1GM2; rewrite -setI_eq0 -subset0 big_distrl.
-apply/bigcupsP=> x M1s_x; rewrite big_distrr; apply/bigcupsP=> y M2s_y /=.
-have [ell1x ell1y] := (Msigma_ell1 maxM1 M1s_x, Msigma_ell1 maxM2 M2s_y).
-rewrite subset0 setI_eq0 sigma_cover_disjoint //.
-have{M1s_x M2s_y}[[ntx M1s_x] [_ M2s_y]] := (setD1P M1s_x, setD1P M2s_y).
-pose p := pdiv #[x]; have pixp: p \in \pi(#[x]) by rewrite pi_pdiv order_gt1.
-apply: contraFN (sigma_partition maxM1 maxM2 notM1GM2 p) => eq_xy.
-rewrite inE /= (pnatPpi (mem_p_elt (pcore_pgroup _ _) M1s_x)) //=.
-by rewrite (pnatPpi (mem_p_elt (pcore_pgroup _ _) M2s_y)) -?(eqP eq_xy).
-Qed.
-
-(* This is B & G, Lemma 14.5(c). *)
-Lemma card_class_support_sigma M :
- M \in 'M -> #|class_support M^~~ G| = (#|M`_\sigma|.-1 * #|G : M|)%N.
-Proof.
-move=> maxM; rewrite [#|M`_\sigma|](cardsD1 1) group1 /=.
-set MsG := class_support (M`_\sigma)^# G; pose P := [set x *: 'R[x] | x in MsG].
-have ellMsG x: x \in MsG -> \ell_\sigma(x) == 1%N.
- by case/imset2P=> y z My _ ->; rewrite ell_sigmaJ (Msigma_ell1 maxM).
-have tiP: trivIset P.
- apply/trivIsetP=> _ _ /imsetP[x MsGx ->] /imsetP[y MsGy ->] neq_xRyR.
- by rewrite sigma_cover_disjoint ?ellMsG //; apply: contraNneq neq_xRyR => ->.
-have->: class_support M^~~ G = cover P.
- apply/setP=> az; apply/imset2P/bigcupP=> [[a z] | [xRz]].
- case/bigcupP=> x Ms_x xRa Gz ->; exists (x ^ z *: 'R[x ^ z]).
- by apply: mem_imset; apply: mem_imset2.
- by rewrite sigma_coverJ memJ_conjg.
- case/imsetP=> _ /imset2P[x z Ms_x Gz ->] ->; rewrite sigma_coverJ.
- by case/imsetP=> a xRa ->; exists a z => //; apply/bigcupP; exists x.
-rewrite -(eqnP tiP) big_imset /= => [|x y MsGx MsGy eq_xyR]; last first.
- have: x *: 'R[x] != set0 by rewrite -cards_eq0 -lt0n card_lcoset cardG_gt0.
- rewrite -[x *: _]setIid {2}eq_xyR setI_eq0.
- by apply: contraNeq => neq_xy; rewrite sigma_cover_disjoint ?ellMsG.
-rewrite -{2}(norm_mmax maxM) -astab1JG -indexgI -card_orbit.
-set MG := orbit _ G M; rewrite mulnC -sum_nat_const.
-transitivity (\sum_(Mz in MG) \sum_(x in (Mz`_\sigma)^#) 1); last first.
- apply: eq_bigr => _ /imsetP[z _ ->]; rewrite sum1_card MsigmaJ.
- by rewrite -conjD1g cardJg.
-rewrite (exchange_big_dep (mem MsG)) /= => [|Mz xz]; last first.
- case/imsetP=> z Gz ->; rewrite MsigmaJ -conjD1g => /imsetP[x Ms_x ->{xz}].
- exact: mem_imset2.
-apply: eq_bigr => x MsGx; rewrite card_lcoset sum1dep_card.
-have ell1x := ellMsG x MsGx; have [ntx _] := ell_sigma1P x ell1x.
-have [[transRx -> _ _] _] := FT_signalizer_context ell1x.
-apply: eq_card => Mz; rewrite 2!inE cycle_subG in_setD1 ntx /=.
-apply: andb_id2r => Mzs_x.
-apply/idP/imsetP=> [maxMz | [z _ ->]]; last by rewrite mmaxJ.
-have [y t Ms_y _ def_x] := imset2P MsGx; have{Ms_y} [_ Ms_y] := setD1P Ms_y.
-have [MSxMz MSxMt]: Mz \in 'M_\sigma[x] /\ (M :^ t)%G \in 'M_\sigma[x].
- by rewrite {2}def_x cycleJ sigma_mmaxJ inE maxMz inE maxM !cycle_subG.
-have [z _ ->] := atransP2 transRx MSxMt MSxMz.
-by exists (t * z); rewrite ?inE ?actM.
-Qed.
-
-(* This is B & G, Lemma 14.6. *)
-Lemma sigma_decomposition_dichotomy (g : gT) :
- g != 1 ->
- [exists (x | \ell_\sigma(x) == 1%N), x^-1 * g \in 'R[x]]
- (+) [exists (y | \ell_\sigma(y) == 1%N),
- let y' := y^-1 * g in
- [exists M in 'M_\sigma[y], (y' \in ('C_M[y])^#) && \kappa(M).-elt y']].
-Proof.
-move=> ntg; have [[x ell1x Rx'] | ] := altP exists_inP.
- rewrite /= negb_exists_in; apply/forall_inP=> y ell1y.
- set y' := y^-1 * g; set x' := x^-1 * g in Rx'.
- apply/existsP=> -[M /and3P[MSyM CMy_y' kMy']].
- have [maxM Ms_y] := setIdP MSyM; rewrite cycle_subG in Ms_y.
- have [nty'] := setD1P CMy_y'; case/setIP=> My'; move/cent1P=> cyy'.
- have [[nty _] sMy]:= (ell_sigma1P y ell1y, mem_p_elt (pcore_pgroup _ _) Ms_y).
- have sM'y': \sigma(M)^'.-elt y' := sub_p_elt (@kappa_sigma' M) kMy'.
- have t2M'y': \tau2(M)^'.-elt y'.
- apply: sub_p_elt kMy' => p; move/kappa_tau13.
- by case/orP; [apply: tau2'1 | apply: contraL; apply: tau3'2].
- have xx'_y: y \in pred2 x x'.
- suffices: y \in x |: [set x']^# by rewrite !inE nty.
- rewrite -sigma_cover_decomposition // mulKVg 2!inE nty /=.
- apply/imsetP; exists M => //; rewrite -(mulKVg y g) -/y' consttM //.
- by rewrite (constt_p_elt sMy) (constt1P sM'y') mulg1.
- have nt_x': x' != 1 by case/pred2P: xx'_y; rewrite /x' => <-.
- have maxCY_M: M \in 'M('C[y]).
- have Ms1_y: y \in (M`_\sigma)^# by apply/setD1P.
- rewrite inE maxM; case/pi_of_cent_sigma: CMy_y' => // [[//] | [t2y']].
- by rewrite -order_eq1 (pnat_1 t2y' t2M'y') in nty'.
- have [[_ <- _ _] [|uniqNx _ t2Nx _ _]] := FT_signalizer_context ell1x.
- by rewrite cardG_gt1; apply/trivgPn; exists x'.
- rewrite -order_gt1 (pnat_1 sMy _) // -/(_.-elt _) in nty.
- have{xx'_y} [eq_yx | eq_yx']: y = x \/ y = x' := pred2P xx'_y.
- rewrite eq_yx uniqNx in maxCY_M *; rewrite (set1P maxCY_M).
- by apply: sub_p_elt t2Nx => p; case/andP.
- have eq_xy': x = y' by apply: (mulIg y); rewrite cyy' {1}eq_yx' !mulKVg.
- have [[z _ defM] | notMGNx] := altP (@orbitP _ _ _ 'Js G 'N[x] M).
- rewrite -order_eq1 (pnat_1 _ t2M'y') // in nty'.
- by rewrite -defM (eq_pnat _ (tau2J _ _)) -eq_xy'.
- have Ns_y: y \in 'N[x]`_\sigma by rewrite eq_yx'; case/setIP: Rx'.
- apply: sub_p_elt (mem_p_elt (pcore_pgroup _ _) Ns_y) => p sNp.
- have [maxN _] := mem_uniq_mmax uniqNx.
- by apply: contraFN (sigma_partition _ _ notMGNx p) => // sMp; apply/andP.
-rewrite negb_exists_in => /forall_inP not_sign_g.
-apply: wlog_neg; rewrite negb_exists_in => /forall_inP not_kappa_g.
-have s'g M: M \in 'M -> g \in M -> g.`_\sigma(M) = 1.
- move=> maxM; set x := g.`_\sigma(M); pose x' := g.`_(\sigma(M))^'.
- have def_x': x^-1 * g = x' by rewrite -(consttC \sigma(M) g) mulKg.
- apply: contraTeq => ntx.
- have ell1x: \ell_\sigma(x) == 1%N.
- rewrite /sigma_length (cardsD1 x.`_\sigma(M)).
- rewrite -sigma_decomposition_constt' // mem_sigma_decomposition //.
- by apply/ell_sigma0P; apply/constt1P; rewrite p_eltNK p_elt_constt.
- by rewrite sub_in_constt // => ?.
- apply: contra (not_sign_g _ ell1x) => Mg; rewrite def_x'.
- have [-> | ntx'] := eqVneq x' 1; first exact: group1.
- have cxx': x \in 'C[x'] by apply/cent1P; apply: commuteX2.
- have cMx_x': x' \in ('C_M[x])^# by rewrite 3!inE ntx' cent1C cxx' groupX.
- have Ms_x: x \in M`_\sigma.
- by rewrite (mem_Hall_pcore (Msigma_Hall maxM)) ?p_elt_constt ?groupX.
- have Ms1x: x \in (M`_\sigma)^# by apply/setD1P.
- have sM'x': (\sigma(M))^'.-elt x' := p_elt_constt _ _.
- have [[kMx' _] | [_ ell1x' uniqM]] := pi_of_cent_sigma maxM Ms1x cMx_x' sM'x'.
- case/existsP: (not_kappa_g _ ell1x); exists M; rewrite def_x' cMx_x' /=.
- by rewrite inE maxM cycle_subG Ms_x.
- have MSx'_gt1: #|'M_\sigma[x']| > 1.
- have [_ ntMSx'] := ell_sigma1P _ ell1x'.
- rewrite ltn_neqAle lt0n cards_eq0 ntMSx' andbT eq_sym.
- apply: contra ntx' => MSx'_eq1; rewrite -order_eq1 (pnat_1 _ sM'x') //.
- have [N MSx'N] := set0Pn _ ntMSx'; have [maxN Ns_x'] := setIdP MSx'N.
- rewrite -(eq_uniq_mmax uniqM maxN) ?cent1_sub_uniq_sigma_mmax //.
- exact: pgroupS Ns_x' (pcore_pgroup _ _).
- have defNx': 'N[x'] = M.
- by apply: set1_inj; case/FT_signalizer_context: ell1x' => _ [|<-].
- case/negP: (not_sign_g _ ell1x').
- by rewrite -(consttC \sigma(M)^' g) mulKg consttNK inE defNx' Ms_x.
-have [x sg_x]: exists x, x \in sigma_decomposition g.
- by apply/set0Pn; rewrite -cards_eq0 (sameP (ell_sigma0P g) eqP).
-have{sg_x} [ntx /imsetP[M maxM def_x]] := setD1P sg_x.
-wlog MSxM: M maxM def_x / M \in 'M_\sigma[x].
- have sMx: \sigma(M).-elt x by rewrite def_x p_elt_constt.
- have [|[z Ms_xz] _] := sigma_Jsub maxM sMx; first by rewrite cycle_eq1.
- move/(_ (M :^ z^-1)%G)->; rewrite ?mmaxJ ?(eq_constt _ (sigmaJ M _)) //.
- by rewrite inE mmaxJ maxM MsigmaJ -sub_conjg.
-have ell1x: \ell_\sigma(x) == 1%N.
- by apply/ell_sigma1P; split=> //; apply/set0Pn; exists M.
-have notMg: g \notin M by apply: contra ntx; rewrite def_x; move/s'g->.
-have cxg: g \in 'C[x] by rewrite cent1C def_x groupX ?cent1id.
-have MSx_gt1: #|'M_\sigma[x]| > 1.
- rewrite ltnNge; apply: contra notMg => MSx_le1; apply: subsetP cxg.
- have [_ ntMSx] := ell_sigma1P _ ell1x.
- by rewrite cent1_sub_uniq_sigma_mmax // eqn_leq MSx_le1 lt0n cards_eq0.
-have [_ [//|defNx _ _ _]] := FT_signalizer_context ell1x.
-case/(_ M)=> // _ _ _ hallMN; have [maxN sCxN] := mem_uniq_mmax defNx.
-have Ng: <[g]> \subset 'N[x] by rewrite cycle_subG (subsetP sCxN).
-have sN'g: \sigma('N[x])^'.-elt g by apply/constt1P; rewrite s'g // -cycle_subG.
-have [z _ MNgz] := Hall_subJ (mmax_sol maxN) hallMN Ng sN'g.
-case/eqP: ntx; rewrite def_x -(eq_constt _ (sigmaJ M z)) s'g ?mmaxJ //.
-by move: MNgz; rewrite conjIg cycle_subG => /setIP[].
-Qed.
-
-Section PTypeEmbedding.
-Implicit Types Mi Mj : {group gT}.
-Implicit Type Ks : {set gT}.
-
-(* This is B & G, Theorem 14.7. *)
-(* This theorem provides the basis for the maximal subgroup classification, *)
-(* the main output of the local analysis. Note that we handle differently the *)
-(* two separate instances of non-structural proof (by analogy) that occur in *)
-(* the textbook, p. 112, l. 7 and p. 113, l. 22. For the latter we simply use *)
-(* global induction on the size of the class support of the TI-set \hat{Z} *)
-(* (for this reason we have kept the assertion that this is greater than half *)
-(* of the size of G, even though this is not used later in the proof; we did *)
-(* drop the more precise lower bound). For the former we prove a preliminary *)
-(* lemma that summarizes the four results of the beginning of the proof that *)
-(* used after p. 112, l. 7 -- note that this also gets rid of a third non *)
-(* structural argument (on p. 112, l. 5). *)
-(* Also, note that the direct product decomposition of Z and the K_i, and *)
-(* its direct relation with the sigma-decomposition of elements of Z (p. 112, *)
-(* l. 13-19) is NOT materially used in the rest of the argument, though it *)
-(* does obviously help a human reader forge a mental picture of the situation *)
-(* at hand. Only the first remark, l. 13, is used to prove the alternative *)
-(* definition of T implicit in the remarks l. 22-23. Accordingly, we have *)
-(* suppressed most of these intermediate results: we have only kept the proof *)
-(* that Z is the direct product of the K_i^*, though we discard this result *)
-(* immediately (its 24-line proof just nudges the whole proof size slightyly *)
-(* over the 600-line bar). *)
-Theorem Ptype_embedding M K :
- M \in 'M_'P -> \kappa(M).-Hall(M) K ->
- exists2 Mstar, Mstar \in 'M_'P /\ gval Mstar \notin M :^: G
- & let Kstar := 'C_(M`_\sigma)(K) in
- let Z := K <*> Kstar in let Zhat := Z :\: (K :|: Kstar) in
- [/\ (*a*) {in 'E^1(K), forall X, 'M('C(X)) = [set Mstar]},
- (*b*) \kappa(Mstar).-Hall(Mstar) Kstar /\ \sigma(M).-Hall(Mstar) Kstar,
- (*c*) 'C_(Mstar`_\sigma)(Kstar) = K /\ \kappa(M) =i \tau1(M),
- (*d*) [/\ cyclic Z, M :&: Mstar = Z,
- {in K^#, forall x, 'C_M[x] = Z},
- {in Kstar^#, forall y, 'C_Mstar[y] = Z}
- & {in K^# & Kstar^#, forall x y, 'C[x * y] = Z}]
-& [/\ (*e*) [/\ normedTI Zhat G Z, {in ~: M, forall g, [disjoint Zhat & M :^ g]}
- & (#|G|%:R / 2%:R < #|class_support Zhat G|%:R :> rat)%R ],
- (*f*) M \in 'M_'P2 /\ prime #|K| \/ Mstar \in 'M_'P2 /\ prime #|Kstar|,
- (*g*) {in 'M_'P, forall H, gval H \in M :^: G :|: Mstar :^: G}
- & (*h*) M^`(1) ><| K = M]].
-Proof.
-pose isKi Ks M K := [&& M \in 'M_'P, \kappa(M).-Hall(M) K & Ks \subset K].
-move: M K; have Pmax_sym M K X (Ks := 'C_(M`_\sigma)(K)) (Z := K <*> Ks) Mi :
- M \in 'M_'P -> \kappa(M).-Hall(M) K -> X \in 'E^1(K) -> Mi \in 'M('N(X)) ->
- [/\ Z \subset Mi, gval Mi \notin M :^: G, exists Ki, isKi Ks Mi Ki
- & {in 'E^1(Ks), forall Xs, Z \subset 'N_Mi(gval Xs)}].
-- move=> PmaxM hallK E1X maxNMi.
- have [[_ maxM] [maxMi sNXMi]] := (setIdP PmaxM, setIdP maxNMi).
- have [_ [defNK defNX] [ntKs uniqCKs] _ _] := Ptype_structure PmaxM hallK.
- rewrite -/Ks in defNK ntKs uniqCKs; have [_ mulKKs cKKs _] := dprodP defNK.
- have{mulKKs} defZ: 'N_M(K) = Z by rewrite -mulKKs -cent_joinEr.
- have sZMi: Z \subset Mi.
- by rewrite -defZ; have [<- _] := defNX X E1X; rewrite setIC subIset ?sNXMi.
- have [sKMi sKsMi] := joing_subP sZMi.
- have sXMis: X \subset Mi`_\sigma by have [_ ->] := defNX X E1X.
- have sMiX: \sigma(Mi).-group X := pgroupS sXMis (pcore_pgroup _ _).
- have [q EqX] := nElemP E1X; have [sXK abelX dimX] := pnElemP EqX.
- have piXq: q \in \pi(X) by rewrite -p_rank_gt0 p_rank_abelem ?dimX.
- have notMGMi: gval Mi \notin M :^: G.
- apply: contraL (pnatPpi sMiX piXq); case/imsetP=> a _ ->; rewrite sigmaJ.
- exact: kappa_sigma' (pnatPpi (pHall_pgroup hallK) (piSg sXK piXq)).
- have kMiKs: \kappa(Mi).-group Ks.
- apply/pgroupP=> p p_pr /Cauchy[] // xs Ks_xs oxs.
- pose Xs := <[xs]>%G; have sXsKs: Xs \subset Ks by rewrite cycle_subG.
- have EpXs: Xs \in 'E_p^1(Ks) by rewrite p1ElemE // !inE sXsKs -oxs /=.
- have sMi'Xs: \sigma(Mi)^'.-group Xs.
- rewrite /pgroup /= -orderE oxs pnatE //=.
- apply: contraFN (sigma_partition maxM maxMi notMGMi p) => /= sMi_p.
- rewrite inE /= sMi_p -pnatE // -oxs andbT.
- exact: pgroupS sXsKs (pgroupS (subsetIl _ _) (pcore_pgroup _ _)).
- have uniqM: 'M('C(Xs)) = [set M] by apply: uniqCKs; apply/nElemP; exists p.
- have [x Xx ntx] := trivgPn _ (nt_pnElem EqX isT).
- have Mis_x: x \in (Mi`_\sigma)^# by rewrite !inE ntx (subsetP sXMis).
- have CMix_xs: xs \in ('C_Mi[x])^#.
- rewrite 2!inE -order_gt1 oxs prime_gt1 // inE -!cycle_subG.
- rewrite (subset_trans sXsKs) //= sub_cent1 (subsetP _ x Xx) //.
- by rewrite centsC (centSS sXsKs sXK).
- have{sMi'Xs} [|[_ _]] := pi_of_cent_sigma maxMi Mis_x CMix_xs sMi'Xs.
- by case; rewrite /p_elt oxs pnatE.
- case/mem_uniq_mmax=> _ sCxsMi; case/negP: notMGMi.
- by rewrite -(eq_uniq_mmax uniqM maxMi) ?orbit_refl //= cent_cycle.
- have{kMiKs} [Ki hallKi sKsKi] := Hall_superset (mmax_sol maxMi) sKsMi kMiKs.
- have{ntKs} PmaxMi: Mi \in 'M_'P.
- rewrite !(maxMi, inE) andbT /= -partG_eq1 -(card_Hall hallKi) -trivg_card1.
- exact: subG1_contra sKsKi ntKs.
- have [_ [defNKi defNXs] _ _ _] := Ptype_structure PmaxMi hallKi.
- split=> //= [|Xs]; first by exists Ki; apply/and3P.
- rewrite -{1}[Ks](setIidPr sKsKi) nElemI -setIdE => /setIdP[E1Xs sXsKs].
- have{defNXs} [defNXs _] := defNXs _ E1Xs; rewrite join_subG /= {2}defNXs.
- by rewrite !subsetI sKMi sKsMi cents_norm ?normsG ?(centsS sXsKs) // centsC.
-move=> M K PmaxM hallK /=; set Ks := 'C_(M`_\sigma)(K); set Z := K <*> Ks.
-move: {2}_.+1 (ltnSn #|class_support (Z :\: (K :|: Ks)) G|) => nTG.
-elim: nTG => // nTG IHn in M K PmaxM hallK Ks Z *; rewrite ltnS => leTGn.
-have [maxM notFmaxM]: M \in 'M /\ M \notin 'M_'F := setDP PmaxM.
-have{notFmaxM} ntK: K :!=: 1 by rewrite (trivg_kappa maxM).
-have [_ [defNK defNX] [ntKs uniqCKs] _ _] := Ptype_structure PmaxM hallK.
-rewrite -/Ks in defNK ntKs uniqCKs; have [_ mulKKs cKKs _] := dprodP defNK.
-have{mulKKs} defZ: 'N_M(K) = Z by rewrite -mulKKs -cent_joinEr.
-pose MNX := \bigcup_(X in 'E^1(K)) 'M('N(X)); pose MX := M |: MNX.
-have notMG_MNX: {in MNX, forall Mi, gval Mi \notin M :^: G}.
- by move=> Mi /bigcupP[X E1X /(Pmax_sym M K)[]].
-have MX0: M \in MX := setU11 M MNX.
-have notMNX0: M \notin MNX by apply/negP=> /notMG_MNX; rewrite orbit_refl.
-pose K_ Mi := odflt K [pick Ki | isKi Ks Mi Ki].
-pose Ks_ Mi := 'C_(Mi`_\sigma)(K_ Mi).
-have K0: K_ M = K.
- rewrite /K_; case: pickP => // K1 /and3P[_ /and3P[_ kK1 _] sKsK1].
- have sM_Ks: \sigma(M).-group Ks := pgroupS (subsetIl _ _) (pcore_pgroup _ _).
- rewrite -(setIid Ks) coprime_TIg ?eqxx ?(pnat_coprime sM_Ks) // in ntKs.
- exact: sub_pgroup (@kappa_sigma' M) (pgroupS sKsK1 kK1).
-have Ks0: Ks_ M = Ks by rewrite /Ks_ K0.
-have K_spec: {in MNX, forall Mi, isKi Ks Mi (K_ Mi)}.
- move=> Mi /bigcupP[X _ /(Pmax_sym M K)[] // _ _ [Ki Ki_ok] _].
- by rewrite /K_; case: pickP => // /(_ Ki)/idP.
-have PmaxMX: {in MX, forall Mi, Mi \in 'M_'P /\ \kappa(Mi).-Hall(Mi)(K_ Mi)}.
- by move=> Mi /setU1P[-> | /K_spec/and3P[]//]; rewrite K0.
-have ntKsX: {in MX, forall Mi, Ks_ Mi != 1}.
- by move=> Mi /PmaxMX[MX_Mi /Ptype_structure[] // _ _ []].
-pose co_sHallK Mi Zi :=
- let sMi := \sigma(Mi) in sMi^'.-Hall(Zi) (K_ Mi) /\ sMi.-Hall(Zi) (Ks_ Mi).
-have hallK_Zi: {in MX, forall Mi, co_sHallK Mi (K_ Mi \x Ks_ Mi)}.
- move=> Mi MXi; have [PmaxMi hallKi] := PmaxMX _ MXi.
- have [_ [defNKs _] _ _ _] := Ptype_structure PmaxMi hallKi.
- have [_ mulKKs _ _] := dprodP defNKs; rewrite defNKs.
- have sMi_Kis: _.-group (Ks_ Mi) := pgroupS (subsetIl _ _) (pcore_pgroup _ _).
- have sMi'Ki := sub_pgroup (@kappa_sigma' _) (pHall_pgroup hallKi).
- exact: coprime_mulGp_Hall mulKKs sMi'Ki sMi_Kis.
-have{K_spec} defZX: {in MX, forall Mi, K_ Mi \x Ks_ Mi = Z}.
- move=> Mi MXi; have [-> | MNXi] := setU1P MXi; first by rewrite K0 Ks0 defNK.
- have /and3P[PmaxMi hallKi sKsKi] := K_spec _ MNXi.
- have [X E1X maxNMi] := bigcupP MNXi.
- have{defNX} [defNX /(_ Mi maxNMi) sXMis] := defNX X E1X.
- have /rank_geP[Xs E1Xs]: 0 < 'r(Ks) by rewrite rank_gt0.
- have [_ [defNi defNXi] _ _ _] := Ptype_structure PmaxMi hallKi.
- have [defNXs _] := defNXi _ (subsetP (nElemS 1 sKsKi) _ E1Xs).
- have [_ hallKis] := hallK_Zi _ MXi; rewrite defNi in hallKis.
- have sZNXs: Z \subset 'N_Mi(Xs) by case/(Pmax_sym M K): maxNMi => // _ _ _ ->.
- apply/eqP; rewrite eqEsubset andbC {1}defNi -defNXs sZNXs.
- have [_ _ cKiKis tiKiKis] := dprodP defNi; rewrite dprodEY // -defZ -defNX.
- have E1KiXs: Xs \in 'E^1(K_ Mi) := subsetP (nElemS 1 sKsKi) Xs E1Xs.
- have [|_ _ _ -> //] := Pmax_sym Mi _ Xs M PmaxMi hallKi E1KiXs.
- have [p EpXs] := nElemP E1Xs; have [_] := pnElemP EpXs; case/andP=> pXs _ _.
- rewrite inE maxM (sub_uniq_mmax (uniqCKs _ E1Xs)) ?cent_sub //=.
- exact: mFT_norm_proper (nt_pnElem EpXs isT) (mFT_pgroup_proper pXs).
- have [q /pnElemP[sXK abelX dimX]] := nElemP E1X.
- apply/nElemP; exists q; apply/pnElemP; split=> //.
- have nKisZi: Ks_ Mi <| 'N_Mi(K_ Mi) by case/dprod_normal2: defNi.
- rewrite (sub_normal_Hall hallKis) ?(pgroupS sXMis (pcore_pgroup _ _)) //=.
- by rewrite -defNXs (subset_trans sXK) // (subset_trans (joing_subl _ Ks)).
-have{hallK_Zi} hallK_Z: {in MX, forall Mi, co_sHallK Mi Z}.
- by move=> Mi MXi; rewrite -(defZX _ MXi); apply: hallK_Zi.
-have nsK_Z: {in MX, forall Mi, K_ Mi <| Z /\ Ks_ Mi <| Z}.
- by move=> Mi /defZX; apply: dprod_normal2.
-have tiKs: {in MX &, forall Mi Mj, gval Mi != gval Mj -> Ks_ Mi :&: Ks_ Mj = 1}.
- move=> Mi Mj MXi MXj; apply: contraNeq; rewrite -rank_gt0.
- case/rank_geP=> X E1X; move: E1X (E1X); rewrite /= {1}setIC {1}nElemI.
- case/setIP=> E1jX _; rewrite nElemI => /setIP[E1iX _].
- have [[maxKi hallKi] [maxKj hallKj]] := (PmaxMX _ MXi, PmaxMX _ MXj).
- have [_ _ [_ uniqMi] _ _] := Ptype_structure maxKi hallKi.
- have [_ _ [_ uniqMj] _ _] := Ptype_structure maxKj hallKj.
- by rewrite val_eqE -in_set1 -(uniqMj _ E1jX) (uniqMi _ E1iX) set11.
-have sKsKX: {in MX &, forall Mi Mj, Mj != Mi -> Ks_ Mj \subset K_ Mi}.
- move=> Mi Mj MXi MXj /= neqMji; have [hallKi hallKsi] := hallK_Z _ MXi.
- have [[_ nsKsjZ] [nsKiZ _]] := (nsK_Z _ MXj, nsK_Z _ MXi).
- rewrite (sub_normal_Hall hallKi) ?(normal_sub nsKsjZ) // -partG_eq1.
- by rewrite -(card_Hall (Hall_setI_normal _ hallKsi)) //= setIC tiKs ?cards1.
-have exMNX X: X \in 'E^1(K) -> exists2 Mi, Mi \in MNX & X \subset Mi`_\sigma.
- move=> E1X; have [p EpX] := nElemP E1X; have [_ abelX _] := pnElemP EpX.
- have ltXG: X \proper G := mFT_pgroup_proper (abelem_pgroup abelX).
- have [Mi maxNMi] := mmax_exists (mFT_norm_proper (nt_pnElem EpX isT) ltXG).
- have MNXi: Mi \in MNX by apply/bigcupP; exists X.
- by exists Mi => //; have [_ ->] := defNX X E1X.
-have dprodKs_eqZ: \big[dprod/1]_(Mi in MX) Ks_ Mi = Z; last clear dprodKs_eqZ.
- have sYKs_KX Mi:
- Mi \in MX -> <<\bigcup_(Mj in MX | Mj != Mi) Ks_ Mj>> \subset K_ Mi.
- - move=> MXi; rewrite gen_subG.
- by apply/bigcupsP=> Mj /= /andP[]; apply: sKsKX.
- transitivity <<\bigcup_(Mi in MX) Ks_ Mi>>; apply/eqP.
- rewrite -bigprodGE; apply/bigdprodYP => Mi MXi; rewrite bigprodGE.
- apply: subset_trans (sYKs_KX _ MXi) _; apply/dprodYP.
- have [_ defZi cKiKs tiKiKs] := dprodP (defZX _ MXi).
- by rewrite dprodC joingC dprodEY.
- rewrite eqEsubset {1}(bigD1 M) //= Ks0 setUC -joingE -joing_idl.
- rewrite genS ?setSU ?big_setU1 //=; last by rewrite -K0 sYKs_KX.
- rewrite setUC -joingE -joing_idl Ks0 genS ?setSU // -(Sylow_gen K) gen_subG.
- apply/bigcupsP=> P; case/SylowP=> p p_pr /=; case/and3P=> sPK pP _.
- have [-> | ] := eqsVneq P 1; first exact: sub1G.
- rewrite -rank_gt0 (rank_pgroup pP); case/p_rank_geP=> X EpX.
- have EpKX: X \in 'E_p^1(K) := subsetP (pnElemS p 1 sPK) X EpX.
- have{EpKX} E1X: X \in 'E^1(K) by apply/nElemP; exists p.
- have [Mi MNXi sXMis] := exMNX X E1X; have MXi: Mi \in MX by rewrite setU1r.
- have [[_ nsKsi] [_ hallKsi]] := (nsK_Z _ MXi, hallK_Z _ MXi).
- have sPZ: P \subset Z := subset_trans sPK (joing_subl _ _).
- rewrite sub_gen ?(bigcup_max Mi) // (sub_normal_Hall hallKsi) //.
- rewrite (pi_pgroup pP) // (pnatPpi (pcore_pgroup _ _) (piSg sXMis _)) //.
- by have [_ ? dimX] := pnElemP EpX; rewrite -p_rank_gt0 p_rank_abelem ?dimX.
-pose PZ := [set (Ks_ Mi)^# | Mi in MX]; pose T := Z^# :\: cover PZ.
-have defT: \bigcup_(Mi in MX) (Ks_ Mi)^# * (K_ Mi)^# = T.
- apply/setP=> x; apply/bigcupP/setDP=> [[Mi MXi] | [Zx notZXx]].
- case/mulsgP=> y y' /setD1P[nty Ks_y] /setD1P[nty' Ky'] defx.
- have [_ defZi cKsKi tiKsKi] := dprodP (defZX _ MXi).
- rewrite 2!inE -[Z]defZi -(centC cKsKi) andbC {1}defx mem_mulg //=.
- have notKx: x \notin K_ Mi.
- by rewrite -in_set1 -set1gE -tiKsKi inE Ks_y andbT defx groupMr in nty *.
- split; first exact: group1_contra notKx.
- rewrite cover_imset; apply/bigcupP=> [[Mj MXj /setD1P[_ Ksj_x]]].
- rewrite (subsetP (sKsKX Mi Mj _ _ _)) // in notKx.
- apply: contraNneq nty' => eqMji; rewrite -in_set1 -set1gE -tiKsKi inE Ky'.
- by rewrite -(groupMl _ Ks_y) -defx -eqMji.
- have{Zx} [ntx Zx] := setD1P Zx.
- have [Mi MXi notKi_x]: exists2 Mi, Mi \in MX & x \notin K_ Mi.
- have [Kx | notKx] := boolP (x \in K); last by exists M; rewrite ?K0.
- pose p := pdiv #[x]; have xp: p \in \pi(#[x]) by rewrite pi_pdiv order_gt1.
- have /p_rank_geP[X EpX]: 0 < 'r_p(<[x]>) by rewrite p_rank_gt0.
- have [sXx abelX dimX] := pnElemP EpX.
- have piXp: p \in \pi(X) by rewrite -p_rank_gt0 p_rank_abelem ?dimX.
- have sXK: X \subset K by rewrite (subset_trans sXx) ?cycle_subG.
- have E1X: X \in 'E^1(K) by apply/nElemP; exists p; apply/pnElemP.
- have [Mi MNXi sXMis] := exMNX X E1X; have MXi: Mi \in MX := setU1r M MNXi.
- have sXZ: X \subset Z := subset_trans sXK (joing_subl _ _).
- have sMip: p \in \sigma(Mi) := pnatPpi (pcore_pgroup _ _) (piSg sXMis piXp).
- have [hallKi _] := hallK_Z _ MXi.
- exists Mi => //; apply: contraL sMip => Ki_x.
- exact: pnatPpi (mem_p_elt (pHall_pgroup hallKi) Ki_x) xp.
- have [_ defZi cKisKi _] := dprodP (defZX _ MXi).
- rewrite -[Z]defZi -(centC cKisKi) in Zx.
- have [y y' Kis_y Ki_y' defx] := mulsgP Zx.
- have Kis1y: y \in (Ks_ Mi)^#.
- rewrite 2!inE Kis_y andbT; apply: contraNneq notKi_x => y1.
- by rewrite defx y1 mul1g.
- exists Mi; rewrite // defx mem_mulg // 2!inE Ki_y' andbT.
- apply: contraNneq notZXx => y'1; rewrite cover_imset.
- by apply/bigcupP; exists Mi; rewrite // defx y'1 mulg1.
-have oT: #|T| = #|Z| + #|MNX| - (\sum_(Mi in MX) #|Ks_ Mi|).
- have tiTPZ Kis: Kis \in PZ -> [disjoint T & Kis].
- move=> Z_Kis; rewrite -setI_eq0 setIDAC setD_eq0.
- by rewrite (bigcup_max Kis) ?subsetIr.
- have notPZset0: set0 \notin PZ.
- apply/imsetP=> [[Mi MXi]]; apply/eqP; rewrite /= eq_sym setD_eq0 subG1.
- exact: ntKsX.
- have [| tiPZ injKs] := trivIimset _ notPZset0.
- move=> Mi Mj MXi MXj /= neqMji.
- by rewrite -setI_eq0 -setDIl setD_eq0 setIC tiKs.
- have{tiPZ} [tiPZ notPZ_T] := trivIsetU1 tiTPZ tiPZ notPZset0.
- rewrite (eq_bigr (fun Mi : {group gT} => 1 + #|(Ks_ Mi)^#|)%N); last first.
- by move=> Mi _; rewrite (cardsD1 1) group1.
- rewrite big_split sum1_card cardsU1 notMNX0 (cardsD1 1 Z) group1 /=.
- have ->: Z^# = cover (T |: PZ).
- rewrite -(setID Z^# (cover PZ)) setUC (setIidPr _) /cover ?big_setU1 //=.
- apply/bigcupsP=> _ /imsetP[Mi MXi ->]; apply: setSD.
- by case/nsK_Z: MXi => _ /andP[].
- by rewrite addnAC subnDl -(eqnP tiPZ) big_setU1 // big_imset //= addnK.
-have tiTscov: {in 'M, forall H, [disjoint T & H^~~]}.
- move=> H maxH; apply/pred0P=> t; apply/andP=> [[/= Tt scovHt]].
- have ntt: t != 1 by have [/setD1P[]] := setDP Tt.
- have [x Hs_x xR_y] := bigcupP scovHt; have ell1x := Msigma_ell1 maxH Hs_x.
- have:= sigma_decomposition_dichotomy ntt.
- rewrite (introT existsP) /=; last by exists x; rewrite ell1x -mem_lcoset.
- rewrite -defT in Tt; have [Mi MXi Zi_t] := bigcupP Tt.
- case/mulsgP: Zi_t => y y' /setD1P[nty Ks_y] /setD1P[nty' Ky'] ->.
- case/existsP; exists y; rewrite mulKg.
- have [[Mis_y cKy] [PmaxMi hallKi]] := (setIP Ks_y, PmaxMX _ MXi).
- have [[maxMi _] [sKiMi kMiKi _]] := (setDP PmaxMi, and3P hallKi).
- rewrite (Msigma_ell1 maxMi) ?inE ?nty //=; apply/existsP; exists Mi.
- rewrite inE maxMi cycle_subG Mis_y 3!inE nty' (subsetP sKiMi) //=.
- by rewrite (subsetP _ _ Ky') ?sub_cent1 // (mem_p_elt kMiKi).
-have nzT: T != set0.
- have [[y Ksy nty] [y' Ky' nty']] := (trivgPn _ ntKs, trivgPn _ ntK).
- apply/set0Pn; exists (y * y'); rewrite -defT; apply/bigcupP.
- by exists M; rewrite ?MX0 // K0 Ks0 mem_mulg 2?inE ?nty ?nty'.
-have ntiT: normedTI T G Z.
- have sTZ: {subset T <= Z} by apply/subsetP; rewrite 2!subDset setUA subsetUr.
- have nTZ: Z \subset 'N(T).
- rewrite normsD ?norms_bigcup ?normD1 ?normG //.
- apply/bigcapsP=> _ /imsetP[Mi MXi ->]; rewrite normD1.
- by case/nsK_Z: MXi => _ /andP[].
- apply/normedTI_P; rewrite setTI /= -/Z.
- split=> // a _ /pred0Pn[t /andP[/= Tt]]; rewrite mem_conjg => Tta.
- have{Tta} [Zt Zta] := (sTZ t Tt, sTZ _ Tta).
- move: Tt; rewrite -defT => /bigcupP[Mi MXi].
- case/mulsgP=> y y' /setD1P[nty Kisy] /setD1P[nty' Kiy'] def_yy'.
- have [[hallKi hallKis] [nsKiZ _]] := (hallK_Z _ MXi, nsK_Z _ MXi).
- have [[PmaxMi hallKiMi] defZi] := (PmaxMX _ MXi, defZX _ MXi).
- have [_ [defNKi _] _ [[]]] := Ptype_structure PmaxMi hallKiMi.
- rewrite -defNKi defZi -/(Ks_ _) => tiKsi tiKi _ _ _.
- have [defy defy']: y = t.`_\sigma(Mi) /\ y' = t.`_\sigma(Mi)^'.
- have [_ cKiy] := setIP Kisy; have cy'y := centP cKiy _ Kiy'.
- have sMi_y := mem_p_elt (pHall_pgroup hallKis) Kisy.
- have sMi'y' := mem_p_elt (pHall_pgroup hallKi) Kiy'.
- rewrite def_yy' !consttM // constt_p_elt // 2?(constt1P _) ?p_eltNK //.
- by rewrite mulg1 mul1g constt_p_elt.
- have: a \in Mi.
- apply: contraR nty; rewrite -in_setC -in_set1 -set1gE; move/tiKsi <-.
- rewrite inE Kisy mem_conjg defy -consttJ groupX ?(subsetP _ _ Zta) //.
- by rewrite -defZi defNKi subsetIl.
- apply/implyP; apply: contraR nty'; rewrite negb_imply andbC -in_setD.
- rewrite -in_set1 -set1gE => /tiKi <-; rewrite inE Kiy' defy' mem_conjg.
- by rewrite -consttJ (mem_normal_Hall hallKi nsKiZ) ?p_elt_constt ?groupX.
-have [_ tiT /eqP defNT] := and3P ntiT; rewrite setTI in defNT.
-pose n : rat := #|MNX|%:R; pose g : rat := #|G|%:R.
-pose z : rat := #|Z|%:R; have nz_z: z != 0%R := natrG_neq0 _ _.
-pose k_ Mi : rat := #|K_ Mi|%:R.
-have nz_ks: #|Ks_ _|%:R != 0%R :> rat := natrG_neq0 _ _.
-pose TG := class_support T G.
-have oTG: (#|TG|%:R = (1 + n / z - \sum_(Mi in MX) (k_ Mi)^-1) * g)%R.
- rewrite /TG class_supportEr -cover_imset -(eqnP tiT).
- rewrite (eq_bigr (fun _ => #|T|)) => [|_ /imsetP[x _ ->]]; last first.
- by rewrite cardJg.
- rewrite sum_nat_const card_conjugates setTI defNT.
- rewrite natrM natf_indexg ?subsetT //= -/z -mulrA mulrC; congr (_ * _)%R.
- rewrite oT natrB; last by rewrite ltnW // -subn_gt0 lt0n -oT cards_eq0.
- rewrite mulrC natrD -/n -/z natr_sum /=.
- rewrite mulrBl mulrDl big_distrl divff //=; congr (_ - _)%R.
- apply: eq_bigr => Mi MXi; have defZi := defZX _ MXi.
- by rewrite /z -(dprod_card defZi) natrM invfM mulrC divfK.
-have neMNX: MNX != set0.
- move: ntK; rewrite -rank_gt0 => /rank_geP[X /exMNX[Mi MNXi _]].
- by apply/set0Pn; exists Mi.
-have [Mi MXi P2maxMi]: exists2 Mi, Mi \in MX & Mi \in 'M_'P2.
- apply/exists_inP; apply: negbNE; rewrite negb_exists_in.
- apply/forall_inP=> allP1; pose ssup Mi := class_support (gval Mi)^~~ G.
- have{allP1} min_ssupMX Mi:
- Mi \in MX -> (#|ssup Mi|%:R >= ((k_ Mi)^-1 - (z *+ 2)^-1) * g)%R.
- - move=> MXi; have [PmaxMi hallKi] := PmaxMX _ MXi.
- have [[U [complU defMi] _]] := Ptype_structure PmaxMi hallKi.
- case=> defZi _ _ _ _; have [maxMi _] := setDP PmaxMi.
- have{complU} U1: U :==: 1; last rewrite {U U1}(eqP U1) sdprod1g in defMi.
- rewrite (trivg_kappa_compl maxMi complU).
- by apply: contraR (allP1 _ MXi) => ?; apply/setDP.
- rewrite card_class_support_sigma // natrM natf_indexg ?subsetT // -/g.
- rewrite mulrCA mulrC ler_wpmul2r ?ler0n // -subn1 natrB ?cardG_gt0 //.
- rewrite mulr1n mulrBl -{1}(sdprod_card defMi) natrM invfM.
- rewrite mulVKf ?natrG_neq0 // ler_add2l ler_opp2 -(mulr_natr _ 2) invfM.
- rewrite ler_pdivr_mulr ?natrG_gt0 // mulrC mulrA.
- have sZM: Z \subset M by rewrite -defZ subsetIl.
- have sZMi: Z \subset Mi by rewrite -(defZX _ MXi) defZi subsetIl.
- rewrite -natf_indexg //= -/Z ler_pdivl_mulr ?(ltr0Sn _ 1) // mul1r ler_nat.
- rewrite indexg_gt1 /= -/Z subEproper /proper sZMi andbF orbF.
- apply: contraNneq notMNX0 => defMiZ; have [Mj MNXj] := set0Pn _ neMNX.
- have maxZ: [group of Z] \in 'M by rewrite !inE defMiZ in maxMi *.
- have eqZ := group_inj (eq_mmax maxZ _ _); rewrite -(eqZ M) //.
- have [Xj E1Xj maxNMj] := bigcupP MNXj; have [maxMj _] := setIdP maxNMj.
- by rewrite (eqZ Mj) //; case/(Pmax_sym M K): maxNMj.
- pose MXsup := [set ssup Mi | Mi in MX].
- have notMXsup0: set0 \notin MXsup.
- apply/imsetP=> [[Mi /PmaxMX[/setDP[maxMi _] _] /esym/eqP/set0Pn[]]].
- have [x Mis_x ntx] := trivgPn _ (Msigma_neq1 maxMi).
- exists (x ^ 1); apply: mem_imset2; rewrite ?inE //.
- by apply/bigcupP; exists x; rewrite ?inE ?ntx // lcoset_refl.
- have [Mi Mj MXi MXj /= neqMij | tiMXsup inj_ssup] := trivIimset _ notMXsup0.
- apply/pred0Pn=> [[_ /andP[/imset2P[x y1 signMi_x _ ->]]]] /=.
- rewrite /ssup class_supportEr /= => /bigcupP[y2 _].
- rewrite -mem_conjgV -conjsgM -sigma_supportJ; set H := Mj :^ _ => Hx.
- suffices: [disjoint Mi^~~ & H^~~].
- by case/pred0Pn; exists x; rewrite /= {1}signMi_x Hx.
- have [[PmaxMi _] [PmaxMj _]] := (PmaxMX _ MXi, PmaxMX _ MXj).
- have [[maxMi _] [maxMj _]] := (setDP PmaxMi, setDP PmaxMj).
- apply: sigma_support_disjoint; rewrite ?mmaxJ //.
- rewrite (orbit_transl _ (mem_orbit _ _ _)) ?inE //=.
- apply: contra (ntKsX _ MXi); case/imsetP=> y _ /= defMj; rewrite -/(Ks_ _).
- have sKisKj: Ks_ Mi \subset K_ Mj by rewrite sKsKX // eq_sym.
- rewrite -(setIidPl sKisKj) coprime_TIg //.
- have [[_ hallKis] [hallKj _]] := (hallK_Z _ MXi, hallK_Z _ MXj).
- apply: pnat_coprime (pHall_pgroup hallKj).
- by rewrite defMj -pgroupE (eq_pgroup _ (sigmaJ _ _)) (pHall_pgroup hallKis).
- have [|tiPG notMXsupTG]: _ /\ TG \notin _ := trivIsetU1 _ tiMXsup notMXsup0.
- move=> _ /imsetP[Mi /PmaxMX[/setDP[maxMi _] _] ->].
- apply/pred0Pn=> [[_ /andP[/imset2P[x y1 Tx _ ->]]]] /=.
- rewrite /ssup class_supportEr => /bigcupP[y2 _].
- rewrite -mem_conjgV -conjsgM -sigma_supportJ; set H := Mi :^ _ => Hx.
- have maxH: [group of H] \in 'M by rewrite mmaxJ.
- by case/andP: (pred0P (tiTscov _ maxH) x).
- suffices: (g <= #|cover (TG |: MXsup)|%:R)%R.
- rewrite ler_nat (cardsD1 1 G) group1 ltnNge subset_leq_card //.
- apply/bigcupsP=> _ /setU1P[|/imsetP[Mi /PmaxMX[/setDP[maxMi _] _]]] ->.
- rewrite /TG class_supportEr; apply/bigcupsP=> x _.
- rewrite sub_conjg (normP _) ?normD1 ?(subsetP (normG _)) ?inE //.
- by rewrite subDset setUC subsetU // setSD ?subsetT.
- rewrite /ssup class_supportEr; apply/bigcupsP=> x _.
- rewrite subsetD1 subsetT mem_conjg conj1g {x}/=.
- move/ell_sigma0P: (@erefl gT 1); rewrite cards_eq0.
- apply: contraL => /bigcupP[x Mis_x xR1]; apply/set0Pn; exists x.
- exact: mem_sigma_cover_decomposition (Msigma_ell1 maxMi Mis_x) xR1.
- rewrite -(eqnP tiPG) big_setU1 ?big_imset //= natrD natr_sum.
- suffices: (g <= #|TG|%:R + \sum_(i in MX) ((k_ i)^-1 - (z *+ 2)^-1) * g)%R.
- by move/ler_trans->; rewrite // ler_add2l ler_sum.
- rewrite -big_distrl /= oTG -/g -mulrDl big_split /= sumr_const.
- rewrite addrA subrK -(mulr_natl _ 2) -[_ *+ _]mulr_natl invfM mulrN.
- rewrite mulrA -addrA -mulrBl -{1}(mul1r g) ler_wpmul2r ?ler0n //.
- rewrite ler_addl -(mul0r z^-1)%R ler_wpmul2r ?invr_ge0 ?ler0n //.
- rewrite subr_ge0 ler_pdivr_mulr ?(ltr0Sn _ 1) // -natrM ler_nat.
- by rewrite muln2 -addnn cardsU1 leq_add2r notMNX0 lt0n cards_eq0.
-have [prKi nilMis]: prime #|K_ Mi| /\ nilpotent Mi`_\sigma.
- by have [PmaxMi /Ptype_structure[] // _ _ _ _ []] := PmaxMX _ MXi.
-have [Mj MXj neqMji]: exists2 Mj, Mj \in MX & Mj :!=: Mi.
- have [Mj |] := pickP (mem ((MX) :\ Mi)); first by case/setD1P; exists Mj.
- move/eq_card0/eqP; rewrite -(eqn_add2l true) -{1}MXi -cardsD1 cardsU1.
- by rewrite notMNX0 eqSS cards_eq0 (negPf neMNX).
-have defKjs: Ks_ Mj = K_ Mi.
- have sKjsKi: Ks_ Mj \subset K_ Mi by rewrite sKsKX.
- apply/eqP; rewrite eqEcard sKjsKi (prime_nt_dvdP _ _ (cardSg sKjsKi)) //=.
- by rewrite -trivg_card1 ntKsX.
-have defMXij: MX = [set Mi; Mj].
- symmetry; rewrite -(setD1K MXi); congr (_ |: _); apply/eqP.
- rewrite eqEcard sub1set cards1 (cardsD1 Mj) 2!inE neqMji MXj /= ltnS leqn0.
- apply/pred0Pn=> [[Mk /setD1P[neMkj /setD1P[neMki MXk]]]].
- have sKskKsj: Ks_ Mk \subset Ks_ Mj by rewrite defKjs sKsKX.
- by case/negP: (ntKsX _ MXk); rewrite -(setIidPl sKskKsj) tiKs.
-have defKsi: Ks_ Mi = K_ Mj.
- apply/eqP; rewrite eqEcard sKsKX 1?eq_sym //=.
- rewrite -(@leq_pmul2r #|Ks_ Mj|) ?cardG_gt0 // (dprod_card (defZX _ MXj)).
- by rewrite defKjs mulnC (dprod_card (defZX _ MXi)).
-have{nilMis} cycZ: cyclic Z.
- have cycKi := prime_cyclic prKi.
- apply: nil_Zgroup_cyclic.
- apply/forall_inP=> S /SylowP[p _ /and3P[sSZ pS _]].
- have [[hallKi hallKis] [nsKi nsKis]] := (hallK_Z _ MXi, nsK_Z _ MXi).
- have [sMi_p | sMi'p] := boolP (p \in \sigma(Mi)); last first.
- by rewrite (cyclicS _ cycKi) // (sub_normal_Hall hallKi) ?(pi_pgroup pS).
- have sSKj: S \subset K_ Mj.
- by rewrite -defKsi (sub_normal_Hall hallKis) ?(pi_pgroup pS).
- rewrite (odd_pgroup_rank1_cyclic pS) ?mFT_odd //.
- apply: wlog_neg; rewrite -ltnNge ltn_neqAle p_rank_gt0 => /andP[_ piSp].
- have [_ /and3P[sKjMj kKj _]] := PmaxMX _ MXj.
- rewrite -(rank_kappa (pnatPpi kKj (piSg sSKj piSp))) p_rankS //.
- exact: subset_trans sSKj sKjMj.
- rewrite (dprod_nil (defZX _ MXi)) abelian_nil ?cyclic_abelian //=.
- exact: (nilpotentS (subsetIl _ _)) nilMis.
-have cycK: cyclic K := cyclicS (joing_subl _ _) cycZ.
-have defM: M^`(1) ><| K = M.
- have [U complU] := ex_kappa_compl maxM hallK; have [hallU _ _] := complU.
- have [_ defM _ regUK _] := kappa_compl_context maxM complU.
- have{hallU} [[sUM _] [sKM kK _]] := (andP hallU, and3P hallK).
- case/sdprodP: defM => [[_ E _ defE]]; rewrite defE.
- case/sdprodP: defE => _ <-{E} nUK _ defM /mulGsubP[nMsU nMsK] tiMsUK.
- pose MsU := M`_\sigma <*> U; have nMsUK: K \subset 'N(MsU) by rewrite normsY.
- have defMl: MsU * K = M by rewrite [MsU]norm_joinEr // -mulgA.
- have coUK := regular_norm_coprime nUK regUK.
- have ->: M^`(1) = MsU.
- apply/eqP; rewrite eqEsubset; apply/andP; split; last first.
- have solU := solvableS sUM (mmax_sol maxM).
- rewrite join_subG Msigma_der1 //= -(coprime_cent_prod nUK coUK solU).
- by rewrite (cent_semiregular regUK) // mulg1 commgSS.
- apply: der1_min; first by rewrite -{1}defMl mulG_subG normG.
- by rewrite -{2}defMl quotientMidl quotient_abelian ?cyclic_abelian.
- rewrite sdprodE ?coprime_TIg //= norm_joinEr //.
- rewrite (coprime_dvdl (dvdn_cardMg _ _)) // coprime_mull coUK.
- rewrite (pnat_coprime (pcore_pgroup _ _) (sub_pgroup _ kK)) //.
- exact: kappa_sigma'.
-have{neMNX} [Mstar MNX'star] := set0Pn _ neMNX.
-have defMNX: MNX = [set Mstar].
- apply/eqP; rewrite eq_sym eqEcard sub1set MNX'star /= -(leq_add2l true).
- by rewrite -{1}notMNX0 -cardsU1 -/MX defMXij setUC cards2 neqMji !cards1.
-have MXstar: Mstar \in MX by rewrite setU1r.
-have [[PmaxMstar hallKstar] defZstar] := (PmaxMX _ MXstar, defZX _ MXstar).
-have [maxMstar _] := setDP PmaxMstar.
-have notMGMstar := notMG_MNX _ MNX'star; exists Mstar => //.
-have [defKs defKs_star]: Ks = K_ Mstar /\ Ks_ Mstar = K.
- rewrite /Ks /Ks_ -K0; rewrite /MX defMNX 3!inE val_eqE in neqMji MXj MXi.
- by case/set2P: MXi (negPf neqMji) MXj => <- ->; rewrite ?orbF /= => /eqP <-.
-have hallKs: \sigma(M).-Hall(Mstar) Ks.
- have sKsMstar: Ks \subset Mstar by rewrite defKs (pHall_sub hallKstar).
- have sM_Ks: \sigma(M).-group Ks := pgroupS (subsetIl _ _) (pcore_pgroup _ _).
- have [Y hallY sKsY] := Hall_superset (mmax_sol maxMstar) sKsMstar sM_Ks.
- have [sYMstar sM_Y _] := and3P hallY; apply: etrans hallY; congr pHall.
- have sYMs: Y \subset M`_\sigma.
- case/Ptype_structure: hallK => // _ _ _ [_ _ -> //].
- by rewrite (setIidPr sKsY).
- apply/eqP; rewrite eqEsubset sKsY subsetI sYMs (sameP commG1P trivgP) /=.
- have <-: M`_\sigma :&: Mstar`_\sigma = 1.
- rewrite coprime_TIg // (pnat_coprime (pcore_pgroup _ _)) //.
- apply: sub_pgroup (pcore_pgroup _ _) => q sM1q.
- apply: contraFN (sigma_partition maxM maxMstar notMGMstar q) => sMq.
- exact/andP.
- rewrite commg_subI //.
- by rewrite subsetI sYMs (subset_trans sYMstar) ?gFnorm.
- rewrite subsetI -{1}defKs_star subsetIl.
- by rewrite (subset_trans (pHall_sub hallK)) ?gFnorm.
-have oTGgt_g2: (g / 2%:R < #|TG|%:R)%R.
- rewrite oTG big_setU1 //= /n defMNX big_set1 cards1 mulrC mul1r.
- rewrite ltr_pmul2r ?(ltr_nat _ 0) ?cardG_gt0 // /k_ K0 -defKs.
- rewrite /z -defZ -(dprod_card defNK) natrM invfM opprD.
- pose hm u : rat := (1 - u%:R^-1)%R; set lhs := (_^-1)%R.
- suffices: (lhs < hm #|K| * hm #|Ks|)%R.
- by rewrite mulrBl !mulrBr !mul1r mulr1 opprB addrAC !addrA.
- have hm_inc u v: 0 < u <= v -> (hm u <= hm v)%R.
- case/andP=> u_gt0 le_uv; rewrite ler_add2l ler_opp2.
- have v_gt0 := leq_trans u_gt0 le_uv.
- rewrite -(mul1r _^-1)%R ler_pdivr_mulr ?ltr0n //.
- by rewrite ler_pdivl_mull ?ltr0n // mulr1 ler_nat.
- have le_pdiv H: 0 < pdiv #|H| <= #|H| by rewrite pdiv_gt0 dvdn_leq ?pdiv_dvd.
- have{le_pdiv} hm_pdiv := hm_inc _ _ (le_pdiv _).
- have hm_ge0 u: (0 <= hm u)%R.
- by case: u => // u; rewrite subr_ge0 invf_le1 ?ltr0Sn ?(ler_nat _ 1).
- do 2![rewrite mulrC (ltr_le_trans _ (ler_wpmul2r (hm_ge0 _) (hm_pdiv _))) //].
- set p := pdiv #|K|; set q := pdiv #|Ks|.
- have [odd_p odd_q]: odd p /\ odd q.
- by split; apply: dvdn_odd (pdiv_dvd _) (mFT_odd _).
- without loss [lt1p ltpq]: p q odd_p odd_q / 1 < p /\ p < q.
- have [p_pr q_pr]: prime p /\ prime q by rewrite !pdiv_prime ?cardG_gt1.
- have [ltpq | ltqp | eqpq] := ltngtP p q.
- - by apply; rewrite ?prime_gt1.
- - by rewrite mulrC; apply; rewrite ?prime_gt1.
- have [] := hallK_Z _ MX0.
- rewrite K0 Ks0 => /and3P[_ sM'K _] /and3P[_ sMKs _].
- case/negP: (pgroupP sM'K _ p_pr (pdiv_dvd _)); rewrite eqpq.
- exact: pgroupP sMKs _ q_pr (pdiv_dvd _).
- have p_gt2: 2 < p by rewrite odd_geq.
- apply: ltr_le_trans (isT : lhs < hm 3 * hm 5)%R _.
- by rewrite ler_pmul ?hm_inc ?hm_ge0 //= odd_geq ?(leq_trans _ ltpq).
-have defZhat: Z :\: (K :|: Ks) = T.
- rewrite /T cover_imset big_setU1 //= defMNX big_set1 defKs_star Ks0.
- by rewrite -setDUl setDDl setUC setD1K // inE group1.
-rewrite defZhat {1}defKs; split; first 2 [by split].
-- by rewrite -defKs_star; case/Ptype_structure: hallKstar => // _ _ [].
-- split=> [|p]; first by rewrite -defKs_star defKs.
- apply/idP/idP=> [kMp | t1p].
- have /orP[// | /and3P[_ _ p_dv_M']] := kappa_tau13 kMp.
- have hallM': \kappa(M)^'.-Hall(M) M^`(1).
- exact/(sdprod_normal_pHallP (der_normal 1 M) hallK).
- have piMp: p \in \pi(M) by rewrite kappa_pi.
- case/idPn: kMp; apply: (pnatPpi (pHall_pgroup hallM')).
- by move: piMp; rewrite !mem_primes !cardG_gt0 /= => /andP[->].
- apply: (pnatPpi (pHall_pgroup hallK)); have [_ _ not_p_dv_M'] := and3P t1p.
- have: p \in \pi(M) by rewrite (partition_pi_mmax maxM) t1p ?orbT.
- rewrite !mem_primes !cardG_gt0 /= => /andP[p_pr].
- by rewrite p_pr -(sdprod_card defM) Euclid_dvdM // (negPf not_p_dv_M').
-- split=> // [| x | y | x y K1_x Ks1_y].
- + have defMsMstar: M`_\sigma :&: Mstar = Ks.
- apply: sub_pHall hallKs _ _ (subsetIr _ _).
- exact: pgroupS (subsetIl _ _) (pcore_pgroup _ _).
- by rewrite subsetI subsetIl /= -/Ks defKs (pHall_sub hallKstar).
- have nKsMMstar: M :&: Mstar \subset 'N(Ks).
- by rewrite -defMsMstar normsIG ?gFnorm.
- have [_ [defNKs _] _ _ _] := Ptype_structure PmaxMstar hallKstar.
- rewrite -(setIidPl nKsMMstar) -setIA defKs -defNKs defZstar.
- by rewrite -defZ setIA setIid.
- + case/setD1P; rewrite -cycle_eq1 -cycle_subG -cent_cycle => ntx sxK.
- apply/eqP; rewrite eqEsubset andbC subsetI -{1}defZ subsetIl.
- rewrite sub_abelian_cent ?cyclic_abelian //=; last first.
- by rewrite (subset_trans sxK) ?joing_subl.
- move: ntx; rewrite -rank_gt0 /= -{1}(setIidPr sxK) => /rank_geP[X].
- rewrite nElemI -setIdE -defZ => /setIdP[E1X sXx].
- by have [<- _] := defNX _ E1X; rewrite setIS ?cents_norm ?centS.
- + case/setD1P; rewrite -cycle_eq1 -cycle_subG -cent_cycle => nty syKs.
- have [_ [defNKs defNY] _ _ _] := Ptype_structure PmaxMstar hallKstar.
- rewrite defZstar -defKs in defNKs defNY.
- apply/eqP; rewrite eqEsubset andbC subsetI {1}defNKs subsetIl.
- rewrite sub_abelian_cent ?cyclic_abelian //=; last first.
- by rewrite (subset_trans syKs) ?joing_subr.
- move: nty; rewrite -rank_gt0 /= -{1}(setIidPr syKs) => /rank_geP[Y].
- rewrite nElemI -setIdE defNKs => /setIdP[E1Y sYy].
- by have [<- _] := defNY _ E1Y; rewrite setIS ?cents_norm ?centS.
- have [[_ K_x] [_ Ks_y]] := (setD1P K1_x, setD1P Ks1_y).
- apply/eqP; rewrite eqEsubset sub_cent1 -(centsP cKKs) //.
- have Tyx: y * x \in T by rewrite -defT big_setU1 //= inE Ks0 K0 mem_mulg.
- rewrite (subset_trans _ (cent1_normedTI ntiT Tyx)) ?setTI //.
- rewrite (subsetP _ _ Tyx) // -defZhat setDE subIset //.
- by rewrite -abelianE cyclic_abelian.
-split=> // [||H PmaxH].
-- split=> // a notMa.
- have{tiKs} [_ _ _ [[tiKs _] _ _] _] := Ptype_structure PmaxM hallK.
- rewrite -defT big_setU1 //= defMNX big_set1 -defKs defKs_star Ks0 K0.
- rewrite centC ?(centSS _ _ cKKs) ?subsetDl // setUid.
- apply/pred0Pn=> [[_ /andP[/mulsgP[x y K1_x Ks1_y ->] /= Ma_xy]]].
- have [[_ K_x] [nty Ks_y]] := (setD1P K1_x, setD1P Ks1_y); case/negP: nty.
- rewrite -in_set1 -set1gE -(tiKs a notMa) inE Ks_y.
- suffices ->: y = (x * y).`_\sigma(M) by rewrite groupX.
- rewrite consttM; last by red; rewrite -(centsP cKKs).
- have sM'K := sub_pgroup (@kappa_sigma' M) (pHall_pgroup hallK).
- rewrite (constt1P (mem_p_elt sM'K K_x)) mul1g constt_p_elt //.
- exact: mem_p_elt (pHall_pgroup hallKs) Ks_y.
-- have:= set21 Mi Mj; rewrite -defMXij /MX defMNX defKs -K0.
- by case/set2P=> <-; [left | right].
-have [maxH _] := setDP PmaxH.
-have{maxH}[L hallL] := Hall_exists \kappa(H) (mmax_sol maxH).
-pose Ls := 'C_(H`_\sigma)(L); pose S := (L <*> Ls) :\: (L :|: Ls).
-have{IHn} oSGgt_g2: (g / 2%:R < #|class_support S G|%:R)%R.
- have [|nTG_leS] := ltnP #|class_support S G| nTG.
- by case/IHn=> // Sstar _ [_ _ _ _ [[_ _ -> //]]].
- apply: ltr_le_trans oTGgt_g2 _; rewrite ler_nat /TG -defZhat.
- exact: leq_trans leTGn nTG_leS.
-have{oSGgt_g2 oTGgt_g2} meetST: ~~ [disjoint TG & class_support S G].
- rewrite -leq_card_setU; apply: contraTneq (leqnn #|G|) => tiTGS.
- rewrite -ltnNge -(ltr_nat [realFieldType of rat]) -/g.
- rewrite -{1}[g](@divfK _ 2%:R) // mulr_natr.
- apply: ltr_le_trans (ltr_add oTGgt_g2 oSGgt_g2) _.
- by rewrite -natrD -tiTGS ler_nat cardsT max_card.
-have{meetST} [x Tx [a Sx]]: exists2 x, x \in T & exists a, x \in S :^ a.
- have [_ /andP[/imset2P[x a1 Tx _ ->]]] := pred0Pn meetST.
- rewrite class_supportEr => /bigcupP[a2 _ Sa2_xa1].
- by exists x => //; exists (a2 * a1^-1); rewrite conjsgM mem_conjgV.
-rewrite {}/S {}/Ls in Sx; without loss a1: a H L PmaxH hallL Sx / a = 1.
- move/(_ 1 (H :^ a)%G (L :^ a)%G); rewrite conjsg1 PtypeJ PmaxH pHallJ2.
- rewrite (eq_pHall _ _ (kappaJ H a)) hallL MsigmaJ centJ.
- rewrite -conjIg -conjYg -conjUg -conjDg Sx !inE.
- by rewrite !(orbit_transl _ (mem_orbit _ _ _)) ?inE //; apply.
-have [_ [defNL _] [_ uniqH] _ _] := Ptype_structure PmaxH hallL.
-do [rewrite {a}a1 conjsg1; set Ls := 'C_(_)(L)] in Sx defNL.
-have{x Sx Tx} [Mk MXk ntLsMks]: exists2 Mk, Mk \in MX & Ls :&: Ks_ Mk != 1.
- have [_ _ cLLs tiLLs] := dprodP defNL.
- pose W := L <*> Ls; pose y := x.`_\sigma(H); pose ys := y.`_\sigma(Mi).
- have Zy: y \in Z by apply: groupX; case/setDP: Tx; case/setD1P=> _ ->.
- have{hallL} [hallL hallLs]: \sigma(H)^'.-Hall(W) L /\ \sigma(H).-Hall(W) Ls.
- apply: coprime_mulGp_Hall; first by rewrite /= cent_joinEr.
- exact: sub_pgroup (@kappa_sigma' H) (pHall_pgroup hallL).
- exact: pgroupS (subsetIl _ _) (pcore_pgroup _ _).
- have [nsLW nsLsW]: L <| W /\ Ls <| W := cprod_normal2 (cprodEY cLLs).
- have{Sx} [Ls_y nty]: y \in Ls /\ y != 1.
- move: Sx; rewrite 2!inE negb_or -andbA -/W; case/and3P=> notLx _ Wx.
- split; first by rewrite (mem_normal_Hall hallLs) ?p_elt_constt ?groupX.
- by rewrite (sameP eqP constt1P) -(mem_normal_Hall hallL).
- have [[hallKi hallKis] [nsKi nsKis]] := (hallK_Z _ MXi, nsK_Z _ MXi).
- have [/constt1P sM'y | ntys] := altP (ys =P 1).
- exists Mj; rewrite // defKjs.
- by apply/trivgPn; exists y; rewrite // inE Ls_y (mem_normal_Hall hallKi).
- exists Mi => //; apply/trivgPn; exists ys; rewrite // inE groupX //=.
- by rewrite (mem_normal_Hall hallKis) ?p_elt_constt // groupX.
-suffices ->: H = Mk.
- by move: MXk; rewrite /MX defMNX => /set2P[]->; rewrite inE orbit_refl ?orbT.
-move: ntLsMks; rewrite -rank_gt0 => /rank_geP[Y E1Y].
-have:= E1Y; rewrite nElemI => /setIP[E1LsY _].
-apply: set1_inj; rewrite -(uniqH _ E1LsY).
-have [PmaxMk hallKk] := PmaxMX _ MXk.
-have [_ _ [_ -> //]] := Ptype_structure PmaxMk hallKk.
-by rewrite /= setIC nElemI in E1Y; case/setIP: E1Y.
-Qed.
-
-End PTypeEmbedding.
-
-(* This is the first part of B & G, Corollary 14.8. *)
-Corollary P1type_trans : {in 'M_'P1 &, forall M H, gval H \in M :^: G}.
-Proof.
-move=> M H P1maxM P1maxH; have [PmaxM _] := setIdP P1maxM.
-have [[maxM _] [PmaxH _]] := (setDP PmaxM, setIdP P1maxH).
-have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
-have [Mstar _ [_ _ _ _ [_ [|]]]] := Ptype_embedding PmaxM hallK.
- by case; rewrite inE P1maxM.
-case=> /setDP[_ /negP notP1maxMstar] _.
-case/(_ H PmaxH)/setUP=> // /imsetP[a _ /group_inj defH].
-by rewrite defH P1typeJ in P1maxH.
-Qed.
-
-(* This is the second part of B & G, Corollary 14.8. *)
-Corollary Ptype_trans : {in 'M_'P, forall M,
- exists2 Mstar, Mstar \in 'M_'P /\ gval Mstar \notin M :^: G
- & {in 'M_'P, forall H, gval H \in M :^: G :|: Mstar :^: G}}.
-Proof.
-move=> M PmaxM; have [maxM _] := setDP PmaxM.
-have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
-have [Mstar PmaxMstar [_ _ _ _ [_ _ inMMs _]]] := Ptype_embedding PmaxM hallK.
-by exists Mstar.
-Qed.
-
-(* This is B & G, Corollary 14.9. *)
-Corollary mFT_partition :
- let Pcover := [set class_support M^~~ G | M : {group gT} in 'M] in
- [/\ (*1*) 'M_'P == set0 :> {set {group gT}} -> partition Pcover G^#
- & (*2*) forall M K, M \in 'M_'P -> \kappa(M).-Hall(M) K ->
- let Ks := 'C_(M `_\sigma)(K) in let Z := K <*> Ks in
- let Zhat := Z :\: (K :|: Ks) in
- let ClZhat := class_support Zhat G in
- partition (ClZhat |: Pcover) G^# /\ ClZhat \notin Pcover].
-Proof.
-move=> Pcover; have notPcover0: set0 \notin Pcover.
- apply/imsetP=> [[M maxM]]; apply/eqP; rewrite eq_sym; apply/set0Pn.
- have [x Ms_x ntx] := trivgPn _ (Msigma_neq1 maxM); exists x.
- rewrite class_supportEl; apply/bigcupP; exists x; last exact: class_refl.
- by apply/bigcupP; exists x; [apply/setD1P | apply: lcoset_refl].
-have tiPcover: trivIset Pcover.
- apply/trivIsetP=> _ _ /imsetP[M maxM ->] /imsetP[H maxH ->] notMGH.
- rewrite -setI_eq0 !{1}class_supportEr big_distrr big1 //= => a Ga.
- rewrite big_distrl big1 //= => b Gb; apply/eqP.
- rewrite -!{1}sigma_supportJ setI_eq0 sigma_support_disjoint ?mmaxJ //.
- apply: contra notMGH; rewrite {a Ga}(orbit_transl _ (mem_orbit _ _ Ga)).
- rewrite {b Gb}(orbit_eqP (mem_orbit _ _ Gb))=> /imsetP[c Gc ->] /=.
- by rewrite sigma_supportJ class_supportGidl.
-have ntPcover: cover Pcover \subset G^#.
- apply/bigcupsP=> _ /imsetP[M maxM ->]; rewrite class_supportEr.
- apply/bigcupsP=> a _; rewrite subsetD1 subsetT mem_conjg conj1g {a}//=.
- move/ell_sigma0P: (@erefl gT 1); rewrite cards_eq0; apply: contraL.
- case/bigcupP=> x Ms_x xR1; apply/set0Pn; exists x.
- exact: mem_sigma_cover_decomposition (Msigma_ell1 maxM Ms_x) xR1.
-split=> [MP0 | M K PmaxM hallK Ks Z Zhat ClZhat].
- rewrite /partition eqEsubset ntPcover tiPcover notPcover0 !andbT /=.
- apply/subsetP=> x; rewrite !inE andbT => ntx.
- have:= sigma_decomposition_dichotomy ntx.
- have [[y ell1y yRx] _ | _] := exists_inP.
- have [nty /set0Pn[M /setIdP[maxM Ms_y]]] := ell_sigma1P _ ell1y.
- apply/bigcupP; exists (class_support M^~~ G); first exact: mem_imset.
- rewrite -(conjg1 x) mem_imset2 ?inE //.
- apply/bigcupP; exists y; last by rewrite mem_lcoset.
- by rewrite !inE nty -cycle_subG.
- case/exists_inP=> y _; move: (_ * x) => y' /existsP[M].
- case/and3P => /setIdP[maxM _] /setD1P[nty' /setIP[My' _]] kMy' {y}.
- case/set0Pn: MP0; exists M; rewrite 2!inE maxM andbT.
- apply: contra nty' => kM'M; rewrite -order_eq1 (pnat_1 kMy') //.
- exact: mem_p_elt kM'M My'.
-have [_ [defNK _] [ntKs _] _ _] := Ptype_structure PmaxM hallK.
-have [Mst [PmaxMst _] [_ [hallKst _] [defK _]]] := Ptype_embedding PmaxM hallK.
-rewrite -/Ks -/Z -/Zhat in ntKs hallKst * => _ [_ _ conjMMst _].
-have [_ _ [ntK _] _ _] := Ptype_structure PmaxMst hallKst.
-have [maxM _] := setDP PmaxM; rewrite defK in ntK.
-have [|//|tiZPcover notPcovZ]: _ /\ ClZhat \notin _ := trivIsetU1 _ tiPcover _.
- move=> HcovG; case/imsetP=> H maxH ->{HcovG}.
- rewrite -setI_eq0 /ClZhat !class_supportEr big_distrr big1 //= => a _.
- rewrite big_distrl big1 //= => b _; apply/eqP; rewrite -cards_eq0.
- rewrite -(cardJg _ b^-1) conjIg conjsgK -conjsgM -sigma_supportJ cards_eq0.
- wlog ->: a b H maxH / H :^ (a * b^-1) = H.
- by move/(_ a a (H :^ (a * b^-1))%G); rewrite mmaxJ mulgV act1 => ->.
- rewrite setIC big_distrl big1 //= => y Hs_y; apply/setP=> x; rewrite in_set0.
- rewrite 3!inE mem_lcoset negb_or -andbA; apply/and4P=> [[yRx notKx notKs_x]].
- rewrite /Z cent_joinEr ?subsetIr //; case/mulsgP=> z z' Kz Ks_z' defx.
- have:= sigma_decomposition_dichotomy (group1_contra notKx).
- rewrite (introT exists_inP) /=; last first.
- by exists y; rewrite // (Msigma_ell1 maxH).
- have [Ms_z' cKz'] := setIP Ks_z'; case/exists_inP; exists z'.
- rewrite (Msigma_ell1 maxM) ?inE // Ms_z' andbT.
- by apply: contraNneq notKx => z'1; rewrite defx z'1 mulg1.
- apply/existsP; exists M; rewrite inE maxM cycle_subG Ms_z'.
- rewrite defx -(centP cKz') // mulKg (mem_p_elt (pHall_pgroup hallK)) //=.
- rewrite 3!inE (subsetP (pHall_sub hallK)) //= cent1C !andbT.
- rewrite andbC cent1C (subsetP _ _ Kz) ?sub_cent1 //=.
- by apply: contraNneq notKs_x => z1; rewrite defx z1 mul1g.
-split=> //; rewrite /partition eqEsubset 2!inE {}tiZPcover negb_or notPcover0.
-rewrite /cover big_setU1 {notPcovZ}//= subUset ntPcover subsetD1 subsetT.
-rewrite {}/ClZhat {}/Zhat !andbT /= andbC; apply/and3P; split.
-- have [[y Ks_y nty] [y' Ky' nty']] := (trivgPn _ ntKs, trivgPn _ ntK).
- rewrite eq_sym; apply/set0Pn; exists ((y' * y) ^ 1).
- apply: mem_imset2; rewrite 2?inE // groupMl // groupMr // -/Ks negb_or.
- have [_ _ _ tiKKs] := dprodP defNK.
- rewrite -[Z]genM_join ?mem_gen ?mem_mulg //= andbT; apply/andP; split.
- by apply: contra nty => Ky; rewrite -in_set1 -set1gE -tiKKs inE Ky.
- by apply: contra nty' => Ks_y'; rewrite -in_set1 -set1gE -tiKKs inE Ky'.
-- rewrite class_supportEr; apply/bigcupP=> [[a _]].
- by rewrite mem_conjg conj1g 2!inE !group1.
-apply/subsetP=> x; case/setD1P=> ntx _; apply/setUP.
-case: exists_inP (sigma_decomposition_dichotomy ntx) => [[y ell1y yRx] _ | _].
- have [nty] := ell_sigma1P _ ell1y; case/set0Pn=> H; case/setIdP=> maxH Hs_y.
- right; apply/bigcupP; exists (class_support H^~~ G); first exact: mem_imset.
- rewrite -[x]conjg1 mem_imset2 ?inE //; apply/bigcupP.
- by exists y; rewrite ?mem_lcoset // !inE nty -cycle_subG.
-case/exists_inP=> y ell1y /existsP[H]; set y' := y^-1 * x.
-case/and3P=> /setIdP[maxH Hs_y] /setD1P[nty' /setIP[Hy' cyy']] kHy'.
-rewrite {ntK ntKs maxM defNK}/Z /Ks; left.
-wlog{Ks Mst PmaxMst hallKst conjMMst defK maxH} defH: M K PmaxM hallK / H :=: M.
- move=> IH; have PmaxH: H \in 'M_'P.
- apply/PtypeP; split=> //; exists (pdiv #[y']).
- by rewrite (pnatPpi kHy') // pi_pdiv order_gt1.
- have [|] := setUP (conjMMst H PmaxH); case/imsetP=> a Ga defH.
- have:= IH _ (K :^ a)%G _ _ defH.
- rewrite (eq_pHall _ _ (kappaJ _ _)) pHallJ2 PtypeJ MsigmaJ centJ.
- by rewrite -conjIg -conjUg -conjYg -conjDg class_supportGidl //; apply.
- have:= IH _ [group of Ks :^ a] _ _ defH.
- rewrite (eq_pHall _ _ (kappaJ _ _)) pHallJ2 PtypeJ MsigmaJ centJ.
- rewrite -conjIg -conjUg -conjYg -conjDg setUC joingC defK.
- by rewrite class_supportGidl //; apply.
-have /andP[sMsM nMsM]: M`_\sigma <| M := pcore_normal _ M.
-have{Hs_y} Ms_y: y \in M`_\sigma by rewrite -defH -cycle_subG.
-wlog{H defH Hy' kHy'} Ky': K hallK / y' \in K.
- have [maxM _] := setDP PmaxM; rewrite -cycle_subG defH in Hy' kHy'.
- have [a Ma Ka_y'] := Hall_subJ (mmax_sol maxM) hallK Hy' kHy'.
- move/(_ (K :^ a)%G); rewrite pHallJ // -cycle_subG.
- rewrite -{1 2}(normsP nMsM a Ma) centJ -conjIg -conjYg -conjUg -conjDg.
- by rewrite class_supportGidl ?inE //; apply.
-rewrite -[x]conjg1 mem_imset2 ?group1 //.
-have [Mst _ [_ _ _ [cycZ _ defZ _ _] _]] := Ptype_embedding PmaxM hallK.
-rewrite -(mulKVg y x) -/y' 2!inE negb_or andbC.
-do [set Ks := 'C_(_)(K); set Z := K <*> _] in cycZ defZ *.
-have Ks_y: y \in Ks.
- have cKZ := sub_abelian_cent (cyclic_abelian cycZ) (joing_subl K Ks).
- rewrite inE Ms_y (subsetP cKZ) // -(defZ y'); last by rewrite !inE nty'.
- by rewrite inE cent1C (subsetP sMsM).
-have [_ [defNK _] _ _ _] := Ptype_structure PmaxM hallK.
-have{defNK} [_ _ cKKs tiKKs] := dprodP defNK.
-rewrite [Z]joingC cent_joinEl // mem_mulg // groupMr // groupMl //= -/Ks.
-apply/andP; split.
- have [nty _] := ell_sigma1P _ ell1y.
- by apply: contra nty => Ky; rewrite -in_set1 -set1gE -tiKKs inE Ky.
-by apply: contra nty' => Ks_y'; rewrite -in_set1 -set1gE -tiKKs inE Ky'.
-Qed.
-
-(* This is B & G, Corollary 14.10. *)
-Corollary ell_sigma_leq_2 x : \ell_\sigma(x) <= 2.
-Proof.
-have [/ell_sigma0P/eqP-> // | ntx] := eqVneq x 1.
-case sigma_x: (x \in cover [set class_support M^~~ G | M : {group gT} in 'M]).
- case/bigcupP: sigma_x => _ /imsetP[M maxM ->].
- case/imset2P=> x0 a /bigcupP[y Ms_y yRx0] _ ->; rewrite ell_sigmaJ.
- exact: ell_sigma_cover (Msigma_ell1 maxM Ms_y) yRx0.
-have G1x: x \in G^# by rewrite !inE andbT.
-have [FpartG1 PpartG1] := mFT_partition.
-have [/eqP/FpartG1 partG1 | [M PmaxM]] := set_0Vmem ('M_'P : {set {group gT}}).
- by rewrite -(cover_partition partG1) sigma_x in G1x.
-have [maxM _] := setDP PmaxM.
-have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
-have{PpartG1} [/cover_partition defG1 notZsigma] := PpartG1 M K PmaxM hallK.
-rewrite -{}defG1 /cover big_setU1 {notZsigma}// inE {}sigma_x orbF in G1x.
-case/imset2P: G1x => x0 a /setDP[].
-have [Mst [PmaxMst _] [_ _ [defK _] _ _]] := Ptype_embedding PmaxM hallK.
-rewrite cent_joinEr ?subsetIr // => /mulsgP[y' y Ky' /= Ks_y ->].
-rewrite inE; have [-> | nty] := eqVneq y 1; first by rewrite mulg1 Ky'.
-have [-> | nty' _ _ ->] := eqVneq y' 1; first by rewrite mul1g Ks_y orbT.
-have [Ms_y cKy] := setIP Ks_y; set Ks := 'C_(_)(_) in Ks_y defK.
-have Msts_y': y' \in Mst`_\sigma by move: Ky'; rewrite -defK => /setIP[].
-have kMy': \kappa(M).-elt y' := mem_p_elt (pHall_pgroup hallK) Ky'.
-have{kMy'} sM'y': \sigma(M)^'.-elt y' := sub_pgroup (@kappa_sigma' _) kMy'.
-rewrite ell_sigmaJ /sigma_length (cardsD1 (y' * y).`_\sigma(M)).
-rewrite (leq_add (leq_b1 _)) // -sigma_decomposition_constt' //.
-rewrite consttM /commute ?(centP cKy) // constt_p_elt //.
-rewrite (constt1P _) ?p_eltNK ?(mem_p_elt (pcore_pgroup _ _) Ms_y) // mulg1.
-have [maxMst _] := setDP PmaxMst; rewrite leq_eqVlt (Msigma_ell1 maxMst) //.
-by rewrite !inE nty' Msts_y'.
-Qed.
-
-(* This is B & G, Lemma 14.11. *)
-Lemma primes_non_Fitting_Ftype M E q Q :
- M \in 'M_'F -> \sigma(M)^'.-Hall(M) E ->
- Q \in 'E_q^1(E) -> ~~ (Q \subset 'F(E)) ->
- exists2 Mstar, Mstar \in 'M &
- [\/ (*1*) q \in \tau2(Mstar) /\ 'M('C(Q)) = [set Mstar]
- | (*2*) q \in \kappa(Mstar) /\ Mstar \in 'M_'P1 ].
-Proof.
-move=> FmaxM hallE EqQ notsFE_Q; have [maxM k'M] := FtypeP _ FmaxM.
-have [sQE abelQ dimQ] := pnElemP EqQ; have [qQ _] := andP abelQ.
-have [q_pr oQ] := (pnElem_prime EqQ, card_pnElem EqQ : #|Q| = q).
-have t1Mq: q \in \tau1(M).
- have: q \in \pi(E) by rewrite -p_rank_gt0; apply/p_rank_geP; exists Q.
- rewrite (partition_pi_sigma_compl maxM hallE) => /or3P[// | t2q | t3q].
- have [A EqA _] := ex_tau2Elem hallE t2q.
- have [[nsAE defA1] _ _ _] := tau2_compl_context maxM hallE t2q EqA.
- have sQA: Q \subset A by move: EqQ; rewrite defA1 => /pnElemP[].
- rewrite (subset_trans sQA) ?Fitting_max // ?abelian_nil // in notsFE_Q.
- by have [_ abelA _] := pnElemP EqA; apply: abelem_abelian abelA.
- have [[E1 hallE1] [E3 hallE3]] := ex_tau13_compl hallE.
- have [E2 _ complEi] := ex_tau2_compl hallE hallE1 hallE3.
- have [[_ nsE3E] _ [_ cycE3] _ _] := sigma_compl_context maxM complEi.
- have sQE3: Q \subset E3 by rewrite (sub_normal_Hall hallE3) ?(pi_pgroup qQ).
- rewrite (subset_trans sQE3) ?Fitting_max ?abelian_nil // in notsFE_Q.
- exact: cyclic_abelian cycE3.
-have q'FE: q^'.-group 'F(E).
- have [R sylR sQR] := Sylow_superset sQE qQ; have [sRE qR _] := and3P sylR.
- have cycR: cyclic R.
- rewrite (odd_pgroup_rank1_cyclic qR) ?mFT_odd // (p_rank_Sylow sylR) //.
- by move: t1Mq; rewrite (tau1E maxM hallE) eqn_leq; case/and4P.
- rewrite -partG_eq1 -(card_Hall (Hall_setI_normal (Fitting_normal E) sylR)).
- have sRFER: R :&: 'F(E) \subset R := subsetIl _ _.
- apply: contraR notsFE_Q; rewrite -trivg_card1 => ntRFE.
- rewrite (subset_trans _ (subsetIr R _)) // -(cardSg_cyclic cycR) // oQ.
- by have [] := pgroup_pdiv (pgroupS sRFER qR) ntRFE.
-have cE'E': abelian E^`(1) := der_mmax_compl_abelian maxM hallE.
-pose K := [~: E, Q]; have cKK: abelian K by rewrite (abelianS (commgS E sQE)).
-have nsKE: K <| E by rewrite /normal commg_norml comm_subG.
-have q'K: q^'.-group K by rewrite (pgroupS _ q'FE) // Fitting_max ?abelian_nil.
-have [sKE nKE] := andP nsKE; have nKQ := subset_trans sQE nKE.
-have defKQ: [~: K, Q] = K.
- have nsKQ_E: K <*> Q <| E.
- rewrite -(quotientGK nsKE) -(quotientYK nKQ) cosetpre_normal /= -/K.
- by rewrite /normal quotientS // cents_norm // quotient_cents2r.
- have [_ sylQ] := coprime_mulGp_Hall (esym (norm_joinEr nKQ)) q'K qQ.
- have defE: K * 'N_E(Q) = E.
- rewrite -{2}(Frattini_arg nsKQ_E sylQ) /= norm_joinEr //= -/K -mulgA.
- by congr (K * _); rewrite mulSGid // subsetI sQE normG.
- have cQ_NEQ: [~: 'N_E(Q), Q] = 1.
- apply/trivgP; rewrite -(coprime_TIg (pnat_coprime qQ q'K)) subsetI.
- by rewrite commg_subr subsetIr commSg ?subsetIl.
- by rewrite {2}/K -defE commMG ?cQ_NEQ ?mulg1 1?normsR ?subsetIr ?subIset ?nKE.
-have [sEM s'E _] := and3P hallE; have sQM := subset_trans sQE sEM.
-have [sKM s'K] := (subset_trans sKE sEM, pgroupS sKE s'E).
-have regQ: 'C_(M`_\sigma)(Q) = 1.
- apply/eqP; apply: contraFT (k'M q) => nregQ.
- have EqQ_M: Q \in 'E_q^1(M) by apply/pnElemP.
- by rewrite unlock 3!inE /= t1Mq; apply/exists_inP; exists Q.
-have nsKM: K <| M.
- have [s'q _] := andP t1Mq.
- have EqQ_NK: Q \in 'E_q^1('N_M(K)) by apply/pnElemP; rewrite subsetI sQM.
- have:= commG_sigma'_1Elem_cyclic maxM sKM s'K s'q EqQ_NK regQ q'K cKK.
- by rewrite defKQ; case.
-have ntK: K != 1.
- apply: contraNneq notsFE_Q => /commG1P cQE.
- by rewrite Fitting_max ?(pgroup_nil qQ) // /normal sQE cents_norm.
-pose p := pdiv #|K|; have p_pr: prime p by rewrite pdiv_prime ?cardG_gt1.
-have piKp: p \in \pi(K) by rewrite pi_pdiv cardG_gt1.
-have t2Mp: p \in \tau2(M).
- have s'p := pnatPpi s'K piKp.
- have sylKp: p.-Sylow(K) 'O_p(K) := nilpotent_pcore_Hall p (abelian_nil cKK).
- have ntKp: 'O_p(K) != 1 by rewrite -rank_gt0 (rank_Sylow sylKp) p_rank_gt0.
- rewrite inE /= s'p ?(sigma'_norm_mmax_rank2 maxM s'p (pHall_pgroup sylKp)) //.
- by rewrite (mmax_normal maxM) ?gFnormal_trans.
-have [A EpA _] := ex_tau2Elem hallE t2Mp.
-have [sAE /andP[pA _] dimA] := pnElemP EpA.
-have [[nsAE _] _ _ _] := tau2_compl_context maxM hallE t2Mp EpA.
-have nAQ := subset_trans sQE (normal_norm nsAE).
-have [S sylS sAS]:= Sylow_superset (subsetT A) pA.
-have not_cSS: ~~ abelian S.
- apply: contra notsFE_Q => cSS; rewrite Fitting_max ?(pgroup_nil qQ) //.
- have solE := sigma_compl_sol hallE.
- have [E1 hallE1 sQE1] := Hall_superset solE sQE (pi_pgroup qQ t1Mq).
- have [_ [E3 hallE3]] := ex_tau13_compl hallE.
- have [E2 _ complEi] := ex_tau2_compl hallE hallE1 hallE3.
- have [_ _ _ sQZ] := abelian_tau2 maxM complEi t2Mp EpA sylS sAS cSS.
- by rewrite sub_center_normal ?{}sQZ //; apply/nElemP; exists q; apply/pnElemP.
-have [] := nonabelian_tau2 maxM hallE t2Mp EpA (pHall_pgroup sylS) not_cSS.
-set A0 := 'C_A(M`_\sigma)%G => _ [oA0 defFM] _ _.
-have defA0: A0 :=: K.
- have sA0E: A0 \subset E by rewrite subIset ?sAE.
- have sKA0: K \subset A0.
- have [_ _ _ tiMsE] := sdprodP (sdprod_sigma maxM hallE).
- rewrite -(mul1g A0) -tiMsE setIC group_modr // subsetI sKE.
- by have [_ -> _ _] := dprodP defFM; rewrite Fitting_max ?abelian_nil.
- by apply/eqP; rewrite eqEsubset prime_meetG ?(setIidPr sKA0) ?oA0.
-have ntA: A :!=: 1 := nt_pnElem EpA isT.
-have [H maxNH] := mmax_exists (mFT_norm_proper ntA (mFT_pgroup_proper pA)).
-have [maxH sNH] := setIdP maxNH; have sQH := subset_trans nAQ sNH.
-exists H => //.
-have: p \in [predD \sigma(H) & \beta(H)] /\ q \in [predU \tau1(H) & \tau2(H)].
- have [-> // piAb _] := primes_norm_tau2Elem maxM hallE t2Mp EpA maxNH.
- rewrite (pnatPpi piAb) // (piSg (quotientS _ sQE)) //=.
- have piQq: q \in \pi(Q) by rewrite -p_rank_gt0 p_rank_abelem ?dimQ.
- rewrite /= card_quotient ?normsI ?norms_cent // ?normsG //.
- rewrite -indexgI setIA (setIidPl sQE) prime_TIg ?indexg1 // ?oQ //.
- rewrite (sameP commG1P eqP) (subG1_contra _ ntK) //= -/K -defKQ commGC.
- by rewrite -defA0 commgS ?subsetIl.
-case=> /andP[/= b'Hp sHP] t12Hq.
-have nregQHs: 'C_(H`_\sigma)(Q) != 1.
- apply: subG1_contra (setSI _ _) (_ : 'C_A(Q) != 1).
- rewrite (sub_Hall_pcore (Msigma_Hall maxH)) ?(pi_pgroup pA) //.
- exact: subset_trans (normG A) sNH.
- apply: contraTneq (leqnn 1) => regQA; rewrite -ltnNge -dimA.
- rewrite -(leq_exp2l _ _ (prime_gt1 p_pr)) -card_pgroup // -oA0 defA0.
- have coAQ := pnat_coprime (pi_pnat pA t2Mp) (pi_pnat qQ (tau2'1 t1Mq)).
- rewrite subset_leq_card // -(coprime_cent_prod nAQ) ?(pgroup_sol pA) //.
- by rewrite regQA mulg1 commSg.
-have{t12Hq} [/= t1Hq | /= t2Hq] := orP t12Hq.
- have EqQ_H: Q \in 'E_q^1(H) by apply/pnElemP.
- have kHq: q \in \kappa(H).
- by rewrite unlock 3!inE /= t1Hq; apply/exists_inP; exists Q.
- right; split=> //; apply: contraR b'Hp => notP1maxH.
- have PmaxH: H \in 'M_'P by apply/PtypeP; split=> //; exists q.
- have [L hallL] := Hall_exists \kappa(H) (mmax_sol maxH).
- by have [_ _ _ _ [|<- //]] := Ptype_structure PmaxH hallL; apply/setDP.
-left; split=> //.
-have [x defQ]: exists x, Q :=: <[x]> by apply/cyclicP; rewrite prime_cyclic ?oQ.
-rewrite defQ cent_cycle in nregQHs *; rewrite (cent1_nreg_sigma_uniq maxH) //.
- by rewrite 2!inE -cycle_eq1 -cycle_subG -defQ (nt_pnElem EqQ).
-by rewrite /p_elt /order -defQ oQ pnatE.
-Qed.
-
-(* This is B & G, Lemma 14.12. *)
-(* Note that the assumption M \in 'M_'P2 could be weakened to M \in 'M_'P, *)
-(* since the assumption H \in 'M('N(R)) implies H != 1, and hence U != 1. *)
-Lemma P2type_signalizer M Mstar U K r R H :
- M \in 'M_'P2 -> kappa_complement M U K -> Mstar \in 'M('C(K)) ->
- r.-Sylow(U) R -> H \in 'M('N(R)) ->
- [/\ H \in 'M_'F, U \subset H`_\sigma, U <*> K = M :&: H
- & [/\ ~~ ('N_H(U) \subset M), K \subset 'F(H :&: Mstar)
- & \sigma(H)^'.-Hall(H) (H :&: Mstar)]].
-Proof.
-move=> P2maxM complU maxCMstar sylR maxNH; have [hallU hallK _] := complU.
-have [PmaxM notP1maxM] := setDP P2maxM; have [maxM notFmaxM] := setDP PmaxM.
-have [[sUM sk'M_U _] [sKM kK _]] := (and3P hallU, and3P hallK).
-have{notFmaxM} ntK: K :!=: 1 by rewrite (trivg_kappa maxM).
-have [hallE defM _ regK /(_ ntK)cUU] := kappa_compl_context maxM complU.
-case/sdprodP: defM => [[_ E _ defE] _ _ _].
-have [nsUE sKE mulUK nUK tiUK] := sdprod_context defE.
-rewrite (norm_joinEr nUK) mulUK in hallE *.
-have [Mst [PmaxMst notMGMst] [uniqMst []]] := Ptype_embedding PmaxM hallK.
-set Ks := 'C_(_)(K) => hallKs; case/and3P=> sKsMst sM_Ks _ [defK _].
-case=> cycZ ziMMst _ _ _ [_ _ defPmax _].
-have [_ [defNK _] [ntKs _] _ [//|_ q_pr _ _]] := Ptype_structure PmaxM hallK.
-set q := #|K| in q_pr.
-have{uniqMst} uniqMst: 'M('C(K)) = [set Mst].
- by apply: uniqMst; apply/nElemP; exists q; rewrite p1ElemE // !inE subxx /=.
-have{maxCMstar} ->: Mstar = Mst by [apply/set1P; rewrite -uniqMst] => {Mstar}.
-have [maxH sNRH] := setIdP maxNH.
-have ntR: R :!=: 1.
- by apply: contraTneq sNRH => ->; rewrite norm1 proper_subn ?mmax_proper.
-have piUr: r \in \pi(U) by rewrite -p_rank_gt0 -(rank_Sylow sylR) rank_gt0.
-have r_pr: prime r by move: piUr; rewrite mem_primes; case/andP.
-have sylR_M := subHall_Sylow hallU (pnatPpi sk'M_U piUr) sylR.
-have [/= s'Mr k'Mr] := norP (pnatPpi sk'M_U piUr).
-have [sRH [sRM rR _]] := (subset_trans (normG R) sNRH, and3P sylR_M).
-have notMGH: gval H \notin M :^: G.
- apply: contra s'Mr; case/imsetP=> a _ defH.
- rewrite -(sigmaJ _ a) -defH; apply/exists_inP; exists R => //.
- by rewrite pHallE sRH /= (card_Hall sylR_M) defH cardJg.
-have sK_uniqMst a: K \subset Mst :^ a -> a \in Mst.
- move=> sKMa; apply: contraR ntK; rewrite -in_setC => Mst'a.
- have [_ _ _ [[tiK_MstG _] _ _] _] := Ptype_structure PmaxMst hallKs.
- by rewrite -(tiK_MstG a) // defK (setIidPl sKMa).
-have [_ _] := dprodP defNK; rewrite -/Ks => cKKs tiKKs.
-have snK_sMst L: K <|<| L -> L \subset Mst.
- elim: {L}_.+1 {-2}L (ltnSn #|L|) => // n IHn A leAn.
- case/subnormalEr=> [<- | [L [snKL nsLA ltLA]]].
- by rewrite -defK subIset // pcore_sub.
- have [sKL sLMst]: K \subset L /\ L \subset Mst.
- by rewrite subnormal_sub // IHn // (leq_trans (proper_card ltLA)).
- apply/subsetP=> a Aa; rewrite -groupV sK_uniqMst // (subset_trans sKL) //.
- by rewrite -sub_conjg (normsP (normal_norm nsLA)).
-have sEH: E \subset H.
- have defR: R :=: 'O_r(U) := nilpotent_Hall_pcore (abelian_nil cUU) sylR.
- by apply: subset_trans sNRH; rewrite defR gFnorm_trans ?normal_norm.
-have [sUH sKH]: U \subset H /\ K \subset H by apply/mulGsubP; rewrite mulUK.
-have notMstGH: gval H \notin Mst :^: G.
- apply: contra ntR => /imsetP[a _ defH].
- have{a defH} defH: H :=: Mst by rewrite -(conjGid (sK_uniqMst a _)) -?defH.
- rewrite -(setIidPl sRH) -(setIidPl sRM) -setIA defH ziMMst coprime_TIg //=.
- rewrite cent_joinEr // TI_cardMg //= coprime_mulr -/Ks.
- rewrite (p'nat_coprime (pi_pnat rR _) kK) //=.
- exact: p'nat_coprime (pi_pnat rR _) sM_Ks.
-have FmaxH: H \in 'M_'F.
- suffices: H \notin 'M_'P by rewrite inE maxH andbT negbK.
- by apply: (contra (defPmax H)); rewrite inE; apply/norP.
-have sKMsts: K \subset Mst`_\sigma by rewrite -defK subsetIl.
-have s'H_K: \sigma(H)^'.-group K.
- apply/pgroupP=> p p_pr p_dv_K; have [maxMst _] := setDP PmaxMst.
- apply: contraFN (sigma_partition maxMst maxH notMstGH p) => /= sHp.
- by rewrite inE /= (pgroupP (pgroupS sKMsts _)) ?pcore_pgroup.
-have [D hallD sKD] := Hall_superset (mmax_sol maxH) sKH s'H_K.
-have piKq: q \in \pi(K) by rewrite pi_of_prime ?inE.
-have sK_FD: K \subset 'F(D).
- have EqK: K \in 'E_q^1(D) by rewrite p1ElemE // !inE sKD /=.
- have sMst_q: q \in \sigma(Mst).
- by rewrite (pnatPpi (pcore_pgroup _ _) (piSg sKMsts _)).
- apply: contraR notP1maxM => not_sKFD.
- have [L _ ] := primes_non_Fitting_Ftype FmaxH hallD EqK not_sKFD.
- case=> [[t2Lq ]|[kLq P1maxL]].
- rewrite uniqMst => /set1_inj defL.
- by rewrite -defL 3!inE sMst_q in t2Lq.
- have [PmaxL _] := setIdP P1maxL.
- case/setUP: (defPmax L PmaxL) => /imsetP[a _ defL].
- by rewrite (group_inj defL) P1typeJ in P1maxL.
- move: kLq; rewrite defL kappaJ unlock 3!inE /=.
- by rewrite -andb_orr inE /= sMst_q.
-have sDMst: D \subset Mst.
- apply: snK_sMst (subnormal_trans _ (normal_subnormal (Fitting_normal D))).
- exact: nilpotent_subnormal (Fitting_nil D) sK_FD.
-have defUK: [~: U, K] = U.
- rewrite -{2}(coprime_cent_prod nUK) ?abelian_sol //; last first.
- by apply: p'nat_coprime (sub_pgroup _ sk'M_U) kK => ? /norP[].
- by rewrite (cent_semiregular regK) ?mulg1.
-have qK: q.-group K := pnat_id q_pr.
-have sUHs: U \subset H`_\sigma.
- have [nsHsH _ mulHsD nHsD _] := sdprod_context (sdprod_sigma maxH hallD).
- have nHsDq: 'O_q(D) \subset 'N(H`_\sigma) by apply: gFsub_trans.
- pose HsDq := H`_\sigma <*> 'O_q(D).
- have defHsDq: H`_\sigma * 'O_q(D) = HsDq by rewrite -norm_joinEr.
- have hallHs_HsDq: q^'.-Hall(HsDq) H`_\sigma.
- have [|//] := coprime_mulGp_Hall defHsDq _ (pcore_pgroup _ _).
- rewrite p'groupEpi; apply: (contra (pnatPpi (pcore_pgroup _ _))).
- exact: pnatPpi s'H_K piKq.
- have sK_HsDq: K \subset HsDq.
- rewrite sub_gen ?subsetU // orbC -p_core_Fitting.
- by rewrite (sub_Hall_pcore (nilpotent_pcore_Hall _ (Fitting_nil _))) ?qK.
- have [|sHsDq_H nHsDq_H] := andP (_ : HsDq <| H).
- rewrite -(quotientGK nsHsH) -[HsDq]quotientYK //= cosetpre_normal //.
- by rewrite -{3}mulHsD quotientMidl quotient_normal // pcore_normal.
- have sU_HsDq: U \subset HsDq.
- by rewrite -defUK (subset_trans (commgSS sUH sK_HsDq)) // commg_subr.
- rewrite (sub_normal_Hall hallHs_HsDq) ?normalYl // p'groupEpi.
- by apply: contraL (pnatPpi sk'M_U) _; rewrite !inE /= orbC (pnatPpi kK).
-have defNMU: 'N_M(U) = E.
- have [_ mulHsE nHsE _] := sdprodP (sdprod_sigma maxM hallE).
- have [sUE nUE] := andP nsUE; rewrite -mulHsE -normC // -group_modl //=.
- rewrite coprime_norm_cent ?(subset_trans sUE) //; last first.
- exact: coprimegS sUE (coprime_sigma_compl hallE).
- have sR1U: 'Ohm_1(R) \subset U := gFsub_trans _ (pHall_sub sylR).
- rewrite (trivgP (subset_trans (setIS _ (centS sR1U)) _)) ?mulg1 //.
- have [|_ _ -> //] := sigma'_kappa'_facts maxM sylR_M.
- by rewrite s'Mr (piSg sUM).
-have sHsFH: H`_\sigma \subset 'F(H).
- rewrite Fitting_max ?pcore_normal //.
- have [S] := Sylow_exists q H; case/sigma'_kappa'_facts=> {S}//.
- have [_ k'H] := setIdP FmaxH.
- rewrite [~~ _](pnatPpi (pHall_pgroup hallD) (piSg sKD _)) //=.
- by rewrite [~~ _](pnatPpi k'H) (piSg sKH).
-suffices ->: H :&: Mst = D.
- set sk' := _^' in sk'M_U hallU; pose Fu := 'O_sk'('F(H)).
- have [sUFH nilFH] := (subset_trans sUHs sHsFH, Fitting_nil H).
- have hallFu: sk'.-Hall('F(H)) Fu := nilpotent_pcore_Hall sk' nilFH.
- have sUFu: U \subset Fu by rewrite (sub_Hall_pcore hallFu).
- have nsFuH: Fu <| H by rewrite !gFnormal_trans.
- have [[sFuFH sk'Fu _] [sFuH nFuH]] := (and3P hallFu, andP nsFuH).
- have defU: M :&: Fu = U.
- have sk'MFu: sk'.-group(M :&: Fu) := pgroupS (subsetIr M _) sk'Fu.
- by rewrite (sub_pHall hallU sk'MFu) ?subsetIl // subsetI sUM.
- do 2?split=> //.
- apply/eqP; rewrite eqEsubset subsetI (pHall_sub hallE) sEH /=.
- by rewrite -defNMU subsetI subsetIl -defU normsGI.
- apply: contra (contra_orbit _ _ notMGH) => sNHU_M.
- rewrite (eq_mmax maxH maxM (subset_trans _ sNHU_M)) // subsetIidl.
- rewrite -(nilpotent_sub_norm (nilpotentS sFuFH nilFH) sUFu) //= -/Fu.
- by rewrite -{2}defU subsetI subsetIl (subset_trans (setSI _ sFuH)).
-have [maxMst _] := setDP PmaxMst.
-have [_ <- _ _] := sdprodP (sdprod_sigma maxH hallD).
-rewrite -{2}(mul1g D) setIC -group_modr // setIC; congr (_ * _).
-apply/eqP; apply: wlog_neg => ntHsMst.
-have nregHsK: 'C_(H`_\sigma)(K) != 1.
- rewrite (subG1_contra _ ntHsMst) // subsetI subsetIl (sameP commG1P trivgP).
- have <-: H`_\sigma :&: Mst`_\sigma = 1.
- apply: card_le1_trivg; rewrite leqNgt -pi_pdiv; set p := pdiv _.
- apply: contraFN (sigma_partition maxMst maxH notMstGH p) => piIp.
- rewrite inE /= (pnatPpi (pcore_pgroup _ _) (piSg (subsetIl _ _) piIp)).
- by rewrite (pnatPpi (pcore_pgroup _ _) (piSg (subsetIr _ _) piIp)).
- rewrite commg_subI ?setIS ?gFnorm // subsetI sKMsts.
- by rewrite (subset_trans sKH) ?gFnorm.
-have t2Hq: q \in \tau2(H).
- have: q \in \pi(D) := piSg sKD piKq.
- rewrite (partition_pi_sigma_compl maxH hallD) orbCA; case/orP=> // t13Hq.
- case/FtypeP: FmaxH => _ /(_ q)/idP[]; rewrite unlock 3!inE /= t13Hq.
- by apply/exists_inP; exists K => //; rewrite p1ElemE // !inE sKH /=.
-have [A EqA_D EqA] := ex_tau2Elem hallD t2Hq.
-have [_ _ _ -> //] := tau2_context maxH t2Hq EqA.
-rewrite 3!inE -val_eqE /= eq_sym (contra_orbit _ _ notMstGH) maxMst.
-by have [sAD _ _] := pnElemP EqA_D; apply: subset_trans sAD sDMst.
-Qed.
-
-(* This is B & G, Lemma 14.13(a). *)
-(* Part (b) is not needed for the Peterfalvi revision of the character theory *)
-(* part of the proof. *)
-Lemma non_disjoint_signalizer_Frobenius x M :
- \ell_\sigma(x) == 1%N -> #|'M_\sigma[x]| > 1 ->
- M \in 'M_\sigma[x] -> ~~ (\sigma('N[x])^'.-group M) ->
- M \in 'M_'F /\ \tau2(M)^'.-group M.
-Proof.
-move=> ell1x ntR SMxM; have [maxM Ms_x] := setIdP SMxM.
-rewrite negb_and cardG_gt0 all_predC negbK => /hasP[q /= piMq sNq].
-have [Q EqQ]: exists Q, Q \in 'E_q^1(M) by apply/p_rank_geP; rewrite p_rank_gt0.
-have [ntQ [sQM abelQ dimQ]] := (nt_pnElem EqQ isT, pnElemP EqQ).
-have [[qQ _] q_pr] := (andP abelQ, pnElem_prime EqQ).
-have [_ [//| uniqN _ t2Nx _]] := FT_signalizer_context ell1x.
-case/(_ M SMxM)=> _ st2NsM spM_sbN _; have [maxN sCxN] := mem_uniq_mmax uniqN.
-have bNq: q \in \beta('N[x]) by rewrite spM_sbN //= 4!inE /= piMq.
-have bGq: q \in \beta(G) by move: bNq; rewrite -predI_sigma_beta // inE /= sNq.
-set p := pdiv #[x]; have pi_p: p \in \pi(#[x]).
- by rewrite pi_pdiv order_gt1 (sameP eqP (ell_sigma0P _)) (eqP ell1x).
-have sMp: p \in \sigma(M) := pnatPpi (pcore_pgroup _ _) (piSg Ms_x pi_p).
-have t2Np: p \in \tau2('N[x]) := pnatPpi t2Nx pi_p.
-have notMGN: gval 'N[x] \notin M :^: G.
- apply: contraL t2Np => /imsetP[a _ ->].
- by rewrite negb_and negbK /= sigmaJ sMp.
-have sM'q: q \in \sigma(M)^'.
- by apply: contraFN (sigma_partition maxM maxN notMGN q) => sMq; apply/andP.
-have [g sQNg]: exists g, Q \subset 'N[x] :^ g.
- have [Q1 sylQ1] := Sylow_exists q 'N[x].
- have [g _ sQQ1g] := Sylow_subJ (sigma_Sylow_G maxN sNq sylQ1) (subsetT Q) qQ.
- by exists g; rewrite (subset_trans sQQ1g) // conjSg (pHall_sub sylQ1).
-have EqNQ: Q \in 'E_q^1('N[x] :^ g) by apply/pnElemP.
-have uniqNg: 'M('C(Q)) = [set 'N[x] :^ g]%G.
- by case/cent_der_sigma_uniq: EqNQ; rewrite ?mmaxJ 1?betaJ ?bNq.
-have b'Mp: p \notin \beta(M).
- by rewrite -predI_sigma_beta // inE /= sMp /=; case/tau2_not_beta: t2Np.
-have{p pi_p sMp t2Np b'Mp} FmaxM: M \in 'M_'F.
- have [P1maxM | notP1maxM] := boolP (M \in 'M_'P1); last first.
- have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
- apply: contraR b'Mp => notFmaxM; have PmaxM: M \in 'M_'P by apply/setDP.
- by have [_ _ _ _ [|<- //]] := Ptype_structure PmaxM hallK; apply/setDP.
- have [PmaxM skM] := setIdP P1maxM.
- have kMq: q \in \kappa(M).
- by case/orP: (pnatPpi skM piMq) => //= sMq; case/negP: sM'q.
- have [K hallK sQK] := Hall_superset (mmax_sol maxM) sQM (pi_pnat qQ kMq).
- have EqKQ: Q \in 'E_q^1(K) by apply/pnElemP.
- have [L _ [uniqL [kLhallKs sMhallKs] _ _ _]] := Ptype_embedding PmaxM hallK.
- set Ks := 'C_(_)(K) in kLhallKs sMhallKs.
- have{uniqL} defL: 'N[x] :^ g = L.
- apply: congr_group; apply: set1_inj; rewrite -uniqNg uniqL //.
- by apply/nElemP; exists q.
- have rpL: 'r_p(L) = 2.
- by apply/eqP; case/andP: t2Np => _; rewrite -defL p_rankJ.
- suffices piKs_p: p \in \pi(Ks).
- by rewrite rank_kappa // (pnatPpi (pHall_pgroup kLhallKs)) in rpL.
- have [P sylP] := Sylow_exists p [group of Ks].
- have sylP_L: p.-Sylow(L) P := subHall_Sylow sMhallKs sMp sylP.
- by rewrite -p_rank_gt0 -(rank_Sylow sylP) (rank_Sylow sylP_L) ?rpL.
-split=> //; apply: sub_pgroup (pgroup_pi _) => p piMp; apply/negP=> /= t2Mp.
-have rpN: 'r_p('N[x]) <= 1.
- have: p \notin \beta('N[x]).
- rewrite -(predI_sigma_beta maxN) negb_and /= orbC.
- by have [-> _] := tau2_not_beta maxM t2Mp.
- apply: contraR; rewrite -ltnNge => rpN; rewrite spM_sbN // inE /= piMp.
- have: p \in \pi('N[x]) by rewrite -p_rank_gt0 ltnW.
- rewrite (partition_pi_mmax maxN) orbCA => /orP[t2Np | ].
- by case/andP: t2Mp => /negP[]; apply: st2NsM.
- by rewrite orbA -!andb_orr eqn_leq leqNgt rpN andbF.
-have [E hallE sQE] := Hall_superset (mmax_sol maxM) sQM (pi_pgroup qQ sM'q).
-have [A Ep2A _] := ex_tau2Elem hallE t2Mp; have [_ abelA dimA] := pnElemP Ep2A.
-pose A0 := [~: A, Q]%G; pose A1 := 'C_A(Q)%G.
-have sCQNg: 'C(Q) \subset 'N[x] :^ g by have [] := mem_uniq_mmax uniqNg.
-have ntA0: A0 :!=: 1.
- rewrite (sameP eqP commG1P); apply: contraL rpN => cQA.
- rewrite -ltnNge -(p_rankJ p _ g); apply/p_rank_geP.
- by exists A; apply/pnElemP; rewrite (subset_trans cQA).
-have t1Mq: q \in \tau1(M).
- have [_ nsCEA_E t1Eb] := tau1_cent_tau2Elem_factor maxM hallE t2Mp Ep2A.
- rewrite (pnatPpi t1Eb) // (piSg (quotientS _ sQE)) // -p_rank_gt0.
- rewrite -rank_pgroup ?quotient_pgroup // rank_gt0 -subG1.
- rewrite quotient_sub1 ?(subset_trans _ (normal_norm nsCEA_E)) //.
- by rewrite subsetI sQE centsC (sameP commG1P eqP).
-have EqEQ: Q \in 'E_q^1(E) by apply/pnElemP.
-have regMsQ: 'C_(M`_\sigma)(Q) = 1.
- apply: contraTeq FmaxM => nregMsQ; apply/FtypeP=> [[_]]; move/(_ q).
- by rewrite unlock 3!inE /= t1Mq; case/exists_inP; exists Q.
-have [[]] := tau1_act_tau2 maxM hallE t2Mp Ep2A t1Mq EqEQ regMsQ ntA0.
-rewrite -/A0 -/A1 => EpA0 cMsA0 _ notA1GA0 [EpA1 _].
-have [sA0A abelA0 oA0] := pnElemPcard EpA0; have [pA0 _] := andP abelA0.
-have [sA1A abelA1 oA1] := pnElemPcard EpA1; have [pA1 _] := andP abelA1.
-have sA0N: A0 \subset 'N[x].
- rewrite -cMsA0 (subset_trans _ sCxN) //= -cent_cycle (centsS Ms_x) //.
- exact: subsetIr.
-have [P sylP sA0P] := Sylow_superset sA0N pA0; have [_ pP _] := and3P sylP.
-have cycP: cyclic P.
- by rewrite (odd_pgroup_rank1_cyclic pP) ?mFT_odd ?(p_rank_Sylow sylP).
-have sA1gN: A1 :^ g^-1 \subset 'N[x] by rewrite sub_conjgV subIset ?sCQNg ?orbT.
-have [|z _ sA1gzP] := Sylow_Jsub sylP sA1gN; first by rewrite pgroupJ.
-case/imsetP: notA1GA0; exists (g^-1 * z); rewrite ?inE // conjsgM.
-by apply/eqP; rewrite (eq_subG_cyclic cycP) // !cardJg oA0 oA1.
-Qed.
-
-End Section14.
-
-
diff --git a/mathcomp/odd_order/BGsection15.v b/mathcomp/odd_order/BGsection15.v
deleted file mode 100644
index 704e98d..0000000
--- a/mathcomp/odd_order/BGsection15.v
+++ /dev/null
@@ -1,1511 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq choice div fintype.
-From mathcomp
-Require Import path bigop finset prime fingroup morphism perm automorphism.
-From mathcomp
-Require Import quotient action gproduct gfunctor pgroup cyclic commutator.
-From mathcomp
-Require Import center gseries nilpotent sylow abelian maximal hall frobenius.
-From mathcomp
-Require Import BGsection1 BGsection2 BGsection3 BGsection4 BGsection5.
-From mathcomp
-Require Import BGsection6 BGsection7 BGsection9 BGsection10 BGsection12.
-From mathcomp
-Require Import BGsection13 BGsection14.
-
-(******************************************************************************)
-(* This file covers B & G, section 15; it fills in the picture of maximal *)
-(* subgroups that was sketched out in section14, providing an intrinsic *)
-(* characterization of M`_\sigma and establishing the TI property for the *)
-(* "kernels" of maximal groups. We introduce only one new definition: *)
-(* M`_\F == the (direct) product of all the normal Sylow subgroups of M; *)
-(* equivalently, the largest normal nilpotent Hall subgroup of M *)
-(* We will refer to M`_\F as the Fitting core or F-core of M. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope.
-
-Section Definitions.
-
-Variables (gT : finGroupType) (M : {set gT}).
-
-Definition Fitting_core :=
- <<\bigcup_(P : {group gT} | Sylow M P && (P <| M)) P>>.
-Canonical Structure Fitting_core_group := [group of Fitting_core].
-
-End Definitions.
-
-Notation "M `_ \F" := (Fitting_core M)
- (at level 3, format "M `_ \F") : group_scope.
-Notation "M `_ \F" := (Fitting_core_group M) : Group_scope.
-
-Section FittingCore.
-
-Variable (gT : finGroupType) (M : {group gT}).
-Implicit Types H P : {group gT}.
-Implicit Type p : nat.
-
-Lemma Fcore_normal : M`_\F <| M.
-Proof.
-rewrite -[M`_\F]bigprodGE.
-elim/big_ind: _ => [|P Q nsP nsG|P /andP[] //]; first exact: normal1.
-by rewrite /normal normsY ?normal_norm // join_subG ?normal_sub.
-Qed.
-Hint Resolve Fcore_normal.
-
-Lemma Fcore_sub : M`_\F \subset M.
-Proof. by case/andP: Fcore_normal. Qed.
-
-Lemma Fcore_sub_Fitting : M`_\F \subset 'F(M).
-Proof.
-rewrite gen_subG; apply/bigcupsP=> P /andP[/SylowP[p _ /and3P[_ pP _]] nsP].
-by rewrite Fitting_max // (pgroup_nil pP).
-Qed.
-
-Lemma Fcore_nil : nilpotent M`_\F.
-Proof. exact: nilpotentS Fcore_sub_Fitting (Fitting_nil M). Qed.
-
-Lemma Fcore_max pi H :
- pi.-Hall(M) H -> H <| M -> nilpotent H -> H \subset M`_\F.
-Proof.
-move=> hallH nsHM nilH; have [sHM pi_H _] := and3P hallH.
-rewrite -(nilpotent_Fitting nilH) FittingEgen genS //.
-apply/bigcupsP=> [[p /= _] piHp]; rewrite (bigcup_max 'O_p(H)%G) //.
-have sylHp := nilpotent_pcore_Hall p nilH.
-have sylHp_M := subHall_Sylow hallH (pnatPpi pi_H piHp) sylHp.
-by rewrite (p_Sylow sylHp_M) gFnormal_trans.
-Qed.
-
-Lemma Fcore_dprod : \big[dprod/1]_(P | Sylow M (gval P) && (P <| M)) P = M`_\F.
-Proof.
-rewrite -[M`_\F]bigprodGE.
-apply/eqP/bigdprodYP=> P /andP[/SylowP[p p_pr sylP] nsPM].
-have defP := normal_Hall_pcore sylP nsPM.
-have /dprodP[_ _ cFpFp' tiFpFp'] := nilpotent_pcoreC p (Fitting_nil M).
-have /dprodYP := dprodEY cFpFp' tiFpFp'; rewrite /= p_core_Fitting defP.
-apply: subset_trans; rewrite bigprodGE gen_subG.
-apply/bigcupsP=> Q => /andP[/andP[/SylowP[q _ sylQ] nsQM] neqQP].
-have defQ := normal_Hall_pcore sylQ nsQM; rewrite -defQ -p_core_Fitting.
-apply: sub_pcore => q' /eqnP->; apply: contraNneq neqQP => eq_qp.
-by rewrite -val_eqE /= -defP -defQ eq_qp.
-Qed.
-
-Lemma Fcore_pcore_Sylow p : p \in \pi(M`_\F) -> p.-Sylow(M) 'O_p(M).
-Proof.
-rewrite /= -(bigdprod_card Fcore_dprod) mem_primes => /and3P[p_pr _].
-have not_p_dv_1: ~ p %| 1 by rewrite gtnNdvd ?prime_gt1.
-elim/big_ind: _ => // [p1 p2 IH1 IH2|P /andP[/SylowP[q q_pr sylP] nsPM p_dv_P]].
- by rewrite Euclid_dvdM // => /orP[/IH1 | /IH2].
-have qP := pHall_pgroup sylP.
-by rewrite (eqnP (pgroupP qP p p_pr p_dv_P)) (normal_Hall_pcore sylP).
-Qed.
-
-Lemma p_core_Fcore p : p \in \pi(M`_\F) -> 'O_p(M`_\F) = 'O_p(M).
-Proof.
-move=> piMFp /=; rewrite -(pcore_setI_normal p Fcore_normal).
-apply/setIidPl; rewrite sub_gen // (bigcup_max 'O_p(M)%G) //= pcore_normal.
-by rewrite (p_Sylow (Fcore_pcore_Sylow piMFp)).
-Qed.
-
-Lemma Fcore_Hall : \pi(M`_\F).-Hall(M) M`_\F.
-Proof.
-rewrite Hall_pi // /Hall Fcore_sub coprime_pi' ?cardG_gt0 //=.
-apply/pnatP=> // p p_pr; apply: contraL => /= piMFp; rewrite -p'natE //.
-rewrite -partn_eq1 // -(eqn_pmul2l (part_gt0 p #|M`_\F|)) muln1.
-rewrite -partnM ?cardG_gt0 // Lagrange ?Fcore_sub //.
-rewrite -(card_Hall (nilpotent_pcore_Hall p Fcore_nil)) /=.
-by rewrite p_core_Fcore // (card_Hall (Fcore_pcore_Sylow piMFp)).
-Qed.
-
-Lemma pcore_Fcore pi : {subset pi <= \pi(M`_\F)} -> 'O_pi(M`_\F) = 'O_pi(M).
-Proof.
-move=> s_pi_MF; rewrite -(pcore_setI_normal pi Fcore_normal).
-apply/setIidPl; rewrite (sub_normal_Hall Fcore_Hall) ?pcore_sub //.
-exact: sub_pgroup s_pi_MF (pcore_pgroup pi M).
-Qed.
-
-Lemma Fcore_pcore_Hall pi : {subset pi <= \pi(M`_\F)} -> pi.-Hall(M) 'O_pi(M).
-Proof.
-move=> s_pi_MF; apply: (subHall_Hall Fcore_Hall s_pi_MF).
-by rewrite /= -pcore_Fcore // (nilpotent_pcore_Hall pi Fcore_nil).
-Qed.
-
-End FittingCore.
-
-Lemma morphim_Fcore : GFunctor.pcontinuous Fitting_core.
-Proof.
-move=> gT rT G D f; have nsGF_G := Fcore_normal G.
-suffices hall_fGF: \pi(G`_\F).-Hall(f @* (D :&: G)) (f @* (D :&: G`_\F)).
- rewrite !morphimIdom in hall_fGF.
- by rewrite (Fcore_max hall_fGF) ?morphim_normal // morphim_nil ?Fcore_nil.
-rewrite morphim_pHall ?subsetIl //= -{2}(setIidPr (Fcore_sub G)) setIA.
-by rewrite !(setIC (D :&: G)) (setI_normal_Hall nsGF_G) ?subsetIr ?Fcore_Hall.
-Qed.
-
-Canonical Structure Fcore_igFun := [igFun by Fcore_sub & morphim_Fcore].
-Canonical Structure Fcore_gFun := [gFun by morphim_Fcore].
-Canonical Structure Fcore_pgFun := [pgFun by morphim_Fcore].
-
-Section MoreFittingCore.
-
-Variables (gT rT : finGroupType) (D : {group gT}) (f : {morphism D >-> rT}).
-Implicit Types (M H : {group gT}) (R : {group rT}).
-
-Lemma Fcore_char M : M`_\F \char M. Proof. exact: gFchar. Qed.
-
-Lemma FcoreJ M x : (M :^ x)`_\F = M`_\F :^ x.
-Proof.
-rewrite -{1}(setTI M) -morphim_conj.
-by rewrite -injmF ?injm_conj ?subsetT // morphim_conj setTI.
-Qed.
-
-Lemma injm_Fcore M : 'injm f -> M \subset D -> f @* M`_\F = (f @* M)`_\F.
-Proof. by move=> injf sMD; rewrite injmF. Qed.
-
-Lemma isom_Fcore M R : isom M R f -> M \subset D -> isom M`_\F R`_\F f.
-Proof. by move=> isoMR sMD; apply: gFisom. Qed.
-
-Lemma isog_Fcore M R : M \isog R -> M`_\F \isog R`_\F.
-Proof. by move=> isoMR; apply: gFisog. Qed.
-
-End MoreFittingCore.
-
-Section Section15.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Implicit Types p q q_star r : nat.
-Implicit Types x y z : gT.
-Implicit Types A E H K L M Mstar N P Q Qstar R S T U V W X Y Z : {group gT}.
-
-Lemma Fcore_sub_Msigma M : M \in 'M -> M`_\F \subset M`_\sigma.
-Proof.
-move=> maxM; rewrite gen_subG.
-apply/bigcupsP=> P /andP[/SylowP[p _ sylP] nsPM]; have [sPM pP _] := and3P sylP.
-have [-> | ntP] := eqsVneq P 1; first exact: sub1G.
-rewrite (sub_Hall_pcore (Msigma_Hall maxM)) // (pi_pgroup pP) //.
-by apply/exists_inP; exists P; rewrite ?(mmax_normal maxM).
-Qed.
-
-Lemma Fcore_eq_Msigma M :
- M \in 'M -> reflect (M`_\F = M`_\sigma) (nilpotent M`_\sigma).
-Proof.
-move=> maxM; apply: (iffP idP) => [nilMs | <-]; last exact: Fcore_nil.
-apply/eqP; rewrite eqEsubset Fcore_sub_Msigma //.
-by rewrite (Fcore_max (Msigma_Hall maxM)) ?pcore_normal.
-Qed.
-
-(* This is B & G, Lemma 15.1. *)
-(* We have made all semidirect products explicits, and omitted the assertion *)
-(* M`_\sigma \subset M^`(1), which is exactly covered by Msigma_der1. *)
-(* Some refactoring is definitely needed here, to avoid the mindless cut *)
-(* and paste of a large fragment of the proof of Lemma 12.12. *)
-Lemma kappa_structure M U K (Ms := M`_\sigma) :
- M \in 'M -> kappa_complement M U K ->
- [/\ (*a*) [/\ (Ms ><| U) ><| K = M, cyclic K & abelian (M^`(1) / Ms)],
- (*b*) K :!=: 1 -> Ms ><| U = M^`(1) /\ abelian U,
- (*c*) forall X, X \subset U -> X :!=: 1 -> 'C_Ms(X) != 1 ->
- [/\ 'M('C(X)) = [set M], cyclic X & \tau2(M).-group X],
- (*d*) abelian <<\bigcup_(x in Ms^#) 'C_U[x]>>
- & (*e*) U :!=: 1 -> exists U0,
- [/\ gval U0 \subset U, exponent (gval U0) = exponent U
- & [Frobenius Ms <*> U0 = Ms ><| U0]]].
-Proof.
-move=> maxM complU; have [hallU hallK _] := complU.
-have [hallE defM _ regUK cUU] := kappa_compl_context maxM complU.
-have [[_ E _ defE]] := sdprodP defM.
-have [nsUE sKE mulUK nUK tiUK] := sdprod_context defE.
-rewrite defE -{1 2}mulUK mulgA => defMl /mulGsubP[nMsU nMsK] tiMsE.
-have [/andP[sMsM nMsM] [sUE nUE]] := (pcore_normal _ M : Ms <| M, andP nsUE).
-rewrite norm_joinEr // mulUK in hallE.
-have [[sEM s'M_E _] [sUM sk'U _]] := (and3P hallE, and3P hallU).
-have defMsU: Ms ><| U = Ms <*> U.
- by apply: sdprodEY nMsU (trivgP _); rewrite -tiMsE -mulUK setIS ?mulG_subl.
-have{defM} defM: Ms <*> U ><| K = M.
- rewrite sdprodE ?normsY ?coprime_TIg //=; first by rewrite norm_joinEr.
- rewrite -(sdprod_card defMsU) coprime_mull andbC regular_norm_coprime //=.
- by rewrite (coprimegS sKE) ?(pnat_coprime (pcore_pgroup _ _)).
-rewrite defMsU quotient_der //= -/Ms -{2}defMl -mulgA mulUK.
-rewrite quotientMidl -quotient_der ?(subset_trans sEM) //.
-rewrite quotient_abelian ?(der_mmax_compl_abelian maxM hallE) //.
-set part_c := forall U, _; have c_holds: part_c.
- move=> X sXU ntX nregMsX; have sXE := subset_trans sXU sUE.
- have [x /setIP[Ms_x cXx] ntx] := trivgPn _ nregMsX.
- have Ms1x: x \in Ms^# by apply/setD1P.
- have piCx_hyp: {in X^#, forall x', x' \in ('C_M[x])^# /\ \sigma(M)^'.-elt x'}.
- move=> x' /setD1P[ntx' Xx']; have Ex' := subsetP sXE x' Xx'.
- rewrite 3!inE ntx' (subsetP sEM) ?(mem_p_elt s'M_E) //=.
- by rewrite (subsetP _ _ Xx') ?sub_cent1.
- have piCx x' X1x' := (* GG -- ssreflect evar generalization fails in trunk *)
- let: conj c e := piCx_hyp x' X1x' in pi_of_cent_sigma maxM Ms1x c e.
- have t2X: \tau2(M).-group X.
- apply/pgroupP=> p p_pr /Cauchy[] // x' Xx' ox'.
- have X1x': x' \in X^# by rewrite !inE Xx' -order_gt1 ox' prime_gt1.
- have [[]|[]] := piCx _ X1x'; last by rewrite /p_elt ox' pnatE.
- case/idPn; have:= mem_p_elt (pgroupS sXU sk'U) Xx'.
- by rewrite /p_elt ox' !pnatE // => /norP[].
- suffices cycX: cyclic X.
- split=> //; have [x' defX] := cyclicP cycX.
- have X1x': x' \in X^# by rewrite !inE -cycle_eq1 -cycle_subG -defX ntX /=.
- have [[kX _]|[_ _]] := piCx _ X1x'; last by rewrite defX cent_cycle.
- rewrite -(setIid X) coprime_TIg ?eqxx // {2}defX in ntX.
- rewrite (pnat_coprime t2X (sub_pgroup _ kX)) // => p kp.
- by rewrite inE /= negb_and rank_kappa ?orbT.
- have [E2 hallE2 sXE2] := Hall_superset (sigma_compl_sol hallE) sXE t2X.
- rewrite abelian_rank1_cyclic; last first.
- exact: abelianS sXE2 (tau2_compl_abelian maxM hallE hallE2).
- have [p _ ->] := rank_witness X; rewrite leqNgt; apply: contra nregMsX => rpX.
- have t2p: p \in \tau2(M) by rewrite (pnatPpi t2X) // -p_rank_gt0 ltnW.
- rewrite -(setIidPr (subset_trans sXE sEM)) in rpX.
- case/p_rank_geP: rpX => A; rewrite pnElemI -setIdE; case/setIdP=> Ep2A sAX.
- rewrite -subG1; have [_ _ <- _ _] := tau2_context maxM t2p Ep2A.
- by rewrite setIS ?centS.
-have hallU_E: Hall E U := pHall_Hall (pHall_subl sUE sEM hallU).
-have UtypeF := FTtypeF_complement maxM hallE hallU_E nsUE.
-set k'U13 := ({in _, _}) in UtypeF.
-have/UtypeF{UtypeF k'U13}UtypeF: k'U13.
- move=> x /setD1P[]; rewrite -order_gt1 -pi_pdiv.
- set p := pdiv _ => pi_x_p Ux t13x.
- apply: contraNeq (pnatPpi (mem_p_elt sk'U Ux) pi_x_p) => nreg_x.
- apply/orP; right; rewrite unlock /= inE /= (pnatPpi t13x) //=.
- have sxM: <[x]> \subset M by rewrite cycle_subG (subsetP sUM).
- move: pi_x_p; rewrite -p_rank_gt0 /= -(setIidPr sxM) => /p_rank_geP[P].
- rewrite pnElemI -setIdE => /setIdP[EpP sPx]; apply/exists_inP; exists P => //.
- by rewrite (subG1_contra _ nreg_x) //= -cent_cycle setIS ?centS.
-have [K1 | ntK] := altP (K :=P: 1).
- rewrite {2}K1 cyclic1; rewrite K1 mulg1 in mulUK; rewrite -mulUK in hallE.
- have ltM'M := sol_der1_proper (mmax_sol maxM) (subxx _) (mmax_neq1 maxM).
- suffices /UtypeF[[A0 [_ abA0 genA0]] frobM]: U :!=: 1.
- by split => //; apply: abelianS abA0; rewrite gen_subG; apply/bigcupsP.
- apply: contraNneq (proper_subn ltM'M); rewrite -{1}defMl => ->.
- by rewrite K1 !mulg1 Msigma_der1.
-have PmaxM: M \in 'M_'P by rewrite inE maxM -(trivg_kappa maxM hallK) andbT.
-have [_ _ [_ _ _ [cycZ _ _ _ _] [_ _ _ defM']]] := Ptype_embedding PmaxM hallK.
-have{cycZ cUU} [cycK cUU] := (cyclicS (joing_subl _ _) cycZ, cUU ntK).
-split=> // [_||/UtypeF[] //]; first split=> //.
- apply/eqP; rewrite eq_sym eqEcard -(leq_pmul2r (cardG_gt0 K)).
- have [nsMsU_M _ mulMsU _ _] := sdprod_context defM.
- rewrite (sdprod_card defM) (sdprod_card defM') der1_min ?normal_norm //=.
- by rewrite -(isog_abelian (sdprod_isog defM)) cyclic_abelian.
-by apply: abelianS cUU; rewrite gen_subG -big_distrr subsetIl.
-Qed.
-
-(* This is B & G, Theorem 15.2. *)
-(* It is this theorem that implies that the non-functorial definition of *)
-(* M`_\sigma used in B & G is equivalent to the original definition in FT *)
-(* (also used in Peterfalvi). *)
-(* Proof notes: this proof contained two non-structural arguments: taking D *)
-(* to be K-invariant, and reusing the nilpotent Frobenius kernel argument for *)
-(* Q1 (bottom of p. 118). We handled the first with a "without loss", but for *)
-(* the second we had to spell out explicitly the assumptions and conclusions *)
-(* of the nilpotent kernel argument that were spread throughout the last *)
-(* paragraph p. 118. *)
-(* We also had to make a few additions to the argument at the top of p. 119; *)
-(* while the statement of the Theorem states that F(M) = C_M(Qbar), the text *)
-(* only shows that F(M) = C_Msigma(Qbar), and we need to show that K acts *)
-(* regularly on Qbar to complete the proof; this follows from the values of *)
-(* orders of K, Kstar and Qbar. In addition we need to show much earlier *)
-(* that K acts faithfully on Q, to show that C_M(Q) is included in Ms, and *)
-(* this requires a use of 14.2(e) not mentioned in the text; in addition, the *)
-(* reference to coprime action (Proposition 1.5) on p. 119 l. 1 is somewhat *)
-(* misleading, since we actually need to use the coprime stabilizer Lemma 1.9 *)
-(* to show that C_D(Qbar) = C_D(Q) = 1 (unless we splice in the proof of that *)
-(* lemma). *)
-Theorem Fcore_structure M (Ms := M`_\sigma) :
- M \in 'M ->
- [/\ M`_\F != 1, M`_\F \subset Ms, Ms \subset M^`(1) & M^`(1) \proper M]
- /\ (forall K D : {group gT},
- \kappa(M).-Hall(M) K -> M`_\F != M`_\sigma ->
- let p := #|K| in let Ks := 'C_Ms(K) in
- let q := #|Ks| in let Q := 'O_q(M) in
- let Q0 := 'C_Q(D) in let Qbar := Q / Q0 in
- q^'.-Hall(M`_\sigma) D ->
- [/\ (*a*) [/\ M \in 'M_'P1, Ms ><| K = M & Ms = M ^`(1)],
- (*b*) [/\ prime p, prime q, q \in \pi(M`_\F) & q \in \beta(M)],
- [/\ (*c*) q.-Sylow(M) Q,
- (*d*) nilpotent D
- & (*e*) Q0 <| M],
- (*f*) [/\ minnormal Qbar (M / Q0), q.-abelem Qbar & #|Qbar| = (q ^ p)%N]
- & (*g*) [/\ Ms^`(1) = M^`(2),
- M^`(2) \subset 'F(M),
- [/\ Q <*> 'C_M(Q) = 'F(M),
- 'C_M(Qbar | 'Q) = 'F(M)
- & 'C_Ms (Ks / Q0 | 'Q) = 'F(M)]
- & 'F(M) \proper Ms]]).
-Proof.
-move=> maxM; set M' := M^`(1); set M'' := M^`(2).
-have nsMsM: Ms <| M := pcore_normal _ M; have [sMsM nMsM] := andP nsMsM.
-have solM := mmax_sol maxM; have solMs: solvable Ms := solvableS sMsM solM.
-have sMF_Ms: M`_\F \subset Ms := Fcore_sub_Msigma maxM.
-have ltM'M: M' \proper M by rewrite (sol_der1_proper solM) ?mmax_neq1.
-have sMsM': Ms \subset M' := Msigma_der1 maxM.
-have [-> | ltMF_Ms] := eqVproper sMF_Ms; first by rewrite eqxx Msigma_neq1.
-set KDpart := (X in _ /\ X); suffices KD_holds: KDpart.
- do 2!split=> //; have [K hallK] := Hall_exists \kappa(M) solM.
- pose q := #|'C_(M`_\sigma)(K)|; have [D hallD] := Hall_exists q^' solMs.
- have [_ [_ _ piMFq _] _ _ _] := KD_holds K D hallK (proper_neq ltMF_Ms) hallD.
- by rewrite -rank_gt0 (leq_trans _ (p_rank_le_rank q _)) ?p_rank_gt0.
-move=> {KDpart} K D hallK neMF_Ms p Ks q Q /= hallD.
-have not_nilMs: ~~ nilpotent Ms by rewrite (sameP (Fcore_eq_Msigma maxM) eqP).
-have P1maxM: M \in 'M_'P1; last have [PmaxM _] := setIdP P1maxM.
- apply: contraR not_nilMs => notP1maxM; apply: notP1type_Msigma_nil.
- by rewrite orbC inE notP1maxM inE maxM andbT orNb.
-have ntK: K :!=: 1 by rewrite inE maxM andbT -(trivg_kappa maxM hallK) in PmaxM.
-have [defMs defM]: Ms = M' /\ Ms ><| K = M.
- have [U complU] := ex_kappa_compl maxM hallK.
- have U1: U :=: 1 by apply/eqP; rewrite (trivg_kappa_compl maxM complU).
- have [[defM _ _] [//| defM' _] _ _ _] := kappa_structure maxM complU.
- by rewrite U1 sdprodg1 in defM defM'.
-have [_ mulMsK nMsK _] := sdprodP defM; rewrite /= -/Ms in mulMsK nMsK.
-have [sKM kK _] := and3P hallK; have s'K := sub_pgroup (@kappa_sigma' _ _) kK.
-have coMsK: coprime #|Ms| #|K| := pnat_coprime (pcore_pgroup _ _) s'K.
-have q_pr: prime q.
- have [L _ [_ _ _ _ [_]]] := Ptype_embedding PmaxM hallK.
- by rewrite inE P1maxM => [[] []].
-have hallMs: \sigma(M).-Hall(M) Ms := Msigma_Hall maxM.
-have sMq: q \in \sigma(M).
- by rewrite -pnatE // -pgroupE (pgroupS (subsetIl _ _) (pcore_pgroup _ _)).
-have{s'K kK} q'K: q^'.-group K := pi'_p'group s'K sMq.
-have nsQM: Q <| M := pcore_normal q M; have [sQM nQM] := andP nsQM.
-have qQ: q.-group Q := pcore_pgroup _ _.
-have sQMs: Q \subset Ms by rewrite (sub_Hall_pcore hallMs) ?(pi_pgroup qQ).
-have [K1 prK1 sK1K]: exists2 K1, prime #|gval K1| & K1 \subset K.
- have:= ntK; rewrite -rank_gt0; have [r r_pr ->] := rank_witness K.
- by case/p_rank_geP=> K1 /pnElemPcard[? _ oK1]; exists K1; rewrite ?oK1.
-have coMsK1 := coprimegS sK1K coMsK; have coQK1 := coprimeSg sQMs coMsK1.
-have prMsK: semiprime Ms K by have [[? _ []] ] := Ptype_structure PmaxM hallK.
-have defCMsK1: 'C_Ms(K1) = Ks.
- by rewrite (cent_semiprime prMsK) // -cardG_gt1 prime_gt1.
-have sK1M := subset_trans sK1K sKM; have nQK1 := subset_trans sK1M nQM.
-have{sMsM'} sKsQ: Ks \subset Q.
- have defMsK: [~: Ms, K] = Ms by case/coprime_der1_sdprod: defM.
- have hallQ := nilpotent_pcore_Hall q (Fitting_nil M).
- rewrite -[Q]p_core_Fitting (sub_Hall_pcore hallQ) //; first exact: pnat_id.
- apply: prime_meetG => //; apply: contraNneq not_nilMs => tiKsFM.
- suffices <-: 'F(Ms) = Ms by apply: Fitting_nil.
- apply/eqP; rewrite eqEsubset Fitting_sub /= -{1}defMsK.
- rewrite (odd_sdprod_primact_commg_sub_Fitting defM) ?mFT_odd //.
- apply/trivgP; rewrite -tiKsFM setIAC setSI //= -/Ms subsetI Fitting_sub /=.
- by rewrite Fitting_max ?Fitting_nil // gFnormal_trans.
-have nilMs_Q: nilpotent (Ms / Q).
- have [nMsK1 tiQK1] := (subset_trans sK1K nMsK, coprime_TIg coQK1).
- have prK1b: prime #|K1 / Q| by rewrite -(card_isog (quotient_isog _ _)).
- have defMsK1: (Ms / Q) ><| (K1 / Q) = (Ms / Q) <*> (K1 / Q).
- by rewrite sdprodEY ?quotient_norms // coprime_TIg ?coprime_morph.
- apply: (prime_Frobenius_sol_kernel_nil defMsK1) => //.
- by rewrite (solvableS _ (quotient_sol _ solM)) ?join_subG ?quotientS.
- by rewrite -coprime_quotient_cent ?quotientS1 /= ?defCMsK1.
-have defQ: 'O_q(Ms) = Q by rewrite -(setIidPl sQMs) pcore_setI_normal.
-have sylQ: q.-Sylow(Ms) Q.
- have nsQMs: Q <| Ms by rewrite -defQ pcore_normal.
- rewrite -(pquotient_pHall qQ) // /= -/Q -{3}defQ.
- by rewrite -(pquotient_pcore _ qQ) ?nilpotent_pcore_Hall.
-have{sMq hallMs} sylQ_M := subHall_Sylow hallMs sMq sylQ.
-have sQ_MF: Q \subset M`_\F.
- by rewrite sub_gen ?(bigcup_max [group of Q]) ?(p_Sylow sylQ_M) ?pcore_normal.
-have{sQ_MF} piMFq: q \in \pi(M`_\F).
- by rewrite (piSg sQ_MF) // (piSg sKsQ) // pi_of_prime ?inE /=.
-without loss nDK: D hallD / K \subset 'N(D).
- have [E hallE nEK] := coprime_Hall_exists q^' nMsK coMsK solMs.
- have [x Ms_x ->] := Hall_trans solMs hallD hallE.
- set Q0 := 'C__(_)%G; rewrite -(isog_nil (conj_isog _ _)) -['C_Q(_)]/(gval Q0).
- move/(_ E hallE nEK)=> IH; suffices ->: Q0 = [group of 'C_Q(E)] by [].
- apply: group_inj => /=; have Mx: x \in M := subsetP (pcore_sub _ _) x Ms_x.
- rewrite /= -/Q -{1}(normsP nQM x Mx) centJ -conjIg (normsP _ x Mx) //.
- by case: IH => _ _ [_ _]; case/andP.
-set Q0 := 'C_Q(D); set Qb := Q / Q0.
-have defQD: Q ><| D = Ms by rewrite -defQ in sylQ *; apply/sdprod_Hall_pcoreP.
-have [_ mulQD nQD tiQD] := sdprodP defQD; rewrite /= -/Q -/Ms in mulQD nQD tiQD.
-have nilD: nilpotent D.
- by rewrite (isog_nil (quotient_isog nQD tiQD)) /= -quotientMidl mulQD.
-have [sDMs q'D _] := and3P hallD; have sDM := subset_trans sDMs sMsM.
-have sDKM: D <*> K \subset M by rewrite join_subG sDM.
-have q'DK: q^'.-group (D <*> K) by rewrite norm_joinEr // pgroupM q'D.
-have{K1 sK1M sK1K coMsK1 coQK1 prK1 defCMsK1 nQK1 solMs} Qi_rec Qi:
- Qi \in |/|_Q(D <*> K; q) -> Q0 \subset Qi -> Qi \proper Q ->
- exists L, [/\ L \in |/|_Q(D <*> K; q), Qi <| L, minnormal (L / Qi) (M / Qi)
- & ~~ ((Ks \subset L) ==> (Ks \subset Qi))].
-- case/setIdP=> /andP[sQiQ qQi] nQiDK sQ0i ltQiQ.
- have ltQiN := nilpotent_proper_norm (pgroup_nil qQ) ltQiQ.
- have [Lb minLb sLbQ]: {Lb | minnormal (gval Lb) (M / Qi) & Lb \subset Q / Qi}.
- apply: mingroup_exists; rewrite quotient_norms //= andbT -quotientInorm.
- by rewrite -subG1 quotient_sub1 ?subsetIr // proper_subn.
- have [ntLb nLbM] := andP (mingroupp minLb).
- have nsQiN: Qi <| 'N_M(Qi) by rewrite normal_subnorm (subset_trans sQiQ).
- have: Lb <| 'N_M(Qi) / Qi.
- by rewrite quotientInorm /normal (subset_trans sLbQ) ?quotientS.
- case/(inv_quotientN nsQiN) => L defLb sQij /=; case/andP.
- case/subsetIP=> sLM nQij nLN; exists L.
- have{sLbQ} sLQ: L \subset Q by rewrite -(quotientSGK nQij sQiQ) -defLb.
- rewrite inE /psubgroup /normal sLQ sQij nQij (pgroupS sLQ qQ) -defLb.
- have nLDK: D <*> K \subset 'N(L) by apply: subset_trans nLN; apply/subsetIP.
- have sLD_Ms: L <*> D \subset Ms by rewrite join_subG (subset_trans sLQ).
- have coLD_K1: coprime #|L <*> D| #|K1| := coprimeSg sLD_Ms coMsK1.
- have [[nQiD nQiK] [nLD nLK]] := (joing_subP nQiDK, joing_subP nLDK).
- have [nQiK1 nLK1] := (subset_trans sK1K nQiK, subset_trans sK1K nLK).
- split=> //; apply: contra ntLb => regLK.
- have [sLLD sDLD] := joing_subP (subxx (L <*> D)).
- suffices nilLDbar: nilpotent (L <*> D / Qi).
- rewrite defLb -subG1 -(quotientS1 sQ0i) /= -/Q.
- rewrite coprime_quotient_cent ?(pgroup_sol qQ) ?(pnat_coprime qQ) //=.
- rewrite subsetI quotientS //= (sub_nilpotent_cent2 nilLDbar) ?quotientS //.
- by rewrite coprime_morph ?(p'nat_coprime q'D (pgroupS sLQ qQ)).
- have defLK1b: (L <*> D / Qi) ><| (K1 / Qi) = (L <*> D / Qi) <*> (K1 / Qi).
- rewrite sdprodEY ?coprime_TIg ?quotient_norms //=.
- by rewrite (subset_trans sK1K) // normsY.
- by rewrite coprime_morph // (coprimeSg sLD_Ms).
- have [sQiLD sLD_M] := (subset_trans sQij sLLD, subset_trans sLD_Ms sMsM).
- have{regLK}: 'C_(L <*> D / Qi)(K1 / Qi) = 1.
- rewrite -coprime_quotient_cent ?(subset_trans sK1K) ?(solvableS sLD_M) //=.
- rewrite -(setIidPr sLD_Ms) setIAC defCMsK1 quotientS1 //= -/Ks joingC.
- rewrite norm_joinEl // -(setIidPl sKsQ) -setIA -group_modr // tiQD mul1g.
- have [-> | ntLKs] := eqVneq (Ks :&: L) 1; first exact: sub1G.
- by rewrite subIset ?(implyP regLK) // prime_meetG.
- apply: (prime_Frobenius_sol_kernel_nil defLK1b).
- by apply: solvableS (quotient_sol _ solM); rewrite join_subG !quotientS.
- by rewrite -(card_isog (quotient_isog _ _)) ?coprime_TIg // (coprimeSg sQiQ).
-have ltQ0Q: Q0 \proper Q.
- rewrite properEneq subsetIl andbT; apply: contraNneq not_nilMs => defQ0.
- rewrite -dprodEsd // in defQD; last by rewrite centsC -defQ0 subsetIr.
- by rewrite (dprod_nil defQD) (pgroup_nil qQ).
-have [nQK coQK] := (subset_trans sKM nQM, pnat_coprime qQ q'K).
-have solQ := pgroup_sol qQ. (* must come late: Coq diverges on solQ <> solMs *)
-have [coDK coQD] := (coprimeSg sDMs coMsK, pnat_coprime qQ q'D).
-have nQ0K: K \subset 'N(Q0) by rewrite normsI ?norms_cent.
-have nQ0D: D \subset 'N(Q0) by rewrite cents_norm // centsC subsetIr.
-have nQ0DK: D <*> K \subset 'N(Q0) by apply/joing_subP.
-have [|Q1 [DKinvQ1 nsQ01 minQ1b nregQ1b]] := Qi_rec _ _ (subxx _) ltQ0Q.
- by rewrite inE /psubgroup (pgroupS _ qQ) ?subsetIl.
-have{Qi_rec nregQ1b DKinvQ1} [tiQ0Ks defQ1]: Q0 :&: Ks = 1 /\ Q1 :=: Q.
- move: nregQ1b; rewrite negb_imply; case/andP=> sKsQ1 not_sKsQ0.
- split=> //; first by rewrite setIC prime_TIg.
- have [] := setIdP DKinvQ1; case/andP; case/eqVproper=> // ltQ1Q _ _.
- have [Q2 [_ _ _]] := Qi_rec Q1 DKinvQ1 (normal_sub nsQ01) ltQ1Q.
- by rewrite sKsQ1 implybT.
-have [nsQ0Q minQb]: Q0 <| Q /\ minnormal Qb (M / Q0) by rewrite /Qb -defQ1.
-have{Q1 defQ1 minQ1b nsQ01} abelQb: q.-abelem Qb.
- have qQb: q.-group Qb := quotient_pgroup _ qQ; have solQb := pgroup_sol qQb.
- by rewrite -is_abelem_pgroup // (minnormal_solvable_abelem minQb).
-have [cQbQb [sQ0Q nQ0Q]] := (abelem_abelian abelQb, andP nsQ0Q).
-have nQ0M: M \subset 'N(Q0) by rewrite -mulMsK -mulQD -mulgA !mul_subG.
-have nsQ0M: Q0 <| M by rewrite /normal subIset ?sQM.
-have sFM_QCQ: 'F(M) \subset Q <*> 'C_M(Q).
- have [_ /= mulQQ' cQQ' _] := dprodP (nilpotent_pcoreC q (Fitting_nil M)).
- rewrite -{3}mulQQ' p_core_Fitting cent_joinEr ?subsetIr //= -/Q in cQQ' *.
- by rewrite mulgS // subsetI gFsub_trans ?gFsub.
-have sQCQ_CMsQb: Q <*> 'C_M(Q) \subset 'C_Ms(Qb | 'Q).
- rewrite join_subG !(subsetI _ Ms) sQMs /= !sub_astabQ nQ0Q /= -/Q0 -/Qb.
- rewrite -abelianE cQbQb quotient_cents ?subsetIr //= andbC subIset ?nQ0M //=.
- rewrite -(coprime_mulG_setI_norm mulMsK) ?norms_cent //= -/Ms.
- suffices ->: 'C_K(Q) = 1 by rewrite mulg1 subsetIl.
- have: ~~ (Q \subset Ks); last apply: contraNeq => ntCKQ.
- have [_ _ _ [_]] := Ptype_structure PmaxM hallK.
- by move/(_ q); rewrite pi_of_prime //; case/(_ (eqxx q) _ sylQ_M).
- rewrite -[Ks](cent_semiprime prMsK _ ntCKQ) ?subsetIl //.
- by rewrite subsetI sQMs centsC subsetIr.
-have nCQb: M \subset 'N('C(Qb | 'Q)).
- by rewrite (subset_trans _ (astab_norm _ _)) ?actsQ.
-have defFM: 'C_Ms(Qb | 'Q) = 'F(M).
- apply/eqP; rewrite eqEsubset andbC (subset_trans sFM_QCQ) //=.
- rewrite Fitting_max //=; first by rewrite /normal subIset ?sMsM //= normsI.
- rewrite -(coprime_mulG_setI_norm mulQD) ?(subset_trans sMsM) //= -/Q.
- rewrite mulg_nil ?(nilpotentS (subsetIl _ _)) ?(pgroup_nil qQ) //= -/Q.
- rewrite (centsS (subsetIl _ _)) //= -/Q.
- have cDQ0: 'C_D(Qb | 'Q) \subset 'C(Q0) by rewrite subIset // centsC subsetIr.
- rewrite (stable_factor_cent cDQ0) ?(coprimegS (subsetIl _ _) coQD) //.
- by rewrite /stable_factor commGC -sub_astabQR ?subsetIr // subIset ?nQ0D.
-have{sFM_QCQ sQCQ_CMsQb} ->: Q <*> 'C_M(Q) = 'F(M).
- by apply/eqP; rewrite eqEsubset sFM_QCQ andbT -defFM.
-have ltFM_Ms: 'F(M) \proper Ms.
- rewrite properEneq -{2}defFM subsetIl andbT.
- by apply: contraNneq not_nilMs => <-; apply: Fitting_nil.
-have sQFM: Q \subset 'F(M) by rewrite -[Q]p_core_Fitting pcore_sub.
-have not_cDQb: ~~ (D / Q0 \subset 'C(Qb)).
- apply: contra (proper_subn ltFM_Ms) => cDQb; rewrite -mulQD mulG_subG sQFM /=.
- by rewrite -defFM subsetI sDMs sub_astabQ nQ0D.
-have [_ minQbP] := mingroupP minQb.
-have regQbDb: 'C_Qb(D / Q0) = 1.
- apply: contraNeq not_cDQb => ntCQDb; rewrite centsC; apply/setIidPl.
- apply: minQbP (subsetIl _ _); rewrite ntCQDb /= -/Qb -(setIidPl cQbQb) -setIA.
- by rewrite -centM -quotientMl //= mulQD normsI ?norms_cent ?quotient_norms.
-have tiQ0 R: q^'.-group R -> Q0 :&: R = 1.
- by move/(pnat_coprime (pgroupS sQ0Q qQ))/coprime_TIg.
-have oKb: #|K / Q0| = p by rewrite -(card_isog (quotient_isog _ (tiQ0 _ _))).
-have oKsb: #|Ks / Q0| = q.
- by rewrite -(card_isog (quotient_isog _ tiQ0Ks)) ?(subset_trans sKsQ).
-have regDK: 'C_D(K) = 1.
- by rewrite -(setIidPl sDMs) -setIA setIC coprime_TIg ?(coprimeSg sKsQ).
-have{tiQ0} frobDKb: [Frobenius D <*> K / Q0 = (D / Q0) ><| (K / Q0)].
- have ntDb: D / Q0 != 1 by apply: contraNneq not_cDQb => ->; apply: sub1G.
- have ntKb: K / Q0 != 1 by rewrite -(isog_eq1 (quotient_isog _ (tiQ0 _ _))).
- apply/Frobenius_semiregularP => // [|xb].
- by apply: quotient_coprime_sdprod; rewrite ?sdprodEY ?coprime_TIg.
- have [f [_ ker_f _ im_f]] := restrmP (coset_morphism Q0) nQ0DK.
- have{ker_f} inj_f: 'injm f by rewrite ker_f ker_coset setIC tiQ0.
- rewrite /= /quotient -!im_f ?joing_subl ?joing_subr //.
- rewrite 2!inE andbC => /andP[/morphimP[x DKx Kx ->{xb}]].
- rewrite morph_injm_eq1 // -injm_subcent1 ?joing_subl // => ntx.
- rewrite -{3}(setIidPl sDMs) -setIA prMsK ?inE ?ntx //.
- by rewrite setICA regDK setIg1 morphim1.
-have defKsb: 'C_Qb(K / Q0) = Ks / Q0.
- rewrite /Ks -mulQD coprime_cent_mulG // regDK mulg1.
- by rewrite coprime_quotient_cent ?subsetIl.
-have{frobDKb regQbDb} [p_pr oQb cQbD']:
- [/\ prime p, #|Qb| = (q ^ p)%N & (D / Q0)^`(1) \subset 'C(Qb)].
-- have ntQb: Qb != 1 by rewrite -subG1 quotient_sub1 ?proper_subn.
- have prQbK: semiprime Qb (K / Q0).
- move=> xb; rewrite 2!inE andbC; case/andP; case/morphimP=> x nQ0x Kx -> ntx.
- have{ntx} ntx: x != 1 by apply: contraNneq ntx => ->; rewrite morph1.
- transitivity ('C_Q[x] / Q0); last first.
- rewrite -(coprime_quotient_cent (subsetIl Q _) nQ0K coQK solQ) /= -/Q0.
- by rewrite -/Q -(setIidPl sQMs) -!setIA prMsK // !inE ntx.
- rewrite -!cent_cycle -quotient_cycle //; rewrite -!cycle_subG in Kx nQ0x.
- by rewrite coprime_quotient_cent ?(coprimegS Kx).
- have:= Frobenius_primact frobDKb _ _ _ ntQb _ prQbK regQbDb.
- have [nQDK solDK] := (subset_trans sDKM nQM, solvableS sDKM solM).
- rewrite !quotient_sol ?quotient_norms // coprime_morph ?(pnat_coprime qQ) //=.
- rewrite -/Qb oKb defKsb prime_cyclic oKsb // subsetI der_sub /=.
- by case=> //= -> -> ->.
-have{cQbD'} sM''FM: M'' \subset 'F(M).
- have nQMs := subset_trans sMsM nQM.
- rewrite [M'']dergSn -/M' -defMs -(quotientSGK _ sQFM) ?comm_subG //.
- rewrite (quotient_der 1) //= -/Ms -mulQD quotientMidl -quotient_der //= -/Q.
- by rewrite quotientS // -defFM subsetI sub_astabQ !comm_subG ?quotient_der.
-have sQ0Ms := subset_trans sQ0Q sQMs.
-have ->: 'C_Ms(Ks / Q0 | 'Q) = 'F(M).
- have sFMcKsb: 'F(M) \subset 'C_Ms(Ks / Q0 | 'Q).
- by rewrite -defFM setIS ?astabS ?quotientS.
- have nCMsKsbM: M \subset 'N('C_Ms(Ks / Q0 | 'Q)).
- rewrite -{1}mulMsK mulG_subG sub_der1_norm ?subsetIl //= -/Ms; last first.
- by rewrite {1}defMs (subset_trans sM''FM sFMcKsb).
- rewrite normsI // (subset_trans _ (astab_norm _ _)) ?actsQ //.
- by rewrite cents_norm // centsC subsetIr.
- apply/eqP; rewrite eqEsubset sFMcKsb -defFM subsetI subsetIl.
- rewrite sub_astabQ /= -/Q0 subIset ?(subset_trans sMsM) //= andbT centsC.
- apply/setIidPl; apply: minQbP (subsetIl _ _).
- rewrite andbC normsI ?norms_cent ?quotient_norms //= -/Qb.
- have: Ks / Q0 != 1 by rewrite -cardG_gt1 oKsb prime_gt1.
- apply: subG1_contra; rewrite (quotientGI _ sQ0Ms) quotient_astabQ /= -/Q0.
- by rewrite subsetI quotientS // centsC subsetIr.
-have ->: 'C_M(Qb | 'Q) = 'F(M).
- apply/eqP; rewrite eqEsubset -{2}defFM setSI //= andbT.
- rewrite -(coprime_mulG_setI_norm mulMsK) //= -defFM mulG_subG subxx /=.
- rewrite subsetI subsetIr -(quotientSGK _ sQ0Ms) 1?subIset ?nQ0K //= -/Q0.
- rewrite quotientIG; last by rewrite sub_astabQ normG trivg_quotient sub1G.
- rewrite quotient_astabQ /= -/Q0 prime_TIg ?sub1G ?oKb //.
- rewrite centsC -subsetIidl defKsb; apply: contra (@subset_leq_card _ _ _) _.
- by rewrite -ltnNge oQb oKsb (ltn_exp2l 1) prime_gt1.
-suffices ->: q \in \beta(M) by do 2!split=> //; last rewrite {1}defMs.
-apply: contraR not_cDQb; rewrite negb_forall_in; case/exists_inP=> Q1 sylQ1.
-rewrite negbK {Q1 sylQ1}(eq_Hall_pcore sylQ_M sylQ1) -/Q => nnQ.
-have sD_DK': D \subset (D <*> K)^`(1).
- rewrite -{1}(coprime_cent_prod nDK) ?nilpotent_sol // regDK mulg1.
- by rewrite commgSS ?joing_subl ?joing_subr.
-rewrite quotient_cents // (subset_trans sD_DK') //.
-have nQDK := subset_trans sDKM nQM; have nCQDK := norms_cent nQDK.
-rewrite der1_min // -(isog_abelian (second_isog nCQDK)) setIC /=.
-rewrite -ker_conj_aut (isog_abelian (first_isog_loc _ _)) //=; set A := _ @* _.
-have norm_q := normal_norm (pcore_normal q _).
-rewrite {norm_q}(isog_abelian (quotient_isog (norm_q _ _) _)) /=; last first.
- by rewrite coprime_TIg ?coprime_morphr //= (pnat_coprime (pcore_pgroup q _)).
-have AutA: A \subset [Aut Q] := Aut_conj_aut _ _.
-have [|//] := Aut_narrow qQ (mFT_odd _) nnQ _ AutA (morphim_odd _ (mFT_odd _)).
-exact: morphim_sol (solvableS sDKM solM).
-Qed.
-
-(* This is B & G, Corollary 15.3(a). *)
-Corollary cent_Hall_sigma_sdprod M H pi :
- M \in 'M -> pi.-Hall(M`_\sigma) H -> H :!=: 1 ->
- exists X, [/\ gval X \subset M, cyclic X, \tau2(M).-group X
- & 'C_(M`_\sigma)(H) ><| X = 'C_M(H)].
-Proof.
-move=> maxM hallH ntH; have hallMs := Msigma_Hall maxM.
-have nsMsM: M`_\sigma <| M := pcore_normal _ M; have [sMsM nMsM] := andP nsMsM.
-have sMs := pHall_pgroup hallMs; have [sHMs piH _] := and3P hallH.
-have k'CH: \kappa(M)^'.-group 'C_M(H).
- apply/idPn; rewrite negb_and cardG_gt0 all_predC negbK => /hasP[p piCHp kMp].
- have PmaxM: M \in 'M_'P by apply/PtypeP; split; last exists p.
- have [X]: exists X, X \in 'E_p^1('C_M(H)).
- by apply/p_rank_geP; rewrite p_rank_gt0.
- case/pnElemP; case/subsetIP=> sXM cHX abelX dimX; have [pX _] := andP abelX.
- have [K hallK sXK] := Hall_superset (mmax_sol maxM) sXM (pi_pgroup pX kMp).
- have E1X: X \in 'E^1(K) by apply/nElemP; exists p; apply/pnElemP.
- have [q q_pr rqH] := rank_witness H; have [S sylS] := Sylow_exists q H.
- have piSq: q \in \pi(S).
- by rewrite -p_rank_gt0 (p_rank_Sylow sylS) -rqH rank_gt0.
- have [_ [defNK defNX] _ [_ not_sylCP _] _] := Ptype_structure PmaxM hallK.
- have{defNX} [defNX _] := defNX X E1X.
- have [[_ nsKs] [_ mulKKs _ _]] := (dprod_normal2 defNK, dprodP defNK).
- have s'K := sub_pgroup (@kappa_sigma' _ _) (pHall_pgroup hallK).
- have [_ hallKs] := coprime_mulGp_Hall mulKKs s'K (pgroupS (subsetIl _ _) sMs).
- have [sSH _] := andP sylS.
- have sylS_Ms := subHall_Sylow hallH (pnatPpi piH (piSg sSH piSq)) sylS.
- have [sSMs _] := andP sylS_Ms; have sS := pgroupS sSMs sMs.
- have sylS_M := subHall_Sylow hallMs (pnatPpi sS piSq) sylS_Ms.
- have sSKs: S \subset 'C_(M`_\sigma)(K).
- rewrite (sub_normal_Hall hallKs) //= -defNX subsetI (pHall_sub sylS_M) /=.
- by rewrite cents_norm // centsC (centsS sSH).
- by have [_ /negP] := not_sylCP q (piSg sSKs piSq) S sylS_M.
-have solCH := solvableS (subsetIl M 'C(H)) (mmax_sol maxM).
-have [X hallX] := Hall_exists \sigma(M)^' solCH; exists X.
-have nsCsH: 'C_(M`_\sigma)(H) <| 'C_M(H) by rewrite /normal setSI // normsIG.
-have hallCs: \sigma(M).-Hall('C_M(H)) 'C_(M`_\sigma)(H).
- by rewrite -(setIidPl sMsM) -setIA (setI_normal_Hall nsMsM) ?subsetIl.
-rewrite (sdprod_normal_p'HallP nsCsH hallX hallCs).
-have [-> | ntX] := eqsVneq X 1; first by rewrite sub1G cyclic1 pgroup1.
-have [sXCH s'X _] := and3P hallX; have [sXM cHX] := subsetIP sXCH.
-have sk'X: \sigma_kappa(M)^'.-group X.
- apply/pgroupP=> p p_pr p_dv_X; apply/norP=> /=.
- by split; [apply: (pgroupP s'X) | apply: (pgroupP (pgroupS sXCH k'CH))].
-have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
-have [U complU] := ex_kappa_compl maxM hallK; have [hallU _ _] := complU.
-have [a Ma sXaU] := Hall_Jsub (mmax_sol maxM) hallU sXM sk'X.
-have [_ _ cycX _ _] := kappa_structure maxM complU.
-rewrite -(cyclicJ _ a) -(pgroupJ _ _ a); have [||//] := cycX _ sXaU.
- by rewrite -(isog_eq1 (conj_isog X a)).
-rewrite -(normsP nMsM a Ma) centJ -conjIg -(isog_eq1 (conj_isog _ a)).
-by rewrite (subG1_contra _ ntH) // subsetI sHMs centsC.
-Qed.
-
-(* This is B & G, Corollary 15.3(b). *)
-Corollary sigma_Hall_tame M H pi x a :
- M \in 'M -> pi.-Hall(M`_\sigma) H -> x \in H -> x ^ a \in H ->
- exists2 b, b \in 'N_M(H) & x ^ a = x ^ b.
-Proof.
-move=> maxM hallH Hx Hxa; have [sHMs piH _] := and3P hallH.
-have SMxM: M \in 'M_\sigma[x] by rewrite inE maxM cycle_subG (subsetP sHMs).
-have SMxMa: (M :^ a^-1)%G \in 'M_\sigma[x].
- by rewrite inE mmaxJ maxM cycle_subG /= MsigmaJ mem_conjgV (subsetP sHMs).
-have [-> | ntx] := eqVneq x 1; first by exists 1; rewrite ?group1 ?conj1g.
-have ell1x: \ell_\sigma(x) == 1%N.
- by apply/ell_sigma1P; split=> //; apply/set0Pn; exists M.
-have ntH: H :!=: 1 by apply/trivgPn; exists x.
-have [[transR _ _ _] _] := FT_signalizer_context ell1x.
-have [c Rc defMc] := atransP2 transR SMxM SMxMa.
-pose b := c * a; have def_xa: x ^ a = x ^ b.
- by have [_ cxc] := setIP Rc; rewrite conjgM {3}/conjg -(cent1P cxc) mulKg.
-have Mb: b \in M.
- by rewrite -(norm_mmax maxM) inE conjsgM -(congr_group defMc) actKV.
-have nsMsM: M`_\sigma <| M := pcore_normal _ _; have [sMsM _] := andP nsMsM.
-have [nsHM | not_nsHM] := boolP (H <| M).
- by exists b; rewrite // (mmax_normal maxM) ?setIid.
-have neqMFs: M`_\F != M`_\sigma.
- apply: contraNneq not_nsHM => /(Fcore_eq_Msigma maxM)nilMs.
- by rewrite (nilpotent_Hall_pcore nilMs hallH) gFnormal_trans.
-have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
-pose q := #|'C_(M`_\sigma)(K)|.
-have [D hallD] := Hall_exists q^' (solvableS sMsM (mmax_sol maxM)).
-have [[_ sMFs _ _]] := Fcore_structure maxM; case/(_ K D) => //; rewrite -/q.
-set Q := 'O_q(M) => _ [_ q_pr piMFq _] [sylQ nilD _] _ _.
-have sQMs: Q \subset M`_\sigma.
- by apply: subset_trans sMFs; rewrite -[Q](p_core_Fcore piMFq) pcore_sub.
-have sylQ_Ms: q.-Hall(M`_\sigma) Q := pHall_subl sQMs sMsM sylQ.
-have nsQM: Q <| M := pcore_normal q M; have [_ qQ _] := and3P sylQ.
-have nsQ_Ms: Q <| M`_\sigma := normalS sQMs sMsM nsQM.
-have defMs: Q ><| D = M`_\sigma := sdprod_normal_p'HallP nsQ_Ms hallD sylQ_Ms.
-have [_ mulQD nQD tiQD] := sdprodP defMs; rewrite -/Q in mulQD nQD tiQD.
-have nQH := subset_trans sHMs (normal_norm nsQ_Ms).
-have nsQHM: Q <*> H <| M.
- rewrite -(quotientGK nsQM) -quotientYK // cosetpre_normal //= -/Q.
- suffices ->: H / Q = 'O_pi(M`_\sigma / Q).
- by rewrite gFnormal_trans ?quotient_normal.
- apply: nilpotent_Hall_pcore; last exact: quotient_pHall.
- by rewrite /= -mulQD quotientMidl -(isog_nil (quotient_isog _ _)).
-have tiQH: Q :&: H = 1.
- apply: coprime_TIg (p'nat_coprime (pi_pgroup qQ _) piH).
- apply: contra not_nsHM => pi_q; rewrite (joing_idPr _) // in nsQHM.
- by rewrite (normal_sub_max_pgroup (Hall_max hallH)) ?(pi_pgroup qQ).
-have defM: Q * 'N_M(H) = M.
- have hallH_QH: pi.-Hall(Q <*> H) H.
- by rewrite (pHall_subl (joing_subr _ _) _ hallH) // join_subG sQMs.
- have solQH := solvableS (normal_sub nsQHM) (mmax_sol maxM).
- rewrite -[RHS](Hall_Frattini_arg solQH nsQHM hallH_QH) /= norm_joinEr //.
- by rewrite -mulgA [H * _]mulSGid // subsetI (subset_trans sHMs sMsM) normG.
-rewrite -defM in Mb; case/mulsgP: Mb => z n Qz Nn defb; exists n => //.
-rewrite def_xa defb conjgM [x ^ z](conjg_fixP _) // -in_set1 -set1gE -tiQH.
-rewrite inE {1}commgEr groupMr // -mem_conjgV groupV /=.
-rewrite (normsP (normal_norm nsQM)) ?Qz; last first.
- by rewrite groupV (subsetP sMsM) // (subsetP sHMs).
-rewrite commgEl groupMl ?groupV //= -(conjsgK n H) mem_conjgV -conjgM -defb.
-by have [_ nHn] := setIP Nn; rewrite (normP nHn) -def_xa.
-Qed.
-
-(* This is B & G, Corollary 15.4. *)
-(* This result does not appear to be needed for the actual proof. *)
-Corollary nilpotent_Hall_sigma H :
- nilpotent H -> Hall G H -> exists2 M, M \in 'M & H \subset M`_\sigma.
-Proof.
-move=> nilH /Hall_pi/=hallH; have [_ piH _] := and3P hallH.
-have [-> | ntH] := eqsVneq H 1.
- by have [M maxM] := any_mmax gT; exists M; rewrite ?sub1G.
-pose p := pdiv #|H|; have piHp: p \in \pi(H) by rewrite pi_pdiv cardG_gt1.
-pose S := 'O_p(H)%G; have sylS: p.-Sylow(H) S := nilpotent_pcore_Hall p nilH.
-have [sSH pS _] := and3P sylS.
-have ntS: S :!=: 1 by rewrite -rank_gt0 (rank_Sylow sylS) p_rank_gt0.
-have [M maxNM] := mmax_exists (mFT_norm_proper ntS (mFT_pgroup_proper pS)).
-have [maxM sNM] := setIdP maxNM; exists M => //.
-have sSM: S \subset M := subset_trans (normG _) sNM.
-have sylS_G := subHall_Sylow hallH (pnatPpi piH piHp) sylS.
-have sylS_M := pHall_subl sSM (subsetT M) sylS_G.
-have sMp: p \in \sigma(M) by apply/exists_inP; exists S.
-have sSMs: S \subset M`_\sigma.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) ?(pi_pgroup pS).
-rewrite -(nilpotent_Fitting nilH) FittingEgen gen_subG.
-apply/bigcupsP=> [[q /= _] piHq]; have [-> // | p'q] := eqVneq q p.
-have sylS_Ms := pHall_subl sSMs (pcore_sub _ _) sylS_M.
-have [X [_ cycX t2X defCS]] := cent_Hall_sigma_sdprod maxM sylS_Ms ntS.
-have{defCS} [nCMsCS _ defCS _ _] := sdprod_context defCS.
-have t2'CMs: \tau2(M)^'.-group 'C_(M`_\sigma)(S).
- apply: pgroupS (subsetIl _ _) (sub_pgroup _ (pcore_pgroup _ _)) => r.
- by apply: contraL => /andP[].
-have [hallCMs hallX] := coprime_mulGp_Hall defCS t2'CMs t2X.
-have sHqCS: 'O_q(H) \subset 'C_M(S).
- rewrite (setIidPr (subset_trans (cent_sub _) sNM)).
- rewrite (sub_nilpotent_cent2 nilH) ?pcore_sub //.
- exact: pnat_coprime pS (pi_pgroup (pcore_pgroup _ _) _).
-have [t2q | t2'q] := boolP (q \in \tau2(M)); last first.
- apply: subset_trans (subsetIl _ 'C(S)).
- by rewrite (sub_normal_Hall hallCMs) // (pi_pgroup (pcore_pgroup _ _)).
-have sylHq := nilpotent_pcore_Hall q nilH.
-have sylHq_G := subHall_Sylow hallH (pnatPpi piH piHq) sylHq.
-have sylHq_CS := pHall_subl sHqCS (subsetT _) sylHq_G.
-have [Q sylQ] := Sylow_exists q X; have [sQX _] := andP sylQ.
-have sylQ_CS := subHall_Sylow hallX t2q sylQ.
-case/andP: t2q => _.
-rewrite eqn_leq andbC ltnNge (leq_trans (p_rankS q (subsetT _))) //.
-rewrite -(rank_Sylow sylHq_G) (rank_Sylow sylHq_CS) -(rank_Sylow sylQ_CS).
-by rewrite (leq_trans (rankS sQX)) // -abelian_rank1_cyclic ?cyclic_abelian.
-Qed.
-
-(* This is B & G, Corollary 15.5. *)
-(* We have changed the condition K != 1 to the equivalent M \in 'M_'P, as *)
-(* avoids a spurrious quantification on K. *)
-(* The text is quite misleading here, since Corollary 15.3(a) is needed for *)
-(* bith the nilpotent and the non-nilpotent case -- indeed, it is not really *)
-(* needed in the non-nilpotent case! *)
-Corollary Fitting_structure M (H := M`_\F) (Y := 'O_\sigma(M)^'('F(M))) :
- M \in 'M ->
- [/\ (*a*) cyclic Y /\ \tau2(M).-group Y,
- (*b*) [/\ M^`(2) \subset 'F(M),
- H \* 'C_M(H) = 'F(M)
- & 'F(M`_\sigma) \x Y = 'F(M)],
- (*c*) H \subset M^`(1) /\ nilpotent (M^`(1) / H)
- & (*d*) M \in 'M_'P -> 'F(M) \subset M^`(1)].
-Proof.
-move=> maxM; have nilF := Fitting_nil M.
-have sHF: H \subset 'F(M) := Fcore_sub_Fitting M.
-have nsMsM: M`_\sigma <| M := pcore_normal _ _; have [sMsM nMsM] := andP nsMsM.
-have sMs: \sigma(M).-group M`_\sigma := pcore_pgroup _ _.
-have nsFM: 'F(M) <| M := Fitting_normal M; have [sFM nFM] := andP nsFM.
-have sYF: Y \subset 'F(M) := pcore_sub _ _; have sYM := subset_trans sYF sFM.
-have defF: 'F(M`_\sigma) \x Y = 'F(M).
- rewrite -(nilpotent_pcoreC \sigma(M) nilF); congr (_ \x _).
- apply/eqP; rewrite eqEsubset pcore_max ?(pgroupS (Fitting_sub _)) //=.
- rewrite Fitting_max ?(nilpotentS (pcore_sub _ _)) //=.
- by rewrite -(pcore_setI_normal _ nsFM) norm_normalI ?(subset_trans sMsM).
- rewrite /normal (char_norm_trans (Fitting_char _)) ?(subset_trans sFM) //.
- by rewrite Fitting_max ?Fitting_nil ?gFnormal_trans.
-have [[ntH sHMs sMsM' _] nnil_struct] := Fcore_structure maxM.
-have hallH: \pi(H).-Hall(M`_\sigma) H := pHall_subl sHMs sMsM (Fcore_Hall M).
-have [X [_ cycX t2X defCH]] := cent_Hall_sigma_sdprod maxM hallH ntH.
-have hallX: \sigma(M)^'.-Hall('C_M(H)) X.
- have [_ mulCsH_X _ _] := sdprodP defCH.
- have [|//] := coprime_mulpG_Hall mulCsH_X (pgroupS (subsetIl _ _) sMs).
- by apply: sub_pgroup t2X => p /andP[].
-have sYX: Y \subset X.
- rewrite (normal_sub_max_pgroup (Hall_max hallX)) ?pcore_pgroup //.
- rewrite /normal gFnorm_trans ?subIset ?nFM //= -/Y andbT.
- have [_ _ cFsY _] := dprodP defF.
- rewrite subsetI sYM (sub_nilpotent_cent2 nilF) //= -/Y -/H.
- exact: pnat_coprime (pgroupS sHMs sMs) (pcore_pgroup _ _).
-have [cycY t2Y]: cyclic Y /\ \tau2(M).-group Y.
- by rewrite (cyclicS sYX cycX) (pgroupS sYX t2X).
-have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
-have [U complU] := ex_kappa_compl maxM hallK.
-have [[defM _ cM'M'b] defM' _ _ _] := kappa_structure maxM complU.
-have d_holds: M \in 'M_'P -> 'F(M) \subset M^`(1).
- rewrite inE maxM andbT -(trivg_kappa maxM hallK) => ntK.
- rewrite -(dprodW defF) mulG_subG gFsub_trans //= -/Y.
- have{defM'} [[defM' _] nsM'M] := (defM' ntK, der_normal 1 M).
- have hallM': \kappa(M)^'.-Hall(M) M^`(1).
- by apply/(sdprod_normal_pHallP nsM'M hallK); rewrite /= -defM'.
- rewrite (sub_normal_Hall hallM') ?(sub_pgroup _ t2Y) // => p /andP[_].
- by apply: contraL => /rank_kappa->.
-have defF_H: 'C_M(H) \subset 'F(M) -> H \* 'C_M(H) = 'F(M).
- move=> sCHF; apply/eqP; rewrite cprodE ?subsetIr // eqEsubset ?mul_subG //=.
- have hallH_F := pHall_subl sHF sFM (Fcore_Hall M).
- have nsHF := normalS sHF sFM (Fcore_normal M).
- have /dprodP[_] := nilpotent_pcoreC \pi(H) nilF.
- rewrite (normal_Hall_pcore hallH_F nsHF) /= -/H => defF_H cHFH' _.
- by rewrite -defF_H mulgS // subsetI gFsub_trans.
-have [eqHMs | neqHMs] := eqVneq H M`_\sigma.
- split=> //; [split=> // | by rewrite eqHMs abelian_nil].
- by rewrite (subset_trans _ sHF) //= eqHMs der1_min ?comm_subG.
- rewrite defF_H // -(sdprodW defCH) -eqHMs mulG_subG subIset ?sHF //=.
- rewrite Fitting_max ?abelian_nil ?cyclic_abelian //.
- rewrite -(normal_Hall_pcore hallX) ?gFnormal_trans //.
- by rewrite norm_normalI // eqHMs norms_cent.
- move: defCH; rewrite -dprodEsd; first by case/dprod_normal2.
- by rewrite -eqHMs (centsS (subsetIl _ _)); case/subsetIP: (pHall_sub hallX).
-pose q := #|'C_(M`_\sigma)(K)|; pose Q := 'O_q(M).
-have [D hallD] := Hall_exists q^' (solvableS sMsM (mmax_sol maxM)).
-case/(_ K D): nnil_struct => //=; rewrite -/H -/q -/Q.
-move=> [_ _ defMs] [_ _ piHq _] [sylQ nilD _] _ [_ -> [defF_Q _ _] _].
-have sQH: Q \subset H by rewrite -[Q](p_core_Fcore piHq) pcore_sub.
-split=> //; rewrite -?{}defMs; split=> //.
- by rewrite defF_H // -defF_Q joingC sub_gen // subsetU ?setIS ?centS.
-have sQMs := subset_trans sQH sHMs; have sylQ_Ms := pHall_subl sQMs sMsM sylQ.
-have nsQ_Ms: Q <| M`_\sigma := normalS sQMs sMsM (pcore_normal _ _).
-have defMs: Q ><| D = M`_\sigma := sdprod_normal_p'HallP nsQ_Ms hallD sylQ_Ms.
-have [_ <- _ _] := sdprodP defMs; rewrite -quotientMidl mulgA (mulGSid sQH).
-by rewrite quotientMidl quotient_nil.
-Qed.
-
-(* This is B & G, Corollary 15.6. *)
-(* Note that the proof of the F-core noncyclicity given in the text only *)
-(* applies to the nilpotent case, and we need to use a different assertion of *)
-(* 15.2 if Msigma is not nilpotent. *)
-Corollary Ptype_cyclics M K (Ks := 'C_(M`_\sigma)(K)) :
- M \in 'M_'P -> \kappa(M).-Hall(M) K ->
- [/\ Ks != 1, cyclic Ks, Ks \subset M^`(2), Ks \subset M`_\F
- & ~~ cyclic M`_\F].
-Proof.
-move=> PmaxM hallK; have [ntK maxM] := setIdP PmaxM.
-rewrite -(trivg_kappa maxM hallK) in ntK.
-have [_ _ [ntKs _] _ _] := Ptype_structure PmaxM hallK.
-have [_ _ [_ _ _ [cycZ _ _ _ _] [_ _ _ defM]]] := Ptype_embedding PmaxM hallK.
-have{cycZ} cycKs: cyclic Ks := cyclicS (joing_subr _ _) cycZ.
-have solM': solvable M^`(1) := solvableS (der_sub 1 M) (mmax_sol maxM).
-have sMsM' := Msigma_der1 maxM.
-have{defM} sKsM'': Ks \subset M^`(2).
- have coM'K: coprime #|M^`(1)| #|K|.
- by rewrite (coprime_sdprod_Hall_r defM) (pHall_Hall hallK).
- have [_] := coprime_der1_sdprod defM coM'K solM' (subxx _).
- exact: subset_trans (setSI _ sMsM').
-have [eqMFs | neqMFs] := eqVneq M`_\F M`_\sigma.
- split=> //; rewrite eqMFs ?subsetIl //; apply: contra ntKs => cycMs.
- rewrite -subG1 (subset_trans sKsM'') // (sameP trivgP derG1P) /= -derg1.
- have cycF: cyclic 'F(M).
- have [[cycY _] [_ _ defF] _ _] := Fitting_structure maxM.
- have [[x defMs] [y defY]] := (cyclicP cycMs, cyclicP cycY).
- rewrite defMs (nilpotent_Fitting (abelian_nil (cycle_abelian _))) in defF.
- have [_ mulXY cxy _] := dprodP defF.
- rewrite -mulXY defY -cycleM ?cycle_cyclic //.
- by apply/cent1P; rewrite -cycle_subG sub_cent1 -cycle_subG -defY.
- by rewrite /order -defMs -defY coprime_pcoreC.
- apply: abelianS (cyclic_abelian cycF).
- apply: subset_trans (cent_sub_Fitting (mmax_sol maxM)).
- rewrite der1_min ?normsI ?normG ?norms_cent ?gFnorm //=.
- rewrite -ker_conj_aut (isog_abelian (first_isog_loc _ _)) ?gFnorm //=.
- exact: abelianS (Aut_conj_aut _ _) (Aut_cyclic_abelian cycF).
-have [D hallD] := Hall_exists #|Ks|^' (solvableS sMsM' solM').
-have [_ /(_ K D)[]//=] := Fcore_structure maxM; rewrite -/Ks.
-set q := #|Ks|; set Q := 'O_q(M) => _ [_ q_pr piMFq bMq] [sylQ _ _] _ _.
-have sQMF: Q \subset M`_\F by rewrite -[Q]p_core_Fcore ?pcore_sub.
-have qKs: q.-group Ks := pnat_id q_pr.
-have sKsM := subset_trans sKsM'' (der_sub 2 M).
-split=> //; first by apply: subset_trans sQMF; rewrite (sub_Hall_pcore sylQ).
-apply: contraL (beta_sub_alpha bMq) => /(cyclicS sQMF)cycQ; rewrite -leqNgt.
-by rewrite leqW // -(rank_Sylow sylQ) -abelian_rank1_cyclic ?cyclic_abelian.
-Qed.
-
-(* This is B & G, Theorem 15.7. *)
-(* We had to change the statement of the Theorem, because the first equality *)
-(* of part (c) does not appear to be valid: if M is of type F, we know very *)
-(* little of the action E1 on the Sylow subgroups of E2, and so E2 might have *)
-(* a Sylow subgroup that meets F(M) but is also centralised by E1 and hence *)
-(* intesects M' trivially; luckily, only the inclusion M' \subset F(M) seems *)
-(* to be needed in the sequel. *)
-(* We have also restricted the quantification on the Ei to part (c), and *)
-(* factored and simplified some of the assertions of parts (e2) and (e3); it *)
-(* appears they could perhaps be simplified futher, since the assertions on *)
-(* Op(H) and Op'(H) do not appear to be used in the Peterfalvi revision of *)
-(* the character theory part of the proof. *)
-(* Proof notes: we had to correct/complete several arguments of the B & G *)
-(* text. The use of 12.6(d) for parts (c) and (d), p. 120, l. 5 from the *)
-(* bottom, is inapropriate as tau2 could be empty. The assertion X1 != Z0 on *)
-(* l. 5, p. 121 needs to be strengthened to ~~ (X1 \subset Z0) in order to *)
-(* prove that #|Z0| is prime -- only then are the assertions equivalent. The *)
-(* use of Lemma 10.13(b), l. 7, p. 121, requires that B be maximal in G, not *)
-(* only in P as is stated l. 6; proving the stronger assertion requires using *)
-(* Corollary 15.3(b), which the text does not mention. The regularity *)
-(* property stated l. 11-13 is too weak to be used in the type P1 case -- the *)
-(* regularity assumption need to be restricted to a subgroup of prime order. *)
-(* Finally, the cyclicity of Z(H) is not actually needed in the proof. *)
-Theorem nonTI_Fitting_structure M g (H := (M`_\F)%G) :
- let X := ('F(M) :&: 'F(M) :^ g)%G in
- M \in 'M -> g \notin M -> X :!=: 1 ->
- [/\ (*a*) M \in 'M_'F :|: 'M_'P1 /\ H :=: M`_\sigma,
- (*b*) X \subset H /\ cyclic X,
- (*c*) M^`(1) \subset 'F(M) /\ M`_\sigma \x 'O_\sigma(M)^'('F(M)) = 'F(M),
- (*d*) forall E E1 E2 E3, sigma_complement M E E1 E2 E3 ->
- [/\ E3 :=: 1, E2 <| E, E / E2 \isog E1 & cyclic (E / E2)]
- & (*e*) (*1*) [/\ M \in 'M_'F, abelian H & 'r(H) = 2]
- \/ let p := #|X| in [/\ prime p, ~~ abelian 'O_p(H), cyclic 'O_p^'(H)
- & (*2*) {in \pi(H), forall q, exponent (M / H) %| q.-1}
- \/ (*3*) [/\ #|'O_p(H)| = (p ^ 3)%N, M \in 'M_'P1 & #|M / H| %| p.+1]
- ]].
-Proof.
-move=> X maxM notMg ntX; have nilH: nilpotent H := Fcore_nil M.
-have /andP[sHM nHM]: H <| M := Fcore_normal M.
-have [[cycY t2Y] [_ _ defF] _ _] := Fitting_structure maxM.
-set Y := 'O_\sigma(M)^'('F(M)) in cycY t2Y defF *.
-have not_cycMp: {in \pi(X), forall p, ~~ cyclic 'O_p(M)}.
- move=> p; rewrite mem_primes => /and3P[p_pr _ p_dv_X].
- apply: contra notMg => cycMp.
- have hallMp := nilpotent_pcore_Hall p (Fitting_nil M).
- have{cycMp} defNx1: {in 'F(M), forall x1, #[x1] = p -> 'N(<[x1]>) = M}.
- move=> x1; rewrite /order -cycle_subG => sX1F oX1.
- rewrite (mmax_normal maxM) //; last by rewrite -cardG_gt1 oX1 prime_gt1.
- rewrite (char_normal_trans _ (pcore_normal p M)) ?sub_cyclic_char //=.
- by rewrite -p_core_Fitting (sub_Hall_pcore hallMp) // /pgroup oX1 pnat_id.
- have [x1 Xx1 ox1] := Cauchy p_pr p_dv_X; have [Fx1 Fgx1] := setIP Xx1.
- rewrite -(norm_mmax maxM) inE -{1}(defNx1 (x1 ^ g^-1)) -?mem_conjg ?orderJ //.
- by rewrite cycleJ normJ actKV -(defNx1 x1).
-have{cycY} sX: \sigma(M).-group X.
- apply: sub_pgroup (pgroup_pi X) => p piXp.
- apply: contraR (not_cycMp p piXp) => s'p; rewrite -p_core_Fitting.
- by apply: cyclicS (sub_pcore _ _) cycY => p1; move/eqnP->.
-have sXMs: X \subset M`_\sigma.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxM)) // subIset ?Fitting_sub.
-have E1X_facts p X1 (C1 := 'C_H(X1)%G):
- X1 \in 'E_p^1(X) -> [/\ C1 \notin 'U, 'r(C1) <= 2 & abelian C1].
-- move=> EpX1; have [sX1X /andP[pX1 _] _] := pnElemP EpX1.
- have piXp: p \in \pi(X) by rewrite -p_rank_gt0; apply/p_rank_geP; exists X1.
- have not_sCX1M: ~~ ('C(X1) \subset M).
- have [[sX1F sX1Fg] sFM] := (subsetIP sX1X, Fitting_sub M).
- apply: contra notMg => sCX1M; rewrite -groupV.
- have [trCX1 _ _] := sigma_group_trans maxM (pnatPpi sX piXp) pX1.
- have [||c cX1c] := trCX1 g^-1; rewrite ?(subset_trans _ sFM) ?sub_conjgV //.
- by case=> m Mm ->; rewrite groupM // (subsetP sCX1M).
- have ltCX1_G: 'C(X1) \proper G := mFT_cent_proper (nt_pnElem EpX1 isT).
- have ltC1G: C1 \proper G := sub_proper_trans (subsetIr H _) ltCX1_G.
- have{ltCX1_G} nonuniqC1: C1 \notin 'U.
- have sC1M: C1 \subset M by rewrite subIset ?Fcore_sub.
- apply: contra not_sCX1M => uniqC1.
- by rewrite (sub_uniq_mmax (def_uniq_mmax uniqC1 maxM sC1M)) ?subsetIr.
- split=> //; first by rewrite leqNgt (contra (rank3_Uniqueness _)).
- have sC1H: C1 \subset H := subsetIl _ _.
- have dprodC1: 'F(C1) = C1 := nilpotent_Fitting (nilpotentS sC1H nilH).
- apply/center_idP; rewrite -{2}dprodC1 -(center_bigdprod dprodC1).
- apply: eq_bigr => r _; apply/center_idP; apply: contraR nonuniqC1.
- move/(nonabelian_Uniqueness (pcore_pgroup _ _)).
- exact: uniq_mmaxS (pcore_sub _ _) ltC1G.
-pose p := pdiv #|X|; have piXp: p \in \pi(X) by rewrite pi_pdiv cardG_gt1.
-have /p_rank_geP[X1 EpX1]: 0 < 'r_p(X) by rewrite p_rank_gt0.
-have [sMp ntX1] := (pnatPpi sX piXp, nt_pnElem EpX1 isT).
-have [p_pr oX1] := (pnElem_prime EpX1, card_pnElem EpX1 : #|X1| = p).
-have [sX1X abelX1 dimX1] := pnElemP EpX1; have [pX1 _] := andP abelX1.
-have [nonuniqC1 rC1 cC1C1] := E1X_facts p X1 EpX1.
-have [cycX b'p]: cyclic X /\ p \in \beta(M)^'.
- have [E hallE] := ex_sigma_compl maxM.
- have [_ _] := sigma_compl_embedding maxM hallE.
- case/(_ g notMg); set X2 := _ :&: _ => cycX2 b'X2 _.
- have sXMg: X \subset M :^ g by rewrite subIset // conjSg Fitting_sub orbT.
- have{sXMg} sXX2: X \subset X2 by rewrite subsetI sXMs.
- by rewrite (pnatPpi b'X2 (piSg sXX2 piXp)) (cyclicS sXX2).
-have b'H: \beta(M)^'.-group H.
- apply: sub_pgroup (pgroup_pi _) => r piHr; have [-> // | p'r] := eqVneq r p.
- apply/existsP; exists 'O_r(M)%G; rewrite /= Fcore_pcore_Sylow // negbK.
- apply/implyP; rewrite ltnNge -rank_pgroup ?pcore_pgroup ?(leq_trans _ rC1) //.
- rewrite rankS // subsetI /= -{1}(p_core_Fcore piHr) pcore_sub //.
- rewrite -p_core_Fitting (sub_nilpotent_cent2 (Fitting_nil M)) ?pcore_sub //.
- exact: subset_trans sX1X (subsetIl _ _).
- exact: pnat_coprime pX1 (pi_pgroup (pcore_pgroup r _) _).
-have [K hallK] := Hall_exists \kappa(M) (mmax_sol maxM).
-have [sKM kK _] := and3P hallK; have s'K := sub_pgroup (@kappa_sigma' _ M) kK.
-have [U complU] := ex_kappa_compl maxM hallK.
-have [[defM cycK _] defM' _ _ exU0] := kappa_structure maxM complU.
-have{b'p} FP1maxM: M \in 'M_'F :|: 'M_'P1.
- apply: contraR b'p; rewrite inE /=; case/norP=> notFmaxF notP1maxF.
- have PmaxM: M \in 'M_'P by apply/setDP.
- by have [_ _ _ _ [| <- //]] := Ptype_structure PmaxM hallK; apply/setDP.
-have defH: H :=: M`_\sigma.
- apply/eqP; apply/idPn=> neqHMs; pose q := #|'C_(M`_\sigma)(K)|.
- have solMs: solvable M`_\sigma := solvableS (pcore_sub _ _) (mmax_sol maxM).
- have [D hallD] := Hall_exists q^' solMs.
- have [_ /(_ K D)[] // _ [_ _ piHq /idPn[]]] := Fcore_structure maxM.
- exact: pnatPpi b'H piHq.
-have{sXMs} sXH: X \subset H by rewrite defH.
-have{b'H} sM'F: M^`(1) \subset 'F(M).
- rewrite Fitting_max ?der_normal // (isog_nil (quotient1_isog _)).
- suffices <-: M`_\beta = 1 by apply: Mbeta_quo_nil.
- apply/eqP; rewrite trivg_card1 (card_Hall (Mbeta_Hall maxM)).
- rewrite -(partn_part _ (beta_sub_sigma maxM)) -(card_Hall (Msigma_Hall maxM)).
- by rewrite /= -defH partG_eq1.
-have{defF} defF: M`_\sigma \x Y = 'F(M).
- by rewrite -defF -defH nilpotent_Fitting.
-split=> // [E E1 E2 E3 complEi | {Y t2Y defF sM'F}].
- have [[sE3E' _] _ [cycE1 _] [_ defE] _]:= sigma_compl_context maxM complEi.
- have [hallE _ _ hallE3 _] := complEi; have [sE3E t3E3 _] := and3P hallE3.
- have E3_1: E3 :=: 1.
- have [sEM s'E _] := and3P hallE; have sE'M' := dergS 1 sEM.
- have sE3F: E3 \subset 'F(M) := subset_trans sE3E' (subset_trans sE'M' sM'F).
- rewrite -(setIidPr sE3F) coprime_TIg // -(dprod_card defF) coprime_mull.
- rewrite (pnat_coprime (pcore_pgroup _ _) (pgroupS sE3E s'E)).
- exact: p'nat_coprime (sub_pgroup (@tau3'2 _ M) t2Y) t3E3.
- have{defE} defE: E2 ><| E1 = E by rewrite -defE E3_1 sdprod1g.
- have [-> _ mulE21 nE21 tiE21] := sdprod_context defE.
- by rewrite -mulE21 quotientMidl quotient_cyclic // isog_sym quotient_isog.
-have{defM'} defM_P1: M \in 'M_'P1 -> H ><| K = M /\ M^`(1) = H.
- move=> P1maxM; have [PmaxM _] := setIdP P1maxM.
- have U1: U :=: 1 by apply/eqP; rewrite (trivg_kappa_compl maxM complU).
- have ntK: K :!=: 1 by rewrite (trivg_kappa maxM hallK); case/setDP: PmaxM.
- by have [<- _] := defM' ntK; rewrite -{1}defM U1 sdprodg1 -defH.
-pose P := 'O_p(H); have sylP: p.-Sylow(H) P := nilpotent_pcore_Hall p nilH.
-have [sPH pP _] := and3P sylP.
-have [cHH | {not_cycMp} not_cHH] := boolP (abelian H); [left | right].
- have [-> | P1maxM] := setUP FP1maxM; last first.
- have [PmaxM _] := setIdP P1maxM.
- have [ntKs _ sKsM'' _ _] := Ptype_cyclics PmaxM hallK.
- case/eqP: (subG1_contra sKsM'' ntKs); apply/derG1P.
- by rewrite /= -derg1; have [_ ->] := defM_P1 P1maxM.
- split=> //; apply/eqP; rewrite eqn_leq (leq_trans _ rC1) //=; last first.
- by rewrite rankS // subsetIidl (centsS sX1X) // (sub_abelian_cent cHH).
- apply: leq_trans (rankS (pcore_sub p _)).
- rewrite ltnNge -abelian_rank1_cyclic ?(abelianS sPH) //=.
- by rewrite p_core_Fcore ?(piSg sXH) ?not_cycMp.
-have sX1P: X1 \subset P by rewrite (sub_Hall_pcore sylP) ?(subset_trans sX1X).
-have [_ mulPHp' cPHp' _] := dprodP (nilpotent_pcoreC p nilH : P \x _ = H).
-have cHp'Hp': abelian 'O_p^'(H).
- by rewrite (abelianS _ cC1C1) // subsetI pcore_sub (centsS sX1P).
-have not_cPP: ~~ abelian P.
- by apply: contra not_cHH => cPP; rewrite -mulPHp' abelianM cPP cHp'Hp'.
-have{E1X_facts} pX: p.-group X.
- apply: sub_pgroup (pgroup_pi _) => q; rewrite -p_rank_gt0.
- case/p_rank_geP=> X2 EqX2; have [_ _ cC2C2] := E1X_facts _ _ EqX2.
- case/pnElemP: EqX2 => sX2X /andP[qX2 _] _; have sX2H := subset_trans sX2X sXH.
- apply: contraR not_cPP => q'p; rewrite (abelianS _ cC2C2) // subsetI sPH.
- by rewrite (sub_nilpotent_cent2 nilH) ?(p'nat_coprime (pi_pgroup qX2 _) pP).
-have sXP: X \subset P by rewrite (sub_Hall_pcore sylP).
-pose Z0 := 'Ohm_1('Z(P)); have sZ0ZP: Z0 \subset 'Z(P) := Ohm_sub 1 _.
-have{sZ0ZP} [sZ0P cPZ0] := subsetIP sZ0ZP.
-have not_sX1Z0: ~~ (X1 \subset Z0).
- apply: contra not_cPP => sX1Z0; apply: abelianS cC1C1.
- by rewrite subsetI sPH (centsS sX1Z0) // centsC.
-pose B := X1 <*> Z0; have sBP: B \subset P by rewrite join_subG sX1P.
-have defB: X1 \x Z0 = B by rewrite dprodEY ?prime_TIg ?oX1 ?(centsS sX1P).
-have pZP: p.-group 'Z(P) := pgroupS (center_sub _) pP.
-have abelZ0: p.-abelem Z0 by rewrite Ohm1_abelem ?center_abelian.
-have{abelZ0} abelB: p.-abelem B by rewrite (dprod_abelem _ defB) abelX1.
-have sylP_Ms: p.-Sylow(M`_\sigma) P by rewrite -defH.
-have sylP_G: p.-Sylow(G) P := subHall_Sylow (Msigma_Hall_G maxM) sMp sylP_Ms.
-have max_rB A: p.-abelem A -> B \subset A -> 'r_p(A) <= 2.
- move=> abelA /joing_subP[sX1A _]; have [pA cAA _] := and3P abelA.
- suffices [a [nX1a sAaP]]: exists a, a \in 'N(X1) /\ A :^ a \subset P.
- rewrite -rank_pgroup // -(rankJ _ a) (leq_trans _ rC1) ?rankS //= subsetI.
- by rewrite -(normP nX1a) centJ conjSg (subset_trans sAaP) ?(centsS sX1A).
- have [a _ sAaP] := Sylow_Jsub sylP_G (subsetT A) pA.
- have [x1 defX1]: exists x1, X1 :=: <[x1]>.
- by apply/cyclicP; rewrite prime_cyclic ?oX1.
- have Px1: x1 \in P by rewrite -cycle_subG -defX1.
- have Px1a: x1 ^ a \in P.
- by rewrite (subsetP sAaP) // memJ_conjg -cycle_subG -defX1.
- have [b nPb def_xb] := sigma_Hall_tame maxM sylP_Ms Px1 Px1a.
- exists (a * b^-1); rewrite !inE !actM !sub_conjgV defX1 /= -!cycleJ def_xb.
- by have{nPb} [_ nPb] := setIP nPb; rewrite (normP nPb).
-have rpB: 'r_p(B) = 2.
- apply/eqP; rewrite eqn_leq max_rB // -(p_rank_dprod p defB).
- rewrite p_rank_abelem ?dimX1 // ltnS p_rank_Ohm1 -rank_pgroup // rank_gt0.
- by rewrite center_nil_eq1 ?(pgroup_nil pP) ?(subG1_contra sXP).
-have oZ0: #|Z0| = p.
- apply/eqP; rewrite -(eqn_pmul2l (cardG_gt0 X1)) (dprod_card defB) oX1.
- by rewrite (card_pgroup (abelem_pgroup abelB)) -p_rank_abelem ?rpB.
-have p2maxElemB: [group of B] \in 'E_p^2(G) :&: 'E*_p(G).
- rewrite !inE subsetT abelB -p_rank_abelem // rpB /=.
- apply/maxgroupP; rewrite !inE subsetT /= -/B; split=> // A.
- case/pElemP=> _ abelA sBA; have [pA _] := andP abelA.
- apply/eqP; rewrite eq_sym eqEcard sBA (card_pgroup pA).
- rewrite (card_pgroup (abelem_pgroup abelB)) -!p_rank_abelem // rpB.
- by rewrite leq_exp2l ?prime_gt1 ?max_rB.
-have{not_sX1Z0} defX: X :=: X1.
- have sX_CPB: X \subset 'C_P(B).
- rewrite centY !subsetI sXP sub_abelian_cent ?cyclic_abelian //=.
- by rewrite centsC (centsS sXP).
- have [C defCPB]: exists C, X1 \x C = 'C_P(B).
- have [_ [C]] := basic_p2maxElem_structure p2maxElemB pP sBP not_cPP.
- case=> _ _ defCPB _; exists C; rewrite defCPB // !inE joing_subl abelX1.
- by rewrite -val_eqE eqEsubset negb_and not_sX1Z0 /= dimX1.
- have defX: X1 \x (C :&: X) = X by rewrite (dprod_modl defCPB) // (setIidPr _).
- by move/eqP: ntX1; case/(cyclic_pgroup_dprod_trivg pX cycX): defX; case.
-have cycHp': cyclic 'O_p^'(H).
- rewrite abelian_rank1_cyclic // leqNgt; apply: contra nonuniqC1 => rHp'.
- apply: (uniq_mmaxS (setIS H (centS sX1P))).
- by rewrite mFT_sol_proper nilpotent_sol // (nilpotentS (subsetIl _ _)).
- apply: cent_uniq_Uniqueness (subsetIr _ _) (leq_trans rHp' (rankS _)).
- exact: nonabelian_Uniqueness pP not_cPP.
- by rewrite subsetI pcore_sub.
-rewrite {1}defX oX1 /= -[M`_\F]/(gval H) -/P; split=> //.
-pose Z q := 'Ohm_1('Z('O_q(H)))%G.
-have charZ q: Z q \char H by rewrite 3?gFchar_trans.
-have{cycHp'} oZ: {in \pi(H), forall q, #|Z q| = q}.
- move=> q piHp; have [-> // | p'q] := eqVneq q p.
- have qHq: q.-group 'O_q(H) := pcore_pgroup q H.
- have sHqHp': 'O_q(H) \subset 'O_p^'(H) by apply: sub_pcore => r /eqnP->.
- rewrite /= (center_idP (abelianS sHqHp' cHp'Hp')).
- apply: Ohm1_cyclic_pgroup_prime (cyclicS sHqHp' cycHp') qHq _.
- by rewrite -rank_gt0 (rank_Sylow (nilpotent_pcore_Hall q nilH)) p_rank_gt0.
-have regZq_dv_q1 A q:
- A \subset 'N(H) -> q \in \pi(H) -> semiregular (Z q) A -> #|A| %| q.-1.
-- move=> nHA piHq regA.
- by rewrite -(oZ q piHq) regular_norm_dvd_pred // (char_norm_trans (charZ q)).
-have [FmaxM | {U complU defM exU0}P1maxM] := setUP FP1maxM.
- left=> q piHq; have K1: K :=: 1 by apply/eqP; rewrite (trivg_kappa maxM).
- have ntU: U :!=: 1 by rewrite (trivg_kappa_compl maxM complU) 2!inE FmaxM.
- rewrite K1 sdprodg1 -defH in defM; have [_ mulHU nHU tiHU] := sdprodP defM.
- rewrite -mulHU quotientMidl -(exponent_isog (quotient_isog nHU tiHU)).
- have [U0 [sU0U <- frobMsU0]] := exU0 ntU; have nHU0 := subset_trans sU0U nHU.
- apply: dvdn_trans (exponent_dvdn U0) _; apply: regZq_dv_q1 => // x U0x.
- apply/trivgP; rewrite -(Frobenius_reg_ker frobMsU0 U0x) setSI //= -defH.
- exact: (char_sub (charZ _)).
-have{defM_P1} [[defM defM'] [PmaxM _]] := (defM_P1 P1maxM, setIdP P1maxM).
-have [_ mulHK nHK tiHK] := sdprodP defM; have p'K := pi'_p'group s'K sMp.
-have coHK: coprime #|H| #|K| by rewrite defH (pnat_coprime (pcore_pgroup _ _)).
-have{coHK} coPK: coprime #|P| #|K| := coprimeSg sPH coHK.
-have oMH: #|M / H| = #|K|.
- by rewrite -mulHK quotientMidl -(card_isog (quotient_isog nHK tiHK)).
-pose Ks := 'C_H(K); have prKs: prime #|Ks|.
- have [Ms _ [_ _ _ _ [_]]] := Ptype_embedding PmaxM hallK.
- by rewrite inE P1maxM -defH; do 2!case.
-have sKsP: Ks \subset P.
- have sKsM'': Ks \subset M^`(2) by rewrite /Ks defH; case/Ptype_cyclics: hallK.
- rewrite (subset_trans sKsM'') 1?der1_min //= -derg1 defM' ?gFnorm //.
- by rewrite -mulPHp' quotientMidl quotient_abelian.
-have oKs: #|Ks| = p.
- apply/eqP; apply: pnatPpi pP (piSg sKsP _).
- by rewrite mem_primes prKs cardG_gt0 dvdnn.
-have [prHK ntKs]: semiprime H K /\ Ks != 1.
- by rewrite /Ks defH; case/Ptype_structure: hallK => // [[_ _ [_ ? _]] _ []].
-have [K_dv_p1 | {regZq_dv_q1}] := altP (@implyP (Ks :==: Z0) (#|K| %| p.-1)).
- left=> q piHq; rewrite (dvdn_trans (exponent_dvdn _)) // oMH.
- have [eqZqKs | neqZqKs] := eqVneq Ks (Z q).
- have def_q: q = p by rewrite -(oZ q piHq) -eqZqKs.
- by rewrite def_q K_dv_p1 // eqZqKs def_q.
- apply: regZq_dv_q1 => // x Kx; rewrite -(setIidPl (char_sub (charZ q))).
- rewrite -setIA prHK {x Kx}// setIC (prime_TIg prKs) //.
- have q_pr: prime q by rewrite mem_primes in piHq; case/and3P: piHq.
- apply: contra neqZqKs => sKsZq; rewrite eqEsubset sKsZq /=.
- by rewrite prime_meetG ?oZ // (setIidPr sKsZq).
-rewrite {Z oZ charZ}negb_imply; case/andP; move/eqP=> defKs not_K_dv_p1.
-have nPK: K \subset 'N(P) by apply: gFnorm_trans.
-have defZP: 'Z(P) = Ks.
- apply/eqP; rewrite eqEsubset andbC {1}defKs Ohm_sub subsetI subIset ?sPH //.
- have nZPK: K \subset 'N('Z(P)) by apply: gFnorm_trans.
- have coZPK: coprime #|'Z(P)| #|K| := coprimeSg (center_sub _) coPK.
- rewrite centsC (coprime_odd_faithful_Ohm1 pZP) ?mFT_odd //.
- by rewrite /= -/Z0 -defKs centsC subsetIr.
-have rPle2: 'r(P) <= 2.
- case/setIP: p2maxElemB; case/pnElemP=> _ _ dimB pmaxB.
- have Ep2B: [group of B] \in 'E_p^2(P) by apply/pnElemP.
- rewrite leqNgt; apply: contra not_K_dv_p1 => rPgt2.
- have tiKcP: 'C_K(P) = 1.
- apply/trivgP/subsetP=> x => /setIP[Kx cPx].
- apply: contraR ntX1 => ntx; rewrite -subG1.
- have [_ _ _ <-] := dprodP defB; rewrite subsetIidl -defKs.
- rewrite -[Ks](prHK x) 1?inE ?ntx // (subset_trans sX1P) //=.
- by rewrite subsetI sPH sub_cent1.
- rewrite (card_isog (quotient1_isog _)) -tiKcP -ker_conj_aut.
- rewrite (card_isog (first_isog_loc _ nPK)) /=.
- set A := _ @* _; have AutA: A \subset Aut P := Aut_conj_aut _ _.
- have solA: solvable A by rewrite morphim_sol ?abelian_sol ?cyclic_abelian.
- have oddA: odd #|A| by rewrite morphim_odd ?mFT_odd.
- have nnP: p.-narrow P.
- apply/implyP=> _; apply/set0Pn; exists [group of B].
- by rewrite inE Ep2B (subsetP (pmaxElemS p (subsetT P))) // inE pmaxB inE.
- have [x defK] := cyclicP cycK; have Kx: x \in K by rewrite defK cycle_id.
- have nPx := subsetP nPK x Kx; rewrite /A defK morphim_cycle //.
- have Axj: conj_aut [group of P] x \in A by apply: mem_morphim.
- have [_ _ -> //] := Aut_narrow pP (mFT_odd _) nnP solA AutA oddA.
- by rewrite morph_p_elt // (mem_p_elt p'K).
-have{rPle2} dimP: logn p #|P| = 3.
- have [S [_ <- _] [C cycC]] := mFT_rank2_Sylow_cprod sylP_G rPle2 not_cPP.
- case=> defP defZS; congr (logn p #|(_ : {set _})|).
- suffices defC: 'Ohm_1(C) = C by rewrite -defC defZS cprod_center_id in defP.
- suffices <-: 'Z(P) = C by rewrite defZP (@Ohm1_id _ p) // prime_abelem.
- have [_ <- _] := cprodP (center_cprod defP).
- by rewrite -defZS (center_idP (cyclic_abelian cycC)) mulSGid ?Ohm_sub.
-have oP: #|P| = (p ^ 1.*2.+1)%N by rewrite (card_pgroup pP) dimP.
-right; split; rewrite // {}oMH.
-have esP: extraspecial P by apply: (p3group_extraspecial pP); rewrite ?dimP.
-have defPK: P ><| K = P <*> K by rewrite sdprodEY // coprime_TIg.
-have copK: coprime p #|K| by rewrite -oX1 (coprimeSg sX1P).
-have [x|] := repr_extraspecial_prime_sdprod_cycle pP esP defPK cycK oP copK.
- move/prHK=> defCHx /=; rewrite /= -/P -{1}(setIidPl sPH) -setIA defCHx -/Ks.
- by rewrite -defZP setIA setIid.
-by rewrite addn1 subn1 (negPf not_K_dv_p1) orbF.
-Qed.
-
-(* A subset of the above, that does not require the non-TI witness. *)
-Lemma nonTI_Fitting_facts M :
- M \in 'M -> ~~ normedTI 'F(M)^# G M ->
- [/\ M \in 'M_'F :|: 'M_'P1, M`_\F = M`_\sigma & M^`(1) \subset 'F(M)].
-Proof.
-move=> maxM nonTI; suff: [exists (y | y \notin M), 'F(M) :&: 'F(M) :^ y != 1].
- by case/exists_inP=> y notMy /nonTI_Fitting_structure[] // [-> dMF] _ [].
-rewrite -negb_forall_in; apply: contra nonTI => /forall_inP tiF.
-apply/normedTI_P; rewrite normD1 setTI gFnorm setD_eq0 subG1.
-split=> // [|g _]; first by rewrite (trivg_Fitting (mmax_sol maxM)) mmax_neq1.
-by apply: contraR => /tiF; rewrite -setI_eq0 conjD1g -setDIl setD_eq0 subG1.
-Qed.
-
-(* This is B & G, Theorem 15.8, due to Feit and Thompson (1991). *)
-(* We handle the non-structural step on l. 5, p. 122 by choosing A not to be *)
-(* a q-group, if possible, so that when it turns out to be we know q is the *)
-(* only prime in tau2(H). Since this uniqueness does not appear to be used *)
-(* later we could also eliminate this complication. *)
-(* We also avoid the circularity in proving that A is a q-group and that Q *)
-(* is non-abelian by deriving that Q is in U from 14.2(e) rather than 12.13. *)
-Theorem tau2_P2type_signalizer M Mstar U K r R H (q := #|K|) :
- M \in 'M_'P2 -> kappa_complement M U K -> Mstar \in 'M('C(K)) ->
- r.-Sylow(U) R -> H \in 'M('N(R)) -> ~~ \tau2(H)^'.-group H ->
- [/\ prime q, \tau2(H) =i (q : nat_pred) & \tau2(M)^'.-group M].
-Proof.
-move: Mstar => L P2maxM complU maxCK_L sylR maxNR_H not_t2'H.
-have [[PmaxM notP1maxM] [hallU hallK _]] := (setDP P2maxM, complU).
-have q_pr: prime q by have [_ _ _ _ []] := Ptype_structure PmaxM hallK.
-have [[maxH _] [maxM _]] := (setIdP maxNR_H, setDP PmaxM).
-have [maxL sCKL] := setIdP maxCK_L; have hallLs := Msigma_Hall maxL.
-have [_ sUHs] := P2type_signalizer P2maxM complU maxCK_L sylR maxNR_H.
-set D := H :&: L => defUK [_ sKFD hallD] {r R sylR maxNR_H}.
-set uniq_q := _ =i _.
-have{not_t2'H} [q1 t2Hq neq_q]: exists2 q1, q1 \in \tau2(H) & q1 = q -> uniq_q.
- move: not_t2'H; rewrite negb_and cardG_gt0 all_predC negbK /= has_filter.
- set s := filter _ _ => nts.
- have mem_s: s =i \tau2(H).
- move=> q1; rewrite mem_filter; apply: andb_idr => /= t2q1.
- by rewrite (partition_pi_mmax maxH) t2q1 !orbT.
- have [all_q | ] := altP (@allP _ (pred1 q) s); last first.
- by case/allPn=> q1; rewrite mem_s=> t2q1; move/eqnP=> ne_q1q; exists q1.
- have s_q1: head q s \in s by case: (s) nts => // q1 s' _; apply: predU1l.
- exists (head q s) => [|def_q q1]; rewrite -mem_s //.
- by apply/idP/idP; [apply: all_q | move/eqnP->; rewrite -def_q].
-have [A /= Eq2A Eq2A_H] := ex_tau2Elem hallD t2Hq; rewrite -/D in Eq2A.
-have [b'q qmaxA]: q1 \notin \beta(G) /\ A \in 'E*_q1(G).
- by have [-> ->] := tau2_not_beta maxH t2Hq.
-have [sDH s'HD _] := and3P hallD.
-have [sAH abelA dimA] := pnElemP Eq2A_H; have [qA _] := andP abelA.
-have [[nsAD _] _ _ _] := tau2_compl_context maxH hallD t2Hq Eq2A.
-have cKA: A \subset 'C(K).
- have sFD: 'F(D) \subset D := Fitting_sub _; have sFH := subset_trans sFD sDH.
- have cFF: abelian 'F(D).
- exact: sigma'_nil_abelian maxH sFH (pgroupS sFD s'HD) (Fitting_nil _).
- exact: sub_abelian_cent2 cFF (Fitting_max nsAD (pgroup_nil qA)) sKFD.
-have sAL: A \subset L := subset_trans cKA sCKL.
-pose Ks := 'C_(M`_\sigma)(K).
-have [PmaxL hallKs defK]:
- [/\ L \in 'M_'P, \kappa(L).-Hall(L) Ks & 'C_(L`_\sigma)(Ks) = K].
-- have [L1 [? _] [defL1 [? _] [? _] _ _]] := Ptype_embedding PmaxM hallK.
- suffices ->: L = L1 by []; apply/set1P; rewrite defL1 // in maxCK_L.
- by apply/nElemP; exists q; rewrite p1ElemE // !inE subxx eqxx.
-have sKLs: K \subset L`_\sigma by rewrite -defK subsetIl.
-have sLq: q \in \sigma(L).
- by rewrite -pnatE // -pgroupE (pgroupS sKLs) ?pcore_pgroup.
-have sLq1: q1 \in \sigma(L).
- apply: contraLR sLq => s'Lq1; rewrite -negnK negbK /= -pnatE // -pgroupE.
- have s'LA: \sigma(L)^'.-group A by apply: pi_pgroup qA _.
- have [E hallE sAE] := Hall_superset (mmax_sol maxL) sAL s'LA.
- have EqA_E: A \in 'E_q1^2(E) by apply/pnElemP.
- have [[sEL s'E _] t2Lq1] := (and3P hallE, sigma'2Elem_tau2 maxL hallE EqA_E).
- have [_ [sCAE _ _] _ _] := tau2_compl_context maxL hallE t2Lq1 EqA_E.
- by apply: pgroupS (subset_trans _ sCAE) s'E; rewrite centsC.
-have sALs: A \subset L`_\sigma by rewrite sub_Hall_pcore ?(pi_pgroup qA).
-have solL: solvable L`_\sigma := solvableS (pcore_sub _ _) (mmax_sol maxL).
-pose Q := 'O_q(L)%G; have{solL} [Ds hallDs] := Hall_exists q^' solL.
-have sQFL: Q \subset 'F(L) by rewrite -[gval Q]p_core_Fitting pcore_sub.
-have [sAFL sylQ]: A \subset 'F(L) /\ q.-Sylow(L) Q.
- have [defLF | neqLF] := eqVneq L`_\F L`_\sigma.
- split; first by rewrite (subset_trans sALs) // -defLF Fcore_sub_Fitting.
- by rewrite Fcore_pcore_Sylow // defLF mem_primes q_pr cardG_gt0 cardSg.
- have [_ /(_ _ Ds hallKs neqLF)] := Fcore_structure maxL.
- rewrite /= defK -/q -/Q; case=> // _ _ [-> _ nsQ0L] _ [_ _ [_ _ <-] _].
- rewrite subsetI sALs sub_astabQ quotient_cents // (subset_trans sAL) //.
- exact: normal_norm nsQ0L.
-have{sLq1} neqHL: H :!=: L.
- by apply: contraTneq t2Hq => ->; rewrite negb_and negbK /= sLq1.
-have def_q1: q1 = q.
- have uniqQ: Q \in 'U.
- have [_ _ _ [_ uniqQ _] _] := Ptype_structure PmaxL hallKs.
- apply/uniq_mmaxP; exists L; case/uniqQ: sylQ => //=; rewrite defK.
- by rewrite pi_of_prime ?inE.
- apply: contraNeq neqHL => q'q1.
- rewrite (eq_uniq_mmax (def_uniq_mmax _ maxL sAL) maxH sAH) //.
- rewrite (cent_uniq_Uniqueness uniqQ) ?(rank_abelem abelA) ?dimA //.
- rewrite (sub_nilpotent_cent2 (Fitting_nil L)) //.
- exact: pnat_coprime (pcore_pgroup _ _) (pi_pgroup qA _).
-split=> //; first exact: neq_q.
-rewrite {q1 neq_q}def_q1 in qA Eq2A Eq2A_H t2Hq abelA dimA qmaxA b'q.
-have{b'q} b'q: q \notin \beta(L) by rewrite -predI_sigma_beta // inE /= sLq.
-have P1maxL: L \in 'M_'P1.
- apply: contraR b'q => notP1maxL.
- by have [_ _ _ _ [|<- //]] := Ptype_structure PmaxL hallKs; apply/setDP.
-have nilLs: nilpotent L`_\sigma.
- rewrite (sameP (Fcore_eq_Msigma maxL) eqP); apply: contraR b'q => neqLF.
- have [_ /(_ _ Ds hallKs neqLF)] := Fcore_structure maxL.
- by rewrite /= defK -/q -/Q; case=> // _ [_ _ _ ->] _ _ _.
-have defL': L^`(1) = L`_\sigma.
- have [Us complUs] := ex_kappa_compl maxL hallKs.
- have [_ [|<- _ _ _ _]] := kappa_structure maxL complUs.
- by rewrite (trivg_kappa maxL hallKs) //; case/setDP: PmaxL.
- suffices ->: Us :=: 1 by rewrite sdprodg1.
- by apply/eqP; rewrite (trivg_kappa_compl maxL complUs).
-have [ntK sKLs']: K :!=: 1 /\ K \subset L`_\sigma^`(1).
- by rewrite -defL' -defK; case/Ptype_cyclics: hallKs.
-have [sQL qQ _] := and3P sylQ.
-have not_cQQ: ~~ abelian Q.
- have sKL: K \subset L := subset_trans sKLs (pcore_sub _ _).
- have sKQ: K \subset Q by rewrite (sub_Hall_pcore sylQ) /pgroup ?pnat_id.
- have sQLs: Q \subset L`_\sigma by rewrite sub_Hall_pcore ?(pi_pgroup qQ).
- have defLs: 'O_q^'(L`_\sigma) * Q = L`_\sigma.
- rewrite -(setIidPl sQLs) pcore_setI_normal ?pcore_normal //.
- by have [_] := dprodP (nilpotent_pcoreC q^' nilLs); rewrite pcoreNK.
- apply: contra ntK => cQQ; rewrite -subG1 /= -(derG1P cQQ) -subsetIidl.
- rewrite -(pprod_focal_coprime defLs) ?subsetIidl ?pcore_normal //.
- by rewrite coprime_sym (coprimeSg sKQ) ?coprime_pcoreC.
-pose X := 'C_A(H`_\sigma)%G.
-have [sXA cHsX]: X \subset A /\ X \subset 'C(H`_\sigma) by apply/subsetIP.
-have{not_cQQ} oX: #|X| = q.
- by have [_ []] := nonabelian_tau2 maxH hallD t2Hq Eq2A qQ not_cQQ.
-have neqXK: X :!=: K.
- apply: contraNneq neqHL => defX; rewrite (eq_mmax maxH maxL) //.
- have [_ <- _ _] := sdprodP (sdprod_sigma maxH hallD).
- by rewrite mulG_subG subsetIr (subset_trans _ sCKL) // centsC -defX.
-have{neqXK sXA} not_sXM: ~~ (X \subset M).
- apply: contra neqXK => sXM; rewrite eqEcard oX leqnn andbT; apply/joing_idPl.
- have [[sKM kK _] cKX] := (and3P hallK, subset_trans sXA cKA).
- apply: sub_pHall hallK _ (joing_subl _ _) _; last by rewrite join_subG sKM.
- by rewrite /= (cent_joinEr cKX) pgroupM {2}/pgroup oX andbb.
-have{not_sXM} not_sCUM: ~~ ('C(U) \subset M).
- exact: contra (subset_trans (centsS sUHs cHsX)) not_sXM.
-apply/pgroupP=> r r_pr _; apply: contra not_sCUM => /= t2Mr.
-have [hallUK _ _ _ _] := kappa_compl_context maxM complU.
-have [[B Er2B _] [sUKM _]] := (ex_tau2Elem hallUK t2Mr, andP hallUK).
-have [[nsBUK _] [sCBUK _ _] _ _ ] := tau2_compl_context maxM hallUK t2Mr Er2B.
-apply: subset_trans (centS _) (subset_trans sCBUK sUKM).
-have [sBUK /andP[rB _] _] := pnElemP Er2B.
-have maxU_UK := Hall_max (pHall_subl (joing_subl _ _) sUKM hallU).
-rewrite (normal_sub_max_pgroup maxU_UK) // (pi_pgroup rB) //.
-apply: contraL t2Mr; rewrite negb_and negbK /= inE /=.
-by case: (r \in _) => //=; move/rank_kappa->.
-Qed.
-
-(* This is B & G, Theorem 15.9, parts (a) and (b), due to D. Sibley and Feit *)
-(* and Thompson, respectively. *)
-(* We have dropped part (c) because it is not used later, and localizing the *)
-(* quantification on r would complicate the proof needlessly. *)
-Theorem nonFtype_signalizer_base M x :
- M \in 'M -> x \in M`_\sigma^# ->
- ~~ ('C[x] \subset M) -> 'N[x] \notin 'M_'F ->
- [/\ (*a*) M \in 'M_'F, 'N[x] \in 'M_'P2
- & (*b*) exists2 E : {group gT}, \sigma(M)^'.-Hall(M) E
- & cyclic (gval E) /\ [Frobenius M = M`_\sigma ><| E]].
-Proof.
-move=> maxM Ms1x not_sCxM notFmaxN; have ell1x := Msigma_ell1 maxM Ms1x.
-have [[ntx Ms_x] [y cxy notMy]] := (setD1P Ms1x, subsetPn not_sCxM).
-have SMxM: M \in 'M_\sigma[x] by rewrite inE maxM cycle_subG.
-have SMxMy: (M :^ y)%G \in 'M_\sigma[x].
- by rewrite inE mmaxJ maxM gen_subG -(normP cxy) /= MsigmaJ conjSg sub1set.
-have neq_MyM: M :^ y != M by rewrite (sameP eqP normP) norm_mmax.
-have SMx_gt1: #|'M_\sigma[x]| > 1.
- by rewrite (cardD1 M) SMxM (cardD1 (M :^ y)%G) inE /= SMxMy neq_MyM.
-have [_ [//|uniqN _ t2Nx]] := FT_signalizer_context ell1x.
-rewrite inE (negPf notFmaxN) /= => P2maxN /(_ M SMxM)[_ st2NsM _ hallMN].
-pose r := pdiv #[x]; have pixr: r \in \pi(#[x]) by rewrite pi_pdiv order_gt1.
-have t2Nr := pnatPpi t2Nx pixr; have sMr := st2NsM r t2Nr.
-have [[PmaxN _] [_ s'N_MN _]] := (setDP P2maxN, and3P hallMN).
-have [K hallK] := Hall_exists \kappa('N[x]) (sigma_compl_sol hallMN).
-have [U hallU] := Hall_exists \kappa('N[x])^' (sigma_compl_sol hallMN).
-have hallK_N := subHall_Hall hallMN (@kappa_sigma' _ _) hallK.
-have [[sKMN kK _] [sUMN k'U _]] := (and3P hallK, and3P hallU).
-have mulUK: U * K = M :&: 'N[x].
- apply/eqP; rewrite eqEcard mulG_subG sUMN sKMN.
- rewrite coprime_cardMg ?(p'nat_coprime k'U) //= mulnC.
- by rewrite (card_Hall hallU) (card_Hall hallK) partnC ?cardG_gt0.
-have complU: kappa_complement 'N[x] U K.
- split=> //; last by rewrite mulUK groupP.
- apply: (subHall_Hall hallMN) => [p|]; first by case/norP.
- rewrite pHallE sUMN /= (card_Hall hallU) eq_sym; apply/eqP.
- apply: eq_in_partn => p piMNp; rewrite inE /= negb_or /=.
- by rewrite [~~ _](pnatPpi s'N_MN).
-have prK: prime #|K| by case/Ptype_structure: hallK_N => // _ _ _ _ [].
-have ntK: K :!=: 1 by rewrite -cardG_gt1 prime_gt1.
-have [maxN _] := setDP PmaxN.
-have [defUK cUU regUK]: [/\ U ><| K = M :&: 'N[x], abelian U & 'C_U(K) = 1].
- have [_ defM _ regUK -> //] := kappa_compl_context maxN complU.
- have [[_ UK _ defUK] _ _ _] := sdprodP defM.
- by rewrite (cent_semiregular regUK) // defUK; case/sdprodP: defUK => _ <-.
-have [[R sylR] [s'Nr rrN]] := (Sylow_exists r (M :&: 'N[x]), andP t2Nr).
-have [[sRMN rR _] sylR_N] := (and3P sylR, subHall_Sylow hallMN s'Nr sylR).
-have [nsUMN _ _ nUK _] := sdprod_context defUK.
-have [[sRM sRN] [sKM _]] := (subsetIP sRMN, subsetIP sKMN).
-have sRU: R \subset U.
- rewrite (sub_normal_Hall hallU nsUMN sRMN) (pi_pgroup rR) //.
- by apply: contraL rrN; move/rank_kappa->.
-have sNRM: 'N(R) \subset M.
- apply: (norm_noncyclic_sigma maxM sMr rR sRM).
- rewrite (odd_pgroup_rank1_cyclic rR) ?mFT_odd //.
- by rewrite (p_rank_Sylow sylR_N) (eqnP rrN).
-have sylR_U := pHall_subl sRU sUMN sylR.
-have maxNRM: M \in 'M('N(R)) by rewrite inE maxM.
-have [L maxCK_L] := mmax_exists (mFT_cent_proper ntK).
-have FmaxM: M \in 'M_'F; last split=> //.
- by have [] := P2type_signalizer P2maxN complU maxCK_L sylR_U maxNRM.
-have nilMs: nilpotent M`_\sigma by rewrite notP1type_Msigma_nil ?FmaxM.
-have sMsF: M`_\sigma \subset 'F(M) by rewrite Fitting_max ?pcore_normal.
-have defR: R :=: 'O_r(U) := nilpotent_Hall_pcore (abelian_nil cUU) sylR_U.
-have nRK: K \subset 'N(R) by rewrite defR gFnorm_trans.
-have ntR: R :!=: 1.
- rewrite -rank_gt0 (rank_Sylow sylR_N) p_rank_gt0.
- by rewrite (partition_pi_mmax maxN) t2Nr !orbT.
-have not_nilRK: ~~ nilpotent (R <*> K).
- apply: contra ntR => nilRK; rewrite -subG1 -regUK subsetI sRU.
- rewrite (sub_nilpotent_cent2 nilRK) ?joing_subl ?joing_subr //.
- by rewrite (coprimegS sRU) ?(pnat_coprime kK).
-have{not_nilRK} not_sKMs: ~~ (K \subset M`_\sigma).
- apply: contra not_nilRK => sKMs; apply: nilpotentS nilMs.
- by rewrite join_subG (sub_Hall_pcore (Msigma_Hall maxM)) // (pi_pgroup rR).
-have s'MK: \sigma(M)^'.-group K.
- rewrite /pgroup pnatE //; apply: contra not_sKMs; rewrite /= -pnatE // => sK.
- by rewrite (sub_Hall_pcore (Msigma_Hall maxM)).
-have [E hallE sKE] := Hall_superset (mmax_sol maxM) sKM s'MK.
-have [[E1 hallE1] [E3 hallE3]] := ex_tau13_compl hallE.
-have [E2 hallE2 complEi] := ex_tau2_compl hallE hallE1 hallE3.
-have [[_ t1E1 _] [sEM _]] := (and3P hallE1, andP hallE).
-have E2_1: E2 :=: 1.
- have [sE2E t2E2 _] := and3P hallE2.
- rewrite -(setIidPl sE2E) coprime_TIg ?(pnat_coprime t2E2 (pgroupS sEM _)) //.
- apply: contraR ntR => not_t2'M.
- have:= tau2_P2type_signalizer P2maxN complU maxCK_L sylR_U maxNRM not_t2'M.
- case=> _ _ t2'N; rewrite -(setIidPl sRN) coprime_TIg //.
- by rewrite (pnat_coprime (pi_pgroup rR t2Nr)).
-have E3_1: E3 :=: 1.
- have ntX: 'F(M) :&: 'F(M) :^ y != 1.
- apply/trivgPn; exists x; rewrite // inE mem_conjg !(subsetP sMsF) //.
- by rewrite /conjg invgK mulgA (cent1P cxy) mulgK.
- have [_ _ _ defE _] := nonTI_Fitting_structure maxM notMy ntX.
- by case/defE: complEi.
-have [cycE defE]: cyclic E /\ E :=: E1.
- have [_ _ [cycE1 _] [<- _] _] := sigma_compl_context maxM complEi.
- by rewrite E2_1 E3_1 !sdprod1g.
-have [ntMs ntE] := (Msigma_neq1 maxM, subG1_contra sKE ntK).
-have defM := sdprod_sigma maxM hallE.
-exists E => //; split=> //; apply/Frobenius_semiregularP=> // z Ez.
-have{Ez} [ntz szE1] := setD1P Ez; rewrite defE -cycle_subG in szE1.
-pose q := pdiv #[z]; have pizq: q \in \pi(#[z]) by rewrite pi_pdiv order_gt1.
-have szM: <[z]> \subset M by rewrite (subset_trans _ sEM) ?defE.
-have [_ k'M] := setIdP FmaxM; have k'q := pnatPpi k'M (piSg szM pizq).
-have t1q := pnatPpi t1E1 (piSg szE1 pizq).
-move: pizq; rewrite -p_rank_gt0 => /p_rank_geP[Z].
-rewrite /= -(setIidPr szM) pnElemI -setIdE => /setIdP[EqZ sZz].
-apply: contraNeq k'q => ntCMsx /=.
-rewrite unlock 3!inE /= t1q; apply/exists_inP; exists Z => //.
-by rewrite (subG1_contra _ ntCMsx) ?setIS //= -cent_cycle centS.
-Qed.
-
-End Section15.
diff --git a/mathcomp/odd_order/BGsection16.v b/mathcomp/odd_order/BGsection16.v
deleted file mode 100644
index ca73c4b..0000000
--- a/mathcomp/odd_order/BGsection16.v
+++ /dev/null
@@ -1,1368 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq div path fintype.
-From mathcomp
-Require Import bigop finset prime fingroup morphism perm automorphism quotient.
-From mathcomp
-Require Import action gproduct gfunctor pgroup cyclic center commutator.
-From mathcomp
-Require Import gseries nilpotent sylow abelian maximal hall frobenius.
-From mathcomp
-Require Import BGsection1 BGsection2 BGsection3 BGsection4 BGsection5.
-From mathcomp
-Require Import BGsection6 BGsection7 BGsection9 BGsection10 BGsection12.
-From mathcomp
-Require Import BGsection13 BGsection14 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. by rewrite [group_set _]fun_if !groupP if_same. 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) //.
- by rewrite (rank_Sylow sylS) leqNgt (contra _ s'p) //; apply: 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 apply/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; apply: 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 => ->; apply: 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: gFnormal_trans 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 => ->; apply: 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 apply/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; apply: (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); [apply/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; apply: 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.
-
-
diff --git a/mathcomp/odd_order/BGsection2.v b/mathcomp/odd_order/BGsection2.v
deleted file mode 100644
index 85b95b2..0000000
--- a/mathcomp/odd_order/BGsection2.v
+++ /dev/null
@@ -1,1161 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div fintype.
-From mathcomp
-Require Import bigop prime binomial finset fingroup morphism perm automorphism.
-From mathcomp
-Require Import quotient action gfunctor commutator gproduct.
-From mathcomp
-Require Import ssralg finalg zmodp cyclic center pgroup gseries nilpotent.
-From mathcomp
-Require Import sylow abelian maximal hall.
-From mathcomp
-Require poly ssrint.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation mxabelem.
-From mathcomp
-Require Import BGsection1.
-
-(******************************************************************************)
-(* This file covers the useful material in B & G, Section 2. This excludes *)
-(* part (c) of Proposition 2.1 and part (b) of Proposition 2.2, which are not *)
-(* actually used in the rest of the proof; also the rest of Proposition 2.1 *)
-(* is already covered by material in file mxrepresentation.v. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Section BGsection2.
-
-Import GroupScope GRing.Theory FinRing.Theory poly.UnityRootTheory ssrint.IntDist.
-Local Open Scope ring_scope.
-
-Implicit Types (F : fieldType) (gT : finGroupType) (p : nat).
-
-(* File mxrepresentation.v covers B & G, Proposition 2.1 as follows: *)
-(* - Proposition 2.1 (a) is covered by Lemmas mx_abs_irr_cent_scalar and *)
-(* cent_mx_scalar_abs_irr. *)
-(* - Proposition 2.2 (b) is our definition of "absolutely irreducible", and *)
-(* is thus covered by cent_mx_scalar_abs_irr and mx_abs_irrP. *)
-(* - Proposition 2.2 (c) is partly covered by the construction in submodule *)
-(* MatrixGenField, which extends the base field with a single element a of *)
-(* K = Hom_FG(M, M), rather than all of K, thus avoiding the use of the *)
-(* Wedderburn theorem on finite division rings (by the primitive element *)
-(* theorem this is actually equivalent). The corresponding representation *)
-(* is built by MatrixGenField.gen_repr. In B & G, Proposition 2.1(c) is *)
-(* only used in case II of the proof of Theorem 3.10, which we greatly *)
-(* simplify by making use of the Wielandt fixpoint formula, following *)
-(* Peterfalvi (Theorem 9.1). In this formalization the limited form of *)
-(* 2.1(c) is used to streamline the proof that groups of odd order are *)
-(* p-stable (B & G, Appendix A.5(c)). *)
-
-(* This is B & G, Proposition 2.2(a), using internal isomorphims (mx_iso). *)
-Proposition mx_irr_prime_index F gT (G H : {group gT}) n M (nsHG : H <| G)
- (rG : mx_representation F G n) (rH := subg_repr rG (normal_sub nsHG)) :
- group_closure_field F gT -> mx_irreducible rG -> cyclic (G / H)%g ->
- mxsimple rH M -> {in G, forall x, mx_iso rH M (M *m rG x)} ->
- mx_irreducible rH.
-Proof.
-move=> closedF irrG /cyclicP[Hx defGH] simM isoM; have [sHG nHG] := andP nsHG.
-have [modM nzM _] := simM; pose E_H := enveloping_algebra_mx rH.
-have absM f: (M *m f <= M)%MS -> {a | (a \in E_H)%MS & M *m a = M *m f}.
- move=> sMf; set rM := submod_repr modM; set E_M := enveloping_algebra_mx rM.
- pose u := mxvec (in_submod M (val_submod 1%:M *m f)) *m pinvmx E_M.
- have EHu: (gring_mx rH u \in E_H)%MS := gring_mxP rH u.
- exists (gring_mx rH u) => //; rewrite -(in_submodK sMf).
- rewrite -(in_submodK (mxmodule_envelop modM EHu _)) //; congr (val_submod _).
- transitivity (in_submod M M *m gring_mx rM u).
- rewrite /gring_mx /= !mulmx_sum_row !linear_sum; apply: eq_bigr => i /= _.
- by rewrite !linearZ /= !rowK !mxvecK -in_submodJ.
- rewrite /gring_mx /= mulmxKpV ?submx_full ?mxvecK //; last first.
- by have/andP[]: mx_absolutely_irreducible rM by apply/closedF/submod_mx_irr.
- rewrite {1}[in_submod]lock in_submodE -mulmxA mulmxA -val_submodE -lock.
- by rewrite mulmxA -in_submodE in_submodK.
-have /morphimP[x nHx Gx defHx]: Hx \in (G / H)%g by rewrite defGH cycle_id.
-have{Hx defGH defHx} defG : G :=: <[x]> <*> H.
- rewrite -(quotientGK nsHG) defGH defHx -quotient_cycle //.
- by rewrite joingC quotientK ?norm_joinEr // cycle_subG.
-have [e def1]: exists e, 1%:M = \sum_(z in G) e z *m (M *m rG z).
- apply/sub_sumsmxP; have [X sXG [<- _]] := Clifford_basis irrG simM.
- by apply/sumsmx_subP=> z Xz; rewrite (sumsmx_sup z) ?(subsetP sXG).
-have [phi inj_phi hom_phi defMx] := isoM x Gx.
-have Mtau: (M *m (phi *m rG x^-1%g) <= M)%MS.
- by rewrite mulmxA (eqmxMr _ defMx) repr_mxK.
-have Mtau': (M *m (rG x *m invmx phi) <= M)%MS.
- by rewrite mulmxA -(eqmxMr _ defMx) mulmxK.
-have [[tau Htau defMtau] [tau' Htau' defMtau']] := (absM _ Mtau, absM _ Mtau').
-have tau'K: tau' *m tau = 1%:M.
- rewrite -[tau']mul1mx def1 !mulmx_suml; apply: eq_bigr => z Gz.
- have [f _ hom_f] := isoM z Gz; move/eqmxP; case/andP=> _; case/submxP=> v ->.
- rewrite (mulmxA _ v) -2!mulmxA; congr (_ *m _).
- rewrite -(hom_envelop_mxC hom_f) ?envelop_mxM //; congr (_ *m _).
- rewrite mulmxA defMtau' -(mulmxKpV Mtau') -mulmxA defMtau (mulmxA _ M).
- by rewrite mulmxKpV // !mulmxA mulmxKV // repr_mxK.
-have cHtau_x: centgmx rH (tau *m rG x).
- apply/centgmxP=> y Hy; have [u defMy] := submxP (mxmoduleP modM y Hy).
- have Gy := subsetP sHG y Hy.
- rewrite mulmxA; apply: (canRL (repr_mxKV rG Gx)).
- rewrite -!mulmxA /= -!repr_mxM ?groupM ?groupV // (conjgC y) mulKVg.
- rewrite -[rG y]mul1mx -{1}[tau]mul1mx def1 !mulmx_suml.
- apply: eq_bigr => z Gz; have [f _ hom_f] := isoM z Gz.
- move/eqmxP; case/andP=> _; case/submxP=> v ->; rewrite -!mulmxA.
- congr (_ *m (_ *m _)); rewrite {v} !(mulmxA M).
- rewrite -!(hom_envelop_mxC hom_f) ?envelop_mxM ?(envelop_mx_id rH) //.
- congr (_ *m f); rewrite !mulmxA defMy -(mulmxA u) defMtau (mulmxA u) -defMy.
- rewrite !mulmxA (hom_mxP hom_phi) // -!mulmxA; congr (M *m (_ *m _)).
- by rewrite /= -!repr_mxM ?groupM ?groupV // -conjgC.
- by rewrite -mem_conjg (normsP nHG).
-have{cHtau_x} cGtau_x: centgmx rG (tau *m rG x).
- rewrite /centgmx {1}defG join_subG cycle_subG !inE Gx /= andbC.
- rewrite (subset_trans cHtau_x); last by rewrite rcent_subg subsetIr.
- apply/eqP; rewrite -{2 3}[rG x]mul1mx -tau'K !mulmxA; congr (_ *m _ *m _).
- case/envelop_mxP: Htau' => u ->.
- rewrite !(mulmx_suml, mulmx_sumr); apply: eq_bigr => y Hy.
- by rewrite -!(scalemxAl, scalemxAr) (centgmxP cHtau_x) ?mulmxA.
-have{cGtau_x} [a def_tau_x]: exists a, tau *m rG x = a%:M.
- by apply/is_scalar_mxP; apply: mx_abs_irr_cent_scalar cGtau_x; apply: closedF.
-apply: mx_iso_simple (eqmx_iso _ _) simM; apply/eqmxP; rewrite submx1 sub1mx.
-case/mx_irrP: (irrG) => _ -> //; rewrite /mxmodule {1}defG join_subG /=.
-rewrite cycle_subG inE Gx andbC (subset_trans modM) ?rstabs_subg ?subsetIr //=.
-rewrite -{1}[M]mulmx1 -tau'K mulmxA -mulmxA def_tau_x mul_mx_scalar.
-by rewrite scalemx_sub ?(mxmodule_envelop modM Htau').
-Qed.
-
-(* This is B & G, Lemma 2.3. Note that this is not used in the FT proof. *)
-Lemma rank_abs_irr_dvd_solvable F gT (G : {group gT}) n rG :
- @mx_absolutely_irreducible F _ G n rG -> solvable G -> n %| #|G|.
-Proof.
-move=> absG solG.
-without loss closF: F rG absG / group_closure_field F gT.
- move=> IH; apply: (@group_closure_field_exists gT F) => [[F' f closF']].
- by apply: IH (map_repr f rG) _ closF'; rewrite map_mx_abs_irr.
-elim: {G}_.+1 {-2}G (ltnSn #|G|) => // m IHm G leGm in n rG absG solG *.
-have [G1 | ntG] := eqsVneq G 1%g.
- by rewrite abelian_abs_irr ?G1 ?abelian1 // in absG; rewrite (eqP absG) dvd1n.
-have [H nsHG p_pr] := sol_prime_factor_exists solG ntG.
-set p := #|G : H| in p_pr.
-pose sHG := normal_sub nsHG; pose rH := subg_repr rG sHG.
-have irrG := mx_abs_irrW absG.
-wlog [L simL _]: / exists2 L, mxsimple rH L & (L <= 1%:M)%MS.
- by apply: mxsimple_exists; rewrite ?mxmodule1 //; case: irrG.
-have ltHG: H \proper G.
- by rewrite properEcard sHG -(Lagrange sHG) ltn_Pmulr // prime_gt1.
-have dvLH: \rank L %| #|H|.
- have absL: mx_absolutely_irreducible (submod_repr (mxsimple_module simL)).
- exact/closF/submod_mx_irr.
- apply: IHm absL (solvableS (normal_sub nsHG) solG).
- by rewrite (leq_trans (proper_card ltHG)).
-have [_ [x Gx H'x]] := properP ltHG.
-have prGH: prime #|G / H|%g by rewrite card_quotient ?normal_norm.
-wlog sH: / socleType rH by apply: socle_exists.
-pose W := PackSocle (component_socle sH simL).
-have card_sH: #|sH| = #|G : 'C_G[W | 'Cl]|.
- rewrite -cardsT; have ->: setT = orbit 'Cl G W.
- apply/eqP; rewrite eqEsubset subsetT.
- have /imsetP[W' _ defW'] := Clifford_atrans irrG sH.
- have WW': W' \in orbit 'Cl G W by rewrite orbit_in_sym // -defW' inE.
- by rewrite defW' andbT; apply/subsetP=> W'' /orbit_in_trans->.
- rewrite orbit_stabilizer // card_in_imset //.
- exact: can_in_inj (act_reprK _).
-have sHcW: H \subset 'C_G[W | 'Cl].
- apply: subset_trans (subset_trans (joing_subl _ _) (Clifford_astab sH)) _.
- by rewrite subsetI subsetIl astabS ?subsetT.
-have [|] := prime_subgroupVti ('C_G[W | 'Cl] / H)%G prGH.
- rewrite quotientSGK ?normal_norm // => cClG.
- have def_sH: setT = [set W].
- apply/eqP; rewrite eq_sym eqEcard subsetT cards1 cardsT card_sH.
- by rewrite -indexgI (setIidPl cClG) indexgg.
- suffices L1: (L :=: 1%:M)%MS.
- by rewrite L1 mxrank1 in dvLH; apply: dvdn_trans (cardSg sHG).
- apply/eqmxP; rewrite submx1.
- have cycH: cyclic (G / H)%g by rewrite prime_cyclic.
- have [y Gy|_ _] := mx_irr_prime_index closF irrG cycH simL; last first.
- by apply; rewrite ?submx1 //; case simL.
- have simLy: mxsimple rH (L *m rG y) by apply: Clifford_simple.
- pose Wy := PackSocle (component_socle sH simLy).
- have: (L *m rG y <= Wy)%MS by rewrite PackSocleK component_mx_id.
- have ->: Wy = W by apply/set1P; rewrite -def_sH inE.
- by rewrite PackSocleK; apply: component_mx_iso.
-rewrite (setIidPl _) ?quotientS ?subsetIl // => /trivgP.
-rewrite quotient_sub1 //; last by rewrite subIset // normal_norm.
-move/setIidPl; rewrite (setIidPr sHcW) /= => defH.
-rewrite -(Lagrange sHG) -(Clifford_rank_components irrG W) card_sH -defH.
-rewrite mulnC dvdn_pmul2r // (_ : W :=: L)%MS //; apply/eqmxP.
-have sLW: (L <= W)%MS by rewrite PackSocleK component_mx_id.
-rewrite andbC sLW; have [modL nzL _] := simL.
-have [_ _] := (Clifford_rstabs_simple irrG W); apply=> //.
-rewrite /mxmodule rstabs_subg /= -Clifford_astab1 -astabIdom -defH.
-by rewrite -(rstabs_subg rG sHG).
-Qed.
-
-(* This section covers the many parts B & G, Proposition 2.4; only the last *)
-(* part (k) in used in the rest of the proof, and then only for Theorem 2.5. *)
-Section QuasiRegularCyclic.
-
-Variables (F : fieldType) (q' h : nat).
-
-Local Notation q := q'.+1.
-Local Notation V := 'rV[F]_q.
-Local Notation E := 'M[F]_q.
-
-Variables (g : E) (eps : F).
-
-Hypothesis gh1 : g ^+ h = 1.
-Hypothesis prim_eps : h.-primitive_root eps.
-
-Let h_gt0 := prim_order_gt0 prim_eps.
-Let eps_h := prim_expr_order prim_eps.
-Let eps_mod_h m := expr_mod m eps_h.
-Let inj_eps : injective (fun i : 'I_h => eps ^+ i).
-Proof.
-move=> i j eq_ij; apply/eqP; move/eqP: eq_ij.
-by rewrite (eq_prim_root_expr prim_eps) !modn_small.
-Qed.
-
-Let inhP m : m %% h < h. Proof. by rewrite ltn_mod. Qed.
-Let inh m := Ordinal (inhP m).
-
-Let V_ i := eigenspace g (eps ^+ i).
-Let n_ i := \rank (V_ i).
-Let E_ i := eigenspace (lin_mx (mulmx g^-1 \o mulmxr g)) (eps ^+ i).
-Let E2_ i t :=
- (kermx (lin_mx (mulmxr (cokermx (V_ t)) \o mulmx (V_ i)))
- :&: kermx (lin_mx (mulmx (\sum_(j < h | j != i %[mod h]) V_ j)%MS)))%MS.
-
-Local Notation "''V_' i" := (V_ i) (at level 8, i at level 2, format "''V_' i").
-Local Notation "''n_' i" := (n_ i) (at level 8, i at level 2, format "''n_' i").
-Local Notation "''E_' i" := (E_ i) (at level 8, i at level 2, format "''E_' i").
-Local Notation "'E_ ( i )" := (E_ i) (at level 8, only parsing).
-Local Notation "e ^g" := (g^-1 *m (e *m g))
- (at level 8, format "e ^g") : ring_scope.
-Local Notation "'E_ ( i , t )" := (E2_ i t)
- (at level 8, format "''E_' ( i , t )").
-
-Let inj_g : g \in GRing.unit.
-Proof. by rewrite -(unitrX_pos _ h_gt0) gh1 unitr1. Qed.
-
-Let Vi_mod i : 'V_(i %% h) = 'V_i.
-Proof. by rewrite /V_ eps_mod_h. Qed.
-
-Let g_mod i := expr_mod i gh1.
-
-Let EiP i e : reflect (e^g = eps ^+ i *: e) (e \in 'E_i)%MS.
-Proof.
-rewrite (sameP eigenspaceP eqP) mul_vec_lin -linearZ /=.
-by rewrite (can_eq mxvecK); apply: eqP.
-Qed.
-
-Let E2iP i t e :
- reflect ('V_i *m e <= 'V_t /\ forall j, j != i %[mod h] -> 'V_j *m e = 0)%MS
- (e \in 'E_(i, t))%MS.
-Proof.
-rewrite sub_capmx submxE !(sameP sub_kermxP eqP) /=.
-rewrite !mul_vec_lin !mxvec_eq0 /= -submxE -submx0 sumsmxMr.
-apply: (iffP andP) => [[->] | [-> Ve0]]; last first.
- by split=> //; apply/sumsmx_subP=> j ne_ji; rewrite Ve0.
-move/sumsmx_subP=> Ve0; split=> // j ne_ji; apply/eqP.
-by rewrite -submx0 -Vi_mod (Ve0 (inh j)) //= modn_mod.
-Qed.
-
-Let sumV := (\sum_(i < h) 'V_i)%MS.
-
-(* This is B & G, Proposition 2.4(a). *)
-Proposition mxdirect_sum_eigenspace_cycle : (sumV :=: 1%:M)%MS /\ mxdirect sumV.
-Proof.
-have splitF: group_splitting_field F (Zp_group h).
- move: prim_eps (abelianS (subsetT (Zp h)) (Zp_abelian _)).
- by rewrite -{1}(card_Zp h_gt0); apply: primitive_root_splitting_abelian.
-have F'Zh: [char F]^'.-group (Zp h).
- apply/pgroupP=> p p_pr; rewrite card_Zp // => /dvdnP[d def_h].
- apply/negP=> /= charFp.
- have d_gt0: d > 0 by move: h_gt0; rewrite def_h; case d.
- have: eps ^+ d == 1.
- rewrite -(inj_eq (fmorph_inj [rmorphism of Frobenius_aut charFp])).
- by rewrite rmorph1 /= Frobenius_autE -exprM -def_h eps_h.
- by rewrite -(prim_order_dvd prim_eps) gtnNdvd // def_h ltn_Pmulr // prime_gt1.
-case: (ltngtP h 1) => [|h_gt1|h1]; last first; last by rewrite ltnNge h_gt0.
- rewrite /sumV mxdirectE /= h1 !big_ord1; split=> //.
- apply/eqmxP; rewrite submx1; apply/eigenspaceP.
- by rewrite mul1mx scale1r idmxE -gh1 h1.
-pose mxZ (i : 'Z_h) := g ^+ i.
-have mxZ_repr: mx_repr (Zp h) mxZ.
- by split=> // i j _ _; rewrite /mxZ /= {3}Zp_cast // expr_mod // exprD.
-pose rZ := MxRepresentation mxZ_repr.
-have ZhT: Zp h = setT by rewrite /Zp h_gt1.
-have memZh: _ \in Zp h by move=> i; rewrite ZhT inE.
-have def_g: g = rZ Zp1 by [].
-have lin_rZ m (U : 'M_(m, q)) a:
- U *m g = a *: U -> forall i, U *m rZ i%:R = (a ^+ i) *: U.
-- move=> defUg i; rewrite repr_mxX //.
- elim: i => [|i IHi]; first by rewrite mulmx1 scale1r.
- by rewrite !exprS -scalerA mulmxA defUg -IHi scalemxAl.
-rewrite mxdirect_sum_eigenspace => [|j k _ _]; last exact: inj_eps.
-split=> //; apply/eqmxP; rewrite submx1.
-wlog [I M /= simM <- _]: / mxsemisimple rZ 1.
- exact: mx_reducible_semisimple (mxmodule1 _) (mx_Maschke rZ F'Zh) _.
-apply/sumsmx_subP=> i _; have simMi := simM i; have [modMi _ _] := simMi.
-set v := nz_row (M i); have nz_v: v != 0 by apply: nz_row_mxsimple simMi.
-have rankMi: \rank (M i) = 1%N.
- by rewrite (mxsimple_abelian_linear splitF _ simMi) //= ZhT Zp_abelian.
-have defMi: (M i :=: v)%MS.
- apply/eqmxP; rewrite andbC -(geq_leqif (mxrank_leqif_eq _)) ?nz_row_sub //.
- by rewrite rankMi lt0n mxrank_eq0.
-have [a defvg]: exists a, v *m rZ 1%R = a *: v.
- by apply/sub_rVP; rewrite -defMi mxmodule_trans ?socle_module ?defMi.
-have: a ^+ h - 1 == 0.
- apply: contraR nz_v => nz_pZa; rewrite -(eqmx_eq0 (eqmx_scale _ nz_pZa)).
- by rewrite scalerBl scale1r -lin_rZ // subr_eq0 char_Zp ?mulmx1.
-rewrite subr_eq0; move/eqP; case/(prim_rootP prim_eps) => k def_a.
-by rewrite defMi (sumsmx_sup k) // /V_ -def_a; apply/eigenspaceP.
-Qed.
-
-(* This is B & G, Proposition 2.4(b). *)
-Proposition rank_step_eigenspace_cycle i : 'n_ (i + h) = 'n_ i.
-Proof. by rewrite /n_ -Vi_mod modnDr Vi_mod. Qed.
-
-Let sumE := (\sum_(it : 'I_h * 'I_h) 'E_(it.1, it.2))%MS.
-
-(* This is B & G, Proposition 2.4(c). *)
-Proposition mxdirect_sum_proj_eigenspace_cycle :
- (sumE :=: 1%:M)%MS /\ mxdirect sumE.
-Proof.
-have [def1V] := mxdirect_sum_eigenspace_cycle; move/mxdirect_sumsP=> dxV.
-pose p (i : 'I_h) := proj_mx 'V_i (\sum_(j | j != i) 'V_j)%MS.
-have def1p: 1%:M = \sum_i p i.
- rewrite -[\sum_i _]mul1mx; move/eqmxP: def1V; rewrite submx1.
- case/sub_sumsmxP=> u ->; rewrite mulmx_sumr; apply: eq_bigr => i _.
- rewrite (bigD1 i) //= mulmxDl proj_mx_id ?submxMl ?dxV //.
- rewrite proj_mx_0 ?dxV ?addr0 ?summx_sub // => j ne_ji.
- by rewrite (sumsmx_sup j) ?submxMl.
-split; first do [apply/eqmxP; rewrite submx1].
- apply/(@memmx_subP F _ _ q)=> A _; apply/memmx_sumsP.
- pose B i t := p i *m A *m p t.
- exists (fun it => B it.1 it.2) => [|[i t] /=].
- rewrite -(pair_bigA _ B) /= -[A]mul1mx def1p mulmx_suml.
- by apply: eq_bigr => i _; rewrite -mulmx_sumr -def1p mulmx1.
- apply/E2iP; split=> [|j ne_ji]; first by rewrite mulmxA proj_mx_sub.
- rewrite 2!mulmxA -mulmxA proj_mx_0 ?dxV ?mul0mx //.
- rewrite (sumsmx_sup (inh j)) ?Vi_mod //.
- by rewrite (modn_small (valP i)) in ne_ji.
-apply/mxdirect_sumsP=> [[i t] _] /=.
-apply/eqP; rewrite -submx0; apply/(@memmx_subP F _ _ q)=> A.
-rewrite sub_capmx submx0 mxvec_eq0 -submx0.
-case/andP=> /E2iP[ViA Vi'A] /memmx_sumsP[B /= defA sBE].
-rewrite -[A]mul1mx -(eqmxMr A def1V) sumsmxMr (bigD1 i) //=.
-rewrite big1 ?addsmx0 => [|j ne_ij]; last by rewrite Vi'A ?modn_small.
-rewrite -[_ *m A]mulmx1 def1p mulmx_sumr (bigD1 t) //=.
-rewrite big1 ?addr0 => [|u ne_ut]; last first.
- by rewrite proj_mx_0 ?dxV ?(sumsmx_sup t) // eq_sym.
-rewrite {A ViA Vi'A}defA mulmx_sumr mulmx_suml summx_sub // => [[j u]].
-case/E2iP: (sBE (j, u)); rewrite eqE /=; case: eqP => [-> sBu _ ne_ut|].
- by rewrite proj_mx_0 ?dxV ?(sumsmx_sup u).
-by move/eqP=> ne_ji _ ->; rewrite ?mul0mx // eq_sym !modn_small.
-Qed.
-
-(* This is B & G, Proposition 2.4(d). *)
-Proposition rank_proj_eigenspace_cycle i t : \rank 'E_(i, t) = ('n_i * 'n_t)%N.
-Proof.
-have [def1V] := mxdirect_sum_eigenspace_cycle; move/mxdirect_sumsP=> dxV.
-pose p (i : 'I_h) := proj_mx 'V_i (\sum_(j | j != i) 'V_j)%MS.
-have def1p: 1%:M = \sum_i p i.
- rewrite -[\sum_i _]mul1mx; move/eqmxP: def1V; rewrite submx1.
- case/sub_sumsmxP=> u ->; rewrite mulmx_sumr; apply: eq_bigr => j _.
- rewrite (bigD1 j) //= mulmxDl proj_mx_id ?submxMl ?dxV //.
- rewrite proj_mx_0 ?dxV ?addr0 ?summx_sub // => k ne_kj.
- by rewrite (sumsmx_sup k) ?submxMl.
-move: i t => i0 t0; pose i := inh i0; pose t := inh t0.
-transitivity (\rank 'E_(i, t)); first by rewrite /E2_ !Vi_mod modn_mod.
-transitivity ('n_i * 'n_t)%N; last by rewrite /n_ !Vi_mod.
-move: {i0 t0}i t => i t; pose Bi := row_base 'V_i; pose Bt := row_base 'V_t.
-pose B := lin_mx (mulmx (p i *m pinvmx Bi) \o mulmxr Bt).
-pose B' := lin_mx (mulmx Bi \o mulmxr (pinvmx Bt)).
-have Bk : B *m B' = 1%:M.
- have frVpK m (C : 'M[F]_(m, q)) : row_free C -> C *m pinvmx C = 1%:M.
- by move/row_free_inj; apply; rewrite mul1mx mulmxKpV.
- apply/row_matrixP=> k; rewrite row_mul mul_rV_lin /= rowE mx_rV_lin /= -row1.
- rewrite (mulmxA _ _ Bt) -(mulmxA _ Bt) [Bt *m _]frVpK ?row_base_free //.
- rewrite mulmx1 2!mulmxA proj_mx_id ?dxV ?eq_row_base //.
- by rewrite frVpK ?row_base_free // mul1mx vec_mxK.
-have <-: \rank B = ('n_i * 'n_t)%N by apply/eqP; apply/row_freeP; exists B'.
-apply/eqP; rewrite eqn_leq !mxrankS //.
- apply/row_subP=> k; rewrite rowE mul_rV_lin /=.
- apply/E2iP; split=> [|j ne_ji].
- rewrite 3!mulmxA mulmx_sub ?eq_row_base //.
- rewrite 2!(mulmxA 'V_j) proj_mx_0 ?dxV ?mul0mx //.
- rewrite (sumsmx_sup (inh j)) ?Vi_mod //.
- by rewrite (modn_small (valP i)) in ne_ji.
-apply/(@memmx_subP F _ _ q) => A /E2iP[ViA Vi'A].
-apply/submxP; exists (mxvec (Bi *m A *m pinvmx Bt)); rewrite mul_vec_lin /=.
-rewrite mulmxKpV; last by rewrite eq_row_base (eqmxMr _ (eq_row_base _)).
-rewrite mulmxA -[p i]mul1mx mulmxKpV ?eq_row_base ?proj_mx_sub // mul1mx.
-rewrite -{1}[A]mul1mx def1p mulmx_suml (bigD1 i) //= big1 ?addr0 // => j neji.
-rewrite -[p j]mul1mx -(mulmxKpV (proj_mx_sub _ _ _)) -mulmxA Vi'A ?mulmx0 //.
-by rewrite !modn_small.
-Qed.
-
-(* This is B & G, Proposition 2.4(e). *)
-Proposition proj_eigenspace_cycle_sub_quasi_cent i j :
- ('E_(i, i + j) <= 'E_j)%MS.
-Proof.
-apply/(@memmx_subP F _ _ q)=> A /E2iP[ViA Vi'A].
-apply/EiP; apply: canLR (mulKmx inj_g) _; rewrite -{1}[A]mul1mx -{2}[g]mul1mx.
-have: (1%:M <= sumV)%MS by have [->] := mxdirect_sum_eigenspace_cycle.
-case/sub_sumsmxP=> p ->; rewrite -!mulmxA !mulmx_suml.
-apply: eq_bigr=> k _; have [-> | ne_ki] := eqVneq (k : nat) (i %% h)%N.
- rewrite Vi_mod -mulmxA (mulmxA _ A) (eigenspaceP ViA).
- rewrite (mulmxA _ g) (eigenspaceP (submxMl _ _)).
- by rewrite -!(scalemxAl, scalemxAr) scalerA mulmxA exprD.
-rewrite 2!mulmxA (eigenspaceP (submxMl _ _)) -!(scalemxAr, scalemxAl).
-by rewrite -(mulmxA _ 'V_k A) Vi'A ?linear0 ?mul0mx ?scaler0 // modn_small.
-Qed.
-
-Let diagE m :=
- (\sum_(it : 'I_h * 'I_h | it.1 + m == it.2 %[mod h]) 'E_(it.1, it.2))%MS.
-
-(* This is B & G, Proposition 2.4(f). *)
-Proposition diag_sum_proj_eigenspace_cycle m :
- (diagE m :=: 'E_m)%MS /\ mxdirect (diagE m).
-Proof.
-have sub_diagE n: (diagE n <= 'E_n)%MS.
- apply/sumsmx_subP=> [[i t] /= def_t].
- apply: submx_trans (proj_eigenspace_cycle_sub_quasi_cent i n).
- by rewrite /E2_ -(Vi_mod (i + n)) (eqP def_t) Vi_mod.
-pose sum_diagE := (\sum_(n < h) diagE n)%MS.
-pose p (it : 'I_h * 'I_h) := inh (h - it.1 + it.2).
-have def_diag: sum_diagE = sumE.
- rewrite /sumE (partition_big p xpredT) //.
- apply: eq_bigr => n _; apply: eq_bigl => [[i t]] /=.
- rewrite /p -val_eqE /= -(eqn_modDl (h - i)).
- by rewrite addnA subnK 1?ltnW // modnDl modn_small.
-have [Efull dxE] := mxdirect_sum_proj_eigenspace_cycle.
-have /mxdirect_sumsE[/= dx_diag rank_diag]: mxdirect sum_diagE.
- apply/mxdirectP; rewrite /= -/sum_diagE def_diag (mxdirectP dxE) /=.
- rewrite (partition_big p xpredT) //.
- apply: eq_bigr => n _; apply: eq_bigl => [[i t]] /=.
- symmetry; rewrite /p -val_eqE /= -(eqn_modDl (h - i)).
- by rewrite addnA subnK 1?ltnW // modnDl modn_small.
-have dx_sumE1: mxdirect (\sum_(i < h) 'E_i).
- by apply: mxdirect_sum_eigenspace => i j _ _; apply: inj_eps.
-have diag_mod n: diagE (n %% h) = diagE n.
- by apply: eq_bigl=> it; rewrite modnDmr.
-split; last first.
- apply/mxdirectP; rewrite /= -/(diagE m) -diag_mod.
- rewrite (mxdirectP (dx_diag (inh m) _)) //=.
- by apply: eq_bigl=> it; rewrite modnDmr.
-apply/eqmxP; rewrite sub_diagE /=.
-rewrite -(capmx_idPl (_ : _ <= sumE))%MS ?Efull ?submx1 //.
-rewrite -def_diag /sum_diagE (bigD1 (inh m)) //= addsmxC.
-rewrite diag_mod -matrix_modr ?sub_diagE //.
-rewrite ((_ :&: _ =P 0)%MS _) ?adds0mx // -submx0.
-rewrite -{2}(mxdirect_sumsP dx_sumE1 (inh m)) ?capmxS //.
- by rewrite /E_ eps_mod_h.
-by apply/sumsmx_subP=> i ne_i_m; rewrite (sumsmx_sup i) ?sub_diagE.
-Qed.
-
-(* This is B & G, Proposition 2.4(g). *)
-Proposition rank_quasi_cent_cycle m :
- \rank 'E_m = (\sum_(i < h) 'n_i * 'n_(i + m))%N.
-Proof.
-have [<- dx_diag] := diag_sum_proj_eigenspace_cycle m.
-rewrite (mxdirectP dx_diag) /= (reindex (fun i : 'I_h => (i, inh (i + m)))) /=.
- apply: eq_big => [i | i _]; first by rewrite modn_mod eqxx.
- by rewrite rank_proj_eigenspace_cycle /n_ Vi_mod.
-exists (@fst _ _) => // [] [i t] /=.
-by rewrite !inE /= (modn_small (valP t)) => def_t; apply/eqP/andP.
-Qed.
-
-(* This is B & G, Proposition 2.4(h). *)
-Proposition diff_rank_quasi_cent_cycle m :
- (2 * \rank 'E_0 = 2 * \rank 'E_m + \sum_(i < h) `|'n_i - 'n_(i + m)| ^ 2)%N.
-Proof.
-rewrite !rank_quasi_cent_cycle !{1}mul2n -addnn.
-rewrite {1}(reindex (fun i : 'I_h => inh (i + m))) /=; last first.
- exists (fun i : 'I_h => inh (i + (h - m %% h))%N) => i _.
- apply: val_inj; rewrite /= modnDml -addnA addnCA -modnDml addnCA.
- by rewrite subnKC 1?ltnW ?ltn_mod // modnDr modn_small.
- apply: val_inj; rewrite /= modnDml -modnDmr -addnA.
- by rewrite subnK 1?ltnW ?ltn_mod // modnDr modn_small.
-rewrite -mul2n big_distrr -!big_split /=; apply: eq_bigr => i _.
-by rewrite !addn0 (addnC (2 * _)%N) sqrn_dist addnC /n_ Vi_mod.
-Qed.
-
-Hypothesis rankEm : forall m, m != 0 %[mod h] -> \rank 'E_0 = (\rank 'E_m).+1.
-
-(* This is B & G, Proposition 2.4(j). *)
-Proposition rank_eigenspaces_quasi_homocyclic :
- exists2 n, `|q - h * n| = 1%N &
- exists i : 'I_h, [/\ `|'n_i - n| = 1%N, (q < h * n) = ('n_i < n)
- & forall j, j != i -> 'n_j = n].
-Proof.
-have [defV dxV] := mxdirect_sum_eigenspace_cycle.
-have sum_n: (\sum_(i < h) 'n_i)%N = q by rewrite -(mxdirectP dxV) defV mxrank1.
-suffices [n [i]]: exists n : nat, exists2 i : 'I_h,
- `|'n_i - n| == 1%N & forall i', i' != i -> 'n_i' = n.
-- move/eqP=> n_i n_i'; rewrite -{1 5}(prednK h_gt0).
- rewrite -sum_n (bigD1 i) //= (eq_bigr _ n_i') sum_nat_const cardC1 card_ord.
- by exists n; last exists i; rewrite ?distnDr ?ltn_add2r.
-case: (leqP h 1) sum_n {defV dxV} => [|h_gt1 _].
- rewrite leq_eqVlt ltnNge h_gt0 orbF; move/eqP->; rewrite big_ord1 => n_0.
- by exists q', 0 => [|i']; rewrite ?(ord1 i') // n_0 distSn.
-pose dn1 i := `|'n_i - 'n_(i + 1)|.
-have sum_dn1: (\sum_(0 <= i < h) dn1 i ^ 2 == 2)%N.
- rewrite big_mkord -(eqn_add2l (2 * \rank 'E_1)) -diff_rank_quasi_cent_cycle.
- by rewrite -mulnSr -rankEm ?modn_small.
-pose diff_n := [seq i <- index_iota 0 h | dn1 i != 0%N].
-have diff_n_1: all (fun i => dn1 i == 1%N) diff_n.
- apply: contraLR sum_dn1; case/allPn=> i; rewrite mem_filter.
- case def_i: (dn1 i) => [|[|ni]] //=; case/splitPr=> e e' _.
- by rewrite big_cat big_cons /= addnCA def_i -add2n sqrnD.
-have: sorted ltn diff_n.
- by rewrite (sorted_filter ltn_trans) // /index_iota subn0 iota_ltn_sorted.
-have: all (ltn^~ h) diff_n.
- by apply/allP=> i; rewrite mem_filter mem_index_iota; case/andP.
-have: size diff_n = 2%N.
- move: diff_n_1; rewrite size_filter -(eqnP sum_dn1) /diff_n.
- elim: (index_iota 0 h) => [|i e IHe]; rewrite (big_nil, big_cons) //=.
- by case def_i: (dn1 i) => [|[]] //=; rewrite def_i //; move/IHe->.
-case def_jk: diff_n diff_n_1 => [|j [|k []]] //=; case/and3P=> dn1j dn1k _ _.
-case/and3P=> lt_jh lt_kh _ /andP[lt_jk _].
-have def_n i:
- i <= h -> 'n_i = if i <= j then 'n_0 else if i <= k then 'n_j.+1 else 'n_k.+1.
-- elim: i => // i IHi lt_ik; have:= IHi (ltnW lt_ik); rewrite !(leq_eqVlt i).
- have:= erefl (i \in diff_n); rewrite {2}def_jk !inE mem_filter mem_index_iota.
- case: (i =P j) => [-> _ _ | _]; first by rewrite ltnn lt_jk.
- case: (i =P k) => [-> _ _ | _]; first by rewrite ltnNge ltnW // ltnn.
- by rewrite distn_eq0 lt_ik addn1; case: eqP => [->|].
-have n_j1: 'n_j.+1 = 'n_k by rewrite (def_n k (ltnW lt_kh)) leqnn leqNgt lt_jk.
-have n_k1: 'n_k.+1 = 'n_0.
- rewrite -(rank_step_eigenspace_cycle 0) (def_n h (leqnn h)).
- by rewrite leqNgt lt_jh leqNgt lt_kh; split.
-case: (leqP k j.+1) => [ | lt_j1_k].
- rewrite leq_eqVlt ltnNge lt_jk orbF; move/eqP=> def_k.
- exists 'n_(k + 1); exists (Ordinal lt_kh) => [|i' ne_i'k]; first exact: dn1k.
- rewrite addn1 {1}(def_n _ (ltnW (valP i'))) n_k1.
- by rewrite -ltnS -def_k ltn_neqAle ne_i'k /=; case: leqP; split.
-case: (leqP h.-1 (k - j)) => [le_h1_kj | lt_kj_h1].
- have k_h1: k = h.-1.
- apply/eqP; rewrite eqn_leq -ltnS (prednK h_gt0) lt_kh.
- exact: leq_trans (leq_subr j k).
- have j0: j = 0%N.
- apply/eqP; rewrite -leqn0 -(leq_add2l k) -{2}(subnK (ltnW lt_jk)).
- by rewrite addn0 leq_add2r {1}k_h1.
- exists 'n_(j + 1); exists (Ordinal lt_jh) => [|i' ne_i'j]; first exact: dn1j.
- rewrite addn1 {1}(def_n _ (ltnW (valP i'))) j0 leqNgt lt0n -j0.
- by rewrite ne_i'j -ltnS k_h1 (prednK h_gt0) (valP i'); split.
-suffices: \sum_(i < h) `|'n_i - 'n_(i + 2)| ^ 2 > 2.
- rewrite -(ltn_add2l (2 * \rank 'E_2)) -diff_rank_quasi_cent_cycle.
- rewrite -mulnSr -rankEm ?ltnn ?modn_small //.
- by rewrite -(prednK h_gt0) ltnS (leq_trans _ lt_kj_h1) // ltnS subn_gt0.
-have lt_k1h: k.-1 < h by rewrite ltnW // (ltn_predK lt_jk).
-rewrite (bigD1 (Ordinal lt_jh)) // (bigD1 (Ordinal lt_k1h)) /=; last first.
- by rewrite -val_eqE neq_ltn /= orbC -subn1 ltn_subRL lt_j1_k.
-rewrite (bigD1 (Ordinal lt_kh)) /=; last first.
- by rewrite -!val_eqE !neq_ltn /= lt_jk (ltn_predK lt_jk) leqnn !orbT.
-rewrite !addnA ltn_addr // !addn2 (ltn_predK lt_jk) n_k1.
-rewrite (def_n j (ltnW lt_jh)) leqnn (def_n _ (ltn_trans lt_j1_k lt_kh)).
-rewrite lt_j1_k -if_neg -leqNgt leqnSn n_j1.
-rewrite (def_n _ (ltnW lt_k1h)) leq_pred -if_neg -ltnNge.
-rewrite -subn1 ltn_subRL lt_j1_k n_j1.
-suffices ->: 'n_k.+2 = 'n_k.+1.
- by rewrite distnC -n_k1 -(addn1 k) -/(dn1 k) (eqP dn1k).
-case: (leqP k.+2 h) => [le_k2h | ].
- by rewrite (def_n _ le_k2h) (leqNgt _ k) leqnSn n_k1 if_same.
-rewrite ltnS leq_eqVlt ltnNge lt_kh orbF; move/eqP=> def_h.
-rewrite -{1}def_h -add1n rank_step_eigenspace_cycle (def_n _ h_gt0).
-rewrite -(subSn (ltnW lt_jk)) def_h leq_subLR in lt_kj_h1.
-by rewrite -(leq_add2r k) lt_kj_h1 n_k1.
-Qed.
-
-(* This is B & G, Proposition 2.4(k). *)
-Proposition rank_eigenspaces_free_quasi_homocyclic :
- q > 1 -> 'n_0 = 0%N -> h = q.+1 /\ (forall j, j != 0 %[mod h] -> 'n_j = 1%N).
-Proof.
-move=> q_gt1 n_0; rewrite mod0n.
-have [n d_q_hn [i [n_i lt_q_hn n_i']]] := rank_eigenspaces_quasi_homocyclic.
-move/eqP: d_q_hn; rewrite distn_eq1 {}lt_q_hn.
-case: (eqVneq (Ordinal h_gt0) i) n_i n_i' => [<- | ne0i _ n_i']; last first.
- by rewrite -(n_i' _ ne0i) n_0 /= muln0 -(subnKC q_gt1).
-rewrite n_0 dist0n => -> n_i'; rewrite muln1 => /eqP->; split=> // i'.
-by move/(n_i' (inh i')); rewrite /n_ Vi_mod.
-Qed.
-
-End QuasiRegularCyclic.
-
-(* This is B & G, Theorem 2.5, used for Theorems 3.4 and 15.7. *)
-Theorem repr_extraspecial_prime_sdprod_cycle p n gT (G P H : {group gT}) :
- p.-group P -> extraspecial P -> P ><| H = G -> cyclic H ->
- let h := #|H| in #|P| = (p ^ n.*2.+1)%N -> coprime p h ->
- {in H^#, forall x, 'C_P[x] = 'Z(P)} ->
- (h %| p ^ n + 1) || (h %| p ^ n - 1)
- /\ ((h != p ^ n + 1)%N -> forall F q (rG : mx_representation F G q),
- [char F]^'.-group G -> mx_faithful rG -> rfix_mx rG H != 0).
-Proof.
-move=> pP esP sdPH_G cycH h oPpn co_p_h primeHP.
-set dvd_h_pn := _ || _; set neq_h_pn := h != _.
-suffices IH F q (rG : mx_representation F G q):
- [char F]^'.-group G -> mx_faithful rG ->
- dvd_h_pn && (neq_h_pn ==> (rfix_mx rG H != 0)).
-- split=> [|ne_h F q rG F'G ffulG]; last first.
- by case/andP: (IH F q rG F'G ffulG) => _; rewrite ne_h.
- pose r := pdiv #|G|.+1.
- have r_pr: prime r by rewrite pdiv_prime // ltnS cardG_gt0.
- have F'G: [char 'F_r]^'.-group G.
- rewrite /pgroup (eq_pnat _ (eq_negn (charf_eq (char_Fp r_pr)))).
- rewrite p'natE // -prime_coprime // (coprime_dvdl (pdiv_dvd _)) //.
- by rewrite /coprime -addn1 gcdnC gcdnDl gcdn1.
- by case/andP: (IH _ _ _ F'G (regular_mx_faithful _ _)).
-move=> F'G ffulG.
-without loss closF: F rG F'G ffulG / group_closure_field F gT.
- move=> IH; apply: (@group_closure_field_exists gT F) => [[Fs f clFs]].
- rewrite -(map_mx_eq0 f) map_rfix_mx {}IH ?map_mx_faithful //.
- by rewrite (eq_p'group _ (fmorph_char f)).
-have p_pr := extraspecial_prime pP esP; have p_gt1 := prime_gt1 p_pr.
-have oZp := card_center_extraspecial pP esP; have[_ prZ] := esP.
-have{sdPH_G} [nsPG sHG defG nPH tiPH] := sdprod_context sdPH_G.
-have sPG := normal_sub nsPG.
-have coPH: coprime #|P| #|H| by rewrite oPpn coprime_pexpl.
-have nsZG: 'Z(P) <| G := gFnormal_trans _ nsPG.
-have defCP: 'C_G(P) = 'Z(P).
- apply/eqP; rewrite eqEsubset andbC setSI //=.
- rewrite -(coprime_mulG_setI_norm defG) ?norms_cent ?normal_norm //=.
- rewrite mul_subG // -(setD1K (group1 H)).
- apply/subsetP=> x; case/setIP; case/setU1P=> [-> // | H'x].
- rewrite -sub_cent1; move/setIidPl; rewrite primeHP // => defP.
- by have:= min_card_extraspecial pP esP; rewrite -defP oZp (leq_exp2l 3 1).
-have F'P: [char F]^'.-group P by apply: pgroupS sPG F'G.
-have F'H: [char F]^'.-group H by apply: pgroupS sHG F'G.
-wlog{ffulG F'G} [irrG regZ]: q rG / mx_irreducible rG /\ rfix_mx rG 'Z(P) = 0.
- move=> IH; wlog [I W /= simW defV _]: / mxsemisimple rG 1%:M.
- exact: (mx_reducible_semisimple (mxmodule1 _) (mx_Maschke rG F'G)).
- have [z Zz ntz]: exists2 z, z \in 'Z(P) & z != 1%g.
- by apply/trivgPn; rewrite -cardG_gt1 oZp prime_gt1.
- have Gz := subsetP sPG z (subsetP (center_sub P) z Zz).
- case: (pickP (fun i => z \notin rstab rG (W i))) => [i ffZ | z1]; last first.
- case/negP: ntz; rewrite -in_set1 (subsetP ffulG) // inE Gz /=.
- apply/eqP; move/eqmxP: defV; case/andP=> _; case/sub_sumsmxP=> w ->.
- rewrite mulmx_suml; apply: eq_bigr => i _.
- by move/negbFE: (z1 i) => /rstab_act-> //; rewrite submxMl.
- have [modW _ _] := simW i; pose rW := submod_repr modW.
- rewrite -(eqmx_rstab _ (val_submod1 (W i))) -(rstab_submod modW) in ffZ.
- have irrW: mx_irreducible rW by apply/submod_mx_irr.
- have regZ: rfix_mx rW 'Z(P)%g = 0.
- apply/eqP; apply: contraR ffZ; case/mx_irrP: irrW => _ minW /minW.
- by rewrite normal_rfix_mx_module // -sub1mx inE Gz /= => /implyP/rfix_mxP->.
- have ffulP: P :&: rker rW = 1%g.
- apply: (TI_center_nil (pgroup_nil pP)).
- by rewrite /normal subsetIl normsI ?normG ?(subset_trans _ (rker_norm _)).
- rewrite /= setIC setIA (setIidPl (center_sub _)); apply: prime_TIg=> //.
- by apply: contra ffZ => /subsetP->.
- have cPker: rker rW \subset 'C_G(P).
- rewrite subsetI rstab_sub (sameP commG1P trivgP) /= -ffulP subsetI.
- rewrite commg_subl commg_subr (subset_trans sPG) ?rker_norm //.
- by rewrite (subset_trans (rstab_sub _ _)) ?normal_norm.
- have [->] := andP (IH _ _ (conj irrW regZ)); case: (neq_h_pn) => //.
- apply: contra; rewrite (eqmx_eq0 (rfix_submod modW sHG)) => /eqP->.
- by rewrite capmx0 linear0.
-pose rP := subg_repr rG sPG; pose rH := subg_repr rG sHG.
-wlog [M simM _]: / exists2 M, mxsimple rP M & (M <= 1%:M)%MS.
- by apply: (mxsimple_exists (mxmodule1 _)); last case irrG.
-have{M simM irrG regZ F'P} [irrP def_q]: mx_irreducible rP /\ q = (p ^ n)%N.
- have [modM nzM _]:= simM.
- have [] := faithful_repr_extraspecial _ _ oPpn _ _ simM => // [|<- isoM].
- apply/eqP; apply: (TI_center_nil (pgroup_nil pP)).
- rewrite /= -(eqmx_rstab _ (val_submod1 M)) -(rstab_submod modM).
- exact: rker_normal.
- rewrite setIC prime_TIg //=; apply: contra nzM => cMZ.
- rewrite -submx0 -regZ; apply/rfix_mxP=> z; move/(subsetP cMZ)=> cMz.
- by rewrite (rstab_act cMz).
- suffices irrP: mx_irreducible rP.
- by split=> //; apply/eqP; rewrite eq_sym; case/mx_irrP: irrP => _; apply.
- apply: (@mx_irr_prime_index F _ G P _ M nsPG) => // [|x Gx].
- by rewrite -defG quotientMidl quotient_cyclic.
- rewrite (bool_irrelevance (normal_sub nsPG) sPG).
- apply: isoM; first exact: (@Clifford_simple _ _ _ _ nsPG).
- have cZx: x \in 'C_G('Z(P)).
- rewrite (setIidPl _) // -defG mulG_subG centsC subsetIr.
- rewrite -(setD1K (group1 H)) subUset sub1G /=.
- by apply/subsetP=> y H'y; rewrite -sub_cent1 -(primeHP y H'y) subsetIr.
- by have [f] := Clifford_iso nsZG rG M cZx; exists f.
-pose E_P := enveloping_algebra_mx rP; have{irrP} absP := closF P _ _ irrP.
-have [q_gt0 EPfull]: q > 0 /\ (1%:M <= E_P)%MS by apply/andP; rewrite sub1mx.
-pose Z := 'Z(P); have [sZP nZP] := andP (center_normal P : Z <| P).
-have nHZ: H \subset 'N(Z) := subset_trans sHG (normal_norm nsZG).
-pose clPqH := [set Zx ^: (H / Z) | Zx in P / Z]%g.
-pose b (ZxH : {set coset_of Z}) := repr (repr ZxH).
-have Pb ZxH: ZxH \in clPqH -> b ZxH \in P.
- case/imsetP=> Zx P_Zx ->{ZxH}.
- rewrite -(quotientGK (center_normal P)) /= -/Z inE repr_coset_norm /=.
- rewrite inE coset_reprK; apply: subsetP (mem_repr _ (class_refl _ _)).
- rewrite -class_support_set1l class_support_sub_norm ?sub1set //.
- by rewrite quotient_norms.
-have{primeHP coPH} card_clPqH ZxH: ZxH \in clPqH^# -> #|ZxH| = #|H|.
- case/setD1P=> ntZxH P_ZxH.
- case/imsetP: P_ZxH ntZxH => Zx P_Zx ->{ZxH}; rewrite classG_eq1 => ntZx.
- rewrite -index_cent1 ['C__[_]](trivgP _).
- rewrite indexg1 card_quotient // -indexgI setICA setIA tiPH.
- by rewrite (setIidPl (sub1G _)) indexg1.
- apply/subsetP=> Zy => /setIP[/morphimP[y Ny]]; rewrite -(setD1K (group1 H)).
- case/setU1P=> [-> | Hy] ->{Zy} cZxy; first by rewrite morph1 set11.
- have: Zx \in 'C_(P / Z)(<[y]> / Z).
- by rewrite inE P_Zx quotient_cycle // cent_cycle cent1C.
- case/idPn; rewrite -coprime_quotient_cent ?cycle_subG ?(pgroup_sol pP) //.
- by rewrite /= cent_cycle primeHP // trivg_quotient inE.
- by apply: coprimegS coPH; rewrite cycle_subG; case/setD1P: Hy.
-pose B x := \matrix_(i < #|H|) mxvec (rP (x ^ enum_val i)%g).
-have{E_P EPfull absP} sumB: (\sum_(ZxH in clPqH) <<B (b ZxH)>> :=: 1%:M)%MS.
- apply/eqmxP; rewrite submx1 (submx_trans EPfull) //.
- apply/row_subP=> ix; set x := enum_val ix; pose ZxH := coset Z x ^: (H / Z)%g.
- have Px: x \in P by [rewrite enum_valP]; have nZx := subsetP nZP _ Px.
- have P_ZxH: ZxH \in clPqH by apply: mem_imset; rewrite mem_quotient.
- have Pbx := Pb _ P_ZxH; have nZbx := subsetP nZP _ Pbx.
- rewrite rowK (sumsmx_sup ZxH) {P_ZxH}// genmxE -/x.
- have: coset Z x \in coset Z (b ZxH) ^: (H / Z)%g.
- by rewrite class_sym coset_reprK (mem_repr _ (class_refl _ _)).
- case/imsetP=> _ /morphimP[y Ny Hy ->].
- rewrite -morphJ //; case/kercoset_rcoset; rewrite ?groupJ // => z Zz ->.
- have [Pz cPz] := setIP Zz; rewrite repr_mxM ?memJ_norm ?(subsetP nPH) //.
- have [a ->]: exists a, rP z = a%:M.
- apply/is_scalar_mxP; apply: (mx_abs_irr_cent_scalar absP).
- by apply/centgmxP=> t Pt; rewrite -!repr_mxM ?(centP cPz).
- rewrite mul_scalar_mx linearZ scalemx_sub //.
- by rewrite (eq_row_sub (gring_index H y)) // rowK gring_indexK.
-have{card_clPqH} Bfree_if ZxH:
- ZxH \in clPqH^# -> \rank <<B (b ZxH)>> <= #|ZxH| ?= iff row_free (B (b ZxH)).
-- by move=> P_ZxH; rewrite genmxE card_clPqH // /leqif rank_leq_row.
-have B1_if: \rank <<B (b 1%g)>> <= 1 ?= iff (<<B (b 1%g)>> == mxvec 1%:M)%MS.
- have r1: \rank (mxvec 1%:M : 'rV[F]_(q ^ 2)) = 1%N.
- by rewrite rank_rV mxvec_eq0 -mxrank_eq0 mxrank1 -lt0n q_gt0.
- rewrite -{1}r1; apply: mxrank_leqif_eq; rewrite genmxE.
- have ->: b 1%g = 1%g by rewrite /b repr_set1 repr_coset1.
- by apply/row_subP=> i; rewrite rowK conj1g repr_mx1.
-have rankEP: \rank (1%:M : 'A[F]_q) = (\sum_(ZxH in clPqH) #|ZxH|)%N.
- rewrite acts_sum_card_orbit ?astabsJ ?quotient_norms // card_quotient //.
- rewrite mxrank1 -divgS // -mulnn oPpn oZp expnS -muln2 expnM -def_q.
- by rewrite mulKn // ltnW.
-have cl1: 1%g \in clPqH by apply/imsetP; exists 1%g; rewrite ?group1 ?class1G.
-have{B1_if Bfree_if}:= leqif_add B1_if (leqif_sum Bfree_if).
-case/(leqif_trans (mxrank_sum_leqif _)) => _ /=.
-rewrite -{1}(big_setD1 _ cl1) sumB {}rankEP (big_setD1 1%g) // cards1 eqxx.
-case/esym/and3P=> dxB /eqmxP defB1 /forall_inP/= Bfree.
-have [yg defH] := cyclicP cycH; pose g := rG yg.
-have Hxg: yg \in H by [rewrite defH cycle_id]; have Gyg := subsetP sHG _ Hxg.
-pose gE : 'A_q := lin_mx (mulmx (invmx g) \o mulmxr g).
-pose yr := regular_repr F H yg.
-have mulBg x: x \in P -> B x *m gE = yr *m B x.
- move/(subsetP sPG)=> Gx.
- apply/row_matrixP=> i; have Hi := enum_valP i; have Gi := subsetP sHG _ Hi.
- rewrite 2!row_mul !rowK mul_vec_lin /= -rowE rowK gring_indexK ?groupM //.
- by rewrite conjgM -repr_mxV // -!repr_mxM // ?(groupJ, groupM, groupV).
-wlog sH: / irrType F H by apply: socle_exists.
-have{cycH} linH: irr_degree (_ : sH) = 1%N.
- exact: irr_degree_abelian (cyclic_abelian cycH).
-have baseH := linear_irr_comp F'H (closF H) (linH _).
-have{linH} linH (W : sH): \rank W = 1%N by rewrite baseH; apply: linH.
-have [w] := cycle_repr_structure sH defH F'H (closF H).
-rewrite -/h => prim_w [Wi [bijWi _ _ Wi_yg]].
-have{Wi_yg baseH} Wi_yr i: Wi i *m yr = w ^+ i *: (Wi i : 'M_h).
- have /submxP[u ->]: (Wi i <= val_submod (irr_repr (Wi i) 1%g))%MS.
- by rewrite repr_mx1 val_submod1 -baseH.
- rewrite repr_mx1 -mulmxA -2!linearZ; congr (u *m _).
- by rewrite -mul_mx_scalar -Wi_yg /= val_submodJ.
-pose E_ m := eigenspace gE (w ^+ m).
-have dxE: mxdirect (\sum_(m < h) E_ m)%MS.
- apply: mxdirect_sum_eigenspace => m1 m2 _ _ eq_m12; apply/eqP.
- by move/eqP: eq_m12; rewrite (eq_prim_root_expr prim_w) !modn_small.
-pose B2 ZxH i : 'A_q := <<Wi i *m B (b ZxH)>>%MS.
-pose B1 i : 'A_q := (\sum_(ZxH in clPqH^#) B2 ZxH i)%MS.
-pose SB := (<<B (b 1%g)>> + \sum_i B1 i)%MS.
-have{yr Wi_yr Pb mulBg} sB1E i: (B1 i <= E_ i)%MS.
- apply/sumsmx_subP=> ZxH /setIdP[_]; rewrite genmxE => P_ZxH.
- by apply/eigenspaceP; rewrite -mulmxA mulBg ?Pb // mulmxA Wi_yr scalemxAl.
-have{bijWi sumB cl1 F'H} defSB: (SB :=: 1%:M)%MS.
- apply/eqmxP; rewrite submx1 -sumB (big_setD1 _ cl1) addsmxS //=.
- rewrite exchange_big sumsmxS // => ZxH _; rewrite genmxE /= -sumsmxMr_gen.
- rewrite -((reindex Wi) xpredT val) /=; last by apply: onW_bij.
- by rewrite -/(Socle _) (reducible_Socle1 sH (mx_Maschke _ F'H)) mul1mx.
-rewrite mxdirect_addsE /= in dxB; case/and3P: dxB => _ dxB dxB1.
-have{linH Bfree dxB} rankB1 i: \rank (B1 i) = #|clPqH^#|.
- rewrite -sum1_card (mxdirectP _) /=.
- by apply: eq_bigr => ZxH P_ZxH; rewrite genmxE mxrankMfree ?Bfree.
- apply/mxdirect_sumsP=> ZxH P_ZxH.
- apply/eqP; rewrite -submx0 -{2}(mxdirect_sumsP dxB _ P_ZxH) capmxS //.
- by rewrite !genmxE submxMl.
- by rewrite sumsmxS // => ZyH _; rewrite !genmxE submxMl.
-have rankEi (i : 'I_h) : i != 0%N :> nat -> \rank (E_ i) = #|clPqH^#|.
- move=> i_gt0; apply/eqP; rewrite -(rankB1 i) (mxrank_leqif_sup _) ?sB1E //.
- rewrite -[E_ i]cap1mx -(cap_eqmx defSB (eqmx_refl _)) /SB.
- rewrite (bigD1 i) //= (addsmxC (B1 i)) addsmxA addsmxC -matrix_modl //.
- rewrite -(addsmx0 (q ^ 2) (B1 i)) addsmxS //.
- rewrite capmxC -{2}(mxdirect_sumsP dxE i) // capmxS // addsmx_sub // .
- rewrite (sumsmx_sup (Ordinal (cardG_gt0 H))) ?sumsmxS 1?eq_sym //.
- rewrite defB1; apply/eigenspaceP; rewrite mul_vec_lin scale1r /=.
- by rewrite mul1mx mulVmx ?repr_mx_unit.
-have{b B defB1 rP rH sH Wi rankB1 dxB1 defSB sB1E B1 B2 dxE SB} rankE0 i:
- (i : 'I_h) == 0%N :> nat -> \rank (E_ i) = #|clPqH^#|.+1.
-- move=> i_eq0; rewrite -[E_ i]cap1mx -(cap_eqmx defSB (eqmx_refl _)) /SB.
- rewrite (bigD1 i) // addsmxA -matrix_modl; last first.
- rewrite addsmx_sub // sB1E andbT defB1; apply/eigenspaceP.
- by rewrite mul_vec_lin (eqP i_eq0) scale1r /= mul1mx mulVmx ?repr_mx_unit.
- rewrite (((_ :&: _)%MS =P 0) _).
- rewrite addsmx0 mxrank_disjoint_sum /=.
- by rewrite defB1 rank_rV rankB1 mxvec_eq0 -mxrank_eq0 mxrank1 -lt0n q_gt0.
- apply/eqP; rewrite -submx0 -(eqP dxB1) capmxS // sumsmxS // => ZxH _.
- by rewrite !genmxE ?submxMl.
- by rewrite -submx0 capmxC /= -{2}(mxdirect_sumsP dxE i) // capmxS ?sumsmxS.
-have{clPqH rankE0 rankEi} (m):
- m != 0 %[mod h] -> \rank (E_ 0%N) = (\rank (E_ m)).+1.
-- move=> nz_m; rewrite (rankE0 (Ordinal (cardG_gt0 H))) //.
- rewrite /E_ -(prim_expr_mod prim_w); rewrite mod0n in nz_m.
- have lt_m: m %% h < h by rewrite ltn_mod ?cardG_gt0.
- by rewrite (rankEi (Ordinal lt_m)).
-have: q > 1.
- rewrite def_q (ltn_exp2l 0) // lt0n.
- apply: contraL (min_card_extraspecial pP esP).
- by rewrite oPpn; move/eqP->; rewrite leq_exp2l.
-rewrite {}/E_ {}/gE {}/dvd_h_pn {}/neq_h_pn -{n oPpn}def_q subn1 addn1 /=.
-case: q q_gt0 => // q' _ in rG g * => q_gt1 rankE.
-have gh1: g ^+ h = 1 by rewrite -repr_mxX // /h defH expg_order repr_mx1.
-apply/andP; split.
- have [n' def_q _]:= rank_eigenspaces_quasi_homocyclic gh1 prim_w rankE.
- move/eqP: def_q; rewrite distn_eq1 eqSS.
- by case: ifP => _ /eqP->; rewrite dvdn_mulr ?orbT.
-apply/implyP; apply: contra => regH.
-have [|-> //]:= rank_eigenspaces_free_quasi_homocyclic gh1 prim_w rankE q_gt1.
-apply/eqP; rewrite mxrank_eq0 -submx0 -(eqP regH).
-apply/rV_subP=> v /eigenspaceP; rewrite scale1r => cvg.
-apply/rfix_mxP=> y Hy; apply: rstab_act (submx_refl v); apply: subsetP y Hy.
-by rewrite defH cycle_subG !inE Gyg /= cvg.
-Qed.
-
-(* This is the main part of B & G, Theorem 2.6; it implies 2.6(a) and most of *)
-(* 2.6(b). *)
-Theorem der1_odd_GL2_charf F gT (G : {group gT})
- (rG : mx_representation F G 2) :
- odd #|G| -> mx_faithful rG -> [char F].-group G^`(1)%g.
-Proof.
-move=> oddG ffulG.
-without loss closF: F rG ffulG / group_closure_field F gT.
- move=> IH; apply: (@group_closure_field_exists gT F) => [[Fc f closFc]].
- rewrite -(eq_pgroup _ (fmorph_char f)).
- by rewrite -(map_mx_faithful f) in ffulG; apply: IH ffulG closFc.
-elim: {G}_.+1 {-2}G (ltnSn #|G|) => // m IHm G le_g_m in rG oddG ffulG *.
-apply/pgroupP=> p p_pr pG'; rewrite !inE p_pr /=; apply: wlog_neg => p_nz.
-have [P sylP] := Sylow_exists p G.
-have nPG: G \subset 'N(P).
- apply/idPn=> ltNG; pose N := 'N_G(P); have sNG: N \subset G := subsetIl _ _.
- have{IHm ltNG} p'N': [char F].-group N^`(1)%g.
- apply: IHm (subg_mx_faithful sNG ffulG); last exact: oddSg oddG.
- rewrite -ltnS (leq_trans _ le_g_m) // ltnS proper_card //.
- by rewrite /proper sNG subsetI subxx.
- have{p'N'} tiPN': P :&: N^`(1)%g = 1%g.
- rewrite coprime_TIg ?(pnat_coprime (pHall_pgroup sylP)) //= -/N.
- apply: sub_in_pnat p'N' => q _; apply: contraL; move/eqnP->.
- by rewrite !inE p_pr.
- have sPN: P \subset N by rewrite subsetI normG (pHall_sub sylP).
- have{tiPN'} cPN: N \subset 'C(P).
- rewrite (sameP commG1P trivgP) -tiPN' subsetI commgS //.
- by rewrite commg_subr subsetIr.
- have /sdprodP[_ /= defG nKP _] := Burnside_normal_complement sylP cPN.
- set K := 'O_p^'(G) in defG nKP; have nKG: G \subset 'N(K) by apply: gFnorm.
- suffices p'G': p^'.-group G^`(1)%g by case/eqnP: (pgroupP p'G' p p_pr pG').
- apply: pgroupS (pcore_pgroup p^' G); rewrite -quotient_cents2 //= -/K.
- by rewrite -defG quotientMidl /= -/K quotient_cents ?(subset_trans sPN).
-pose Q := G^`(1)%g :&: P; have sQG: Q \subset G by rewrite subIset ?der_subS.
-have nQG: G \subset 'N(Q) by rewrite normsI // normal_norm ?der_normalS.
-have pQ: (p %| #|Q|)%N.
- have sylQ: p.-Sylow(G^`(1)%g) Q.
- by apply: Sylow_setI_normal (der_normalS _ _) _.
- apply: contraLR pG'; rewrite -!p'natE // (card_Hall sylQ) -!partn_eq1 //.
- by rewrite part_pnat_id ?part_pnat.
-have{IHm} abelQ: abelian Q.
- apply/commG1P/eqP/idPn => ntQ'.
- have{IHm} p'Q': [char F].-group Q^`(1)%g.
- apply: IHm (subg_mx_faithful sQG ffulG); last exact: oddSg oddG.
- rewrite -ltnS (leq_trans _ le_g_m) // ltnS proper_card //.
- rewrite /proper sQG subsetI //= andbC subEproper.
- case: eqP => [-> /= | _]; last by rewrite /proper (pHall_sub sylP) andbF.
- have: nilpotent P by rewrite (pgroup_nil (pHall_pgroup sylP)).
- move/forallP/(_ P); apply: contraL; rewrite subsetI subxx => -> /=.
- apply: contra ntQ'; rewrite /Q => /eqP->.
- by rewrite (setIidPr _) ?sub1G // commG1.
- case/eqP: ntQ'; have{p'Q'}: P :&: Q^`(1)%g = 1%g.
- rewrite coprime_TIg ?(pnat_coprime (pHall_pgroup sylP)) //= -/Q.
- by rewrite (pi_p'nat p'Q') // !inE p_pr.
- by rewrite (setIidPr _) // comm_subG ?subsetIr.
-pose rQ := subg_repr rG sQG.
-wlog [U simU sU1]: / exists2 U, mxsimple rQ U & (U <= 1%:M)%MS.
- by apply: mxsimple_exists; rewrite ?mxmodule1 ?oner_eq0.
-have Uscal: \rank U = 1%N by apply: (mxsimple_abelian_linear (closF _)) simU.
-have{simU} [Umod _ _] := simU.
-have{sU1} [|V Vmod sumUV dxUV] := mx_Maschke _ _ Umod sU1.
- have: p.-group Q by apply: pgroupS (pHall_pgroup sylP); rewrite subsetIr.
- by apply: sub_in_pnat=> q _; move/eqnP->; rewrite !inE p_pr.
-have [u defU]: exists u : 'rV_2, (u :=: U)%MS.
- by move: (row_base U) (eq_row_base U); rewrite Uscal => u; exists u.
-have{dxUV Uscal} [v defV]: exists v : 'rV_2, (v :=: V)%MS.
- move/mxdirectP: dxUV; rewrite /= Uscal sumUV mxrank1 => [[Vscal]].
- by move: (row_base V) (eq_row_base V); rewrite -Vscal => v; exists v.
-pose B : 'M_(1 + 1) := col_mx u v; have{sumUV} uB: B \in unitmx.
- rewrite -row_full_unit /row_full eqn_leq rank_leq_row {1}addn1.
- by rewrite -addsmxE -(mxrank1 F 2) -sumUV mxrankS // addsmxS ?defU ?defV.
-pose Qfix (w : 'rV_2) := {in Q, forall y, w *m rG y <= w}%MS.
-have{U defU Umod} u_fix: Qfix u.
- by move=> y Qy; rewrite /= (eqmxMr _ defU) defU (mxmoduleP Umod).
-have{V defV Vmod} v_fix: Qfix v.
- by move=> y Qy; rewrite /= (eqmxMr _ defV) defV (mxmoduleP Vmod).
-case/Cauchy: pQ => // x Qx oxp; have Gx := subsetP sQG x Qx.
-case/submxP: (u_fix x Qx) => a def_ux.
-case/submxP: (v_fix x Qx) => b def_vx.
-have def_x: rG x = B^-1 *m block_mx a 0 0 b *m B.
- rewrite -mulmxA -[2]/(1 + 1)%N mul_block_col !mul0mx addr0 add0r.
- by rewrite -def_ux -def_vx -mul_col_mx mulKmx.
-have ap1: a ^+ p = 1.
- suff: B^-1 *m block_mx (a ^+ p) 0 0 (b ^+ p) *m B = 1.
- move/(canRL (mulmxK uB))/(canRL (mulKVmx uB)); rewrite mul1mx.
- by rewrite mulmxV // scalar_mx_block; case/eq_block_mx.
- transitivity (rG x ^+ p); last first.
- by rewrite -(repr_mxX (subg_repr rG sQG)) // -oxp expg_order repr_mx1.
- elim: (p) => [|k IHk]; first by rewrite -scalar_mx_block mulmx1 mulVmx.
- rewrite !exprS -IHk def_x -!mulmxE !mulmxA mulmxK // -2!(mulmxA B^-1).
- by rewrite -[2]/(1 + 1)%N mulmx_block !mulmx0 !mul0mx !addr0 mulmxA add0r.
-have ab1: a * b = 1.
- have: Q \subset <<[set y in G | \det (rG y) == 1]>>.
- rewrite subIset // genS //; apply/subsetP=> yz; case/imset2P=> y z Gy Gz ->.
- rewrite inE !repr_mxM ?groupM ?groupV //= !detM (mulrCA _ (\det (rG y))).
- rewrite -!det_mulmx -!repr_mxM ?groupM ?groupV //.
- by rewrite mulKg mulVg repr_mx1 det1.
- rewrite gen_set_id; last first.
- apply/group_setP; split=> [|y z /setIdP[Gy /eqP y1] /setIdP[Gz /eqP z1]].
- by rewrite inE group1 /= repr_mx1 det1.
- by rewrite inE groupM ?repr_mxM //= detM y1 z1 mulr1.
- case/subsetP/(_ x Qx)/setIdP=> _.
- rewrite def_x !detM mulrAC -!detM -mulrA mulKr // -!mulmxE.
- rewrite -[2]/(1 + 1)%N det_lblock // [a]mx11_scalar [b]mx11_scalar.
- by rewrite !det_scalar1 -scalar_mxM => /eqP->.
-have{ab1 ap1 def_x} ne_ab: a != b.
- apply/eqP=> defa; have defb: b = 1.
- rewrite -ap1 (divn_eq p 2) modn2.
- have ->: odd p by rewrite -oxp (oddSg _ oddG) // cycle_subG.
- by rewrite addn1 exprS mulnC exprM exprS {1 3}defa ab1 expr1n mulr1.
- suff x1: x \in [1] by rewrite -oxp (set1P x1) order1 in p_pr.
- rewrite (subsetP ffulG) // inE Gx def_x defa defb -scalar_mx_block mulmx1.
- by rewrite mul1mx mulVmx ?eqxx.
-have{a b ne_ab def_ux def_vx} nx_uv (w : 'rV_2):
- (w *m rG x <= w -> w <= u \/ w <= v)%MS.
-- case/submxP=> c; have:= mulmxKV uB w.
- rewrite -[_ *m invmx B]hsubmxK [lsubmx _]mx11_scalar [rsubmx _]mx11_scalar.
- move: (_ 0) (_ 0) => dv du; rewrite mul_row_col !mul_scalar_mx => <-{w}.
- rewrite mulmxDl -!scalemxAl def_ux def_vx mulmxDr -!scalemxAr.
- rewrite !scalemxAl -!mul_row_col; move/(can_inj (mulmxK uB)).
- case/eq_row_mx => eqac eqbc; apply/orP.
- have [-> | nz_dv] := eqVneq dv 0; first by rewrite scale0r addr0 scalemx_sub.
- have [-> | nz_du] := eqVneq du 0.
- by rewrite orbC scale0r add0r scalemx_sub.
- case/eqP: ne_ab; rewrite -[b]scale1r -(mulVf nz_dv) -[a]scale1r.
- by rewrite -(mulVf nz_du) -!scalerA eqac eqbc !scalerA !mulVf.
-have{x Gx Qx oxp nx_uv} redG y (A := rG y):
- y \in G -> (u *m A <= u /\ v *m A <= v)%MS.
-- move=> Gy; have uA: row_free A by rewrite row_free_unit repr_mx_unit.
- have Ainj (w t : 'rV_2): (w *m A <= w -> t *m A <= w -> t *m A <= t)%MS.
- case/sub_rVP=> [c ryww] /sub_rVP[d rytw].
- rewrite -(submxMfree _ _ uA) rytw -scalemxAl ryww scalerA mulrC.
- by rewrite -scalerA scalemx_sub.
- have{Qx nx_uv} nAx w: Qfix w -> (w *m A <= u \/ w *m A <= v)%MS.
- move=> nwQ; apply: nx_uv; rewrite -mulmxA -repr_mxM // conjgCV.
- rewrite repr_mxM ?groupJ ?groupV // mulmxA submxMr // nwQ // -mem_conjg.
- by rewrite (normsP nQG).
- have [uAu | uAv] := nAx _ u_fix; have [vAu | vAv] := nAx _ v_fix; eauto.
- have [k ->]: exists k, A = A ^+ k.*2.
- exists #[y].+1./2; rewrite -mul2n -divn2 mulnC divnK.
- by rewrite -repr_mxX // expgS expg_order mulg1.
- by rewrite dvdn2 negbK; apply: oddSg oddG; rewrite cycle_subG.
- elim: k => [|k [IHu IHv]]; first by rewrite !mulmx1.
- case/sub_rVP: uAv => c uAc; case/sub_rVP: vAu => d vAd.
- rewrite doubleS !exprS !mulmxA; do 2!rewrite uAc vAd -!scalemxAl.
- by rewrite !scalemx_sub.
-suffices trivG': G^`(1)%g = 1%g.
- by rewrite /= trivG' cards1 gtnNdvd ?prime_gt1 in pG'.
-apply/trivgP; apply: subset_trans ffulG; rewrite gen_subG.
-apply/subsetP=> _ /imset2P[y z Gy Gz ->]; rewrite inE groupR //=.
-rewrite -(inj_eq (can_inj (mulKmx (repr_mx_unit rG (groupM Gz Gy))))).
-rewrite mul1mx mulmx1 -repr_mxM ?(groupR, groupM) // -commgC !repr_mxM //.
-rewrite -(inj_eq (can_inj (mulKmx uB))) !mulmxA !mul_col_mx.
-case/redG: Gy => /sub_rVP[a uya] /sub_rVP[b vyb].
-case/redG: Gz => /sub_rVP[c uzc] /sub_rVP[d vzd].
-by do 2!rewrite uya vyb uzc vzd -?scalemxAl; rewrite !scalerA mulrC (mulrC d).
-Qed.
-
-(* This is B & G, Theorem 2.6(a) *)
-Theorem charf'_GL2_abelian F gT (G : {group gT})
- (rG : mx_representation F G 2) :
- odd #|G| -> mx_faithful rG -> [char F]^'.-group G -> abelian G.
-Proof.
-move=> oddG ffG char'G; apply/commG1P/eqP.
-rewrite trivg_card1 (pnat_1 _ (pgroupS _ char'G)) ?comm_subG //=.
-exact: der1_odd_GL2_charf ffG.
-Qed.
-
-(* This is B & G, Theorem 2.6(b) *)
-Theorem charf_GL2_der_subS_abelian_Sylow p F gT (G : {group gT})
- (rG : mx_representation F G 2) :
- odd #|G| -> mx_faithful rG -> p \in [char F] ->
- exists P : {group gT}, [/\ p.-Sylow(G) P, abelian P & G^`(1)%g \subset P].
-Proof.
-move=> oddG ffG charFp.
-have{oddG} pG': p.-group G^`(1)%g.
- rewrite /pgroup -(eq_pnat _ (charf_eq charFp)).
- exact: der1_odd_GL2_charf ffG.
-have{pG'} [P SylP sG'P]:= Sylow_superset (der_sub _ _) pG'.
-exists P; split=> {sG'P}//; case/and3P: SylP => sPG pP _.
-apply/commG1P/trivgP; apply: subset_trans ffG; rewrite gen_subG.
-apply/subsetP=> _ /imset2P[y z Py Pz ->]; rewrite inE (subsetP sPG) ?groupR //=.
-pose rP := subg_repr rG sPG; pose U := rfix_mx rP P.
-rewrite -(inj_eq (can_inj (mulKmx (repr_mx_unit rP (groupM Pz Py))))).
-rewrite mul1mx mulmx1 -repr_mxM ?(groupR, groupM) // -commgC !repr_mxM //.
-have: U != 0 by apply: (rfix_pgroup_char charFp).
-rewrite -mxrank_eq0 -lt0n 2!leq_eqVlt ltnNge rank_leq_row orbF orbC eq_sym.
-case/orP=> [Ufull | Uscal].
- suffices{y z Py Pz} rP1 y: y \in P -> rP y = 1%:M by rewrite !rP1 ?mulmx1.
- move=> Py; apply/row_matrixP=> i.
- by rewrite rowE -row1 (rfix_mxP P _) ?submx_full.
-have [u defU]: exists u : 'rV_2, (u :=: U)%MS.
- by move: (row_base U) (eq_row_base U); rewrite -(eqP Uscal) => u; exists u.
-have fix_u: {in P, forall x, u *m rP x = u}.
- by move/eqmxP: defU; case/andP; move/rfix_mxP.
-have [v defUc]: exists u : 'rV_2, (u :=: U^C)%MS.
- have UCscal: \rank U^C = 1%N by rewrite mxrank_compl -(eqP Uscal).
- by move: (row_base _)%MS (eq_row_base U^C)%MS; rewrite UCscal => v; exists v.
-pose B := col_mx u v; have uB: B \in unitmx.
- rewrite -row_full_unit -sub1mx -(eqmxMfull _ (addsmx_compl_full U)).
- by rewrite mulmx1 -addsmxE addsmxS ?defU ?defUc.
-have Umod: mxmodule rP U by apply: rfix_mx_module.
-pose W := rfix_mx (factmod_repr Umod) P.
-have ntW: W != 0.
- apply: (rfix_pgroup_char charFp) => //.
- rewrite eqmxMfull ?row_full_unit ?unitmx_inv ?row_ebase_unit //.
- by rewrite rank_copid_mx -(eqP Uscal).
-have{ntW} Wfull: row_full W.
- by rewrite -col_leq_rank {1}mxrank_coker -(eqP Uscal) lt0n mxrank_eq0.
-have svW: (in_factmod U v <= W)%MS by rewrite submx_full.
-have fix_v: {in P, forall x, v *m rG x - v <= u}%MS.
- move=> x Px /=; rewrite -[v *m _](add_sub_fact_mod U) (in_factmodJ Umod) //.
- move/rfix_mxP: svW => -> //; rewrite in_factmodK ?defUc // addrK.
- by rewrite defU val_submodP.
-have fixB: {in P, forall x, exists2 a, u *m rG x = u & v *m rG x = v + a *: u}.
- move=> x Px; case/submxP: (fix_v x Px) => a def_vx.
- exists (a 0 0); first exact: fix_u.
- by rewrite addrC -mul_scalar_mx -mx11_scalar -def_vx subrK.
-rewrite -(inj_eq (can_inj (mulKmx uB))) // !mulmxA !mul_col_mx.
-case/fixB: Py => a uy vy; case/fixB: Pz => b uz vz.
-by rewrite uy uz vy vz !mulmxDl -!scalemxAl uy uz vy vz addrAC.
-Qed.
-
-(* This is B & G, Lemma 2.7. *)
-Lemma regular_abelem2_on_abelem2 p q gT (P Q : {group gT}) :
- p.-abelem P -> q.-abelem Q -> 'r_p(P) = 2 ->'r_q(Q) = 2 ->
- Q \subset 'N(P) -> 'C_Q(P) = 1%g ->
- (q %| p.-1)%N
- /\ (exists2 a, a \in Q^# & exists r,
- [/\ {in P, forall x, x ^ a = x ^+ r}%g,
- r ^ q = 1 %[mod p] & r != 1 %[mod p]]).
-Proof.
-move=> abelP abelQ; rewrite !p_rank_abelem // => logP logQ nPQ regQ.
-have ntP: P :!=: 1%g by case: eqP logP => // ->; rewrite cards1 logn1.
-have [p_pr _ _]:= pgroup_pdiv (abelem_pgroup abelP) ntP.
-have ntQ: Q :!=: 1%g by case: eqP logQ => // ->; rewrite cards1 logn1.
-have [q_pr _ _]:= pgroup_pdiv (abelem_pgroup abelQ) ntQ.
-pose rQ := abelem_repr abelP ntP nPQ.
-have [|P1 simP1 _] := dec_mxsimple_exists (mxmodule1 rQ).
- by rewrite oner_eq0.
-have [modP1 nzP1 _] := simP1.
-have ffulQ: mx_faithful rQ by apply: abelem_mx_faithful.
-have linP1: \rank P1 = 1%N.
- apply/eqP; have:= abelem_cyclic abelQ; rewrite logQ; apply: contraFT.
- rewrite neq_ltn ltnNge lt0n mxrank_eq0 nzP1 => P1full.
- have irrQ: mx_irreducible rQ.
- apply: mx_iso_simple simP1; apply: eqmx_iso; apply/eqmxP.
- by rewrite submx1 sub1mx -col_leq_rank {1}(dim_abelemE abelP ntP) logP.
- exact: mx_faithful_irr_abelian_cyclic irrQ (abelem_abelian abelQ).
-have ne_qp: q != p.
- move/implyP: (logn_quotient_cent_abelem nPQ abelP).
- by rewrite logP regQ indexg1 /=; case: eqP => // <-; rewrite logQ.
-have redQ: mx_completely_reducible rQ 1%:M.
- apply: mx_Maschke; apply: pi_pnat (abelem_pgroup abelQ) _.
- by rewrite inE /= (charf_eq (char_Fp p_pr)).
-have [P2 modP2 sumP12 dxP12] := redQ _ modP1 (submx1 _).
-have{dxP12} linP2: \rank P2 = 1%N.
- apply: (@addnI 1%N); rewrite -{1}linP1 -(mxdirectP dxP12) /= sumP12.
- by rewrite mxrank1 (dim_abelemE abelP ntP) logP.
-have{sumP12} [u def1]: exists u, 1%:M = u.1 *m P1 + u.2 *m P2.
- by apply/sub_addsmxP; rewrite sumP12.
-pose lam (Pi : 'M(P)) b := (nz_row Pi *m rQ b *m pinvmx (nz_row Pi)) 0 0.
-have rQ_lam Pi b:
- mxmodule rQ Pi -> \rank Pi = 1%N -> b \in Q -> Pi *m rQ b = lam Pi b *: Pi.
-- rewrite /lam => modPi linPi Qb; set v := nz_row Pi; set a := _ 0.
- have nz_v: v != 0 by rewrite nz_row_eq0 -mxrank_eq0 linPi.
- have sPi_v: (Pi <= v)%MS.
- by rewrite -mxrank_leqif_sup ?nz_row_sub // rank_rV nz_v linPi.
- have [v' defPi] := submxP sPi_v; rewrite {2}defPi scalemxAr -mul_scalar_mx.
- rewrite -mx11_scalar !(mulmxA v') -defPi mulmxKpV ?(submx_trans _ sPi_v) //.
- exact: (mxmoduleP modPi).
-have lam_q Pi b:
- mxmodule rQ Pi -> \rank Pi = 1%N -> b \in Q -> lam Pi b ^+ q = 1.
-- move=> modPi linPi Qb; apply/eqP; rewrite eq_sym -subr_eq0.
- have: \rank Pi != 0%N by rewrite linPi.
- apply: contraR; move/eqmx_scale=> <-.
- rewrite mxrank_eq0 scalerBl subr_eq0 -mul_mx_scalar -(repr_mx1 rQ).
- have <-: (b ^+ q = 1)%g by case/and3P: abelQ => _ _; move/exponentP->.
- apply/eqP; rewrite repr_mxX //.
- elim: (q) => [|k IHk]; first by rewrite scale1r mulmx1.
- by rewrite !exprS mulmxA rQ_lam // -scalemxAl IHk scalerA.
-pose f b := (lam P1 b, lam P2 b).
-have inj_f: {in Q &, injective f}.
- move=> b c Qb Qc /= [eq_bc1 eq_bc2]; apply: (mx_faithful_inj ffulQ) => //.
- rewrite -[rQ b]mul1mx -[rQ c]mul1mx {}def1 !mulmxDl -!mulmxA.
- by rewrite !{1}rQ_lam ?eq_bc1 ?eq_bc2.
-pose rs := [set x : 'F_p | x ^+ q == 1].
-have s_fQ_rs: f @: Q \subset setX rs rs.
- apply/subsetP=> _ /imsetP[b Qb ->].
- by rewrite !{1}inE /= !{1}lam_q ?eqxx.
-have le_rs_q: #|rs| <= q ?= iff (#|rs| == q).
- split; rewrite // cardE max_unity_roots ?enum_uniq ?prime_gt0 //.
- by apply/allP=> x; rewrite mem_enum inE unity_rootE.
-have:= subset_leqif_card s_fQ_rs.
-rewrite card_in_imset // (card_pgroup (abelem_pgroup abelQ)) logQ.
-case/(leqif_trans (leqif_mul le_rs_q le_rs_q))=> _; move/esym.
-rewrite cardsX eqxx andbb muln_eq0 orbb eqn0Ngt prime_gt0 //= => /andP[rs_q].
-rewrite subEproper /proper {}s_fQ_rs andbF orbF => /eqP rs2_Q.
-have: ~~ (rs \subset [set 1 : 'F_p]).
- apply: contraL (prime_gt1 q_pr); move/subset_leq_card.
- by rewrite cards1 (eqnP rs_q) leqNgt.
-case/subsetPn => r rs_r; rewrite inE => ne_r_1.
-have rq1: r ^+ q = 1 by apply/eqP; rewrite inE in rs_r.
-split.
- have Ur: r \in GRing.unit.
- by rewrite -(unitrX_pos _ (prime_gt0 q_pr)) rq1 unitr1.
- pose u_r : {unit 'F_p} := Sub r Ur; have:= order_dvdG (in_setT u_r).
- rewrite card_units_Zp ?pdiv_gt0 // {2}/pdiv primes_prime //=.
- rewrite (@totient_pfactor p 1) // muln1; apply: dvdn_trans.
- have: (u_r ^+ q == 1)%g.
- by rewrite -val_eqE unit_Zp_expg -Zp_nat natrX natr_Zp rq1.
- case/primeP: q_pr => _ q_min; rewrite -order_dvdn; move/q_min.
- by rewrite order_eq1 -val_eqE (negPf ne_r_1) /=; move/eqnP->.
-have /imsetP[a Qa [def_a1 def_a2]]: (r, r) \in f @: Q.
- by rewrite -rs2_Q inE andbb.
-have rQa: rQ a = r%:M.
- rewrite -[rQ a]mul1mx def1 mulmxDl -!mulmxA !rQ_lam //.
- by rewrite -def_a1 -def_a2 !linearZ -scalerDr -def1 /= scalemx1.
-exists a.
- rewrite !inE Qa andbT; apply: contra ne_r_1 => a1.
- by rewrite (eqP a1) repr_mx1 in rQa; rewrite (fmorph_inj _ rQa).
-exists r; rewrite -!val_Fp_nat // natrX natr_Zp rq1.
-split=> // x Px; apply: (@abelem_rV_inj _ _ _ abelP ntP); rewrite ?groupX //.
- by rewrite memJ_norm ?(subsetP nPQ).
-by rewrite abelem_rV_X // -mul_mx_scalar natr_Zp -rQa -abelem_rV_J.
-Qed.
-
-End BGsection2.
diff --git a/mathcomp/odd_order/BGsection3.v b/mathcomp/odd_order/BGsection3.v
deleted file mode 100644
index 5e9f5db..0000000
--- a/mathcomp/odd_order/BGsection3.v
+++ /dev/null
@@ -1,1832 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div.
-From mathcomp
-Require Import fintype tuple bigop prime binomial finset ssralg fingroup finalg.
-From mathcomp
-Require Import morphism perm automorphism quotient action commutator gproduct.
-From mathcomp
-Require Import zmodp cyclic gfunctor center pgroup gseries nilpotent sylow.
-From mathcomp
-Require Import finmodule abelian frobenius maximal extremal hall.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation mxabelem wielandt_fixpoint.
-From mathcomp
-Require Import BGsection1 BGsection2.
-
-(******************************************************************************)
-(* This file covers the material in B & G, Section 3. *)
-(* Note that in spite of the use of Gorenstein 2.7.6, the material in all *)
-(* of Section 3, and in all likelyhood the whole of B & G, does NOT depend on *)
-(* the general proof of existence of Frobenius kernels, because results on *)
-(* Frobenius groups are only used when the semidirect product decomposition *)
-(* is already known, and (see file frobenius.v) in this case the kernel is *)
-(* equal to the normal complement of the Frobenius complement. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Local Open Scope ring_scope.
-Import GroupScope GRing.Theory.
-
-Section BGsection3.
-
-Implicit Type F : fieldType.
-Implicit Type gT : finGroupType.
-Implicit Type p : nat.
-
-(* B & G, Lemma 3.1 is covered by frobenius.Frobenius_semiregularP. *)
-
-(* This is B & G, Lemma 3.2. *)
-Section FrobeniusQuotient.
-
-Variables (gT : finGroupType) (G K R : {group gT}).
-Implicit Type N : {group gT}.
-
-(* This is a special case of B & G, Lemma 3.2 (b). *)
-Lemma Frobenius_proper_quotient N :
- [Frobenius G = K ><| R] -> solvable K -> N <| G -> N \proper K ->
- [Frobenius G / N = (K / N) ><| (R / N)].
-Proof.
-move=> frobG solK nsNG /andP[sNK ltNK].
-have [defG _ ntR _ _] := Frobenius_context frobG.
-have [nsKG sRG defKR nKR tiKR] := sdprod_context defG; have [sKG _]:= andP nsKG.
-have nsNK := normalS sNK sKG nsNG.
-apply/Frobenius_semiregularP=> [|||Nx].
-- rewrite sdprodE ?quotient_norms //.
- by rewrite -quotientMl ?defKR ?normal_norm.
- by rewrite -quotientGI // tiKR quotient1.
-- by rewrite -subG1 quotient_sub1 ?normal_norm.
-- rewrite -subG1 quotient_sub1; last by rewrite (subset_trans sRG) ?normal_norm.
- apply: contra ntR => sRN.
- by rewrite -subG1 -tiKR subsetI (subset_trans sRN) /=.
-rewrite !inE andbC => /andP[/morphimP[x nNx Rx ->{Nx}] notNx].
-apply/trivgP; rewrite /= -cent_cycle -quotient_cycle //.
-rewrite -coprime_quotient_cent ?cycle_subG //; last first.
- by apply: coprimegS (Frobenius_coprime frobG); rewrite cycle_subG.
-rewrite cent_cycle (Frobenius_reg_ker frobG) ?quotient1 // !inE Rx andbT.
-by apply: contraNneq notNx => ->; rewrite morph1.
-Qed.
-
-(* This is B & G, Lemma 3.2 (a). *)
-Lemma Frobenius_normal_proper_ker N :
- [Frobenius G = K ><| R] -> solvable K -> N <| G -> ~~ (K \subset N) ->
- N \proper K.
-Proof.
-move=> frobG solK nsNG ltNK; have [sNG nNG] := andP nsNG; pose H := N :&: K.
-have [defG _ ntR _ _] := Frobenius_context frobG.
-have [nsKG _ /mulG_sub[sKG _] nKR tiKR] := sdprod_context defG.
-have nsHG: H <| G := normalI nsNG nsKG; have [_ nHG] := andP nsHG.
-have ltHK: H \proper K by rewrite /proper subsetIr subsetI subxx andbT.
-suffices /eqP tiNR: N :&: R == 1.
- rewrite /proper ltNK andbT -(setIidPl sNG).
- rewrite -(cover_partition (Frobenius_partition frobG)) big_distrr /=.
- apply/bigcupsP=> _ /setU1P[->| /imsetP[x Kx ->]]; first exact: subsetIr.
- rewrite conjD1g setIDA subDset -(normsP (subset_trans sKG nNG) x) //.
- by rewrite -conjIg tiNR conjs1g subsetUl.
-suffices: (N :&: R) / H \subset [1].
- by rewrite -subG1 quotient_sub1 ?normsGI // -subsetIidr setIACA tiKR setIg1.
-have frobGq := Frobenius_proper_quotient frobG solK nsHG ltHK.
-have [_ ntKq _ _ _] := Frobenius_context frobGq.
-rewrite -(cent_semiregular (Frobenius_reg_compl frobGq) _ ntKq) //.
-rewrite subsetI quotientS ?subsetIr // quotient_cents2r //.
-by rewrite commg_subI ?setIS // subsetIidl (subset_trans sKG).
-Qed.
-
-(* This is B & G, Lemma 3.2 (b). *)
-Lemma Frobenius_quotient N :
- [Frobenius G = K ><| R] -> solvable K -> N <| G -> ~~ (K \subset N) ->
- [Frobenius G / N = (K / N) ><| (R / N)].
-Proof.
-move=> frobG solK nsNG ltKN; apply: Frobenius_proper_quotient => //.
-exact: (Frobenius_normal_proper_ker frobG).
-Qed.
-
-End FrobeniusQuotient.
-
-(* This is B & G, Lemma 3.3. *)
-Lemma Frobenius_rfix_compl F gT (G K R : {group gT}) n
- (rG : mx_representation F G n) :
- [Frobenius G = K ><| R] -> [char F]^'.-group K ->
- ~~ (K \subset rker rG) -> rfix_mx rG R != 0.
-Proof.
-rewrite /pgroup charf'_nat => frobG nzK.
-have [defG _ _ ltKG ltRG]:= Frobenius_context frobG.
-have{ltKG ltRG} [sKG sRG]: K \subset G /\ R \subset G by rewrite !proper_sub.
-apply: contraNneq => fixR0; rewrite rfix_mx_rstabC // -(eqmx_scale _ nzK).
-pose gsum H := gring_op rG (gset_mx F G H).
-have fixsum (H : {group gT}): H \subset G -> (gsum H <= rfix_mx rG H)%MS.
- move/subsetP=> sHG; apply/rfix_mxP=> x Hx; have Gx := sHG x Hx.
- rewrite -gring_opG // -gring_opM ?envelop_mx_id //; congr (gring_op _ _).
- rewrite {2}/gset_mx (reindex_acts 'R _ Hx) ?astabsR //= mulmx_suml.
- by apply: eq_bigr=> y; move/sHG=> Gy; rewrite repr_mxM.
-have: gsum G + rG 1 *+ #|K| = gsum K + \sum_(x in K) gsum (R :^ x).
- rewrite -gring_opG // -sumr_const -!linear_sum -!linearD; congr gring_op.
- rewrite {1}/gset_mx (set_partition_big _ (Frobenius_partition frobG)) /=.
- rewrite big_setU1 -?addrA /=; last first.
- by apply: contraL (group1 K) => /imsetP[x _ ->]; rewrite conjD1g !inE eqxx.
- congr (_ + _); rewrite big_imset /= => [|x y Kx Ky /= eqRxy]; last first.
- have [/eqP/sdprodP[_ _ _ tiKR] _ _ _ /eqP snRG] := and5P frobG.
- apply/eqP; rewrite eq_mulgV1 -in_set1 -set1gE -tiKR -snRG setIA.
- by rewrite (setIidPl sKG) !inE conjsgM eqRxy actK groupM /= ?groupV.
- rewrite -big_split; apply: eq_bigr => x Kx /=.
- by rewrite addrC conjD1g -big_setD1 ?group1.
-have ->: gsum G = 0.
- apply/eqP; rewrite -submx0 -fixR0; apply: submx_trans (rfix_mxS rG sRG).
- exact: fixsum.
-rewrite repr_mx1 -scaler_nat add0r => ->.
-rewrite big1 ?addr0 ?fixsum // => x Kx; have Gx := subsetP sKG x Kx.
-apply/eqP; rewrite -submx0 (submx_trans (fixsum _ _)) ?conj_subG //.
-by rewrite -(mul0mx _ (rG x)) -fixR0 rfix_mx_conjsg.
-Qed.
-
-(* This is Aschbacher (40.6)(3), or G. (3.14)(iii). *)
-Lemma regular_pq_group_cyclic gT p q (H R : {group gT}) :
- [/\ prime p, prime q & p != q] -> #|R| = (p * q)%N ->
- H :!=: 1 -> R \subset 'N(H) -> semiregular H R ->
- cyclic R.
-Proof.
-case=> pr_p pr_q q'p oR ntH nHR regHR.
-without loss{q'p} ltpq: p q pr_p pr_q oR / p < q.
- by move=> IH; case: ltngtP q'p => // /IH-> //; rewrite mulnC.
-have [p_gt0 q_gt0]: 0 < p /\ 0 < q by rewrite !prime_gt0.
-have [[P sylP] [Q sylQ]] := (Sylow_exists p R, Sylow_exists q R).
-have [sPR sQR] := (pHall_sub sylP, pHall_sub sylQ).
-have [oP oQ]: #|P| = p /\ #|Q| = q.
- rewrite (card_Hall sylQ) (card_Hall sylP) oR !p_part !lognM ?logn_prime //.
- by rewrite !eqxx eq_sym gtn_eqF.
-have [ntP ntQ]: P :!=: 1 /\ Q :!=: 1 by rewrite -!cardG_gt1 oP oQ !prime_gt1.
-have nQR: R \subset 'N(Q).
- rewrite -subsetIidl -indexg_eq1 -(card_Syl_mod R pr_q) (card_Syl sylQ) /=.
- rewrite modn_small // -divgS ?subsetIl ?ltn_divLR // mulnC oR ltn_pmul2r //.
- by rewrite (leq_trans ltpq) // -oQ subset_leq_card // subsetI sQR normG.
-have coQP: coprime #|Q| #|P|.
- by rewrite oP oQ prime_coprime ?dvdn_prime2 ?gtn_eqF.
-have defR: Q ><| P = R.
- rewrite sdprodE ?coprime_TIg ?(subset_trans sPR) //.
- by apply/eqP; rewrite eqEcard mul_subG //= oR coprime_cardMg // oP oQ mulnC.
-have [cycP cycQ]: cyclic P /\ cyclic Q by rewrite !prime_cyclic ?oP ?oQ.
-suffices cQP: P \subset 'C(Q) by rewrite (@cyclic_dprod _ Q P) ?dprodEsd.
-without loss /is_abelemP[r pr_r abelH]: H ntH nHR regHR / is_abelem H.
- move=> IH; have [r _ rH] := rank_witness H.
- have solR: solvable R.
- apply/metacyclic_sol/metacyclicP; exists Q.
- by rewrite /(Q <| R) sQR -(isog_cyclic (sdprod_isog defR)).
- have coHR: coprime #|H| #|R| := regular_norm_coprime nHR regHR.
- have [H1 sylH1 nH1R] := sol_coprime_Sylow_exists r solR nHR coHR.
- have ntH1: H1 :!=: 1 by rewrite -rank_gt0 (rank_Sylow sylH1) -rH rank_gt0.
- have [H2 minH2 sH21] := minnormal_exists ntH1 nH1R.
- have [sH1H rH1 _] := and3P sylH1; have sH2H := subset_trans sH21 sH1H.
- have [nH2R ntH2 abelH2] := minnormal_solvable minH2 sH21 (pgroup_sol rH1).
- by apply: IH abelH2 => //; apply: semiregularS regHR.
-have: rfix_mx (abelem_repr abelH ntH nHR) P == 0.
- rewrite -mxrank_eq0 rfix_abelem // mxrank_eq0 rowg_mx_eq0 /=.
- by rewrite (cent_semiregular regHR) ?morphim1.
-apply: contraLR => not_cQP; have{not_cQP} frobR: [Frobenius R = Q ><| P].
- by apply/prime_FrobeniusP; rewrite ?prime_TIg ?oP ?oQ // centsC.
-apply: (Frobenius_rfix_compl frobR).
- rewrite (eq_p'group _ (charf_eq (char_Fp pr_r))).
- rewrite (coprime_p'group _ (abelem_pgroup abelH)) //.
- by rewrite coprime_sym (coprimegS sQR) ?regular_norm_coprime.
-rewrite rker_abelem subsetI sQR centsC.
-by rewrite -subsetIidl (cent_semiregular regHR) ?subG1.
-Qed.
-
-(* This is B & G, Theorem 3.4. *)
-Theorem odd_prime_sdprod_rfix0 F gT (G K R : {group gT}) n
- (rG : mx_representation F G n) :
- K ><| R = G -> solvable G -> odd #|G| -> coprime #|K| #|R| -> prime #|R| ->
- [char F]^'.-group G -> rfix_mx rG R = 0 ->
- [~: R, K] \subset rker rG.
-Proof.
-move: {2}_.+1 (ltnSn #|G|) => m; elim: m => // m IHm in gT G K R n rG *.
-rewrite ltnS; set p := #|R| => leGm defG solG oddG coKR p_pr F'G regR.
-have [nsKG sRG defKR nKR tiKR] := sdprod_context defG.
-have [sKG nKG] := andP nsKG; have solK := solvableS sKG solG.
-have [-> | ntK] := eqsVneq K 1; first by rewrite commG1 sub1G.
-have ker_ltK (H : {group gT}):
- H \proper K -> R \subset 'N(H) -> [~: R, H] \subset rker rG.
-- move=> ltKH nHR; have sHK := proper_sub ltKH; set G1 := H <*> R.
- have sG1G: G1 \subset G by rewrite join_subG (subset_trans sHK).
- have coHR := coprimeSg sHK coKR.
- have defG1: H ><| R = G1 by rewrite sdprodEY // coprime_TIg.
- apply: subset_trans (subsetIr G1 _); rewrite -(rker_subg _ sG1G).
- apply: IHm; rewrite ?(solvableS sG1G) ?(oddSg sG1G) ?(pgroupS sG1G) //.
- apply: leq_trans leGm; rewrite /= norm_joinEr // -defKR !coprime_cardMg //.
- by rewrite ltn_pmul2r ?proper_card.
-without loss [q q_pr qK]: / exists2 q, prime q & q.-group K.
- move=> IH; set q := pdiv #|K|.
- have q_pr: prime q by rewrite pdiv_prime ?cardG_gt1.
- have exHall := coprime_Hall_exists _ nKR coKR solK.
- have [Q sylQ nQR] := exHall q; have [Q' hallQ' nQ'R] := exHall q^'.
- have [sQK qQ _] := and3P sylQ; have [sQ'K q'Q' _] := and3P hallQ'.
- without loss{IH} ltQK: / Q \proper K.
- by rewrite properEneq; case: eqP IH => [<- -> | _ _ ->] //; exists q.
- have ltQ'K: Q' \proper K.
- rewrite properEneq; case: eqP (pgroupP q'Q' q q_pr) => //= ->.
- by rewrite !inE pdiv_dvd eqxx; apply.
- have nkerG := subset_trans _ (rker_norm rG).
- rewrite -quotient_cents2 ?nkerG //.
- have <-: Q * Q' = K.
- apply/eqP; rewrite eqEcard mulG_subG sQK sQ'K.
- rewrite coprime_cardMg ?(pnat_coprime qQ) //=.
- by rewrite (card_Hall sylQ) (card_Hall hallQ') partnC.
- rewrite quotientMl ?nkerG ?(subset_trans sQK) // centM subsetI.
- by rewrite !quotient_cents2r ?ker_ltK.
-without loss{m IHm leGm} [ffulG cycZ]: / rker rG = 1 /\ cyclic 'Z(G).
- move=> IH; wlog [I M /= simM sumM _]: / mxsemisimple rG 1%:M.
- exact: (mx_reducible_semisimple (mxmodule1 _) (mx_Maschke _ F'G)).
- pose not_cRK_M i := ~~ ([~: R, K] \subset rstab rG (M i)).
- case: (pickP not_cRK_M) => [i | cRK_M]; last first.
- rewrite rfix_mx_rstabC ?comm_subG // -sumM.
- apply/sumsmx_subP=> i _; move/negbFE: (cRK_M i).
- by rewrite rfix_mx_rstabC ?comm_subG.
- have [modM ntM _] := simM i; pose rM := kquo_repr (submod_repr modM).
- do [rewrite {+}/not_cRK_M -(rker_submod modM) /=; set N := rker _] in rM *.
- have [N1 _ | ntN] := eqVneq N 1.
- apply: IH; split.
- by apply/trivgP; rewrite -N1 /N rker_submod rstabS ?submx1.
- have: mx_irreducible (submod_repr modM) by apply/submod_mx_irr.
- by apply: mx_faithful_irr_center_cyclic; apply/trivgP.
- have tiRN: R :&: N = 1.
- by apply: prime_TIg; rewrite //= rker_submod rfix_mx_rstabC // regR submx0.
- have nsNG: N <| G := rker_normal _; have [sNG nNG] := andP nsNG.
- have nNR := subset_trans sRG nNG.
- have sNK: N \subset K.
- have [pi hallK]: exists pi, pi.-Hall(G) K.
- by apply: HallP; rewrite -(coprime_sdprod_Hall_l defG).
- rewrite (sub_normal_Hall hallK) //=.
- apply: pnat_dvd (pHall_pgroup hallK).
- rewrite -(dvdn_pmul2r (prime_gt0 p_pr)) -!TI_cardMg // 1?setIC // defKR.
- by rewrite -norm_joinEr // cardSg // join_subG sNG.
- have defGq: (K / N) ><| (R / N) = G / N.
- rewrite sdprodE ?quotient_norms -?quotientMr ?defKR //.
- by rewrite -quotientGI // tiKR quotient1.
- case/negP; rewrite -quotient_cents2 ?(subset_trans _ nNG) //= -/N.
- rewrite (sameP commG1P trivgP).
- apply: subset_trans (kquo_mx_faithful (submod_repr modM)).
- rewrite IHm ?quotient_sol ?coprime_morph ?morphim_odd ?quotient_pgroup //.
- - by apply: leq_trans leGm; apply: ltn_quotient.
- - by rewrite card_quotient // -indexgI tiRN indexg1.
- apply/eqP; rewrite -submx0 rfix_quo // rfix_submod //.
- by rewrite regR capmx0 linear0 sub0mx.
-without loss perfectK: / [~: K, R] = K.
- move=> IH; have: [~: K, R] \subset K by rewrite commg_subl.
- rewrite subEproper; case/predU1P=> //; move/ker_ltK.
- by rewrite commGC commg_normr coprime_commGid // commGC => ->.
-have primeR: {in R^#, forall x, 'C_K[x] = 'C_K(R)}.
- move=> x; case/setD1P=> nt_x Rx; rewrite -cent_cycle ((<[x]> =P R) _) //.
- rewrite eqEsubset cycle_subG Rx; apply: contraR nt_x; move/prime_TIg.
- by rewrite -cycle_eq1 (setIidPr _) ?cycle_subG // => ->.
-case cKK: (abelian K).
- rewrite commGC perfectK; move/eqP: regR; apply: contraLR.
- apply: Frobenius_rfix_compl => //; last exact: pgroupS F'G.
- rewrite -{2 4}perfectK coprime_abel_cent_TI // in primeR.
- by apply/Frobenius_semiregularP; rewrite // -cardG_gt1 prime_gt1.
-have [spK defZK]: special K /\ 'C_K(R) = 'Z(K).
- apply: (abelian_charsimple_special qK) => //.
- apply/bigcupsP=> H /andP[chHK cHH].
- have:= char_sub chHK; rewrite subEproper.
- case/predU1P=> [eqHK | ltHK]; first by rewrite eqHK cKK in cHH.
- have nHR: R \subset 'N(H) := char_norm_trans chHK nKR.
- by rewrite (sameP commG1P trivgP) /= commGC -ffulG ker_ltK.
-have{spK} esK: extraspecial K.
- have abelZK := center_special_abelem qK spK; have [qZK _] := andP abelZK.
- have /(pgroup_pdiv qZK)[_ _ []]: 'Z(K) != 1.
- by case: spK => _ <-; rewrite (sameP eqP commG1P) -abelianE cKK.
- case=> [|e] oK; first by split; rewrite ?oK.
- suffices: cyclic 'Z(K) by rewrite (abelem_cyclic abelZK) oK pfactorK.
- rewrite (cyclicS _ cycZ) // subsetI subIset ?sKG //=.
- by rewrite -defKR centM subsetI -{2}defZK !subsetIr.
-have [e e_gt0 oKqe] := card_extraspecial qK esK.
-have cycR: cyclic R := prime_cyclic p_pr.
-have co_q_p: coprime q p by rewrite oKqe coprime_pexpl in coKR.
-move/eqP: regR; case/idPn.
-rewrite defZK in primeR.
-case: (repr_extraspecial_prime_sdprod_cycle _ _ defG _ oKqe) => // _.
-apply=> //; last exact/trivgP.
-apply: contraL (oddSg sRG oddG); move/eqP->; have:= oddSg sKG oddG.
-by rewrite oKqe addn1 /= !odd_exp /= orbC => ->.
-Qed.
-
-(* Internal action version of B & G, Theorem 3.4. *)
-Theorem odd_prime_sdprod_abelem_cent1 k gT (G K R V : {group gT}) :
- solvable G -> odd #|G| -> K ><| R = G -> coprime #|K| #|R| -> prime #|R| ->
- k.-abelem V -> G \subset 'N(V) -> k^'.-group G -> 'C_V(R) = 1 ->
- [~: R, K] \subset 'C_K(V).
-Proof.
-move=> solG oddG defG coKR prR abelV nVG k'G regR.
-have [_ sRG _ nKR _] := sdprod_context defG; rewrite subsetI commg_subr nKR.
-case: (eqsVneq V 1) => [-> | ntV]; first exact: cents1.
-pose rV := abelem_repr abelV ntV nVG.
-apply: subset_trans (_ : rker rV \subset _); last first.
- by rewrite rker_abelem subsetIr.
-apply: odd_prime_sdprod_rfix0 => //.
- have k_pr: prime k by case/pgroup_pdiv: (abelem_pgroup abelV).
- by rewrite (eq_pgroup G (eq_negn (charf_eq (char_Fp k_pr)))).
-by apply/eqP; rewrite -submx0 rfix_abelem //= regR morphim1 rowg_mx1.
-Qed.
-
-(* This is B & G, Theorem 3.5. *)
-Theorem Frobenius_prime_rfix1 F gT (G K R : {group gT}) n
- (rG : mx_representation F G n) :
- K ><| R = G -> solvable G -> prime #|R| -> 'C_K(R) = 1 ->
- [char F]^'.-group G -> \rank (rfix_mx rG R) = 1%N ->
- K^`(1) \subset rker rG.
-Proof.
-move=> defG solG p_pr regR F'G fixRlin.
-wlog closF: F rG F'G fixRlin / group_closure_field F gT.
- move=> IH; apply: (@group_closure_field_exists gT F) => [[Fc f closFc]].
- rewrite -(rker_map f) IH //; last by rewrite -map_rfix_mx mxrank_map.
- by rewrite (eq_p'group _ (fmorph_char f)).
-move: {2}_.+1 (ltnSn #|K|) => m.
-elim: m => // m IHm in gT G K R rG solG p_pr regR F'G closF fixRlin defG *.
-rewrite ltnS => leKm.
-have [nsKG sRG defKR nKR tiKR] := sdprod_context defG.
-have [sKG nKG] := andP nsKG; have solK := solvableS sKG solG.
-have cycR := prime_cyclic p_pr.
-case: (eqsVneq K 1) => [-> | ntK]; first by rewrite derg1 commG1 sub1G.
-have defR x: x \in R^# -> <[x]> = R.
- case/setD1P; rewrite -cycle_subG -cycle_eq1 => ntX sXR.
- apply/eqP; rewrite eqEsubset sXR; apply: contraR ntX => /(prime_TIg p_pr).
- by rewrite /= (setIidPr sXR) => ->.
-have ntR: R :!=: 1 by rewrite -cardG_gt1 prime_gt1.
-have frobG: [Frobenius G = K ><| R].
- by apply/Frobenius_semiregularP=> // x Rx; rewrite -cent_cycle defR.
-case: (eqVneq (rker rG) 1) => [ffulG | ntC]; last first.
- set C := rker rG in ntC *; have nsCG: C <| G := rker_normal rG.
- have [sCG nCG] := andP nsCG.
- have nCK := subset_trans sKG nCG; have nCR := subset_trans sRG nCG.
- case sKC: (K \subset C); first exact: gFsub_trans.
- have sCK: C \subset K.
- by rewrite proper_sub // (Frobenius_normal_proper_ker frobG) ?sKC.
- have frobGq: [Frobenius G / C = (K / C) ><| (R / C)].
- by apply: Frobenius_quotient; rewrite ?sKC.
- have [defGq _ ntRq _ _] := Frobenius_context frobGq.
- rewrite -quotient_sub1 ?comm_subG ?quotient_der //= -/C.
- apply: subset_trans (kquo_mx_faithful rG).
- apply: IHm defGq _; rewrite 1?(quotient_sol, quotient_pgroup, rfix_quo) //.
- - rewrite card_quotient // -indexgI /= -/C setIC.
- by rewrite -(setIidPl sCK) -setIA tiKR (setIidPr (sub1G _)) indexg1.
- - have: cyclic (R / C) by [rewrite quotient_cyclic]; case/cyclicP=> Cx defRq.
- rewrite /= defRq cent_cycle (Frobenius_reg_ker frobGq) //= !inE defRq.
- by rewrite cycle_id -cycle_eq1 -defRq ntRq.
- - move=> Hq; rewrite -(group_inj (cosetpreK Hq)).
- by apply: quotient_splitting_field; rewrite ?subsetIl.
- by apply: leq_trans leKm; apply: ltn_quotient.
-have ltK_abelian (N : {group gT}): R \subset 'N(N) -> N \proper K -> abelian N.
- move=> nNR ltNK; have [sNK _] := andP ltNK; apply/commG1P/trivgP.
- rewrite -(setIidPr (sub1G (N <*> R))) /= -ffulG; set G1 := N <*> R.
- have sG1: G1 \subset G by rewrite join_subG (subset_trans sNK).
- have defG1: N ><| R = G1.
- by rewrite sdprodEY //; apply/trivgP; rewrite -tiKR setSI.
- rewrite -(rker_subg _ sG1).
- apply: IHm defG1 _; rewrite ?(solvableS sG1) ?(pgroupS sG1) //.
- by apply/trivgP; rewrite -regR setSI.
- by apply: leq_trans leKm; apply: proper_card.
-have cK'K': abelian K^`(1).
- exact: ltK_abelian (gFnorm_trans _ nKR) (sol_der1_proper solK _ ntK).
-pose fixG := rfix_mx rG; pose NRmod N (U : 'M_n) := N <*> R \subset rstabs rG U.
-have dx_modK_rfix (N : {group gT}) U V:
- N \subset K -> R \subset 'N(N) -> NRmod N U -> NRmod N V ->
- mxdirect (U + V) -> (U <= fixG N)%MS || (V <= fixG N)%MS.
-- move=> sNK nNR nUNR nVNR dxUV.
- have [-> | ntN] := eqsVneq N 1; first by rewrite -rfix_mx_rstabC sub1G.
- have sNRG: N <*> R \subset G by rewrite join_subG (subset_trans sNK).
- pose rNR := subg_repr rG sNRG.
- have nfixU W: NRmod N W -> ~~ (W <= fixG N)%MS -> (fixG R <= W)%MS.
- move=> nWN not_cWN; rewrite (sameP capmx_idPr eqmxP).
- rewrite -(geq_leqif (mxrank_leqif_eq (capmxSr _ _))) fixRlin lt0n.
- rewrite mxrank_eq0 -(in_submodK (capmxSl _ _)) val_submod_eq0.
- have modW: mxmodule rNR W by rewrite /mxmodule rstabs_subg subsetI subxx.
- rewrite -(eqmx_eq0 (rfix_submod modW _)) ?joing_subr //.
- apply: Frobenius_rfix_compl (pgroupS (subset_trans sNK sKG) F'G) _.
- apply/Frobenius_semiregularP=> // [|x Rx].
- by rewrite sdprodEY //; apply/trivgP; rewrite -tiKR setSI.
- by apply/trivgP; rewrite -regR /= -cent_cycle defR ?setSI.
- by rewrite rker_submod rfix_mx_rstabC ?joing_subl.
- have: fixG R != 0 by rewrite -mxrank_eq0 fixRlin.
- apply: contraR; case/norP=> not_fixU not_fixW.
- by rewrite -submx0 -(mxdirect_addsP dxUV) sub_capmx !nfixU.
-have redG := mx_Maschke rG F'G.
-wlog [U simU nfixU]: / exists2 U, mxsimple rG U & ~~ (U <= fixG K)%MS.
- move=> IH; wlog [I U /= simU sumU _]: / mxsemisimple rG 1%:M.
- exact: (mx_reducible_semisimple (mxmodule1 _) redG).
- have [i nfixU | fixK] := pickP (fun i => ~~ (U i <= fixG K)%MS).
- by apply: IH; exists (U i).
- rewrite gFsub_trans // rfix_mx_rstabC // -sumU.
- by apply/sumsmx_subP=> i _; apply/idPn; rewrite fixK.
-have [modU ntU minU] := simU; pose rU := submod_repr modU.
-have irrU: mx_irreducible rU by apply/submod_mx_irr.
-have [W modW sumUW dxUW] := redG U modU (submx1 U).
-have cWK: (W <= fixG K)%MS.
- have:= dx_modK_rfix _ _ _ (subxx _) nKR _ _ dxUW.
- by rewrite /NRmod /= norm_joinEr // defKR (negPf nfixU); apply.
-have nsK'G: K^`(1) <| G by rewrite gFnormal_trans.
-have [sK'G nK'G] := andP nsK'G.
-suffices nregK'U: (rfix_mx rU K^`(1))%MS != 0.
- rewrite rfix_mx_rstabC ?normal_sub // -sumUW addsmx_sub andbC.
- rewrite (submx_trans cWK) ?rfix_mxS ?der_sub //= (sameP capmx_idPl eqmxP).
- rewrite minU ?capmxSl ?capmx_module ?normal_rfix_mx_module //.
- apply: contra nregK'U => cUK'; rewrite (eqmx_eq0 (rfix_submod _ _)) //.
- by rewrite (eqP cUK') linear0.
-pose rK := subg_repr rU (normal_sub nsKG); set p := #|R| in p_pr.
-wlog sK: / socleType rK by apply: socle_exists.
-have [i _ def_sK]: exists2 i, i \in setT & [set: sK] = orbit 'Cl G i.
- exact/imsetP/Clifford_atrans.
-have card_sK: #|[set: sK]| = #|G : 'C[i | 'Cl]|.
- by rewrite def_sK card_orbit_in ?indexgI.
-have ciK: K \subset 'C[i | 'Cl].
- apply: subset_trans (astabS _ (subsetT _)).
- by apply: subset_trans (Clifford_astab _); apply: joing_subl.
-pose M := socle_base i; have simM: mxsimple rK M := socle_simple i.
-have [sKp | sK1 {ciK card_sK}]: #|[set: sK]| = p \/ #|[set: sK]| = 1%N.
-- apply/pred2P; rewrite orbC card_sK; case/primeP: p_pr => _; apply.
- by rewrite (_ : p = #|G : K|) ?indexgS // -divgS // -(sdprod_card defG) mulKn.
-- have{def_sK} def_sK: [set: sK] = orbit 'Cl R i.
- apply/eqP; rewrite eq_sym -subTset def_sK -[G in orbit _ G i]defKR.
- apply/subsetP=> _ /imsetP[_ /imset2P[y z /(subsetP ciK)ciy Rz ->] ->].
- rewrite !(inE, sub1set) in ciy; have{ciy}[Gy /eqP-ciy]:= andP ciy.
- by rewrite actMin ?(subsetP sRG z Rz) // ciy mem_orbit.
- have inj_i: {in R &, injective ('Cl%act i)}.
- apply/dinjectiveP/card_uniqP; rewrite size_map -cardE -/p.
- by rewrite -sKp def_sK /orbit [in _ @: _]unlock cardsE.
- pose sM := (\sum_(y in R) M *m rU y)%MS.
- have dxM: mxdirect sM.
- apply/mxdirect_sumsP=> y Ry; have Gy := subsetP sRG y Ry.
- pose j := 'Cl%act i y.
- apply/eqP; rewrite -submx0 -{2}(mxdirect_sumsP (Socle_direct sK) j) //.
- rewrite capmxS ?val_Clifford_act // ?submxMr ?component_mx_id //.
- apply/sumsmx_subP => z; case/andP=> Rz ne_z_y; have Gz := subsetP sRG z Rz.
- rewrite (sumsmx_sup ('Cl%act i z)) ?(inj_in_eq inj_i) //.
- by rewrite val_Clifford_act // ?submxMr // ?component_mx_id.
- pose inCR := \sum_(x in R) rU x.
- have im_inCR: (inCR <= rfix_mx rU R)%MS.
- apply/rfix_mxP=> x Rx; have Gx := subsetP sRG x Rx.
- rewrite {2}[inCR](reindex_astabs 'R x) ?astabsR //= mulmx_suml.
- by apply: eq_bigr => y; move/(subsetP sRG)=> Gy; rewrite repr_mxM.
- pose inM := proj_mx M (\sum_(x in R | x != 1) M *m rU x)%MS.
- have dxM1 := mxdirect_sumsP dxM _ (group1 R).
- rewrite repr_mx1 mulmx1 in dxM1.
- have inCR_K: M *m inCR *m inM = M.
- rewrite mulmx_sumr (bigD1 1) //= repr_mx1 mulmx1 mulmxDl proj_mx_id //.
- by rewrite proj_mx_0 ?addr0 // summx_sub_sums.
- have [modM ntM _] := simM.
- have linM: \rank M = 1%N.
- apply/eqP; rewrite eqn_leq lt0n mxrank_eq0 ntM andbT.
- rewrite -inCR_K; apply: leq_trans (mxrankM_maxl _ _) _.
- apply: leq_trans (mxrankS (mulmx_sub _ im_inCR)) _.
- rewrite rfix_submod //; apply: leq_trans (mxrankM_maxl _ _) _.
- by rewrite -fixRlin mxrankS ?capmxSr.
- apply: contra (ntM); move/eqP; rewrite -submx0 => <-.
- by rewrite -(rfix_mx_rstabC rK) ?der_sub // -(rker_submod modM) rker_linear.
-have{sK i M simM sK1 def_sK} irrK: mx_irreducible rK.
- have cycGq: cyclic (G / K) by rewrite -defKR quotientMidl quotient_cyclic.
- apply: (mx_irr_prime_index closF irrU cycGq simM) => x Gx /=.
- apply: (component_mx_iso simM); first exact: Clifford_simple.
- have jP: component_mx rK (M *m rU x) \in socle_enum sK.
- exact/component_socle/Clifford_simple.
- pose j := PackSocle jP; apply: submx_trans (_ : j <= _)%MS.
- by rewrite PackSocleK component_mx_id //; apply: Clifford_simple.
- have def_i: [set i] == [set: sK] by rewrite eqEcard subsetT cards1 sK1.
- by rewrite ((j =P i) _) // -in_set1 (eqP def_i) inE.
-pose G' := K^`(1) <*> R.
-have sG'G: G' \subset G by rewrite join_subG sK'G.
-pose rG' := subg_repr rU sG'G.
-wlog irrG': / mx_irreducible rG'.
- move=> IH; wlog [M simM sM1]: / exists2 M, mxsimple rG' M & (M <= 1%:M)%MS.
- by apply: mxsimple_exists; rewrite ?mxmodule1; case: irrK.
- have [modM ntM _] := simM.
- have [M' modM' sumM dxM] := mx_Maschke rG' (pgroupS sG'G F'G) modM sM1.
- wlog{IH} ntM': / M' != 0.
- case: eqP sumM => [-> M1 _ | _ _ -> //]; apply: IH.
- by apply: mx_iso_simple simM; apply: eqmx_iso; rewrite addsmx0_id in M1.
- suffices: (K^`(1) \subset rstab rG' M) || (K^`(1) \subset rstab rG' M').
- rewrite !rfix_mx_rstabC ?joing_subl //; rewrite -!submx0 in ntM ntM' *.
- by case/orP; move/submx_trans=> sM; apply: (contra (sM _ _)).
- rewrite !rstab_subg !rstab_submod !subsetI joing_subl !rfix_mx_rstabC //.
- rewrite /mxmodule !rstabs_subg !rstabs_submod !subsetI !subxx in modM modM'.
- do 2!rewrite orbC -genmxE.
- rewrite dx_modK_rfix // /NRmod ?(eqmx_rstabs _ (genmxE _)) ?der_sub //.
- exact: subset_trans sRG nK'G.
- apply/mxdirect_addsP; apply/eqP; rewrite -genmx_cap (eqmx_eq0 (genmxE _)).
- rewrite -(in_submodK (submx_trans (capmxSl _ _) (val_submodP _))).
- rewrite val_submod_eq0 in_submodE -submx0 (submx_trans (capmxMr _ _ _)) //.
- by rewrite -!in_submodE !val_submodK (mxdirect_addsP dxM).
-have nsK'K: K^`(1) <| K by apply: der_normal.
-pose rK'K := subg_repr rK (normal_sub nsK'K).
-have irrK'K: mx_absolutely_irreducible rK'K.
- wlog sK'K: / socleType rK'K by apply: socle_exists.
- have sK'_dv_K: #|[set: sK'K]| %| #|K|.
- exact: atrans_dvd_in (Clifford_atrans _ _).
- have nsK'G': K^`(1) <| G' := normalS (joing_subl _ _) sG'G nsK'G.
- pose rK'G' := subg_repr rG' (normal_sub nsK'G').
- wlog sK'G': / socleType rK'G' by apply: socle_exists.
- have coKp: coprime #|K| p := Frobenius_coprime frobG.
- have nK'R := subset_trans sRG nK'G.
- have sK'_dv_p: #|[set: sK'G']| %| p.
- suffices: #|G' : 'C([set: sK'G'] | 'Cl)| %| #|G' : K^`(1)|.
- rewrite -(divgS (joing_subl _ _)) /= {2}norm_joinEr //.
- rewrite coprime_cardMg ?(coprimeSg (normal_sub nsK'K)) //.
- rewrite mulKn ?cardG_gt0 // -indexgI; apply: dvdn_trans.
- exact: atrans_dvd_index_in (Clifford_atrans _ _).
- rewrite indexgS //; apply: subset_trans (Clifford_astab sK'G').
- exact: joing_subl.
- have eq_sK': #|[set: sK'K]| = #|[set: sK'G']|.
- rewrite !cardsT !cardE -!(size_map (fun i => socle_val i)).
- apply: perm_eq_size.
- rewrite uniq_perm_eq 1?(map_inj_uniq val_inj) 1?enum_uniq // => V.
- apply/mapP/mapP=> [] [i _ ->{V}].
- exists (PackSocle (component_socle sK'G' (socle_simple i))).
- by rewrite mem_enum.
- by rewrite PackSocleK.
- exists (PackSocle (component_socle sK'K (socle_simple i))).
- by rewrite mem_enum.
- by rewrite PackSocleK.
- have [i def_i]: exists i, [set: sK'G'] = [set i].
- apply/cards1P; rewrite -dvdn1 -{7}(eqnP coKp) dvdn_gcd.
- by rewrite -{1}eq_sK' sK'_dv_K sK'_dv_p.
- pose M := socle_base i; have simM : mxsimple rK'G' M := socle_simple i.
- have cycGq: cyclic (G' / K^`(1)).
- by rewrite /G' joingC quotientYidr ?quotient_cyclic.
- apply closF; apply: (mx_irr_prime_index closF irrG' cycGq simM) => x K'x /=.
- apply: (component_mx_iso simM); first exact: Clifford_simple.
- have jP: component_mx rK'G' (M *m rG' x) \in socle_enum sK'G'.
- exact/component_socle/Clifford_simple.
- pose j := PackSocle jP; apply: submx_trans (_ : j <= _)%MS.
- by rewrite PackSocleK component_mx_id //; apply: Clifford_simple.
- by rewrite ((j =P i) _) // -in_set1 -def_i inE.
-have linU: \rank U = 1%N by apply/eqP; rewrite abelian_abs_irr in irrK'K.
-case: irrU => _ nz1 _; apply: contra nz1; move/eqP=> fix0.
-by rewrite -submx0 -fix0 -(rfix_mx_rstabC rK) ?der_sub // rker_linear.
-Qed.
-
-(* Internal action version of B & G, Theorem 3.5. *)
-Theorem Frobenius_prime_cent_prime k gT (G K R V : {group gT}) :
- solvable G -> K ><| R = G -> prime #|R| -> 'C_K(R) = 1 ->
- k.-abelem V -> G \subset 'N(V) -> k^'.-group G -> #|'C_V(R)| = k ->
- K^`(1) \subset 'C_K(V).
-Proof.
-move=> solG defG prR regRK abelV nVG k'G primeRV.
-have [_ sRG _ nKR _] := sdprod_context defG; rewrite subsetI der_sub.
-have [-> | ntV] := eqsVneq V 1; first exact: cents1.
-pose rV := abelem_repr abelV ntV nVG.
-apply: subset_trans (_ : rker rV \subset _); last first.
- by rewrite rker_abelem subsetIr.
-have k_pr: prime k by case/pgroup_pdiv: (abelem_pgroup abelV).
-apply: (Frobenius_prime_rfix1 defG) => //.
- by rewrite (eq_pgroup G (eq_negn (charf_eq (char_Fp k_pr)))).
-apply/eqP; rewrite rfix_abelem // -(eqn_exp2l _ _ (prime_gt1 k_pr)).
-rewrite -{1}(card_Fp k_pr) -card_rowg rowg_mxK.
-by rewrite card_injm ?abelem_rV_injm ?subsetIl ?primeRV.
-Qed.
-
-Section Theorem_3_6.
-(* Limit the scope of the FiniteModule notations *)
-Import FiniteModule.
-
-(* This is B & G, Theorem 3.6. *)
-Theorem odd_sdprod_Zgroup_cent_prime_plength1 p gT (G H R R0 : {group gT}) :
- solvable G -> odd #|G| -> H ><| R = G -> coprime #|H| #|R| ->
- R0 \subset R -> prime #|R0| -> Zgroup 'C_H(R0) ->
- p.-length_1 [~: H, R].
-Proof.
-move: {2}_.+1 (ltnSn #|G|) => n; elim: n => // n IHn in gT G H R R0 *.
-rewrite ltnS; move oR0: #|R0| => r leGn solG oddG defG coHR sR0R r_pr ZgrCHR0.
-have rR0: r.-group R0 by rewrite /pgroup oR0 pnat_id.
-have [nsHG sRG mulHR nHR tiHR]:= sdprod_context defG.
-have [sHG nHG] := andP nsHG; have solH := solvableS sHG solG.
-have IHsub (H1 R1 : {group gT}):
- H1 \subset H -> H1 * R1 \subset 'N(H1) -> R0 \subset R1 -> R1 \subset R ->
- (#|H1| < #|H|) || (#|R1| < #|R|) -> p.-length_1 [~: H1, R1].
-- move=> sH1 nH1 sR01 sR1 ltG1; set G1 := H1 <*> R1.
- have coHR1: coprime #|H1| #|R1| by rewrite (coprimeSg sH1) // (coprimegS sR1).
- have defG1: H1 ><| R1 = G1.
- by rewrite sdprodEY ?coprime_TIg ?(subset_trans (mulG_subr H1 R1)).
- have sG1: G1 \subset G by rewrite join_subG -mulG_subG -mulHR mulgSS.
- have{ltG1} ltG1n: #|G1| < n.
- rewrite (leq_trans _ leGn) // -(sdprod_card defG1) -(sdprod_card defG).
- have leqifS := leqif_geq (subset_leq_card _).
- rewrite ltn_neqAle !(leqif_mul (leqifS _ _ _ sH1) (leqifS _ _ _ sR1)).
- by rewrite muln_eq0 !negb_or negb_and -!ltnNge ltG1 -!lt0n !cardG_gt0.
- apply: IHn defG1 _ sR01 _ _; rewrite ?oR0 ?(solvableS sG1) ?(oddSg sG1) //.
- exact: ZgroupS (setSI _ sH1) ZgrCHR0.
-without loss defHR: / [~: H, R] = H; last rewrite defHR.
- have sHR_H: [~: H, R] \subset H by rewrite commg_subl.
- have:= sHR_H; rewrite subEproper; case/predU1P=> [-> -> //|ltHR_H _].
- rewrite -coprime_commGid // IHsub 1?proper_card //.
- by apply: subset_trans (commg_norm H R); rewrite norm_joinEr ?mulSg.
-have{n leGn IHn tiHR} IHquo (X : {group gT}):
- X :!=: 1 -> X \subset H -> G \subset 'N(X) -> p.-length_1 (H / X).
-- move=> ntX sXH nXG; have nXH := subset_trans sHG nXG.
- have nXR := subset_trans sRG nXG; have nXR0 := subset_trans sR0R nXR.
- rewrite -defHR quotientE morphimR // -!quotientE.
- have ltGbn: #|G / X| < n.
- exact: leq_trans (ltn_quotient ntX (subset_trans sXH sHG)) _.
- have defGb: (H / X) ><| (R / X) = G / X by apply: quotient_coprime_sdprod.
- have pr_R0b: prime #|R0 / X|.
- have tiXR0: X :&: R0 = 1 by apply/trivgP; rewrite -tiHR setISS.
- by rewrite card_quotient // -indexgI setIC tiXR0 indexg1 oR0.
- have solGb: solvable (G / X) by apply: quotient_sol.
- have coHRb: coprime #|H / X| #|R / X| by apply: coprime_morph.
- apply: IHn defGb coHRb _ pr_R0b _; rewrite ?quotientS ?quotient_odd //.
- by rewrite -coprime_quotient_cent ?(coprimegS sR0R) // morphim_Zgroup.
-without loss Op'H: / 'O_p^'(H) = 1.
- have [_ -> // | ntO _] := eqVneq 'O_p^'(H) 1.
- suffices: p.-length_1 (H / 'O_p^'(H)).
- by rewrite p'quo_plength1 ?pcore_normal ?pcore_pgroup.
- apply: IHquo => //; first by rewrite normal_sub ?pcore_normal.
- by rewrite normal_norm // gFnormal_trans.
-move defV: 'F(H)%G => V.
-have charV: V \char H by rewrite -defV Fitting_char.
-have /andP[sVH nVH]: V <| H := char_normal charV.
-have nsVG: V <| G := char_normal_trans charV nsHG.
-have [_ nVG] := andP nsVG; have nVR: R \subset 'N(V) := subset_trans sRG nVG.
-without loss ntV: / V :!=: 1.
- by rewrite -defV trivg_Fitting //; case: eqP => [|_] ->; rewrite ?plength1_1.
-have scVHV: 'C_H(V) \subset V by rewrite -defV cent_sub_Fitting.
-have{defV Op'H} defV: 'O_p(H) = V by rewrite -(Fitting_eq_pcore Op'H) -defV.
-have pV: p.-group V by rewrite -defV pcore_pgroup.
-have [p_pr p_dv_V _] := pgroup_pdiv pV ntV.
-have p'r: r != p.
- rewrite eq_sym -dvdn_prime2 // -prime_coprime // (coprime_dvdl p_dv_V) //.
- by rewrite -oR0 (coprimegS sR0R) // (coprimeSg sVH).
-without loss{charV} abelV: / p.-abelem V; last have [_ cVV eV] := and3P abelV.
- move/implyP; rewrite implybE -trivg_Phi //; case/orP=> // ntPhi.
- have charPhi: 'Phi(V) \char H := gFchar_trans _ charV.
- have nsPhiH := char_normal charPhi; have [sPhiH nPhiH] := andP nsPhiH.
- have{charPhi} nPhiG: G \subset 'N('Phi(V)):= char_norm_trans charPhi nHG.
- rewrite -(pquo_plength1 nsPhiH) 1?IHquo ?(pgroupS (Phi_sub _)) //.
- have [/= W defW sPhiW nsWH] := inv_quotientN nsPhiH (pcore_normal p^' _).
- have p'Wb: p^'.-group (W / 'Phi(V)) by rewrite -defW pcore_pgroup.
- have{p'Wb} tiWb := coprime_TIg (pnat_coprime (quotient_pgroup _ _) p'Wb).
- suffices pW: p.-group W by rewrite -(tiWb W pW) setIid.
- apply/pgroupP=> q q_pr; case/Cauchy=> // x Wx ox; apply: wlog_neg => q'p.
- suffices Vx: x \in V by rewrite (pgroupP pV) // -ox order_dvdG.
- have [sWH nWH] := andP nsWH; rewrite (subsetP scVHV) // inE (subsetP sWH) //=.
- have coVx: coprime #|V| #[x] by rewrite ox (pnat_coprime pV) // pnatE.
- rewrite -cycle_subG (coprime_cent_Phi pV coVx) //.
- have: V :&: W \subset 'Phi(V); last apply: subset_trans.
- rewrite -quotient_sub1; last by rewrite subIset ?(subset_trans sWH) ?orbT.
- by rewrite quotientIG ?tiWb.
- rewrite commg_subI //; first by rewrite subsetI subxx (subset_trans sVH).
- by rewrite cycle_subG inE Wx (subsetP nVH) // (subsetP sWH).
-have{scVHV} scVH: 'C_H(V) = V by apply/eqP; rewrite eqEsubset scVHV subsetI sVH.
-without loss{IHquo} indecomposableV: / forall U W,
- U \x W = V -> G \subset 'N(U) :&: 'N(W) -> U = 1 \/ U = V.
-- pose decV UW := let: (U, W) := UW in
- [&& U \x W == V, G \subset 'N(U) :&: 'N(W), U != 1 & W != 1].
- case: (pickP decV) => [[A B /=] | indecV]; last first.
- apply=> U W defUW nUW_G; have:= indecV (U, W); rewrite /= -defUW nUW_G eqxx.
- by rewrite -negb_or; case/pred2P=> ->; [left | right; rewrite dprodg1].
- rewrite subsetI -!andbA => /and5P[/eqP/dprodP[[U W -> ->{A B}]]].
- move=> defUW _ tiUW nUG nWG ntU ntW _.
- have [sUH sWH]: U \subset H /\ W \subset H.
- by apply/andP; rewrite -mulG_subG defUW.
- have [nsUH nsWH]: U <| H /\ W <| H.
- by rewrite /normal !(subset_trans sHG) ?andbT.
- by rewrite -(quo2_plength1 _ nsUH nsWH) ?tiUW ?IHquo.
-have nsFb: 'F(H / V) <| G / V by rewrite gFnormal_trans ?quotient_normal.
-have{nsVG nsFb} [/= U defU sVU nsUG] := inv_quotientN nsVG nsFb.
-have{nsUG} [sUG nUG] := andP nsUG.
-have [solU nVU] := (solvableS sUG solG, subset_trans sUG nVG).
-have sUH: U \subset H by rewrite -(quotientSGK nVU sVH) -defU Fitting_sub.
-have [K hallK nKR]: exists2 K : {group gT}, p^'.-Hall(U) K & R \subset 'N(K).
- by apply: coprime_Hall_exists; rewrite ?(coprimeSg sUH) ?(subset_trans sRG).
-have [sKU p'K _] := and3P hallK; have{sUG} sKG := subset_trans sKU sUG.
-have coVK: coprime #|V| #|K| := pnat_coprime pV p'K.
-have [sKH nVK] := (subset_trans sKU sUH, subset_trans sKU nVU).
-have{defV} p'Ub: p^'.-group (U / V).
- rewrite -defU -['F(H / V)](nilpotent_pcoreC p (Fitting_nil _)) /=.
- by rewrite p_core_Fitting -defV trivg_pcore_quotient dprod1g pcore_pgroup.
-have{p'Ub} sylV: p.-Sylow(U) V by rewrite /pHall sVU pV -card_quotient.
-have{sKU} mulVK: V * K = U.
- apply/eqP; rewrite eqEcard mul_subG //= coprime_cardMg //.
- by rewrite (card_Hall sylV) (card_Hall hallK) partnC.
-have [sKN sNH]: K \subset 'N_H(K) /\ 'N_H(K) \subset H.
- by rewrite subsetIl subsetI sKH normG.
-have [solN nVN] := (solvableS sNH solH, subset_trans sNH nVH).
-have{solU hallK sUH nUG} defH: V * 'N_H(K) = H.
- have nsUH: U <| H by apply/andP; rewrite (subset_trans sHG).
- by rewrite -(mulSGid sKN) mulgA mulVK (Hall_Frattini_arg solU nsUH hallK).
-have [P sylP nPR]: exists2 P : {group _}, p.-Sylow('N_H(K)) P & R \subset 'N(P).
- apply: coprime_Hall_exists (coprimeSg sNH coHR) solN.
- by rewrite normsI ?norms_norm.
-have [sPN pP _]: [/\ P \subset 'N_H(K), p.-group P & _] := and3P sylP.
-have [sPH nKP]: P \subset H /\ P \subset 'N(K) by apply/andP; rewrite -subsetI.
-have nVP := subset_trans sPH nVH.
-have coKP: coprime #|K| #|P| by rewrite coprime_sym (pnat_coprime pP).
-have{sylP} sylVP: p.-Sylow(H) (V <*> P).
- rewrite pHallE /= norm_joinEr ?mul_subG //= -defH -!LagrangeMl.
- rewrite partnM // part_pnat_id // -!card_quotient //.
- by apply/eqP; congr (_ * _)%N; apply: card_Hall; apply: quotient_pHall.
-have [trKP | {sylV sVU nVU}ntKP] := eqVneq [~: K, P] 1.
- suffices sylVH: p.-Sylow(H) V.
- rewrite p_elt_gen_length1 // (_ : p_elt_gen p H = V).
- rewrite /pHall pcore_sub pcore_pgroup /= pnatNK.
- by apply: pnat_dvd pV; apply: dvdn_indexg.
- rewrite -(genGid V) -(setIidPr sVH); congr <<_>>; apply/setP=> x.
- rewrite !inE; apply: andb_id2l => Hx.
- by rewrite (mem_normal_Hall sylVH) /normal ?sVH.
- suffices sPV: P \subset V by rewrite -(joing_idPl sPV).
- suffices sPU: P \subset U by rewrite (sub_normal_Hall sylV) //; apply/andP.
- have cUPb: P / V \subset 'C_(H / V)(U / V).
- rewrite subsetI morphimS // -mulVK quotientMidl quotient_cents2r //.
- by rewrite commGC trKP sub1G.
- rewrite -(quotientSGK nVP sVU) (subset_trans cUPb) //.
- by rewrite -defU cent_sub_Fitting ?quotient_sol.
-have{sylVP} dxV: [~: V, K] \x 'C_V(K) = V by apply: coprime_abelian_cent_dprod.
-have tiVsub_VcK: 'C_V(K) = 1 \/ 'C_V(K) = V.
- apply: (indecomposableV _ [~: V, K]); first by rewrite dprodC.
- rewrite -mulHR -defH -mulgA mul_subG // subsetI.
- by rewrite commg_norml cents_norm // centsC subIset // -abelianE cVV.
- have nK_NR: 'N_H(K) * R \subset 'N(K) by rewrite mul_subG ?subsetIr.
- have nV_NR: 'N_H(K) * R \subset 'N(V) by rewrite mul_subG.
- by rewrite normsR // normsI ?norms_cent.
-have{tiVsub_VcK dxV} [defVK tiVcK]: [~: V, K] = V /\ 'C_V(K) = 1.
- have [tiVcK | eqC] := tiVsub_VcK; first by rewrite -{2}dxV // tiVcK dprodg1.
- rewrite (card1_trivg (pnat_1 (pgroupS _ pV) p'K)) ?comm1G ?eqxx // in ntKP.
- by rewrite -scVH subsetI sKH centsC -eqC subsetIr.
-have eqVncK: 'N_V(K) = 'C_V(K) := coprime_norm_cent nVK (pnat_coprime pV p'K).
-have{eqVncK} tiVN: V :&: 'N_H(K) = 1 by rewrite setIA (setIidPl sVH) eqVncK.
-have{sPN} tiVP: V :&: P = 1 by apply/trivgP; rewrite -tiVN setIS.
-have{U defU mulVK} defK: 'F('N_H(K)) = K.
- have [injV imV] := isomP (quotient_isom nVN tiVN).
- rewrite -(im_invm injV) -injm_Fitting ?injm_invm //= {2}imV /=.
- rewrite -quotientMidl defH defU -mulVK quotientMidl morphim_invmE.
- by rewrite morphpre_restrm quotientK // -group_modr // setIC tiVN mul1g.
-have scKH: 'C_H(K) \subset K.
- rewrite -{2}defK; apply: subset_trans (cent_sub_Fitting _) => //.
- by rewrite defK subsetI subsetIr setIS // cent_sub.
-have{nVN} ntKR0: [~: K, R0] != 1.
- rewrite (sameP eqP commG1P); apply: contra ntKP => cR0K.
- have ZgrK: Zgroup K by apply: ZgroupS ZgrCHR0; rewrite subsetI sKH.
- have{ZgrK} cycK: cyclic K by rewrite nil_Zgroup_cyclic // -defK Fitting_nil.
- have{cycK} sNR_K: [~: 'N_H(K), R] \subset K.
- apply: subset_trans scKH; rewrite subsetI; apply/andP; split.
- by rewrite (subset_trans (commSg R sNH)) // commGC commg_subr.
- suffices: 'N(K)^`(1) \subset 'C(K).
- by apply: subset_trans; rewrite commgSS ?subsetIr.
- rewrite der1_min ?cent_norm //= -ker_conj_aut (isog_abelian (first_isog _)).
- exact: abelianS (Aut_conj_aut K 'N(K)) (Aut_cyclic_abelian cycK).
- suffices sPV: P \subset V by rewrite -(setIidPr sPV) tiVP commG1.
- have pPV: p.-group (P / V) := quotient_pgroup V pP.
- rewrite -quotient_sub1 // subG1 (card1_trivg (pnat_1 pPV _)) //.
- apply: pgroupS (quotient_pgroup V p'K).
- apply: subset_trans (quotientS V sNR_K).
- by rewrite quotientR // -quotientMidl defH -quotientR ?defHR ?quotientS.
-have nKR0: R0 \subset 'N(K) := subset_trans sR0R nKR.
-have mulKR0: K * R0 = K <*> R0 by rewrite norm_joinEr.
-have sKR0_G : K <*> R0 \subset G by rewrite -mulKR0 -mulHR mulgSS.
-have nV_KR0: K <*> R0 \subset 'N(V) := subset_trans sKR0_G nVG.
-have solKR0: solvable (K <*> R0) by apply: solvableS solG.
-have coKR0: coprime #|K| #|R0| by rewrite (coprimeSg sKH) ?(coprimegS sR0R).
-have r'K: r^'.-group K.
- by rewrite /pgroup p'natE -?prime_coprime // coprime_sym -oR0.
-have tiKcV: 'C_K(V) = 1.
- by apply/trivgP; rewrite -tiVN -{2}scVH -setIIr setICA setIC setSI.
-have tiKR0cV: 'C_(K <*> R0)(V) = 1.
- set C := 'C_(K <*> R0)(V); apply/eqP; apply: contraR ntKR0 => ntC.
- have nC_KR0: K <*> R0 \subset 'N(C) by rewrite normsI ?normG ?norms_cent.
- rewrite -subG1 -(coprime_TIg coKR0) commg_subI ?subsetI ?subxx //=.
- suff defC: C == R0 by rewrite -(eqP defC) (subset_trans (joing_subl K R0)).
- have sC_R0: C \subset R0.
- rewrite -[C](coprime_mulG_setI_norm mulKR0) ?norms_cent //= tiKcV mul1g.
- apply: subsetIl.
- rewrite eqEsubset sC_R0; apply: contraR ntC => not_sR0C.
- by rewrite -(setIidPr sC_R0) prime_TIg ?oR0.
-have{nKR0 mulKR0 sKR0_G solKR0 nV_KR0} oCVR0: #|'C_V(R0)| = p.
- case: (eqVneq 'C_V(R0) 1) => [tiVcR0 | ntCVR0].
- case/negP: ntKR0; rewrite -subG1/= commGC -tiKcV.
- have defKR0: K ><| R0 = K <*> R0 by rewrite sdprodE ?coprime_TIg.
- have odd_KR0: odd #|K <*> R0| := oddSg sKR0_G oddG.
- apply: odd_prime_sdprod_abelem_cent1 abelV nV_KR0 _ _; rewrite // ?oR0 //=.
- by rewrite -mulKR0 pgroupM p'K /pgroup oR0 pnatE.
- have [x defC]: exists x, 'C_V(R0) = <[x]>.
- have ZgrC: Zgroup 'C_V(R0) by apply: ZgroupS ZgrCHR0; apply: setSI.
- apply/cyclicP; apply: (forall_inP ZgrC); apply/SylowP; exists p => //.
- by rewrite /pHall subxx indexgg (pgroupS (subsetIl V _)).
- rewrite defC; apply: nt_prime_order => //; last by rewrite -cycle_eq1 -defC.
- by rewrite (exponentP eV) // -cycle_subG -defC subsetIl.
-have tiPcR0: 'C_P(R0) = 1.
- rewrite -(setIidPl (joing_subl P V)) setIIl TI_Ohm1 //=.
- set C := 'C_(P <*> V)(R0); suffices <-: 'C_V(R0) = 'Ohm_1(C).
- by rewrite setIC -setIIl tiVP (setIidPl (sub1G _)).
- have pPV: p.-group (P <*> V) by rewrite norm_joinEl // pgroupM pP.
- have pC: p.-group C := pgroupS (subsetIl _ _) pPV.
- have abelCVR0: p.-abelem 'C_V(R0) by rewrite prime_abelem ?oCVR0.
- have sCV_C: 'C_V(R0) \subset C by rewrite setSI ?joing_subr.
- apply/eqP; rewrite eqEcard -(Ohm1_id abelCVR0) OhmS //=.
- have [-> | ntC] := eqVneq C 1; first by rewrite subset_leq_card ?OhmS ?sub1G.
- rewrite (Ohm1_id abelCVR0) oCVR0 (Ohm1_cyclic_pgroup_prime _ pC) //=.
- have ZgrC: Zgroup C by rewrite (ZgroupS _ ZgrCHR0) ?setSI // join_subG sPH.
- apply: (forall_inP ZgrC); apply/SylowP; exists p => //.
- by apply/pHallP; rewrite part_pnat_id.
-have defP: [~: P, R0] = P.
- have solvP := pgroup_sol pP; have nPR0 := subset_trans sR0R nPR.
- have coPR0: coprime #|P| #|R0| by rewrite (coprimeSg sPH) ?(coprimegS sR0R).
- by rewrite -{2}(coprime_cent_prod nPR0) // tiPcR0 mulg1.
-have{IHsub nVH} IHsub: forall X : {group gT},
- P <*> R0 \subset 'N(X) -> X \subset K ->
- (#|V <*> X <*> P| < #|H|) || (#|R0| < #|R|) -> [~: X, P] = 1.
-- move=> X; rewrite join_subG; case/andP=> nXP nXR0 sXK.
- set H0 := V <*> X <*> P => ltG0G; have sXH := subset_trans sXK sKH.
- have sXH0: X \subset H0 by rewrite /H0 joingC joingA joing_subr.
- have sH0H: H0 \subset H by rewrite !join_subG sVH sXH.
- have nH0R0: R0 \subset 'N(H0).
- by rewrite 2?normsY ?nXR0 ?(subset_trans sR0R) // (subset_trans sRG).
- have Op'H0: 'O_p^'(H0) = 1.
- have [sOp' nOp'] := andP (pcore_normal _ _ : 'O_p^'(H0) <| H0).
- have p'Op': p^'.-group 'O_p^'(H0) by apply: pcore_pgroup.
- apply: card1_trivg (pnat_1 (pgroupS _ pV) p'Op').
- rewrite -scVH subsetI (subset_trans sOp') //= centsC; apply/setIidPl.
- rewrite -coprime_norm_cent ?(pnat_coprime pV p'Op') //.
- by rewrite (setIidPl (subset_trans _ nOp')) // /H0 -joingA joing_subl.
- exact: subset_trans (subset_trans sH0H nVH).
- have Op'HR0: 'O_p^'([~: H0, R0]) = 1.
- apply/trivgP; rewrite -Op'H0 pcore_max ?pcore_pgroup // gFnormal_trans //.
- by rewrite /(_ <| _) commg_norml andbT commg_subl.
- have{ltG0G IHsub} p1_HR0: p.-length_1 [~: H0, R0].
- by apply: IHsub ltG0G => //=; rewrite mul_subG ?normG.
- have{p1_HR0} sPOpHR0: P \subset 'O_p([~: H0, R0]).
- rewrite sub_Hall_pcore //; last by rewrite -defP commSg ?joing_subr.
- rewrite /pHall pcore_sub pcore_pgroup /= -(pseries_pop2 _ Op'HR0).
- rewrite -card_quotient ?normal_norm ?pseries_normal // -/(pgroup _ _).
- by rewrite -{1}((_ :=P: _) p1_HR0) (quotient_pseries [::_; _]) pcore_pgroup.
- apply/trivgP; have <-: K :&: 'O_p([~: H0, R0]) = 1.
- by rewrite setIC coprime_TIg // (pnat_coprime (pcore_pgroup p _)).
- by rewrite commg_subI // subsetI ?sPOpHR0 ?sXK //= gFnorm_trans // normsRl.
-have{defH sR0R} [defH defR0]: V * K * P = H /\ R0 :=: R.
- suffices: (V * K * P == H) && (R0 :==: R) by do 2!case: eqP => // ->.
- apply: contraR ntKP; rewrite -subG1 !eqEcard sR0R ?mul_subG //= negb_and.
- rewrite -!ltnNge -!norm_joinEr // 1?normsY //; move/IHsub=> -> //.
- by rewrite join_subG nKP (subset_trans sR0R).
-move: IHsub defP oR0 rR0 ZgrCHR0 coKR0 ntKR0 tiKR0cV oCVR0 tiPcR0.
-rewrite {R0}defR0 ltnn => IHsub defP oR rR ZgrCHR coKR ntKR tiKRcV oCVR tiPcR.
-have mulVK: V * K = V <*> K by rewrite norm_joinEr.
-have oVK: #|V <*> K| = (#|V| * #|K|)%N by rewrite -mulVK coprime_cardMg.
-have tiVK_P: V <*> K :&: P = 1.
- have sylV: p.-Sylow(V <*> K) V.
- by rewrite /pHall pV -divgS joing_subl //= oVK mulKn.
- apply/trivgP; rewrite -tiVP subsetI subsetIr.
- rewrite (sub_normal_Hall sylV) ?subsetIl ?(pgroupS (subsetIr _ P)) //=.
- by rewrite /normal joing_subl join_subG normG.
-have{mulVK oVK} oH: (#|H| = #|V| * #|K| * #|P|)%N.
- by rewrite -defH mulVK -oVK (TI_cardMg tiVK_P).
-have{oH tiVK_P IHsub} IHsub: forall X : {group gT},
- P <*> R \subset 'N(X) -> X \subset K -> X :=: K \/ X \subset 'C(P).
-- move=> X nX_PR sXK; have p'X: p^'.-group X := pgroupS sXK p'K.
- have nXP: P \subset 'N(X) := subset_trans (joing_subl P R) nX_PR.
- apply/predU1P; rewrite eqEcard sXK; case: leqP => //= ltXK.
- apply/commG1P; rewrite {}IHsub // orbF (norm_joinEr (normsY _ _)) //=.
- rewrite TI_cardMg /=; last first.
- by apply/trivgP; rewrite -tiVK_P setSI ?genS ?setUS.
- rewrite oH ltn_pmul2r ?cardG_gt0 // norm_joinEr ?(subset_trans sXK) //.
- by rewrite coprime_cardMg ?ltn_pmul2l ?(pnat_coprime pV).
-have defKP: [~: K, P] = K.
- have sKP_K: [~: K, P] \subset K by rewrite commg_subl.
- have{sKP_K} [|//|cP_KP] := IHsub _ _ sKP_K.
- by rewrite join_subG /= commg_normr normsR.
- by case/eqP: ntKP; rewrite -coprime_commGid ?(commG1P cP_KP) ?(solvableS sKH).
-have nKPR: P <*> R \subset 'N(K) by rewrite join_subG nKP.
-have coPR: coprime #|P| #|R| by rewrite (coprimeSg sPH).
-have{scKH} tiPRcK: 'C_(P <*> R)(K) = 1.
- have tiPK: P :&: K = 1 by rewrite setIC coprime_TIg.
- have tiPcK: 'C_P(K) = 1.
- by apply/trivgP; rewrite /= -{1}(setIidPl sPH) -setIA -tiPK setIS.
- have tiRcK: 'C_R(K) = 1.
- by rewrite prime_TIg ?oR // centsC (sameP commG1P eqP).
- have mulPR: P * R = P <*> R by rewrite norm_joinEr.
- by rewrite -(coprime_mulG_setI_norm mulPR) ?tiPcK ?mul1g ?norms_cent.
-have [K1 | ntK]:= eqsVneq K 1; first by rewrite K1 comm1G eqxx in ntKR.
-have [K1 | [q q_pr q_dv_K]] := trivgVpdiv K; first by case/eqP: ntK.
-have q_gt1 := prime_gt1 q_pr.
-have p'q: q != p by apply: (pgroupP p'K).
-have{r'K} q'r: r != q by rewrite eq_sym; apply: (pgroupP r'K).
-have{defK} qK: q.-group K.
- have{defK} nilK: nilpotent K by rewrite -defK Fitting_nil.
- have{nilK} [_ defK _ _] := dprodP (nilpotent_pcoreC q nilK).
- have{IHsub} IHpi: forall pi, 'O_pi(K) = K \/ 'O_pi(K) \subset 'C(P).
- move=> pi; apply: IHsub (pcore_sub _ _).
- by rewrite gFnorm_trans // join_subG nKP.
- case: (IHpi q) => [<-| cPKq]; first exact: pcore_pgroup.
- case/eqP: ntKP; apply/commG1P; rewrite -{}defK mul_subG //.
- case: (IHpi q^') => // defK; case/idPn: q_dv_K.
- by rewrite -p'natE // -defK; apply: pcore_pgroup.
-pose K' := K^`(1); have charK': K' \char K := der_char 1 K.
-have nsK'K: K' <| K := der_normal 1 K; have [sK'K nK'K] := andP nsK'K.
-have nK'PR: P <*> R \subset 'N(K') := char_norm_trans charK' nKPR.
-have iK'K: 'C_(P <*> R / K')(K / K') = 1 -> #|K / K'| > q ^ 2.
- have qKb: q.-group (K / K') by apply: morphim_pgroup qK.
- rewrite ltnNge => trCK'; apply: contra ntKP => Kq_le_q2.
- suffices sPR_K': [~: P, R] \subset K'.
- rewrite -defP -(setIidPl sPR_K') coprime_TIg ?commG1 //.
- by rewrite (pnat_coprime (pgroupS _ pP) (pgroupS sK'K p'K)) ?commg_subl.
- rewrite -quotient_cents2 ?(char_norm_trans charK') //.
- suffices cPRbPrb: abelian (P <*> R / K').
- by rewrite (sub_abelian_cent2 cPRbPrb) ?quotientS ?joing_subl ?joing_subr.
- have nKbPR: P <*> R / K' \subset 'N(K / K') by apply: quotient_norms.
- case cycK: (cyclic (K / K')).
- rewrite (isog_abelian (quotient1_isog _)) -trCK' -ker_conj_aut.
- rewrite (isog_abelian (first_isog_loc _ _)) //.
- by rewrite (abelianS (Aut_conj_aut _ _)) ?Aut_cyclic_abelian.
- have{cycK} [oKb abelKb]: #|K / K'| = (q ^ 2)%N /\ q.-abelem (K / K').
- have sKb1: 'Ohm_1(K / K') \subset K / K' by apply: Ohm_sub.
- have cKbKb: abelian (K / K') by rewrite sub_der1_abelian.
- have: #|'Ohm_1(K / K')| >= q ^ 2.
- rewrite (card_pgroup (pgroupS sKb1 qKb)) leq_exp2l // ltnNge.
- by rewrite -p_rank_abelian -?rank_pgroup // -abelian_rank1_cyclic ?cycK.
- rewrite (geq_leqif (leqif_trans (subset_leqif_card sKb1) (leqif_eq _))) //.
- by case/andP=> sKbKb1; move/eqP->; rewrite (abelemS sKbKb1) ?Ohm1_abelem.
- have ntKb: K / K' != 1 by rewrite -cardG_gt1 oKb (ltn_exp2l 0).
- pose rPR := abelem_repr abelKb ntKb nKbPR.
- have: mx_faithful rPR by rewrite abelem_mx_faithful.
- move: rPR; rewrite (dim_abelemE abelKb ntKb) oKb pfactorK // => rPR ffPR.
- apply: charf'_GL2_abelian ffPR _.
- by rewrite quotient_odd ?(oddSg _ oddG) // join_subG (subset_trans sPH).
- rewrite (eq_pgroup _ (eq_negn (charf_eq (char_Fp q_pr)))).
- rewrite quotient_pgroup //= norm_joinEr // pgroupM.
- by rewrite /pgroup (pi_pnat rR) // (pi_pnat pP) // !inE eq_sym.
-case cKK: (abelian K); last first.
- have [|[dPhiK dK'] dCKP] := abelian_charsimple_special qK coKP defKP.
- apply/bigcupsP=> L /andP[charL]; have sLK := char_sub charL.
- by case/IHsub: sLK cKK => // [|-> -> //]; apply: char_norm_trans charL _.
- have eK: exponent K %| q.
- have oddK: odd #|K| := oddSg sKG oddG.
- have [Q [charQ _ _ eQ qCKQ]] := critical_odd qK oddK ntK; rewrite -eQ.
- have sQK: Q \subset K := char_sub charQ.
- have [<- // | cQP] := IHsub Q (char_norm_trans charQ nKPR) sQK.
- case/negP: ntKP; rewrite (sameP eqP commG1P) centsC.
- rewrite -ker_conj_aut -sub_morphim_pre // subG1 trivg_card1.
- rewrite (pnat_1 (morphim_pgroup _ pP) (pi_pnat (pgroupS _ qCKQ) _)) //.
- apply/subsetP=> a; case/morphimP=> x nKx Px ->{a}.
- rewrite /= astab_ract inE /= Aut_aut; apply/astabP=> y Qy.
- rewrite [_ y _]norm_conj_autE ?(subsetP sQK) //.
- by rewrite /conjg (centsP cQP y) ?mulKg.
- have tiPRcKb: 'C_(P <*> R / K')(K / K') = 1.
- rewrite -quotient_astabQ -quotientIG /=; last first.
- by rewrite sub_astabQ normG trivg_quotient sub1G.
- apply/trivgP; rewrite -quotient1 quotientS // -tiPRcK subsetI subsetIl /=.
- rewrite (coprime_cent_Phi qK) ?(coprimegS (subsetIl _ _)) //=.
- by rewrite norm_joinEr // coprime_cardMg // coprime_mulr coKP.
- rewrite dPhiK -dK' -/K' (subset_trans (commgS _ (subsetIr _ _))) //.
- by rewrite astabQ -quotient_cents2 ?subsetIl // cosetpreK centsC /=.
- have [nK'P nK'R] := (char_norm_trans charK' nKP, char_norm_trans charK' nKR).
- have solK: solvable K := pgroup_sol qK.
- have dCKRb: 'C_K(R) / K' = 'C_(K / K')(R / K').
- by rewrite coprime_quotient_cent.
- have abelKb: q.-abelem (K / K') by rewrite [K']dK' -dPhiK Phi_quotient_abelem.
- have [qKb cKbKb _] := and3P abelKb.
- have [tiKcRb | ntCKRb]:= eqVneq 'C_(K / K')(R / K') 1.
- have coK'P: coprime #|K'| #|P| by rewrite (coprimeSg sK'K).
- suffices sPK': P \subset K'.
- by case/negP: ntKP; rewrite -(setIidPr sPK') coprime_TIg ?commG1.
- rewrite -quotient_sub1 // -defP commGC quotientR //= -/K'.
- have <-: 'C_(P / K')(K / K') = 1.
- by apply/trivgP; rewrite -tiPRcKb setSI ?morphimS ?joing_subl.
- have q'P: q^'.-group P by rewrite /pgroup (pi_pnat pP) // !inE eq_sym.
- move: tiKcRb; have: q^'.-group (P <*> R / K').
- rewrite quotient_pgroup //= norm_joinEr //.
- by rewrite pgroupM q'P /pgroup oR pnatE.
- have sPRG: P <*> R \subset G by rewrite join_subG sRG (subset_trans sPH).
- have coPRb: coprime #|P / K'| #|R / K'| by rewrite coprime_morph.
- apply: odd_prime_sdprod_abelem_cent1 abelKb _; rewrite ?quotient_norms //.
- - by rewrite quotient_sol // (solvableS sPRG).
- - by rewrite quotient_odd // (oddSg sPRG).
- - by rewrite /= quotientY // sdprodEY ?quotient_norms ?coprime_TIg.
- rewrite -(card_isog (quotient_isog nK'R _)) ?oR //.
- by rewrite coprime_TIg // (coprimeSg sK'K).
- have{ntCKRb} not_sCKR_K': ~~ ('C_K(R) \subset K').
- by rewrite -quotient_sub1 ?subIset ?nK'K // dCKRb subG1.
- have oCKR: #|'C_K(R)| = q.
- have [x defCKR]: exists x, 'C_K(R) = <[x]>.
- have ZgrCKR: Zgroup 'C_K(R) := ZgroupS (setSI _ sKH) ZgrCHR.
- have qCKR: q.-group 'C_K(R) by rewrite (pgroupS (subsetIl K _)).
- by apply/cyclicP; apply: nil_Zgroup_cyclic (pgroup_nil qCKR).
- have Kx: x \in K by rewrite -cycle_subG -defCKR subsetIl.
- rewrite defCKR cycle_subG in not_sCKR_K' *.
- exact: nt_prime_order (exponentP eK x Kx) (group1_contra not_sCKR_K').
- have tiCKR_K': 'C_K(R) :&: K' = 1 by rewrite prime_TIg ?oCKR.
- have sKR_K: [~: K, R] \subset K by rewrite commg_subl nKR.
- have ziKRcR: 'C_K(R) :&: [~: K, R] \subset K'.
- rewrite -quotient_sub1 ?subIset ?nK'K // setIC.
- rewrite (subset_trans (quotientI _ _ _)) // dCKRb setIA.
- rewrite (setIidPl (quotientS _ sKR_K)) // ?quotientR //= -/K'.
- by rewrite coprime_abel_cent_TI ?quotient_norms ?coprime_morph.
- have not_sK_KR: ~~ (K \subset [~: K, R]).
- by apply: contra not_sCKR_K' => sK_KR; rewrite -{1}(setIidPl sK_KR) setIAC.
- have tiKRcR: 'C_[~: K, R](R) = 1.
- rewrite -(setIidPr sKR_K) setIAC -(setIidPl ziKRcR) setIAC tiCKR_K'.
- by rewrite (setIidPl (sub1G _)).
- have cKR_KR: abelian [~: K, R].
- have: 'C_[~: K, R](V) \subset [1].
- rewrite -tiVN -{2}scVH -setIIr setICA setIC setIS //.
- exact: subset_trans sKR_K sKN.
- rewrite /abelian (sameP commG1P trivgP) /= -derg1; apply: subset_trans.
- have nKR_R: R \subset 'N([~: K, R]) by rewrite commg_normr.
- have sKRR_G: [~: K, R] <*> R \subset G by rewrite join_subG comm_subG.
- move: oCVR; have: p^'.-group ([~: K, R] <*> R).
- by rewrite norm_joinEr // pgroupM (pgroupS sKR_K p'K) /pgroup oR pnatE.
- have solKR_R := solvableS sKRR_G solG.
- apply: Frobenius_prime_cent_prime; rewrite ?oR ?(subset_trans _ nVG) //.
- by rewrite sdprodEY // coprime_TIg // (coprimeSg sKR_K).
- case nKR_P: (P \subset 'N([~: K, R])).
- have{nKR_P} nKR_PR: P <*> R \subset 'N([~: K, R]).
- by rewrite join_subG nKR_P commg_normr.
- have{nKR_PR} [dKR | cP_KR] := IHsub _ nKR_PR sKR_K.
- by rewrite dKR subxx in not_sK_KR.
- have{cP_KR} cKRb: R / K' \subset 'C(K / K').
- by rewrite quotient_cents2r //= dK' -dCKP commGC subsetI sKR_K.
- case/negP: ntKR; rewrite (sameP eqP commG1P) centsC.
- by rewrite (coprime_cent_Phi qK) // dPhiK -dK' commGC -quotient_cents2.
- have{nKR_P} [x Px not_nKRx] := subsetPn (negbT nKR_P).
- have iKR: #|K : [~: K, R]| = q.
- rewrite -divgS // -{1}(coprime_cent_prod nKR) // TI_cardMg ?mulKn //.
- by rewrite setIA (setIidPl sKR_K).
- have sKRx_K: [~: K, R] :^ x \subset K by rewrite -{2}(normsP nKP x Px) conjSg.
- have nKR_K: K \subset 'N([~: K, R]) by apply: commg_norml.
- have mulKR_Krx: [~: K, R] * [~: K, R] :^ x = K.
- have maxKR: maximal [~: K, R] K by rewrite p_index_maximal ?iKR.
- apply: mulg_normal_maximal; rewrite ?(p_maximal_normal qK) //.
- by rewrite inE in not_nKRx.
- have ziKR_KRx: [~: K, R] :&: [~: K, R] :^ x \subset K'.
- rewrite /K' dK' subsetI subIset ?sKR_K // -{3}mulKR_Krx centM centJ.
- by rewrite setISS ?conjSg.
- suffices: q ^ 2 >= #|K / K'| by rewrite leqNgt iK'K.
- rewrite -divg_normal // leq_divLR ?cardSg //.
- rewrite -(@leq_pmul2l (#|[~: K, R]| ^ 2)) ?expn_gt0 ?cardG_gt0 // mulnA.
- rewrite -expnMn -iKR Lagrange // -mulnn -{2}(cardJg _ x) mul_cardG.
- by rewrite mulKR_Krx mulnAC leq_pmul2l ?muln_gt0 ?cardG_gt0 ?subset_leq_card.
-have tiKcP: 'C_K(P) = 1 by rewrite -defKP coprime_abel_cent_TI.
-have{IHsub} abelK: q.-abelem K.
- have [/abelem_Ohm1P->//|cPK1] := IHsub _ (gFnorm_trans _ nKPR) (Ohm_sub 1 K).
- rewrite -(setIid K) TI_Ohm1 ?eqxx // in ntK.
- by apply/eqP; rewrite -subG1 -tiKcP setIS.
-have{K' iK'K charK' nsK'K sK'K nK'K nK'PR} oKq2: q ^ 2 < #|K|.
- have K'1: K' :=: 1 by apply/commG1P.
- rewrite -indexg1 -K'1 -card_quotient ?normal_norm // iK'K // K'1.
- by rewrite -injm_subcent ?coset1_injm ?norms1 //= tiPRcK morphim1.
-pose S := [set Vi : {group gT} | 'C_V('C_K(Vi)) == Vi & maximal 'C_K(Vi) K].
-have defSV Vi: Vi \in S -> 'C_V('C_K(Vi)) = Vi by rewrite inE; case: eqP.
-have maxSK Vi: Vi \in S -> maximal 'C_K(Vi) K by case/setIdP.
-have sSV Vi: Vi \in S -> Vi \subset V by move/defSV <-; rewrite subsetIl.
-have ntSV Vi: Vi \in S -> Vi :!=: 1.
- move=> Si; apply: contraTneq (maxgroupp (maxSK _ Si)) => ->.
- by rewrite /= cent1T setIT proper_irrefl.
-have nSK Vi: Vi \in S -> K \subset 'N(Vi).
- by move/defSV <-; rewrite normsI ?norms_cent // sub_abelian_norm ?subsetIl.
-have defV: <<\bigcup_(Vi in S) Vi>> = V.
- apply/eqP; rewrite eqEsubset gen_subG.
- apply/andP; split; first by apply/bigcupsP; apply: sSV.
- rewrite -(coprime_abelian_gen_cent cKK nVK) ?(pnat_coprime pV) // gen_subG.
- apply/bigcupsP=> Kj /= /and3P[cycKbj sKjK nKjK].
- have [xb defKbj] := cyclicP cycKbj.
- have Kxb: xb \in K / Kj by rewrite defKbj cycle_id.
- set Vj := 'C_V(Kj); have [-> | ntVj] := eqsVneq Vj 1; first exact: sub1G.
- have nt_xb: xb != 1.
- apply: contra ntVj; rewrite -cycle_eq1 -defKbj -!subG1 -tiVcK.
- by rewrite quotient_sub1 // => sKKj; rewrite setIS ?centS.
- have maxKj: maximal Kj K.
- rewrite p_index_maximal // -card_quotient // defKbj -orderE.
- by rewrite (abelem_order_p (quotient_abelem Kj abelK) Kxb nt_xb).
- suffices defKj: 'C_K(Vj) = Kj.
- by rewrite sub_gen // (bigcup_max 'C_V(Kj))%G // inE defKj eqxx.
- have{maxKj} [_ maxKj] := maxgroupP maxKj.
- rewrite ['C_K(Vj)]maxKj //; last by rewrite subsetI sKjK centsC subsetIr.
- rewrite properEneq subsetIl andbT (sameP eqP setIidPl) centsC.
- by apply: contra ntVj; rewrite -subG1 -tiVcK subsetI subsetIl.
-pose dxp := [fun D : {set {group gT}} => \big[dprod/1]_(Vi in D) Vi].
-have{defV} defV: \big[dprod/1]_(Vi in S) Vi = V.
- have [D maxD]: {D | maxset [pred E | group_set (dxp E) & E \subset S] D}.
- by apply: ex_maxset; exists set0; rewrite /= sub0set big_set0 groupP.
- have [gW sDS] := andP (maxsetp maxD); have{maxD} [_ maxD] := maxsetP maxD.
- have{gW} [W /= defW]: {W : {group gT} | dxp D = W} by exists (Group gW).
- have [eqDS | ltDS] := eqVproper sDS.
- by rewrite eqDS in defW; rewrite defW -(bigdprodWY defW).
- have{ltDS} [_ [Vi Si notDi]] := properP ltDS.
- have sWV: W \subset V.
- rewrite -(bigdprodWY defW) gen_subG.
- by apply/bigcupsP=> Vj Dj; rewrite sSV ?(subsetP sDS).
- suffices{maxD sWV defV} tiWcKi: 'C_W('C_K(Vi)) = 1.
- have:= notDi; rewrite -(maxD (Vi |: D)) ?setU11 ?subsetUr //= subUset sDS.
- rewrite sub1set Si big_setU1 //= defW dprodEY ?groupP //.
- by rewrite (sub_abelian_cent2 cVV) // sSV.
- by rewrite -(defSV Vi Si) setIAC (setIidPr sWV).
- apply/trivgP/subsetP=> w /setIP[Ww cKi_w].
- have [v [Vv def_w v_uniq]] := mem_bigdprod defW Ww.
- rewrite def_w big1 ?inE // => Vj Dj; have Sj := subsetP sDS Vj Dj.
- have cKi_vj: v Vj \in 'C('C_K(Vi)).
- apply/centP=> x Ki_x; apply/commgP/conjg_fixP.
- apply: (v_uniq (fun Vk => v Vk ^ x)) => // [Vk Dk|].
- have [[Kx _] Sk]:= (setIP Ki_x, subsetP sDS Vk Dk).
- by rewrite memJ_norm ?Vv // (subsetP (nSK Vk Sk)).
- rewrite -(mulKg x w) -(centP cKi_w) // -conjgE def_w.
- by apply: (big_morph (conjg^~ x)) => [y z|]; rewrite ?conj1g ?conjMg.
- suffices mulKji: 'C_K(Vj) * 'C_K(Vi) = K.
- by apply/set1gP; rewrite -tiVcK -mulKji centM setIA defSV // inE Vv.
- have maxKj := maxSK Vj Sj; have [_ maxKi] := maxgroupP (maxSK Vi Si).
- rewrite (mulg_normal_maximal _ maxKj) -?sub_abelian_normal ?subsetIl //.
- have [eqVji|] := eqVneq Vj Vi; first by rewrite -eqVji Dj in notDi.
- apply: contra => /= sKiKj; rewrite -val_eqE /= -(defSV Vj Sj).
- by rewrite (maxKi _ (maxgroupp maxKj) sKiKj) defSV.
-have nVPR: P <*> R \subset 'N(V) by rewrite join_subG nVP.
-have actsPR: [acts P <*> R, on S | 'JG].
- apply/subsetP=> x PRx; rewrite !inE; apply/subsetP=> Vi.
- rewrite !inE /= => Si; rewrite -(normsP nKPR x PRx) !centJ -!conjIg centJ .
- by rewrite -(normsP nVPR x PRx) -conjIg (inj_eq (@conjsg_inj _ _)) maximalJ.
-have transPR: [transitive P <*> R, on S | 'JG].
- pose ndxp D (U A B : {group gT}) := dxp (S :&: D) = U -> A * B \subset 'N(U).
- have nV_VK D U: ndxp D U V K.
- move/bigdprodWY <-; rewrite norms_gen ?norms_bigcup //.
- apply/bigcapsP=> Vi /setIP[Si _].
- by rewrite mulG_subG nSK // sub_abelian_norm // sSV.
- have nV_PR D U: [acts P <*> R, on S :&: D | 'JG] -> ndxp D U P R.
- move=> actsU /bigdprodWY<-; rewrite -norm_joinEr ?norms_gen //.
- apply/subsetP=> x PRx; rewrite inE sub_conjg; apply/bigcupsP=> Vi Di.
- by rewrite -sub_conjg (bigcup_max (Vi :^ x)%G) //= (acts_act actsU).
- have [S0 | [V1 S1]] := set_0Vmem S.
- by case/eqP: ntV; rewrite -defV S0 big_set0.
- apply/imsetP; exists V1 => //; set D := orbit _ _ _.
- rewrite (big_setID D) /= setDE in defV.
- have [[U W defU defW] _ _ tiUW] := dprodP defV.
- rewrite defU defW in defV tiUW.
- have [|U1|eqUV]:= indecomposableV _ _ defV.
- - rewrite -mulHR -defH -mulgA mul_subG //.
- by rewrite subsetI (nV_VK _ _ defU) (nV_VK _ _ defW).
- rewrite subsetI (nV_PR _ _ _ defU) ?actsI ?acts_orbit ?subsetT //=.
- by rewrite (nV_PR _ _ _ defW) // actsI ?astabsC ?acts_orbit ?subsetT /=.
- - case/negP: (ntSV V1 S1); rewrite -subG1 -U1 -(bigdprodWY defU) sub_gen //.
- by rewrite (bigcup_max V1) // inE S1 orbit_refl.
- apply/eqP; rewrite eqEsubset (acts_sub_orbit _ actsPR) S1 andbT.
- apply/subsetP=> Vi Si; apply: contraR (ntSV Vi Si) => D'i; rewrite -subG1.
- rewrite -tiUW eqUV subsetI sSV // -(bigdprodWY defW).
- by rewrite (bigD1 Vi) ?joing_subl // inE Si inE.
-have [cSR | not_cSR] := boolP (R \subset 'C(S | 'JG)).
- have{cSR} sRnSV: R \subset \bigcap_(Vi in S) 'N(Vi).
- apply/bigcapsP=> Vi Si.
- by rewrite -astab1JG (subset_trans cSR) ?astabS ?sub1set.
- have sPRnSV: P <*> R \subset 'N(\bigcap_(Vi in S) 'N(Vi)).
- apply/subsetP=> x PRx; rewrite inE; apply/bigcapsP=> Vi Si.
- by rewrite sub_conjg -normJ bigcap_inf ?(acts_act actsPR) ?groupV.
- have [V1 S1] := imsetP transPR.
- have: P <*> R \subset 'N(V1).
- rewrite join_subG (subset_trans sRnSV) /= ?bigcap_inf // andbT -defP.
- apply: (subset_trans (commgS P sRnSV)).
- have:= subset_trans (joing_subl P R) sPRnSV; rewrite -commg_subr /=.
- by move/subset_trans; apply; apply: bigcap_inf.
- rewrite -afixJG; move/orbit1P => -> allV1.
- have defV1: V1 = V by apply: group_inj; rewrite /= -defV allV1 big_set1.
- case/idPn: oKq2; rewrite -(Lagrange (subsetIl K 'C(V1))).
- rewrite (p_maximal_index qK (maxSK V1 S1)) defV1 /= tiKcV cards1 mul1n.
- by rewrite (ltn_exp2l 2 1).
-have actsR: [acts R, on S | 'JG] := subset_trans (joing_subr P R) actsPR.
-have ntSRcR Vi:
- Vi \in S -> ~~ (R \subset 'N(Vi)) ->
- #|Vi| = p /\ 'C_V(R) \subset <<class_support Vi R>>.
-- move=> Si not_nViR; have [sVi nV] := (subsetP (sSV Vi Si), subsetP nVR).
- pose f v := fmval (\sum_(x in R) fmod cVV v ^@ x).
- have fM: {in Vi &, {morph f: u v / u * v}}.
- move=> u v /sVi Vu /sVi Vv; rewrite -fmvalA -big_split.
- by congr (fmval _); apply: eq_bigr => x Rx; rewrite /= -actAr fmodM.
- have injf: 'injm (Morphism fM).
- apply/subsetP=> v /morphpreP[Vi_v]; have Vv := sVi v Vi_v.
- rewrite (bigD1 Vi) //= in defV; have [[_ W _ dW] _ _ _] := dprodP defV.
- have [u [w [_ _ uw Uuw]]] := mem_dprod defV (group1 V).
- case: (Uuw 1 1) => // [||u1 w1]; rewrite ?dW ?mulg1 // !inE eq_sym /f /=.
- move/eqP; rewrite (big_setD1 1) // actr1 ?fmodK // fmvalA //= fmval_sum.
- do [case/Uuw; rewrite ?dW ?fmodK -?u1 ?group_prod //] => [x R'x | ->] //.
- rewrite (nt_gen_prime _ R'x) ?cycle_subG ?oR // inE in not_nViR nVR actsR.
- rewrite fmvalJ ?fmodK // -(bigdprodWY dW) ?mem_gen //; apply/bigcupP.
- exists (Vi :^ x)%G; rewrite ?memJ_conjg // (astabs_act _ actsR) Si.
- by apply: contraNneq not_nViR => /congr_group->.
- have im_f: Morphism fM @* Vi \subset 'C_V(R).
- apply/subsetP=> _ /morphimP[v _ Vi_v ->]; rewrite inE fmodP.
- apply/centP=> x Rx; red; rewrite conjgC -fmvalJ ?nV //; congr (x * fmval _).
- rewrite {2}(reindex_acts 'R _ Rx) ?astabsR //= actr_sum.
- by apply: eq_bigr => y Ry; rewrite actrM ?nV.
- have defCVR: Morphism fM @* Vi = 'C_V(R).
- apply/eqP; rewrite eqEcard im_f (prime_nt_dvdP _ _ (cardSg im_f)) ?oCVR //=.
- by rewrite -trivg_card1 morphim_injm_eq1 ?ntSV.
- rewrite -oCVR -defCVR; split; first by rewrite card_injm.
- apply/subsetP=> _ /morphimP[v _ Vi_v ->] /=; rewrite /f fmval_sum.
- have Vv := sVi v Vi_v; apply: group_prod => x Rx.
- by rewrite fmvalJ ?fmodK ?nV // mem_gen // mem_imset2.
-have{not_cSR} [V1 S1 not_nV1R]: exists2 V1, V1 \in S & ~~ (R \subset 'N(V1)).
- by move: not_cSR; rewrite astabC; case/subsetPn=> v; rewrite afixJG; exists v.
-set D := orbit 'JG%act R V1.
-have oD: #|D| = r by rewrite card_orbit astab1JG prime_TIg ?indexg1 ?oR.
-have oSV Vi: Vi \in S -> #|Vi| = p.
- move=> Si; have [z _ ->]:= atransP2 transPR S1 Si.
- by rewrite cardJg; case/ntSRcR: not_nV1R.
-have cSnS' Vi: Vi \in S -> 'N(Vi)^`(1) \subset 'C(Vi).
- move=> Si; rewrite der1_min ?cent_norm //= -ker_conj_aut.
- rewrite (isog_abelian (first_isog _)) (abelianS (Aut_conj_aut _ _)) //.
- by rewrite Aut_cyclic_abelian // prime_cyclic // oSV.
-have nVjR Vj: Vj \in S :\: D -> 'C_K(Vj) = [~: K, R].
- case/setDP=> Sj notDj; set Kj := 'C_K(Vj).
- have [nVjR|] := boolP (R \subset 'N(Vj)).
- have{nVjR} sKRVj: [~: K, R] \subset Kj.
- rewrite subsetI {1}commGC commg_subr nKR.
- by rewrite (subset_trans _ (cSnS' Vj Sj)) // commgSS ?nSK.
- have iKj: #|K : Kj| = q by rewrite (p_maximal_index qK (maxSK Vj Sj)).
- have dxKR: [~: K, R] \x 'C_K(R) = K by rewrite coprime_abelian_cent_dprod.
- have{dxKR} [_ defKR _ tiKRcR] := dprodP dxKR.
- have Z_CK: Zgroup 'C_K(R) by apply: ZgroupS ZgrCHR; apply: setSI.
- have abelCKR: q.-abelem 'C_K(R) := abelemS (subsetIl _ _) abelK.
- have [qCKR _] := andP abelCKR.
- apply/eqP; rewrite eq_sym eqEcard sKRVj -(leq_pmul2r (ltnW q_gt1)).
- rewrite -{1}iKj Lagrange ?subsetIl // -{1}defKR (TI_cardMg tiKRcR).
- rewrite leq_pmul2l ?cardG_gt0 //= (card_pgroup qCKR).
- rewrite (leq_exp2l _ 1) // -abelem_cyclic // (forall_inP Z_CK) //.
- by rewrite (@p_Sylow _ q) // /pHall subxx indexgg qCKR.
- case/ntSRcR=> // _ sCVj; case/ntSRcR: not_nV1R => // _ sCV1.
- suffices trCVR: 'C_V(R) = 1 by rewrite -oCVR trCVR cards1 in p_pr.
- apply/trivgP; rewrite (big_setID D) in defV.
- have{defV} [[W U /= defW defU] _ _ <-] := dprodP defV.
- rewrite defW defU subsetI (subset_trans sCV1) /=; last first.
- rewrite class_supportEr -(bigdprodWY defW) genS //.
- apply/bigcupsP=> x Rx; rewrite (bigcup_max (V1 :^ x)%G) // inE.
- by rewrite (actsP actsR) //= S1 mem_imset.
- rewrite (subset_trans sCVj) // class_supportEr -(bigdprodWY defU) genS //.
- apply/bigcupsP=> x Rx; rewrite (bigcup_max (Vj :^ x)%G) // inE.
- by rewrite (actsP actsR) // Sj andbT (orbit_transl _ (mem_orbit 'JG Vj Rx)).
-have sDS: D \subset S.
- by rewrite acts_sub_orbit //; apply: subset_trans actsPR; apply: joing_subr.
-have [eqDS | ltDS] := eqVproper sDS.
- have [fix0 | [Vj cVjP]] := set_0Vmem 'Fix_(S | 'JG)(P).
- case/negP: p'r; rewrite eq_sym -dvdn_prime2 // -oD eqDS /dvdn.
- rewrite (pgroup_fix_mod pP (subset_trans (joing_subl P R) actsPR)).
- by rewrite fix0 cards0 mod0n.
- have{cVjP} [Sj nVjP] := setIP cVjP; rewrite afixJG in nVjP.
- case/negP: (ntSV Vj Sj); rewrite -subG1 -tiVcK subsetI sSV // centsC -defKP.
- by rewrite (subset_trans _ (cSnS' Vj Sj)) // commgSS ?nSK.
-have [_ [Vj Sj notDj]] := properP ltDS.
-have defS: S = Vj |: D.
- apply/eqP; rewrite eqEsubset andbC subUset sub1set Sj sDS.
- apply/subsetP=> Vi Si; rewrite !inE orbC /= -val_eqE /= -(defSV Vi Si).
- have [//|notDi] := boolP (Vi \in _); rewrite -(defSV Vj Sj) /=.
- by rewrite !nVjR // inE ?notDi ?notDj.
-suffices: odd #|S| by rewrite defS cardsU1 (negPf notDj) /= oD -oR (oddSg sRG).
-rewrite (dvdn_odd (atrans_dvd transPR)) // (oddSg _ oddG) //.
-by rewrite join_subG (subset_trans sPH).
-Qed.
-
-End Theorem_3_6.
-
-(* This is B & G, Theorem 3.7. *)
-Theorem prime_Frobenius_sol_kernel_nil gT (G K R : {group gT}) :
- K ><| R = G -> solvable G -> prime #|R| -> 'C_K(R) = 1 -> nilpotent K.
-Proof.
-move=> defG solG R_pr regR.
-elim: {K}_.+1 {-2}K (ltnSn #|K|) => // m IHm K leKm in G defG solG regR *.
-have [nsKG sRG defKR nKR tiKR] := sdprod_context defG.
-have [sKG nKG] := andP nsKG.
-wlog ntK: / K :!=: 1 by case: eqP => [-> _ | _ ->] //; apply: nilpotent1.
-have [L maxL _]: {L : {group gT} | maxnormal L K G & [1] \subset L}.
- by apply: maxgroup_exists; rewrite proper1G ntK norms1.
-have [ltLK nLG]:= andP (maxgroupp maxL); have [sLK not_sKL]:= andP ltLK.
-have{m leKm IHm}nilL: nilpotent L.
- pose G1 := L <*> R; have nLR := subset_trans sRG nLG.
- have sG1G: G1 \subset G by rewrite join_subG (subset_trans sLK).
- have defG1: L ><| R = G1.
- by rewrite sdprodEY //; apply/eqP; rewrite -subG1 -tiKR setSI.
- apply: (IHm _ _ _ defG1); rewrite ?(solvableS sG1G) ?(oddSg sG1G) //.
- exact: leq_trans (proper_card ltLK) _.
- by apply/eqP; rewrite -subG1 -regR setSI.
-have sLG := subset_trans sLK sKG; have nsLG: L <| G by apply/andP.
-have sLF: L \subset 'F(G) by apply: Fitting_max.
-have frobG: [Frobenius G = K ><| R] by apply/prime_FrobeniusP.
-have solK := solvableS sKG solG.
-have frobGq := Frobenius_quotient frobG solK nsLG not_sKL.
-suffices sKF: K \subset 'F(K) by apply: nilpotentS sKF (Fitting_nil K).
-apply: subset_trans (chief_stab_sub_Fitting solG nsKG).
-rewrite subsetI subxx; apply/bigcapsP=> [[X Y] /= /andP[chiefXY sXF]].
-set V := X / Y; have [maxY nsXG] := andP chiefXY.
-have [ltYX nYG] := andP (maxgroupp maxY); have [sYX _]:= andP ltYX.
-have [sXG nXG] := andP nsXG; have sXK := subset_trans sXF (Fitting_sub K).
-have minV := chief_factor_minnormal chiefXY.
-have cVL: L \subset 'C(V | 'Q).
- apply: subset_trans (subset_trans sLF (Fitting_stab_chief solG _)) _ => //.
- exact: (bigcap_inf (X, Y)).
-have nVG: {acts G, on group V | 'Q}.
- by split; rewrite ?quotientS ?subsetT // actsQ // normal_norm.
-pose V1 := sdpair1 <[nVG]> @* V.
-have [p p_pr abelV]: exists2 p, prime p & p.-abelem V.
- apply/is_abelemP; apply: charsimple_solvable (quotient_sol _ _).
- exact: minnormal_charsimple minV.
- exact: nilpotent_sol (nilpotentS sXF (Fitting_nil _)).
-have abelV1: p.-abelem V1 by rewrite morphim_abelem.
-have injV1 := injm_sdpair1 <[nVG]>.
-have ntV1: V1 :!=: 1.
- by rewrite -cardG_gt1 card_injm // cardG_gt1; case/andP: (mingroupp minV).
-have nV1_G1 := im_sdpair_norm <[nVG]>.
-pose rV := morphim_repr (abelem_repr abelV1 ntV1 nV1_G1) (subxx G).
-have def_kerV: rker rV = 'C_G(V | 'Q).
- rewrite rker_morphim rker_abelem morphpreIdom morphpreIim -astabEsd //.
- by rewrite astab_actby setIid.
-have kerL: L \subset rker rV by rewrite def_kerV subsetI sLG.
-pose rVq := quo_repr kerL nLG.
-suffices: K / L \subset rker rVq.
- rewrite rker_quo def_kerV quotientSGK //= 1?subsetI 1?(subset_trans sKG) //.
- by rewrite sLG.
-have irrVq: mx_irreducible rVq.
- apply/quo_mx_irr; apply/morphim_mx_irr; apply/abelem_mx_irrP.
- apply/mingroupP; rewrite ntV1; split=> // U1; case/andP=> ntU1 nU1G sU1V.
- rewrite -(morphpreK sU1V); congr (_ @* _).
- case/mingroupP: minV => _; apply; last by rewrite sub_morphpre_injm.
- rewrite -subG1 sub_morphpre_injm ?sub1G // morphim1 subG1 ntU1 /=.
- set U := _ @*^-1 U1; rewrite -(cosetpreK U) quotient_norms //.
- have: [acts G, on U | <[nVG]>] by rewrite actsEsd ?subsetIl // morphpreK.
- rewrite astabs_actby subsetI subxx (setIidPr _) ?subsetIl //=.
- by rewrite -{1}(cosetpreK U) astabsQ ?normal_cosetpre //= -/U subsetI nYG.
-have [q q_pr abelKq]: exists2 q, prime q & q.-abelem (K / L).
- apply/is_abelemP; apply: charsimple_solvable (quotient_sol _ solK).
- exact: maxnormal_charsimple maxL.
-case (eqVneq q p) => [def_q | neq_qp].
- have sKGq: K / L \subset G / L by apply: quotientS.
- rewrite rfix_mx_rstabC //; have [_ _]:= irrVq; apply; rewrite ?submx1 //.
- by rewrite normal_rfix_mx_module ?quotient_normal.
- rewrite -(rfix_subg _ sKGq) (@rfix_pgroup_char _ p) ?char_Fp -?def_q //.
- exact: (abelem_pgroup abelKq).
-suffices: rfix_mx rVq (R / L) == 0.
- apply: contraLR; apply: (Frobenius_rfix_compl frobGq).
- apply: pi_pnat (abelem_pgroup abelKq) _.
- by rewrite inE /= (charf_eq (char_Fp p_pr)).
-rewrite -mxrank_eq0 (rfix_quo _ _ sRG) (rfix_morphim _ _ sRG).
-rewrite (rfix_abelem _ _ _ (morphimS _ sRG)) mxrank_eq0 rowg_mx_eq0 -subG1.
-rewrite (sub_abelem_rV_im _ _ _ (subsetIl _ _)) -(morphpreSK _ (subsetIl _ _)).
-rewrite morphpreIim -gacentEsd gacent_actby gacentQ (setIidPr sRG) /=.
-rewrite -coprime_quotient_cent ?(solvableS sXG) ?(subset_trans sRG) //.
- by rewrite {1}['C_X(R)](trivgP _) ?quotient1 ?sub1G // -regR setSI.
-by apply: coprimeSg sXK _; apply: Frobenius_coprime frobG.
-Qed.
-
-Corollary Frobenius_sol_kernel_nil gT (G K H : {group gT}) :
- [Frobenius G = K ><| H] -> solvable G -> nilpotent K.
-Proof.
-move=> frobG solG; have [defG ntK ntH _ _] := Frobenius_context frobG.
-have{defG} /sdprodP[_ defG nKH tiKH] := defG.
-have[H1 | [p p_pr]] := trivgVpdiv H; first by case/eqP: ntH.
-case/Cauchy=> // x Hx ox; rewrite -ox in p_pr.
-have nKx: <[x]> \subset 'N(K) by rewrite cycle_subG (subsetP nKH).
-have tiKx: K :&: <[x]> = 1 by apply/trivgP; rewrite -tiKH setIS ?cycle_subG.
-apply: (prime_Frobenius_sol_kernel_nil (sdprodEY nKx tiKx)) => //.
- by rewrite (solvableS _ solG) // join_subG -mulG_subG -defG mulgS ?cycle_subG.
-by rewrite cent_cycle (Frobenius_reg_ker frobG) // !inE -order_gt1 prime_gt1.
-Qed.
-
-(* This is B & G, Theorem 3.8. *)
-Theorem odd_sdprod_primact_commg_sub_Fitting gT (G K R : {group gT}) :
- K ><| R = G -> odd #|G| -> solvable G ->
- (*1*) coprime #|K| #|R| ->
- (*2*) semiprime K R ->
- (*3*) 'C_('F(K))(R) = 1 ->
- [~: K, R] \subset 'F(K).
-Proof.
-elim: {G}_.+1 {-2}G (ltnSn #|G|) K R => // n IHn G.
-rewrite ltnS => leGn K R defG oddG solG coKR primR regR_F.
-have [nsKG sRG defKR nKR tiKR] := sdprod_context defG.
-have [sKG nKG] := andP nsKG.
-have chF: 'F(K) \char K := Fitting_char K; have nFR := char_norm_trans chF nKR.
-have nsFK := char_normal chF; have [sFK nFK] := andP nsFK.
-pose KqF := K / 'F(K); have solK := solvableS sKG solG.
-without loss [p p_pr pKqF]: / exists2 p, prime p & p.-group KqF.
- move=> IHp; apply: wlog_neg => IH_KR; rewrite -quotient_cents2 //= -/KqF.
- set Rq := R / 'F(K); have nKRq: Rq \subset 'N(KqF) by apply: quotient_norms.
- rewrite centsC.
- apply: subset_trans (coprime_cent_Fitting nKRq _ _); last first.
- - exact: quotient_sol.
- - exact: coprime_morph.
- rewrite subsetI subxx centsC -['F(KqF)]Sylow_gen gen_subG.
- apply/bigcupsP=> Pq /SylowP[p p_pr /= sylPq]; rewrite -/KqF in sylPq.
- have chPq: Pq \char KqF.
- apply: char_trans (Fitting_char _); rewrite /= -/KqF.
- by rewrite (nilpotent_Hall_pcore (Fitting_nil _) sylPq) ?pcore_char.
- have [P defPq sFP sPK] := inv_quotientS nsFK (char_sub chPq).
- have nsFP: 'F(K) <| P by rewrite /normal sFP (subset_trans sPK).
- have{chPq} chP: P \char K.
- by apply: char_from_quotient nsFP (Fitting_char _) _; rewrite -defPq.
- have defFP: 'F(P) = 'F(K).
- apply/eqP; rewrite eqEsubset !Fitting_max ?Fitting_nil //.
- by rewrite char_normal ?gFchar_trans.
- have coPR := coprimeSg sPK coKR.
- have nPR: R \subset 'N(P) := char_norm_trans chP nKR.
- pose G1 := P <*> R.
- have sG1G: G1 \subset G by rewrite /G1 -defKR norm_joinEr ?mulSg.
- have defG1: P ><| R = G1 by rewrite sdprodEY ?coprime_TIg.
- rewrite defPq quotient_cents2r //= -defFP.
- have:= sPK; rewrite subEproper; case/predU1P=> [defP | ltPK].
- rewrite IHp // in IH_KR; exists p => //.
- by rewrite /KqF -{2}defP -defPq (pHall_pgroup sylPq).
- move/IHn: defG1 => ->; rewrite ?(oddSg sG1G) ?(solvableS sG1G) ?defFP //.
- apply: leq_trans leGn; rewrite /= norm_joinEr //.
- by rewrite -defKR !coprime_cardMg // ltn_pmul2r ?proper_card.
- by move=> x Rx; rewrite -(setIidPl sPK) -!setIA primR.
-without loss r_pr: / prime #|R|; last set r := #|R| in r_pr.
- have [-> _ | [r r_pr]] := trivgVpdiv R; first by rewrite commG1 sub1G.
- case/Cauchy=> // x; rewrite -cycle_subG subEproper orderE; set X := <[x]>.
- case/predU1P=> [-> -> -> // | ltXR rX _]; have sXR := proper_sub ltXR.
- have defCX: 'C_K(X) = 'C_K(R).
- rewrite cent_cycle primR // !inE -order_gt1 orderE rX prime_gt1 //=.
- by rewrite -cycle_subG.
- have primX: semiprime K X.
- by move=> y; case/setD1P=> nty Xy; rewrite primR // !inE nty (subsetP sXR).
- have nKX := subset_trans sXR nKR; have coKX := coprimegS sXR coKR.
- pose H := K <*> X; have defH: K ><| X = H by rewrite sdprodEY ?coprime_TIg.
- have sHG: H \subset G by rewrite /H -defKR norm_joinEr ?mulgSS.
- have ltHn: #|H| < n.
- rewrite (leq_trans _ leGn) /H ?norm_joinEr // -defKR !coprime_cardMg //.
- by rewrite ltn_pmul2l ?proper_card.
- have oddH := oddSg sHG oddG; have solH := solvableS sHG solG.
- have regX_F: 'C_('F(K))(X) = 1.
- by rewrite -regR_F -(setIidPl sFK) -!setIA defCX.
- have:= IHn _ ltHn _ _ defH oddH solH coKX primX regX_F.
- rewrite -!quotient_cents2 ?(subset_trans sXR) //; move/setIidPl <-.
- rewrite -coprime_quotient_cent ?(subset_trans sXR) // defCX.
- by rewrite coprime_quotient_cent ?subsetIr.
-apply: subset_trans (chief_stab_sub_Fitting solG nsKG) => //.
-rewrite subsetI commg_subl nKR; apply/bigcapsP => [[U V]] /=.
-case/andP=> chiefUV sUF; set W := U / V.
-have minW := chief_factor_minnormal chiefUV.
-have [ntW nWG] := andP (mingroupp minW).
-have /andP[/maxgroupp/andP[/andP[sVU _] nVG] nsUG] := chiefUV.
-have sUK := subset_trans sUF sFK; have sVK := subset_trans sVU sUK.
-have nVK := subset_trans sKG nVG; have nVR := subset_trans sRG nVG.
-have [q q_pr abelW]: exists2 q, prime q & q.-abelem W.
- apply/is_abelemP; apply: charsimple_solvable (minnormal_charsimple minW) _.
- by rewrite quotient_sol // (solvableS sUK).
-have regR_W: 'C_(W)(R / V) = 1.
- rewrite -coprime_quotient_cent ?(coprimeSg sUK) ?(solvableS sUK) //.
- by rewrite -(setIidPl sUF) -setIA regR_F (setIidPr _) ?quotient1 ?sub1G.
-rewrite sub_astabQ comm_subG ?quotientR //=.
-have defGv: (K / V) * (R / V) = G / V by rewrite -defKR quotientMl.
-have oRv: #|R / V| = r.
- rewrite card_quotient // -indexgI -(setIidPr sVK) setICA setIA tiKR.
- by rewrite (setIidPl (sub1G _)) indexg1.
-have defCW: 'C_(G / V)(W) = 'C_(K / V)(W).
- apply/eqP; rewrite eqEsubset andbC setSI ?quotientS //=.
- rewrite subsetI subsetIr /= andbT.
- rewrite -(coprime_mulG_setI_norm defGv) ?coprime_morph ?norms_cent //=.
- suffices ->: 'C_(R / V)(W) = 1 by rewrite mulg1 subsetIl.
- apply/trivgP; apply/subsetP=> x; case/setIP=> Rx cWx.
- apply: contraR ntW => ntx; rewrite -subG1 -regR_W subsetI subxx centsC /= -/W.
- by apply: contraR ntx; move/prime_TIg <-; rewrite ?oRv // inE Rx.
-have [P sylP nPR] := coprime_Hall_exists p nKR coKR solK.
-have [sPK pP _] := and3P sylP.
-have nVP := subset_trans sPK nVK; have nFP := subset_trans sPK nFK.
-have sylPv: p.-Sylow(K / V) (P / V) by rewrite quotient_pHall.
-have defKv: (P / V) * 'C_(G / V)(W) = (K / V).
- rewrite defCW; apply/eqP; rewrite eqEsubset mulG_subG subsetIl quotientS //=.
- have sK_PF: K \subset P * 'F(K).
- rewrite (normC nFP) -quotientSK // subEproper eq_sym eqEcard quotientS //=.
- by rewrite (card_Hall (quotient_pHall nFP sylP)) part_pnat_id ?leqnn.
- rewrite (subset_trans (quotientS _ sK_PF)) // quotientMl // mulgS //.
- rewrite subsetI -quotient_astabQ !quotientS //.
- by rewrite (subset_trans (Fitting_stab_chief solG nsKG)) ?(bigcap_inf (U, V)).
-have nW_ := subset_trans (quotientS _ _) nWG; have nWK := nW_ _ sKG.
-rewrite -quotient_cents2 ?norms_cent ?(nW_ _ sRG) //.
-have [eq_qp | p'q] := eqVneq q p.
- apply: subset_trans (sub1G _); rewrite -trivg_quotient quotientS // centsC.
- apply/setIidPl; case/mingroupP: minW => _; apply; last exact: subsetIl.
- rewrite andbC normsI ?norms_cent // ?quotient_norms //=.
- have nsWK: W <| K / V by rewrite /normal quotientS.
- have sWP: W \subset P / V.
- by rewrite (normal_sub_max_pgroup (Hall_max sylPv)) -?eq_qp ?abelem_pgroup.
- rewrite -defKv centM setIA setIAC /=.
- rewrite ['C_W(_)](setIidPl _); last by rewrite centsC subsetIr.
- have nilPv: nilpotent (P / V) := pgroup_nil (pHall_pgroup sylPv).
- rewrite -/W -(setIidPl sWP) -setIA meet_center_nil //.
- exact: normalS (quotientS V sPK) nsWK.
-rewrite -defKv -quotientMidr -mulgA mulSGid ?subsetIr // quotientMidr.
-have sPG := subset_trans sPK sKG.
-rewrite quotient_cents2 ?norms_cent ?nW_ //= commGC.
-pose Hv := (P / V) <*> (R / V).
-have sHGv: Hv \subset G / V by rewrite join_subG !quotientS.
-have solHv: solvable Hv := solvableS sHGv (quotient_sol V solG).
-have sPHv: P / V \subset Hv by apply: joing_subl.
-have nPRv: R / V \subset 'N(P / V) := quotient_norms _ nPR.
-have coPRv: coprime #|P / V| #|R / V| := coprime_morph _ (coprimeSg sPK coKR).
-apply: subset_trans (subsetIr (P / V) _).
-have oHv: #|Hv| = (#|P / V| * #|R / V|)%N.
- by rewrite /Hv norm_joinEr // coprime_cardMg // oRv.
-move/(odd_prime_sdprod_abelem_cent1 solHv): (abelW); apply=> //.
-- exact: oddSg sHGv (quotient_odd _ _).
-- by rewrite sdprodEY ?quotient_norms // coprime_TIg.
-- by rewrite oRv.
-- by rewrite (subset_trans _ nWG) ?join_subG ?quotientS.
-rewrite /= norm_joinEr // pgroupM /pgroup.
-rewrite (pi_pnat (quotient_pgroup _ pP)) ?inE 1?eq_sym //=.
-apply: coprime_p'group (abelem_pgroup abelW) ntW.
-by rewrite coprime_sym coprime_morph // (coprimeSg sUK).
-Qed.
-
-(* This is B & G, Proposition 3.9 (for external action), with the incorrectly *)
-(* omitted nontriviality assumption reinstated. *)
-Proposition ext_odd_regular_pgroup_cyclic (aT rT : finGroupType) p
- (D R : {group aT}) (K H : {group rT}) (to : groupAction D K) :
- p.-group R -> odd #|R| -> H :!=: 1 ->
- {acts R, on group H | to} -> {in R^#, forall x, 'C_(H | to)[x] = 1} ->
- cyclic R.
-Proof.
-move: R H => R0 H0 pR0 oddR0 ntH0 actsR0 regR0.
-pose gT := sdprod_groupType <[actsR0]>.
-pose H : {group gT} := (sdpair1 <[actsR0]> @* H0)%G.
-pose R : {group gT} := (sdpair2 <[actsR0]> @* R0)%G.
-pose G : {group gT} := [set: gT]%G.
-have{pR0} pR: p.-group R by rewrite morphim_pgroup.
-have{oddR0} oddR: odd #|R| by rewrite morphim_odd.
-have [R1 | ntR] := eqsVneq R 1.
- by rewrite -(im_invm (injm_sdpair2 <[actsR0]>)) {2}R1 morphim1 cyclic1.
-have{ntH0} ntH: H :!=: 1.
- apply: contraNneq ntH0 => H1.
- by rewrite -(im_invm (injm_sdpair1 <[actsR0]>)) {2}H1 morphim1.
-have{regR0 ntR} frobG: [Frobenius G = H ><| R].
- apply/Frobenius_semiregularP => // [|x]; first exact: sdprod_sdpair.
- case/setD1P=> nt_x; case/morphimP=> x2 _ Rx2 def_x.
- apply/trivgP; rewrite -(morphpreSK _ (subsetIl _ _)) morphpreI.
- rewrite /= -cent_cycle def_x -morphim_cycle // -gacentEsd.
- rewrite injmK ?injm_sdpair1 // (trivgP (injm_sdpair1 _)).
- rewrite -(regR0 x2) ?inE ?Rx2 ?andbT; last first.
- by apply: contra nt_x; rewrite def_x; move/eqP->; rewrite morph1.
- have [sRD sHK]: R0 \subset D /\ H0 \subset K by case actsR0; move/acts_dom.
- have sx2R: <[x2]> \subset R0 by rewrite cycle_subG.
- rewrite gacent_actby setIA setIid (setIidPr sx2R).
- rewrite !gacentE ?cycle_subG ?sub1set ?(subsetP sRD) //.
- by rewrite !setIS ?afixS ?sub_gen.
-suffices: cyclic R by rewrite (injm_cyclic (injm_sdpair2 _)).
-move: gT H R G => {aT rT to D K H0 R0 actsR0} gT H R G in ntH pR oddR frobG *.
-have [defG _ _ _ _] := Frobenius_context frobG; case/sdprodP: defG => _ _ nHR _.
-have coHR := Frobenius_coprime frobG.
-rewrite (odd_pgroup_rank1_cyclic pR oddR) leqNgt.
-apply: contra ntH => /p_rank_geP[E /pnElemP[sER abelE dimE2]].
-have ncycE: ~~ cyclic E by rewrite (abelem_cyclic abelE) dimE2.
-have nHE := subset_trans sER nHR; have coHE := coprimegS sER coHR.
-rewrite -subG1 -(coprime_abelian_gen_cent1 _ _ nHE) ?(abelem_abelian abelE) //.
-rewrite -bigprodGE big1 // => x /setD1P[nt_x Ex]; apply: val_inj => /=.
-by apply: (Frobenius_reg_ker frobG); rewrite !inE nt_x (subsetP sER).
-Qed.
-
-(* Internal action version of B & G, Proposition 3.9 (possibly, the only one *)
-(* we should keep). *)
-Proposition odd_regular_pgroup_cyclic gT p (H R : {group gT}) :
- p.-group R -> odd #|R| -> H :!=: 1 -> R \subset 'N(H) -> semiregular H R ->
- cyclic R.
-Proof.
-move=> pR oddR ntH nHR regR.
-have actsR: {acts R, on group H | 'J} by split; rewrite ?subsetT ?astabsJ.
-apply: ext_odd_regular_pgroup_cyclic pR oddR ntH actsR _ => // x Rx.
-by rewrite gacentJ cent_set1 regR.
-Qed.
-
-(* Another proof of Proposition 3.9, which avoids Frobenius groups entirely. *)
-Proposition simple_odd_regular_pgroup_cyclic gT p (H R : {group gT}) :
- p.-group R -> odd #|R| -> H :!=: 1 -> R \subset 'N(H) -> semiregular H R ->
- cyclic R.
-Proof.
-move=> pR oddR ntH nHR regR; rewrite (odd_pgroup_rank1_cyclic pR oddR) leqNgt.
-apply: contra ntH => /p_rank_geP[E /pnElemP[sER abelE dimE2]].
-have ncycE: ~~ cyclic E by rewrite (abelem_cyclic abelE) dimE2.
-have nHE := subset_trans sER nHR.
-have coHE := coprimegS sER (regular_norm_coprime nHR regR).
-rewrite -subG1 -(coprime_abelian_gen_cent1 _ _ nHE) ?(abelem_abelian abelE) //.
-rewrite -bigprodGE big1 // => x; case/setD1P=> nt_x Ex; apply: val_inj => /=.
-by rewrite regR // !inE nt_x (subsetP sER).
-Qed.
-
-(* This is Aschbacher (40.6)(4). *)
-Lemma odd_regular_metacyclic gT (H R : {group gT}) :
- odd #|R| -> H :!=: 1 -> R \subset 'N(H) -> semiregular H R ->
- metacyclic R.
-Proof.
-move=> oddR ntH nHR regHR.
-apply/Zgroup_metacyclic/forall_inP=> P /SylowP[p pr_p /and3P[sPR pP _]].
-have [oddP nHP] := (oddSg sPR oddR, subset_trans sPR nHR).
-exact: odd_regular_pgroup_cyclic pP oddP ntH nHP (semiregularS _ sPR regHR).
-Qed.
-
-(* This is Huppert, Kapitel V, Satz 18.8 b (used in Peterfalvi, Section 13). *)
-Lemma prime_odd_regular_normal gT (H R P : {group gT}) :
- prime #|P| -> odd #|R| -> P \subset R ->
- H :!=: 1 -> R \subset 'N(H) -> semiregular H R ->
- P <| R.
-Proof.
-set p := #|P| => pr_p oddR sPR ntH nHR regHR.
-have pP: p.-group P := pnat_id pr_p.
-have cycQ (q : nat) (Q : {group gT}) : q.-group Q -> Q \subset R -> cyclic Q.
- move=> qQ sQR; have [oddQ nHQ] := (oddSg sQR oddR, subset_trans sQR nHR).
- exact: odd_regular_pgroup_cyclic qQ oddQ ntH nHQ (semiregularS _ sQR regHR).
-have cycRq (q : nat): cyclic 'O_q(R) by rewrite (cycQ q) ?pcore_pgroup ?gFsub.
-suffices cFP: P \subset 'C('F(R)).
- have nilF: nilpotent 'F(R) := Fitting_nil R.
- have hallRp: p.-Hall('F(R)) 'O_p('F(R)) := nilpotent_pcore_Hall p nilF.
- apply: char_normal_trans (pcore_normal p R); rewrite sub_cyclic_char //=.
- rewrite -p_core_Fitting (sub_normal_Hall hallRp) ?gFnormal //.
- have solR: solvable R.
- by apply: metacyclic_sol; apply: odd_regular_metacyclic regHR.
- by apply: subset_trans (cent_sub_Fitting solR); rewrite subsetI sPR.
-rewrite centsC -(bigdprodWY (erefl 'F(R))) gen_subG big_tnth.
-apply/bigcupsP=> i _; move: {i}(tuple.tnth _ i) => q.
-have [<- | q'p] := eqVneq p q.
- have [Q sylQ sPQ] := Sylow_superset sPR pP; have [sQR pQ _] := and3P sylQ.
- rewrite (sub_abelian_cent2 (cyclic_abelian (cycQ _ _ pQ sQR))) //.
- by rewrite pcore_sub_Hall.
-have [-> | ntRq] := eqVneq 'O_q(R) 1%g; first exact: sub1G.
-have /andP[sRqR qRq]: q.-subgroup(R) 'O_q(R) by apply: pcore_psubgroup.
-have [pr_q _ _] := pgroup_pdiv qRq ntRq.
-have coRqP: coprime #|'O_q(R)| p by rewrite (pnat_coprime qRq) // pnatE.
-have nRqP: P \subset 'N('O_q(R)) by rewrite (subset_trans sPR) ?gFnorm.
-rewrite centsC (coprime_odd_faithful_Ohm1 qRq) ?(oddSg sRqR) //.
-apply: sub_abelian_cent2 (joing_subl _ _) (joing_subr _ _) => /=.
-set PQ := P <*> _; have oPQ: #|PQ| = (p * q)%N.
- rewrite /PQ norm_joinEl 1?gFnorm_trans //.
- rewrite coprime_cardMg 1?coprime_sym ?(coprimeSg (Ohm_sub 1 _)) // -/p.
- by congr (p * _)%N; apply: Ohm1_cyclic_pgroup_prime => /=.
-have sPQ_R: PQ \subset R by rewrite join_subG sPR (subset_trans (Ohm_sub 1 _)).
-have nH_PQ := subset_trans sPQ_R nHR.
-apply: cyclic_abelian; apply: regular_pq_group_cyclic oPQ ntH nH_PQ _ => //.
-exact: semiregularS regHR.
-Qed.
-
-Section Wielandt_Frobenius.
-
-Variables (gT : finGroupType) (G K R : {group gT}).
-Implicit Type A : {group gT}.
-
-(* This is Peterfalvi (9.1). *)
-Lemma Frobenius_Wielandt_fixpoint (M : {group gT}) :
- [Frobenius G = K ><| R] ->
- G \subset 'N(M) -> coprime #|M| #|G| -> solvable M ->
- [/\ (#|'C_M(G)| ^ #|R| * #|M| = #|'C_M(R)| ^ #|R| * #|'C_M(K)|)%N,
- 'C_M(R) = 1 -> K \subset 'C(M)
- & 'C_M(K) = 1 -> (#|M| = #|'C_M(R)| ^ #|R|)%N].
-Proof.
-move=> frobG nMG coMG solM; have [defG _ ntR _ _] := Frobenius_context frobG.
-have [_ _ _ _ /eqP snRG] := and5P frobG.
-have [nsKG sRG _ _ tiKR] := sdprod_context defG; have [sKG _] := andP nsKG.
-pose m0 (_ : {group gT}) := 0%N.
-pose Dm := [set 1%G; G]; pose Dn := K |: orbit 'JG K R.
-pose m := [fun A => 0%N with 1%G |-> #|K|, G |-> 1%N].
-pose n A : nat := A \in Dn.
-have out_m: {in [predC Dm], m =1 m0}.
- by move=> A; rewrite !inE /=; case/norP; do 2!move/negbTE->.
-have out_n: {in [predC Dn], n =1 m0}.
- by rewrite /n => A /=; move/negbTE=> /= ->.
-have ntG: G != 1%G by case: eqP sRG => // -> <-; rewrite subG1.
-have neqKR: K \notin orbit 'JG K R.
- apply/imsetP=> [[x _ defK]]; have:= Frobenius_dvd_ker1 frobG.
- by rewrite defK cardJg gtnNdvd // ?prednK // -subn1 subn_gt0 cardG_gt1.
-have Gmn A: m A + n A > 0 -> A \subset G.
- rewrite /=; case: eqP => [-> | ] _; first by rewrite sub1G.
- rewrite /n 2!inE; do 2!case: eqP => [-> // | ] _.
- case R_A: (A \in _) => // _; case/imsetP: R_A => x Kx ->{A}.
- by rewrite conj_subG ?(subsetP sKG).
-have partG: {in G, forall a,
- \sum_(A | a \in gval A) m A = \sum_(A | a \in gval A) n A}%N.
-- move=> a Ga; have [-> | nt_a] := eqVneq a 1.
- rewrite (bigD1 1%G) ?inE ?eqxx //= (bigD1 G) ?inE ?group1 //=.
- rewrite (negbTE ntG) !eqxx big1 ?addn1 => [|A]; last first.
- by rewrite group1 -negb_or -in_set2; apply: out_m.
- rewrite (bigID (mem Dn)) /= addnC big1 => [|A]; last first.
- by rewrite group1; apply: out_n.
- transitivity #|Dn|.
- rewrite cardsU1 neqKR card_orbit astab1JG.
- by rewrite -{3}(setIidPl sKG) -setIA -normD1 snRG tiKR indexg1.
- by rewrite -sum1_card /n; apply: eq_big => [A | A ->]; rewrite ?group1.
- rewrite (bigD1 G) //= (negbTE ntG) eqxx big1 => [|A]; last first.
- case/andP=> Aa neAG; apply: out_m; rewrite !inE; case: eqP => // A1.
- by rewrite A1 inE (negbTE nt_a) in Aa.
- have [partG tiG _] := and3P (Frobenius_partition frobG).
- do [rewrite -(eqP partG); set pG := _ |: _] in Ga tiG.
- rewrite (bigD1 <<pblock pG a>>%G) /=; last by rewrite mem_gen // mem_pblock.
- rewrite big1 => [|B]; last first.
- case/andP=> Ba neqBA; rewrite -/(false : nat); congr (nat_of_bool _).
- apply: contraTF neqBA; rewrite negbK -val_eqE /=.
- case/setU1P=> [BK | /imsetP[x Kx defB]].
- by rewrite (def_pblock tiG _ Ba) BK ?setU11 ?genGid.
- have Rxa: a \in R^# :^ x by rewrite conjD1g !inE nt_a -(congr_group defB).
- rewrite (def_pblock tiG _ Rxa) ?setU1r ?mem_imset // conjD1g.
- by rewrite genD1 ?group1 // genGid defB.
- rewrite /n !inE -val_eqE /= -/(true : nat); congr ((_ : bool) + _)%N.
- case/setU1P: (pblock_mem Ga) => [-> |]; first by rewrite genGid eqxx.
- case/imsetP=> x Kx ->; symmetry; apply/orP; right.
- apply/imsetP; exists x => //.
- by apply: val_inj; rewrite conjD1g /= genD1 ?group1 // genGid.
-move/eqP: (solvable_Wielandt_fixpoint Gmn nMG coMG solM partG).
-rewrite (bigD1 1%G) // (bigD1 G) //= eqxx (setIidPl (cents1 _)) cards1 muln1.
-rewrite (negbTE ntG) eqxx mul1n -(sdprod_card defG) (mulnC #|K|) expnM.
-rewrite mulnA -expnMn big1 ?muln1 => [|A]; last first.
- by rewrite -negb_or -in_set2; move/out_m; rewrite /m => /= ->.
-rewrite mulnC eq_sym (bigID (mem Dn)) /= mulnC.
-rewrite big1 ?mul1n => [|A]; last by move/out_n->.
-rewrite big_setU1 //= /n setU11 mul1n.
-rewrite (eq_bigr (fun _ => #|'C_M(R)| ^ #|R|)%N) => [|A R_A]; last first.
- rewrite inE R_A orbT mul1n; case/imsetP: R_A => x Kx ->.
- suffices nMx: x \in 'N(M) by rewrite -{1}(normP nMx) centJ -conjIg !cardJg.
- exact: subsetP (subsetP sKG x Kx).
-rewrite mulnC prod_nat_const card_orbit astab1JG.
-have ->: 'N_K(R) = 1 by rewrite -(setIidPl sKG) -setIA -normD1 snRG tiKR.
-rewrite indexg1 -expnMn eq_sym eqn_exp2r ?cardG_gt0 //; move/eqP=> eq_fix.
-split=> // [regR | regK].
- rewrite centsC (sameP setIidPl eqP) eqEcard subsetIl /=.
- move: eq_fix; rewrite regR cards1 exp1n mul1n => <-.
- suffices ->: 'C_M(G) = 1 by rewrite cards1 exp1n mul1n.
- by apply/trivgP; rewrite -regR setIS ?centS //; case/sdprod_context: defG.
-move: eq_fix; rewrite regK cards1 muln1 => <-.
-suffices ->: 'C_M(G) = 1 by rewrite cards1 exp1n mul1n.
-by apply/trivgP; rewrite -regK setIS ?centS.
-Qed.
-
-End Wielandt_Frobenius.
-
-(* This is B & G, Theorem 3.10. *)
-Theorem Frobenius_primact gT (G K R M : {group gT}) :
- [Frobenius G = K ><| R] -> solvable G ->
- G \subset 'N(M) -> solvable M -> M :!=: 1 ->
- (*1*) coprime #|M| #|G| ->
- (*2*) semiprime M R ->
- (*3*) 'C_M(K) = 1 ->
- [/\ prime #|R|,
- #|M| = (#|'C_M(R)| ^ #|R|)%N
- & cyclic 'C_M(R) -> K^`(1) \subset 'C_K(M)].
-Proof.
-move: {2}_.+1 (ltnSn #|M|) => n; elim: n => // n IHn in gT G K R M *.
-rewrite ltnS => leMn frobG solG nMG solM ntM coMG primRM tcKM.
-case: (Frobenius_Wielandt_fixpoint frobG nMG) => // _ _ /(_ tcKM) oM.
-have [defG ntK ntR ltKG _]:= Frobenius_context frobG.
-have Rpr: prime #|R|.
- have [R1 | [r r_pr]] := trivgVpdiv R; first by case/eqP: ntR.
- case/Cauchy=> // x Rx ox; pose R0 := <[x]>; pose G0 := K <*> R0.
- have [_ defKR nKR tiKR] := sdprodP defG.
- have sR0R: R0 \subset R by rewrite cycle_subG.
- have sG0G: G0 \subset G by rewrite /G0 -genM_join gen_subG -defKR mulgS.
- have nKR0 := subset_trans sR0R nKR; have nMG0 := subset_trans sG0G nMG.
- have ntx: <[x]> != 1 by rewrite cycle_eq1 -order_gt1 ox prime_gt1.
- have [tcRM | ntcRM] := eqVneq 'C_M(R) 1.
- by rewrite -cardG_gt1 oM tcRM cards1 exp1n in ntM.
- have frobG0: [Frobenius G0 = K ><| R0].
- apply/Frobenius_semiregularP=> // [|y /setD1P[nty x_y]].
- by apply: sdprodEY nKR0 (trivgP _); rewrite -tiKR setIS.
- by apply: (Frobenius_reg_ker frobG); rewrite !inE nty (subsetP sR0R).
- case: (Frobenius_Wielandt_fixpoint frobG0 nMG0 (coprimegS _ coMG)) => // _ _.
- move/(_ tcKM)/eqP; rewrite oM cent_cycle.
- rewrite primRM; last by rewrite !inE Rx andbT -cycle_eq1.
- by rewrite eqn_exp2l ?cardG_gt1 // -orderE ox => /eqP->.
-split=> // cyc_cMR.
-have nM_MG: M <*> G \subset 'N(M) by rewrite join_subG normG.
-have [V minV sVM] := minnormal_exists ntM nM_MG.
-have [] := minnormal_solvable minV sVM solM.
-rewrite join_subG; case/andP=> nVM nVG ntV; case/is_abelemP=> [q q_pr abelV].
-have coVG := coprimeSg sVM coMG; have solV := solvableS sVM solM.
-have cVK': K^`(1) \subset 'C_K(V).
- case: (eqVneq 'C_V(R) 1) => [tcVR | ntcRV].
- case: (Frobenius_Wielandt_fixpoint frobG nVG) => // _.
- by move/(_ tcVR)=> cVK _; rewrite (setIidPl cVK) der_sub.
- have ocVR: #|'C_V(R)| = q.
- have [u def_u]: exists u, 'C_V(R) = <[u]>.
- by apply/cyclicP; apply: cyclicS (setSI _ sVM) cyc_cMR.
- rewrite def_u -orderE (abelem_order_p abelV) -?cycle_eq1 -?def_u //.
- by rewrite -cycle_subG -def_u subsetIl.
- apply: (Frobenius_prime_cent_prime _ defG _ _ abelV) => //.
- by case/prime_FrobeniusP: frobG.
- by rewrite (coprime_p'group _ (abelem_pgroup abelV) ntV) // coprime_sym.
-have cMK': K^`(1) / V \subset 'C_(K / V)(M / V).
- have [-> | ntMV] := eqVneq (M / V) 1.
- by rewrite subsetI cents1 quotientS ?der_sub.
- have coKR := Frobenius_coprime frobG.
- case/prime_FrobeniusP: frobG => //.
- case/sdprod_context=> nsKG sRG defKR nKR tiKR regR; have [sKG _] := andP nsKG.
- have nVK := subset_trans sKG nVG; have nVR := subset_trans sRG nVG.
- have RVpr: prime #|R / V|.
- rewrite card_quotient // -indexgI setIC coprime_TIg ?(coprimegS sRG) //.
- by rewrite indexg1.
- have frobGV: [Frobenius G / V = (K / V) ><| (R / V)].
- apply/prime_FrobeniusP; rewrite // -?cardG_gt1 ?card_quotient //.
- rewrite -indexgI setIC coprime_TIg ?(coprimegS sKG) //.
- by rewrite indexg1 cardG_gt1.
- rewrite -coprime_norm_quotient_cent ?(coprimegS sRG) //= regR quotient1.
- rewrite -defKR quotientMl // sdprodE ?quotient_norms //.
- by rewrite coprime_TIg ?coprime_morph.
- have ltMVn: #|M / V| < n by apply: leq_trans leMn; rewrite ltn_quotient.
- rewrite quotient_der //; move/IHn: frobGV.
- case/(_ _ ltMVn); rewrite ?quotient_sol ?quotient_norms ?coprime_morph //.
- - move=> Vx; case/setD1P=> ntVx; case/morphimP=> x nVx Rx defVx.
- rewrite defVx /= -cent_cycle -quotient_cycle //; congr 'C__(_ / V).
- apply/eqP; rewrite eqEsubset cycle_subG Rx /=.
- apply: contraR ntVx => /(prime_TIg Rpr)/trivgP.
- by rewrite defVx /= (setIidPr _) cycle_subG // => /set1P->; rewrite morph1.
- - rewrite -coprime_norm_quotient_cent ?(coprimegS sKG) ?(subset_trans sKG) //.
- by rewrite tcKM quotient1.
- move=> _ _ -> //; rewrite -coprime_quotient_cent ?quotient_cyclic //.
- by rewrite (coprimegS sRG).
-have{cVK' cMK'} [[sK'K cVK'] [_ cMVK']] := (subsetIP cVK', subsetIP cMK').
-have sK'G: K^`(1) \subset G by rewrite (subset_trans sK'K) ?proper_sub.
-have coMK': coprime #|M| #|K^`(1)| := coprimegS sK'G coMG.
-rewrite subsetI sK'K (stable_factor_cent cVK') //; apply/and3P; split=> //.
-by rewrite commGC -quotient_cents2 // (subset_trans sK'G).
-Qed.
-
-End BGsection3.
diff --git a/mathcomp/odd_order/BGsection4.v b/mathcomp/odd_order/BGsection4.v
deleted file mode 100644
index c35c9ab..0000000
--- a/mathcomp/odd_order/BGsection4.v
+++ /dev/null
@@ -1,1416 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq div.
-From mathcomp
-Require Import fintype finfun bigop ssralg finset prime binomial.
-From mathcomp
-Require Import fingroup morphism automorphism perm quotient action gproduct.
-From mathcomp
-Require Import gfunctor commutator zmodp cyclic center pgroup gseries nilpotent.
-From mathcomp
-Require Import sylow abelian maximal extremal hall.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation mxabelem.
-From mathcomp
-Require Import BGsection1 BGsection2.
-
-(******************************************************************************)
-(* This file covers B & G, Section 4, i.e., the proof of structure theorems *)
-(* for solvable groups with a small (of rank at most 2) Fitting subgroup. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope.
-
-Section Section4.
-
-Implicit Type gT : finGroupType.
-Implicit Type p : nat.
-
-(* B & G, Lemma 4.1 (also, Gorenstein, 1.3.4, and Aschbacher, ex. 2.4) is *)
-(* covered by Lemma center_cyclic_abelian, in center.v. *)
-
-(* B & G, Lemma 4.2 is covered by Lemmas commXg, commgX, commXXg (for 4.2(a)) *)
-(* and expMg_Rmul (for 4.2(b)) in commutators.v. *)
-
-(* This is B & G, Proposition 4.3. *)
-Proposition exponent_odd_nil23 gT (R : {group gT}) p :
- p.-group R -> odd #|R| -> nil_class R <= 2 + (p > 3) ->
- [/\ (*a*) exponent 'Ohm_1(R) %| p
- & (*b*) R^`(1) \subset 'Ohm_1(R) ->
- {in R &, {morph expgn^~ p : x y / x * y}}].
-Proof.
-move=> pR oddR classR.
-pose f n := 'C(n, 3); pose g n := 'C(n, 3).*2 + 'C(n, 2).
-have fS n: f n.+1 = 'C(n, 2) + f n by rewrite /f binS addnC.
-have gS n: g n.+1 = 'C(n, 2).*2 + 'C(n, 1) + g n.
- by rewrite /g !binS doubleD -!addnA; do 3!nat_congr.
-have [-> | ntR] := eqsVneq R 1.
- rewrite Ohm1 exponent1 der_sub dvd1n; split=> // _ _ _ /set1P-> /set1P->.
- by rewrite !(mulg1, expg1n).
-have{ntR} [p_pr p_dv_R _] := pgroup_pdiv pR ntR.
-have pdivbin2: p %| 'C(p, 2).
- by rewrite prime_dvd_bin //= odd_prime_gt2 // (dvdn_odd p_dv_R).
-have p_dv_fp: p > 3 -> p %| f p by move=> pgt3; apply: prime_dvd_bin.
-have p_dv_gp: p > 3 -> p %| g p.
- by move=> pgt3; rewrite dvdn_add // -muln2 dvdn_mulr // p_dv_fp.
-have exp_dv_p x m (S : {group gT}):
- exponent S %| p -> p %| m -> x \in S -> x ^+ m = 1.
-- move=> expSp p_dv_m Sx; apply/eqP; rewrite -order_dvdn.
- by apply: dvdn_trans (dvdn_trans expSp p_dv_m); apply: dvdn_exponent.
-have p3_L21: p <= 3 -> {in R & &, forall u v w, [~ u, v, w] = 1}.
- move=> lep3 u v w Ru Rv Rw; rewrite (ltnNge 3) lep3 nil_class2 in classR.
- by apply/eqP/commgP; red; rewrite (centerC Rw) // (subsetP classR) ?mem_commg.
-have{fS gS} expMR_fg: {in R &, forall u v n (r := [~ v, u]),
- (u * v) ^+ n = u ^+ n * v ^+ n * r ^+ 'C(n, 2)
- * [~ r, u] ^+ f n * [~ r, v] ^+ g n}.
-- move=> u v Ru Rv n r; have Rr: r \in R by apply: groupR.
- have cRr: {in R &, forall x y, commute x [~ r, y]}.
- move=> x y Rx Ry /=; red; rewrite (centerC Rx) //.
- have: [~ r, y] \in 'L_3(R) by rewrite !mem_commg.
- by apply: subsetP; rewrite -nil_class3 (leq_trans classR) // !ltnS leq_b1.
- elim: n => [|n IHn]; first by rewrite !mulg1.
- rewrite 3!expgSr {}IHn -!mulgA (mulgA (_ ^+ f n)); congr (_ * _).
- rewrite -commuteM; try by apply: commuteX; red; rewrite cRr ?groupM.
- rewrite -mulgA; do 2!rewrite (mulgA _ u) (commgC _ u) -2!mulgA.
- congr (_ * (_ * _)); rewrite (mulgA _ v).
- have ->: [~ v ^+ n, u] = r ^+ n * [~ r, v] ^+ 'C(n, 2).
- elim: n => [|n IHn]; first by rewrite comm1g mulg1.
- rewrite !expgS commMgR -/r {}IHn commgX; last exact: cRr.
- rewrite binS bin1 addnC expgD -2!mulgA; congr (_ * _); rewrite 2!mulgA.
- by rewrite commuteX2 // /commute cRr.
- rewrite commXg 1?commuteX2 -?[_ * v]commuteX; try exact: cRr.
- rewrite mulgA {1}[mulg]lock mulgA -mulgA -(mulgA v) -!expgD -fS -lock.
- rewrite -{2}(bin1 n) addnC -binS -2!mulgA (mulgA _ v) (commgC _ v).
- rewrite -commuteX; last by red; rewrite cRr ?(Rr, groupR, groupX, groupM).
- rewrite -3!mulgA; congr (_ * (_ * _)); rewrite 2!mulgA.
- rewrite commXg 1?commuteX2; try by red; rewrite cRr 1?groupR.
- by rewrite -!mulgA -!expgD addnCA binS addnAC addnn addnC -gS.
-have expR1p: exponent 'Ohm_1(R) %| p.
- elim: _.+1 {-2 4}R (ltnSn #|R|) (subxx R) => // n IHn Q leQn sQR.
- rewrite (OhmE 1 (pgroupS sQR pR)) expn1 -sub_LdivT.
- rewrite gen_set_id ?subsetIr //.
- apply/group_setP; rewrite !inE group1 expg1n /=.
- split=> // x y /LdivP[Qx xp1] /LdivP[Qy yp1]; rewrite !inE groupM //=.
- have sxQ: <[x]> \subset Q by rewrite cycle_subG.
- have [{sxQ}defQ|[S maxS /= sxS]] := maximal_exists sxQ.
- rewrite expgMn; first by rewrite xp1 yp1 mulg1.
- by apply: (centsP (cycle_abelian x)); rewrite ?defQ.
- have:= maxgroupp maxS; rewrite properEcard => /andP[sSQ ltSQ].
- have pQ := pgroupS sQR pR; have pS := pgroupS sSQ pQ.
- have{ltSQ leQn} ltSn: #|S| < n by apply: leq_trans ltSQ _.
- have expS1p := IHn _ ltSn (subset_trans sSQ sQR).
- have defS1 := Ohm1Eexponent p_pr expS1p; move/exp_dv_p: expS1p => expS1p.
- have nS1Q: [~: Q, 'Ohm_1(S)] \subset 'Ohm_1(S).
- by rewrite commg_subr gFnorm_trans ?normal_norm // (p_maximal_normal pQ).
- have S1x : x \in 'Ohm_1(S) by rewrite defS1 !inE -cycle_subG sxS xp1 /=.
- have S1yx : [~ y, x] \in 'Ohm_1(S) by rewrite (subsetP nS1Q) ?mem_commg.
- have S1yxx : [~ y, x, x] \in 'Ohm_1(S) by rewrite groupR.
- have S1yxy : [~ y, x, y] \in 'Ohm_1(S).
- by rewrite -invg_comm groupV (subsetP nS1Q) 1?mem_commg.
- rewrite expMR_fg ?(subsetP sQR) //= xp1 yp1 expS1p ?mul1g //.
- case: (leqP p 3) => [p_le3 | p_gt3]; last by rewrite ?expS1p ?mul1g; auto.
- by rewrite !p3_L21 // ?(subsetP sQR) // !expg1n mulg1.
-split=> // sR'R1 x y Rx Ry; rewrite -[x ^+ p * _]mulg1 expMR_fg // -2!mulgA //.
-have expR'p := exp_dv_p _ _ _ (dvdn_trans (exponentS sR'R1) expR1p).
-congr (_ * _); rewrite expR'p ?mem_commg // mul1g.
-case: (leqP p 3) => [p_le3 | p_gt3].
- by rewrite !p3_L21 // ?(subsetP sQR) // !expg1n mulg1.
-by rewrite !expR'p 1?mem_commg ?groupR ?mulg1; auto.
-Qed.
-
-(* Part (a) of B & G, Proposition 4.4 is covered in file maximal.v by lemmas *)
-(* max_SCN and SCN_max. *)
-
-(* This is B & G, Proposition 4.4(b), or Gorenstein 7.6.5. *)
-Proposition SCN_Sylow_cent_dprod gT (R G A : {group gT}) p :
- p.-Sylow(G) R -> A \in 'SCN(R) -> 'O_p^'('C_G(A)) \x A = 'C_G(A).
-Proof.
-move=> sylR scnA; have [[sRG _] [nAR CRA_A]] := (andP sylR, SCN_P scnA).
-set C := 'C_G(A); have /maxgroupP[/andP[nAG abelA] maxA] := SCN_max scnA.
-have CiP_eq : C :&: R = A by rewrite -CRA_A setIC setIA (setIidPl sRG).
-have sylA: p.-Sylow(C) A.
- rewrite -CiP_eq; apply: (Sylow_setI_normal (subcent_normal _ _)).
- by apply: pHall_subl sylR; rewrite ?subsetIl // subsetI sRG normal_norm.
-rewrite dprodEsd; last by rewrite centsC gFsub_trans ?subsetIr.
-by apply: Burnside_normal_complement; rewrite // subIset ?subsetIr.
-Qed.
-
-(* This is B & G, Lemma 4.5(b), or Gorenstein, 5.4.4 and 5.5.5. *)
-Lemma Ohm1_extremal_odd gT (R : {group gT}) p x :
- p.-group R -> odd #|R| -> ~~ cyclic R -> x \in R -> #|R : <[x]>| = p ->
- ('Ohm_1(R))%G \in 'E_p^2(R).
-Proof.
-move=> pR oddR ncycR Rx ixR; rewrite -cycle_subG in Rx.
-have ntR: R :!=: 1 by apply: contra ncycR; move/eqP->; apply: cyclic1.
-have [p_pr _ [e oR]]:= pgroup_pdiv pR ntR.
-case p2: (p == 2); first by rewrite oR odd_exp (eqP p2) in oddR.
-have [cRR | not_cRR] := orP (orbN (abelian R)).
- rewrite 2!inE Ohm_sub Ohm1_abelem // -p_rank_abelian //= eqn_leq.
- rewrite -rank_pgroup // ltnNge -abelian_rank1_cyclic // ncycR andbT.
- have maxX: maximal <[x]> R by rewrite (p_index_maximal Rx) ?ixR.
- have nsXR: <[x]> <| R := p_maximal_normal pR maxX.
- have [_ [y Ry notXy]] := properP (maxgroupp maxX).
- have defR: <[x]> * <[y]> = R.
- by apply: mulg_normal_maximal; rewrite ?cycle_subG.
- rewrite -grank_abelian // -(genGid R) -defR genM_join joing_idl joing_idr.
- by rewrite (leq_trans (grank_min _)) // cards2 ltnS leq_b1.
-have{x Rx ixR} [e_gt1 isoR]: 2 < e.+1 /\ R \isog 'Mod_(p ^ e.+1).
- have:= maximal_cycle_extremal pR not_cRR (cycle_cyclic x) Rx ixR.
- rewrite p2 orbF /extremal_class oR pfactorKpdiv // pdiv_pfactor //.
- by do 4!case: andP => //.
-have [[x y] genR modR] := generators_modular_group p_pr e_gt1 isoR.
-have [_ _ _ _] := modular_group_structure p_pr e_gt1 genR isoR modR.
-rewrite xpair_eqE p2; case/(_ 1%N) => // _ oR1.
-by rewrite 2!inE Ohm_sub oR1 pfactorK ?abelem_Ohm1 ?(card_p2group_abelian p_pr).
-Qed.
-
-Section OddNonCyclic.
-
-Variables (gT : finGroupType) (p : nat) (R : {group gT}).
-Hypotheses (pR : p.-group R) (oddR : odd #|R|) (ncycR : ~~ cyclic R).
-
-(* This is B & G, Lemma 4.5(a), or Gorenstein 5.4.10. *)
-Lemma ex_odd_normal_p2Elem : {S : {group gT} | S <| R & S \in 'E_p^2(R)}.
-Proof.
-have [M minM]: {M | [min M | M <| R & ~~ cyclic M]}.
- by apply: ex_mingroup; exists R; rewrite normal_refl.
-have{minM} [[nsMR ncycM] [_ minM]] := (andP (mingroupp minM), mingroupP minM).
-have [sMR _] := andP nsMR; have pM := pgroupS sMR pR.
-exists ('Ohm_1(M))%G; first exact: gFnormal_trans.
-apply: (subsetP (pnElemS _ _ sMR)).
-have [M1 | ntM] := eqsVneq M 1; first by rewrite M1 cyclic1 in ncycM.
-have{ntM} [p_pr _ [e oM]] := pgroup_pdiv pM ntM.
-have le_e_M: e <= logn p #|M| by rewrite ltnW // oM pfactorK.
-have{le_e_M} [N [sNM nsNR] oN] := normal_pgroup pR nsMR le_e_M.
-have ltNM: ~~ (#|N| >= #|M|) by rewrite -ltnNge oM oN ltn_exp2l ?prime_gt1.
-have cycN : cyclic N by apply: contraR ltNM => ncycN; rewrite minM //= nsNR.
-case/cyclicP: cycN => x defN; have Mx : x \in M by rewrite -cycle_subG -defN.
-apply: Ohm1_extremal_odd Mx _; rewrite ?(oddSg sMR) //.
-by rewrite -divgS /= -defN // oM oN expnS mulnK // expn_gt0 prime_gt0.
-Qed.
-
-(* This is B & G, Lemma 4.5(c). *)
-Lemma Ohm1_odd_ucn2 (Z := 'Ohm_1('Z_2(R))) : ~~ cyclic Z /\ exponent Z %| p.
-Proof.
-have [S nsSR Ep2S] := ex_odd_normal_p2Elem; have p_pr := pnElem_prime Ep2S.
-have [sSR abelS dimS] := pnElemP Ep2S; have [pS cSS expSp]:= and3P abelS.
-pose SR := [~: S, R]; pose SRR := [~: SR, R].
-have nilR := pgroup_nil pR.
-have ntS: S :!=: 1 by rewrite -rank_gt0 (rank_abelem abelS) dimS.
-have sSR_S: SR \subset S by rewrite commg_subl normal_norm.
-have sSRR_SR: SRR \subset SR by rewrite commSg.
-have sSR_R := subset_trans sSR_S sSR.
-have{ntS} prSR: SR \proper S.
- by rewrite (nil_comm_properl nilR) // subsetI subxx -commg_subl.
-have SRR1: SRR = 1.
- have [SR1 | ntSR] := eqVneq SR 1; first by rewrite /SRR SR1 comm1G.
- have prSRR: SRR \proper SR.
- rewrite /proper sSRR_SR; apply: contra ntSR => sSR_SRR.
- by rewrite (forall_inP nilR) // subsetI sSR_R.
- have pSR := pgroupS sSR_R pR; have pSRR := pgroupS sSRR_SR pSR.
- have [_ _ [e oSR]] := pgroup_pdiv pSR ntSR; have [f oSRR] := p_natP pSRR.
- have e0: e = 0.
- have:= proper_card prSR; rewrite oSR (card_pnElem Ep2S).
- by rewrite ltn_exp2l ?prime_gt1 // !ltnS leqn0; move/eqP.
- apply/eqP; have:= proper_card prSRR; rewrite trivg_card1 oSR oSRR e0.
- by rewrite ltn_exp2l ?prime_gt1 // ltnS; case f.
-have sSR_ZR: [~: S, R] \subset 'Z(R).
- by rewrite subsetI sSR_R /=; apply/commG1P.
-have sS_Z2R: S \subset 'Z_2(R).
- rewrite ucnSnR; apply/subsetP=> s Ss; rewrite inE (subsetP sSR) //= ucn1.
- by rewrite (subset_trans _ sSR_ZR) ?commSg ?sub1set.
-have sZ2R_R := ucn_sub 2 R; have pZ2R := pgroupS sZ2R_R pR.
-have pZ: p.-group Z by apply: pgroupS pR; apply/gFsub_trans/gFsub.
-have sSZ: S \subset Z.
- by rewrite /Z (OhmE 1 pZ2R) sub_gen // subsetI sS_Z2R sub_LdivT.
-have ncycX: ~~ cyclic S by rewrite (abelem_cyclic abelS) dimS.
-split; first by apply: contra ncycX; apply: cyclicS.
-have nclZ2R : nil_class 'Z_2(R) <= 2 + _ := leq_trans (nil_class_ucn _ _) _.
-by have [] := exponent_odd_nil23 pZ2R (oddSg sZ2R_R oddR) (nclZ2R _ _).
-Qed.
-
-End OddNonCyclic.
-
-(* Some "obvious" consequences of the above, which are used casually and *)
-(* pervasively throughout B & G. *)
-Definition odd_pgroup_rank1_cyclic := odd_pgroup_rank1_cyclic. (* in extremal *)
-
-Lemma odd_rank1_Zgroup gT (G : {group gT}) :
- odd #|G| -> Zgroup G = ('r(G) <= 1).
-Proof.
-move=> oddG; apply/forallP/idP=> [ZgG | rG_1 P].
- have [p p_pr ->]:= rank_witness G; have [P sylP]:= Sylow_exists p G.
- have [sPG pP _] := and3P sylP; have oddP := oddSg sPG oddG.
- rewrite -(p_rank_Sylow sylP) -(odd_pgroup_rank1_cyclic pP) //.
- by apply: (implyP (ZgG P)); apply: (p_Sylow sylP).
-apply/implyP=> /SylowP[p p_pr /and3P[sPG pP _]].
-rewrite (odd_pgroup_rank1_cyclic pP (oddSg sPG oddG)).
-by apply: leq_trans (leq_trans (p_rank_le_rank p G) rG_1); apply: p_rankS.
-Qed.
-
-(* This is B & G, Proposition 4.6 (a stronger version of Lemma 4.5(a)). *)
-Proposition odd_normal_p2Elem_exists gT p (R S : {group gT}) :
- p.-group R -> odd #|R| -> S <| R -> ~~ cyclic S ->
- exists E : {group gT}, [/\ E \subset S, E <| R & E \in 'E_p^2(R)].
-Proof.
-move=> pR oddR nsSR ncycS; have sSR := normal_sub nsSR.
-have{sSR ncycS} []:= Ohm1_odd_ucn2 (pgroupS sSR pR) (oddSg sSR oddR) ncycS.
-set Z := 'Ohm_1(_) => ncycZ expZp.
-have chZS: Z \char S by rewrite !gFchar_trans.
-have{nsSR} nsZR: Z <| R := char_normal_trans chZS nsSR.
-have [sZR _] := andP nsZR; have pZ: p.-group Z := pgroupS sZR pR.
-have geZ2: 2 <= logn p #|Z|.
- rewrite (odd_pgroup_rank1_cyclic pZ (oddSg sZR oddR)) -ltnNge /= -/Z in ncycZ.
- by case/p_rank_geP: ncycZ => E; case/pnElemP=> sEZ _ <-; rewrite lognSg.
-have [E [sEZ nsER oE]] := normal_pgroup pR nsZR geZ2.
-have [sER _] := andP nsER; have{pR} pE := pgroupS sER pR.
-have{geZ2} p_pr: prime p by move: geZ2; rewrite lognE; case: (prime p).
-have{oE p_pr} dimE2: logn p #|E| = 2 by rewrite oE pfactorK.
-exists E; split; rewrite ?(subset_trans _ (char_sub chZS)) {chZS nsZR}//.
-rewrite !inE /abelem sER pE (p2group_abelian pE) dimE2 //= andbT.
-exact/(dvdn_trans _ expZp)/exponentS.
-Qed.
-
-(* This is B & G, Lemma 4.7, and (except for the trivial converse) Gorenstein *)
-(* 5.4.15 and Aschbacher 23.17. *)
-Lemma rank2_SCN3_empty gT p (R : {group gT}) :
- p.-group R -> odd #|R| -> ('r(R) <= 2) = ('SCN_3(R) == set0).
-Proof.
-move=> pR oddR; apply/idP/idP=> [leR2 | SCN_3_empty].
- apply/set0Pn=> [[A /setIdP[/SCN_P[/andP[sAR _] _]]]].
- by rewrite ltnNge (leq_trans (rankS sAR)).
-rewrite (rank_pgroup pR) leqNgt; apply/negP=> gtR2.
-have ncycR: ~~ cyclic R by rewrite (odd_pgroup_rank1_cyclic pR) // -ltnNge ltnW.
-have{ncycR} [Z nsZR] := ex_odd_normal_p2Elem pR oddR ncycR.
-case/pnElemP=> sZR abelZ dimZ2; have [pZ cZZ _] := and3P abelZ.
-have{SCN_3_empty} defZ: 'Ohm_1('C_R(Z)) = Z.
- apply: (Ohm1_cent_max_normal_abelem _ pR).
- by have:= oddSg sZR oddR; rewrite (card_pgroup pZ) dimZ2 odd_exp.
- apply/maxgroupP; split=> [|H /andP[nsHR abelH] sZH]; first exact/andP.
- have [pH cHH _] := and3P abelH; apply/eqP; rewrite eq_sym eqEproper sZH /=.
- pose normal_abelian := [pred K : {group gT} | K <| R & abelian K].
- have [|K maxK sHK] := @maxgroup_exists _ normal_abelian H; first exact/andP.
- apply: contraL SCN_3_empty => ltZR; apply/set0Pn; exists K.
- rewrite inE (max_SCN pR) {maxK}//= -dimZ2 (leq_trans _ (rankS sHK)) //.
- by rewrite (rank_abelem abelH) properG_ltn_log.
-have{gtR2} [A] := p_rank_geP gtR2; pose H := 'C_A(Z); pose K := H <*> Z.
-case/pnElemP=> sAR abelA dimA3; have [pA cAA _] := and3P abelA.
-have{nsZR} nZA := subset_trans sAR (normal_norm nsZR).
-have sHA: H \subset A := subsetIl A _; have abelH := abelemS sHA abelA.
-have geH2: logn p #|H| >= 2.
- rewrite -ltnS -dimA3 -(Lagrange sHA) lognM // -addn1 leq_add2l /= -/H.
- by rewrite logn_quotient_cent_abelem ?dimZ2.
-have{abelH} abelK : p.-abelem K.
- by rewrite (cprod_abelem _ (cprodEY _)) 1?centsC ?subsetIr ?abelH.
-suffices{sZR cZZ defZ}: 'r(Z) < 'r(K).
- by rewrite ltnNge -defZ rank_Ohm1 rankS // join_subG setSI // subsetI sZR.
-rewrite !(@rank_abelem _ p) // properG_ltn_log ?abelem_pgroup //= -/K properE.
-rewrite joing_subr join_subG subxx andbT subEproper; apply: contraL geH2.
-case/predU1P=> [defH | ltHZ]; last by rewrite -ltnNge -dimZ2 properG_ltn_log.
-rewrite -defH [H](setIidPl _) ?dimA3 // in dimZ2.
-by rewrite centsC -defH subIset // -abelianE cAA.
-Qed.
-
-(* This is B & G, Proposition 4.8(a). *)
-Proposition rank2_exponent_p_p3group gT (R : {group gT}) p :
- p.-group R -> rank R <= 2 -> exponent R %| p -> logn p #|R| <= 3.
-Proof.
-move=> pR rankR expR.
-have [A max_na_A]: {A | [max A | A <| R & abelian A]}.
- by apply: ex_maxgroup; exists 1%G; rewrite normal1 abelian1.
-have {max_na_A} SCN_A := max_SCN pR max_na_A.
-have cAA := SCN_abelian SCN_A; case/SCN_P: SCN_A => nAR cRAA.
-have sAR := normal_sub nAR; have pA := pgroupS sAR pR.
-have abelA : p.-abelem A.
- by rewrite /abelem pA cAA /= (dvdn_trans (exponentS sAR) expR).
-have cardA : logn p #|A| <= 2.
- by rewrite -rank_abelem // (leq_trans (rankS sAR) rankR).
-have cardRA : logn p #|R : A| <= 1.
- by rewrite -cRAA logn_quotient_cent_abelem // (normal_norm nAR).
-rewrite -(Lagrange sAR) lognM ?cardG_gt0 //.
-by apply: (leq_trans (leq_add cardA cardRA)).
-Qed.
-
-(* This is B & G, Proposition 4.8(b). *)
-Proposition exponent_Ohm1_rank2 gT p (R : {group gT}) :
- p.-group R -> 'r(R) <= 2 -> p > 3 -> exponent 'Ohm_1(R) %| p.
-Proof.
-move=> pR rR p_gt3; wlog p_pr: / prime p.
- have [-> | ntR] := eqsVneq R 1; first by rewrite Ohm1 exponent1 dvd1n.
- by apply; have [->] := pgroup_pdiv pR ntR.
-wlog minR: R pR rR / forall S, gval S \proper R -> exponent 'Ohm_1(S) %| p.
- elim: {R}_.+1 {-2}R (ltnSn #|R|) => // m IHm R leRm in pR rR * => IH.
- apply: (IH) => // S; rewrite properEcard; case/andP=> sSR ltSR.
- exact: IHm (leq_trans ltSR _) (pgroupS sSR pR) (leq_trans (rankS sSR) rR) IH.
-wlog not_clR_le3: / ~~ (nil_class R <= 3).
- case: leqP => [clR_le3 _ | _ -> //].
- have [||-> //] := exponent_odd_nil23 pR; last by rewrite p_gt3.
- by apply: odd_pgroup_odd pR; case/even_prime: p_pr p_gt3 => ->.
-rewrite -sub_LdivT (OhmE 1 pR) gen_set_id ?subsetIr //.
-apply/group_setP; rewrite !inE group1 expg1n.
-split=> //= x y; case/LdivP=> Rx xp1; case/LdivP=> Ry yp1.
-rewrite !inE groupM //=; apply: contraR not_clR_le3 => nt_xyp.
-pose XY := <[x]> <*> <[y]>.
-have [XYx XYy]: x \in XY /\ y \in XY by rewrite -!cycle_subG; apply/joing_subP.
-have{nt_xyp} defR: XY = R.
- have sXY_R : XY \subset R by rewrite join_subG !cycle_subG Rx Ry.
- have pXY := pgroupS sXY_R pR; have [// | ltXY_R] := eqVproper sXY_R.
- rewrite (exponentP (minR _ ltXY_R)) ?eqxx // in nt_xyp.
- by rewrite (OhmE 1 pXY) groupM ?mem_gen ?inE ?XYx ?XYy /= ?xp1 ?yp1.
-have sXR: <[x]> \subset R by rewrite cycle_subG.
-have [<- | ltXR] := eqVproper sXR.
- by rewrite 2?leqW // nil_class1 cycle_abelian.
-have [S maxS sXS]: {S : {group gT} | maximal S R & <[x]> \subset S}.
- exact: maxgroup_exists.
-have nsSR: S <| R := p_maximal_normal pR maxS; have [sSR _] := andP nsSR.
-have{nsSR} nsS1R: 'Ohm_1(S) <| R := gFnormal_trans _ nsSR.
-have [sS1R nS1R] := andP nsS1R; have pS1 := pgroupS sS1R pR.
-have expS1p: exponent 'Ohm_1(S) %| p := minR S (maxgroupp maxS).
-have{expS1p} dimS1: logn p #|'Ohm_1(S)| <= 3.
- exact: rank2_exponent_p_p3group pS1 (leq_trans (rankS sS1R) rR) expS1p.
-have sXS1: <[x]> \subset 'Ohm_1(S).
- rewrite cycle_subG /= (OhmE 1 (pgroupS sSR pR)) mem_gen //.
- by rewrite !inE -cycle_subG sXS xp1 /=.
-have dimS1b: logn p #|R / 'Ohm_1(S)| <= 1.
- rewrite -quotientYidl // -defR joingA (joing_idPl sXS1).
- rewrite quotientYidl ?cycle_subG ?(subsetP nS1R) //.
- rewrite (leq_trans (logn_quotient _ _ _)) // -(pfactorK 1 p_pr).
- by rewrite dvdn_leq_log ?prime_gt0 // order_dvdn yp1.
-rewrite (leq_trans (nil_class_pgroup pR)) // geq_max /= -subn1 leq_subLR.
-by rewrite -(Lagrange sS1R) lognM // -card_quotient // addnC leq_add.
-Qed.
-
-(* This is B & G, Lemma 4.9. *)
-Lemma quotient_p2_Ohm1 gT p (R : {group gT}) :
- p.-group R -> p > 3 -> logn p #|'Ohm_1(R)| <= 2 ->
- forall T : {group gT}, T <| R -> logn p #|'Ohm_1(R / T)| <= 2.
-Proof.
-move=> pR p_gt3 dimR1; move: {2}_.+1 (ltnSn #|R|) => n.
-elim: n => // n IHn in gT R pR dimR1 *; rewrite ltnS => leRn.
-apply/forall_inP/idPn; rewrite negb_forall_in.
-case/existsP/ex_mingroup=> T /mingroupP[/andP[nsTR dimRb1] minT].
-have [sTR nTR] := andP nsTR; have pT: p.-group T := pgroupS sTR pR.
-pose card_iso_Ohm := card_isog (gFisog [igFun of Ohm 1] _).
-have ntT: T :!=: 1; last have p_pr: prime p by have [] := pgroup_pdiv pT ntT.
- apply: contraNneq dimRb1 => ->.
- by rewrite -(card_iso_Ohm _ _ _ _ (quotient1_isog R)).
-have{minT} dimT: logn p #|T| = 1%N.
- have [Z EpZ]: exists Z, Z \in 'E_p^1(T :&: 'Z(R)).
- apply/p_rank_geP; rewrite -rank_pgroup ?(pgroupS (subsetIl T _)) //.
- by rewrite rank_gt0 (meet_center_nil (pgroup_nil pR)).
- have [sZ_ZT _ dimZ] := pnElemP EpZ; have [sZT sZZ] := subsetIP sZ_ZT.
- have{sZZ} nsZR: Z <| R := sub_center_normal sZZ.
- rewrite -(minT Z) // nsZR; apply: contra dimRb1 => dimRz1.
- rewrite -(card_iso_Ohm _ _ _ _ (third_isog sZT nsZR nsTR)) /=.
- rewrite IHn ?quotient_pgroup ?quotient_normal ?(leq_trans _ leRn) //.
- by rewrite ltn_quotient ?(subset_trans sZT) // (nt_pnElem EpZ).
-have pRb: p.-group (R / T) by apply: quotient_pgroup.
-have{IHn} minR (Ub : {group coset_of T}):
- Ub \subset R / T -> ~~ (logn p #|'Ohm_1(Ub)| <= 2) -> R / T = Ub.
-- case/inv_quotientS=> // U -> sTU sUR dimUb; congr (_ / T).
- apply/eqP; rewrite eq_sym eqEcard sUR leqNgt; apply: contra dimUb => ltUR.
- rewrite IHn ?(pgroupS sUR) ?(normalS _ sUR) ?(leq_trans ltUR) //.
- by rewrite (leq_trans _ dimR1) ?lognSg ?OhmS.
-have [dimRb eRb]: logn p #|R / T| = 3 /\ exponent (R / T) %| p.
- have [Rb_gt2 | Rb_le2] := ltnP 2 'r_p(R / T).
- have [Ub Ep3Ub] := p_rank_geP Rb_gt2.
- have [sUbR abelUb dimUb] := pnElemP Ep3Ub; have [_ _ eUb] := and3P abelUb.
- by rewrite (minR Ub) // (Ohm1_id abelUb) dimUb.
- rewrite -rank_pgroup // in Rb_le2.
- have eRb: exponent (R / T) %| p.
- by rewrite (minR _ (Ohm_sub 1 _)) ?exponent_Ohm1_rank2 ?Ohm_id.
- split=> //; apply/eqP; rewrite eqn_leq rank2_exponent_p_p3group // ltnNge.
- by apply: contra (leq_trans _) dimRb1; rewrite lognSg ?Ohm_sub.
-have ntRb: (R / T) != 1.
- by rewrite -cardG_gt1 (card_pgroup pRb) dimRb (ltn_exp2l 0) ?prime_gt1.
-have{dimRb} dimR: logn p #|R| = 4.
- by rewrite -(Lagrange sTR) lognM ?cardG_gt0 // dimT -card_quotient ?dimRb.
-have nsR1R: 'Ohm_1(R) <| R := Ohm_normal 1 R; have [sR1R nR1R] := andP nsR1R.
-have pR1: p.-group 'Ohm_1(R) := pgroupS sR1R pR.
-have p_odd: odd p by case/even_prime: p_pr p_gt3 => ->.
-have{p_odd} oddR: odd #|R| := odd_pgroup_odd p_odd pR.
-have{dimR1} dimR1: logn p #|'Ohm_1(R)| = 2.
- apply/eqP; rewrite eqn_leq dimR1 -p_rank_abelem; last first.
- by rewrite abelem_Ohm1 // (p2group_abelian pR1).
- rewrite ltnNge p_rank_Ohm1 -odd_pgroup_rank1_cyclic //.
- apply: contra dimRb1 => cycR; have cycRb := quotient_cyclic T cycR.
- by rewrite (Ohm1_cyclic_pgroup_prime cycRb pRb ntRb) (pfactorK 1).
-have pRs: p.-group (R / 'Ohm_1(R)) by rewrite quotient_pgroup.
-have dimRs: logn p #|R / 'Ohm_1(R)| = 2.
- by rewrite -divg_normal // logn_div ?cardSg // dimR1 dimR.
-have sR'R1: R^`(1) \subset 'Ohm_1(R).
- by rewrite der1_min // (p2group_abelian pRs) ?dimRs.
-have [|_ phiM] := exponent_odd_nil23 pR oddR.
- by rewrite (leq_trans (nil_class_pgroup pR)) // dimR p_gt3.
-pose phi := Morphism (phiM sR'R1).
-suffices: logn p #|R / 'Ohm_1(R)| <= logn p #|T| by rewrite dimT dimRs.
-have ->: 'Ohm_1(R) = 'ker phi.
- rewrite -['ker phi]genGid (OhmE 1 pR); congr <<_>>.
- by apply/setP=> x; rewrite !inE.
-rewrite (card_isog (first_isog phi)) lognSg //=.
-apply/subsetP=> _ /morphimP[x _ Rx ->] /=.
-apply: coset_idr; first by rewrite groupX ?(subsetP nTR).
-by rewrite morphX ?(subsetP nTR) // (exponentP eRb) // mem_quotient.
-Qed.
-
-(* This is B & G, Lemma 4.10. *)
-Lemma Ohm1_metacyclic_p2Elem gT p (R : {group gT}) :
- metacyclic R -> p.-group R -> odd #|R| -> ~~ cyclic R ->
- 'Ohm_1(R)%G \in 'E_p^2(R).
-Proof.
-case/metacyclicP=> S [cycS nsSR cycRb] pR oddR ncycR.
-have [[sSR nSR] [s defS]] := (andP nsSR, cyclicP cycS).
-have [T defTb sST sTR] := inv_quotientS nsSR (Ohm_sub 1 (R / S)).
-have [pT oddT] := (pgroupS sTR pR, oddSg sTR oddR).
-have Ts: s \in T by rewrite -cycle_subG -defS.
-have iTs: #|T : <[s]>| = p.
- rewrite -defS -card_quotient ?(subset_trans sTR) // -defTb.
- rewrite (Ohm1_cyclic_pgroup_prime cycRb (quotient_pgroup _ pR)) // -subG1.
- by rewrite quotient_sub1 ?(contra (fun sRS => cyclicS sRS cycS)).
-have defR1: 'Ohm_1(R) = 'Ohm_1(T).
- apply/eqP; rewrite eqEsubset (OhmS _ sTR) andbT -Ohm_id OhmS //.
- by rewrite -(quotientSGK _ sST) ?gFsub_trans // -defTb morphim_Ohm.
-rewrite (subsetP (pnElemS _ _ sTR)) // (group_inj defR1).
-apply: Ohm1_extremal_odd iTs => //; apply: contra ncycR.
-by rewrite !(@odd_pgroup_rank1_cyclic _ p) // -p_rank_Ohm1 -defR1 p_rank_Ohm1.
-Qed.
-
-(* This is B & G, Proposition 4.11 (due to Huppert). *)
-Proposition p2_Ohm1_metacyclic gT p (R : {group gT}) :
- p.-group R -> p > 3 -> logn p #|'Ohm_1(R)| <= 2 -> metacyclic R.
-Proof.
-move=> pR p_gt3 dimR1; move: {2}_.+1 (ltnSn #|R|) => n.
-elim: n => // n IHn in gT R pR dimR1 *; rewrite ltnS => leRn.
-have pR1: p.-group 'Ohm_1(R) := pgroupS (Ohm_sub 1 R) pR.
-have [cRR | not_cRR] := boolP (abelian R).
- have [b defR typeR] := abelian_structure cRR; move: dimR1 defR.
- rewrite -(rank_abelian_pgroup pR cRR) -(size_abelian_type cRR) -{}typeR.
- case: b => [|a [|b []]] //= _; first by move <-; rewrite big_nil metacyclic1.
- by rewrite big_seq1 => <-; rewrite cyclic_metacyclic ?cycle_cyclic.
- rewrite big_cons big_seq1; case/dprodP=> _ <- cAB _.
- apply/existsP; exists <[a]>%G; rewrite cycle_cyclic /=.
- rewrite /normal mulG_subl mulG_subG normG cents_norm //= quotientMidl.
- by rewrite quotient_cycle ?cycle_cyclic // -cycle_subG cents_norm.
-pose R' := R^`(1); pose e := 'Mho^1(R') != 1.
-have nsR'R: R' <| R := der_normal 1 R; have [sR'R nR'R] := andP nsR'R.
-have [T EpT]: exists T, T \in 'E_p^1('Mho^e(R') :&: 'Z(R)).
- apply/p_rank_geP; rewrite -rank_pgroup; last first.
- by rewrite (pgroupS _ pR) //= setIC subIset ?center_sub.
- rewrite rank_gt0 (meet_center_nil (pgroup_nil pR)) ?gFnormal_trans //.
- by case ntR'1: e; rewrite //= Mho0 (sameP eqP derG1P).
-have [p_gt1 p_pr] := (ltnW (ltnW p_gt3), pnElem_prime EpT).
-have p_odd: odd p by case/even_prime: p_pr p_gt3 => ->.
-have{p_odd} oddR: odd #|R| := odd_pgroup_odd p_odd pR.
-have [sTR'eZ abelT oT] := pnElemPcard EpT; rewrite expn1 in oT.
-have{sTR'eZ abelT} [[sTR'e sTZ] [pT cTT eT]] := (subsetIP sTR'eZ, and3P abelT).
-have sTR': T \subset R' := subset_trans sTR'e (Mho_sub e _).
-have nsTR := sub_center_normal sTZ; have [sTR cRT] := subsetIP sTZ.
-have cTR: R \subset 'C(T) by rewrite centsC.
-have{n IHn leRn EpT} metaRb: metacyclic (R / T).
- have pRb: p.-group (R / T) := quotient_pgroup T pR.
- have dimRb: logn p #|'Ohm_1(R / T)| <= 2 by apply: quotient_p2_Ohm1.
- by rewrite IHn ?(leq_trans (ltn_quotient _ _)) ?(nt_pnElem EpT).
-have{metaRb} [Xb [cycXb nsXbR cycRs]] := metacyclicP metaRb.
-have{cycRs} [yb defRb]: exists yb, R / T = Xb <*> <[yb]>.
- have [ys defRs] := cyclicP cycRs; have [yb nXyb def_ys] := cosetP ys.
- exists yb; rewrite -quotientYK ?cycle_subG ?quotient_cycle // -def_ys -defRs.
- by rewrite quotientGK.
-have{sTZ} ntXb: Xb :!=: 1.
- apply: contraNneq not_cRR => Xb1.
- by rewrite (cyclic_factor_abelian sTZ) // defRb Xb1 joing1G cycle_cyclic.
-have [TX defTXb sTTX nsTXR] := inv_quotientN nsTR nsXbR.
-have{cycXb} [[sTXR nTXR] [xb defXb]] := (andP nsTXR, cyclicP cycXb).
-have [[x nTx def_xb] [y nTy def_yb]] := (cosetP xb, cosetP yb).
-have{defTXb} defTX: T <*> <[x]> = TX.
- rewrite -quotientYK ?cycle_subG ?quotient_cycle // -def_xb -defXb defTXb.
- by rewrite quotientGK // (normalS _ sTXR).
-have{yb defRb def_yb} defR: TX <*> <[y]> = R.
- rewrite -defTX -joingA -quotientYK ?join_subG ?quotientY ?cycle_subG ?nTx //.
- by rewrite !quotient_cycle // -def_xb -def_yb -defXb -defRb quotientGK.
-have sXYR: <[x]> <*> <[y]> \subset R by rewrite -defR -defTX -joingA joing_subr.
-have [Rx Ry]: x \in R /\ y \in R by rewrite -!cycle_subG; apply/joing_subP.
-have cTXY := subset_trans sXYR cTR; have [cTX cTY] := joing_subP cTXY.
-have [R'1_1 {e sTR'e} | ntR'1] := eqVneq 'Mho^1(R') 1; last first.
- have sR'TX: R' \subset TX.
- rewrite der1_min // -defR quotientYidl ?cycle_subG ?(subsetP nTXR) //.
- by rewrite quotient_abelian // cycle_abelian.
- have sTX : T \subset <[x]>.
- rewrite (subset_trans (subset_trans sTR'e (MhoS e sR'TX))) // /e ntR'1.
- have{defTX} defTX: T \* <[x]> = TX by rewrite cprodEY // centsC.
- rewrite -(Mho_cprod 1 defTX) ['Mho^1(_)](trivgP _) ?cprod1g ?Mho_sub //=.
- rewrite (MhoE 1 pT) gen_subG; apply/subsetP=> tp; case/imsetP=> t Tt ->{tp}.
- by rewrite inE (exponentP eT).
- apply/metacyclicP; exists TX; split=> //.
- by rewrite -defTX (joing_idPr sTX) cycle_cyclic.
- rewrite -defR quotientYidl ?cycle_subG ?(subsetP nTXR) //.
- by rewrite quotient_cyclic ?cycle_cyclic.
-have{R'1_1} eR': exponent R' %| p.
- have <-: 'Ohm_1(R') = R' by apply/eqP; rewrite trivg_Mho ?R'1_1.
- rewrite -sub_LdivT (OhmEabelian (pgroupS sR'R pR)) ?subsetIr //.
- by rewrite (abelianS (OhmS 1 sR'R)) // (p2group_abelian pR1).
-pose r := [~ x, y]; have Rr: r \in R by apply: groupR.
-have{defXb ntXb nsXbR} [i def_rb]: exists i, coset T r = (xb ^+ p) ^+ i.
- have p_xb: p.-elt xb by rewrite def_xb morph_p_elt ?(mem_p_elt pR).
- have pRbb: p.-group (R / T / 'Mho^1(Xb)) by rewrite !quotient_pgroup.
- have /andP[_ nXb1R]: 'Mho^1(Xb) <| R / T by apply: gFnormal_trans.
- apply/cycleP; rewrite -(Mho_p_cycle 1 p_xb) -defXb.
- apply: coset_idr; first by rewrite (subsetP nXb1R) ?mem_quotient.
- apply/eqP; rewrite !morphR ?(subsetP nXb1R) ?mem_quotient //=; apply/commgP.
- red; rewrite -(@centerC _ (R / T / _)) ?mem_quotient // -cycle_subG.
- rewrite -quotient_cycle ?(subsetP nXb1R) ?mem_quotient // -def_xb -defXb.
- suffices oXbb: #|Xb / 'Mho^1(Xb)| = p.
- apply: prime_meetG; first by rewrite oXbb.
- rewrite (meet_center_nil (pgroup_nil pRbb)) ?quotient_normal //.
- by rewrite -cardG_gt1 oXbb.
- rewrite -divg_normal ?Mho_normal //= defXb.
- rewrite -(mul_card_Ohm_Mho_abelian 1) ?cycle_abelian ?mulnK ?cardG_gt0 //.
- by rewrite (Ohm1_cyclic_pgroup_prime _ p_xb) ?cycle_cyclic //= -defXb.
-have{xb def_xb def_rb} [t Tt def_r]: exists2 t, t \in T & r = t * x ^+ (p * i).
- apply/rcosetP; rewrite -val_coset ?groupX ?morphX //= -def_xb.
- by rewrite expgM -def_rb val_coset ?groupR // rcoset_refl.
-have{eR' def_r cTT} defR': R' = <[r]>.
- have R'r : r \in R' by apply: mem_commg.
- have cxt: t \in 'C[x] by apply/cent1P; apply: (centsP cRT).
- have crx: x \in 'C[r] by rewrite cent1C def_r groupM ?groupX ?cent1id.
- have def_xy: x ^ y = t * x ^+ (p * i).+1.
- by rewrite conjg_mulR -/r def_r expgS !mulgA (cent1P cxt).
- have crR : R \subset 'C[r].
- rewrite -defR -defTX !join_subG sub_cent1 (subsetP cTR) //= !cycle_subG.
- rewrite crx cent1C (sameP cent1P commgP); apply/conjg_fixP.
- rewrite def_r conjMg conjXg conjgE (centsP cRT t) // mulKg conjg_mulR -/r.
- by rewrite (expgMn _ (cent1P crx)) (expgM r) (exponentP eR') ?expg1n ?mulg1.
- apply/eqP; rewrite eqEsubset cycle_subG R'r andbT.
- have nrR : R \subset 'N(<[r]>) by rewrite cents_norm ?cent_cycle.
- rewrite der1_min // -defR -defTX -joingA.
- rewrite norm_joinEr ?(subset_trans sXYR) ?normal_norm //.
- rewrite quotientMl ?(subset_trans sTR) // abelianM quotient_abelian //=.
- rewrite quotient_cents //= -der1_joing_cycles ?der_abelian //.
- by rewrite -sub_cent1 (subset_trans sXYR).
-have [S maxS sR'S] : {S | [max S | S \subset R & cyclic S] & R' \subset S}.
- by apply: maxgroup_exists; rewrite sR'R /= -/R' defR' cycle_cyclic.
-case/maxgroupP: maxS; case/andP=> sSR cycS maxS.
-have nsSR: S <| R := sub_der1_normal sR'S sSR; have [_ nSR] := andP nsSR.
-apply/existsP; exists S; rewrite cycS nsSR //=.
-suffices uniqRs1 Us: Us \in 'E_p^1(R / S) -> 'Ohm_1(R) / S = Us.
- have pRs: p.-group (R / S) := quotient_pgroup S pR.
- rewrite abelian_rank1_cyclic ?sub_der1_abelian ?(rank_pgroup pRs) // leqNgt.
- apply: contraFN (ltnn 1) => rRs; have [Us EpUs] := p_rank_geP (ltnW rRs).
- have [Vs EpVs] := p_rank_geP rRs; have [sVsR abelVs <-] := pnElemP EpVs.
- have [_ _ <-] := pnElemP EpUs; apply: lognSg; apply/subsetP=> vs Vvs.
- apply: wlog_neg => notUvs; rewrite -cycle_subG -(uniqRs1 _ EpUs).
- rewrite (uniqRs1 <[vs]>%G) ?p1ElemE // !inE cycle_subG (subsetP sVsR) //=.
- by rewrite -orderE (abelem_order_p abelVs Vvs (group1_contra notUvs)).
-case/pnElemPcard; rewrite expn1 => sUsR _ oUs.
-have [U defUs sSU sUR] := inv_quotientS nsSR sUsR.
-have [cycU | {maxS} ncycU] := boolP (cyclic U).
- by rewrite -[p]oUs defUs (maxS U) ?sUR // trivg_quotient cards1 in p_gt1.
-have EpU1: 'Ohm_1(U)%G \in 'E_p^2(U).
- have [u defS] := cyclicP cycS; rewrite defS cycle_subG in sSU.
- rewrite (Ohm1_extremal_odd (pgroupS sUR pR) (oddSg sUR oddR) _ sSU) //.
- by rewrite -defS -card_quotient -?defUs // (subset_trans sUR).
-have defU1: 'Ohm_1(U) = 'Ohm_1(R).
- apply/eqP; rewrite eqEcard OhmS // (card_pnElem EpU1).
- by rewrite (card_pgroup pR1) leq_exp2l.
-apply/eqP; rewrite eqEcard oUs defUs -{1}defU1 quotientS ?Ohm_sub //.
-rewrite dvdn_leq ?cardG_gt0 //; case/pgroup_pdiv: (quotient_pgroup S pR1) => //.
-rewrite -subG1 quotient_sub1 ?(gFsub_trans _ nSR) //.
-apply: contraL (cycS) => sR1S; rewrite abelian_rank1_cyclic ?cyclic_abelian //.
-rewrite -ltnNge (rank_pgroup (pgroupS sSR pR)); apply/p_rank_geP.
-by exists 'Ohm_1(U)%G; rewrite -(setIidPr sSU) pnElemI inE EpU1 inE /= defU1.
-Qed.
-
-(* This is B & G, Theorem 4.12 (also due to Huppert), for internal action. *)
-Theorem coprime_metacyclic_cent_sdprod gT p (R A : {group gT}) :
- p.-group R -> odd #|R| -> metacyclic R -> p^'.-group A -> A \subset 'N(R) ->
- let T := [~: R, A] in let C := 'C_R(A) in
- [/\ (*a*) abelian T,
- (*b*) T ><| C = R
- & (*c*) ~~ abelian R -> T != 1 ->
- [/\ C != 1, cyclic T, cyclic C & R^`(1) \subset T]].
-Proof.
-move=> pR oddR metaR p'A nRA T C.
-suffices{C T} cTT: abelian [~: R, A].
- have sTR: T \subset R by rewrite commg_subl.
- have nTR: R \subset 'N(T) by rewrite commg_norml.
- have coRA: coprime #|R| #|A| := pnat_coprime pR p'A.
- have solR: solvable R := pgroup_sol pR.
- have defR: T * C = R by rewrite coprime_cent_prod.
- have sCR: C \subset R := subsetIl _ _; have nTC := subset_trans sCR nTR.
- have tiTC: T :&: C = 1.
- have defTA: [~: T, A] = T by rewrite coprime_commGid.
- have coTA: coprime #|T| #|A| := coprimeSg sTR coRA.
- by rewrite setIA (setIidPl sTR) -defTA coprime_abel_cent_TI ?commg_normr.
- split=> // [|not_cRR ntT]; first by rewrite sdprodE.
- have ntC: C != 1 by apply: contraNneq not_cRR => C1; rewrite -defR C1 mulg1.
- suffices [cycT cycC]: cyclic T /\ cyclic C.
- split=> //; rewrite der1_min //= -/T -defR quotientMidl.
- by rewrite cyclic_abelian ?quotient_cyclic.
- have [pT pC]: p.-group T /\ p.-group C by rewrite !(pgroupS _ pR).
- apply/andP; rewrite (odd_pgroup_rank1_cyclic pC (oddSg sCR oddR)).
- rewrite abelian_rank1_cyclic // -rank_pgroup //.
- rewrite -(geq_leqif (leqif_add (leqif_geq _) (leqif_geq _))) ?rank_gt0 //.
- have le_rTC_dimTC1: 'r(T) + 'r(C) <= logn p #|'Ohm_1(T) * 'Ohm_1(C)|.
- rewrite (rank_pgroup pC) -p_rank_Ohm1 (rank_abelian_pgroup pT cTT).
- rewrite TI_cardMg; last by apply/trivgP; rewrite -tiTC setISS ?Ohm_sub.
- by rewrite lognM ?cardG_gt0 // leq_add2l p_rank_le_logn.
- apply: leq_trans le_rTC_dimTC1 _; rewrite add1n.
- have ncycR: ~~ cyclic R by apply: contra not_cRR; apply: cyclic_abelian.
- have: 'Ohm_1(R)%G \in 'E_p^2(R) by apply: Ohm1_metacyclic_p2Elem.
- have nT1C1: 'Ohm_1(C) \subset 'N('Ohm_1(T)).
- by rewrite gFsub_trans ?gFnorm_trans.
- by case/pnElemP=> _ _ <-; rewrite -norm_joinEr ?lognSg // join_subG !OhmS.
-without loss defR: R pR oddR metaR nRA / [~: R, A] = R.
- set T := [~: R, A] => IH; have sTR: T \subset R by rewrite commg_subl.
- have defTA: [~: T, A] = T.
- by rewrite coprime_commGid ?(pgroup_sol pR) ?(pnat_coprime pR).
- rewrite -defTA IH ?(pgroupS sTR) ?(oddSg sTR) ?(metacyclicS sTR) //.
- exact: commg_normr.
-rewrite defR; apply: wlog_neg => not_cRR.
-have ncycR: ~~ cyclic R := contra (@cyclic_abelian _ R) not_cRR.
-pose cycR_nA S := [&& cyclic S, S \subset R & A \subset 'N(S)].
-have [S maxS sR'S] : {S | [max S | cycR_nA S] & R^`(1) \subset S}.
- apply: maxgroup_exists; rewrite {}/cycR_nA der_sub /= gFnorm_trans // andbT.
- have [K [cycK nsKR cycKR]] := metacyclicP metaR.
- by rewrite (cyclicS _ cycK) // der1_min ?normal_norm // cyclic_abelian.
-have{maxS} [/and3P[cycS sSR nSA] maxS] := maxgroupP maxS.
-have ntS: S :!=: 1 by rewrite (subG1_contra sR'S) // (sameP eqP derG1P).
-have nSR: R \subset 'N(S) := sub_der1_norm sR'S sSR.
-have nsSR: S <| R by apply/andP.
-have sSZ: S \subset 'Z(R).
- have sR_NS': R \subset 'N(S)^`(1) by rewrite -{1}defR commgSS.
- rewrite subsetI sSR centsC (subset_trans sR_NS') // der1_min ?cent_norm //=.
- rewrite -ker_conj_aut (isog_abelian (first_isog _)).
- by rewrite (abelianS (Aut_conj_aut _ _)) ?Aut_cyclic_abelian.
-have cRbRb: abelian (R / S) by rewrite sub_der1_abelian.
-have pRb: p.-group (R / S) := quotient_pgroup S pR.
-pose R1 := 'Ohm_1(R); pose Rb1 := 'Ohm_1(R / S).
-have [Xb]: exists2 Xb, R1 / S \x gval Xb = Rb1 & A / S \subset 'N(Xb).
- have MaschkeRb1 := Maschke_abelem (Ohm1_abelem pRb cRbRb).
- pose normOhm1 := (morphim_Ohm, gFnorm_trans, quotient_norms S).
- by apply: MaschkeRb1; rewrite ?quotient_pgroup ?normOhm1.
-case/dprodP=> _ defRb1 _ tiR1bX nXbA.
-have sXbR: Xb \subset R / S.
- by apply: subset_trans (Ohm_sub 1 _); rewrite -defRb1 mulG_subr.
-have{sXbR} [X defXb sSX sXR] := inv_quotientS nsSR sXbR.
-have{nXbA nsSR} nXA: A \subset 'N(X).
- rewrite (subset_trans (mulG_subr S A)) // -quotientK //.
- by rewrite -(quotientGK (normalS sSX sXR nsSR)) -defXb morphpre_norms.
-have{tiR1bX} cycX: cyclic X.
- have sX1_XR1: 'Ohm_1(X) \subset X :&: R1 by rewrite subsetI Ohm_sub OhmS.
- have cyc_sR := odd_pgroup_rank1_cyclic (pgroupS _ pR) (oddSg _ oddR).
- have:= cycS; rewrite !{}cyc_sR //; apply: leq_trans.
- rewrite -p_rank_Ohm1 p_rankS // (subset_trans sX1_XR1) //.
- rewrite -quotient_sub1 ?subIset ?(subset_trans sXR) //.
- by rewrite quotientGI // setIC -defXb tiR1bX.
-rewrite (cyclic_factor_abelian sSZ) // abelian_rank1_cyclic //.
-rewrite (rank_abelian_pgroup pRb cRbRb) -defRb1 defXb.
-rewrite (maxS X) ?trivg_quotient ?mulg1 //; last exact/and3P.
-have EpR1: 'Ohm_1(R)%G \in 'E_p^2(R) by apply: Ohm1_metacyclic_p2Elem.
-have [sR1R _ dimR1] := pnElemP EpR1; have pR1 := pgroupS sR1R pR.
-rewrite -(card_isog (second_isog _)) ?(subset_trans sR1R) // -ltnS -dimR1.
-by rewrite (ltn_log_quotient pR1) ?subsetIr //= meet_Ohm1 // (setIidPl sSR).
-Qed.
-
-(* This covers B & G, Lemmas 4.13 and 4.14. *)
-Lemma pi_Aut_rank2_pgroup gT p q (R : {group gT}) :
- p.-group R -> odd #|R| -> 'r(R) <= 2 -> q \in \pi(Aut R) -> q != p ->
- [/\ q %| (p ^ 2).-1, q < p & q %| p.+1./2 \/ q %| p.-1./2].
-Proof.
-move=> pR oddR rR q_Ar p'q; rewrite /= in q_Ar.
-have [R1 | ntR] := eqsVneq R 1; first by rewrite R1 Aut1 cards1 in q_Ar.
-have{ntR} [p_pr p_dv_R _] := pgroup_pdiv pR ntR.
-have{oddR p_dv_R} [p_odd p_gt1] := (dvdn_odd p_dv_R oddR, prime_gt1 p_pr).
-have{q_Ar} [q_pr q_dv_Ar]: prime q /\ q %| #|Aut R|.
- by move: q_Ar; rewrite mem_primes; case/and3P.
-suffices q_dv_p2: q %| (p ^ 2).-1.
- have q_dv_p1: q %| p.+1./2 \/ q %| p.-1./2.
- apply/orP; have:= q_dv_p2; rewrite -subn1 (subn_sqr p 1).
- rewrite -[p]odd_double_half p_odd /= !doubleK addKn addn1 -doubleS -!mul2n.
- rewrite mulnC !Euclid_dvdM // dvdn_prime2 // -orbA; case: eqP => // -> _.
- by rewrite -Euclid_dvdM // /dvdn modn2 mulnC odd_mul andbN.
- have p_gt2: p > 2 by rewrite ltn_neqAle; case: eqP p_odd => // <-.
- have p1_ltp: p.+1./2 < p.
- by rewrite -divn2 ltn_divLR // muln2 -addnn -addn2 leq_add2l.
- split=> //; apply: leq_ltn_trans p1_ltp.
- move/orP: q_dv_p1; rewrite -(subnKC p_gt2) leqNgt.
- by apply: contraL => lt_p1q; rewrite negb_or !gtnNdvd // ltnW.
-wlog{q_dv_Ar} [a oa nRa]: gT R pR rR / {a | #[a] = q & a \in 'N(R) :\: 'C(R)}.
- have [a Ar_a oa] := Cauchy q_pr q_dv_Ar.
- rewrite -(injm_rank (injm_sdpair1 [Aut R])) // in rR.
- move=> IH; apply: IH rR _; rewrite ?morphim_pgroup ?morphim_odd //.
- exists (sdpair2 [Aut R] a); rewrite ?(order_injm (injm_sdpair2 _)) //.
- rewrite inE (subsetP (im_sdpair_norm _)) ?mem_morphim //= andbT.
- apply: contraL (prime_gt1 q_pr) => cRa; rewrite -oa order_gt1 negbK.
- apply/eqP; apply: (eq_Aut Ar_a (group1 _)) => x Rx.
- by rewrite perm1 [a x](@astab_act _ _ _ [Aut R] R) ?astabEsd ?mem_morphpre.
-move: {2}_.+1 (ltnSn #|R|) => n.
-elim: n => // n IHn in gT a R pR rR nRa oa *; rewrite ltnS => leRn.
-case recR: [exists (S : {group gT} | S \proper R), a \in 'N(S) :\: 'C(S)].
- have [S ltSR nSa] := exists_inP recR; rewrite properEcard in ltSR.
- have{ltSR} [sSR ltSR] := andP ltSR; have rS := leq_trans (rankS sSR) rR.
- by apply: IHn nSa oa _; rewrite ?(pgroupS sSR) ?(leq_trans ltSR).
-do [rewrite inE -!cycle_subG orderE; set A := <[a]>] in nRa oa.
-have{nRa oa} [[not_cRA nRA] oA] := (andP nRa, oa).
-have coRA : coprime #|R| #|A| by rewrite oA (pnat_coprime pR) ?pnatE.
-have{recR} IH: forall S, gval S \proper R -> A \subset 'N(S) -> A \subset 'C(S).
- move=> S ltSR; rewrite !cycle_subG => nSa; apply: contraFT recR => not_cSa.
- by apply/exists_inP; exists S; rewrite // inE not_cSa nSa.
-have defR1: 'Ohm_1(R) = R.
-apply: contraNeq not_cRA; rewrite eqEproper Ohm_sub negbK => ltR1R.
- rewrite (coprime_odd_faithful_Ohm1 pR) ?IH ?(odd_pgroup_odd p_odd) //.
- exact: gFnorm_trans.
-have defRA: [~: R, A] = R.
- apply: contraNeq not_cRA; rewrite eqEproper commg_subl nRA negbK => ltRAR.
- rewrite centsC; apply/setIidPl.
- rewrite -{2}(coprime_cent_prod nRA) ?(pgroup_sol pR) //.
- by rewrite mulSGid // subsetI commg_subl nRA centsC IH ?commg_normr.
-have [cRR | not_cRR] := boolP (abelian R).
- rewrite -subn1 (subn_sqr p 1) Euclid_dvdM //.
- have abelR: p.-abelem R by rewrite -defR1 Ohm1_abelem.
- have ntR: R :!=: 1 by apply: contraNneq not_cRA => ->; apply: cents1.
- pose rAR := reprGLm (abelem_repr abelR ntR nRA).
- have:= cardSg (subsetT (rAR @* A)); rewrite card_GL ?card_Fp //.
- rewrite card_injm ?ker_reprGLm ?rker_abelem ?prime_TIg ?oA // unlock.
- rewrite Gauss_dvdr; last by rewrite coprime_expr ?prime_coprime ?dvdn_prime2.
- move: rR; rewrite -ltnS -[_ < _](mem_iota 0) !inE eqn0Ngt rank_gt0 ntR.
- rewrite (dim_abelemE abelR ntR) (rank_abelem abelR).
- do [case/pred2P=> ->; rewrite /= muln1] => [-> // | ].
- by rewrite (subn_sqr p 1) mulnA !Euclid_dvdM ?orbb.
-have [[defPhi defR'] _]: special R /\ 'C_R(A) = 'Z(R).
- apply: (abelian_charsimple_special pR) => //.
- apply/bigcupsP=> S /andP[charS cSS].
- rewrite centsC IH ?(char_norm_trans charS) // properEneq char_sub // andbT.
- by apply: contraNneq not_cRR => <-.
-have ntZ: 'Z(R) != 1 by rewrite -defR' (sameP eqP derG1P).
-have ltRbR: #|R / 'Z(R)| < #|R| by rewrite ltn_quotient ?center_sub.
-have pRb: p.-group (R / 'Z(R)) by apply: quotient_pgroup.
-have nAZ: A \subset 'N('Z(R)) by apply: gFnorm_trans.
-have defAb: A / 'Z(R) = <[coset _ a]> by rewrite quotient_cycle -?cycle_subG.
-have oab: #[coset 'Z(R) a] = q.
- rewrite orderE -defAb -(card_isog (quotient_isog _ _)) //.
- by rewrite coprime_TIg ?(coprimeSg (center_sub R)).
-have rRb: 'r(R / 'Z(R)) <= 2.
- rewrite (rank_pgroup pRb) (leq_trans (p_rank_le_logn _ _)) // -ltnS.
- apply: leq_trans (rank2_exponent_p_p3group pR rR _).
- by rewrite -(ltn_exp2l _ _ p_gt1) -!card_pgroup.
- by rewrite -defR1 (exponent_Ohm1_class2 p_odd) // nil_class2 defR'.
-apply: IHn oab (leq_trans ltRbR leRn) => //.
-rewrite inE -!cycle_subG -defAb quotient_norms ?andbT //.
-apply: contra not_cRA => cRAb; rewrite (coprime_cent_Phi pR coRA) // defPhi.
-by rewrite commGC -quotient_cents2 ?gFnorm.
-Qed.
-
-(* B & G, Lemma 4.15 is covered by maximal/critical_extraspecial. *)
-
-(* This is B & G, Theorem 4.16 (due to Blackburn). *)
-Theorem rank2_coprime_comm_cprod gT p (R A : {group gT}) :
- p.-group R -> odd #|R| -> R :!=: 1 -> 'r(R) <= 2 ->
- [~: R, A] = R -> p^'.-group A -> odd #|A| ->
- [/\ p > 3
- & [\/ abelian R
- | exists2 S : {group gT},
- [/\ ~~ abelian S, logn p #|S| = 3 & exponent S %| p]
- & exists C : {group gT},
- [/\ S \* C = R, cyclic C & 'Ohm_1(C) = S^`(1)]]].
-Proof.
-move=> pR oddR ntR rR defRA p'A oddA.
-have [p_pr _ _] := pgroup_pdiv pR ntR; have p_gt1 := prime_gt1 p_pr.
-have nilR: nilpotent R := pgroup_nil pR.
-have nRA: A \subset 'N(R) by rewrite -commg_subl defRA.
-have p_gt3: p > 3; last split => //.
- have [Ab1 | [q q_pr q_dv_Ab]] := trivgVpdiv (A / 'C_A(R)).
- case/eqP: ntR; rewrite -defRA commGC; apply/commG1P.
- by rewrite -subsetIidl -quotient_sub1 ?Ab1 ?normsI ?norms_cent ?normG.
- have odd_q := dvdn_odd q_dv_Ab (quotient_odd _ oddA).
- have p'q := pgroupP (quotient_pgroup _ p'A) q q_pr q_dv_Ab.
- have q_gt1: q > 1 := prime_gt1 q_pr.
- have q_gt2: q > 2 by rewrite ltn_neqAle; case: eqP odd_q => // <-.
- apply: leq_ltn_trans q_gt2 _.
- rewrite /= -ker_conj_aut (card_isog (first_isog_loc _ _)) // in q_dv_Ab.
- have q_dv_A := dvdn_trans q_dv_Ab (cardSg (Aut_conj_aut _ _)).
- by case/(pi_Aut_rank2_pgroup pR): (pgroupP (pgroup_pi _) q q_pr q_dv_A).
-pose S := 'Ohm_1(R); pose S' := S^`(1); pose C := 'C_R(S).
-have pS: p.-group S := pgroupS (Ohm_sub 1 _) pR.
-have nsSR: S <| R := gFnormal _ R.
-have nsS'R: S' <| R := gFnormal_trans _ nsSR.
-have [sSR nSR] := andP nsSR; have [_ nS'R] := andP nsS'R.
-have [Sle2 | Sgt2] := leqP (logn p #|S|) 2.
- have metaR: metacyclic R := p2_Ohm1_metacyclic pR p_gt3 Sle2.
- have [cRR _ _] := coprime_metacyclic_cent_sdprod pR oddR metaR p'A nRA.
- by left; rewrite -defRA.
-have{p_gt3} eS: exponent S %| p by apply: exponent_Ohm1_rank2.
-have{rR} rS: 'r(S) <= 2 by rewrite rank_Ohm1.
-have{Sgt2} dimS: logn p #|S| = 3.
- by apply/eqP; rewrite eqn_leq rank2_exponent_p_p3group.
-have{rS} not_cSS: ~~ abelian S.
- by apply: contraL rS => cSS; rewrite -ltnNge -dimS -rank_abelem ?abelem_Ohm1.
-have esS: extraspecial S by apply: (p3group_extraspecial pS); rewrite ?dimS.
-have defS': S' = 'Z(S) by case: esS; case.
-have oS': #|S'| = p by rewrite defS' (card_center_extraspecial pS esS).
-have dimS': logn p #|S'| = 1%N by rewrite oS' (pfactorK 1).
-have nsCR: C <| R := normalGI nSR (cent_normal _); have [sCR nCR] := andP nsCR.
-have [pC oddC]: p.-group C * odd #|C| := (pgroupS sCR pR, oddSg sCR oddR).
-have defC1: 'Ohm_1(C) = S'.
- apply/eqP; rewrite eqEsubset defS' subsetI OhmS ?(OhmE 1 pC) //= -/C.
- by rewrite gen_subG setIAC subsetIr sub_gen ?setSI // subsetI sSR sub_LdivT.
-have{pC oddC} cycC: cyclic C.
- rewrite (odd_pgroup_rank1_cyclic pC) //.
- by rewrite -p_rank_Ohm1 defC1 -dimS' p_rank_le_logn.
-pose T := [~: S, R]; have nsTR: T <| R by rewrite /normal commg_normr comm_subG.
-have [sTR nTR] := andP nsTR; have pT: p.-group T := pgroupS sTR pR.
-have [sTS' | not_sTS' {esS}] := boolP (T \subset S').
- right; exists [group of S] => //; exists [group of C].
- by rewrite (critical_extraspecial pR sSR esS sTS').
-have ltTS: T \proper S by rewrite (nil_comm_properl nilR) ?Ohm1_eq1 ?subsetIidl.
-have sTS: T \subset S := proper_sub ltTS.
-have [sS'T ltS'T]: S' \subset T /\ S' \proper T by rewrite /proper commgS.
-have{ltS'T ltTS} dimT: logn p #|T| = 2.
- by apply/eqP; rewrite eqn_leq -ltnS -dimS -dimS' !properG_ltn_log.
-have{eS} eT: exponent T %| p := dvdn_trans (exponentS sTS) eS.
-have cTT: abelian T by rewrite (p2group_abelian pT) ?dimT.
-have abelT: p.-abelem T by apply/and3P.
-pose B := 'C_R(T); have sTB: T \subset B by rewrite subsetI sTR.
-have nsBR: B <| R := normalGI nTR (cent_normal _); have [sBR nBR] := andP nsBR.
-have not_sSB: ~~ (S \subset B).
- by rewrite defS' !subsetI sTS sSR centsC in not_sTS' *.
-have maxB: maximal B R.
- rewrite p_index_maximal // (_ : #|R : B| = p) //; apply/prime_nt_dvdP=> //.
- by apply: contra not_sSB; rewrite indexg_eq1; apply: subset_trans.
- rewrite -(part_pnat_id (pnat_dvd (dvdn_indexg _ _) pR)) p_part.
- by rewrite (@dvdn_exp2l _ _ 1) // logn_quotient_cent_abelem ?dimT //.
-have{maxB nsBR} defR: B * S = R := mulg_normal_maximal nsBR maxB sSR not_sSB.
-have cBbBb: abelian (B / C).
- rewrite sub_der1_abelian // subsetI comm_subG ?subsetIl //=; apply/commG1P.
- suff cB_SB: [~: S, B, B] = 1 by rewrite three_subgroup // [[~: _, S]]commGC.
- by apply/commG1P; rewrite centsC subIset // centS ?orbT // commgS.
-have{cBbBb} abelBb: p.-abelem (B / C).
- apply/abelemP=> //; split=> // Cg; case/morphimP=> x Nx Bx /= ->.
- have [Rx cTx] := setIP Bx; rewrite -morphX //= coset_id // inE groupX //=.
- apply/centP=> y Sy; symmetry; have Tyx : [~ y, x] \in T by apply: mem_commg.
- by apply/commgP; rewrite commgX ?(exponentP eT) //; apply: (centP cTx).
-have nsCB: C <| B by rewrite (normalS _ _ nsCR) ?setIS ?subsetIl // centS.
-have p'Ab: p^'.-group (A / C) by apply: quotient_pgroup.
-have sTbB: T / C \subset B / C by rewrite quotientS.
-have nSA: A \subset 'N(S) := gFnorm_trans _ nRA.
-have nTA: A \subset 'N(T) := normsR nSA nRA.
-have nTbA: A / C \subset 'N(T / C) := quotient_norms _ nTA.
-have nBbA: A / C \subset 'N(B / C).
- by rewrite quotient_norms ?normsI ?norms_cent.
-have{p'Ab sTbB nBbA abelBb nTbA}
- [Xb defBb nXbA] := Maschke_abelem abelBb p'Ab sTbB nBbA nTbA.
-have{defBb} [_] := dprodP defBb; rewrite /= -/T -/B => defBb _ tiTbX.
-have sXbB: Xb \subset B / C by rewrite -defBb mulG_subr.
-have{sXbB} [X] := inv_quotientS nsCB sXbB; rewrite /= -/C -/B => defXb sCX sXB.
-have sXR: X \subset R := subset_trans sXB sBR; have pX := pgroupS sXR pR.
-have nsCX: C <| X := normalS sCX sXR nsCR.
-have{tiTbX} ziTX: T :&: X \subset C.
- rewrite -quotient_sub1 ?subIset ?(subset_trans sTR) ?normal_norm //= -/C.
- by rewrite quotientIG -?defXb ?tiTbX.
-have{nXbA} nXA: A \subset 'N(X).
- have nCA: A \subset 'N(C) by rewrite normsI ?norms_cent.
- by rewrite -(quotientSGK nCA) ?normsG // quotient_normG -?defXb.
-have{abelT} defB1: 'Ohm_1(B) = T.
- apply/eqP; rewrite eq_sym eqEcard -{1}[T](Ohm1_id abelT) OhmS //.
- have pB1: p.-group 'Ohm_1(B) by apply: pgroupS pR; apply: gFsub_trans.
- rewrite (card_pgroup pT) (card_pgroup pB1) leq_exp2l //= -/T -/B.
- rewrite dimT -ltnS -dimS properG_ltn_log // properEneq OhmS ?subsetIl //= -/S.
- by case: eqP not_sSB => // <-; rewrite Ohm_sub.
-have{ziTX defB1} cycX: cyclic X; last have [x defX]:= cyclicP cycX.
- rewrite (odd_pgroup_rank1_cyclic pX (oddSg sXR oddR)) -p_rank_Ohm1.
- have:= cycC; rewrite abelian_rank1_cyclic ?cyclic_abelian //= -/C.
- apply: leq_trans (leq_trans (p_rank_le_rank p _) (rankS _)).
- by apply: subset_trans ziTX; rewrite subsetI Ohm_sub -defB1 OhmS.
-have{Xb defXb defBb nsCX} mulSX: S * X = R.
- have nCT: T \subset 'N(C) := subset_trans sTR nCR.
- rewrite -defR -(normC (subset_trans sSR nBR)) -[B](quotientGK nsCB) -defBb.
- rewrite cosetpreM quotientK // defXb quotientGK // -(normC nCT).
- by rewrite -mulgA (mulSGid sCX) mulgA (mulGSid sTS).
-have{mulSX} not_sXS_S': ~~ ([~: X, S] \subset S').
- apply: contra not_sTS' => sXS_S'; rewrite /T -mulSX.
- by rewrite commGC commMG ?(subset_trans sXR) // mul_subG.
-have [oSb oTb] : #|S / T| = p /\ #|T / S'| = p.
- rewrite (card_pgroup (quotient_pgroup _ pS)) -divg_normal ?(normalS _ sSR) //.
- rewrite (card_pgroup (quotient_pgroup _ pT)) -divg_normal ?(normalS _ sTR) //.
- by rewrite !logn_div ?cardSg // dimS dimT dimS'.
-have [Ty defSb]: exists Ty, S / T = <[Ty]>.
- by apply/cyclicP; rewrite prime_cyclic ?oSb.
-have SbTy: Ty \in S / T by rewrite defSb cycle_id.
-have{SbTy} [y nTy Sy defTy] := morphimP SbTy.
-have [S'z defTb]: exists S'z, T / S' = <[S'z]>.
- apply/cyclicP; rewrite prime_cyclic ?oTb //.
-have TbS'z: S'z \in T / S' by rewrite defTb cycle_id.
-have{TbS'z} [z nS'z Tz defS'z] := morphimP TbS'z.
-have [Ta AbTa not_cSbTa]: exists2 Ta, Ta \in A / T & Ta \notin 'C(S / T).
- apply: subsetPn; rewrite quotient_cents2 ?commg_norml //= -/T commGC.
- apply: contra not_sSB => sSA_T; rewrite (subset_trans sSR) // -defRA -defR.
- rewrite -(normC (subset_trans sSR nBR)) commMG /= -/S -/B; last first.
- by rewrite cents_norm ?subIset ?centS ?orbT.
- by rewrite mul_subG ?commg_subl ?normsI ?norms_cent // (subset_trans sSA_T).
-have [a nTa Aa defTa] := morphimP AbTa.
-have nS'a: a \in 'N(S') := subsetP (gFnorm_trans _ nSA) a Aa.
-have [i xa]: exists i, x ^ a = x ^+ i.
- by apply/cycleP; rewrite -cycle_subG cycleJ /= -defX (normsP nXA).
-have [j Tya]: exists j, Ty ^ Ta = Ty ^+ j.
- apply/cycleP; rewrite -cycle_subG cycleJ /= -defSb.
- by rewrite (normsP (quotient_norms _ nSA)).
-suffices {oSb oddA not_cSbTa} j2_1: j ^ 2 == 1 %[mod p].
- have Tya2: Ty ^ coset T (a ^+ 2) = Ty ^+ (j ^ 2).
- by rewrite morphX // conjgM -defTa Tya conjXg Tya expgM.
- have coA2: coprime #|A| 2 by rewrite coprime_sym prime_coprime // dvdn2 oddA.
- case/negP: not_cSbTa; rewrite defTa -(expgK coA2 Aa) morphX groupX //=.
- rewrite defSb cent_cycle inE conjg_set1 Tya2 sub1set inE.
- by rewrite (eq_expg_mod_order _ _ 1) orderE -defSb oSb.
-have {Tya Ta defTa AbTa} [u Tu yj]: exists2 u, u \in T & y ^+ j = u * y ^ a.
- apply: rcosetP; apply/rcoset_kercosetP; rewrite ?groupX ?groupJ //.
- by rewrite morphX ?morphJ -?defTy // -defTa.
-have{Ty defTy defSb} defS: T * <[y]> = S.
- rewrite -quotientK ?cycle_subG ?quotient_cycle // -defTy -defSb /= -/T.
- by rewrite quotientGK // /normal sTS /= commg_norml.
-have{nTA} [k S'zk]: exists k, S'z ^ coset S' a = S'z ^+ k.
- apply/cycleP; rewrite -cycle_subG cycleJ /= -defTb.
- by rewrite (normsP (quotient_norms _ nTA)) ?mem_quotient.
-have S'yz: [~ y, z] \in S' by rewrite mem_commg // (subsetP sTS).
-have [v Zv zk]: exists2 v, v \in 'Z(S) & z ^+ k = v * z ^ a.
- apply: rcosetP; rewrite -defS'.
- by apply/rcoset_kercosetP; rewrite ?groupX ?groupJ ?morphX ?morphJ -?defS'z.
-have defT: S' * <[z]> = T.
- rewrite -quotientK ?cycle_subG ?quotient_cycle // -defS'z -defTb /= -/S'.
- by rewrite quotientGK // (normalS _ sTR) // proper_sub.
-have nt_yz: [~ y, z] != 1.
- apply: contra not_cSS; rewrite (sameP commgP cent1P) => cyz.
- rewrite -defS abelianM cTT cycle_abelian /= -/T -defT centM /= -/S' defS'.
- by rewrite cent_cycle subsetI centsC subIset ?centS ?cycle_subG ?orbT.
-have sS'X1: S' \subset 'Ohm_1(X) by rewrite -defC1 OhmS.
-have i_neq0: i != 0 %[mod p].
- have: 'Ohm_1(X) != 1 by rewrite (subG1_contra sS'X1) //= -cardG_gt1 oS'.
- rewrite defX in pX *; rewrite (Ohm_p_cycle 1 pX) subn1 trivg_card1 -orderE.
- rewrite -(orderJ _ a) conjXg xa order_eq1 -expgM -order_dvdn mod0n.
- apply: contra; case/dvdnP=> m ->; rewrite -mulnA -expnS dvdn_mull //.
- by rewrite {1}[#[x]](card_pgroup pX) dvdn_exp2l ?leqSpred.
-have Txy: [~ x, y] \in T by rewrite [T]commGC mem_commg // -cycle_subG -defX.
-have [Rx Ry]: x \in R /\ y \in R by rewrite -cycle_subG -defX (subsetP sSR).
-have [nS'x nS'y] := (subsetP nS'R x Rx, subsetP nS'R y Ry).
-have{not_sXS_S'} not_S'xy: [~ x, y] \notin S'.
- apply: contra not_sXS_S' => S'xy.
- rewrite -quotient_cents2 ?(subset_trans _ nS'R) //= -/S'.
- rewrite -defS quotientMl ?(subset_trans _ nS'R) // centM /= -/S' -/T.
- rewrite subsetI quotient_cents; last by rewrite (subset_trans sXB) ?subsetIr.
- rewrite defX !quotient_cycle // cent_cycle cycle_subG /= -/S'.
- by rewrite (sameP cent1P commgP) -morphR /= ?coset_id.
-have jk_eq_i: j * k = i %[mod p].
- have Zyz: [~ y, z] \in 'Z(S) by rewrite -defS'.
- have Sz: z \in S := subsetP sTS z Tz.
- have yz_p: [~ y, z] ^+ p == 1 by rewrite -order_dvdn -oS' order_dvdG.
- have <-: #[[~ y, z]] = p by apply: nt_prime_order => //; apply: eqP.
- apply: eqP; rewrite -eq_expg_mod_order -commXXg; try exact: centerC Zyz.
- have cyv: [~ y ^+ j, v] = 1 by apply/eqP/commgP/(centerC (groupX j Sy) Zv).
- have cuz: [~ u, z ^ a] = 1.
- by apply/eqP/commgP/(centsP cTT); rewrite ?memJ_norm.
- rewrite zk commgMJ cyv yj commMgJ cuz !conj1g mulg1 mul1g -conjRg.
- suffices [m ->]: exists m, [~ y, z] = x ^+ m by rewrite conjXg xa expgAC.
- by apply/cycleP; rewrite -defX (subsetP (Ohm_sub 1 X)) ?(subsetP sS'X1).
-have ij_eq_k: i * j = k %[mod p].
- have <-: #[coset S' [~ x, y]] = p.
- apply: nt_prime_order => //.
- by apply: eqP; rewrite -order_dvdn -oTb order_dvdG 1?mem_quotient.
- by apply: contraNneq not_S'xy; apply: coset_idr; rewrite groupR.
- have sTbZ: T / S' \subset 'Z(R / S').
- rewrite prime_meetG ?oTb // (meet_center_nil (quotient_nil _ nilR)) //.
- by rewrite quotient_normal //; apply/andP.
- by rewrite -cardG_gt1 oTb.
- have ZRxyb: [~ coset S' x, coset S' y] \in 'Z(R / S').
- by rewrite -morphR // (subsetP sTbZ) ?mem_quotient.
- apply: eqP; rewrite -eq_expg_mod_order {1}morphR //.
- rewrite -commXXg; try by apply: centerC ZRxyb; apply: mem_quotient.
- have [Ru nRa] := (subsetP sTR u Tu, subsetP nRA a Aa).
- rewrite -2?morphX // yj morphM ?(subsetP nS'R) ?memJ_norm //.
- have cxu_b: [~ coset S' (x ^+ i), coset S' u] = 1.
- apply: eqP; apply/commgP.
- by apply: centerC (subsetP sTbZ _ _); rewrite mem_quotient ?groupX.
- rewrite commgMJ cxu_b conj1g mulg1 -xa !morphJ // -conjRg -morphR //=.
- have: coset S' [~ x, y] \in <[S'z]> by rewrite -defTb mem_quotient.
- by case/cycleP=> m ->; rewrite conjXg S'zk expgAC.
-have j2_gt0: j ^ 2 > 0.
- rewrite expn_gt0 orbF lt0n; apply: contraNneq i_neq0 => j0.
- by rewrite -jk_eq_i j0.
-have{i_neq0} co_p_i: coprime p i by rewrite mod0n prime_coprime in i_neq0 *.
-rewrite eqn_mod_dvd // -(Gauss_dvdr _ co_p_i) mulnBr -eqn_mod_dvd ?leq_mul //.
-by rewrite muln1 mulnCA -modnMmr ij_eq_k modnMmr jk_eq_i.
-Qed.
-
-(* This is B & G, Theorem 4.17. *)
-Theorem der1_Aut_rank2_pgroup gT p (R : {group gT}) (A : {group {perm gT}}) :
- p.-group R -> odd #|R| -> 'r(R) <= 2 ->
- A \subset Aut R -> solvable A -> odd #|A| ->
- p.-group A^`(1).
-Proof.
-move=> pR oddR rR AutA solA oddA.
-without loss ntR: / R :!=: 1.
- case: eqP AutA => [-> | ntR _ -> //]; rewrite Aut1.
- by move/trivgP=> ->; rewrite derg1 commG1 pgroup1.
-have [p_pr _ _] := pgroup_pdiv pR ntR; have p_gt1 := prime_gt1 p_pr.
-have{ntR oddR} [H [charH _] _ eH pCH] := critical_odd pR oddR ntR.
-have sHR := char_sub charH; have pH := pgroupS sHR pR.
-have{rR} rH: 'r(H) <= 2 := leq_trans (rankS (char_sub charH)) rR.
-have dimH: logn p #|H| <= 3 by rewrite rank2_exponent_p_p3group ?eH.
-have{eH} ntH: H :!=: 1 by rewrite trivg_exponent eH gtnNdvd.
-have charP := Phi_char H; have [sPH nPH] := andP (Phi_normal H : 'Phi(H) <| H).
-have nHA: {acts A, on group H | [Aut R]} := gacts_char _ AutA charH.
-pose B := 'C(H | <[nHA]>); pose V := H / 'Phi(H); pose C := 'C(V | <[nHA]> / _).
-have{pCH} pB: p.-group B.
- by rewrite (pgroupS _ pCH) //= astab_actby setIid subsetIr.
-have s_p'C_B X: gval X \subset C -> p^'.-group X -> X \subset B.
- move=> sXC p'X; have [sDX _] := subsetIP sXC; have [sXA _] := subsetIP sDX.
- rewrite -gacentC //; apply/setIidPl; rewrite -[H :&: _]genGid //.
- apply: Phi_nongen; apply/eqP; rewrite eqEsubset join_subG sPH subsetIl.
- rewrite -quotientYK 1?subIset ?nPH //= -sub_quotient_pre //= -/V gacentIim.
- have pP := pgroupS sPH pH; have coPX := pnat_coprime pP p'X.
- rewrite -(setIid X) -(gacent_ract _ sXA).
- rewrite ext_coprime_quotient_cent ?(pgroup_sol pP) ?acts_char //.
- have domXb: X \subset qact_dom (<[nHA]> \ sXA) 'Phi(H).
- by rewrite qact_domE ?acts_char.
- rewrite gacentE // subsetIidl -/V; apply/subsetP=> v Vv; apply/afixP=> a Xa.
- have [cVa dom_a] := (subsetP sXC a Xa, subsetP domXb a Xa).
- have [x Nx Hx def_v] := morphimP Vv; rewrite {1}def_v qactE //=.
- by rewrite -qactE ?(astab_dom cVa) ?(astab_act cVa) -?def_v.
-have{B pB s_p'C_B} pC : p.-group C.
- apply/pgroupP=> q q_pr /Cauchy[] // a Ca oa; apply: wlog_neg => p'q.
- apply: (pgroupP pB) => //; rewrite -oa cardSg // s_p'C_B ?cycle_subG //.
- by rewrite /pgroup -orderE oa pnatE.
-have nVA: A \subset qact_dom <[nHA]> 'Phi(H) by rewrite qact_domE // acts_char.
-have nCA: A \subset 'N(C).
- by rewrite (subset_trans _ (astab_norm _ _)) // astabs_range.
-suffices{pC nCA}: p.-group (A / C)^`(1).
- by rewrite -quotient_der ?pquotient_pgroup // gFsub_trans.
-pose toAV := ((<[nHA]> / 'Phi(H)) \ nVA)%gact.
-have defC: C = 'C(V | toAV).
- by symmetry; rewrite astab_ract; apply/setIidPr; rewrite subIset ?subsetIl.
-have abelV: p.-abelem V := Phi_quotient_abelem pH.
-have ntV: V != 1 by rewrite -subG1 quotient_sub1 // proper_subn ?Phi_proper.
-have: 'r(V) \in iota 1 2.
- rewrite mem_iota rank_gt0 ntV (rank_abelem abelV).
- have [abelH | not_abelH] := boolP (p.-abelem H).
- by rewrite ltnS (leq_trans _ rH) // (rank_abelem abelH) logn_quotient.
- by rewrite (leq_trans _ dimH) // ltn_log_quotient // (trivg_Phi pH).
-rewrite !inE; case/pred2P=> dimV.
- have isoAb: A / C \isog actperm toAV @* A.
- by rewrite defC astab_range -ker_actperm first_isog.
- rewrite (derG1P _) ?pgroup1 // (isog_abelian isoAb).
- apply: abelianS (im_actperm_Aut _) (Aut_cyclic_abelian _).
- by rewrite (abelem_cyclic abelV) -rank_abelem ?dimV.
-pose Vb := sdpair1 toAV @* V; pose Ab := sdpair2 toAV @* A.
-have [injV injA] := (injm_sdpair1 toAV, injm_sdpair2 toAV).
-have abelVb: p.-abelem Vb := morphim_abelem _ abelV.
-have ntVb: Vb != 1 by rewrite morphim_injm_eq1.
-have nVbA: Ab \subset 'N(Vb) := im_sdpair_norm toAV.
-pose rV := morphim_repr (abelem_repr abelVb ntVb nVbA) (subxx A).
-have{defC} <-: rker rV = C; last move: rV.
- rewrite rker_morphim rker_abelem morphpreI morphimK //=.
- by rewrite (trivgP injA) mul1g -astabEsd // defC astab_ract 2!setIA !setIid.
-have ->: 'dim Vb = 2 by rewrite (dim_abelemE abelVb) // card_injm -?rank_abelem.
-move=> rV; rewrite -(eq_pgroup _ (GRing.charf_eq (char_Fp p_pr))).
-by apply: der1_odd_GL2_charf (kquo_mx_faithful rV); rewrite !morphim_odd.
-Qed.
-
-(* This is B & G, Theorem 4.18(a). *)
-Theorem rank2_max_pdiv gT p q (G : {group gT}) :
- solvable G -> odd #|G| -> 'r_p(G) <= 2 -> q \in \pi(G / 'O_p^'(G)) -> q <= p.
-Proof.
-rewrite mem_primes => solG oddG rG /and3P[pr_q _ /= q_dv_G].
-without loss Gp'1: gT G solG oddG rG q_dv_G / 'O_p^'(G) = 1.
- move/(_ _ (G / 'O_p^'(G))%G); rewrite quotient_odd ?quotient_sol //.
- rewrite trivg_pcore_quotient -(card_isog (quotient1_isog _)).
- by rewrite p_rank_p'quotient ?pcore_pgroup ?gFnorm //; apply.
-set R := 'O_p(G); have pR: p.-group R := pcore_pgroup p G.
-have [sRG nRG] := andP (pcore_normal p G : R <| G).
-have oddR: odd #|R| := oddSg sRG oddG.
-have rR: 'r(R) <= 2 by rewrite (rank_pgroup pR) (leq_trans _ rG) ?p_rankS.
-rewrite leq_eqVlt -implyNb; apply/implyP=> p'q.
-have [|//] := pi_Aut_rank2_pgroup pR oddR rR _ p'q; rewrite eq_sym in p'q.
-apply: (piSg (Aut_conj_aut _ G)); apply: contraLR q_dv_G.
-rewrite -p'groupEpi -p'natE // Gp'1 -(card_isog (quotient1_isog _)) /pgroup.
-rewrite -(card_isog (first_isog_loc _ _)) // -!pgroupE ker_conj_aut /= -/R.
-set C := 'C_G(R); rewrite pquotient_pgroup ?normsI ?norms_cent ?normG //= -/C.
-suffices sCR: C \subset R by rewrite (pgroupS sCR (pi_pnat pR _)).
-by rewrite /C /R -(Fitting_eq_pcore _) ?cent_sub_Fitting.
-Qed.
-
-(* This is B & G, Theorem 4.18(c,e) *)
-Theorem rank2_der1_complement gT p (G : {group gT}) :
- solvable G -> odd #|G| -> 'r_p(G) <= 2 ->
- [/\ (*c*) p^'.-Hall(G^`(1)) 'O_p^'(G^`(1)),
- (*e1*) abelian (G / 'O_{p^',p}(G))
- & (*e2*) p^'.-group (G / 'O_{p^',p}(G))].
-Proof.
-move=> solG oddG rG; rewrite /pHall pcore_sub pcore_pgroup /= pnatNK.
-rewrite -(pcore_setI_normal _ (der_normal 1 G)) // setIC indexgI /=.
-without loss Gp'1: gT G solG oddG rG / 'O_p^'(G) = 1.
- have nsGp': 'O_p^'(G) <| G := pcore_normal p^' G; have [_ nGp'] := andP nsGp'.
- move/(_ _ (G / 'O_p^'(G))%G); rewrite quotient_sol // quotient_odd //=.
- have Gp'1 := trivg_pcore_quotient p^' G.
- rewrite p_rank_p'quotient ?pcore_pgroup // Gp'1 indexg1 => -[] //=.
- rewrite -quotient_der // card_quotient ?gFsub_trans // => ->.
- rewrite (pseries_pop2 _ Gp'1) /= -pseries1 -quotient_pseries /= /pgroup.
- pose isos := (isog_abelian (third_isog _ _ _), card_isog (third_isog _ _ _)).
- by rewrite !{}isos ?pseries_normal ?pseries_sub_catl.
-rewrite pseries_pop2 // Gp'1 indexg1 -pgroupE /=.
-set R := 'O_p(G); pose C := 'C_G(R).
-have /andP[sRG nRG]: R <| G by apply: gFnormal.
-have sCR: C \subset R by rewrite /C /R -(Fitting_eq_pcore _) ?cent_sub_Fitting.
-have pR: p.-group R := pcore_pgroup p G; have pC: p.-group C := pgroupS sCR pR.
-have nCG: G \subset 'N(C) by rewrite normsI ?normG ?norms_cent.
-have nsG'G: G^`(1) <| G := der_normal 1 G; have [sG'G nG'G] := andP nsG'G.
-suffices sG'R: G^`(1) \subset R.
- have cGbGb: abelian (G / R) := sub_der1_abelian sG'R.
- rewrite -{2}(nilpotent_pcoreC p (abelian_nil cGbGb)) trivg_pcore_quotient.
- by rewrite dprod1g pcore_pgroup (pgroupS sG'R pR).
-rewrite pcore_max // -(pquotient_pgroup pC (subset_trans sG'G nCG)) /= -/C.
-pose A := conj_aut 'O_p(G) @* G; have AutA: A \subset Aut R := Aut_conj_aut _ G.
-have isoGbA: G / C \isog A by rewrite /C -ker_conj_aut first_isog_loc.
-have{isoGbA} [f injf defA] := isogP isoGbA; rewrite /= -/A in defA.
-rewrite quotient_der // /pgroup -(card_injm injf) ?der_sub ?morphim_der //.
-have [? ?]: odd #|A| /\ solvable A by rewrite -defA !morphim_odd ?morphim_sol.
-have rR: 'r(R) <= 2 by rewrite (rank_pgroup pR) (leq_trans (p_rankS p sRG)).
-by rewrite defA -pgroupE (der1_Aut_rank2_pgroup pR) ?(oddSg sRG).
-Qed.
-
-(* This is B & G, Theorem 4.18(b) *)
-Theorem rank2_min_p_complement gT (G : {group gT}) (p := pdiv #|G|) :
- solvable G -> odd #|G| -> 'r_p(G) <= 2 -> p^'.-Hall(G) 'O_p^'(G).
-Proof.
-move=> solG oddG rG; rewrite /pHall pcore_pgroup pcore_sub pnatNK /=.
-rewrite -card_quotient ?gFnorm //; apply/pgroupP=> q q_pr q_dv_Gb.
-rewrite inE /= eqn_leq (rank2_max_pdiv _ _ rG) ?mem_primes ?q_pr ?cardG_gt0 //.
-by rewrite pdiv_min_dvd ?prime_gt1 ?(dvdn_trans q_dv_Gb) ?dvdn_quotient.
-Qed.
-
-(* This is B & G, Theorem 4.18(d) *)
-Theorem rank2_sub_p'core_der1 gT (G A : {group gT}) p :
- solvable G -> odd #|G| -> 'r_p(G) <= 2 -> p^'.-subgroup(G^`(1)) A ->
- A \subset 'O_p^'(G^`(1)).
-Proof.
-move=> solG oddG rG /andP[sAG' p'A]; rewrite sub_Hall_pcore //.
-by have [-> _ _] := rank2_der1_complement solG oddG rG.
-Qed.
-
-(* This is B & G, Corollary 4.19 *)
-Corollary rank2_der1_cent_chief gT p (G Gs U V : {group gT}) :
- odd #|G| -> solvable G -> Gs <| G -> 'r_p(Gs) <= 2 ->
- chief_factor G V U -> p.-group (U / V) -> U \subset Gs ->
- G^`(1) \subset 'C(U / V | 'Q).
-Proof.
-move=> oddG solG nsGsG rGs chiefUf pUf sUGs.
-wlog Gs_p'_1: gT G Gs U V oddG solG nsGsG rGs chiefUf pUf sUGs / 'O_p^'(Gs) = 1.
- pose K := 'O_p^'(Gs)%G; move/(_ _ (G / K) (Gs / K) (U / K) (V / K))%G.
- rewrite trivg_pcore_quotient quotient_odd ?quotient_sol ?quotientS //.
- have p'K: p^'.-group K := pcore_pgroup p^' Gs.
- have tiUfK := coprime_TIg (pnat_coprime pUf (quotient_pgroup V p'K)).
- have nsKG: K <| G by apply: gFnormal_trans.
- have [[sG'G sGsG] nKG] := (der_sub 1 G, normal_sub nsGsG, normal_norm nsKG).
- have{sGsG} [nKG' nKGs] := (subset_trans sG'G nKG, subset_trans sGsG nKG).
- case/andP: chiefUf; case/maxgroupP; case/andP=> ltVU nVG maxV nsUG.
- have [sUG nUG] := andP nsUG; have [sVU not_sUV] := andP ltVU.
- have [nUG' nVG'] := (subset_trans sG'G nUG, subset_trans sG'G nVG).
- have [sVG nVU] := (subset_trans sVU sUG, subset_trans sUG nVG).
- have [nKU nKV] := (subset_trans sUG nKG, subset_trans sVG nKG).
- have nsVU: V <| U by apply/andP.
- rewrite p_rank_p'quotient // /chief_factor -quotient_der ?quotient_normal //.
- rewrite andbT !sub_astabQR ?quotient_norms // -quotientR // => IH.
- rewrite -quotient_sub1 ?comm_subG // -tiUfK subsetI quotientS ?commg_subr //.
- rewrite quotientSK ?(comm_subG nVG') // (normC nKV) -quotientSK ?comm_subG //.
- apply: IH => //=; last first.
- rewrite -(setIid U) -(setIidPr sVU) -![_ / K](morphim_restrm nKU).
- by rewrite -(morphim_quotm _ nsVU) morphim_pgroup.
- apply/maxgroupP; rewrite /proper quotientS ?quotient_norms //= andbT.
- rewrite quotientSK // -(normC nKV) -quotientSK // -subsetIidl tiUfK.
- split=> [|Wb]; first by rewrite quotient_sub1.
- do 2![case/andP]=> sWbU not_sUWb nWbG sVWb; apply/eqP; rewrite eqEsubset sVWb.
- have nsWbG: Wb <| G / K by rewrite /normal (subset_trans sWbU) ?quotientS.
- have [W defWb sKW] := inv_quotientN nsKG nsWbG; case/andP=> sWG nWG.
- rewrite -(setIidPl sWbU) defWb -quotientGI // quotientS //.
- rewrite (maxV (W :&: U))%G ?normsI //; last first.
- by rewrite subsetI sVU andbT -(quotientSGK nKV sKW) -defWb.
- by rewrite andbT /proper subsetIr subsetIidr -(quotientSGK nKU sKW) -defWb.
-pose R := 'O_p(Gs); have pR: p.-group R := pcore_pgroup p Gs.
-have nsRG: R <| G by apply: gFnormal_trans.
-have [[sGsG nGsG] [sRG nRG]] := (andP nsGsG, andP nsRG).
-have nsRGs: R <| Gs := pcore_normal p Gs; have [sRGs nRGs] := andP nsRGs.
-have sylR: p.-Sylow(Gs) R.
- have [solGs oddGs] := (solvableS sGsG solG, oddSg sGsG oddG).
- have [_ _ p'Gsb] := rank2_der1_complement solGs oddGs rGs.
- by rewrite /pHall pcore_sub pR -card_quotient //= -(pseries_pop2 p Gs_p'_1).
-case/andP: (chiefUf); case/maxgroupP; case/andP=> ltVU nVG maxV nsUG.
-have [sUG nUG] := andP nsUG; have [sVU not_sUV] := andP ltVU.
-have [sVG nVU] := (subset_trans sVU sUG, subset_trans sUG nVG).
-have nsVU: V <| U by apply/andP.
-have nVGs := subset_trans sGsG nVG; have nVR := subset_trans sRGs nVGs.
-have{sylR} sUfR: U / V \subset R / V.
- have sylRb: p.-Sylow(Gs / V) (R / V) by rewrite quotient_pHall.
- by rewrite (sub_normal_Hall sylRb) ?quotientS ?quotient_normal.
-have pGb: p.-group((G / 'C_G(R))^`(1)).
- pose A := conj_aut 'O_p(Gs) @* G.
- have AA: A \subset Aut R := Aut_conj_aut _ G.
- have isoGbA: G / 'C_G(R) \isog A by rewrite -ker_conj_aut first_isog_loc.
- have{isoGbA} [f injf defA] := isogP isoGbA; rewrite /= -/A in defA.
- rewrite /pgroup -(card_injm injf) ?der_sub ?morphim_der //.
- have [? ?]: odd #|A| /\ solvable A by rewrite -defA !morphim_odd ?morphim_sol.
- have rR: 'r(R) <= 2 by rewrite (rank_pgroup pR) (leq_trans (p_rankS p sRGs)).
- by rewrite defA -pgroupE (der1_Aut_rank2_pgroup pR) ?(oddSg sRG).
-set C := 'C_G(U / V | 'Q).
-have nUfG: [acts G, on U / V | 'Q] by rewrite actsQ.
-have nCG: G \subset 'N(C) by rewrite -(setIidPl nUfG) normsGI ?astab_norm.
-have{pGb sUfR} pGa': p.-group (G / C)^`(1).
- have nCRG : G \subset 'N('C_G(R)) by rewrite normsI ?normG ?norms_cent.
- have sCR_C: 'C_G(R) \subset C.
- rewrite subsetI subsetIl sub_astabQ ?subIset ?nVG ?(centsS sUfR) //=.
- by rewrite quotient_cents ?subsetIr.
- have [f /= <-]:= homgP (homg_quotientS nCRG nCG sCR_C).
- by rewrite -morphim_der //= morphim_pgroup.
-have irrG: acts_irreducibly (G / C) (U / V) ('Q %% _).
- by rewrite acts_irr_mod_astab // acts_irrQ // chief_factor_minnormal.
-have Ga_p_1: 'O_p(G / C) = 1.
- rewrite (pcore_faithful_irr_act pUf _ irrG) ?modact_faithful //.
- by rewrite gacentC ?quotientS ?subsetT ?subsetIr //= setICA subsetIl.
-have sG'G := der_sub 1 G; have nCG' := subset_trans sG'G nCG.
-rewrite -subsetIidl -{2}(setIidPl sG'G) -setIA subsetIidl -/C.
-by rewrite -quotient_sub1 /= ?quotient_der //= -Ga_p_1 pcore_max ?der_normal.
-Qed.
-
-(* This is B & G, Theorem 4.20(a) *)
-Theorem rank2_der1_sub_Fitting gT (G : {group gT}) :
- odd #|G| -> solvable G -> 'r('F(G)) <= 2 -> G^`(1) \subset 'F(G).
-Proof.
-move=> oddG solG Fle2; have nsFG := Fitting_normal G.
-apply: subset_trans (chief_stab_sub_Fitting solG _) => //.
-rewrite subsetI der_sub; apply/bigcapsP=> [[U V] /= /andP[chiefUV sUF]].
-have [p p_pr /andP[pUV _]] := is_abelemP (sol_chief_abelem solG chiefUV).
-apply: rank2_der1_cent_chief nsFG _ _ pUV sUF => //.
-exact: leq_trans (p_rank_le_rank p _) Fle2.
-Qed.
-
-(* This is B & G, Theorem 4.20(b) *)
-Theorem rank2_char_Sylow_normal gT (G S T : {group gT}) :
- odd #|G| -> solvable G -> 'r('F(G)) <= 2 ->
- Sylow G S -> T \char S -> T \subset S^`(1) -> T <| G.
-Proof.
-set F := 'F(G) => oddG solG Fle2 /SylowP[p p_pr sylS] charT sTS'.
-have [sSG pS _] := and3P sylS.
-have nsFG: F <| G := Fitting_normal G; have [sFG nFG] := andP nsFG.
-have nFS := subset_trans sSG nFG; have nilF: nilpotent F := Fitting_nil _.
-have cGGq: abelian (G / F).
- by rewrite sub_der1_abelian ?rank2_der1_sub_Fitting.
-have nsFS_G: F <*> S <| G.
- rewrite -(quotientGK nsFG) norm_joinEr // -(quotientK nFS) cosetpre_normal.
- by rewrite -sub_abelian_normal ?quotientS.
-have sylSF: p.-Sylow(F <*> S) S.
- by rewrite (pHall_subl _ _ sylS) ?joing_subr // join_subG sFG.
-have defG: G :=: F * 'N_G(S).
- rewrite -{1}(Frattini_arg nsFS_G sylSF) /= norm_joinEr // -mulgA.
- by congr (_ * _); rewrite mulSGid // subsetI sSG normG.
-rewrite /normal (subset_trans (char_sub charT)) //= defG mulG_subG /= -/F.
-rewrite setIC andbC subIset /=; last by rewrite (char_norm_trans charT).
-case/dprodP: (nilpotent_pcoreC p nilF); rewrite /= -/F => _ defF cFpFp' _.
-have defFp: 'O_p(F) = F :&: S.
- rewrite -{2}defF -group_modl ?coprime_TIg ?mulg1 //.
- by rewrite coprime_sym (pnat_coprime pS (pcore_pgroup _ _)).
- by rewrite p_core_Fitting pcore_sub_Hall.
-rewrite -defF mulG_subG /= -/F defFp setIC subIset ?(char_norm charT) //=.
-rewrite cents_norm // (subset_trans cFpFp') // defFp centS // subsetI.
-rewrite (char_sub charT) (subset_trans (subset_trans sTS' (dergS 1 sSG))) //.
-exact: rank2_der1_sub_Fitting.
-Qed.
-
-(* This is B & G, Theorem 4.20(c), for the last factor of the series. *)
-Theorem rank2_min_p'core_Hall gT (G : {group gT}) (p := pdiv #|G|) :
- odd #|G| -> solvable G -> 'r('F(G)) <= 2 -> p^'.-Hall(G) 'O_p^'(G).
-Proof.
-set F := 'F(G) => oddG solG Fle2.
-have nsFG: F <| G := Fitting_normal G; have [sFG nFG] := andP nsFG.
-have [H] := inv_quotientN nsFG (pcore_normal p^' _).
-rewrite /= -/F => defH sFH nsHG; have [sHG nHG] := andP nsHG.
-have [P sylP] := Sylow_exists p H; have [sPH pP _] := and3P sylP.
-have sPF: P \subset F.
- rewrite -quotient_sub1 ?(subset_trans (subset_trans sPH sHG)) //.
- rewrite -(setIidPl (quotientS _ sPH)) -defH coprime_TIg //.
- by rewrite coprime_morphl // (pnat_coprime pP (pcore_pgroup _ _)).
-have nilGq: nilpotent (G / F).
- by rewrite abelian_nil ?sub_der1_abelian ?rank2_der1_sub_Fitting.
-have pGq: p.-group (G / H).
- rewrite /pgroup -(card_isog (third_isog sFH nsFG nsHG)) /= -/F -/(pgroup _ _).
- rewrite -(dprodW (nilpotent_pcoreC p nilGq)) defH quotientMidr.
- by rewrite quotient_pgroup ?pcore_pgroup.
-rewrite pHallE pcore_sub -(Lagrange sHG) partnM // -card_quotient //=.
-have hallHp': p^'.-Hall(H) 'O_p^'(H).
- case p'H: (p^'.-group H).
- by rewrite pHallE /= pcore_pgroup_id ?subxx //= part_pnat_id.
- have def_p: p = pdiv #|H|.
- have [p_pr pH]: prime p /\ p %| #|H|.
- apply/andP; apply: contraFT p'H => p'H; apply/pgroupP=> q q_pr qH.
- by apply: contraNneq p'H => <-; rewrite q_pr qH.
- apply/eqP; rewrite eqn_leq ?pdiv_min_dvd ?prime_gt1 //.
- rewrite pdiv_prime // cardG_gt1.
- by case: eqP p'H => // ->; rewrite pgroup1.
- exact: dvdn_trans (pdiv_dvd _) (cardSg (normal_sub nsHG)).
- rewrite def_p rank2_min_p_complement ?(oddSg sHG) ?(solvableS sHG) -?def_p //.
- rewrite -(p_rank_Sylow sylP) (leq_trans (p_rank_le_rank _ _)) //.
- exact: leq_trans (rankS sPF) Fle2.
-rewrite -(card_Hall hallHp') part_p'nat ?pnatNK ?muln1 // subset_leqif_card.
- by rewrite pcore_max ?pcore_pgroup ?gFnormal_trans.
-rewrite pcore_max ?pcore_pgroup // (normalS _ _ (pcore_normal _ _)) //.
-rewrite -quotient_sub1 ?gFsub_trans //.
-rewrite -(setIidPr (quotientS _ (pcore_sub _ _))) coprime_TIg //.
-by rewrite coprime_morphr // (pnat_coprime pGq (pcore_pgroup _ _)).
-Qed.
-
-(* This is B & G, Theorem 4.20(c), for intermediate factors. *)
-Theorem rank2_ge_pcore_Hall gT m (G : {group gT}) (pi := [pred p | p >= m]) :
- odd #|G| -> solvable G -> 'r('F(G)) <= 2 -> pi.-Hall(G) 'O_pi(G).
-Proof.
-elim: {G}_.+1 {-2}G (ltnSn #|G|) => // n IHn G.
-rewrite ltnS => leGn oddG solG Fle2; pose p := pdiv #|G|.
-have [defGpi | not_pi_G] := eqVneq 'O_pi(G) G.
- by rewrite /pHall pcore_sub pcore_pgroup defGpi indexgg.
-have pi'_p: (p \in pi^').
- apply: contra not_pi_G => pi_p; rewrite eqEsubset pcore_sub pcore_max //.
- apply/pgroupP=> q q_pr qG; apply: leq_trans pi_p _.
- by rewrite pdiv_min_dvd ?prime_gt1.
-pose Gp' := 'O_p^'(G); have sGp'G: Gp' \subset G := pcore_sub _ _.
-have hallGp'pi: pi.-Hall(Gp') 'O_pi(Gp').
- apply: IHn; rewrite ?(oddSg sGp'G) ?(solvableS sGp'G) //; last first.
- by apply: leq_trans (rankS _) Fle2; rewrite /= Fitting_pcore pcore_sub.
- apply: leq_trans (proper_card _) leGn.
- rewrite properEneq pcore_sub andbT; apply/eqP=> defG.
- suff: p \in p^' by case/eqnP.
- have p'G: p^'.-group G by rewrite -defG pcore_pgroup.
- rewrite (pgroupP p'G) ?pdiv_dvd ?pdiv_prime // cardG_gt1.
- by apply: contra not_pi_G; move/eqP->; rewrite (trivgP (pcore_sub _ _)).
-have defGp'pi: 'O_pi(Gp') = 'O_pi(G).
- rewrite -pcoreI; apply: eq_pcore => q; apply: andb_idr.
- by apply: contraL => /=; move/eqnP->.
-have hallGp': p^'.-Hall(G) Gp' by rewrite rank2_min_p'core_Hall.
-rewrite pHallE pcore_sub /= -defGp'pi (card_Hall hallGp'pi) (card_Hall hallGp').
-by rewrite partn_part // => q; apply: contraL => /=; move/eqnP->.
-Qed.
-
-(* This is B & G, Theorem 4.20(c), for the first factor of the series. *)
-Theorem rank2_max_pcore_Sylow gT (G : {group gT}) (p := max_pdiv #|G|) :
- odd #|G| -> solvable G -> 'r('F(G)) <= 2 -> p.-Sylow(G) 'O_p(G).
-Proof.
-move=> oddG solG Fle2; pose pi := [pred q | p <= q].
-rewrite pHallE pcore_sub eqn_leq -{1}(part_pnat_id (pcore_pgroup _ _)).
-rewrite dvdn_leq ?partn_dvd ?cardSg ?pcore_sub // /=.
-rewrite (@eq_in_partn _ pi) => [|q piGq]; last first.
- by rewrite !inE eqn_leq; apply: andb_idl => le_q_p; apply: max_pdiv_max.
-rewrite -(card_Hall (rank2_ge_pcore_Hall p oddG solG Fle2)) -/pi.
-rewrite subset_leq_card // pcore_max ?pcore_normal //.
-apply: sub_in_pnat (pcore_pgroup _ _) => q /(piSg (pcore_sub _ _))-piGq.
-by rewrite !inE eqn_leq max_pdiv_max.
-Qed.
-
-End Section4.
diff --git a/mathcomp/odd_order/BGsection5.v b/mathcomp/odd_order/BGsection5.v
deleted file mode 100644
index 9769c86..0000000
--- a/mathcomp/odd_order/BGsection5.v
+++ /dev/null
@@ -1,534 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq div.
-From mathcomp
-Require Import fintype finset prime fingroup morphism perm automorphism action.
-From mathcomp
-Require Import quotient cyclic gfunctor pgroup gproduct center commutator.
-From mathcomp
-Require Import gseries nilpotent sylow abelian maximal hall.
-From mathcomp
-Require Import BGsection1 BGsection4.
-
-(******************************************************************************)
-(* This file covers Section 5 of B & G, except for some technical results *)
-(* that are not actually used in the proof of the Odd Order Theorem, namely *)
-(* part (c) of Theorem 5.5, parts (b), (d) and (e) of Theorem 5.5, and all of *)
-(* Theorem 5.7. We also make the following change: in B & G, narrow p-groups *)
-(* of rank at least 3 are defined by the structure of the centralisers of *)
-(* their prime subgroups, then characterized by their rank 2 elementary *)
-(* abelian subgroups in Theorem 5.3. We exchange the two, because the latter *)
-(* condition is easier to check, and is the only one used later in the proof. *)
-(* *)
-(* p.-narrow G == G has a maximal elementary abelian p-subgroup of *)
-(* p-rank at most 2. *)
-(* := ('r_p(G) > 2) ==> ('E_p^2(G) :&: 'E*_p(G) != set0) *)
-(* *)
-(* narrow_structure p G <-> G has a subgroup S of order p whose centraliser *)
-(* is the direct product of S and a cyclic group C, *)
-(* i.e., S \x C = 'C_G(S). This is the condition used *)
-(* in the definition of "narrow" in B & G, p. 2. *)
-(* Theorem 5.3 states that for odd p this definition *)
-(* is equivalent to ours, and this property is not *)
-(* used outside of Section 5. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope.
-
-Reserved Notation "p .-narrow" (at level 2, format "p .-narrow").
-
-Section Definitions.
-
-Variables (gT : finGroupType) (p : nat) (A : {set gT}).
-
-Definition narrow := ('r_p(A) > 2) ==> ('E_p^2(A) :&: 'E*_p(A) != set0).
-
-Inductive narrow_structure : Prop :=
- NarrowStructure (S C : {group gT}) of
- S \subset A & C \subset A & #|S| = p & cyclic C & S \x C = 'C_A(S).
-
-End Definitions.
-
-Notation "p .-narrow" := (narrow p) : group_scope.
-
-Section IsoDef.
-
-Variables (gT rT : finGroupType) (p : nat).
-Implicit Types G H : {group gT}.
-Implicit Type R : {group rT}.
-
-Lemma injm_narrow G H (f : {morphism G >-> rT}) :
- 'injm f -> H \subset G -> p.-narrow (f @* H) = p.-narrow H.
-Proof.
-move=> injf sHG; rewrite /narrow injm_p_rank //; congr (_ ==> _).
-apply/set0Pn/set0Pn=> [] [E /setIP[Ep2E maxE]].
- exists (invm injf @* E)%G; rewrite -[H](group_inj (morphim_invm injf _)) //.
- have sEfG: E \subset f @* G.
- by rewrite (subset_trans _ (morphimS _ sHG)) //; case/pnElemP: Ep2E.
- by rewrite inE injm_pnElem ?injm_pmaxElem ?injm_invm ?morphimS // Ep2E.
-have sEG: E \subset G by rewrite (subset_trans _ sHG) //; case/pnElemP: Ep2E.
-by exists (f @* E)%G; rewrite inE injm_pnElem ?injm_pmaxElem // Ep2E.
-Qed.
-
-Lemma isog_narrow G R : G \isog R -> p.-narrow G = p.-narrow R.
-Proof. by case/isogP=> f injf <-; rewrite injm_narrow. Qed.
-
-(* No isomorphism theorems for narrow_structure, which is not used outside of *)
-(* this file. *)
-
-End IsoDef.
-
-Section Five.
-
-Implicit Type gT : finGroupType.
-Implicit Type p : nat.
-
-Section OneGroup.
-
-Variables (gT : finGroupType) (p : nat) (R : {group gT}).
-Implicit Types B E S : {group gT}.
-
-Lemma narrowJ x : p.-narrow (R :^ x) = p.-narrow R.
-Proof. by apply: isog_narrow (isog_symr (conj_isog R x)). Qed.
-
-Hypotheses (pR : p.-group R) (oddR : odd #|R|).
-
-Section Rank3.
-
-Hypothesis rR : 2 < 'r_p(R).
-
-(* This lemma uses only the rR hypothesis. *)
-Lemma narrow_pmaxElem : p.-narrow R -> exists E, E \in 'E_p^2(R) :&: 'E*_p(R).
-Proof. by move=> nnP; apply: set0Pn; apply: implyP rR. Qed.
-
-Let ntR : R :!=: 1. Proof. by case: eqP rR => // ->; rewrite p_rank1. Qed.
-Let p_pr : prime p. Proof. by case: (pgroup_pdiv pR ntR). Qed.
-Let p_gt1 : p > 1. Proof. exact: prime_gt1. Qed.
-
-(* This is B & G, Lemma 5.1(a). *)
-Lemma rank3_SCN3 : exists B, B \in 'SCN_3(R).
-Proof.
-by apply/set0Pn; rewrite -(rank2_SCN3_empty pR oddR) leqNgt (rank_pgroup pR) rR.
-Qed.
-
-(* This is B & G, Lemma 5.1(b). *)
-Lemma normal_p2Elem_SCN3 E :
- E \in 'E_p^2(R) -> E <| R -> exists2 B, B \in 'SCN_3(R) & E \subset B.
-Proof.
-move=> Ep2E /andP[sER nER]; have [_ abelE dimE] := pnElemP Ep2E.
-have [B Ep3B nBR]: exists2 B, B \in 'E_p^3(R) & R \subset 'N(B).
- have [C] := rank3_SCN3; case/setIdP=> SCN_C rC.
- have [nsCR cCC] := andP (maxgroupp (SCN_max SCN_C)).
- have [sCR _] := andP nsCR; have pC: p.-group C := pgroupS sCR pR.
- have{pC cCC} abelC1: p.-abelem 'Ohm_1(C) := Ohm1_abelem pC cCC.
- have dimC1: 3 <= logn p #|'Ohm_1(C)| by rewrite -rank_abelem // rank_Ohm1.
- have nsC1R: 'Ohm_1(C) <| R := gFnormal_trans _ nsCR.
- have [B [sBC1 nsBR oB]] := normal_pgroup pR nsC1R dimC1.
- have [sBR nBR] := andP nsBR; exists B => //; apply/pnElemP.
- by rewrite oB pfactorK // (abelemS sBC1).
-have [sBR abelB dimB] := pnElemP Ep3B; have [pB cBB _] := and3P abelB.
-have [oB oE] := (card_pnElem Ep3B, card_pnElem Ep2E).
-pose Bs := (E <*> 'C_B(E))%G; have sCB: 'C_B(E) \subset B := subsetIl B _.
-have sBsR: Bs \subset R by rewrite join_subG sER subIset ?sBR.
-suffices Bs_gt2: 2 < logn p #|Bs|.
- have nBsR: Bs <| R by rewrite /normal sBsR // normsY ?normsI ?norms_cent.
- have abelBs: p.-abelem Bs.
- by rewrite (cprod_abelem p (cprodEY _)) ?subsetIr // abelE (abelemS sCB).
- have [C maxC sBsC] : {H | [max H | H <| R & abelian H ] & Bs \subset H}.
- by apply: maxgroup_exists; rewrite nBsR (abelem_abelian abelBs).
- exists C; last by rewrite (subset_trans _ sBsC) ?joing_subl.
- by rewrite inE (max_SCN pR) ?(leq_trans Bs_gt2) // -rank_abelem ?rankS.
-apply: contraFT (ltnn 2); rewrite -leqNgt => Bs_le2.
-have{Bs_le2} sCE: 'C_B(E) \subset E.
- rewrite (sameP joing_idPl eqP) eq_sym eqEcard joing_subl /=.
- by rewrite (card_pgroup (pgroupS sBsR pR)) oE leq_exp2l.
-have dimCBE: 2 <= logn p #|'C_B(E)|.
- rewrite -ltnS -dimB -addn1 -leq_subLR -logn_div ?divgS ?cardSg //.
- by rewrite logn_quotient_cent_abelem ?dimE ?(subset_trans sBR nER).
-have defE: 'C_B(E) = E.
- apply/eqP; rewrite eqEcard sCE oE /=.
- by rewrite (card_pgroup (pgroupS sCB pB)) leq_exp2l.
-by rewrite -dimB -dimE -defE lognSg // subsetIidl sub_abelian_cent // -defE.
-Qed.
-
-Let Z := 'Ohm_1('Z(R)).
-Let W := 'Ohm_1('Z_2(R)).
-Let T := 'C_R(W).
-
-Let ntZ : Z != 1.
-Proof. by rewrite Ohm1_eq1 (center_nil_eq1 (pgroup_nil pR)). Qed.
-
-Let sZR : Z \subset R. Proof. by rewrite !gFsub_trans. Qed.
-
-Let abelZ : p.-abelem (Z).
-Proof. by rewrite (Ohm1_abelem (pgroupS _ pR)) ?center_sub ?center_abelian. Qed.
-
-Let pZ : p.-group Z. Proof. exact: abelem_pgroup abelZ. Qed.
-
-Let defCRZ : 'C_R(Z) = R.
-Proof. by apply/setIidPl; rewrite centsC gFsub_trans ?subsetIr. Qed.
-
-Let sWR : W \subset R. Proof. exact/gFsub_trans/gFsub. Qed.
-Let nWR : R \subset 'N(W). Proof. exact/gFnorm_trans/gFnorm. Qed.
-
-(* This is B & G, Lemma 5.2. *)
-Lemma Ohm1_ucn_p2maxElem E :
- E \in 'E_p^2(R) :&: 'E*_p(R) ->
- [/\ (*a*) ~~ (E \subset T),
- (*b*) #|Z| = p /\ [group of W] \in 'E_p^2(R)
- & (*c*) T \char R /\ #|R : T| = p ].
-Proof.
-case/setIP=> Ep2E maxE; have defCRE1 := Ohm1_cent_max maxE pR.
-have [[sER abelE dimE] oE] := (pnElemP Ep2E, card_pnElem Ep2E).
-have [[sZR_R nZR_R] [pE _ eE]] := (andP (center_normal R), and3P abelE).
-have{nZR_R} nZR: R \subset 'N(Z) := gFnorm_trans _ nZR_R.
-have{sZR_R} [pZR pW] := (pgroupS sZR_R pR, pgroupS sWR pR).
-have sZE: Z \subset E by rewrite -defCRE1 OhmS ?setIS // centS.
-have rCRE : 'r_p('C_R(E)) = 2 by rewrite -p_rank_Ohm1 defCRE1 p_rank_abelem.
-have oZ: #|Z| = p.
- apply/prime_nt_dvdP; rewrite -?trivg_card1 // (card_pgroup pZ) /= -/Z.
- rewrite (@dvdn_exp2l _ _ 1) // -ltnS -dimE properG_ltn_log //= -/Z.
- by case/eqVproper: sZE rR => // defZ; rewrite -defCRZ defZ rCRE ltnn.
-have ncycR: ~~ cyclic R by rewrite (odd_pgroup_rank1_cyclic pR) // -(subnKC rR).
-have [ncycW eW] := Ohm1_odd_ucn2 pR oddR ncycR; rewrite -/W in ncycW eW.
-have sWRZ: [~: W, R] \subset Z.
- rewrite [Z](OhmE 1 pZR) sub_gen //= -ucn1 subsetI.
- rewrite (subset_trans _ (ucn_comm 1 _)) ?commSg ?Ohm_sub //.
- by move: nWR eW; rewrite -commg_subl -sub_LdivT; apply: subset_trans.
-have sZW: Z \subset W by rewrite OhmS /= -?ucn1 ?ucn_subS //.
-have ltZW: Z \proper W.
- by rewrite properEneq; case: eqP ncycW => // <-; rewrite prime_cyclic ?oZ.
-have sWRE := subset_trans sWRZ sZE.
-have nEW: W \subset 'N(E) by rewrite -commg_subr (subset_trans _ sWRE) ?commgSS.
-have defZ: 'C_W(E) = Z.
- have sCE: 'C_W(E) \subset E.
- rewrite -{2}defCRE1 (OhmE 1 (pgroupS (subsetIl R _) pR)) sub_gen //.
- by rewrite subsetI setSI // subIset // sub_LdivT eW.
- have [defC | ltCE] := eqVproper sCE.
- have sEW: E \subset W by rewrite -defC subsetIl.
- have nsER: E <| R.
- by rewrite /normal sER -commg_subl (subset_trans (commSg R sEW)).
- have [B scn3B sEB] := normal_p2Elem_SCN3 Ep2E nsER.
- have [scnB dimB] := setIdP scn3B; have [_ scBR] := SCN_P scnB.
- rewrite ltnNge -rank_Ohm1 -dimE -rank_abelem ?rankS // in dimB.
- by rewrite -scBR -defCRE1 OhmS // setIS ?centS.
- apply/eqP; rewrite eq_sym eqEcard oZ (card_pgroup (pgroupS sCE pE)) /= -/W.
- rewrite subsetI sZW (centsS sER); last by rewrite centsC -subsetIidl defCRZ.
- by rewrite (leq_exp2l _ 1) // -ltnS -dimE properG_ltn_log.
-have dimW: logn p #|W| = 2.
- apply/eqP; rewrite -(Lagrange sZW) lognM ?cardG_gt0 // oZ (pfactorK 1) //=.
- rewrite -/Z eqSS eqn_leq -{1}defZ logn_quotient_cent_abelem ?dimE // -/W.
- by rewrite -divgS // logn_div ?cardSg // subn_gt0 properG_ltn_log.
-have abelW: p.-abelem W.
- by rewrite (abelem_Ohm1 (pgroupS _ pR)) ?(p2group_abelian pW) ?dimW ?ucn_sub.
-have charT: T \char R by rewrite subcent_char ?char_refl ?gFchar_trans.
-rewrite 2!inE sWR abelW dimW; do 2?split => //.
- by apply: contra (proper_subn ltZW); rewrite -defZ !subsetI subxx sER centsC.
-apply/prime_nt_dvdP=> //.
- rewrite indexg_eq1 subsetIidl centsC; apply: contraFN (ltnn 1) => cRW.
- by rewrite -dimW -(setIidPl (centsS sER cRW)) defZ oZ (pfactorK 1).
-rewrite -(part_pnat_id (pnat_dvd (dvdn_indexg _ _) pR)) p_part.
-by rewrite (@dvdn_exp2l p _ 1) ?logn_quotient_cent_abelem ?dimW.
-Qed.
-
-(* This is B & G, Theorem 5.3(d); we omit parts (a)-(c) as they are mostly *)
-(* redundant with Lemma 5.2, given our definition of "narrow". *)
-Theorem narrow_cent_dprod S :
- p.-narrow R -> #|S| = p -> S \subset R -> 'r_p('C_R(S)) <= 2 ->
- [/\ cyclic 'C_T(S), S :&: R^`(1) = 1, S :&: T = 1 & S \x 'C_T(S) = 'C_R(S)].
-Proof.
-move=> nnR oS sSR rS; have pS : p.-group S := pgroupS sSR pR.
-have [E maxEp2E] := narrow_pmaxElem nnR; have [Ep2E maxE] := setIP maxEp2E.
-have [not_sET [oZ Ep2W] [charT maxT]] := Ohm1_ucn_p2maxElem maxEp2E.
-have cZS : S \subset 'C(Z) by rewrite (subset_trans sSR) // -defCRZ subsetIr.
-have nZS : S \subset 'N(Z) by rewrite cents_norm.
-have cSS : abelian S by rewrite cyclic_abelian ?prime_cyclic // oS.
-pose SZ := (S <*> [group of Z])%G; have sSSZ: S \subset SZ := joing_subl _ _.
-have sSZ_R: SZ \subset R by rewrite join_subG sSR sZR.
-have abelSZ : p.-abelem SZ.
- by rewrite /= joingC (cprod_abelem p (cprodEY cZS)) abelZ prime_abelem.
-have tiSZ: S :&: Z = 1.
- rewrite prime_TIg ?oS //= -/Z; apply: contraL rR => sZS.
- by rewrite -leqNgt (leq_trans _ rS) ?p_rankS // -{1}defCRZ setIS ?centS.
-have{tiSZ} oSZ: #|SZ| = (p ^ 2)%N by rewrite /= norm_joinEl ?TI_cardMg ?oS ?oZ.
-have Ep2SZ: SZ \in 'E_p^2(R) by rewrite pnElemE // !inE sSZ_R abelSZ oSZ eqxx.
-have{oSZ Ep2SZ abelSZ sSZ_R} maxSZ: SZ \in 'E_p^2(R) :&: 'E*_p(R).
- rewrite inE Ep2SZ; apply/pmaxElemP; rewrite inE sSZ_R abelSZ.
- split=> // H /setIdP[sHR abelH] sSZH.
- have [[_ _ dimSZ] [cHH pH _]] := (pnElemP Ep2SZ, and3P abelH).
- have sSH: S \subset H := subset_trans sSSZ sSZH.
- have{sSH} sH_CRS: H \subset 'C_R(S) by rewrite subsetI sHR (centsS sSH).
- have{sH_CRS}: 'r_p(H) <= 2 by rewrite (leq_trans _ rS) ?p_rankS.
- apply: contraTeq; rewrite eq_sym eqEproper sSZH negbK => lSZH.
- by rewrite -ltnNge p_rank_abelem // -dimSZ properG_ltn_log.
-have sZT: Z \subset T.
- by rewrite subsetI sZR (centsS sWR) // centsC -defCRZ subsetIr.
-have{SZ sSSZ maxSZ} not_sST: ~~ (S \subset T).
- have: ~~ (SZ \subset T) by case/Ohm1_ucn_p2maxElem: maxSZ.
- by rewrite join_subG sZT andbT.
-have tiST: S :&: T :=: 1 by rewrite prime_TIg ?oS.
-have defST: S * T = R.
- apply/eqP; rewrite eqEcard TI_cardMg ?mul_subG ?subsetIl //=.
- by rewrite mulnC oS -maxT Lagrange ?subsetIl.
-have cRRb: abelian (R / T) by rewrite -defST quotientMidr quotient_abelian.
-have sR'T: R^`(1) \subset T by rewrite der1_min ?char_norm.
-have TI_SR': S :&: R^`(1) :=: 1.
- by rewrite prime_TIg ?oS // (contra _ not_sST) // => /subset_trans->.
-have defCRS : S \x 'C_T(S) = 'C_R(S).
- rewrite (dprodE _ _) ?subsetIr //= -/T; last by rewrite setIA tiST setI1g.
- rewrite -{1}(center_idP cSS) subcent_TImulg ?defST //.
- by rewrite subsetI normG (subset_trans sSR) ?char_norm.
-have sCTSR: 'C_T(S) \subset R by rewrite subIset ?subsetIl.
-split; rewrite ?(odd_pgroup_rank1_cyclic (pgroupS _ pR) (oddSg _ oddR)) //= -/T.
-rewrite -ltnS (leq_trans _ rS) //= -(p_rank_dprod p defCRS) -add1n leq_add2r.
-by rewrite -rank_pgroup // rank_gt0 -cardG_gt1 oS.
-Qed.
-
-(* This is B & G, Corollary 5.4. Given our definition of narrow, this is used *)
-(* directly in the proof of the main part of Theorem 5.3. *)
-Corollary narrow_centP :
- reflect (exists S, [/\ gval S \subset R, #|S| = p & 'r_p('C_R(S)) <= 2])
- (p.-narrow R).
-Proof.
-rewrite /narrow rR; apply: (iffP (set0Pn _)) => [[E maxEp2E]|[S [sSR oS rCRS]]].
- have [Ep2E maxE] := setIP maxEp2E.
- have{maxEp2E} [_ [oZ _] _] := Ohm1_ucn_p2maxElem maxEp2E.
- have [sER abelE dimE] := pnElemP Ep2E; have oE := card_pnElem Ep2E.
- have sZE: Z \subset E by rewrite -(Ohm1_cent_max maxE pR) OhmS ?setIS ?centS.
- have [S defE] := abelem_split_dprod abelE sZE; exists S.
- have{defE} [[_ defZS _ _] oZS] := (dprodP defE, dprod_card defE).
- split; first by rewrite (subset_trans _ sER) // -defZS mulG_subr.
- by apply/eqP; rewrite -(eqn_pmul2l (ltnW p_gt1)) -{1}oZ oZS oE.
- rewrite -dimE -p_rank_abelem // -(Ohm1_cent_max maxE pR) p_rank_Ohm1.
- by rewrite -defZS /= centM setIA defCRZ.
-have abelS := prime_abelem p_pr oS.
-have cSZ: Z \subset 'C(S) by rewrite (centsS sSR) // centsC -defCRZ subsetIr.
-have sSZR: S <*> Z \subset R by rewrite join_subG sSR.
-have defSZ: S \x Z = S <*> Z.
- rewrite dprodEY ?prime_TIg ?oS //= -/Z; apply: contraL rR => sSZ.
- by rewrite -leqNgt (leq_trans _ rCRS) ?p_rankS // -{1}defCRZ setIS ?centS.
-have abelSZ: p.-abelem (S <*> Z) by rewrite (dprod_abelem p defSZ) abelS.
-have [pSZ cSZSZ _] := and3P abelSZ.
-have dimSZ: logn p #|S <*> Z| = 2.
- apply/eqP; rewrite -p_rank_abelem // eqn_leq (leq_trans (p_rankS _ _) rCRS).
- rewrite -(p_rank_dprod p defSZ) p_rank_abelem // oS (pfactorK 1) // ltnS.
- by rewrite -rank_pgroup // rank_gt0.
- by rewrite subsetI sSZR sub_abelian_cent ?joing_subl.
-exists [group of S <*> Z]; rewrite 3!inE sSZR abelSZ dimSZ /=.
-apply/pmaxElemP; rewrite inE sSZR; split=> // E; case/pElemP=> sER abelE sSZE.
-apply: contraTeq rCRS; rewrite eq_sym -ltnNge -dimSZ => neqSZE.
-have [[pE cEE _] sSE] := (and3P abelE, subset_trans (joing_subl S Z) sSZE).
-rewrite (leq_trans (properG_ltn_log pE _)) ?properEneq ?neqSZE //.
-by rewrite -p_rank_abelem ?p_rankS // subsetI sER sub_abelian_cent.
-Qed.
-
-(* This is the main statement of B & G, Theorem 5.3, stating the equivalence *)
-(* of the structural and rank characterizations of the "narrow" property. Due *)
-(* to our definition of "narrow", the equivalence is the converse of that in *)
-(* B & G (we define narrow in terms of maximal elementary abelian subgroups). *)
-Lemma narrow_structureP : reflect (narrow_structure p R) (p.-narrow R).
-Proof.
-apply: (iffP idP) => [nnR | [S C sSR sCR oS cycC defSC]].
- have [S [sSR oS rCRS]] := narrow_centP nnR.
- have [cycC _ _ defCRS] := narrow_cent_dprod nnR oS sSR rCRS.
- by exists S [group of 'C_T(S)]; rewrite //= -setIA subsetIl.
-apply/narrow_centP; exists S; split=> //.
-have cycS: cyclic S by rewrite prime_cyclic ?oS.
-rewrite -(p_rank_dprod p defSC) -!(rank_pgroup (pgroupS _ pR)) // -addn1.
-rewrite leq_add -?abelian_rank1_cyclic ?cyclic_abelian //.
-Qed.
-
-End Rank3.
-
-(* This is B & G, Theoren 5.5 (a) and (b). Part (c), which is not used in the *)
-(* proof of the Odd Order Theorem, is omitted. *)
-Theorem Aut_narrow (A : {group {perm gT}}) :
- p.-narrow R -> solvable A -> A \subset Aut R -> odd #|A| ->
- [/\ (*a*) p^'.-group (A / 'O_p(A)), abelian (A / 'O_p(A))
- & (*b*) 2 < 'r(R) -> forall x, x \in A -> p^'.-elt x -> #[x] %| p.-1].
-Proof.
-move=> nnR solA AutA oddA; have nilR := pgroup_nil pR.
-have [rR | rR] := leqP 'r(R) 2.
- have pA' := der1_Aut_rank2_pgroup pR oddR rR AutA solA oddA.
- have sA'Ap: A^`(1) \subset 'O_p(A) by rewrite pcore_max ?der_normal.
- have cAbAb: abelian (A / 'O_p(A)) by rewrite sub_der1_abelian.
- split; rewrite // -(nilpotent_pcoreC p (abelian_nil cAbAb)).
- by rewrite trivg_pcore_quotient dprod1g pcore_pgroup.
-have ntR: R :!=: 1 by rewrite -rank_gt0 2?ltnW.
-rewrite (rank_pgroup pR) in rR.
-have [H [charH sHRZ] _ eH pCH] := critical_odd pR oddR ntR.
-have{ntR} [[p_pr _ _] sHR] := (pgroup_pdiv pR ntR, char_sub charH).
-have ntH: H :!=: 1 by rewrite trivg_exponent eH -prime_coprime ?coprimen1.
-have{nnR} [S C sSR sCR oS cycC defSC] := narrow_structureP rR nnR.
-have [_ mulSC cSC tiSC] := dprodP defSC.
-have abelS: p.-abelem S := prime_abelem p_pr oS; have [pS cSS _] := and3P abelS.
-have cycS: cyclic S by rewrite prime_cyclic ?oS.
-have tiHS: H :&: S = 1.
- have rCRS: 'r_p('C_R(S)) <= 2.
- rewrite -(p_rank_dprod p defSC) -addn1 -!rank_pgroup ?(pgroupS _ pR) //.
- by rewrite leq_add -?abelian_rank1_cyclic ?cyclic_abelian.
- rewrite setIC prime_TIg ?oS //; apply: contraL (rCRS) => sSH; rewrite -ltnNge.
- have cZHS: S \subset 'C('Z(H)) by rewrite centsC (centsS sSH) ?subsetIr.
- pose U := S <*> 'Z(H).
- have sUH: U \subset H by rewrite join_subG sSH subsetIl.
- have cUU: abelian U by rewrite abelianY cSS center_abelian centsC.
- have abelU: p.-abelem U by rewrite abelemE // cUU -eH exponentS.
- have sUR: U \subset R := subset_trans sUH sHR.
- have rU: 'r_p(U) <= 'r_p('C_R(S)).
- by rewrite p_rankS //= subsetI sUR (centsS (joing_subl S 'Z(H))).
- have nsUR: U <| R.
- rewrite /normal sUR -commg_subl (subset_trans (commSg _ sUH)) //= -/U.
- by rewrite (subset_trans sHRZ) // joing_subr.
- have{rU}:= leq_trans rU rCRS; rewrite leq_eqVlt => /predU1P[] rU.
- have Ep2U: [group of U] \in 'E_p^2(R).
- by rewrite !inE /= sUR abelU -(p_rank_abelem abelU) rU.
- have [F scn3F sUF] := normal_p2Elem_SCN3 rR Ep2U nsUR.
- have [scnF rF] := setIdP scn3F; have [_ scF] := SCN_P scnF.
- rewrite (leq_trans rF) // -scF -rank_pgroup ?(pgroupS (subsetIl _ _)) //.
- by rewrite rankS ?setIS ?centS // (subset_trans _ sUF) ?joing_subl.
- have defU: S :=: U.
- apply/eqP; rewrite eqEcard oS joing_subl (card_pgroup (pgroupS sUR pR)).
- by rewrite -p_rank_abelem // (leq_exp2l _ 1) // prime_gt1.
- have ntS: S :!=: 1 by rewrite -cardG_gt1 oS prime_gt1.
- have sSZ: S \subset 'Z(R) by rewrite prime_meetG ?oS ?meet_center_nil // defU.
- by rewrite (setIidPl _) // centsC (subset_trans sSZ) ?subsetIr.
-have{tiHS eH} oCHS: #|'C_H(S)| = p.
- have ntCHS: 'C_H(S) != 1.
- have: H :&: 'Z(R) != 1 by rewrite meet_center_nil ?char_normal.
- by apply: subG1_contra; rewrite setIS // (centsS sSR) ?subsetIr.
- have cycCHS: cyclic 'C_H(S).
- have tiS_CHS: S :&: 'C_H(S) = 1 by rewrite setICA setIA tiHS setI1g.
- rewrite (isog_cyclic (quotient_isog _ tiS_CHS)) ?subIset ?cent_sub ?orbT //.
- rewrite (cyclicS _ (quotient_cyclic S cycC)) //= -(quotientMidl S C).
- by rewrite mulSC quotientS // setSI // char_sub.
- have abelCHS: p.-abelem 'C_H(S).
- by rewrite abelemE ?cyclic_abelian // -eH exponentS ?subsetIl.
- rewrite -(Ohm1_id abelCHS).
- by rewrite (Ohm1_cyclic_pgroup_prime _ (abelem_pgroup abelCHS)).
-pose B := A^`(1) <*> [set a ^+ p.-1 | a in A].
-have sBA: B \subset A.
- rewrite join_subG (der_sub 1 A) /=.
- by apply/subsetP=> _ /imsetP[a Aa ->]; rewrite groupX.
-have AutB: B \subset Aut R := subset_trans sBA AutA.
-suffices pB (X : {group {perm gT}}): X \subset B -> p^'.-group X -> X :=: 1.
- have cAbAb: abelian (A / 'O_p(A)).
- rewrite sub_der1_abelian // pcore_max ?der_normal //.
- apply/pgroupP=> q q_pr; apply: contraLR => p'q; rewrite -p'natE //.
- have [X sylX] := Sylow_exists q A^`(1); have [sXA' qX _] := and3P sylX.
- rewrite -partn_eq1 ?cardG_gt0 // -(card_Hall sylX).
- by rewrite (pB X) ?cards1 ?(pi_pgroup qX) ?(subset_trans sXA') ?joing_subl.
- rewrite cAbAb -(nilpotent_pcoreC p (abelian_nil cAbAb)) trivg_pcore_quotient.
- rewrite dprod1g pcore_pgroup; split=> //_ a Aa p'a.
- rewrite order_dvdn -cycle_eq1 [<[_]>]pB ?(pgroupS (cycleX _ _) p'a) //.
- by rewrite genS // sub1set inE orbC (mem_imset (expgn^~ _)).
-move=> sXB p'X; have AutX := subset_trans sXB AutB.
-pose toX := ([Aut R] \ AutX)%gact; pose CX := 'C_(H | toX)(X).
-suffices sHCX: H \subset CX.
- rewrite -(setIid X) coprime_TIg ?(pnat_coprime (pgroupS _ pCH)) //.
- by rewrite subsetIidl gacent_ract setIid gacentC in sHCX.
-elim: _.+1 {1 2 4 6}H (charH) (subxx H) (ltnSn #|H|) => // n IHn L charL sLH.
-rewrite ltnS => leLn; have sLR := char_sub charL; pose K := [~: L, R].
-wlog ntL: / L :!=: 1 by case: eqP => [-> | _ -> //]; rewrite sub1G.
-have charK: K \char R by rewrite charR ?char_refl.
-have ltKL: K \proper L.
- have nLR: R \subset 'N_R(L) by rewrite subsetIidl char_norm.
- exact: nil_comm_properl nilR sLR ntL nLR.
-have [sKL sKR] := (proper_sub ltKL, char_sub charK).
-have [sKH pK] := (subset_trans sKL sLH, pgroupS sKR pR : p.-group K).
-have nsKH: K <| H := normalS sKH sHR (char_normal charK).
-have sKCX: K \subset CX by rewrite IHn ?(leq_trans (proper_card ltKL)) ?leLn.
-have pL := pgroupS sLR pR; have nKL: L \subset 'N(K) := commg_norml _ _.
-have{pS cSS} oLb: #|L / K| = p.
- have [v defS] := cyclicP cycS; rewrite defS cycle_subG in sSR.
- have ntLb: L / K != 1 by rewrite -subG1 quotient_sub1 ?proper_subn.
- have [_ p_dv_Lb _] := pgroup_pdiv (quotient_pgroup _ pL) ntLb.
- apply/eqP; rewrite eqn_leq {p_dv_Lb}(dvdn_leq _ p_dv_Lb) // andbT.
- rewrite -divg_normal ?(normalS sKL sLH nsKH) // leq_divLR ?cardSg //= -/K.
- rewrite -(card_lcoset K v) -(LagrangeI L 'C(S)) -indexgI /= -oCHS /K commGC.
- rewrite {2}defS cent_cycle index_cent1 leq_mul ?subset_leq_card ?setSI //.
- by apply/subsetP=> vx; case/imsetP=> x Lx ->; rewrite mem_lcoset mem_commg.
-have cycLb: cyclic (L / K) by rewrite prime_cyclic ?oLb.
-rewrite -(quotientSGK _ sKCX) // quotientGI // subsetI quotientS //= -/K.
-have actsXK: [acts X, on K | toX] by rewrite acts_ract subxx acts_char.
-rewrite ext_coprime_quotient_cent ?(pnat_coprime pK p'X) ?(pgroup_sol pK) //.
-have actsAL : {acts A, on group L | [Aut R]} by apply: gacts_char.
-have sAD: A \subset qact_dom <[actsAL]> [~: L, R].
- by rewrite qact_domE // acts_actby subxx (setIidPr sKL) acts_char.
-suffices cLbX: X \subset 'C(L / K | <[actsAL]> / _).
- rewrite gacentE ?qact_domE // subsetI quotientS //=.
- apply/subsetP=> Ku LbKu; rewrite inE; apply/subsetP=> x Xx; rewrite inE.
- have [Dx cLx] := setIdP (subsetP cLbX x Xx); have [Ax _] := setIdP Dx.
- rewrite inE in cLx; have:= subsetP cLx Ku LbKu; rewrite inE /=.
- have [u Nu Lu ->] := morphimP LbKu.
- by rewrite !{1}qactE // ?actbyE // qact_domE ?(subsetP actsXK).
-rewrite (subset_trans sXB) // astab_range -ker_actperm gen_subG.
-rewrite -sub_morphim_pre; last by rewrite -gen_subG ?(subset_trans sBA).
-rewrite morphimU subUset morphim_der // (sameP trivgP derG1P).
-rewrite (abelianS _ (Aut_cyclic_abelian cycLb)); last first.
- exact: subset_trans (morphim_sub _ _) (im_actperm_Aut _).
-apply/subsetP=> _ /morphimP[_ _ /imsetP[x Ax ->] ->].
-have Dx := subsetP sAD x Ax; rewrite inE morphX //= -order_dvdn.
-apply: dvdn_trans (order_dvdG (actperm_Aut _ Dx)) _.
-by rewrite card_Aut_cyclic // oLb (@totient_pfactor p 1) ?muln1.
-Qed.
-
-End OneGroup.
-
-(* This is B & G, Theorem 5.6, parts (a) and (c). We do not prove parts (b), *)
-(* (d) and (e), as they are not used in the proof of the Odd Order Theorem. *)
-Theorem narrow_der1_complement_max_pdiv gT p (G S : {group gT}) :
- odd #|G| -> solvable G -> p.-Sylow(G) S -> p.-narrow S ->
- (2 < 'r(S)) ==> p.-length_1 G ->
- [/\ (*a*) p^'.-Hall(G^`(1)) 'O_p^'(G^`(1))
- & (*c*) forall q, q \in \pi(G / 'O_p^'(G)) -> q <= p].
-Proof.
-move=> oddG solG sylS nnS; case: (leqP 'r(S) 2) => /= rS pl1G.
- have rG: 'r_p(G) <= 2 by rewrite -(rank_Sylow sylS).
- split=> [|q]; first by have [-> _ _] := rank2_der1_complement solG oddG rG.
- exact: rank2_max_pdiv solG oddG rG.
-rewrite /pHall pcore_sub pcore_pgroup pnatNK /=.
-rewrite -(pcore_setI_normal p^' (der_normal 1 G)) // setIC indexgI /=.
-wlog Gp'1: gT G S oddG nnS solG sylS rS pl1G / 'O_p^'(G) = 1.
- set K := 'O_p^'(G); have [_ nKG] := andP (pcore_normal _ G : K <| G).
- move/(_ _ (G / K) (S / K))%G; rewrite quotient_sol ?quotient_odd //.
- have [[sSG pS _] p'K] := (and3P sylS, pcore_pgroup _ G : p^'.-group K).
- have [nKS nKG'] := (subset_trans sSG nKG, subset_trans (der_sub 1 G) nKG).
- have tiKS: K :&: S = 1 := coprime_TIg (p'nat_coprime p'K pS).
- have isoS := isog_symr (quotient_isog nKS tiKS).
- rewrite (isog_narrow p isoS) {isoS}(isog_rank isoS) quotient_pHall //.
- rewrite plength1_quo // trivg_pcore_quotient indexg1 /= -quotient_der //.
- by rewrite card_quotient //= -/K -(card_isog (quotient1_isog _)); apply.
-rewrite Gp'1 indexg1 -(card_isog (quotient1_isog _)) -pgroupE.
-have [sSG pS _] := and3P sylS; have oddS: odd #|S| := oddSg sSG oddG.
-have ntS: S :!=: 1 by rewrite -rank_gt0 (leq_trans _ rS).
-have [p_pr _ _] := pgroup_pdiv pS ntS; have p_gt1 := prime_gt1 p_pr.
-have{pl1G} defS: 'O_p(G) = S.
- by rewrite (eq_Hall_pcore _ sylS) -?plength1_pcore_Sylow.
-have nSG: G \subset 'N(S) by rewrite -defS gFnorm.
-pose fA := restrm nSG (conj_aut S); pose A := fA @* G.
-have AutA: A \subset Aut S by rewrite [A]im_restrm Aut_conj_aut.
-have [solA oddA]: solvable A /\ odd #|A| by rewrite morphim_sol ?morphim_odd.
-have [/= _ cAbAb p'A_dv_p1] := Aut_narrow pS oddS nnS solA AutA oddA.
-have{defS} pKfA: p.-group ('ker fA).
- rewrite (pgroupS _ pS) //= ker_restrm ker_conj_aut.
- by rewrite -defS -Fitting_eq_pcore ?cent_sub_Fitting.
-split=> [|q].
- rewrite -(pmorphim_pgroup pKfA) ?der_sub // morphim_der //.
- by rewrite (pgroupS (der1_min _ cAbAb)) ?pcore_pgroup ?gFnorm.
-rewrite mem_primes => /and3P[q_pr _ /Cauchy[] // x Gx ox].
-rewrite leq_eqVlt -implyNb; apply/implyP=> p'q; rewrite -(ltn_predK p_gt1) ltnS.
-have ofAx: #[fA x] = q.
- apply/prime_nt_dvdP=> //; last by rewrite -ox morph_order.
- rewrite order_eq1; apply: contraNneq p'q => fAx1.
- by apply: (pgroupP pKfA); rewrite // -ox order_dvdG //; apply/kerP.
-have p'fAx: p^'.-elt (fA x) by rewrite /p_elt ofAx pnatE.
-by rewrite -ofAx dvdn_leq ?p'A_dv_p1 ?mem_morphim // -(subnKC p_gt1).
-Qed.
-
-End Five.
diff --git a/mathcomp/odd_order/BGsection6.v b/mathcomp/odd_order/BGsection6.v
deleted file mode 100644
index 9e06b1a..0000000
--- a/mathcomp/odd_order/BGsection6.v
+++ /dev/null
@@ -1,322 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrfun ssrbool eqtype ssrnat seq div fintype finset.
-From mathcomp
-Require Import prime fingroup morphism automorphism quotient gproduct gfunctor.
-From mathcomp
-Require Import cyclic center commutator pgroup nilpotent sylow abelian hall.
-From mathcomp
-Require Import maximal.
-From mathcomp
-Require Import BGsection1 BGappendixAB.
-
-(******************************************************************************)
-(* This file covers most of B & G section 6. *)
-(* Theorem 6.4 is not proved, since it is not needed for the revised proof of *)
-(* the odd order theorem. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope.
-
-Section Six.
-
-Implicit Type gT : finGroupType.
-Implicit Type p : nat.
-
-Section OneType.
-
-Variable gT : finGroupType.
-Implicit Types G H K S U : {group gT}.
-
-(* This is B & G, Theorem A.4(b) and 6.1, or Gorenstein 6.5.2, the main Hall- *)
-(* Higman style p-stability result used in the proof of the Odd Order Theorem *)
-Theorem odd_p_abelian_constrained p G :
- odd #|G| -> solvable G -> p.-abelian_constrained G.
-Proof.
-move/odd_p_stable=> stabG /solvable_p_constrained constrG.
-exact: p_stable_abelian_constrained.
-Qed.
-
-(* Auxiliary results from AppendixAB, necessary to exploit the results below. *)
-Definition center_Puig_char := BGappendixAB.center_Puig_char.
-Definition trivg_center_Puig_pgroup := BGappendixAB.trivg_center_Puig_pgroup.
-
-(* The two parts of B & G, Theorem 6.2 are established in BGappendixAB. *)
-Theorem Puig_factorisation p G S :
- odd #|G| -> solvable G -> p.-Sylow(G) S -> 'O_p^'(G) * 'N_G('Z('L(S))) = G.
-Proof. exact: BGappendixAB.Puig_factorization. Qed.
-
-(* This is the main statement of B & G, Theorem 6.2. It is not used in the *)
-(* actual proof. *)
-Theorem Puig_center_p'core_normal p G S :
- odd #|G| -> solvable G -> p.-Sylow(G) S -> 'O_p^'(G) * 'Z('L(S)) <| G.
-Proof.
-move=> oddG solG sylS; rewrite -{2}(Puig_factorisation _ _ sylS) //.
-have sZL_G: 'Z('L(S)) \subset G by rewrite !gFsub_trans ?(pHall_sub sylS).
-rewrite -!quotientK ?(subset_trans sZL_G) ?subIset ?gFnorm //=.
-by rewrite cosetpre_normal quotient_normal // normalSG.
-Qed.
-
-(* This is the second part (special case) of B & G, Theorem 6.2. *)
-Theorem Puig_center_normal p G S :
- odd #|G| -> solvable G -> p.-Sylow(G) S -> 'O_p^'(G) = 1 -> 'Z('L(S)) <| G.
-Proof. exact: BGappendixAB.Puig_center_normal. Qed.
-
-(* This is B & G, Lemma 6.3(a). *)
-Lemma coprime_der1_sdprod K H G :
- K ><| H = G -> coprime #|K| #|H| -> solvable K -> K \subset G^`(1) ->
- [~: K, H] = K /\ 'C_K(H) \subset K^`(1).
-Proof.
-case/sdprodP=> _ defG nKH tiKH coKH solK sKG'.
-set K' := K^`(1); have [sK'K nK'K] := andP (der_normal 1 K : K' <| K).
-have nK'H: H \subset 'N(K') := gFnorm_trans _ nKH.
-set R := [~: K, H]; have sRK: R \subset K by rewrite commg_subl.
-have [nRK nRH] := joing_subP (commg_norm K H : K <*> H \subset 'N(R)).
-have sKbK'H': K / R \subset (K / R)^`(1) * (H / R)^`(1).
- have defGb: (K / R) \* (H / R) = G / R.
- by rewrite -defG quotientMl ?cprodE // centsC quotient_cents2r.
- have [_ -> _ /=] := cprodP (der_cprod 1 defGb).
- by rewrite -quotient_der ?quotientS // -defG mul_subG.
-have tiKbHb': K / R :&: (H / R)^`(1) = 1.
- by rewrite coprime_TIg // (coprimegS (der_sub 1 _)) ?coprime_morph.
-have{sKbK'H' tiKbHb'} derKb: (K / R)^`(1) = K / R.
- by rewrite -{2}(setIidPr sKbK'H') -group_modl ?der_sub // setIC tiKbHb' mulg1.
-have{derKb} Kb1: K / R = 1.
- rewrite (contraNeq (sol_der1_proper _ (subxx (K / R)))) ?quotient_sol //.
- by rewrite derKb properxx.
-have{Kb1 sRK} defKH: [~: K, H] = K.
- by apply/eqP; rewrite eqEsubset sRK -quotient_sub1 ?Kb1 //=.
-split=> //; rewrite -quotient_sub1 ?subIset ?nK'K //= -/K'.
-have cKaKa: abelian (K / K') := der_abelian 0 K.
-rewrite coprime_quotient_cent ?quotient_norms ?coprime_morph //= -/K' -defKH.
-by rewrite quotientR // coprime_abel_cent_TI ?quotient_norms ?coprime_morph.
-Qed.
-
-(* This is B & G, Lemma 6.3(b). It is apparently not used later. *)
-Lemma prime_nil_der1_factor G :
- nilpotent G^`(1) -> prime #|G / G^`(1)| ->
- Hall G G^`(1) /\ (forall H, G^`(1) ><| H = G -> G^`(1) = [~: G, H]).
-Proof.
-move=> nilG' /=; set G' := G^`(1); set p := #|G / G'| => p_pr.
-have nsG'G: G' <| G := der_normal 1 G; have [sG'G nG'G] := andP nsG'G.
-have nsG'p'G: 'O_p^'(G') <| G := gFnormal_trans _ nsG'G.
-have nG'p'G := normal_norm nsG'p'G; have solG' := nilpotent_sol nilG'.
-have{nilG'} pGb: p.-group (G / 'O_p^'(G')).
- rewrite /pgroup card_quotient -?(Lagrange_index sG'G (pcore_sub _ _)) //=.
- rewrite pnat_mul // -card_quotient // pnat_id //= -pnatNK.
- by case/and3P: (nilpotent_pcore_Hall p^' nilG').
-have{pGb} cycGb: cyclic (G / 'O_p^'(G')).
- apply: (cyclic_nilpotent_quo_der1_cyclic (pgroup_nil pGb)).
- rewrite -quotient_der // (isog_cyclic (third_isog _ _ _)) ?pcore_sub //.
- by apply: prime_cyclic.
-have defG': G' = 'O_p^'(G').
- by apply/eqP; rewrite eqEsubset pcore_sub der1_min ?cyclic_abelian.
-have hallG': Hall G G'.
- rewrite /Hall sG'G -?card_quotient // defG' //= -/p.
- by rewrite (p'nat_coprime (pcore_pgroup _ _)) ?pnat_id.
-split=> // H defG; have [_ mulG'H nG'H tiG'H] := sdprodP defG.
-rewrite -mulG'H commMG ?commg_normr // -derg1 (derG1P _) ?mulg1 //.
- by case/coprime_der1_sdprod: (defG); rewrite ?(coprime_sdprod_Hall_l defG).
-rewrite (isog_abelian (quotient_isog nG'H tiG'H)) /= -/G'.
-by rewrite -quotientMidl mulG'H der_abelian.
-Qed.
-
-Section PprodSubCoprime.
-
-Variables K U H G : {group gT}.
-Hypotheses (defG : K * U = G) (nsKG : K <| G).
-Hypotheses (sHU : H \subset U) (coKH : coprime #|K| #|H|).
-Let nKG : G \subset 'N(K). Proof. by case/andP: nsKG. Qed.
-Let sKG : K \subset G. Proof. by case/mulG_sub: defG. Qed.
-Let sUG : U \subset G. Proof. by case/mulG_sub: defG. Qed.
-Let nKU : U \subset 'N(K). Proof. exact: subset_trans sUG nKG. Qed.
-Let nKH : H \subset 'N(K). Proof. exact: subset_trans sHU nKU. Qed.
-
-(* This is B & G, Lemma 6.5(a); note that we do not assume solvability. *)
-Lemma pprod_focal_coprime : H :&: G^`(1) = H :&: U^`(1).
-Proof.
-set G' := G^`(1); set U' := U^`(1).
-have [sU'U nU'U] := andP (der_normal 1 U : U' <| U).
-have{nU'U} nU_U': U :&: _ \subset 'N(U') by move=> A; rewrite subIset ?nU'U.
-suffices sHG'U': H :&: G' \subset U'.
- by rewrite -(setIidPl sHG'U') -setIA (setIidPr (dergS 1 sUG)).
-rewrite -(setIidPr sHU) -setIA -quotient_sub1 // setICA setIC.
-rewrite quotientGI ?subsetI ?sU'U ?dergS ?coprime_TIg //= -/G' -/U'.
-have sUG'_UKb: (U :&: G') / U' \subset (U :&: K) / U'.
- rewrite quotientSK // -normC ?group_modr ?setIS //.
- by rewrite -quotientSK ?comm_subG ?quotient_der // -defG quotientMidl.
-rewrite (coprimeSg sUG'_UKb) // -(card_isog (second_isog _)) //=.
-rewrite setIA (setIidPl sU'U) coprime_morphl ?coprime_morphr //.
-exact: coprimeSg (subsetIr U K) coKH.
-Qed.
-
-Hypothesis solG : solvable G.
-
-(* This is B & G, Lemma 6.5(c). *)
-Lemma pprod_trans_coprime g :
- g \in G -> H :^ g \subset U ->
- exists2 c, c \in 'C_K(H) & exists2 u, u \in U & g = c * u.
-Proof.
-rewrite -{1}defG => /mulsgP[k u Kk Uu defg] sHgU.
-have [sK_KH sH_KH] := joing_sub (erefl (K <*> H)).
-have hallH: \pi(H).-Hall(K <*> H :&: U) H.
- rewrite (pHall_subl _ (subsetIl _ _)) ?subsetI ?sH_KH //.
- rewrite /pHall sH_KH pgroup_pi /= joingC norm_joinEl // indexMg -indexgI.
- by rewrite -coprime_pi' ?cardG_gt0 //= coprime_sym coprime_TIg ?indexg1.
-have{sHgU} hallHk: \pi(H).-Hall(K <*> H :&: U) (H :^ k).
- rewrite pHallE cardJg (card_Hall hallH) eqxx andbT subsetI andbC.
- rewrite -(conjSg _ _ u) (conjGid Uu) -conjsgM -defg sHgU.
- by rewrite sub_conjg conjGid // groupV (subsetP sK_KH).
-have{hallH hallHk} [w KUw defHk]: exists2 w, w \in K :&: U & H :^ k = H :^ w.
- have sKHU_G: K <*> H :&: U \subset G by rewrite setIC subIset ?sUG.
- have [hw KHUhw ->] := Hall_trans (solvableS sKHU_G solG) hallHk hallH.
- have: hw \in H * (K :&: U) by rewrite group_modl // -norm_joinEl // joingC.
- by case/mulsgP=> h w Hh KUw ->; exists w; rewrite // conjsgM (conjGid Hh).
-have{KUw} [Kw Uw] := setIP KUw.
-exists (k * w^-1); last by exists (w * u); rewrite ?groupM // -mulgA mulKg.
-by rewrite -coprime_norm_cent // !inE groupM ?groupV //= conjsgM defHk conjsgK.
-Qed.
-
-(* This is B & G, Lemma 6.5(b). *)
-Lemma pprod_norm_coprime_prod : 'C_K(H) * 'N_U(H) = 'N_G(H).
-Proof.
-apply/eqP; rewrite eqEsubset mul_subG ?setISS ?cent_sub //=.
-apply/subsetP=> g /setIP[Gg /normP nHg].
-have [|c Cc [u Uu defg]] := pprod_trans_coprime Gg; first by rewrite nHg.
-rewrite defg mem_mulg // !inE Uu -{2}nHg defg conjsgM conjSg (normP _) //=.
-by case/setIP: Cc => _; apply: (subsetP (cent_sub H)).
-Qed.
-
-End PprodSubCoprime.
-
-Section Plength1Prod.
-
-Variables (p : nat) (G S : {group gT}).
-Hypotheses (sylS : p.-Sylow(G) S) (pl1G : p.-length_1 G).
-Let K := 'O_p^'(G).
-Let sSG : S \subset G. Proof. by case/andP: sylS. Qed.
-Let nsKG : K <| G. Proof. apply: pcore_normal. Qed.
-Let sKG : K \subset G. Proof. by case/andP: nsKG. Qed.
-Let nKG : G \subset 'N(K). Proof. by case/andP: nsKG. Qed.
-Let nKS : S \subset 'N(K). Proof. apply: subset_trans sSG nKG. Qed.
-Let coKS : coprime #|K| #|S|.
-Proof. exact: p'nat_coprime (pcore_pgroup _ G) (pHall_pgroup sylS). Qed.
-Let sSN : S \subset 'N_G(S). Proof. by rewrite subsetI sSG normG. Qed.
-
-Let sylGbp : p.-Sylow(G / K) 'O_p(G / K).
-Proof. by rewrite -plength1_pcore_quo_Sylow. Qed.
-
-(* This is B & G, Lemma 6.6(a1); note that we do not assume solvability. *)
-Lemma plength1_Sylow_prod : K * S = 'O_{p^',p}(G).
-Proof.
-by rewrite -quotientK 1?(eq_Hall_pcore sylGbp) ?quotient_pHall //= /K -pseries1.
-Qed.
-
-Let sylS_Gp'p : p.-Sylow('O_{p^',p}(G)) S.
-Proof.
-have [_ sSGp'p] := mulG_sub plength1_Sylow_prod.
-exact: pHall_subl sSGp'p (pseries_sub _ _) sylS.
-Qed.
-
-(* This is B & G, Lemma 6.6(a2); note that we do not assume solvability. *)
-Lemma plength1_Frattini : K * 'N_G(S) = G.
-Proof.
-rewrite -{2}(Frattini_arg _ sylS_Gp'p) ?pseries_normal //= -plength1_Sylow_prod.
-by rewrite -mulgA [S * _]mulSGid // subsetI sSG normG.
-Qed.
-Local Notation defG := plength1_Frattini.
-
-(* This is B & G, Lemma 6.6(b); note that we do not assume solvability. *)
-Lemma plength1_Sylow_sub_der1 : S \subset G^`(1) -> S \subset ('N_G(S))^`(1).
-Proof.
-by move/setIidPl=> sSG'; apply/setIidPl; rewrite -(pprod_focal_coprime defG).
-Qed.
-
-Hypothesis solG : solvable G.
-
-(* This is B & G, Lemma 6.6(c). *)
-Lemma plength1_Sylow_trans (Y : {set gT}) g :
- Y \subset S -> g \in G -> Y :^ g \subset S ->
- exists2 c, c \in 'C_G(Y) & exists2 u, u \in 'N_G(S) & g = c * u.
-Proof.
-rewrite -gen_subG -(gen_subG (Y :^ g)) genJ => sYS Gg sYgS.
-have coKY := coprimegS sYS coKS.
-have [sYN sYgN] := (subset_trans sYS sSN, subset_trans sYgS sSN).
-have [c Cc defg] := pprod_trans_coprime defG nsKG sYN coKY solG Gg sYgN.
-by exists c => //; apply: subsetP Cc; rewrite cent_gen setSI.
-Qed.
-
-(* This is B & G, Lemma 6.6(d). *)
-Lemma plength1_Sylow_Jsub (Q : {group gT}) :
- Q \subset G -> p.-group Q ->
- exists2 x, x \in 'C_G(Q :&: S) & Q :^ x \subset S.
-Proof.
-move=> sQG pQ; have sQ_Gp'p: Q \subset 'O_{p^',p}(G).
- rewrite -sub_quotient_pre /= pcore_mod1 ?(subset_trans sQG) //.
- by rewrite (sub_Hall_pcore sylGbp) ?quotientS ?quotient_pgroup.
-have [xy /= KSxy sQxyS] := Sylow_Jsub sylS_Gp'p sQ_Gp'p pQ.
-rewrite -plength1_Sylow_prod in KSxy; have [x y Kx Sy def_xy] := mulsgP KSxy.
-have{sQxyS} sQxS: Q :^ x \subset S.
- by rewrite -(conjSg _ _ y) (conjGid Sy) -conjsgM -def_xy.
-exists x; rewrite // inE (subsetP sKG) //; apply/centP=> z; case/setIP=> Qz Sz.
-apply/commgP; rewrite -in_set1 -set1gE -(coprime_TIg coKS) inE.
-rewrite groupMl ?groupV ?memJ_norm ?(subsetP nKS) ?Kx //=.
-by rewrite commgEr groupMr // (subsetP sQxS) ?memJ_conjg ?groupV.
-Qed.
-
-End Plength1Prod.
-
-End OneType.
-
-(* This is B & G, Theorem 6.7 *)
-Theorem plength1_norm_pmaxElem gT p (G E L : {group gT}) :
- E \in 'E*_p(G) -> odd p -> solvable G -> p.-length_1 G ->
- L \subset G -> E \subset 'N(L) -> p^'.-group L ->
- L \subset 'O_p^'(G).
-Proof.
-move=> maxE p_odd solG pl1G sLG nEL p'L.
-case p_pr: (prime p); last first.
- by rewrite pcore_pgroup_id // p'groupEpi mem_primes p_pr.
-wlog Gp'1: gT G E L maxE solG pl1G sLG nEL p'L / 'O_p^'(G) = 1.
- set K := 'O_p^'(G); have [sKG nKG] := andP (pcore_normal _ G : K <| G).
- move/(_ _ (G / K) (E / K) (L / K))%G; rewrite morphim_sol ?plength1_quo //.
- rewrite morphimS ?morphim_norms ?quotient_pgroup // trivg_pcore_quotient.
- rewrite (quotient_sub1 (subset_trans sLG nKG)) => -> //.
- have [EpE _] := pmaxElemP maxE; have{EpE} [sEG abelE] := pElemP EpE.
- apply/pmaxElemP; rewrite inE quotient_abelem ?quotientS //.
- split=> // Fb; case/pElemP=> sFbG abelFb; have [pFb _ _] := and3P abelFb.
- have [S sylS sES] := Sylow_superset sEG (abelem_pgroup abelE).
- have [sSG pS _] := and3P sylS; have nKS := subset_trans sSG nKG.
- have: (E / K)%G \in 'E*_p(S / K).
- have: E \in 'E*_p(S) by rewrite (subsetP (pmaxElemS p sSG)) // inE maxE inE.
- have coKS: coprime #|K| #|S| := p'nat_coprime (pcore_pgroup _ _) pS.
- have [injK imK] := isomP (quotient_isom nKS (coprime_TIg coKS)).
- by rewrite -(injm_pmaxElem injK) ?imK ?inE //= morphim_restrm (setIidPr _).
- case/pmaxElemP=> _; apply; rewrite inE abelFb andbT.
- rewrite (sub_normal_Hall (quotient_pHall _ sylS)) //= -quotientMidl /= -/K.
- by rewrite plength1_Sylow_prod // quotient_pseries2 pcore_normal.
-have [EpE _] := pmaxElemP maxE; have{EpE} [sEG abelE] := pElemP EpE.
-have [S sylS sES] := Sylow_superset sEG (abelem_pgroup abelE).
-have [sSG pS _] := and3P sylS; have oddS: odd #|S| := odd_pgroup_odd p_odd pS.
-have defS: S :=: 'O_p(G) by apply eq_Hall_pcore; rewrite -?plength1_pcore_Sylow.
-have coSL: coprime #|S| #|L| := pnat_coprime pS p'L.
-have tiSL: S :&: L = 1 := coprime_TIg coSL.
-have{solG} scSG: 'C_G(S) \subset S.
- by rewrite defS -Fitting_eq_pcore ?cent_sub_Fitting.
-rewrite Gp'1 -tiSL subsetIidr (subset_trans _ scSG) // subsetI sLG /=.
-have nSL: L \subset 'N(S) by rewrite (subset_trans sLG) // defS gFnorm.
-have cLE: L \subset 'C(E).
- by rewrite (sameP commG1P trivgP) -tiSL setIC commg_subI ?(introT subsetIP).
-have maxES: E \in 'E*_p(S) by rewrite (subsetP (pmaxElemS p sSG)) ?(maxE, inE).
-have EpE: E \in 'E_p(S) by apply/setIdP.
-by rewrite (coprime_odd_faithful_cent_abelem EpE) ?(pmaxElem_LdivP p_pr maxES).
-Qed.
-
-End Six.
-
diff --git a/mathcomp/odd_order/BGsection7.v b/mathcomp/odd_order/BGsection7.v
deleted file mode 100644
index 08a589e..0000000
--- a/mathcomp/odd_order/BGsection7.v
+++ /dev/null
@@ -1,979 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq div fintype bigop.
-From mathcomp
-Require Import finset prime fingroup morphism automorphism action quotient.
-From mathcomp
-Require Import gfunctor cyclic pgroup center commutator gseries nilpotent.
-From mathcomp
-Require Import sylow abelian maximal hall.
-From mathcomp
-Require Import BGsection1 BGsection6.
-
-(******************************************************************************)
-(* This file covers B & G, section 7, i.e., the proof of the Thompson *)
-(* Transitivity Theorem, as well as some generalisations used later in the *)
-(* proof. *)
-(* This is the first section of the proof that applies to a (hypothetical) *)
-(* minimally simple odd group, so we also introduce at this point some *)
-(* infrastructure to carry over this assumption into the rest of the proof. *)
-(* minSimpleOddGroupType == a finGroupType that ranges exactly over the *)
-(* elements of a minimal counter-example to the *)
-(* Odd Order Theorem. *)
-(* G == the group of all the elements in a *)
-(* minSimpleOddGroupType (this is a local notation *)
-(* that must be reestablished for each such Type). *)
-(* 'M == the set of all (proper) maximal subgroups of G *)
-(* 'M(H) == the set of all elements of 'M that contain H *)
-(* 'U == the set of all H such that 'M(H) contains a *)
-(* single (unique) maximal subgroup of G. *)
-(* 'SCN_n[p] == the set of all SCN subgroups of rank at least n *)
-(* of all the Sylow p-subgroups of G. *)
-(* |/|_H(A, pi) == the set of all pi-subgroups of H that are *)
-(* normalised by A. *)
-(* |/|*(A, pi) == the set of pi-subgroups of G, normalised by A, *)
-(* and maximal subject to this condition. *)
-(* normed_constrained A == A is a nontrivial proper subgroup of G, such *)
-(* that for any proper subgroup X containing A, *)
-(* all Y in |/|_X(A, pi') lie in the pi'-core of X *)
-(* (here pi is the set of prime divisors of #|A|). *)
-(* This is Hypothesis 7.1 in B & G. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope.
-
-Reserved Notation "''M'" (at level 8, format "''M'").
-Reserved Notation "''M' ( H )" (at level 8, format "''M' ( H )").
-Reserved Notation "''U'" (at level 8).
-Reserved Notation "''SCN_' n [ p ]"
- (at level 8, n at level 2, format "''SCN_' n [ p ]").
-Reserved Notation "|/|_ X ( A ; pi )"
- (at level 8, X at level 2, format "|/|_ X ( A ; pi )").
-Reserved Notation "|/|* ( A ; pi )"
- (at level 8, format "|/|* ( A ; pi )").
-
-(* The generic setup for the whole Odd Order Theorem proof. *)
-Section InitialReduction.
-
-Implicit Type gT : finGroupType.
-
-Record minSimpleOddGroupMixin gT : Prop := MinSimpleOddGroupMixin {
- _ : odd #|[set: gT]|;
- _ : simple [set: gT];
- _ : ~~ solvable [set: gT];
- _ : forall M : {group gT}, M \proper [set: gT] -> solvable M
-}.
-
-Structure minSimpleOddGroupType := MinSimpleOddGroupType {
- minSimpleOddGroupType_base :> finGroupType;
- _ : minSimpleOddGroupMixin minSimpleOddGroupType_base
-}.
-
-Hypothesis IH_FT : minSimpleOddGroupType -> False.
-
-Lemma minSimpleOdd_ind gT (G : {group gT}) : odd #|G| -> solvable G.
-Proof.
-move: {2}_.+1 (ltnSn #|G|) => n.
-elim: n => // n IHn in gT G *; rewrite ltnS => leGn oddG.
-have oG: #|[subg G]| = #|G| by rewrite (card_isog (isog_subg G)).
-apply/idPn=> nsolG; case: IH_FT; exists [finGroupType of subg_of G].
-do [split; rewrite ?oG //=] => [||M].
-- rewrite -(isog_simple (isog_subg _)); apply/simpleP; split=> [|H nsHG].
- by apply: contra nsolG; move/eqP->; rewrite abelian_sol ?abelian1.
- have [sHG _]:= andP nsHG; apply/pred2P; apply: contraR nsolG; case/norP=> ntH.
- rewrite eqEcard sHG -ltnNge (series_sol nsHG) => ltHG.
- by rewrite !IHn ?(oddSg sHG) ?quotient_odd ?(leq_trans _ leGn) ?ltn_quotient.
-- by apply: contra nsolG => solG; rewrite -(im_sgval G) morphim_sol.
-rewrite properEcard oG; case/andP=> sMG ltMG.
-by apply: IHn (leq_trans ltMG leGn) (oddSg sMG _); rewrite oG.
-Qed.
-
-Lemma minSimpleOdd_prime gT (G : {group gT}) :
- odd #|G| -> simple G -> prime #|G|.
-Proof. by move/minSimpleOdd_ind; apply: simple_sol_prime. Qed.
-
-End InitialReduction.
-
-Notation TheMinSimpleOddGroup gT :=
- [set: FinGroup.arg_sort (FinGroup.base (minSimpleOddGroupType_base gT))]
- (only parsing).
-
-(* Elementary properties of the minimal counter example. *)
-Section MinSimpleOdd.
-
-Variable gT : minSimpleOddGroupType.
-Notation G := (TheMinSimpleOddGroup gT).
-Implicit Types H K D M P U V X : {group gT}.
-Local Notation sT := {set gT}.
-Implicit Type p : nat.
-
-Lemma mFT_odd H : odd #|H|.
-Proof. by apply: (oddSg (subsetT H)); case: gT => ? []. Qed.
-
-Lemma mFT_simple : simple G.
-Proof. by case: gT => ? []. Qed.
-
-Lemma mFT_nonSolvable : ~~ solvable G.
-Proof. by case: gT => ? []. Qed.
-
-Lemma mFT_sol M : M \proper G -> solvable M.
-Proof. by case: gT M => ? []. Qed.
-
-Lemma mFT_nonAbelian : ~~ abelian G.
-Proof. by apply: contra mFT_nonSolvable; apply: abelian_sol. Qed.
-
-Lemma mFT_neq1 : G != 1.
-Proof. by apply: contraNneq mFT_nonAbelian => ->; apply: abelian1. Qed.
-
-Lemma mFT_gt1 : [1] \proper G. Proof. by rewrite proper1G mFT_neq1. Qed.
-
-Lemma mFT_quo_odd M H : odd #|M / H|.
-Proof. by rewrite quotient_odd ?mFT_odd. Qed.
-
-Lemma mFT_sol_proper M : (M \proper G) = solvable M.
-Proof.
-apply/idP/idP; first exact: mFT_sol.
-by rewrite properT; apply: contraL; move/eqP->; apply: mFT_nonSolvable.
-Qed.
-
-Lemma mFT_pgroup_proper p P : p.-group P -> P \proper G.
-Proof. by move/pgroup_sol; rewrite mFT_sol_proper. Qed.
-
-Lemma mFT_norm_proper H : H :!=: 1 -> H \proper G -> 'N(H) \proper G.
-Proof.
-move=> ntH; rewrite !properT; apply: contra; move/eqP=> nHG; apply/eqP.
-move/eqP: ntH; case/simpleP: mFT_simple => _; case/(_ H) => //=.
-by rewrite -nHG normalG.
-Qed.
-
-Lemma cent_mFT_trivial : 'C(G) = 1.
-Proof.
-apply/eqP; apply: contraR mFT_nonAbelian => ntC.
-rewrite /abelian subTset /= eqEproper subsetT /=; apply/negP=> prC.
-have:= mFT_norm_proper ntC prC.
-by rewrite /proper subsetT norms_cent ?normG.
-Qed.
-
-Lemma mFT_cent_proper H : H :!=: 1 -> 'C(H) \proper G.
-Proof.
-case: (eqsVneq H G) => [-> | ].
- by rewrite cent_mFT_trivial properT eq_sym.
-rewrite -properT => prH ntH; apply: sub_proper_trans (cent_sub H) _.
-exact: mFT_norm_proper.
-Qed.
-
-Lemma mFT_cent1_proper x : x != 1 -> 'C[x] \proper G.
-Proof. by rewrite -cycle_eq1 -cent_cycle; apply: mFT_cent_proper. Qed.
-
-Lemma mFT_quo_sol M H : H :!=: 1 -> solvable (M / H).
-Proof.
-move=> ntH; case: (eqsVneq H G) => [-> |].
- rewrite [_ / _](trivgP _) ?abelian_sol ?abelian1 //.
- by rewrite quotient_sub1 ?normsG ?subsetT.
-rewrite -properT => prH; rewrite -quotientInorm morphim_sol //.
-by apply: solvableS (subsetIr _ _) (mFT_sol _); rewrite mFT_norm_proper.
-Qed.
-
-(* Maximal groups of the minimal FT counterexample, as defined at the start *)
-(* of B & G, section 7. *)
-Definition minSimple_max_groups := [set M : {group gT} | maximal M G].
-Local Notation "'M" := minSimple_max_groups : group_scope.
-
-Definition minSimple_max_groups_of (H : sT) := [set M in 'M | H \subset M].
-Local Notation "''M' ( H )" := (minSimple_max_groups_of H) : group_scope.
-
-Definition minSimple_uniq_max_groups := [set U : {group gT} | #|'M(U)| == 1%N].
-Local Notation "'U" := minSimple_uniq_max_groups : group_scope.
-
-Definition minSimple_SCN_at n p := \bigcup_(P in 'Syl_p(G)) 'SCN_n(P).
-
-Lemma mmax_exists H : H \proper G -> {M | M \in 'M(H)}.
-Proof.
-case/(@maxgroup_exists _ (fun M => M \proper G)) => M maxM sHM.
-by exists M; rewrite !inE sHM andbT.
-Qed.
-
-Lemma any_mmax : {M : {group gT} | M \in 'M}.
-Proof. by have [M] := mmax_exists mFT_gt1; case/setIdP; exists M. Qed.
-
-Lemma mmax_proper M : M \in 'M -> M \proper G.
-Proof. by rewrite inE; apply: maxgroupp. Qed.
-
-Lemma mmax_sol M : M \in 'M -> solvable M.
-Proof. by move/mmax_proper/mFT_sol. Qed.
-
-Lemma mmax_max M H : M \in 'M -> H \proper G -> M \subset H -> H :=: M.
-Proof. by rewrite inE; case/maxgroupP=> _; apply. Qed.
-
-Lemma eq_mmax : {in 'M &, forall M H, M \subset H -> M :=: H}.
-Proof. by move=> M H Mmax; move/mmax_proper=> prH; move/mmax_max->. Qed.
-
-Lemma sub_mmax_proper M H : M \in 'M -> H \subset M -> H \proper G.
-Proof. by move=> maxM sHM; apply: sub_proper_trans (mmax_proper maxM). Qed.
-
-Lemma mmax_norm X M :
- M \in 'M -> X :!=: 1 -> X \proper G -> M \subset 'N(X) -> 'N(X) = M.
-Proof. by move=> maxM ntX prX; apply: mmax_max (mFT_norm_proper _ _). Qed.
-
-Lemma mmax_normal_subset A M :
- M \in 'M -> A <| M -> ~~ (A \subset [1]) -> 'N(A) = M.
-Proof.
-rewrite -gen_subG subG1 => maxM /andP[sAM nAM] ntGA.
-rewrite (mmax_max maxM) // (sub_proper_trans (norm_gen _)) ?mFT_norm_proper //.
-by rewrite (sub_mmax_proper maxM) // gen_subG.
-Qed.
-
-Lemma mmax_normal M H : M \in 'M -> H <| M -> H :!=: 1 -> 'N(H) = M.
-Proof. by rewrite -subG1; apply: mmax_normal_subset. Qed.
-
-Lemma mmax_sigma_Sylow p P M :
- M \in 'M -> p.-Sylow(M) P -> 'N(P) \subset M -> p.-Sylow(G) P.
-Proof.
-by move=> maxM sylP sNM; rewrite -Sylow_subnorm setTI (pHall_subl _ sNM) ?normG.
-Qed.
-
-Lemma mmax_neq1 M : M \in 'M -> M :!=: 1.
-Proof.
-move=> maxM; apply: contra mFT_nonAbelian; move/eqP=> M1.
-case: (eqVneq G 1) => [-> | ]; first exact: abelian1.
-case/trivgPn=> x; rewrite -cycle_subG -cycle_eq1 subEproper /=.
-case/predU1P=> [<- | ]; first by rewrite cycle_abelian.
-by move/(mmax_max maxM)=> ->; rewrite M1 ?sub1G ?eqxx.
-Qed.
-
-Lemma norm_mmax M : M \in 'M -> 'N(M) = M.
-Proof.
-move=> maxM; apply: mmax_max (normG M) => //.
-exact: (mFT_norm_proper (mmax_neq1 maxM) (mmax_proper maxM)).
-Qed.
-
-Lemma mmaxJ M x : (M :^ x \in 'M)%G = (M \in 'M).
-Proof. by rewrite !inE /= -{1}[G](@conjGid _ _ x) ?maximalJ ?inE. Qed.
-
-Lemma mmax_ofS H K : H \subset K -> 'M(K) \subset 'M(H).
-Proof.
-move=> sHK; apply/subsetP=> M; rewrite !inE => /andP[->].
-exact: subset_trans.
-Qed.
-
-Lemma mmax_ofJ K x M : ((M :^ x)%G \in 'M(K :^ x)) = (M \in 'M(K)).
-Proof. by rewrite inE mmaxJ conjSg !inE. Qed.
-
-Lemma uniq_mmaxP U : reflect (exists M, 'M(U) = [set M]) (U \in 'U).
-Proof. by rewrite inE; apply: cards1P. Qed.
-Arguments uniq_mmaxP [U].
-
-Lemma mem_uniq_mmax U M : 'M(U) = [set M] -> M \in 'M /\ U \subset M.
-Proof. by move/setP/(_ M); rewrite set11 => /setIdP. Qed.
-
-Lemma eq_uniq_mmax U M H :
- 'M(U) = [set M] -> H \in 'M -> U \subset H -> H :=: M.
-Proof.
-by move=> uU_M maxH sUH; apply/congr_group/set1P; rewrite -uU_M inE maxH.
-Qed.
-
-Lemma def_uniq_mmax U M :
- U \in 'U -> M \in 'M -> U \subset M -> 'M(U) = [set M].
-Proof.
-case/uniq_mmaxP=> D uU_D maxM sUM.
-by rewrite (group_inj (eq_uniq_mmax uU_D maxM sUM)).
-Qed.
-
-Lemma uniq_mmax_subset1 U M :
- M \in 'M -> U \subset M -> (U \in 'U) = ('M(U) \subset [set M]).
-Proof.
-move=> maxM sUM; apply/idP/idP=> uU; first by rewrite -(def_uniq_mmax uU).
-by apply/uniq_mmaxP; exists M; apply/eqP; rewrite eqEsubset uU sub1set inE maxM.
-Qed.
-
-Lemma sub_uniq_mmax U M H :
- 'M(U) = [set M] -> U \subset H -> H \proper G -> H \subset M.
-Proof.
-move=> uU_M sUH; case/mmax_exists=> D; case/setIdP=> maxD sHD.
-by rewrite -(eq_uniq_mmax uU_M maxD) ?(subset_trans sUH).
-Qed.
-
-Lemma mmax_sup_id M : M \in 'M -> 'M(M) = [set M].
-Proof.
-move=> maxM; apply/eqP; rewrite eqEsubset sub1set inE maxM subxx !andbT.
-apply/subsetP=> H; case/setIdP=> maxH; rewrite inE -val_eqE /=.
-by move/eq_mmax=> ->.
-Qed.
-
-Lemma mmax_uniq_id : {subset 'M <= 'U}.
-Proof. by move=> M maxM; apply/uniq_mmaxP; exists M; apply: mmax_sup_id. Qed.
-
-Lemma def_uniq_mmaxJ M K x : 'M(K) = [set M] -> 'M(K :^ x) = [set M :^ x]%G.
-Proof.
-move=> uK_M; apply/setP=> L; rewrite -(actKV 'JG x L) mmax_ofJ uK_M.
-by rewrite !inE (inj_eq (act_inj 'JG x)).
-Qed.
-
-Lemma uniq_mmaxJ K x :((K :^ x)%G \in 'U) = (K \in 'U).
-Proof.
-apply/uniq_mmaxP/uniq_mmaxP=> [] [M uK_M].
- by exists (M :^ x^-1)%G; rewrite -(conjsgK x K); apply: def_uniq_mmaxJ.
-by exists (M :^ x)%G; apply: def_uniq_mmaxJ.
-Qed.
-
-Lemma uniq_mmax_norm_sub (M U : {group gT}) :
- 'M(U) = [set M] -> 'N(U) \subset M.
-Proof.
-move=> uU_M; have [maxM _] := mem_uniq_mmax uU_M.
-apply/subsetP=> x nUx; rewrite -(norm_mmax maxM) inE.
-have:= set11 M; rewrite -uU_M -(mmax_ofJ _ x) (normP nUx) uU_M.
-by move/set1P/congr_group->.
-Qed.
-
-Lemma uniq_mmax_neq1 (U : {group gT}) : U \in 'U -> U :!=: 1.
-Proof.
-case/uniq_mmaxP=> M uU_M; have [maxM _] := mem_uniq_mmax uU_M.
-apply: contraL (uniq_mmax_norm_sub uU_M); move/eqP->.
-by rewrite norm1 subTset -properT mmax_proper.
-Qed.
-
-Lemma def_uniq_mmaxS M U V :
- U \subset V -> V \proper G -> 'M(U) = [set M] -> 'M(V) = [set M].
-Proof.
-move=> sUV prV uU_M; apply/eqP; rewrite eqEsubset sub1set -uU_M.
-rewrite mmax_ofS //= inE (sub_uniq_mmax uU_M) //.
-by case/mem_uniq_mmax: uU_M => ->.
-Qed.
-
-Lemma uniq_mmaxS U V : U \subset V -> V \proper G -> U \in 'U -> V \in 'U.
-Proof.
-move=> sUV prV /uniq_mmaxP[M uU_M]; apply/uniq_mmaxP; exists M.
-exact: def_uniq_mmaxS uU_M.
-Qed.
-
-End MinSimpleOdd.
-
-Arguments uniq_mmaxP [gT U].
-Prenex Implicits uniq_mmaxP.
-
-Notation "''M'" := (minSimple_max_groups _) : group_scope.
-Notation "''M' ( H )" := (minSimple_max_groups_of H) : group_scope.
-Notation "''U'" := (minSimple_uniq_max_groups _) : group_scope.
-Notation "''SCN_' n [ p ]" := (minSimple_SCN_at _ n p) : group_scope.
-
-Section Hypothesis7_1.
-
-Variable gT : finGroupType.
-Implicit Types X Y A P Q : {group gT}.
-Local Notation G := [set: gT].
-
-Definition normed_pgroups (X A : {set gT}) pi :=
- [set Y : {group gT} | pi.-subgroup(X) Y & A \subset 'N(Y)].
-Local Notation "|/|_ X ( A ; pi )" := (normed_pgroups X A pi) : group_scope.
-
-Definition max_normed_pgroups (A : {set gT}) pi :=
- [set Y : {group gT} | [max Y | pi.-group Y & A \subset 'N(Y)]].
-Local Notation "|/|* ( A ; pi )" := (max_normed_pgroups A pi) : group_scope.
-
-(* This is the statement for B & G, Hypothesis 7.1. *)
-Inductive normed_constrained (A : {set gT}) :=
- NormedConstrained (pi := \pi(A)) of A != 1 & A \proper G
- & forall X Y : {group gT},
- A \subset X -> X \proper G -> Y \in |/|_X(A; pi^') -> Y \subset 'O_pi^'(X).
-
-Variable pi : nat_pred.
-
-Lemma max_normed_exists A X :
- pi.-group X -> A \subset 'N(X) -> {Y | Y \in |/|*(A; pi) & X \subset Y}.
-Proof.
-move=> piX nXA; pose piAn Y := pi.-group(Y) && (A \subset 'N(Y)).
-have [|Y] := @maxgroup_exists _ piAn X; first by rewrite /piAn piX.
-by exists Y; rewrite // inE.
-Qed.
-
-Lemma mem_max_normed A X : X \in |/|*(A; pi) -> pi.-group X /\ A \subset 'N(X).
-Proof. by rewrite inE; move/maxgroupp; move/andP. Qed.
-
-Lemma norm_acts_max_norm P : [acts 'N(P), on |/|*(P; pi) | 'JG].
-Proof.
-apply/subsetP=> z Nz; rewrite !inE; apply/subsetP=> Q; rewrite !inE.
-case/maxgroupP=> qQ maxQ; apply/maxgroupP; rewrite pgroupJ norm_conj_norm //.
-split=> // Y; rewrite sub_conjg /= => qY; move/maxQ=> <-; rewrite ?conjsgKV //.
-by rewrite pgroupJ norm_conj_norm ?groupV.
-Qed.
-
-Lemma trivg_max_norm P : 1%G \in |/|*(P; pi) -> |/|*(P; pi) = [set 1%G].
-Proof.
-move=> max1; apply/eqP; rewrite eqEsubset sub1set max1 andbT.
-apply/subsetP=> Q; rewrite !inE -val_eqE /= in max1 *.
-by case/maxgroupP: max1 => _ max1; move/maxgroupp; move/max1->; rewrite ?sub1G.
-Qed.
-
-Lemma max_normed_uniq A P Q :
- |/|*(A; pi) = [set Q] -> A \subset P -> P \subset 'N(Q) ->
- |/|*(P; pi) = [set Q].
-Proof.
-move=> defAmax sAP nQP; have: Q \in |/|*(A; pi) by rewrite defAmax set11.
-rewrite inE; case/maxgroupP; case/andP=> piQ _ maxQ.
-apply/setP=> X; rewrite !inE -val_eqE /=; apply/maxgroupP/eqP=> [[]|->{X}].
- case/andP=> piX nXP maxX; have nXA := subset_trans sAP nXP.
- have [Y] := max_normed_exists piX nXA.
- by rewrite defAmax; move/set1P->; move/maxX=> -> //; rewrite piQ.
-rewrite piQ; split=> // X; case/andP=> piX nXP sQX.
-by rewrite (maxQ X) // piX (subset_trans sAP).
-Qed.
-
-End Hypothesis7_1.
-
-Notation "|/|_ X ( A ; pi )" := (normed_pgroups X A pi) : group_scope.
-Notation "|/|* ( A ; pi )" := (max_normed_pgroups A pi) : group_scope.
-
-Section Seven.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Local Notation grT := {group gT}.
-Implicit Types H P Q R K M A B : grT.
-Implicit Type p q : nat.
-
-Section NormedConstrained.
-
-Variables (q : nat) (A : grT).
-Let pi := Eval simpl in \pi(A).
-Let K := 'O_pi^'('C(A)).
-Let nsKC : K <| 'C(A) := pcore_normal _ _.
-
-Lemma cent_core_acts_max_norm : [acts K, on |/|*(A; q) | 'JG].
-Proof.
-by rewrite (subset_trans _ (norm_acts_max_norm _ _)) ?cents_norm ?pcore_sub.
-Qed.
-Let actsKmax := actsP cent_core_acts_max_norm.
-
-Hypotheses (cstrA : normed_constrained A) (pi'q : q \notin pi).
-
-Let hyp71 H R :
- A \subset H -> H \proper G -> R \in |/|_H(A; pi^') -> R \subset 'O_pi^'(H).
-Proof. by case: cstrA H R. Qed.
-
-(* This is the observation between B & G, Hypothesis 7.1 and Lemma 7.1. *)
-Remark normed_constrained_Hall : pi^'.-Hall('C(A)) K.
-Proof.
-have [_ ntA prA _] := cstrA; rewrite -[setT]/G in prA.
-rewrite /pHall pcore_pgroup pcore_sub pnatNK /=.
-rewrite -card_quotient ?gFnorm //= -/K.
-apply/pgroupP=> p p_pr; case/Cauchy=> // Kx; case/morphimP=> x Nx Cx ->{Kx}.
-rewrite /order -quotient_cycle //= -/K => def_p; apply/idPn=> pi'p.
-have [P sylP] := Sylow_exists p <[x]>; have [sPx pP _]:= and3P sylP.
-suffices: P \subset K.
- have nKP: P \subset 'N(K) by rewrite (subset_trans sPx) ?cycle_subG.
- rewrite -quotient_sub1 //= -/K (sameP trivgP eqP) trivg_card1.
- rewrite (card_Hall (morphim_pHall _ nKP sylP)) def_p part_pnat_id ?pnat_id //.
- by case: eqP p_pr => // ->.
-suffices sP_pAC: P \subset 'O_pi^'(A <*> 'C(A)).
- rewrite (subset_trans sP_pAC) ?pcore_max ?pcore_pgroup //.
- rewrite /normal gFnorm_trans ?normsG ?joing_subr // andbT.
- rewrite -quotient_sub1; last first.
- by rewrite gFsub_trans // join_subG !(normG, norms_cent).
- rewrite /= -(setIidPr (pcore_sub _ _)) quotientGI ?joing_subr //=.
- rewrite {1}cent_joinEr // quotientMidr coprime_TIg // coprime_morph //.
- by rewrite coprime_pi' ?cardG_gt0 //= -/pi [pnat _ _]pcore_pgroup.
-apply: hyp71; first exact: joing_subl.
- apply: sub_proper_trans (mFT_norm_proper ntA prA).
- by rewrite join_subG normG cent_sub.
-have sPC: P \subset 'C(A) by rewrite (subset_trans sPx) ?cycle_subG.
-rewrite inE /psubgroup cents_norm 1?centsC // andbT.
-rewrite (subset_trans sPC) ?joing_subr //=.
-by apply: sub_in_pnat pP => p' _; move/eqnP->.
-Qed.
-Let hallK := normed_constrained_Hall.
-
-(* This is B & G, Lemma 7.1. *)
-Lemma normed_constrained_meet_trans Q1 Q2 H :
- A \subset H -> H \proper G -> Q1 \in |/|*(A; q) -> Q2 \in |/|*(A; q) ->
- Q1 :&: H != 1 -> Q2 :&: H != 1 ->
- exists2 k, k \in K & Q2 :=: Q1 :^ k.
-Proof.
-move: {2}_.+1 (ltnSn (#|G| - #|Q1 :&: Q2|)) => m.
-elim: m => // m IHm in H Q1 Q2 * => geQ12m sAH prHG maxQ1 maxQ2 ntHQ1 ntHQ2.
-have:= maxQ1; rewrite inE => /maxgroupP[/andP[qQ1 nQ1A] maxQ1P].
-have:= maxQ2; rewrite inE => /maxgroupP[/andP[qQ2 nQ2A] maxQ2P].
-have prQ12: Q1 :&: Q2 \proper G.
- rewrite properT; apply: contraNneq (mFT_nonSolvable gT) => <-.
- by apply: pgroup_sol (pgroupS _ qQ1); rewrite subsetIl.
-wlog defH: H prHG sAH ntHQ1 ntHQ2 / Q1 :&: Q2 != 1 -> H :=: 'N(Q1 :&: Q2).
- case: (eqVneq (Q1 :&: Q2) 1) => [-> | ntQ12] IH.
- by apply: (IH H) => //; case/eqP.
- apply: (IH 'N(Q1 :&: Q2)%G); rewrite ?normsI ?mFT_norm_proper //;
- apply: contra ntQ12; rewrite -!subG1; apply: subset_trans;
- by rewrite subsetI normG (subsetIl, subsetIr).
-pose L := 'O_pi^'(H); have sLH: L \subset H := pcore_sub _ _.
-have [nLA coLA solL]: [/\ A \subset 'N(L), coprime #|L| #|A| & solvable L].
- rewrite gFnorm_trans ?normsG // coprime_sym coprime_pi' ?cardG_gt0 //.
- by rewrite -pgroupE pcore_pgroup (solvableS sLH) ?mFT_sol.
-have Qsyl Q: Q \in |/|*(A; q) -> Q :&: H != 1 ->
- exists R : {group _}, [/\ q.-Sylow(L) R, A \subset 'N(R) & Q :&: H \subset R].
-- case/mem_max_normed=> qQ nQA ntQH.
- have qQH: q.-group (Q :&: H) by rewrite (pgroupS _ qQ) ?subsetIl.
- have nQHA: A \subset 'N(Q :&: H) by rewrite normsI // normsG.
- apply: coprime_Hall_subset => //; apply: (hyp71) => //.
- rewrite inE nQHA /psubgroup subsetIr andbT.
- by apply: sub_in_pnat qQH => p _; move/eqnP->.
-have [R1 [sylR1 nR1A sQR1]] := Qsyl _ maxQ1 ntHQ1.
-have [R2 [sylR2 nR2A sQR2]] := Qsyl _ maxQ2 ntHQ2.
-have [h Ch defR2] := coprime_Hall_trans nLA coLA solL sylR2 nR2A sylR1 nR1A.
-have{Ch} [Hh Kh]: h \in H /\ h \in K.
- case/setIP: Ch => Lh Ch; rewrite (subsetP sLH) //.
- rewrite (mem_normal_Hall hallK (pcore_normal _ _)) //.
- by rewrite (mem_p_elt _ Lh) ?pcore_pgroup.
-have [Q3 maxQ3 sR2Q3] := max_normed_exists (pHall_pgroup sylR2) nR2A.
-have maxQ1h: (Q1 :^ h)%G \in |/|*(A; q) by rewrite actsKmax.
-case: (eqsVneq Q1 Q2) => [| neQ12]; first by exists 1; rewrite ?group1 ?conjsg1.
-have ntHQ3: Q3 :&: H != 1.
- by apply: subG1_contra ntHQ2; rewrite subsetI subsetIr (subset_trans sQR2).
-have ntHQ1h: (Q1 :^ h) :&: H != 1.
- by move: ntHQ1; rewrite !trivg_card1 -(cardJg _ h) conjIg (conjGid Hh).
-suff [prI1 prI2]: Q1 :&: Q2 \proper Q1 :&: R1 /\ Q1 :&: Q2 \proper Q2 :&: R2.
- have: #|G| - #|(Q1 :^ h) :&: Q3| < m.
- rewrite ltnS in geQ12m; apply: leq_trans geQ12m.
- rewrite ltn_sub2l ?(proper_card prQ12) // -(cardJg _ h) proper_card //.
- by rewrite (proper_sub_trans _ (setIS _ sR2Q3)) // defR2 -conjIg properJ.
- have: #|G| - #|Q3 :&: Q2| < m.
- rewrite ltnS in geQ12m; apply: leq_trans geQ12m.
- rewrite ltn_sub2l ?proper_card // (proper_sub_trans prI2) //.
- by rewrite setIC setISS.
- case/(IHm H) => // k2 Kk2 defQ2; case/(IHm H) => // k3 Kk3 defQ3.
- by exists (h * k3 * k2); rewrite ?groupM ?conjsgM // -defQ3.
-case: (eqVneq (Q1 :&: Q2) 1) => [-> | ntQ12].
- by rewrite !proper1G; split; [move: ntHQ1 | move: ntHQ2];
- apply: subG1_contra; rewrite subsetI subsetIl.
-rewrite -(setIidPr (subset_trans (pHall_sub sylR1) sLH)) setIA.
-rewrite -(setIidPr (subset_trans (pHall_sub sylR2) sLH)) setIA.
-rewrite (setIidPl sQR1) (setIidPl sQR2) {}defH //.
-have nilQ1 := pgroup_nil qQ1; have nilQ2 := pgroup_nil qQ2.
-rewrite !nilpotent_proper_norm /proper ?subsetIl ?subsetIr ?subsetI ?subxx //=.
- by rewrite andbT; apply: contra neQ12 => sQ21; rewrite (maxQ2P Q1) ?qQ1.
-by apply: contra neQ12 => sQ12; rewrite (maxQ1P Q2) ?qQ2.
-Qed.
-
-(* This is B & G, Theorem 7.2. *)
-Theorem normed_constrained_rank3_trans :
- 'r('Z(A)) >= 3 -> [transitive K, on |/|*(A; q) | 'JG].
-Proof.
-case/rank_geP=> B /nElemP[p]; rewrite !inE subsetI -2!andbA.
-case/and4P=> sBA cAB abelB mB3; have [_ cBB _] := and3P abelB.
-have q'B: forall Q, q.-group Q -> coprime #|Q| #|B|.
- move=> Q qQ; rewrite coprime_sym (coprimeSg sBA) ?coprime_pi' //.
- exact: pi_pnat qQ _.
-have [Q1 maxQ1 _] := max_normed_exists (pgroup1 _ q) (norms1 A).
-apply/imsetP; exists Q1 => //; apply/setP=> Q2.
-apply/idP/imsetP=> [maxQ2|[k Kk] ->]; last by rewrite actsKmax.
-have [qQ1 nQ1A]:= mem_max_normed maxQ1; have [qQ2 nQ2A]:= mem_max_normed maxQ2.
-case: (eqVneq Q1 1%G) => [trQ1 | ntQ1].
- exists 1; rewrite ?group1 // act1; apply/eqP.
- by rewrite trivg_max_norm -trQ1 // inE in maxQ2.
-case: (eqVneq Q2 1%G) => [trQ2 | ntQ2].
- by case/negP: ntQ1; rewrite trivg_max_norm -trQ2 // inE in maxQ1 *.
-have: [exists (C : grT | 'C_Q1(C) != 1), cyclic (B / C) && (C <| B)].
- apply: contraR ntQ1 => trQ1; have: B \subset 'N(Q1) := subset_trans sBA nQ1A.
- rewrite -val_eqE -subG1 /=; move/coprime_abelian_gen_cent <-; rewrite ?q'B //.
- rewrite gen_subG; apply/bigcupsP=> C cocyC; rewrite subG1.
- by apply: contraR trQ1 => ntCC; apply/existsP; exists C; rewrite ntCC.
-case/existsP=> C /and3P[ntCQ1 cycBC nsCB]; have [sCB nCB]:= andP nsCB.
-have{mB3} ncycC: ~~ cyclic C.
- rewrite (abelem_cyclic (quotient_abelem _ abelB)) ?card_quotient // in cycBC.
- rewrite -divgS // logn_div ?cardSg // leq_subLR addn1 (eqP mB3) in cycBC.
- by rewrite (abelem_cyclic (abelemS sCB abelB)) -ltnNge.
-have: [exists (z | 'C_Q2[z] != 1), z \in C^#].
- apply: contraR ntQ2 => trQ2; have:= subset_trans sCB (subset_trans sBA nQ2A).
- rewrite -[_ == _]subG1 /=.
- move/coprime_abelian_gen_cent1 <-; rewrite ?(abelianS sCB) //; last first.
- by rewrite (coprimegS sCB) ?q'B.
- rewrite gen_subG; apply/bigcupsP=> z Cz.
- by apply: contraR trQ2 => ntCz; apply/existsP; exists z; rewrite -subG1 ntCz.
-case/existsP=> z; rewrite !inE => /and3P[ntzQ2 ntz Cz].
-have prCz: 'C[z] \proper G by rewrite -cent_cycle mFT_cent_proper ?cycle_eq1.
-have sACz: A \subset 'C[z] by rewrite sub_cent1 (subsetP cAB) ?(subsetP sCB).
-have [|//|k Kk defQ2]:= normed_constrained_meet_trans sACz prCz maxQ1 maxQ2.
- by apply: subG1_contra ntCQ1; rewrite setIS //= -cent_cycle centS ?cycle_subG.
-by exists k => //; apply: val_inj.
-Qed.
-
-(* This is B & G, Theorem 7.3. *)
-Theorem normed_constrained_rank2_trans :
- q %| #|'C(A)| -> 'r('Z(A)) >= 2 -> [transitive K, on |/|*(A; q) | 'JG].
-Proof.
-move=> qC /rank_geP[B /nElemP[p /setIdP[/setIdP[/subsetIP[sBA cAB] abelB] oB]]].
-have [_ cBB _] := and3P abelB.
-have{abelB oB} ncycB: ~~ cyclic B by rewrite (abelem_cyclic abelB) (eqP oB).
-have [R0 sylR0] := Sylow_exists q 'C(A); have [cAR0 qR0 _] := and3P sylR0.
-have nR0A: A \subset 'N(R0) by rewrite cents_norm // centsC.
-have{nR0A} [R maxR sR0R] := max_normed_exists qR0 nR0A.
-apply/imsetP; exists R => //; apply/setP=> Q.
-apply/idP/imsetP=> [maxQ|[k Kk] ->]; last by rewrite actsKmax.
-have [qR nRA]:= mem_max_normed maxR; have [qQ nQA]:= mem_max_normed maxQ.
-have [R1 | ntR] := eqVneq R 1%G.
- rewrite trivg_max_norm -R1 // in maxQ.
- by exists 1; rewrite ?group1 ?act1 ?(set1P maxQ).
-have ntQ: Q != 1%G.
- by apply: contra ntR => Q1; rewrite trivg_max_norm -(eqP Q1) // inE in maxR *.
-have ntRC: 'C_R(A) != 1.
- have sR0CR: R0 \subset 'C_R(A) by rewrite subsetI sR0R.
- suffices: R0 :!=: 1 by apply: subG1_contra.
- move: ntR; rewrite -!cardG_gt1 -(part_pnat_id qR) (card_Hall sylR0).
- by rewrite !p_part_gt1 !mem_primes !cardG_gt0 qC => /and3P[->].
-have: [exists (z | 'C_Q[z] != 1), z \in B^#].
- apply: contraR ntQ => trQ; have:= subset_trans sBA nQA.
- rewrite -[_ == _]subG1=> /coprime_abelian_gen_cent1 <- //; last first.
- by rewrite coprime_sym (coprimeSg sBA) ?coprime_pi' /pgroup ?(pi_pnat qQ).
- rewrite gen_subG; apply/bigcupsP=> z Cz; rewrite subG1.
- by apply: contraR trQ => ntCz; apply/existsP; exists z; rewrite ntCz.
-case/existsP=> z; rewrite 2!inE => /and3P[ntzQ ntz Bz].
-have prCz: 'C[z] \proper G by rewrite -cent_cycle mFT_cent_proper ?cycle_eq1.
-have sACz: A \subset 'C[z] by rewrite sub_cent1 (subsetP cAB).
-have [|//|k Kk defQ2]:= normed_constrained_meet_trans sACz prCz maxR maxQ.
- apply: subG1_contra ntRC; rewrite setIS //=.
- by rewrite -cent_cycle centS // cycle_subG (subsetP sBA).
-by exists k => //; apply: val_inj.
-Qed.
-
-(* This is B & G, Theorem 7.4. *)
-Theorem normed_trans_superset P :
- A <|<| P -> pi.-group P -> [transitive K, on |/|*(A; q) | 'JG] ->
- [/\ 'C_K(P) = 'O_pi^'('C(P)),
- [transitive 'O_pi^'('C(P)), on |/|*(P; q) | 'JG],
- |/|*(P; q) \subset |/|*(A; q)
- & {in |/|*(P; q), forall Q, P :&: 'N(P)^`(1) \subset 'N(Q)^`(1)
- /\ 'N(P) = 'C_K(P) * 'N_('N(P))(Q)}].
-Proof.
-move=> snAP piP trnK; set KP := 'O_pi^'('C(P)).
-have defK B: A \subset B -> 'C_K(B) = 'O_pi^'('C(B)).
- move=> sAB; apply/eqP; rewrite eqEsubset {1}setIC pcoreS ?centS // subsetI.
- by rewrite gFsub (sub_Hall_pcore hallK) ?pcore_pgroup // gFsub_trans ?centS.
-suffices: [transitive KP, on |/|*(P; q) | 'JG] /\ |/|*(P; q) \subset |/|*(A; q).
- have nsKPN: KP <| 'N(P) := gFnormal_trans _ (cent_normal _).
- case=> trKP smnPA; rewrite (defK _ (subnormal_sub snAP)); split=> // Q maxQ.
- have defNP: KP * 'N_('N(P))(Q) = 'N(P).
- rewrite -(astab1JG Q) -normC; last by rewrite subIset 1?normal_norm.
- apply/(subgroup_transitiveP maxQ); rewrite ?normal_sub //=.
- by rewrite (atrans_supgroup _ trKP) ?norm_acts_max_norm ?normal_sub.
- split=> //; move/pprod_focal_coprime: defNP => -> //.
- - by rewrite subIset // orbC commgSS ?subsetIr.
- - by rewrite subsetI normG; case/mem_max_normed: maxQ.
- by rewrite (p'nat_coprime (pcore_pgroup _ _)).
-elim: {P}_.+1 {-2}P (ltnSn #|P|) => // m IHm P lePm in KP piP snAP *.
-wlog{snAP} [B maxnB snAB]: / {B : grT | maxnormal B P P & A <|<| B}.
- case/subnormalEr: snAP => [|[D [snAD nDP prDP]]]; first by rewrite /KP => <-.
- have [B maxnB sDB]: {B : grT | maxnormal B P P & D \subset B}.
- by apply: maxgroup_exists; rewrite prDP normal_norm.
- apply; exists B => //; apply: subnormal_trans snAD (normal_subnormal _).
- by apply: normalS sDB _ nDP; case/andP: (maxgroupp maxnB); case/andP.
-have [prBP nBP] := andP (maxgroupp maxnB); have sBP := proper_sub prBP.
-have{lePm}: #|B| < m by apply: leq_trans (proper_card prBP) _.
-case/IHm=> {IHm}// [|trnB smnBA]; first by rewrite (pgroupS sBP).
-have{maxnB} abelPB: is_abelem (P / B).
- apply: charsimple_solvable (maxnormal_charsimple _ maxnB) _ => //.
- have [_ ntA _ _] := cstrA; have sAB := subnormal_sub snAB.
- by apply: mFT_quo_sol; apply: contraL sAB; move/eqP->; rewrite subG1.
-have{abelPB} [p p_pr pPB]: exists2 p, prime p & p.-group (P / B).
- by case/is_abelemP: abelPB => p p_pr; case/andP; exists p.
-have{prBP} pi_p: p \in pi.
- case/pgroup_pdiv: pPB => [|_ pPB _].
- by rewrite -subG1 quotient_sub1 // proper_subn.
- by apply: pgroupP p_pr pPB; apply: quotient_pgroup.
-pose S := |/|*(B; q); have p'S: #|S| %% p != 0.
- have pi'S: pi^'.-nat #|S| := pnat_dvd (atrans_dvd trnB) (pcore_pgroup _ _).
- by rewrite -prime_coprime // (pnat_coprime _ pi'S) ?pnatE.
-have{p'S} [Q S_Q nQP]: exists2 Q, Q \in S & P \subset 'N(Q).
- have sTSB: setT \subset G / B by rewrite -im_quotient quotientS ?subsetT.
- have modBE: {in P & S, forall x Q, ('JG %% B) Q (coset B x) = 'JG Q x}%act.
- move=> x Q Px; rewrite inE; move/maxgroupp; case/andP=> _ nQB.
- by rewrite /= modactE ?(subsetP nBP) ?afixJG ?setTI ?inE.
- have actsPB: [acts P / B, on S | 'JG %% B \ sTSB].
- apply/subsetP=> _ /morphimP[x Nx Px ->].
- rewrite !inE; apply/subsetP=> Q S_Q; rewrite inE /= modBE //.
- by rewrite (actsP (norm_acts_max_norm q B)).
- move: p'S; rewrite (pgroup_fix_mod pPB actsPB); set nQ := #|_|.
- case: (posnP nQ) => [->|]; first by rewrite mod0n.
- rewrite lt0n; case/existsP=> Q /setIP[Q_S fixQ]; exists Q => //.
- apply/normsP=> x Px; apply: congr_group; have Nx := subsetP nBP x Px.
- by have:= afixP fixQ (coset B x); rewrite /= modBE ?mem_morphim //= => ->.
-have [qQ _]:= mem_max_normed S_Q.
-have{qQ nQP} [Q0 maxQ0 sQQ0] := max_normed_exists qQ nQP.
-have [_ nQ0P]:= mem_max_normed maxQ0.
-have actsKmnP: [acts 'O_pi^'('C(P)), on |/|*(P; q) | 'JG].
- by rewrite (subset_trans _ (norm_acts_max_norm q P)) // cents_norm ?pcore_sub.
-case nt_mnP: (1%G \in |/|*(P; q)) => [|{Q S_Q sQQ0}].
- rewrite atrans_acts_card actsKmnP trivg_max_norm // imset_set1 in maxQ0 *.
- have <-: Q = 1%G by apply/trivGP; rewrite -(congr_group (set1P maxQ0)).
- by rewrite cards1 sub1set (subsetP smnBA).
-have sAB := subnormal_sub snAB; have sAP := subset_trans sAB sBP.
-have smnP_S: |/|*(P; q) \subset S.
- apply/subsetP=> Q1 maxQ1; have [qQ1 nQ1P] := mem_max_normed maxQ1.
- have ntQ1: Q1 != 1%G by case: eqP nt_mnP maxQ1 => // -> ->.
- have prNQ1: 'N(Q1) \proper G := mFT_norm_proper ntQ1 (mFT_pgroup_proper qQ1).
- have nQ1A: A \subset 'N(Q1) := subset_trans sAP nQ1P.
- have [Q2 maxQ2 sQ12] := max_normed_exists qQ1 (subset_trans sBP nQ1P).
- have [qQ2 nQ2B] := mem_max_normed maxQ2; apply: etrans maxQ2; congr in_mem.
- apply: val_inj; suffices: q.-Sylow(Q2) Q1 by move/pHall_id=> /= ->.
- have qNQ2: q.-group 'N_Q2(Q1) by rewrite (pgroupS _ qQ2) ?subsetIl.
- pose KN := 'O_pi^'('N(Q1)); have sNQ2_KN: 'N_Q2(Q1) \subset KN.
- rewrite hyp71 // inE normsI ?norms_norm ?(subset_trans sAB nQ2B) //=.
- by rewrite /psubgroup subsetIr andbT; apply: pi_pnat qNQ2 _.
- rewrite -Sylow_subnorm (pHall_subl _ sNQ2_KN) ?subsetI ?sQ12 ?normG //= -/KN.
- suff: exists Q3 : grT, [/\ q.-Sylow(KN) Q3, P \subset 'N(Q3) & Q1 \subset Q3].
- move: maxQ1; rewrite inE; case/maxgroupP=> _ maxQ1 [Q3 [sylQ3 nQ3P sQ13]].
- by rewrite -(maxQ1 Q3) // (pHall_pgroup sylQ3).
- apply: coprime_Hall_subset; rewrite //= -/KN.
- - by rewrite gFnorm_trans ?norms_norm.
- - by rewrite coprime_sym (pnat_coprime piP (pcore_pgroup _ _)).
- - by rewrite (solvableS (pcore_sub _ _)) ?mFT_sol.
- by rewrite pcore_max ?normalG // /pgroup (pi_pnat qQ1).
-split; last exact: subset_trans smnP_S smnBA.
-apply/imsetP; exists Q0 => //; apply/setP=> Q2.
-apply/idP/imsetP=> [maxQ2 | [k Pk ->]]; last by rewrite (actsP actsKmnP).
-have [S_Q0 S_Q2]: Q0 \in S /\ Q2 \in S by rewrite !(subsetP smnP_S).
-pose KB := 'O_pi^'('C(B)); pose KBP := KB <*> P.
-have pi'KB: pi^'.-group KB by apply: pcore_pgroup.
-have nKB_P: P \subset 'N(KB) by rewrite gFnorm_trans ?norms_cent.
-have [k KBk defQ2]:= atransP2 trnB S_Q0 S_Q2.
-have [qQ2 nQ2P] := mem_max_normed maxQ2.
-have hallP: pi.-Hall('N_KBP(Q2)) P.
- have sPN: P \subset 'N_KBP(Q2) by rewrite subsetI joing_subr.
- rewrite pHallE eqn_leq -{1}(part_pnat_id piP) dvdn_leq ?partn_dvd ?cardSg //.
- have ->: #|P| = #|KBP|`_pi.
- rewrite /KBP joingC norm_joinEl // coprime_cardMg ?(pnat_coprime piP) //.
- by rewrite partnM // part_pnat_id // part_p'nat // muln1.
- by rewrite sPN dvdn_leq ?partn_dvd ?cardSg ?cardG_gt0 ?subsetIl.
-have hallPk: pi.-Hall('N_KBP(Q2)) (P :^ k).
- rewrite pHallE -(card_Hall hallP) cardJg eqxx andbT subsetI /=.
- by rewrite defQ2 normJ conjSg conj_subG ?joing_subr // mem_gen // inE KBk.
-have [gz]: exists2 gz, gz \in 'N_KBP(Q2) & P :=: (P :^ k) :^ gz.
- apply: Hall_trans (solvableS (subsetIr _ _) _) hallP hallPk.
- have ntQ2: Q2 != 1%G by case: eqP nt_mnP maxQ2 => // -> ->.
- exact: mFT_sol (mFT_norm_proper ntQ2 (mFT_pgroup_proper qQ2)).
-rewrite [KBP]norm_joinEr //= setIC -group_modr //= setIC -/KB.
-case/imset2P=> g z; case/setIP=> KBg nQ2g Pz ->{gz} defP.
-exists (k * g); last first.
- by apply: val_inj; rewrite /= conjsgM -(normP nQ2g) defQ2.
-rewrite /KP -defK // (subsetP (subsetIl _ 'C(B))) //= setIAC defK // -/KB.
-rewrite -coprime_norm_cent 1?coprime_sym ?(pnat_coprime piP) //= -/KB.
-rewrite inE groupM //; apply/normP.
-by rewrite -{2}(conjsgK z P) (conjGid Pz) {2}defP /= !conjsgM conjsgK.
-Qed.
-
-End NormedConstrained.
-
-(* This is B & G, Proposition 7.5(a). As this is only used in Proposition *)
-(* 10.10, under the assumption A \in E*_p(G), we avoid the in_pmaxElemE *)
-(* detour A = [set x in 'C_G(A) | x ^+ p == 1], and just use A \in E*_p(G). *)
-Proposition plength_1_normed_constrained p A :
- A :!=: 1 -> A \in 'E*_p(G) -> (forall M, M \proper G -> p.-length_1 M) ->
- normed_constrained A.
-Proof.
-move=> ntA EpA pl1subG.
-case/pmaxElemP: (EpA); case/pElemP=> sAG; case/and3P=> pA cAA _ _.
-have prA: A \proper G := sub_proper_trans cAA (mFT_cent_proper ntA).
-split=> // X Y sAX prX; case/setIdP; case/andP=> sYX p'Y nYA.
-have pl1X := pl1subG _ prX; have solX := mFT_sol prX.
-have [p_pr _ [r oApr]] := pgroup_pdiv pA ntA.
-have oddp: odd p by move: (mFT_odd A); rewrite oApr odd_exp.
-have def_pi: \pi(A)^' =i p^'.
- by move=> q; rewrite inE /= oApr pi_of_exp // pi_of_prime.
-have{p'Y} p'Y : p^'.-group Y by rewrite -(eq_pgroup _ def_pi).
-rewrite (eq_pcore _ def_pi) (@plength1_norm_pmaxElem _ p X A) //.
-by rewrite (subsetP (pmaxElemS p (subsetT _))) // setIC 2!inE sAX.
-Qed.
-
-(* This is B & G, Proposition 7.5(b). *)
-Proposition SCN_normed_constrained p P A :
- p.-Sylow(G) P -> A \in 'SCN_2(P) -> normed_constrained A.
-Proof.
-move=> sylP; rewrite 2!inE -andbA => /and3P[nsAP /eqP defCA lt1mA].
-have [sAP nAP]:= andP nsAP.
-have pP := pHall_pgroup sylP; have pA := pgroupS sAP pP.
-have abA: abelian A by rewrite /abelian -{1}defCA subsetIr.
-have prP: P \proper G := mFT_pgroup_proper pP.
-have ntA: A :!=: 1 by rewrite -rank_gt0 ltnW.
-pose pi := \pi(A); simpl in pi.
-have [p_pr pdvA [r oApr]] := pgroup_pdiv pA ntA.
-have{r oApr} def_pi: pi =i (p : nat_pred).
- by move=> p'; rewrite !inE oApr primes_exp // primes_prime ?inE.
-have def_pi' := eq_negn def_pi; have defK := eq_pcore _ def_pi'.
-pose Z := 'Ohm_1('Z(P)); have sZ_ZP: Z \subset 'Z(P) by apply: Ohm_sub.
-have sZP_A: 'Z(P) \subset A by rewrite -defCA setIS ?centS.
-have sZA := subset_trans sZ_ZP sZP_A.
-have nsA1: 'Ohm_1(A) <| P by apply: gFnormal_trans.
-pose inZor1 B := B \subset Z \/ #|Z| = p /\ Z \subset B.
-have [B [E2_B nsBP sBZ]]: exists B, [/\ B \in 'E_p^2(A), B <| P & inZor1 B].
- have pZP: p.-group 'Z(P) by apply: pgroupS (center_sub _) pP.
- have pZ: p.-group Z by apply: pgroupS sZ_ZP pZP.
- have abelZ: p.-abelem Z by rewrite Ohm1_abelem ?center_abelian.
- have nsZP: Z <| P := sub_center_normal sZ_ZP; have [sZP nZP] := andP nsZP.
- case: (eqVneq Z 1).
- rewrite -(setIidPr sZ_ZP); move/TI_Ohm1; rewrite setIid.
- by move/(trivg_center_pgroup pP)=> P1; rewrite -subG1 -P1 sAP in ntA.
- case/(pgroup_pdiv pZ)=> _ _ [[|k] /=]; rewrite -/Z => oZ; last first.
- have: 2 <= 'r_p(Z) by rewrite p_rank_abelem // oZ pfactorK.
- case/p_rank_geP=> B; rewrite /= -/Z => Ep2Z_B; exists B.
- rewrite (subsetP (pnElemS _ _ sZA)) //.
- case/setIdP: Ep2Z_B; case/setIdP=> sBZ _ _; split=> //; last by left.
- by rewrite sub_center_normal ?(subset_trans sBZ).
- pose BZ := ('Ohm_1(A) / Z) :&: 'Z(P / Z).
- have ntBz: BZ != 1.
- rewrite meet_center_nil ?quotient_nil ?(pgroup_nil pP) ?quotient_normal //.
- rewrite -subG1 quotient_sub1 ?(subset_trans (normal_sub nsA1) nZP) //= -/Z.
- apply: contraL lt1mA => sA1Z; rewrite -(pfactorK 1 p_pr) -oZ -rank_Ohm1.
- by rewrite -(rank_abelem abelZ) -leqNgt rankS.
- have lt1A1: 1 < logn p #|'Ohm_1(A)| by rewrite -p_rank_abelian -?rank_pgroup.
- have [B [sBA1 nsBP oB]] := normal_pgroup pP nsA1 lt1A1.
- exists B; split=> //; last do [right; split=> //].
- rewrite 2!inE (subset_trans sBA1) ?Ohm_sub // oB pfactorK //.
- by rewrite (abelemS sBA1) ?Ohm1_abelem.
- apply/idPn=> s'BZ; have: B :&: Z = 1 by rewrite setIC prime_TIg ?oZ.
- move/TI_Ohm1; apply/eqP; rewrite meet_center_nil ?(pgroup_nil pP) //.
- by rewrite -cardG_gt1 oB (ltn_exp2l 0 _ (prime_gt1 p_pr)).
-split; rewrite ?(sub_proper_trans sAP) // => X Y sAX prX.
-rewrite inE defK -andbA (eq_pgroup _ def_pi'); case/and3P=> sYX p'Y nYA.
-move: E2_B; rewrite 2!inE -andbA; case/and3P=> sBA abelB dimB2.
-have [pB cBB _] := and3P abelB.
-have ntB: B :!=: 1 by case: (eqsVneq B 1) dimB2 => // ->; rewrite cards1 logn1.
-have cBA b: b \in B -> A \subset 'C[b].
- by move=> Bb; rewrite -cent_set1 centsC sub1set (subsetP abA) ?(subsetP sBA).
-have solCB (b : gT): b != 1 -> solvable 'C[b].
- by move=> ntb; rewrite mFT_sol ?mFT_cent1_proper.
-wlog{sAX prX} [b B'b defX]: X Y p'Y nYA sYX / exists2 b, b \in B^# & 'C[b] = X.
- move=> IH; have nYB := subset_trans sBA nYA.
- rewrite -(coprime_abelian_gen_cent1 cBB _ nYB); last first.
- - by rewrite coprime_sym (pnat_coprime pB).
- - apply: contraL dimB2 => /cyclicP[x defB].
- have Bx: x \in B by rewrite defB cycle_id.
- rewrite defB -orderE (abelem_order_p abelB Bx) ?(pfactorK 1) //.
- by rewrite -cycle_eq1 -defB.
- rewrite gen_subG; apply/bigcupsP=> b B'b.
- have [ntb Bb]:= setD1P B'b; have sYbY: 'C_Y[b] \subset Y := subsetIl _ _.
- have{IH} sYbKb: 'C_Y[b] \subset 'O_p^'('C[b]).
- rewrite IH ?(pgroupS sYbY) ?subsetIr //; last by exists b.
- by rewrite normsI // ?normsG ?cBA.
- have{sYbKb} sYbKXb: 'C_Y[b] \subset 'O_p^'('C_X(<[b]>)).
- apply: subset_trans (pcoreS _ (subsetIr _ _)).
- by rewrite /= cent_gen cent_set1 subsetI setSI.
- rewrite (subset_trans sYbKXb) // p'core_cent_pgroup ?mFT_sol //.
- rewrite /psubgroup ?(pgroupS _ pB) cycle_subG //.
- by rewrite (subsetP sAX) ?(subsetP sBA).
-wlog Zb: b X Y defX B'b p'Y nYA sYX / b \in Z.
- move=> IH; case Zb: (b \in Z); first exact: IH Zb.
- case/setD1P: B'b => ntb Bb; have solX := solCB b ntb; rewrite defX in solX.
- case: sBZ => [sBZ | [oZ sZB]]; first by rewrite (subsetP sBZ) in Zb.
- have defB: Z * <[b]> = B.
- apply/eqP; rewrite eqEcard mulG_subG sZB cycle_subG Bb.
- have obp := abelem_order_p abelB Bb ntb.
- rewrite (card_pgroup pB) /= (eqP dimB2) TI_cardMg -/#[_] ?oZ ?obp //.
- rewrite -obp in p_pr; case: (prime_subgroupVti [group of Z] p_pr) => //.
- by rewrite cycle_subG Zb.
- pose P1 := P :&: X; have sP1P: P1 \subset P := subsetIl _ _.
- have pP1 := pgroupS sP1P pP.
- have [P2 sylP2 sP12] := Sylow_superset (subsetIr _ _) pP1.
- have defP1: P1 = 'C_P(B).
- rewrite -defB centM /= -/Z setIA /cycle cent_gen cent_set1 defX.
- by rewrite [P :&: _](setIidPl _) // centsC (subset_trans sZ_ZP) ?subsetIr.
- have dimPP1: logn p #|P : P1| <= 1.
- by rewrite defP1 logn_quotient_cent_abelem ?normal_norm ?(eqP dimB2).
- have{dimPP1} nsP12: P1 <| P2.
- have pP2 := pHall_pgroup sylP2.
- have: logn p #|P2 : P1| <= 1.
- apply: leq_trans dimPP1; rewrite dvdn_leq_log //.
- rewrite -(dvdn_pmul2l (cardG_gt0 [group of P1])) !Lagrange ?subsetIl //.
- rewrite -(part_pnat_id pP2) (card_Hall sylP).
- by rewrite partn_dvd ?cardSg ?subsetT.
- rewrite -(pfactorK 1 p_pr) -pfactor_dvdn ?prime_gt0 // -p_part.
- rewrite part_pnat_id ?(pnat_dvd (dvdn_indexg _ _)) //=.
- case: (primeP p_pr) => _ dv_p; move/dv_p=> {dv_p}.
- case/pred2P=> oP21; first by rewrite -(index1g sP12 oP21) normal_refl.
- by rewrite (p_maximal_normal pP2) ?p_index_maximal ?oP21.
- have nsZP1_2: 'Z(P1) <| P2 by rewrite gFnormal_trans.
- have sZKp: Z \subset 'O_{p^', p}(X).
- suff: 'Z(P1) \subset 'O_{p^', p}(X).
- apply: subset_trans; rewrite subsetI {1}defP1 (subset_trans sZB).
- by rewrite (subset_trans sZ_ZP) ?subIset // orbC centS.
- by rewrite subsetI normal_sub.
- apply: odd_p_abelian_constrained sylP2 (center_abelian _) nsZP1_2 => //.
- exact: mFT_odd.
- have coYZ: coprime #|Y| #|Z|.
- by rewrite oZ coprime_sym (pnat_coprime _ p'Y) ?pnatE ?inE.
- have nYZ := subset_trans sZA nYA.
- have <-: [~: Y, Z] * 'C_Y(Z) = Y.
- exact: coprime_cent_prod (solvableS sYX solX).
- set K := 'O_p^'(X); have [nKY nKZ]: Y \subset 'N(K) /\ Z \subset 'N(K).
- by rewrite !gFnorm_trans ?(subset_trans sZA) ?normsG // -defX cBA.
- rewrite mul_subG //.
- have coYZK: coprime #|Y / K| #|'O_p(X / K)|.
- by rewrite coprime_sym coprime_morphr ?(pnat_coprime (pcore_pgroup _ _)).
- rewrite -quotient_sub1 ?comm_subG // -(coprime_TIg coYZK) subsetI.
- rewrite /= -quotient_pseries2 !quotientS ?commg_subl //.
- by rewrite (subset_trans (commgSS sYX sZKp)) ?commg_subr //= gFnorm.
- have: 'O_p^'('C_X(Z)) \subset K.
- rewrite p'core_cent_pgroup // /psubgroup /pgroup oZ pnat_id //.
- by rewrite -defX (subset_trans sZA) ?cBA.
- apply: subset_trans; apply: subset_trans (pcoreS _ (subsetIr _ _)).
- have: cyclic Z by rewrite prime_cyclic ?oZ.
- case/cyclicP=> z defZ; have Zz: z \in Z by rewrite defZ cycle_id.
- rewrite subsetI setSI //= (IH z) ?subsetIr ?(pgroupS (subsetIl _ _)) //.
- - by rewrite defZ /= cent_gen cent_set1.
- - rewrite !inE -cycle_eq1 -defZ trivg_card_le1 oZ -ltnNge prime_gt1 //=.
- by rewrite (subsetP sZB).
- by rewrite normsI // norms_cent // cents_norm // centsC (subset_trans sZA).
-set K := 'O_p^'(X); have nsKX: K <| X by apply: pcore_normal.
-case/setD1P: B'b => ntb Bb.
-have [sAX solX]: A \subset X /\ solvable X by rewrite -defX cBA ?solCB.
-have sPX: P \subset X.
- by rewrite -defX -cent_set1 centsC sub1set; case/setIP: (subsetP sZ_ZP b Zb).
-have [nKA nKY nKP]: [/\ A \subset 'N(K), Y \subset 'N(K) & P \subset 'N(K)].
- by rewrite !(subset_trans _ (normal_norm nsKX)).
-have sylPX: p.-Sylow(X) P by apply: pHall_subl (subsetT _) sylP.
-have sAKb: A \subset 'O_{p^', p}(X).
- exact: (odd_p_abelian_constrained (mFT_odd _)) abA nsAP.
-have coYZK: coprime #|Y / K| #|'O_p(X / K)|.
- by rewrite coprime_sym coprime_morphr ?(pnat_coprime (pcore_pgroup _ _)).
-have cYAq: A / K \subset 'C_('O_p(X / K))(Y / K).
- rewrite subsetI -quotient_pseries2 quotientS //= (sameP commG1P trivgP).
- rewrite /= -quotientR // -(coprime_TIg coYZK) subsetI /= -quotient_pseries2.
- rewrite !quotientS ?commg_subr // (subset_trans (commgSS sAKb sYX)) //.
- by rewrite commg_subl /= gFnorm.
-have cYKq: Y / K \subset 'C('O_p(X / K)).
- apply: coprime_nil_faithful_cent_stab => /=.
- - by rewrite gFnorm_trans ?normsG ?quotientS.
- - by rewrite coprime_sym.
- - exact: pgroup_nil (pcore_pgroup _ _).
- apply: subset_trans (cYAq); rewrite -defCA -['C_P(A) / K](morphim_restrm nKP).
- rewrite injm_cent ?ker_restrm ?ker_coset ?morphim_restrm -?quotientE //.
- rewrite setIid (setIidPr sAP) setISS ?centS //.
- by rewrite pcore_sub_Hall ?morphim_pHall.
- by rewrite coprime_TIg ?(pnat_coprime _ (pcore_pgroup _ _)).
-rewrite -quotient_sub1 //= -/K -(coprime_TIg coYZK) subsetI subxx /=.
-rewrite -Fitting_eq_pcore ?trivg_pcore_quotient // in cYKq *.
-apply: subset_trans (cent_sub_Fitting (quotient_sol _ solX)).
-by rewrite subsetI quotientS.
-Qed.
-
-(* This is B & G, Theorem 7.6 (the Thompson Transitivity Theorem). *)
-Theorem Thompson_transitivity p q A :
- A \in 'SCN_3[p] -> q \in p^' ->
- [transitive 'O_p^'('C(A)), on |/|*(A; q) | 'JG].
-Proof.
-case/bigcupP=> P; rewrite 2!inE => sylP /andP[SCN_A mA3].
-have [defZ def_pi']: 'Z(A) = A /\ \pi(A)^' =i p^'.
- rewrite inE -andbA in SCN_A; case/and3P: SCN_A => sAP _ /eqP defCA.
- case: (eqsVneq A 1) mA3 => /= [-> | ntA _].
- rewrite /rank big1_seq // => p1 _; rewrite /p_rank big1 // => E.
- by rewrite inE; case/andP; move/trivgP->; rewrite cards1 logn1.
- have [p_pr _ [k ->]] := pgroup_pdiv (pgroupS sAP (pHall_pgroup sylP)) ntA.
- split=> [|p1]; last by rewrite !inE primes_exp // primes_prime ?inE.
- by apply/eqP; rewrite eqEsubset subsetIl subsetI subxx -{1}defCA subsetIr.
-rewrite -(eq_pcore _ def_pi') -def_pi' => pi'q.
-apply: normed_constrained_rank3_trans; rewrite ?defZ //.
-by apply: SCN_normed_constrained sylP _; rewrite inE SCN_A ltnW.
-Qed.
-
-End Seven.
-
diff --git a/mathcomp/odd_order/BGsection8.v b/mathcomp/odd_order/BGsection8.v
deleted file mode 100644
index 513d6d1..0000000
--- a/mathcomp/odd_order/BGsection8.v
+++ /dev/null
@@ -1,401 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq div fintype path.
-From mathcomp
-Require Import finset prime fingroup automorphism action gproduct gfunctor.
-From mathcomp
-Require Import center commutator pgroup gseries nilpotent sylow abelian maximal.
-From mathcomp
-Require Import BGsection1 BGsection5 BGsection6 BGsection7.
-
-(******************************************************************************)
-(* This file covers B & G, section 8, i.e., the proof of two special cases *)
-(* of the Uniqueness Theorem, for maximal groups with Fitting subgroups of *)
-(* rank at least 3. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope.
-
-Section Eight.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Implicit Types H M A X P : {group gT}.
-Implicit Types p q r : nat.
-
-Local Notation "K ` p" := 'O_(nat_pred_of_nat p)(K)
- (at level 8, p at level 2, format "K ` p") : group_scope.
-Local Notation "K ` p" := 'O_(nat_pred_of_nat p)(K)%G : Group_scope.
-
-(* This is B & G, Theorem 8.1(a). *)
-Theorem non_pcore_Fitting_Uniqueness p M A0 :
- M \in 'M -> ~~ p.-group ('F(M)) -> A0 \in 'E*_p('F(M)) -> 'r_p(A0) >= 3 ->
- 'C_('F(M))(A0)%G \in 'U.
-Proof.
-set F := 'F(M) => maxM p'F /pmaxElemP[/=/setIdP[sA0F abelA0] maxA0].
-have [pA0 cA0A0 _] := and3P abelA0; rewrite (p_rank_abelem abelA0) => dimA0_3.
-rewrite (uniq_mmax_subset1 maxM) //= -/F; last by rewrite subIset ?Fitting_sub.
-set A := 'C_F(A0); pose pi := \pi(A).
-have [sZA sAF]: 'Z(F) \subset A /\ A \subset F by rewrite subsetIl setIS ?centS.
-have nilF: nilpotent F := Fitting_nil _.
-have nilZ := nilpotentS (center_sub _) nilF.
-have piZ: \pi('Z(F)) = \pi(F) by rewrite pi_center_nilpotent.
-have def_pi: pi = \pi(F).
- by apply/eq_piP=> q; apply/idP/idP; last rewrite -piZ; apply: piSg.
-have def_nZq: forall q, q \in pi -> 'N('Z(F)`q) = M.
- move=> q; rewrite def_pi -piZ -p_part_gt1.
- rewrite -(card_Hall (nilpotent_pcore_Hall _ nilZ)) cardG_gt1 /= -/F => ntZ.
- by apply: mmax_normal => //=; rewrite !gFnormal_trans.
-have sCqM: forall q, q \in pi -> 'C(A`q) \subset M.
- move=> q /def_nZq <-; rewrite cents_norm // centS //.
- rewrite (sub_Hall_pcore (nilpotent_pcore_Hall _ _)) ?pcore_pgroup //.
- by apply: nilpotentS (Fitting_nil M); apply: subsetIl.
- exact: gFsub_trans.
-have sA0A: A0 \subset A by rewrite subsetI sA0F.
-have pi_p: p \in pi.
- by apply: (piSg sA0A); rewrite -[p \in _]logn_gt0 (leq_trans _ dimA0_3).
-have sCAM: 'C(A) \subset M.
- by rewrite (subset_trans (centS (pcore_sub p _))) ?sCqM.
-have prM: M \proper G := mmax_proper maxM; have solM := mFT_sol prM.
-have piCA: pi.-group('C(A)).
- apply/pgroupP=> q q_pr; case/Cauchy=> // x cAx oxq; apply/idPn=> pi'q.
- have Mx := subsetP sCAM x cAx; pose C := 'C_F(<[x]>).
- have sAC: A \subset C by rewrite subsetI sAF centsC cycle_subG.
- have sCFC_C: 'C_F(C) \subset C.
- by rewrite (subset_trans _ sAC) ?setIS // centS ?(subset_trans _ sAC).
- have cFx: x \in 'C_M(F).
- rewrite inE Mx -cycle_subG coprime_nil_faithful_cent_stab //=.
- by rewrite cycle_subG (subsetP (gFnorm _ _)).
- by rewrite -orderE coprime_pi' ?cardG_gt0 // -def_pi oxq pnatE.
- case/negP: pi'q; rewrite def_pi mem_primes q_pr cardG_gt0 -oxq cardSg //.
- by rewrite cycle_subG (subsetP (cent_sub_Fitting _)).
-have{p'F} pi_alt q: exists2 r, r \in pi & r != q.
- have [<-{q} | ] := eqVneq p q; last by exists p.
- rewrite def_pi; apply/allPn; apply: contra p'F => /allP/=pF.
- by apply/pgroupP=> q q_pr qF; rewrite !inE pF // mem_primes q_pr cardG_gt0.
-have sNZqXq' q X:
- A \subset X -> X \proper G -> 'O_q^'('N_X('Z(F)`q)) \subset 'O_q^'(X).
-- move=> sAX prX.
- have sZqX: 'Z(F)`q \subset X by apply: gFsub_trans (subset_trans sZA sAX).
- have cZqNXZ: 'O_q^'('N_X('Z(F)`q)) \subset 'C('Z(F)`q).
- have coNq'Zq: coprime #|'O_q^'('N_X('Z(F)`q))| #|'Z(F)`q|.
- by rewrite coprime_sym coprime_pcoreC.
- rewrite (sameP commG1P trivgP) -(coprime_TIg coNq'Zq) subsetI commg_subl /=.
- rewrite commg_subr /= andbC gFsub_trans ?subsetIr //=.
- by rewrite gFnorm_trans ?normsG // subsetI sZqX normG.
- have: 'O_q^'('C_X(('Z(F))`q)) \subset 'O_q^'(X).
- by rewrite p'core_cent_pgroup ?mFT_sol // /psubgroup sZqX pcore_pgroup.
- apply: subset_trans; apply: subset_trans (pcoreS _ (subcent_sub _ _)).
- by rewrite !subsetI subxx cZqNXZ gFsub_trans ?subsetIl.
-have sArXq' q r X:
- q \in pi -> q != r -> A \subset X -> X \proper G -> A`r \subset 'O_q^'(X).
-- move=> pi_q r'q sAX prX; apply: subset_trans (sNZqXq' q X sAX prX).
- apply: subset_trans (pcoreS _ (subsetIr _ _)).
- rewrite -setIA (setIidPr (pcore_sub _ _)) subsetI gFsub_trans //= def_nZq //.
- apply: subset_trans (pcore_Fitting _ _); rewrite -/F.
- rewrite (sub_Hall_pcore (nilpotent_pcore_Hall _ nilF)) ?gFsub_trans //.
- by apply: (pi_pnat (pcore_pgroup _ _)); rewrite !inE eq_sym.
-have cstrA: normed_constrained A.
- split=> [||X Y sAX prX].
- - by apply/eqP=> A1; rewrite /pi /= A1 cards1 in pi_p.
- - exact: sub_proper_trans (subset_trans sAF (Fitting_sub _)) prM.
- rewrite !inE -/pi -andbA => /and3P[sYX pi'Y nYA].
- rewrite -bigcap_p'core subsetI sYX; apply/bigcapsP=> [[q /= _] pi_q].
- have [r pi_r q'r] := pi_alt q.
- have{sArXq'} sArXq': A`r \subset 'O_q^'(X) by apply: sArXq'; rewrite 1?eq_sym.
- have cA_CYr: 'C_Y(A`r) \subset 'C(A).
- have coYF: coprime #|Y| #|F|.
- by rewrite coprime_sym coprime_pi' ?cardG_gt0 // -def_pi.
- rewrite (sameP commG1P trivgP) -(coprime_TIg coYF) commg_subI //.
- by rewrite setIS // (subset_trans (sCqM r pi_r)) // gFnorm.
- by rewrite subsetI subsetIl.
- have{cA_CYr} CYr1: 'C_Y(A`r) = 1.
- rewrite -(setIid Y) setIAC coprime_TIg // (coprimeSg cA_CYr) //.
- by rewrite (pnat_coprime piCA).
- have{CYr1} ->: Y :=: [~: Y, A`r].
- rewrite -(mulg1 [~: Y, _]) -CYr1 coprime_cent_prod ?gFsub_trans //.
- rewrite coprime_sym (coprimeSg (pcore_sub _ _)) //= -/A.
- by rewrite coprime_pi' ?cardG_gt0.
- by rewrite mFT_sol // (sub_proper_trans sYX).
- rewrite (subset_trans (commgS _ sArXq')) //.
- by rewrite commg_subr gFnorm_trans ?normsG.
-have{cstrA} nbyApi'1 q: q \in pi^' -> |/|*(A; q) = [set 1%G].
- move=> pi'q; have trA: [transitive 'O_pi^'('C(A)), on |/|*(A; q) | 'JG].
- apply: normed_constrained_rank3_trans; rewrite //= -/A.
- rewrite -rank_abelem // in dimA0_3; apply: leq_trans dimA0_3 (rankS _).
- by rewrite /= -/A subsetI sA0A centsC subsetIr.
- have [Q maxQ defAmax]: exists2 Q, Q \in |/|*(A; q) & |/|*(A; q) = [set Q].
- case/imsetP: trA => Q maxQ defAmax; exists Q; rewrite // {maxQ}defAmax.
- suffices ->: 'O_pi^'('C(A)) = 1 by rewrite /orbit imset_set1 act1.
- rewrite -(setIidPr (pcore_sub _ _)) coprime_TIg //.
- exact: pnat_coprime piCA (pcore_pgroup _ _).
- have{maxQ} qQ: q.-group Q by move: maxQ; rewrite inE => /maxgroupp/andP[].
- have [<- // |] := eqVneq Q 1%G; rewrite -val_eqE /= => ntQ.
- have{defAmax trA} defFmax: |/|*(F; q) = [set Q].
- apply/eqP; rewrite eqEcard cards1 -defAmax.
- have snAF: A <|<| F by rewrite nilpotent_subnormal ?Fitting_nil.
- have piF: pi.-group F by rewrite def_pi /pgroup pnat_pi ?cardG_gt0.
- case/(normed_trans_superset _ _ snAF): trA => //= _ /imsetP[R maxR _] -> _.
- by rewrite (cardsD1 R) maxR.
- have nQM: M \subset 'N(Q).
- apply/normsP=> x Mx; apply: congr_group; apply/set1P.
- rewrite -defFmax (acts_act (norm_acts_max_norm _ _)) ?defFmax ?set11 //.
- by apply: subsetP Mx; apply: gFnorm.
- have{nQM} nsQM: Q <| M.
- rewrite inE in maxM; case/maxgroupP: maxM => _ maxM.
- rewrite -(maxM 'N(Q)%G) ?normalG ?mFT_norm_proper //.
- exact: mFT_pgroup_proper qQ.
- have sQF: Q \subset F by rewrite Fitting_max ?(pgroup_nil qQ).
- rewrite -(setIidPr sQF) coprime_TIg ?eqxx // in ntQ.
- by rewrite coprime_pi' ?cardG_gt0 // -def_pi (pi_pnat qQ).
-apply/subsetP=> H /setIdP[maxH sAH]; rewrite inE -val_eqE /=.
-have prH: H \proper G := mmax_proper maxH; have solH := mFT_sol prH.
-pose D := 'F(H); have nilD: nilpotent D := Fitting_nil H.
-have card_pcore_nil := card_Hall (nilpotent_pcore_Hall _ _).
-have piD: \pi(D) = pi.
- set sigma := \pi(_); have pi_sig: {subset sigma <= pi}.
- move=> q; rewrite -p_part_gt1 -card_pcore_nil // cardG_gt1 /= -/D.
- apply: contraR => /nbyApi'1 defAmax.
- have nDqA: A \subset 'N(D`q).
- by rewrite gFnorm_trans // (subset_trans sAH) ?gFnorm.
- have [Q]:= max_normed_exists (pcore_pgroup _ _) nDqA.
- by rewrite defAmax -subG1; move/set1P->.
- apply/eq_piP=> q; apply/idP/idP=> [|pi_q]; first exact: pi_sig.
- apply: contraLR (pi_q) => sig'q; have nilA := nilpotentS sAF nilF.
- rewrite -p_part_eq1 -card_pcore_nil // -trivg_card1 -subG1 /= -/A.
- have <-: 'O_sigma^'(H) = 1.
- apply/eqP; rewrite -trivg_Fitting ?(solvableS (pcore_sub _ _)) //.
- rewrite Fitting_pcore -(setIidPr (pcore_sub _ _)) coprime_TIg //.
- by rewrite coprime_pi' ?cardG_gt0 //; apply: pcore_pgroup.
- rewrite -bigcap_p'core subsetI gFsub_trans //=.
- apply/bigcapsP=> -[r /= _] sig_r; apply: sArXq' => //; first exact: pi_sig.
- by apply: contraNneq sig'q => <-.
-have cAD q r: q != r -> D`q \subset 'C(A`r).
- move=> r'q; have [-> |] := eqVneq D`q 1; first by rewrite sub1G.
- rewrite -cardG_gt1 card_pcore_nil // p_part_gt1 piD => pi_q.
- have sArHq': A`r \subset 'O_q^'(H) by rewrite sArXq'.
- have coHqHq': coprime #|D`q| #|'O_q^'(H)| by rewrite coprime_pcoreC.
- rewrite (sameP commG1P trivgP) -(coprime_TIg coHqHq') commg_subI //.
- by rewrite subsetI subxx /= p_core_Fitting gFsub_trans ?gFnorm.
- rewrite subsetI sArHq' gFsub_trans ?(subset_trans sAH) //=.
- by rewrite p_core_Fitting gFnorm.
-have sDM: D \subset M.
- rewrite [D]FittingEgen gen_subG; apply/bigcupsP=> [[q /= _] _].
- rewrite -p_core_Fitting -/D; have [r pi_r r'q] := pi_alt q.
- by apply: subset_trans (sCqM r pi_r); apply: cAD; rewrite eq_sym.
-have cApHp': A`p \subset 'C('O_p^'(H)).
- have coApHp': coprime #|'O_p^'(H)| #|A`p|.
- by rewrite coprime_sym coprime_pcoreC.
- have solHp': solvable 'O_p^'(H) by rewrite (solvableS (pcore_sub _ _)).
- have nHp'Ap: A`p \subset 'N('O_p^'(H)).
- by rewrite gFsub_trans ?gFnorm_trans ?normsG.
- apply: subset_trans (coprime_cent_Fitting nHp'Ap coApHp' solHp').
- rewrite subsetI subxx centsC /= FittingEgen gen_subG.
- apply/bigcupsP=> [[q /= _] _]; have [-> | /cAD] := eqVneq q p.
- by rewrite -(setIidPl (pcore_sub p _)) TI_pcoreC sub1G.
- apply: subset_trans; rewrite p_core_Fitting -pcoreI.
- by apply: sub_pcore => r /andP[].
-have sHp'M: 'O_p^'(H) \subset M.
- by apply: subset_trans (sCqM p pi_p); rewrite centsC.
-have ntDp: D`p != 1 by rewrite -cardG_gt1 card_pcore_nil // p_part_gt1 piD.
-have sHp'_NMDp': 'O_p^'(H) \subset 'O_p^'('N_M(D`p)).
- apply: subset_trans (pcoreS _ (subsetIr _ _)).
- rewrite -setIA (setIidPr (pcore_sub _ _)) /= (mmax_normal maxH) //.
- by rewrite subsetI sHp'M subxx.
- by rewrite /= p_core_Fitting pcore_normal.
-have{sHp'_NMDp'} sHp'Mp': 'O_p^'(H) \subset 'O_p^'(M).
- have pM_D: p.-subgroup(M) D`p.
- by rewrite /psubgroup pcore_pgroup gFsub_trans.
- apply: subset_trans (p'core_cent_pgroup pM_D (mFT_sol prM)).
- apply: subset_trans (pcoreS _ (subcent_sub _ _)).
- rewrite !subsetI sHp'_NMDp' sHp'M andbT /= (sameP commG1P trivgP).
- have coHp'Dp: coprime #|'O_p^'(H)| #|D`p|.
- by rewrite coprime_sym coprime_pcoreC.
- rewrite -(coprime_TIg coHp'Dp) subsetI commg_subl commg_subr /=.
- by rewrite p_core_Fitting !gFsub_trans ?gFnorm.
-have sMp'H: 'O_p^'(M) \subset H.
- rewrite -(mmax_normal maxH (pcore_normal p H)) /= -p_core_Fitting //.
- rewrite -/D (subset_trans _ (cent_sub _)) // centsC.
- have solMp' := solvableS (pcore_sub p^' _) (mFT_sol prM).
- have coMp'Dp: coprime #|'O_p^'(M)| #|D`p|.
- by rewrite coprime_sym coprime_pcoreC.
- have nMp'Dp: D`p \subset 'N('O_p^'(M)).
- by rewrite gFsub_trans ?(subset_trans sDM) ?gFnorm.
- apply: subset_trans (coprime_cent_Fitting nMp'Dp coMp'Dp solMp').
- rewrite subsetI subxx centsC /= FittingEgen gen_subG.
- apply/bigcupsP=> [[q /= _] _]; have [<- | /cAD] := eqVneq p q.
- by rewrite -(setIidPl (pcore_sub p _)) TI_pcoreC sub1G.
- rewrite centsC; apply: subset_trans.
- rewrite -p_core_Fitting Fitting_pcore pcore_max ?pcore_pgroup //=.
- rewrite /normal subsetI -pcoreI pcore_sub subIset ?gFnorm //=.
- rewrite pcoreI gFsub_trans //= -/F centsC.
- case/dprodP: (nilpotent_pcoreC p nilF) => _ _ /= cFpp' _.
- rewrite centsC (subset_trans cFpp' (centS _)) //.
- have hallFp := nilpotent_pcore_Hall p nilF.
- by rewrite (sub_Hall_pcore hallFp).
-have{sHp'Mp' sMp'H} eqHp'Mp': 'O_p^'(H) = 'O_p^'(M).
- apply/eqP; rewrite eqEsubset sHp'Mp'.
- apply: subset_trans (sNZqXq' p H sAH prH).
- apply: subset_trans (pcoreS _ (subsetIr _ _)).
- rewrite -setIA (setIidPr (pcore_sub _ _)) subsetI sMp'H /=.
- rewrite (mmax_normal maxM) ?gFnormal_trans //.
- by rewrite -cardG_gt1 card_pcore_nil // p_part_gt1 piZ -def_pi.
-have ntHp': 'O_p^'(H) != 1.
- have [q pi_q p'q] := pi_alt p; have: D`q \subset 'O_p^'(H).
- by rewrite p_core_Fitting sub_pcore // => r; move/eqnP->.
- rewrite -proper1G; apply: proper_sub_trans; rewrite proper1G.
- by rewrite -cardG_gt1 card_pcore_nil // p_part_gt1 piD.
-rewrite -(mmax_normal maxH (pcore_normal p^' H)) //= eqHp'Mp'.
-by rewrite (mmax_normal maxM (pcore_normal _ _)) //= -eqHp'Mp'.
-Qed.
-
-(* This is B & G, Theorem 8.1(b). *)
-Theorem SCN_Fitting_Uniqueness p M P A :
- M \in 'M -> p.-group ('F(M)) -> p.-Sylow(M) P ->
- 'r_p('F(M)) >= 3 -> A \in 'SCN_3(P) ->
- [/\ p.-Sylow(G) P, A \subset 'F(M) & A \in 'U].
-Proof.
-set F := 'F(M) => maxM pF sylP dimFp3 scn3_A.
-have [scnA dimA3] := setIdP scn3_A; have [nsAP defCA] := SCN_P scnA.
-have cAA := SCN_abelian scnA; have sAP := normal_sub nsAP.
-have [sPM pP _] := and3P sylP; have sAM := subset_trans sAP sPM.
-have{dimA3} ntA: A :!=: 1 by case: eqP dimA3 => // ->; rewrite rank1.
-have prM := mmax_proper maxM; have solM := mFT_sol prM.
-have{pF} Mp'1: 'O_p^'(M) = 1.
- apply/eqP; rewrite -trivg_Fitting ?(solvableS (pcore_sub _ _)) //.
- rewrite Fitting_pcore -(setIidPr (pcore_sub _ _)) coprime_TIg //.
- exact: pnat_coprime (pcore_pgroup _ _).
-have defF: F = M`p := Fitting_eq_pcore Mp'1.
-have sFP: F \subset P by rewrite defF (pcore_sub_Hall sylP).
-have sAF: A \subset F.
- rewrite defF -(pseries_pop2 _ Mp'1).
- exact: (odd_p_abelian_constrained (mFT_odd _) solM sylP cAA nsAP).
-have sZA: 'Z(F) \subset A.
- by rewrite -defCA setISS ?centS // defF pcore_sub_Hall.
-have sCAM: 'C(A) \subset M.
- have nsZM: 'Z(F) <| M by rewrite !gFnormal_trans.
- rewrite -(mmax_normal maxM nsZM); last first.
- rewrite /= -(setIidPr (center_sub _)) meet_center_nil ?Fitting_nil //.
- by rewrite -proper1G (proper_sub_trans _ sAF) ?proper1G.
- by rewrite (subset_trans _ (cent_sub _)) ?centS.
-have nsZL_M: 'Z('L(P)) <| M.
- by rewrite (Puig_center_normal (mFT_odd _) solM sylP).
-have sNPM: 'N(P) \subset M.
- rewrite -(mmax_normal maxM nsZL_M) ?gFnorm_trans //.
- apply/eqP => /(trivg_center_Puig_pgroup (pHall_pgroup sylP))-P1.
- by rewrite -subG1 -P1 sAP in ntA.
-have sylPG: p.-Sylow(G) P := mmax_sigma_Sylow maxM sylP sNPM.
-split; rewrite // (uniq_mmax_subset1 maxM sAM).
-have{scn3_A} scn3_A: A \in 'SCN_3[p] by apply/bigcupP; exists P; rewrite // inE.
-pose K := 'O_p^'('C(A)); have sKF: K \subset F.
- have sKM: K \subset M := gFsub_trans _ sCAM.
- apply: subset_trans (cent_sub_Fitting solM).
- rewrite subsetI sKM coprime_nil_faithful_cent_stab ?Fitting_nil //.
- - by rewrite gFsub_trans ?(subset_trans sCAM) ?gFnorm.
- - by rewrite /= -/F defF coprime_pcoreC.
- have sACK: A \subset 'C_F(K) by rewrite subsetI sAF centsC pcore_sub.
- by rewrite /= -/F -/K (subset_trans _ sACK) //= -defCA setISS ?centS.
-have{sKF} K1: K = 1 by rewrite -(setIidPr sKF) defF TI_pcoreC.
-have p'nbyA_1 q: q != p -> |/|*(A; q) = [set 1%G].
- move=> p'q.
- have: [transitive K, on |/|*(A; q) | 'JG] by apply: Thompson_transitivity.
- case/imsetP=> Q maxQ; rewrite K1 /orbit imset_set1 act1 => defAmax.
- have nQNA: 'N(A) \subset 'N(Q).
- apply/normsP=> x Nx; apply: congr_group; apply/set1P; rewrite -defAmax.
- by rewrite (acts_act (norm_acts_max_norm _ _)).
- have{nQNA} nQF: F \subset 'N(Q).
- exact: subset_trans (subset_trans (normal_norm nsAP) nQNA).
- have defFmax: |/|*(F; q) = [set Q] := max_normed_uniq defAmax sAF nQF.
- have nQM: M \subset 'N(Q).
- apply/normsP=> x Mx; apply: congr_group; apply/set1P; rewrite -defFmax.
- rewrite (acts_act (norm_acts_max_norm _ _)) ?defFmax ?set11 //.
- by rewrite (subsetP (gFnorm _ _)).
- have [<- // | ntQ] := eqVneq Q 1%G.
- rewrite inE in maxQ; have [qQ _] := andP (maxgroupp maxQ).
- have{nQM} defNQ: 'N(Q) = M.
- by rewrite (mmax_norm maxM) // (mFT_pgroup_proper qQ).
- case/negP: ntQ; rewrite -[_ == _]subG1 -Mp'1 -defNQ pcore_max ?normalG //.
- exact: pi_pnat qQ _.
-have{p'nbyA_1} p'nbyA_1 X:
- X \proper G -> p^'.-group X -> A \subset 'N(X) -> X :=: 1.
-- move=> prX p'X nXA; have solX := mFT_sol prX.
- apply/eqP; rewrite -trivg_Fitting // -subG1 /= FittingEgen gen_subG.
- apply/bigcupsP=> [[q /= _] _]; have [-> | p'q] := eqVneq q p.
- rewrite -(setIidPl (pcore_sub _ _)) coprime_TIg //.
- by rewrite (pnat_coprime (pcore_pgroup _ _)).
- have [R] := max_normed_exists (pcore_pgroup q X) (gFnorm_trans _ nXA).
- by rewrite p'nbyA_1 // => /set1P->.
-apply/subsetPn=> -[H0 MA_H0 neH0M].
-pose H := [arg max_(H > H0 | (H \in 'M(A)) && (H != M)) #|H :&: M|`_p].
-case: arg_maxP @H => [|H {H0 MA_H0 neH0M}]; first by rewrite MA_H0 -in_set1.
-rewrite /= inE -andbA => /and3P[maxH sAH neHM] maxHM.
-have prH: H \proper G by rewrite inE in maxH; apply: maxgroupp maxH.
-have sAHM: A \subset H :&: M by rewrite subsetI sAH.
-have [R sylR_HM sAR]:= Sylow_superset sAHM (pgroupS sAP pP).
-have [/subsetIP[sRH sRM] pR _] := and3P sylR_HM.
-have{sylR_HM} sylR_H: p.-Sylow(H) R.
- have [Q sylQ] := Sylow_superset sRM pR; have [sQM pQ _] := and3P sylQ.
- case/eqVproper=> [defR | /(nilpotent_proper_norm (pgroup_nil pQ)) sRN].
- apply: (pHall_subl sRH (subsetT _)); rewrite pHallE subsetT /=.
- by rewrite -(card_Hall sylPG) (card_Hall sylP) defR (card_Hall sylQ).
- case/maximal_exists: (subsetT 'N(R)) => [nRG | [D maxD sND]].
- case/negP: (proper_irrefl (mem G)); rewrite -{1}nRG.
- rewrite mFT_norm_proper ?(mFT_pgroup_proper pR) //.
- by rewrite -proper1G (proper_sub_trans _ sAR) ?proper1G.
- move/implyP: (maxHM D); rewrite 2!inE {}maxD leqNgt.
- case: eqP sND => [->{D} sNM _ | _ sND].
- rewrite -Sylow_subnorm (pHall_subl _ _ sylR_HM) ?setIS //.
- by rewrite subsetI sRH normG.
- rewrite (subset_trans (subset_trans sAR (normG R)) sND); case/negP.
- rewrite -(card_Hall sylR_HM) (leq_trans (proper_card sRN)) //.
- rewrite -(part_pnat_id (pgroupS (subsetIl _ _) pQ)) dvdn_leq //.
- by rewrite partn_dvd ?cardG_gt0 // cardSg //= setIC setISS.
-have Hp'1: 'O_p^'(H) = 1.
- apply: p'nbyA_1 (pcore_pgroup _ _) (subset_trans sAH (gFnorm _ _)).
- exact: sub_proper_trans (pcore_sub _ _) prH.
-have nsZLR_H: 'Z('L(R)) <| H.
- exact: Puig_center_normal (mFT_odd _) (mFT_sol prH) sylR_H _.
-have ntZLR: 'Z('L(R)) != 1.
- apply/eqP=> /(trivg_center_Puig_pgroup pR) R1.
- by rewrite -subG1 -R1 sAR in ntA.
-have defH: 'N('Z('L(R))) = H := mmax_normal maxH nsZLR_H ntZLR.
-have{sylR_H} sylR: p.-Sylow(G) R.
- rewrite -Sylow_subnorm setTI (pHall_subl _ _ sylR_H) ?normG //=.
- by rewrite -defH !gFnorm_trans.
-have nsZLR_M: 'Z('L(R)) <| M.
- have sylR_M := pHall_subl sRM (subsetT _) sylR.
- exact: Puig_center_normal (mFT_odd _) solM sylR_M _.
-case/eqP: neHM; apply: group_inj.
-by rewrite -defH (mmax_normal maxM nsZLR_M).
-Qed.
-
-(* This summarizes the two branches of B & G, Theorem 8.1. *)
-Theorem Fitting_Uniqueness M : M \in 'M -> 'r('F(M)) >= 3 -> 'F(M)%G \in 'U.
-Proof.
-move=> maxM; have [p _ -> dimF3] := rank_witness 'F(M).
-have prF: 'F(M) \proper G := sub_mmax_proper maxM (Fitting_sub M).
-have [pF | npF] := boolP (p.-group 'F(M)).
- have [P sylP] := Sylow_exists p M; have [sPM pP _] := and3P sylP.
- have dimP3: 'r_p(P) >= 3.
- rewrite (p_rank_Sylow sylP) (leq_trans dimF3) //.
- by rewrite p_rankS ?Fitting_sub.
- have [A] := rank3_SCN3 pP (mFT_odd _) dimP3.
- by case/(SCN_Fitting_Uniqueness maxM pF)=> // _ sAF; apply: uniq_mmaxS.
-case/p_rank_geP: dimF3 => A /setIdP[EpA dimA3].
-have [A0 maxA0 sAA0] := @maxgroup_exists _ [pred X in 'E_p('F(M))] _ EpA.
-have [_ abelA] := pElemP EpA; have pmaxA0: A0 \in 'E*_p('F(M)) by rewrite inE.
-case/pElemP: (maxgroupp maxA0) => sA0F; case/and3P=> _ cA0A0 _.
-have dimA0_3: 'r_p(A0) >= 3.
- by rewrite -(eqP dimA3) -(p_rank_abelem abelA) p_rankS.
-have:= non_pcore_Fitting_Uniqueness maxM npF pmaxA0 dimA0_3.
-exact: uniq_mmaxS (subsetIl _ _) prF.
-Qed.
-
-End Eight.
-
diff --git a/mathcomp/odd_order/BGsection9.v b/mathcomp/odd_order/BGsection9.v
deleted file mode 100644
index fe2b86a..0000000
--- a/mathcomp/odd_order/BGsection9.v
+++ /dev/null
@@ -1,476 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq div fintype path.
-From mathcomp
-Require Import finset prime fingroup action automorphism quotient cyclic.
-From mathcomp
-Require Import gproduct gfunctor pgroup center commutator gseries nilpotent.
-From mathcomp
-Require Import sylow abelian maximal hall.
-From mathcomp
-Require Import BGsection1 BGsection4 BGsection5 BGsection6.
-From mathcomp
-Require Import BGsection7 BGsection8.
-
-(******************************************************************************)
-(* This file covers B & G, section 9, i.e., the proof the Uniqueness *)
-(* Theorem, along with the several variants and auxiliary results. Note that *)
-(* this is the only file to import BGsection8. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope.
-
-Section Nine.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Implicit Types H K L M A B P Q R : {group gT}.
-Implicit Types p q r : nat.
-
-(* This is B & G, Theorem 9.1(b). *)
-Theorem noncyclic_normed_sub_Uniqueness p M B :
- M \in 'M -> B \in 'E_p(M) -> ~~ cyclic B ->
- \bigcup_(K in |/|_G(B; p^')) K \subset M ->
- B \in 'U.
-Proof.
-move=> maxM /pElemP[sBM abelB] ncycB snbBp'_M; have [pB cBB _] := and3P abelB.
-have prM := mmax_proper maxM; have solM := mFT_sol prM.
-apply/uniq_mmaxP; exists M; symmetry; apply/eqP.
-rewrite eqEsubset sub1set inE maxM sBM; apply/subsetPn=> [[H0 MB_H0 neH0M]].
-have:= erefl [arg max_(H > H0 | (H \in 'M(B)) && (H :!=: M)) #|H :&: M|`_p].
-have [|H] := arg_maxP; first by rewrite MB_H0; rewrite inE in neH0M.
-rewrite inE -andbA => /and3P[maxH sBH neHM] maxHM _ {H0 MB_H0 neH0M}.
-have sB_HM: B \subset H :&: M by rewrite subsetI sBH.
-have{sB_HM} [R sylR sBR] := Sylow_superset sB_HM pB.
-have [/subsetIP[sRH sRM] pR _] := and3P sylR.
-have [P sylP sRP] := Sylow_superset sRM pR; have [sPM pP _] := and3P sylP.
-have sHp'M: 'O_p^'(H) \subset M.
- apply: subset_trans snbBp'_M; rewrite (bigcup_max 'O_p^'(H)%G) // inE -andbA.
- by rewrite subsetT pcore_pgroup (subset_trans sBH) ?gFnorm.
-have{snbBp'_M} defMp': <<\bigcup_(K in |/|_G(P; p^')) K>> = 'O_p^'(M).
- have nMp'M: M \subset 'N('O_p^'(M)) by apply: gFnorm.
- have nMp'P := subset_trans sPM nMp'M.
- apply/eqP; rewrite eqEsubset gen_subG sub_gen ?andbT; last first.
- by rewrite (bigcup_max 'O_p^'(M)%G) // inE -andbA subsetT pcore_pgroup.
- apply/bigcupsP=> K; rewrite inE -andbA => /and3P[_ p'K nKP].
- have sKM: K \subset M.
- apply: subset_trans snbBp'_M; rewrite (bigcup_max K) // inE -andbA subsetT.
- by rewrite p'K (subset_trans (subset_trans sBR sRP)).
- rewrite -quotient_sub1 ?(subset_trans sKM) //=; set Mp' := 'O__(M).
- have tiKp: 'O_p(M / Mp') :&: (K / _) = 1.
- exact: coprime_TIg (pnat_coprime (pcore_pgroup _ _) (quotient_pgroup _ _)).
- suffices sKMp: K / _ \subset 'O_p(M / Mp') by rewrite -(setIidPr sKMp) tiKp.
- rewrite -Fitting_eq_pcore ?trivg_pcore_quotient //.
- apply: subset_trans (cent_sub_Fitting (quotient_sol _ solM)).
- rewrite subsetI quotientS //= (Fitting_eq_pcore (trivg_pcore_quotient _ _)).
- rewrite (sameP commG1P trivgP) /= -/Mp' -tiKp subsetI commg_subl commg_subr.
- rewrite (subset_trans (quotientS _ sKM)) ?gFnorm //=.
- apply: subset_trans (pcore_sub_Hall (quotient_pHall nMp'P sylP)) _.
- by rewrite quotient_norms.
-have ntR: R :!=: 1 by case: eqP sBR ncycB => // -> /trivgP->; rewrite cyclic1.
-have{defMp'} sNPM: 'N(P) \subset M.
- have [Mp'1 | ntMp'] := eqVneq 'O_p^'(M) 1.
- have nsZLP: 'Z('L(P)) <| M.
- by apply: Puig_center_normal Mp'1 => //; apply: mFT_odd.
- rewrite -(mmax_normal maxM nsZLP) ?gFnorm_trans //.
- apply: contraNneq ntR => /(trivg_center_Puig_pgroup pP)-P1.
- by rewrite -subG1 -P1.
- rewrite -(mmax_normal maxM (pcore_normal _ _) ntMp') /= -defMp' norms_gen //.
- apply/subsetP=> x nPx; rewrite inE sub_conjg; apply/bigcupsP=> K.
- rewrite inE -andbA -sub_conjg => /and3P[_ p'K nKP].
- rewrite (bigcup_max (K :^ x)%G) // inE -andbA subsetT pgroupJ p'K /=.
- by rewrite -(normP nPx) normJ conjSg.
-have sylPG := mmax_sigma_Sylow maxM sylP sNPM.
-have{sNPM} [sNRM sylRH]: 'N(R) \subset M /\ p.-Sylow(H) R.
- have [defR | ltRP] := eqVproper sRP.
- by split; rewrite defR // (pHall_subl _ (subsetT _)) // -defR.
- have [| D /setIdP[maxD sND]]:= @mmax_exists _ 'N(R).
- by rewrite mFT_norm_proper // (mFT_pgroup_proper pR).
- have/implyP := maxHM D; rewrite inE {}maxD /= leqNgt.
- rewrite (subset_trans (subset_trans sBR (normG R))) //= implybNN.
- have ltRN := nilpotent_proper_norm (pgroup_nil pP) ltRP.
- rewrite -(card_Hall sylR) (leq_trans (proper_card ltRN)) /=; last first.
- rewrite setIC -(part_pnat_id (pgroupS (subsetIr _ _) pP)) dvdn_leq //.
- by rewrite partn_dvd ?cardG_gt0 // cardSg // setISS.
- move/eqP=> defD; rewrite defD in sND; split; rewrite // -Sylow_subnorm.
- by rewrite (pHall_subl _ _ sylR) ?setIS // subsetI sRH normG.
-have sFH_RHp': 'F(H) \subset R * 'O_p^'(H).
- case/dprodP: (nilpotent_pcoreC p (Fitting_nil H)) => _ /= <- _ _.
- by rewrite p_core_Fitting mulgSS ?(pcore_sub_Hall sylRH) ?pcore_Fitting.
-have sFH_M: 'F(H) \subset M by rewrite (subset_trans sFH_RHp') ?mul_subG.
-case/(H :=P: M): neHM; have [le3r | ge2r] := ltnP 2 'r('F(H)).
- have [D uF_D] := uniq_mmaxP (Fitting_Uniqueness maxH le3r).
- by rewrite (eq_uniq_mmax uF_D maxM) // (eq_uniq_mmax uF_D maxH) ?Fitting_sub.
-have nHp'R: R \subset 'N('O_p^'(H)) by rewrite (subset_trans sRH) ?gFnorm.
-have nsRHp'H: R <*> 'O_p^'(H) <| H.
- rewrite sub_der1_normal //= ?join_subG ?sRH ?pcore_sub //.
- rewrite norm_joinEl // (subset_trans _ sFH_RHp') //.
- by rewrite rank2_der1_sub_Fitting ?mFT_odd // mFT_sol ?mmax_proper.
-have sylR_RHp': p.-Sylow(R <*> 'O_p^'(H)) R.
- by apply: (pHall_subl _ _ sylRH); rewrite ?joing_subl // normal_sub.
-rewrite (mmax_max maxH) // -(Frattini_arg nsRHp'H sylR_RHp') /=.
-by rewrite mulG_subG join_subG sRM sHp'M /= setIC subIset ?sNRM.
-Qed.
-
-(* This is B & G, Theorem 9.1(a). *)
-Theorem noncyclic_cent1_sub_Uniqueness p M B :
- M \in 'M -> B \in 'E_p(M) -> ~~ cyclic B ->
- \bigcup_(b in B^#) 'C[b] \subset M ->
- B \in 'U.
-Proof.
-move=> maxM EpB ncycB sCB_M.
-apply: (noncyclic_normed_sub_Uniqueness maxM EpB) => //.
-apply/bigcupsP=> K; rewrite inE -andbA => /and3P[_ p'K nKB].
-case/pElemP: EpB => _ /and3P[pB cBB _].
-rewrite -(coprime_abelian_gen_cent1 cBB ncycB nKB); last first.
- by rewrite coprime_sym (pnat_coprime pB).
-rewrite gen_subG (subset_trans _ sCB_M) //.
-by apply/bigcupsP=> b Bb; rewrite (bigcup_max b) // subsetIr.
-Qed.
-
-(* This is B & G, Corollary 9.2. *)
-Corollary cent_uniq_Uniqueness K L :
- L \in 'U -> K \subset 'C(L) -> 'r(K) >= 2 -> K \in 'U.
-Proof.
-move=> uL; have ntL := uniq_mmax_neq1 uL.
-case/uniq_mmaxP: uL => H uL_H cLK; have [maxH sLH] := mem_uniq_mmax uL_H.
-case/rank_geP=> B /nElemP[p /pnElemP[sBK abelB /eqP dimB2]].
-have scBH: \bigcup_(b in B^#) 'C[b] \subset H.
- apply/bigcupsP=> b /setIdP[]; rewrite inE -cycle_eq1 => ntb Bb.
- apply: (sub_uniq_mmax uL_H); last by rewrite /= -cent_cycle mFT_cent_proper.
- by rewrite sub_cent1 (subsetP cLK) ?(subsetP sBK).
-have EpB: B \in 'E_p(H).
- apply/pElemP; split=> //; rewrite -(setD1K (group1 B)) subUset sub1G /=.
- apply/subsetP=> b Bb; apply: (subsetP scBH).
- by apply/bigcupP; exists b => //; apply/cent1P.
-have prK: K \proper G by rewrite (sub_proper_trans cLK) ?mFT_cent_proper.
-apply: uniq_mmaxS prK (noncyclic_cent1_sub_Uniqueness _ EpB _ _) => //.
-by rewrite (abelem_cyclic abelB) (eqP dimB2).
-Qed.
-
-(* This is B & G, Corollary 9.3. *)
-Corollary any_cent_rank3_Uniquness p A B :
- abelian A -> p.-group A -> 'r(A) >= 3 -> A \in 'U ->
- p.-group B -> ~~ cyclic B -> 'r_p('C(B)) >= 3 ->
- B \in 'U.
-Proof.
-move=> cAA pA rA3 uA pB ncycB /p_rank_geP[C /= Ep3C].
-have [cBC abelC dimC3] := pnElemP Ep3C; have [pC cCC _] := and3P abelC.
-have [P /= sylP sCP] := Sylow_superset (subsetT _) pC.
-wlog sAP: A pA cAA rA3 uA / A \subset P.
- move=> IHA; have [x _] := Sylow_Jsub sylP (subsetT _) pA.
- by apply: IHA; rewrite ?pgroupJ ?abelianJ ?rankJ ?uniq_mmaxJ.
-have ncycC: ~~ cyclic C by rewrite (abelem_cyclic abelC) dimC3.
-have ncycP: ~~ cyclic P := contra (cyclicS sCP) ncycC.
-have [D] := ex_odd_normal_p2Elem (pHall_pgroup sylP) (mFT_odd _) ncycP.
-case/andP=> sDP nDP /pnElemP[_ abelD dimD2].
-have CADge2: 'r('C_A(D)) >= 2.
- move: rA3; rewrite (rank_pgroup pA) => /p_rank_geP[E].
- case/pnElemP=> sEA abelE dimE3; apply: leq_trans (rankS (setSI _ sEA)).
- rewrite (rank_abelem (abelemS (subsetIl _ _) abelE)) -(leq_add2r 1) addn1.
- rewrite -dimE3 -leq_subLR -logn_div ?cardSg ?divgS ?subsetIl //.
- rewrite logn_quotient_cent_abelem ?dimD2 //.
- exact: subset_trans (subset_trans sAP nDP).
-have CCDge2: 'r('C_C(D)) >= 2.
- rewrite (rank_abelem (abelemS (subsetIl _ _) abelC)) -(leq_add2r 1) addn1.
- rewrite -dimC3 -leq_subLR -logn_div ?cardSg ?divgS ?subsetIl //.
- by rewrite logn_quotient_cent_abelem ?dimD2 //; apply: subset_trans nDP.
-rewrite centsC in cBC; apply: cent_uniq_Uniqueness cBC _; last first.
- by rewrite ltnNge (rank_pgroup pB) -odd_pgroup_rank1_cyclic ?mFT_odd.
-have cCDC: C \subset 'C('C_C(D))
- by rewrite (sub_abelian_cent (abelem_abelian abelC)) ?subsetIl.
-apply: cent_uniq_Uniqueness cCDC _; last by rewrite (rank_abelem abelC) dimC3.
-apply: cent_uniq_Uniqueness (subsetIr _ _) CCDge2.
-have cDCA: D \subset 'C('C_A(D)) by rewrite centsC subsetIr.
-apply: cent_uniq_Uniqueness cDCA _; last by rewrite (rank_abelem abelD) dimD2.
-by apply: cent_uniq_Uniqueness uA _ CADge2; rewrite subIset // -abelianE cAA.
-Qed.
-
-(* This is B & G, Lemma 9.4. *)
-Lemma any_rank3_Fitting_Uniqueness p M P :
- M \in 'M -> 'r_p('F(M)) >= 3 -> p.-group P -> 'r(P) >= 3 -> P \in 'U.
-Proof.
-move=> maxM FMge3 pP; rewrite (rank_pgroup pP) => /p_rank_geP[B].
-case/pnElemP=> sBP abelB dimB3; have [pB cBB _] := and3P abelB.
-have CBge3: 'r_p('C(B)) >= 3 by rewrite -dimB3 -(p_rank_abelem abelB) p_rankS.
-have ncycB: ~~ cyclic B by rewrite (abelem_cyclic abelB) dimB3.
-apply: {P pP}uniq_mmaxS sBP (mFT_pgroup_proper pP) _.
-case/orP: (orbN (p.-group 'F(M))) => [pFM | pFM'].
- have [P sylP sFP] := Sylow_superset (Fitting_sub _) pFM.
- have pP := pHall_pgroup sylP.
- have [|A SCN_A]:= rank3_SCN3 pP (mFT_odd _).
- by rewrite (leq_trans FMge3) ?p_rankS.
- have [_ _ uA] := SCN_Fitting_Uniqueness maxM pFM sylP FMge3 SCN_A.
- case/setIdP: SCN_A => SCN_A dimA3; case: (setIdP SCN_A); case/andP=> sAP _ _.
- have cAA := SCN_abelian SCN_A; have pA := pgroupS sAP pP.
- exact: (any_cent_rank3_Uniquness cAA pA).
-have [A0 EpA0 A0ge3] := p_rank_pmaxElem_exists FMge3.
-have uA := non_pcore_Fitting_Uniqueness maxM pFM' EpA0 A0ge3.
-case/pmaxElemP: EpA0; case/setIdP=> _ abelA0 _.
-have [pA0 cA0A0 _] := and3P abelA0; rewrite -rank_pgroup // in A0ge3.
-rewrite (any_cent_rank3_Uniquness _ pA0) // (cent_uniq_Uniqueness uA) 1?ltnW //.
-by rewrite centsC subsetIr.
-Qed.
-
-(* This is B & G, Lemma 9.5. *)
-Lemma SCN_3_Uniqueness p A : A \in 'SCN_3[p] -> A \in 'U.
-Proof.
-move=> SCN3_A; apply/idPn=> uA'.
-have [P] := bigcupP SCN3_A; rewrite inE => sylP /setIdP[SCN_A Age3].
-have [nsAP _] := setIdP SCN_A; have [sAP nAP] := andP nsAP.
-have cAA := SCN_abelian SCN_A.
-have pP := pHall_pgroup sylP; have pA := pgroupS sAP pP.
-have ntA: A :!=: 1 by rewrite -rank_gt0 -(subnKC Age3).
-have [p_pr _ [e oA]] := pgroup_pdiv pA ntA.
-have{e oA} def_piA: \pi(A) =i (p : nat_pred).
- by rewrite /= oA pi_of_exp //; apply: pi_of_prime.
-have FmCAp_le2 M: M \in 'M('C(A)) -> 'r_p('F(M)) <= 2.
- case/setIdP=> maxM cCAM; rewrite leqNgt; apply: contra uA' => Fge3.
- exact: (any_rank3_Fitting_Uniqueness maxM Fge3).
-have sNP_mCA M: M \in 'M('C(A)) -> 'N(P) \subset M.
- move=> mCA_M; have Fple2 := FmCAp_le2 M mCA_M.
- case/setIdP: mCA_M => maxM sCAM; set F := 'F(M) in Fple2.
- have sNR_M R: A \subset R -> R \subset P :&: M -> 'N(R) \subset M.
- move=> sAR /subsetIP[sRP sRM].
- pose q := if 'r(F) <= 2 then max_pdiv #|M| else s2val (rank_witness 'F(M)).
- have nMqR: R \subset 'N('O_q(M)) := subset_trans sRM (gFnorm _ _).
- have{nMqR} [Q maxQ sMqQ] := max_normed_exists (pcore_pgroup _ _) nMqR.
- have [p'q sNQ_M]: q != p /\ 'N(Q) \subset M.
- case/mem_max_normed: maxQ sMqQ; rewrite {}/q.
- case: leqP => [Fle2 | ]; last first.
- case: rank_witness => q /= q_pr -> Fge3 qQ _ sMqQ; split=> //.
- by case: eqP Fge3 => // ->; rewrite ltnNge Fple2.
- have Mqge3: 'r('O_q(M)) >= 3.
- rewrite (rank_pgroup (pcore_pgroup _ _)) /= -p_core_Fitting.
- by rewrite (p_rank_Sylow (nilpotent_pcore_Hall _ (Fitting_nil _))).
- have uMq: 'O_q(M)%G \in 'U.
- exact: (any_rank3_Fitting_Uniqueness _ Fge3 (pcore_pgroup _ _)).
- have uMqM := def_uniq_mmax uMq maxM (pcore_sub _ _).
- apply: sub_uniq_mmax (subset_trans sMqQ (normG _)) _ => //.
- apply: mFT_norm_proper (mFT_pgroup_proper qQ).
- by rewrite -rank_gt0 2?ltnW ?(leq_trans Mqge3) ?rankS.
- set q := max_pdiv _ => qQ _ sMqQ.
- have sylMq: q.-Sylow(M) 'O_q(M).
- by rewrite [pHall _ _ _]rank2_max_pcore_Sylow ?mFT_odd ?mmax_sol.
- have defNMq: 'N('O_q(M)) = M.
- rewrite (mmax_normal maxM (pcore_normal _ _)) // -rank_gt0.
- rewrite (rank_pgroup (pcore_pgroup _ _)) (p_rank_Sylow sylMq).
- by rewrite p_rank_gt0 pi_max_pdiv cardG_gt1 mmax_neq1.
- have sylMqG: q.-Sylow(G) 'O_q(M).
- by rewrite (mmax_sigma_Sylow maxM) ?defNMq.
- rewrite (sub_pHall sylMqG qQ) ?subsetT // defNMq; split=> //.
- have: 'r_p(G) > 2.
- by rewrite (leq_trans Age3) // (rank_pgroup pA) p_rankS ?subsetT.
- apply: contraTneq => <-; rewrite -(p_rank_Sylow sylMqG).
- rewrite -leqNgt -(rank_pgroup (pcore_pgroup _ _)) /=.
- by rewrite -p_core_Fitting (leq_trans _ Fle2) // rankS ?pcore_sub.
- have trCRq': [transitive 'O_p^'('C(R)), on |/|*(R; q) | 'JG].
- have cstrA: normed_constrained A.
- by apply: SCN_normed_constrained sylP _; rewrite inE SCN_A ltnW.
- have pR: p.-group R := pgroupS sRP pP.
- have snAR: A <|<| R by rewrite (nilpotent_subnormal (pgroup_nil pR)).
- have A'q: q \notin \pi(A) by rewrite def_piA.
- rewrite -(eq_pgroup _ def_piA) in pR.
- have [|?] := normed_trans_superset cstrA A'q snAR pR.
- by rewrite (eq_pcore _ (eq_negn def_piA)) Thompson_transitivity.
- by rewrite (eq_pcore _ (eq_negn def_piA)).
- apply/subsetP=> x nRx; have maxQx: (Q :^ x)%G \in |/|*(R; q).
- by rewrite (actsP (norm_acts_max_norm _ _)).
- have [y cRy [defQx]] := atransP2 trCRq' maxQ maxQx.
- rewrite -(mulgKV y x) groupMr.
- by rewrite (subsetP sNQ_M) // inE conjsgM defQx conjsgK.
- apply: subsetP cRy; apply: gFsub_trans.
- exact: subset_trans (centS _) sCAM.
- have sNA_M: 'N(A) \subset M.
- by rewrite sNR_M // subsetI sAP (subset_trans cAA).
- by rewrite sNR_M // subsetI subxx (subset_trans nAP).
-pose P0 := [~: P, 'N(P)].
-have ntP0: P0 != 1.
- apply/eqP=> /commG1P; rewrite centsC -(setIidPr (subsetT 'N(P))) /=.
- case/(Burnside_normal_complement sylP)/sdprodP=> _ /= defG nGp'P _.
- have prGp': 'O_p^'(G) \proper G.
- rewrite properT; apply: contra ntA; move/eqP=> defG'.
- rewrite -(setIidPl (subsetT A)) /= -defG'.
- by rewrite coprime_TIg // (pnat_coprime pA (pcore_pgroup _ _)).
- have ntGp': 'O_p^'(G) != 1.
- apply: contraTneq (mFT_pgroup_proper pP); rewrite -{2}defG => ->.
- by rewrite mul1g proper_irrefl.
- by have:= mFT_norm_proper ntGp' prGp'; rewrite properE gFnorm andbF.
-have sP0P: P0 \subset P by rewrite commg_subl.
-have pP0: p.-group P0 := pgroupS sP0P pP.
-have uNP0_mCA M: M \in 'M('C(A)) -> 'M('N(P0)) = [set M].
- move=> mCA_M; have [maxM sCAM] := setIdP mCA_M.
- have sAM := subset_trans cAA sCAM.
- pose F := 'F(M); pose D := 'O_p^'(F).
- have cDP0: P0 \subset 'C(D).
- have sA1A := Ohm_sub 1 A.
- have nDA1: 'Ohm_1(A) \subset 'N(D).
- by rewrite !gFnorm_trans // gFsub_trans // normsG.
- have abelA1: p.-abelem 'Ohm_1(A) by rewrite Ohm1_abelem.
- have dimA1ge3: logn p #|'Ohm_1(A)| >= 3.
- by rewrite -(rank_abelem abelA1) rank_Ohm1.
- have coDA1: coprime #|D| #|'Ohm_1(A)|.
- rewrite coprime_sym (coprimeSg sA1A) //.
- exact: pnat_coprime pA (pcore_pgroup _ _).
- rewrite centsC -[D](coprime_abelian_gen_cent (abelianS sA1A cAA) nDA1) //=.
- rewrite gen_subG /= -/D; apply/bigcupsP=> B /and3P[cycqB sBA1 nBA1].
- have abelB := abelemS sBA1 abelA1; have sBA := subset_trans sBA1 sA1A.
- have{cycqB} ncycB: ~~ cyclic B.
- move: cycqB; rewrite (abelem_cyclic (quotient_abelem _ abelA1)).
- rewrite card_quotient // -divgS // logn_div ?cardSg // leq_subLR addn1.
- by move/(leq_trans dimA1ge3); rewrite ltnS ltnNge -(abelem_cyclic abelB).
- have [x Bx sCxM']: exists2 x, x \in B^# & ~~ ('C[x] \subset M).
- suff: ~~ (\bigcup_(x in B^#) 'C[x] \subset M).
- case/subsetPn=> y /bigcupP[x Bx cxy] My'.
- by exists x; last by apply/subsetPn; exists y.
- have EpB: B \in 'E_p(M) by rewrite inE (subset_trans sBA sAM).
- apply: contra uA' => sCB_M.
- apply: uniq_mmaxS sBA (mFT_pgroup_proper pA) _.
- exact: noncyclic_cent1_sub_Uniqueness maxM EpB ncycB sCB_M.
- case/setD1P: Bx; rewrite -cycle_eq1 => ntx Bx.
- have{ntx} [L /setIdP[maxL /=]] := mmax_exists (mFT_cent_proper ntx).
- rewrite cent_cycle => sCxL.
- have{sCxM'} neLM : L != M by case: eqP sCxL sCxM' => // -> ->.
- have sNP_LM: 'N(P) \subset L :&: M.
- rewrite subsetI !sNP_mCA // inE maxL (subset_trans _ sCxL) // -cent_set1.
- by rewrite centS // sub1set (subsetP sBA).
- have sP0_LM': P0 \subset (L :&: M)^`(1).
- exact: subset_trans (commSg _ (normG _)) (dergS 1 sNP_LM).
- have DLle2: 'r(D :&: L) <= 2.
- apply: contraR neLM; rewrite -ltnNge -in_set1 => /rank_geP[E /nElemP[q]].
- rewrite /= -/D => /pnElemP[/subsetIP[sED sEL] abelE dimE3].
- have sEF: E \subset F := subset_trans sED (pcore_sub _ _).
- have Fge3: 'r_q(F) >= 3 by rewrite -dimE3 -p_rank_abelem // p_rankS.
- have qE := abelem_pgroup abelE.
- have uE: E \in 'U.
- apply: any_rank3_Fitting_Uniqueness Fge3 _ _ => //.
- by rewrite (rank_pgroup qE) p_rank_abelem ?dimE3.
- rewrite -(def_uniq_mmax uE maxM (subset_trans sEF (Fitting_sub _))).
- by rewrite inE maxL.
- have cDL_P0: P0 \subset 'C(D :&: L).
- have nsDM: D <| M by rewrite !gFnormal_trans.
- have{nsDM} [sDM nDM] := andP nsDM.
- have sDL: D :&: L \subset L :&: M by rewrite setIC setIS.
- have nsDL: D :&: L <| L :&: M by rewrite /normal sDL setIC normsIG.
- have [s ch_s last_s_DL] := chief_series_exists nsDL.
- have solLM := solvableS (subsetIl L M) (mmax_sol maxL).
- have solDL := solvableS sDL solLM.
- apply: (stable_series_cent (congr_group last_s_DL)) => //; first 1 last.
- rewrite coprime_sym (coprimegS (subsetIl _ _)) //.
- exact: pnat_coprime (pcore_pgroup _ _).
- have{last_s_DL}: last 1%G s \subset D :&: L by rewrite last_s_DL.
- rewrite /= -/P0; elim/last_ind: s ch_s => //= s U IHs.
- rewrite !rcons_path last_rcons /=; set V := last _ s.
- case/andP=> ch_s chUV sUDL; have [maxU _ nU_LM] := and3P chUV.
- have{maxU} /andP[/andP[sVU _] nV_LM] := maxgroupp maxU.
- have nVU := subset_trans sUDL (subset_trans sDL nV_LM).
- rewrite IHs ?(subset_trans sVU) // /stable_factor /normal sVU nVU !andbT.
- have nVP0 := subset_trans (subset_trans sP0_LM' (der_sub _ _)) nV_LM.
- rewrite commGC -sub_astabQR // (subset_trans sP0_LM') //.
- have /is_abelemP[q _ /andP[qUV _]]: is_abelem (U / V).
- exact: sol_chief_abelem solLM chUV.
- apply: rank2_der1_cent_chief qUV sUDL; rewrite ?mFT_odd //.
- exact: leq_trans (p_rank_le_rank _ _) DLle2.
- rewrite centsC (subset_trans cDL_P0) ?centS ?setIS //.
- by rewrite (subset_trans _ sCxL) // -cent_set1 centS ?sub1set.
- case: (ltnP 2 'r(F)) => [| Fle2].
- have [q q_pr -> /= Fq3] := rank_witness [group of F].
- have Mq3: 'r('O_q(M)) >= 3.
- rewrite (rank_pgroup (pcore_pgroup _ _)) /= -p_core_Fitting.
- by rewrite (p_rank_Sylow (nilpotent_pcore_Hall _ (Fitting_nil _))).
- have uMq: 'O_q(M)%G \in 'U.
- exact: any_rank3_Fitting_Uniqueness Fq3 (pcore_pgroup _ _) Mq3.
- apply: def_uniq_mmaxS (def_uniq_mmax uMq maxM (pcore_sub q _)); last first.
- exact: mFT_norm_proper ntP0 (mFT_pgroup_proper pP0).
- rewrite cents_norm // centsC (subset_trans cDP0) ?centS //=.
- rewrite -p_core_Fitting sub_pcore // => q1; move/eqnP=> ->{q1}.
- by apply/eqnP=> def_q; rewrite ltnNge def_q FmCAp_le2 in Fq3.
- rewrite (mmax_normal maxM) ?mmax_sup_id //.
- have sNP_M := sNP_mCA M mCA_M; have sPM := subset_trans (normG P) sNP_M.
- rewrite /normal comm_subG //= -/P0.
- have nFP: P \subset 'N(F) by apply: subset_trans (gFnorm _ _).
- have <-: F <*> P * 'N_M(P) = M.
- apply: Frattini_arg (pHall_subl (joing_subr _ _) (subsetT _) sylP).
- rewrite -(quotientGK (Fitting_normal M)) /= norm_joinEr //= -/F.
- rewrite -quotientK // cosetpre_normal -sub_abelian_normal ?quotientS //.
- by rewrite sub_der1_abelian ?rank2_der1_sub_Fitting ?mFT_odd ?mmax_sol.
- case/dprodP: (nilpotent_pcoreC p (Fitting_nil M)) => _ /= defF cDFp _.
- rewrite norm_joinEr //= -{}defF -(centC cDFp) -/D p_core_Fitting /= -/F.
- rewrite -!mulgA mul_subG //; first by rewrite cents_norm // centsC.
- rewrite mulgA [_ * P]mulSGid ?pcore_sub_Hall 1?(pHall_subl _ (subsetT _)) //.
- by rewrite mulSGid ?subsetI ?sPM ?normG // subIset // orbC normsRr.
-have [M mCA_M] := mmax_exists (mFT_cent_proper ntA).
-have [maxM sCAM] := setIdP mCA_M; have sAM := subset_trans cAA sCAM.
-have abelA1: p.-abelem 'Ohm_1(A) by rewrite Ohm1_abelem.
-have sA1A := Ohm_sub 1 A.
-have EpA1: 'Ohm_1(A)%G \in 'E_p(M) by rewrite inE (subset_trans sA1A).
-have ncycA1: ~~ cyclic 'Ohm_1(A).
- rewrite (abelem_cyclic abelA1) -(rank_abelem abelA1) rank_Ohm1.
- by rewrite -(subnKC Age3).
-have [x A1x sCxM']: exists2 x, x \in 'Ohm_1(A)^# & ~~ ('C[x] \subset M).
- suff: ~~ (\bigcup_(x in 'Ohm_1(A)^#) 'C[x] \subset M).
- case/subsetPn=> y /bigcupP[x A1 cxy] My'.
- by exists x; last by apply/subsetPn; exists y.
- apply: contra uA' => sCA1_M.
- apply: uniq_mmaxS sA1A (mFT_pgroup_proper pA) _.
- exact: noncyclic_cent1_sub_Uniqueness maxM EpA1 ncycA1 sCA1_M.
-case/setD1P: A1x; rewrite -cycle_eq1 => ntx A1x.
-have: 'C[x] \proper G by rewrite -cent_cycle mFT_cent_proper.
-case/mmax_exists=> L /setIdP[maxL sCxL].
-have mCA_L: L \in 'M('C(A)).
- rewrite inE maxL (subset_trans _ sCxL) //= -cent_set1 centS // sub1set.
- by rewrite (subsetP sA1A).
-case/negP: sCxM'; have/uNP0_mCA := mCA_L.
-by rewrite (uNP0_mCA M) // => /set1_inj->.
-Qed.
-
-(* This is B & G, Theorem 9.6, first assertion; note that B & G omit the *)
-(* (necessary!) condition K \proper G. *)
-Theorem rank3_Uniqueness K : K \proper G -> 'r(K) >= 3 -> K \in 'U.
-Proof.
-move=> prK /rank_geP[B /nElemP[p /pnElemP[sBK abelB dimB3]]].
-have [pB cBB _] := and3P abelB.
-suffices: B \in 'U by apply: uniq_mmaxS.
-have [P sylP sBP] := Sylow_superset (subsetT _) pB.
-have pP := pHall_pgroup sylP.
-have [|A SCN3_A] := rank3_SCN3 pP (mFT_odd _).
- by rewrite -dimB3 -(rank_abelem abelB) (rank_pgroup pB) p_rankS.
-have [SCN_A Age3] := setIdP SCN3_A.
-have: A \in 'SCN_3[p] by apply/bigcupP; exists P; rewrite // inE.
-move/SCN_3_Uniqueness=> uA; have cAA := SCN_abelian SCN_A.
-case/setIdP: SCN_A; case/andP=> sAP _ _; have pA := pgroupS sAP pP.
-apply: any_cent_rank3_Uniquness uA pB _ _ => //.
- by rewrite (abelem_cyclic abelB) dimB3.
-by rewrite -dimB3 -p_rank_abelem ?p_rankS.
-Qed.
-
-(* This is B & G, Theorem 9.6, second assertion *)
-Theorem cent_rank3_Uniqueness K : 'r(K) >= 2 -> 'r('C(K)) >= 3 -> K \in 'U.
-Proof.
-move=> Kge2 CKge3; have cCK_K: K \subset 'C('C(K)) by rewrite centsC.
-apply: cent_uniq_Uniqueness cCK_K _ => //.
-apply: rank3_Uniqueness (mFT_cent_proper _) CKge3.
-by rewrite -rank_gt0 ltnW.
-Qed.
-
-(* This is B & G, Theorem 9.6, final observation *)
-Theorem nonmaxElem2_Uniqueness p A : A \in 'E_p^2(G) :\: 'E*_p(G) -> A \in 'U.
-Proof.
-case/setDP=> EpA nmaxA; have [_ abelA dimA2]:= pnElemP EpA.
-case/setIdP: EpA => EpA _; have [pA _] := andP abelA.
-apply: cent_rank3_Uniqueness; first by rewrite -dimA2 -(rank_abelem abelA).
-have [E maxE sAE] := pmaxElem_exists EpA.
-have [/pElemP[_ abelE _]] := pmaxElemP maxE; have [pE cEE _] := and3P abelE.
-have: 'r(E) <= 'r('C(A)) by rewrite rankS // (subset_trans cEE) ?centS.
-apply: leq_trans; rewrite (rank_abelem abelE) -dimA2 properG_ltn_log //.
-by rewrite properEneq; case: eqP maxE nmaxA => // => /group_inj-> ->.
-Qed.
-
-End Nine.
-
diff --git a/mathcomp/odd_order/CeCILL-B b/mathcomp/odd_order/CeCILL-B
deleted file mode 120000
index 83e22fd..0000000
--- a/mathcomp/odd_order/CeCILL-B
+++ /dev/null
@@ -1 +0,0 @@
-../../etc/CeCILL-B \ No newline at end of file
diff --git a/mathcomp/odd_order/INSTALL b/mathcomp/odd_order/INSTALL
deleted file mode 120000
index 573e04d..0000000
--- a/mathcomp/odd_order/INSTALL
+++ /dev/null
@@ -1 +0,0 @@
-../../etc/INSTALL.md \ No newline at end of file
diff --git a/mathcomp/odd_order/Make b/mathcomp/odd_order/Make
deleted file mode 100644
index a7ba4be..0000000
--- a/mathcomp/odd_order/Make
+++ /dev/null
@@ -1,36 +0,0 @@
-BGappendixAB.v
-BGappendixC.v
-BGsection10.v
-BGsection11.v
-BGsection12.v
-BGsection13.v
-BGsection14.v
-BGsection15.v
-BGsection16.v
-BGsection1.v
-BGsection2.v
-BGsection3.v
-BGsection4.v
-BGsection5.v
-BGsection6.v
-BGsection7.v
-BGsection8.v
-BGsection9.v
-PFsection10.v
-PFsection11.v
-PFsection12.v
-PFsection13.v
-PFsection14.v
-PFsection1.v
-PFsection2.v
-PFsection3.v
-PFsection4.v
-PFsection5.v
-PFsection6.v
-PFsection7.v
-PFsection8.v
-PFsection9.v
-stripped_odd_order_theorem.v
-wielandt_fixpoint.v
-
--R . mathcomp.odd_order
diff --git a/mathcomp/odd_order/Makefile b/mathcomp/odd_order/Makefile
deleted file mode 100644
index 14acb5c..0000000
--- a/mathcomp/odd_order/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-H=@
-
-ifeq "$(COQBIN)" ""
-COQBIN=$(dir $(shell which coqtop))/
-endif
-
-COQDEP=$(COQBIN)/coqdep
-
-OLD_MAKEFLAGS:=$(MAKEFLAGS)
-MAKEFLAGS+=-B
-
-.DEFAULT_GOAL := all
-
-%:
- $(H)[ -e Makefile.coq ] || $(COQBIN)/coq_makefile -f Make -o Makefile.coq
- $(H)MAKEFLAGS="$(OLD_MAKEFLAGS)" $(MAKE) --no-print-directory \
- -f Makefile.coq $* \
- COQDEP='$(COQDEP) -c'
-
-.PHONY: clean
-clean:
- $(H)MAKEFLAGS="$(OLD_MAKEFLAGS)" $(MAKE) --no-print-directory \
- -f Makefile.coq clean
- $(H)rm -f Makefile.coq
-
diff --git a/mathcomp/odd_order/PFsection1.v b/mathcomp/odd_order/PFsection1.v
deleted file mode 100644
index 8e0b539..0000000
--- a/mathcomp/odd_order/PFsection1.v
+++ /dev/null
@@ -1,762 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime ssralg finset fingroup morphism.
-From mathcomp
-Require Import perm automorphism quotient action zmodp finalg center commutator.
-From mathcomp
-Require Import poly cyclic pgroup nilpotent matrix mxalgebra mxrepresentation.
-From mathcomp
-Require Import vector falgebra fieldext ssrnum algC rat algnum galois.
-From mathcomp
-Require Import classfun character inertia integral_char vcharacter.
-From mathcomp
-Require ssrint.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 1: Preliminary results. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory Num.Theory.
-Local Open Scope ring_scope.
-
-Local Notation algCF := [fieldType of algC].
-
-Section Main.
-
-Variable gT : finGroupType.
-
-(* This is Peterfalvi (1.1). *)
-Lemma odd_eq_conj_irr1 (G : {group gT}) t :
- odd #|G| -> (('chi[G]_t)^*%CF == 'chi_t) = ('chi_t == 1).
-Proof.
-rewrite -coprimen2 => oddG; pose A := <[1 : 'Z_2]>.
-have Z2P (a : 'Z_2): a = 0 \/ a = 1 by apply/pred2P; case: a => -[|[]].
-pose Ito (t : Iirr G) := [fun a : 'Z_2 => iter a (@conjC_Iirr _ G) t].
-pose Cto (C : {set gT}) := [fun a : 'Z_2 => iter a invg C].
-have IactP: is_action A Ito.
- split=> [|i /Z2P[]->] /Z2P[]-> //=; last by rewrite conjC_IirrK.
- exact/inv_inj/conjC_IirrK.
-have CactP: is_action A Cto.
- by split=> [|C /Z2P[]->] /Z2P[]-> //=; [apply: invg_inj | rewrite invgK].
-pose Iact := Action IactP; pose Cact := Action CactP.
-have n_cG_A: [acts A, on classes G | Cact].
- rewrite cycle_subG !inE cycle_id; apply/subsetP=> _ /imsetP[x Gx ->].
- by rewrite !inE /= -classVg mem_classes ?groupV.
-transitivity (t \in [set 0]); last by rewrite inE irr_eq1.
-suffices{t} /eqP->: [set 0] == 'Fix_Iact[1].
- by rewrite !inE sub1set inE -(inj_eq irr_inj) conjC_IirrE.
-rewrite eqEcard !(sub1set, inE) conjC_Iirr_eq0 eqxx /=.
-rewrite (card_afix_irr_classes (cycle_id _) n_cG_A) => [|i x xy Gx]; last first.
- rewrite inE => {xy}/imsetP[y Gy /(canRL invgK)->].
- by rewrite -conjVg cfunJ {y Gy}//= conjC_IirrE cfunE -irr_inv invgK.
-have ->: #|[set 0 : Iirr G]| = #|[1 {set gT}]| by rewrite !cards1.
-apply/subset_leq_card/subsetP=> _ /setIdP[/imsetP[x Gx ->] /afix1P-DxGV].
-have /imsetP[y Gy DxV]: x^-1%g \in x ^: G by rewrite -DxGV memV_invg class_refl.
-have{Gy} cxy: y \in 'C[x].
- suffices cxy2: (y ^+ 2)%g \in 'C[x] by rewrite -(expgK oddG Gy) groupX.
- by rewrite cent1C cent1E conjgC conjgM -DxV conjVg -DxV invgK.
-rewrite inE classG_eq1 -in_set1 -(expgK oddG Gx) groupX // inE.
-by rewrite -eq_invg_mul DxV conjgE -(cent1P cxy) mulKg.
-Qed.
-
-Variables G H : {group gT}.
-
-(* This is Peterfalvi (1.2). *)
-Lemma irr_reg_off_ker_0 t g : g \in G ->
- H <| G -> ~~ (H \subset cfker 'chi[G]_t) -> 'C_H[g] = 1%g -> 'chi_t g = 0.
-Proof.
-pose kerH i := H \subset cfker 'chi[G]_i => Gg nsHG kerH't regHg; apply/eqP.
-pose sum_norm2 x := \sum_i `|'chi_i x| ^+ 2.
-have norm2_ge0 a: 0 <= `|a| ^+ 2 :> algC by rewrite exprn_ge0 ?normr_ge0.
-have{regHg}: sum_norm2 gT G g <= sum_norm2 _ (G / H)%G (coset H g).
- rewrite ![sum_norm2 _ _ _](eq_bigr _ (fun _ _ => normCK _)).
- rewrite !second_orthogonality_relation ?mem_quotient // !class_refl ler_nat.
- suffices /card_isog->: 'C_G[g] \isog 'C_G[g] / H.
- exact/subset_leq_card/quotient_subcent1.
- by apply/quotient_isog; rewrite ?subIset 1?normal_norm // setICA regHg setIg1.
-rewrite /sum_norm2 (bigID kerH) ?sum_norm_irr_quo //= -ler_subr_addl subrr.
-rewrite ler_eqVlt psumr_eq0 ?ler_gtF ?sumr_ge0 // orbF => /allP/(_ t)/implyP.
-by rewrite mem_index_enum kerH't expf_eq0 normr_eq0.
-Qed.
-
-(* This is Peterfalvi (1.3)(a). *)
-Lemma equiv_restrict_compl A m (Phi : m.-tuple 'CF(H)) (mu : 'CF(G)) d :
- H \subset G -> A <| H -> basis_of 'CF(H, A) Phi ->
- ({in A, mu =1 \sum_i d i *: 'chi_i} <->
- (forall j : 'I_m,
- \sum_i '[Phi`_j, 'chi_i] * (d i)^* = '['Ind[G] Phi`_j, mu])).
-Proof.
-move=> sHG nsAH BPhi; have [sAH nAH] := andP nsAH.
-have APhi (i : 'I_m) : Phi`_i \in 'CF(H, A).
- by apply: (basis_mem BPhi _); apply: mem_nth; rewrite size_tuple.
-pose D := 'Res[H] mu - \sum_i d i *: 'chi_i.
-transitivity (D \in 'CF(H, H :\: A)).
- split=> [A'D | /cfun_onP A'D x Ax].
- apply/cfun_onP=> x; rewrite inE negb_and negbK.
- case/orP=> [Ax | /cfun0-> //]; rewrite !cfunE -A'D //.
- by rewrite cfResE ?subrr ?(subsetP sAH).
- have:= A'D x; rewrite !cfunE !inE Ax => /(_ isT)/(canRL (subrK _)).
- by rewrite add0r cfResE // ?(subsetP sAH).
-have F0 (j : 'I_m) :
- (\sum_i '[Phi`_j, 'chi_i] * (d i)^* == '['Ind Phi`_j, mu])
- = ('[Phi`_j, D] == 0).
- rewrite raddfB raddf_sum /= Frobenius_reciprocity subr_eq0 eq_sym.
- by congr (_ == _); apply: eq_bigr=> i _; rewrite cfdotZr mulrC.
-split=> [HH j | HH].
- by apply/eqP; rewrite F0; apply/eqP; apply: cfdot_complement.
-have{F0} F1 (j : 'I_m) : '[Phi`_j, D]_H = 0.
- by have/eqP := HH j; rewrite F0 => /eqP.
-have: (D \in 'CF(H))%VS by rewrite memvf.
-rewrite -(cfun_complement nsAH) => /memv_addP[f Cf [g Cg defD]].
-have: '[f, f + g] = 0.
- rewrite -defD (coord_basis BPhi Cf) cfdot_suml.
- by rewrite big1 // => i _; rewrite cfdotZl F1 mulr0.
-rewrite raddfD /= {1}(cfdot_complement Cf Cg) addr0 => /eqP.
-by rewrite cfnorm_eq0 defD => /eqP->; rewrite add0r.
-Qed.
-
-(* This is Peterfalvi (1.3)(b). *)
-Lemma equiv_restrict_compl_ortho A m (Phi : m.-tuple 'CF(H)) mu_ :
- H \subset G -> A <| H -> basis_of 'CF(H, A) Phi ->
- (forall i j, '[mu_ i, mu_ j] = (i == j)%:R) ->
- (forall j : 'I_m, 'Ind[G] Phi`_j = \sum_i '[Phi`_j, 'chi_i] *: mu_ i) ->
- [/\ forall i, {in A, mu_ i =1 'chi_i}
- & forall mu, (forall i, '[mu, mu_ i] = 0) -> {in A, forall x, mu x = 0}].
-Proof.
-move=> HsG nsAH /equiv_restrict_compl Phi_A Mo IP; split=> [/= i | mu Cmu x Ax].
- have->: 'chi[H]_i = \sum_j (j == i)%:R *: 'chi_j.
- rewrite (bigD1 i) //= eqxx scale1r big1 ?addr0 // => j /negPf->.
- by rewrite scale0r.
- apply/Phi_A=> // j; rewrite IP cfdot_suml.
- by apply: eq_bigr=> k _; rewrite cfdotZl rmorph_nat Mo.
-transitivity ((\sum_j 0 *: 'chi[H]_j) x); last first.
- by rewrite sum_cfunE big1 // => j _; rewrite cfunE mul0r.
-move: x Ax; apply/Phi_A=> // j.
-rewrite -mulr_suml rmorph0 mulr0 IP cfdot_suml big1 // => k _.
-by rewrite cfdotZl [d in _ * d]cfdotC Cmu rmorph0 mulr0.
-Qed.
-
-Let vchar_isometry_base3 f f' :
- f \in 'Z[irr G, G^#] -> '[f]_G = 2%:R ->
- f' \in 'Z[irr G, G^#] -> '[f']_G = 2%:R ->
- '[f, f'] = 1 ->
- exists es : _ * bool, let: (i, j, k, epsilon) := es in
- [/\ f = (-1) ^+ epsilon *: ('chi_j - 'chi_i),
- f' = (-1) ^+ epsilon *: ('chi_j - 'chi_k)
- & uniq [:: i; j; k]].
-Proof.
-move=> Hf H2f Hf1 H2f1.
-have [j [i neq_ij ->]] := vchar_norm2 Hf H2f.
-have [j' [k neq_kj' ->]] := vchar_norm2 Hf1 H2f1.
-rewrite cfdotBl !cfdotBr !cfdot_irr opprB addrAC !addrA.
-do 2!move/(canRL (subrK _)); rewrite -(natrD _ 1) -!natrD => /eqP.
-rewrite eqr_nat; have [eq_jj' | neq_jj'] := altP (j =P j').
- rewrite (eq_sym j) -eq_jj' {1}eq_jj' (negbTE neq_ij) (negbTE neq_kj').
- rewrite eqSS (can_eq oddb) => /eqP neq_ik; exists (i, j, k, false).
- by rewrite !scaler_sign /= !inE neq_ik orbF neq_ij eq_sym eq_jj' neq_kj'.
-case: (i =P k) => // eq_ik; exists (j, i, j', true).
-rewrite !scaler_sign !opprB /= !inE eq_sym negb_or neq_ij neq_jj'.
-by rewrite eq_ik neq_kj'.
-Qed.
-
-Let vchar_isometry_base4 (eps : bool) i j k n m :
- let f1 := 'chi_j - 'chi_i in
- let f2 := 'chi_k - 'chi_i in
- let f3 := 'chi_n - 'chi_m in
- j != k -> '[f3, f1]_G = (-1) ^+ eps -> '[f3, f2] = (-1) ^+ eps ->
- if eps then n == i else m == i.
-Proof.
-move=> /= Hjk; wlog ->: eps n m / eps = false.
- case: eps; last exact; move/(_ false m n)=> IH nm_ji nm_ki.
- by apply: IH; rewrite // -opprB cfdotNl (nm_ji, nm_ki) opprK.
-rewrite !cfdotBl !cfdotBr !cfdot_irr !opprB addrAC addrA.
-do 2!move/(canRL (subrK _)); rewrite -(natrD _ 1) -!natrD.
-move/(can_inj natCK); case: (m == i) => //.
-case: eqP => // ->; case: (j == i) => // _.
-rewrite subr0 add0r => /(canRL (subrK _)); rewrite -(natrD _ 1).
-by move/(can_inj natCK); rewrite (negbTE Hjk).
-Qed.
-
-(* This is Peterfalvi (1.4). *)
-Lemma vchar_isometry_base m L (Chi : m.-tuple 'CF(H))
- (tau : {linear 'CF(H) -> 'CF(G)}) :
- (1 < m)%N -> {subset Chi <= irr H} -> free Chi ->
- (forall chi, chi \in Chi -> chi 1%g = Chi`_0 1%g) ->
- (forall i : 'I_m, (Chi`_i - Chi`_0) \in 'CF(H, L)) ->
- {in 'Z[Chi, L], isometry tau, to 'Z[irr G, G^#]} ->
- exists2 mu : m.-tuple (Iirr G),
- uniq mu
- & exists epsilon : bool, forall i : 'I_m,
- tau (Chi`_i - Chi`_0) = (-1) ^+ epsilon *: ('chi_(mu`_i) - 'chi_(mu`_0)).
-Proof.
-case: m Chi => [|[|m]] // Chi _ irrChi Chifree Chi1 ChiCF [iso_tau Ztau].
-rewrite -(tnth_nth 0 _ 0); set chi := tnth Chi.
-have chiE i: chi i = Chi`_i by rewrite -tnth_nth.
-have inChi i: chi i \in Chi by apply: mem_tnth.
-have{irrChi} irrChi i: chi i \in irr H by apply: irrChi.
-have eq_chi i j: (chi i == chi j) = (i == j).
- by rewrite /chi !(tnth_nth 0) nth_uniq ?size_tuple ?free_uniq.
-have dot_chi i j: '[chi i, chi j] = (i == j)%:R.
- rewrite -eq_chi; have [/irrP[{i}i ->] /irrP[{j}j ->]] := (irrChi i,irrChi j).
- by rewrite cfdot_irr inj_eq //; apply: irr_inj.
-pose F i j := chi i - chi j.
-have DF i j : F i j = F i 0 - F j 0 by rewrite /F opprB addrA subrK.
-have ZF i j: F i j \in 'Z[Chi, L].
- by rewrite zchar_split rpredB ?mem_zchar // DF memvB // /F !chiE.
-have htau2 i j: i != j -> '[tau (F i j)] = 2%:R.
- rewrite iso_tau // cfnormB -cfdotC !dot_chi !eqxx eq_sym => /negbTE->.
- by rewrite -!natrD subr0.
-have htau1 i j: j != 0 -> j != i -> i != 0 -> '[tau (F i 0), tau (F j 0)] = 1.
- rewrite iso_tau // cfdotBl !cfdotBr opprB !dot_chi !(eq_sym j).
- by do 3!move/negbTE->; rewrite !subr0 add0r.
-have [m0 | nz_m] := boolP (m == 0%N).
- rewrite -2!eqSS eq_sym in m0; move: (htau2 1 0 isT).
- case/(vchar_norm2 (Ztau _ (ZF 1 0))) => [k1 [k0 neq_k01 eq_mu]].
- pose mu := @Tuple _ _ [:: k0; k1] m0.
- exists mu; first by rewrite /= andbT inE.
- exists false => i; rewrite scale1r chiE.
- have: (i : nat) \in iota 0 2 by rewrite mem_iota (eqP m0) (valP i).
- rewrite !inE; case/pred2P=> ->; first by rewrite !subrr linear0.
- by rewrite -eq_mu /F !chiE.
-have m_gt2: (2 < m.+2)%N by rewrite !ltnS lt0n.
-pose i2 := Ordinal m_gt2.
-case: (@vchar_isometry_base3 (tau (F 1 0)) (tau (F i2 0))); auto.
-case=> [[[k1 k0] k2] e] []; set d := (-1) ^+ e => eq10 eq20.
-rewrite /= !inE => /and3P[/norP[nek10 nek12]]; rewrite eq_sym => nek20 _.
-have muP i:
- {k | (i == 0) ==> (k == k0) & tau (F i 0) == d *: ('chi_k0 - 'chi_k)}.
-- apply: sig2W; have [-> | nei0] := altP (i =P 0).
- by exists k0; rewrite ?eqxx // /F !subrr !linear0.
- have /(vchar_norm2 (Ztau _ (ZF i 0)))[k [k' nekk' eqFkk']] := htau2 i 0 nei0.
- have [-> | neq_i1] := eqVneq i 1; first by exists k1; rewrite // -eq10.
- have [-> | neq_i2] := eqVneq i i2; first by exists k2; rewrite // -eq20.
- have:= @vchar_isometry_base4 (~~ e) k0 k1 k2 k k' nek12.
- have ZdK u v w: '[u, v - w]_G = (-1) ^+ (~~ e) * '[u, d *: (w - v)].
- rewrite cfdotZr rmorph_sign mulrA -signr_addb addNb addbb mulN1r.
- by rewrite -cfdotNr opprB.
- rewrite -eqFkk' ZdK -eq10 {}ZdK -eq20 !htau1 //; try by rewrite eq_sym.
- move/(_ (mulr1 _) (mulr1 _)); rewrite /d eqFkk'.
- by case e => /eqP <-; [exists k | exists k']; rewrite ?scaler_sign ?opprB.
-pose mu := [tuple of [seq s2val (muP i) | i <- ord_tuple m.+2]]; exists mu.
- rewrite map_inj_uniq ?enum_uniq // => i j.
- case: (muP i) (muP j) => /= ki _ /eqP eq_i0 [/= kj _ /eqP eq_j0] eq_kij.
- apply/eqP; rewrite -eq_chi -subr_eq0 -cfnorm_eq0 -iso_tau ?ZF //.
- rewrite -[chi i](subrK (chi 0)) -addrA linearD eq_i0 eq_kij -eq_j0.
- by rewrite -linearD -opprB subrr !raddf0.
-exists (~~ e) => i; rewrite -addbT signr_addb -/d -scalerA scaleN1r opprB.
-rewrite -!tnth_nth -/(F i 0) tnth_map tnth_ord_tuple.
-suffices /= ->: mu`_0 = k0 by case: (muP i) => /= k _ /eqP.
-rewrite -(tnth_nth 0 _ 0) tnth_map tnth_ord_tuple.
-by case: (muP 0) => /= k /(k =P k0).
-Qed.
-
-(* This is Peterfalvi (1.5)(a). *)
-Lemma cfResInd_sum_cfclass t : H <| G ->
- 'Res[H] ('Ind[G] 'chi_t)
- = #|'I_G['chi_t] : H|%:R *: \sum_(xi <- ('chi_t ^: G)%CF) xi.
-Proof.
-set T := 'I_G['chi_t] => nsHG; have [sHG nHG] := andP nsHG.
-apply/cfun_inP=> h Hh; rewrite cfResE ?cfIndE // cfunE sum_cfunE.
-apply: (canLR (mulKf (neq0CG H))).
-rewrite mulrA -natrM Lagrange ?sub_Inertia //= -/T reindex_cfclass //=.
-rewrite mulr_sumr [s in _ = s]big_mkcond /= (reindex_inj invg_inj).
-rewrite (partition_big (conjg_Iirr t) xpredT) //=; apply: eq_bigr => i _.
-have [[y Gy chi_i] | not_i_t] := cfclassP _ _ _; last first.
- apply: big1 => z; rewrite groupV => /andP[Gz /eqP def_i].
- by case: not_i_t; exists z; rewrite // -def_i conjg_IirrE.
-rewrite -(card_rcoset _ y) mulr_natl -sumr_const; apply: eq_big => z.
- rewrite -(inj_eq irr_inj) conjg_IirrE chi_i mem_rcoset inE groupMr ?groupV //.
- apply: andb_id2l => Gz; rewrite eq_sym (cfConjg_eqE _ nsHG) //.
- by rewrite mem_rcoset inE groupM ?groupV.
-rewrite groupV => /andP[Gz /eqP <-].
-by rewrite conjg_IirrE cfConjgE ?(subsetP nHG).
-Qed.
-
-(* This is Peterfalvi (1.5)(b), main formula. *)
-Lemma cfnorm_Ind_irr t :
- H <| G -> '['Ind[G] 'chi[H]_t] = #|'I_G['chi_t] : H|%:R.
-Proof.
-set r := _%:R => HnG; have HsG := normal_sub HnG.
-rewrite -Frobenius_reciprocity cfResInd_sum_cfclass //= cfdotZr rmorph_nat -/r.
-rewrite reindex_cfclass // cfdot_sumr (bigD1 t) ?cfclass_refl //= cfnorm_irr.
-rewrite big1 ?addr0 ?mulr1 // => j /andP[_ /negbTE].
-by rewrite eq_sym cfdot_irr => ->.
-Qed.
-
-(* This is Peterfalvi (1.5)(b), irreducibility remark. *)
-Lemma inertia_Ind_irr t :
- H <| G -> 'I_G['chi[H]_t] \subset H -> 'Ind[G] 'chi_t \in irr G.
-Proof.
-rewrite -indexg_eq1 => nsHG /eqP r1.
-by rewrite irrEchar cfInd_char ?irr_char //= cfnorm_Ind_irr ?r1.
-Qed.
-
-(* This is Peterfalvi (1.5)(c). *)
-Lemma cfclass_Ind_cases t1 t2 : H <| G ->
- if 'chi_t2 \in ('chi[H]_t1 ^: G)%CF
- then 'Ind[G] 'chi_t1 = 'Ind[G] 'chi_t2
- else '['Ind[G] 'chi_t1, 'Ind[G] 'chi_t2] = 0.
-Proof.
-move=> nsHG; have [/cfclass_Ind-> // | not_ch1Gt2] := ifPn.
-rewrite -Frobenius_reciprocity cfResInd_sum_cfclass // cfdotZr rmorph_nat.
-rewrite cfdot_sumr reindex_cfclass // big1 ?mulr0 // => j; rewrite cfdot_irr.
-case: eqP => // <- /idPn[]; apply: contra not_ch1Gt2 => /cfclassP[y Gy ->].
-by apply/cfclassP; exists y^-1%g; rewrite ?groupV ?cfConjgK.
-Qed.
-
-(* Useful consequences of (1.5)(c) *)
-Lemma not_cfclass_Ind_ortho i j :
- H <| G -> ('chi_i \notin 'chi_j ^: G)%CF ->
- '['Ind[G, H] 'chi_i, 'Ind[G, H] 'chi_j] = 0.
-Proof. by move/(cfclass_Ind_cases i j); rewrite cfclass_sym; case: ifP. Qed.
-
-Lemma cfclass_Ind_irrP i j :
- H <| G ->
- reflect ('Ind[G, H] 'chi_i = 'Ind[G, H] 'chi_j) ('chi_i \in 'chi_j ^: G)%CF.
-Proof.
-move=> nsHG; have [sHG _] := andP nsHG.
-case: ifP (cfclass_Ind_cases j i nsHG) => [|_ Oji]; first by left.
-right=> eq_chijG; have /negP[]: 'Ind[G] 'chi_i != 0 by apply: Ind_irr_neq0.
-by rewrite -cfnorm_eq0 {1}eq_chijG Oji.
-Qed.
-
-Lemma card_imset_Ind_irr (calX : {set Iirr H}) :
- H <| G -> {in calX, forall i, 'Ind 'chi_i \in irr G} ->
- {in calX & G, forall i y, conjg_Iirr i y \in calX} ->
- #|calX| = (#|G : H| * #|[set cfIirr ('Ind[G] 'chi_i) | i in calX]|)%N.
-Proof.
-move=> nsHG irrIndX sXGX; have [sHG _] := andP nsHG; set f := fun i => cfIirr _.
-rewrite -sum1_card (partition_big_imset f) /= mulnC -sum_nat_const.
-apply: eq_bigr => _ /imsetP[i Xi ->]; transitivity (size (cfclass 'chi_i G)).
- rewrite -sum1_size reindex_cfclass //; apply: eq_bigl => j.
- case Xj: (j \in calX).
- rewrite -(inj_eq irr_inj) !(cfIirrPE irrIndX) //.
- exact/eqP/cfclass_Ind_irrP.
- apply/esym/(contraFF _ Xj)=> /cfclassP[y Gy Dj].
- by rewrite -conjg_IirrE in Dj; rewrite (irr_inj Dj) sXGX.
-rewrite -(Lagrange_index (Inertia_sub G 'chi_i)) ?sub_Inertia //.
-rewrite -size_cfclass ((#|_ : _| =P 1)%N _) ?muln1 // -eqC_nat.
-by rewrite -cfnorm_Ind_irr // -(cfIirrPE irrIndX) ?cfnorm_irr.
-Qed.
-
-(* This is Peterfalvi (1.5)(d). *)
-Lemma scaled_cfResInd_sum_cfclass t : H <| G ->
- let chiG := 'Ind[G] 'chi_t in
- (chiG 1%g / '[chiG]) *: 'Res[H] chiG
- = #|G : H|%:R *: (\sum_(xi <- ('chi_t ^: G)%CF) xi 1%g *: xi).
-Proof.
-move=> nsHG chiG; have [sHG _] := andP nsHG.
-rewrite cfResInd_sum_cfclass // cfnorm_Ind_irr // scalerA cfInd1 //.
-rewrite divfK ?pnatr_eq0 -?lt0n // -scalerA linear_sum !reindex_cfclass //=.
-congr (_ *: _); apply: eq_bigr => _ /cfclassP[y _ ->].
-by rewrite cfConjg1.
-Qed.
-
-(* This is Peterfalvi (1.5)(e). *)
-Lemma odd_induced_orthogonal t :
- H <| G -> odd #|G| -> t != 0 ->
- '['Ind[G, H] 'chi_t, ('Ind[G] 'chi_t)^*] = 0.
-Proof.
-move=> nsHG oddG nz_t; have [sHG _] := andP nsHG.
-have:= cfclass_Ind_cases t (conjC_Iirr t) nsHG.
-rewrite conjC_IirrE conj_cfInd; case: cfclassP => // [[g Gg id_cht]].
-have oddH: odd #|H| := pgroup.oddSg sHG oddG.
-case/eqP: nz_t; apply: irr_inj; rewrite irr0.
-apply/eqP; rewrite -odd_eq_conj_irr1 // id_cht; apply/eqP.
-have F1: ('chi_t ^ (g ^+ 2))%CF = 'chi_t.
- rewrite (cfConjgM _ nsHG) // -id_cht -conj_cfConjg -id_cht.
- exact: cfConjCK.
-suffices /eqP->: g == ((g ^+ 2) ^+ #|G|./2.+1)%g.
- elim: _./2.+1 => [|n IHn]; first exact: cfConjgJ1.
- by rewrite expgS (cfConjgM _ nsHG) ?groupX // F1.
-rewrite eq_mulVg1 expgS -expgM mul2n -mulgA mulKg -expgS -order_dvdn.
-by rewrite -add1n -[1%N](congr1 nat_of_bool oddG) odd_double_half order_dvdG.
-Qed.
-
-(* This is Peterfalvi (1.6)(a). *)
-Lemma sub_cfker_Ind_irr A i :
- H \subset G -> G \subset 'N(A) ->
- (A \subset cfker ('Ind[G, H] 'chi_i)) = (A \subset cfker 'chi_i).
-Proof. by move=> sHG nAG; rewrite cfker_Ind_irr ?sub_gcore. Qed.
-
-(* Some consequences and related results. *)
-Lemma sub_cfker_Ind (A : {set gT}) chi :
- A \subset H -> H \subset G -> G \subset 'N(A) -> chi \is a character ->
- (A \subset cfker ('Ind[G, H] chi)) = (A \subset cfker chi).
-Proof.
-move=> sAH sHG nAG Nchi; have [-> | nz_chi] := eqVneq chi 0.
- by rewrite raddf0 !cfker_cfun0 !(subset_trans sAH).
-by rewrite cfker_Ind ?sub_gcore.
-Qed.
-
-Lemma cfInd_irr_eq1 i :
- H <| G -> ('Ind[G, H] 'chi_i == 'Ind[G, H] 1) = (i == 0).
-Proof.
-case/andP=> sHG nHG; apply/eqP/idP=> [chi1 | /eqP->]; last by rewrite irr0.
-rewrite -subGcfker -(sub_cfker_Ind_irr _ sHG nHG) chi1 -irr0.
-by rewrite sub_cfker_Ind_irr ?cfker_irr0.
-Qed.
-
-Lemma sub_cfker_constt_Res_irr (A : {set gT}) i j :
- j \in irr_constt ('Res[H, G] 'chi_i) ->
- A \subset H -> H \subset G -> G \subset 'N(A) ->
- (A \subset cfker 'chi_j) = (A \subset cfker 'chi_i).
-Proof.
-move=> iHj sAH sHG nAG; apply/idP/idP=> kerA.
- have jGi: i \in irr_constt ('Ind 'chi_j) by rewrite constt_Ind_Res.
- rewrite (subset_trans _ (cfker_constt _ jGi)) ?cfInd_char ?irr_char //=.
- by rewrite sub_cfker_Ind_irr.
-rewrite (subset_trans _ (cfker_constt _ iHj)) ?cfRes_char ?irr_char //=.
-by rewrite cfker_Res ?irr_char // subsetI sAH.
-Qed.
-
-Lemma sub_cfker_constt_Ind_irr (A : {set gT}) i j :
- i \in irr_constt ('Ind[G, H] 'chi_j) ->
- A \subset H -> H \subset G -> G \subset 'N(A) ->
- (A \subset cfker 'chi_j) = (A \subset cfker 'chi_i).
-Proof. by rewrite constt_Ind_Res; apply: sub_cfker_constt_Res_irr. Qed.
-
-(* This is a stronger version of Peterfalvi (1.6)(b). *)
-Lemma cfIndMod (K : {group gT}) (phi : 'CF(H / K)) :
- K \subset H -> H \subset G -> K <| G ->
- 'Ind[G] (phi %% K)%CF = ('Ind[G / K] phi %% K)%CF.
-Proof. by move=> sKH sHG /andP[_ nKG]; rewrite cfIndMorph ?ker_coset. Qed.
-
-Lemma cfIndQuo (K : {group gT}) (phi : 'CF(H)) :
- K \subset cfker phi -> H \subset G -> K <| G ->
- 'Ind[G / K] (phi / K)%CF = ('Ind[G] phi / K)%CF.
-Proof.
-move=> kerK sHG nsKG; have sKH := subset_trans kerK (cfker_sub phi).
-have nsKH := normalS sKH sHG nsKG.
-by apply: canRL (cfModK nsKG) _; rewrite -cfIndMod // cfQuoK.
-Qed.
-
-Section IndSumInertia.
-
-Variable s : Iirr H.
-
-Let theta := 'chi_s.
-Let T := 'I_G[theta].
-Let calA := irr_constt ('Ind[T] theta).
-Let calB := irr_constt ('Ind[G] theta).
-Let AtoB (t : Iirr T) := Ind_Iirr G t.
-Let e_ t := '['Ind theta, 'chi[T]_t].
-
-Hypothesis nsHG: H <| G.
-(* begin hide *)
-Let sHG : H \subset G. Proof. exact: normal_sub. Qed.
-Let nHG : G \subset 'N(H). Proof. exact: normal_norm. Qed.
-Let nsHT : H <| T. Proof. exact: normal_Inertia. Qed.
-Let sHT : H \subset T. Proof. exact: normal_sub. Qed.
-Let nHT : T \subset 'N(H). Proof. exact: normal_norm. Qed.
-Let sTG : T \subset G. Proof. exact: subsetIl. Qed.
-(* end hide *)
-
-(* This is Peterfalvi (1.7)(a). *)
-Lemma cfInd_sum_Inertia :
- [/\ {in calA, forall t, 'Ind 'chi_t \in irr G},
- {in calA, forall t, 'chi_(AtoB t) = 'Ind 'chi_t},
- {in calA &, injective AtoB},
- AtoB @: calA =i calB
- & 'Ind[G] theta = \sum_(t in calA) e_ t *: 'Ind 'chi_t].
-Proof.
-have [AtoBirr AtoBinj defB _ _] := constt_Inertia_bijection s nsHG.
-split=> // [i Ai|]; first exact/cfIirrE/AtoBirr.
-rewrite -(cfIndInd _ sTG sHT) {1}['Ind theta]cfun_sum_constt linear_sum.
-by apply: eq_bigr => i _; rewrite linearZ.
-Qed.
-
-Hypothesis abTbar : abelian (T / H).
-
-(* This is Peterfalvi (1.7)(b). *)
-Lemma cfInd_central_Inertia :
- exists2 e, [/\ e \in Cnat, e != 0 & {in calA, forall t, e_ t = e}]
- & [/\ 'Ind[G] theta = e *: \sum_(j in calB) 'chi_j,
- #|calB|%:R = #|T : H|%:R / e ^+ 2
- & {in calB, forall i, 'chi_i 1%g = #|G : T|%:R * e * theta 1%g}].
-Proof.
-have [t1 At1] := constt_cfInd_irr s sHT; pose psi1 := 'chi_t1.
-pose e := '['Ind theta, psi1].
-have NthT: 'Ind[T] theta \is a character by rewrite cfInd_char ?irr_char.
-have Ne: e \in Cnat by rewrite Cnat_cfdot_char_irr.
-have Dpsi1H: 'Res[H] psi1 = e *: theta.
- have psi1Hs: s \in irr_constt ('Res psi1) by rewrite -constt_Ind_Res.
- rewrite (Clifford_Res_sum_cfclass nsHT psi1Hs) cfclass_invariant ?subsetIr //.
- by rewrite big_seq1 cfdot_Res_l cfdotC conj_Cnat.
-have linL j: 'chi[T / H]_j \is a linear_char by apply/char_abelianP.
-have linLH j: ('chi_j %% H)%CF \is a linear_char := cfMod_lin_char (linL j).
-pose LtoT (j : Iirr (T / H)) := mul_mod_Iirr t1 j.
-have LtoTE j: 'chi_(LtoT j) = ('chi_j %% H)%CF * psi1.
- by rewrite !(mod_IirrE, cfIirrE) // mul_lin_irr ?mem_irr ?cfMod_lin_char.
-have psiHG: 'Ind ('Res[H] psi1) = \sum_j 'chi_(LtoT j).
- transitivity ((cfReg (T / H) %% H)%CF * psi1); last first.
- rewrite cfReg_sum linear_sum /= mulr_suml; apply: eq_bigr => i _.
- by rewrite LtoTE // lin_char1 ?scale1r.
- apply/cfun_inP=> x Tx; rewrite cfunE cfModE // cfRegE mulrnAl mulrb.
- rewrite (sameP eqP (kerP _ (subsetP nHT x Tx))) ker_coset.
- case: ifPn => [Hx | H'x]; last by rewrite (cfun_on0 (cfInd_normal _ _)).
- rewrite card_quotient // -!(cfResE _ sHT) // cfRes_Ind_invariant ?cfunE //.
- by rewrite -subsetIidl (subset_trans _ (sub_inertia_Res _ _)) ?sub_Inertia.
-have imLtoT: {subset calA <= codom LtoT}.
- move=> t At; apply/codomP/exists_eqP.
- have{At}: t \in irr_constt ('Ind ('Res[H] 'chi_t1)).
- by rewrite Dpsi1H linearZ irr_consttE cfdotZl mulf_neq0.
- apply: contraR; rewrite negb_exists => /forallP imL't.
- by rewrite psiHG cfdot_suml big1 // => j _; rewrite cfdot_irr mulrb ifN_eqC.
-have De_ t: t \in calA -> e_ t = e.
- case/imLtoT/codomP=> j ->; rewrite /e_ LtoTE /e -!cfdot_Res_r rmorphM /=.
- by rewrite cfRes_sub_ker ?cfker_mod // mulr_algl lin_char1 ?scale1r.
-have{imLtoT} A_1 t: t \in calA -> 'chi_t 1%g = e * theta 1%g.
- case/imLtoT/codomP=> j ->; rewrite LtoTE //= cfunE.
- by rewrite (lin_char1 (linLH j)) mul1r -(cfRes1 H) Dpsi1H cfunE.
-exists e => //; have [_ defAtoB injAtoB imAtoB ->] := cfInd_sum_Inertia.
-rewrite -(eq_bigl _ _ imAtoB) -(eq_card imAtoB) big_imset //= scaler_sumr.
-split=> [||i]; first by apply: eq_bigr => t2 At2; rewrite De_ ?defAtoB.
- apply: (mulIf (irr1_neq0 s)); rewrite mulrAC -cfInd1 // mulr_natl mulrC invfM.
- rewrite ['Ind _]cfun_sum_constt sum_cfunE mulr_sumr card_in_imset //.
- rewrite -sumr_const; apply: eq_bigr => t At.
- by rewrite -mulrA -/(e_ t) De_ // cfunE A_1 ?mulKf.
-by rewrite -imAtoB => /imsetP[t At ->]; rewrite defAtoB ?cfInd1 ?A_1 ?mulrA.
-Qed.
-
-(* This is Peterfalvi (1.7)(c). *)
-Lemma cfInd_Hall_central_Inertia :
- Hall T H ->
- [/\ 'Ind[G] theta = \sum_(i in calB) 'chi_i, #|calB| = #|T : H|
- & {in calB, forall i, 'chi_i 1%g = #|G : T|%:R * theta 1%g}].
-Proof.
-case/andP=> _ hallH; have [e [_ _ De]] := cfInd_central_Inertia.
-suffices ->: e = 1.
- by case=> -> /eqP; rewrite scale1r expr1n divr1 mulr1 eqC_nat => /eqP.
-suffices{De} [t Dtheta]: exists i, 'Res[H, T] 'chi_i = theta.
- have e_t_1: e_ t = 1 by rewrite /e_ -cfdot_Res_r Dtheta cfnorm_irr.
- by rewrite -(De t) // irr_consttE -/(e_ t) e_t_1 oner_eq0.
-have ITtheta: T \subset 'I[theta] := subsetIr _ _.
-have solT: solvable (T / H) := abelian_sol abTbar.
-have [|t []] := extend_solvable_coprime_irr nsHT solT ITtheta; last by exists t.
-rewrite coprime_sym coprime_mull !(coprime_dvdl _ hallH) ?cfDet_order_dvdG //.
-by rewrite -dvdC_nat !CdivE truncCK ?Cnat_irr1 // dvd_irr1_cardG.
-Qed.
-
-End IndSumInertia.
-
-(* This is Peterfalvi (1.8). *)
-Lemma irr1_bound_quo (B C D : {group gT}) i :
- B <| C -> B \subset cfker 'chi[G]_i ->
- B \subset D -> D \subset C -> C \subset G -> (D / B \subset 'Z(C / B))%g ->
- 'chi_i 1%g <= #|G : C|%:R * sqrtC #|C : D|%:R.
-Proof.
-move=> BnC BsK BsD DsC CsG QsZ.
-case: (boolP ('Res[C] 'chi_i == 0))=> [HH|].
- have: ('Res[C] 'chi_i) 1%g = 0 by rewrite (eqP HH) cfunE.
- by rewrite cfResE // => HH1; case/eqP: (irr1_neq0 i).
-have IC := cfRes_char C (irr_char i).
-case/neq0_has_constt=> i1 Hi1.
-have CIr: i \in irr_constt ('Ind[G] 'chi_i1).
- by rewrite inE /= -Frobenius_reciprocity /= cfdotC conjC_eq0.
-have BsKi : B \subset cfker 'chi_i1.
- suff BsKri: B \subset cfker ('Res[C] 'chi_i).
- by apply: (subset_trans BsKri); apply: (cfker_constt _ Hi1).
- apply/subsetP=> g GiG.
- have F: g \in C by rewrite (subsetP (subset_trans BsD _)).
- rewrite cfkerEchar // inE F !cfResE //.
- by move: (subsetP BsK _ GiG); rewrite cfkerEirr inE.
-pose i2 := quo_Iirr B i1.
-have ZsC: 'Z(C / B)%g \subset 'Z('chi_i2)%CF.
- by rewrite -(cap_cfcenter_irr (C / B)); apply: bigcap_inf.
-have CBsH: C :&: B \subset D.
- apply/subsetP=> g; rewrite inE; case/andP=> _ HH.
- by apply: (subsetP (BsD)).
-have I1B: 'chi_i1 1%g ^+ 2 <= #|C : D|%:R.
- case: (irr1_bound i2)=> HH _; move: HH.
- have ->: 'chi_i2 1%g = 'chi_i1 1%g.
- by rewrite quo_IirrE // -(coset_id (group1 B)) cfQuoE.
- move/ler_trans; apply.
- rewrite ler_nat // -(index_quotient_eq CBsH) ?normal_norm //.
- rewrite -(@leq_pmul2l #|'Z('chi_i2)%CF|) ?cardG_gt0 ?cfcenter_sub //.
- rewrite Lagrange ?quotientS ?cfcenter_sub //.
- rewrite -(@leq_pmul2l #|(D / B)%g|) ?cardG_gt0 //.
- rewrite mulnA mulnAC Lagrange ?quotientS //.
- rewrite mulnC leq_pmul2l ?cardG_gt0 // subset_leq_card //.
- exact: subset_trans QsZ ZsC.
-have IC': 'Ind[G] 'chi_i1 \is a character := cfInd_char G (irr_char i1).
-move: (char1_ge_constt IC' CIr); rewrite cfInd1 //= => /ler_trans-> //.
-have chi1_1_ge0: 0 <= 'chi_i1 1%g by rewrite ltrW ?irr1_gt0.
-rewrite ler_pmul2l ?gt0CiG //.
-by rewrite -(@ler_pexpn2r _ 2) -?topredE /= ?sqrtC_ge0 ?ler0n ?sqrtCK.
-Qed.
-
-(* This is Peterfalvi (1.9)(a). *)
-Lemma extend_coprime_Qn_aut a b (Qa Qb : fieldExtType rat) w_a w_b
- (QaC : {rmorphism Qa -> algC}) (QbC : {rmorphism Qb -> algC})
- (mu : {rmorphism algC -> algC}) :
- coprime a b ->
- a.-primitive_root w_a /\ <<1; w_a>>%VS = {:Qa}%VS ->
- b.-primitive_root w_b /\ <<1; w_b>>%VS = {:Qb}%VS ->
- {nu : {rmorphism algC -> algC} | forall x, nu (QaC x) = mu (QaC x)
- & forall y, nu (QbC y) = QbC y}.
-Proof.
-move=> coab [pr_w_a genQa] [pr_w_b genQb].
-have [k co_k_a Dmu]: {k | coprime k a & mu (QaC w_a) = QaC (w_a ^+ k)}.
- have prCw: a.-primitive_root (QaC w_a) by rewrite fmorph_primitive_root.
- by have [k coka ->] := aut_prim_rootP mu prCw; rewrite -rmorphX; exists k.
-pose k1 := chinese a b k 1; have /Qn_aut_exists[nu Dnu]: coprime k1 (a * b).
- rewrite coprime_mulr -!(coprime_modl k1) chinese_modl ?chinese_modr //.
- by rewrite !coprime_modl co_k_a coprime1n.
-exists nu => [x | y].
- have /Fadjoin_polyP[p Qp ->]: x \in <<1; w_a>>%VS by rewrite genQa memvf.
- rewrite -!horner_map -!map_poly_comp !map_Qnum_poly // Dmu Dnu -rmorphX /=.
- by rewrite -(prim_expr_mod pr_w_a) chinese_modl // prim_expr_mod.
- by rewrite exprM (prim_expr_order pr_w_a) expr1n rmorph1.
-have /Fadjoin_polyP[p Qp ->]: y \in <<1; w_b>>%VS by rewrite genQb memvf.
-rewrite -!horner_map -!map_poly_comp !map_Qnum_poly // Dnu -rmorphX /=.
- by rewrite -(prim_expr_mod pr_w_b) chinese_modr // prim_expr_mod.
-by rewrite mulnC exprM (prim_expr_order pr_w_b) expr1n rmorph1.
-Qed.
-
-(* This intermediate result in the proof of Peterfalvi (1.9)(b) is used in *)
-(* he proof of (3.9)(c). *)
-Lemma dvd_restrict_cfAut a (v : {rmorphism algC -> algC}) :
- exists2 u : {rmorphism algC -> algC},
- forall gT0 G0 chi x,
- chi \in 'Z[irr (@gval gT0 G0)] -> #[x] %| a -> u (chi x) = v (chi x)
- & forall chi x, chi \in 'Z[irr G] -> coprime #[x] a -> u (chi x) = chi x.
-Proof.
-have [-> | a_gt0] := posnP a.
- exists v => // chi x Zchi; rewrite /coprime gcdn0 order_eq1 => /eqP->.
- by rewrite aut_Cint ?Cint_vchar1.
-pose b := (#|G|`_(\pi(a)^'))%N.
-have co_a_b: coprime a b := pnat_coprime (pnat_pi a_gt0) (part_pnat _ _).
-have [Qa _ [QaC _ [w_a genQa memQa]]] := group_num_field_exists [group of Zp a].
-have [Qb _ [QbC _ [w_b genQb memQb]]] := group_num_field_exists [group of Zp b].
-rewrite !card_Zp ?part_gt0 // in Qa QaC w_a genQa memQa Qb QbC w_b genQb memQb.
-have [nu nuQa nuQb] := extend_coprime_Qn_aut QaC QbC v co_a_b genQa genQb.
-exists nu => [gt0 G0 chi x Zchi x_dv_a | chi x Zchi co_x_a].
- without loss{Zchi} Nchi: chi / chi \is a character.
- move=> IH; case/vcharP: Zchi => [chi1 Nchi1 [chi2 Nchi2 ->]].
- by rewrite !cfunE !rmorphB !IH.
- by have [xa <-] := memQa _ _ _ Nchi x x_dv_a; rewrite nuQa.
-without loss{Zchi} Nchi: chi / chi \is a character.
- move=> IH; case/vcharP: Zchi => [chi1 Nchi1 [chi2 Nchi2 ->]].
- by rewrite !cfunE rmorphB !IH.
-have [Gx | /cfun0->] := boolP (x \in G); last by rewrite rmorph0.
-have{Gx} x_dv_b: (#[x] %| b)%N.
- rewrite coprime_sym coprime_pi' // in co_x_a.
- by rewrite -(part_pnat_id co_x_a) partn_dvd ?order_dvdG.
-by have [xb <-] := memQb _ _ _ Nchi x x_dv_b; rewrite nuQb.
-Qed.
-
-(* This is Peterfalvi (1.9)(b). *)
-(* We have strengthened the statement of this lemma so that it can be used *)
-(* rather than reproved for Peterfalvi (3.9). In particular we corrected a *)
-(* quantifier inversion in the original statement: the automorphism is *)
-(* constructed uniformly for all (virtual) characters. We have also removed *)
-(* the spurrious condition that a be a \pi(a) part of #|G| -- the proof works *)
-(* for all a, and indeed the first part holds uniformaly for all groups! *)
-Lemma make_pi_cfAut a k :
- coprime k a ->
- exists2 u : {rmorphism algC -> algC},
- forall (gT0 : finGroupType) (G0 : {group gT0}) chi x,
- chi \in 'Z[irr G0] -> #[x] %| a -> cfAut u chi x = chi (x ^+ k)%g
- & forall chi x, chi \in 'Z[irr G] -> coprime #[x] a -> cfAut u chi x = chi x.
-Proof.
-move=> co_k_a; have [v Dv] := Qn_aut_exists co_k_a.
-have [u Du_a Du_a'] := dvd_restrict_cfAut a v.
-exists u => [gt0 G0 | ] chi x Zchi a_x; last by rewrite cfunE Du_a'.
-rewrite cfunE {u Du_a'}Du_a //.
-without loss{Zchi} Nchi: chi / chi \is a character.
- move=> IH; case/vcharP: Zchi => [chi1 Nchi1 [chi2 Nchi2 ->]].
- by rewrite !cfunE rmorphB !IH.
-have [sXG0 | G0'x] := boolP (<[x]> \subset G0); last first.
- have /(<[x]> =P _) gen_xk: generator <[x]> (x ^+ k).
- by rewrite generator_coprime coprime_sym (coprime_dvdr a_x).
- by rewrite !cfun0 ?rmorph0 -?cycle_subG -?gen_xk.
-rewrite -!(cfResE chi sXG0) ?cycle_id ?mem_cycle //.
-rewrite ['Res _]cfun_sum_cfdot !sum_cfunE rmorph_sum; apply: eq_bigr => i _.
-have chiX := lin_charX (char_abelianP _ (cycle_abelian x) i) _ (cycle_id x).
-rewrite !cfunE rmorphM aut_Cnat ?Cnat_cfdot_char_irr ?cfRes_char //.
-by congr (_ * _); rewrite Dv -chiX // -expg_mod_order (eqnP a_x) chiX.
-Qed.
-
-Section ANT.
-Import ssrint.
-
-(* This section covers Peterfalvi (1.10). *)
-(* We have simplified the statement somewhat by substituting the global ring *)
-(* of algebraic integers for the specific ring Z[eta]. Formally this amounts *)
-(* to strengthening (b) and weakening (a) accordingly, but since actually the *)
-(* Z[eta] is equal to the ring of integers of Q[eta] (cf. Theorem 6.4 in J.S. *)
-(* Milne's course notes on Algebraic Number Theory), the simplified statement *)
-(* is actually equivalent to the textbook one. *)
-Variable (p : nat) (eps : algC).
-Hypothesis (pr_eps : p.-primitive_root eps).
-Local Notation e := (1 - eps).
-
-(* This is Peterfalvi (1.10) (a). *)
-Lemma vchar_ker_mod_prim : {in G & G & 'Z[irr G], forall x y (chi : 'CF(G)),
- #[x] = p -> y \in 'C[x] -> chi (x * y)%g == chi y %[mod e]}%A.
-Proof.
-move=> x y chi Gx Gy Zchi ox cxy; pose X := <<[set x; y]>>%G.
-have [Xx Xy]: x \in X /\ y \in X by apply/andP; rewrite -!sub1set -join_subG.
-have sXG: X \subset G by rewrite join_subG !sub1set Gx.
-suffices{chi Zchi} IHiX i: ('chi[X]_i (x * y)%g == 'chi_i y %[mod e])%A.
- rewrite -!(cfResE _ sXG) ?groupM //.
- have irr_free := (free_uniq (basis_free (irr_basis X))).
- have [c Zc ->] := (zchar_expansion irr_free (cfRes_vchar X Zchi)).
- rewrite !sum_cfunE /eqAmod -sumrB big_seq rpred_sum // => _ /irrP[i ->].
- by rewrite !cfunE [(_ %| _)%A]eqAmodMl // rpred_Cint.
-have lin_chi: 'chi_i \is a linear_char.
- apply/char_abelianP; rewrite -[gval X]joing_idl -joing_idr abelianY.
- by rewrite !cycle_abelian cycle_subG /= cent_cycle.
-rewrite lin_charM // -{2}['chi_i y]mul1r eqAmodMr ?Aint_irr //.
-have [|k ->] := (prim_rootP pr_eps) ('chi_i x).
- by rewrite -lin_charX // -ox expg_order lin_char1.
-rewrite -[_ ^+ k](subrK 1) subrX1 -[_ - 1]opprB mulNr -mulrN mulrC.
-rewrite eqAmod_addl_mul // rpredN rpred_sum // => n _.
-by rewrite rpredX ?(Aint_prim_root pr_eps).
-Qed.
-
-(* This is Peterfalvi (1.10)(b); the primality condition is only needed here. *)
-Lemma int_eqAmod_prime_prim n :
- prime p -> n \in Cint -> (n == 0 %[mod e])%A -> (p %| n)%C.
-Proof.
-move=> p_pr Zn; rewrite /eqAmod unfold_in subr0.
-have p_gt0 := prime_gt0 p_pr.
-case: ifPn => [_ /eqP->// | nz_e e_dv_n].
-suffices: (n ^+ p.-1 == 0 %[mod p])%A.
- rewrite eqAmod0_rat ?rpredX ?rpred_nat 1?rpred_Cint // !dvdC_int ?rpredX //.
- by rewrite floorCX // abszX Euclid_dvdX // => /andP[].
-rewrite /eqAmod subr0 unfold_in pnatr_eq0 eqn0Ngt p_gt0 /=.
-pose F := \prod_(1 <= i < p) ('X - (eps ^+ i)%:P).
-have defF: F = \sum_(i < p) 'X^i.
- apply: (mulfI (monic_neq0 (monicXsubC 1))); rewrite -subrX1.
- by rewrite -(factor_Xn_sub_1 pr_eps) big_ltn.
-have{defF} <-: F.[1] = p :> Algebraics.divisor.
- rewrite -[p]card_ord -[rhs in _ = rhs]sumr_const defF horner_sum.
- by apply: eq_bigr => i _; rewrite hornerXn expr1n.
-rewrite -[p.-1]card_ord {F}horner_prod big_add1 big_mkord -prodfV.
-rewrite -prodr_const -big_split rpred_prod //= => k _; rewrite !hornerE.
-rewrite -[n](divfK nz_e) -[_ * _ / _]mulrA rpredM {e_dv_n}//.
-have p'k: ~~ (p %| k.+1)%N by rewrite gtnNdvd // -{2}(prednK p_gt0) ltnS.
-have [r {1}->]: exists r, eps = eps ^+ k.+1 ^+ r.
- have [q _ /dvdnP[r Dr]] := Bezoutl p (ltn0Sn k); exists r; apply/esym/eqP.
- rewrite -exprM (eq_prim_root_expr pr_eps _ 1) mulnC -Dr addnC gcdnC.
- by rewrite -prime_coprime // in p'k; rewrite (eqnP p'k) modnMDl.
-rewrite -[1 - _]opprB subrX1 -mulNr opprB mulrC.
-rewrite mulKf; last by rewrite subr_eq0 eq_sym -(prim_order_dvd pr_eps).
-by apply: rpred_sum => // i _; rewrite !rpredX ?(Aint_prim_root pr_eps).
-Qed.
-
-End ANT.
-
-End Main.
-
-
diff --git a/mathcomp/odd_order/PFsection10.v b/mathcomp/odd_order/PFsection10.v
deleted file mode 100644
index 03d8898..0000000
--- a/mathcomp/odd_order/PFsection10.v
+++ /dev/null
@@ -1,1230 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime ssralg poly finset center.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action finalg zmodp.
-From mathcomp
-Require Import gfunctor gproduct cyclic commutator gseries nilpotent pgroup.
-From mathcomp
-Require Import sylow hall abelian maximal frobenius.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation mxabelem vector.
-From mathcomp
-Require Import BGsection1 BGsection3 BGsection7 BGsection15 BGsection16.
-From mathcomp
-Require Import ssrnum algC classfun character integral_char inertia vcharacter.
-From mathcomp
-Require Import PFsection1 PFsection2 PFsection3 PFsection4.
-From mathcomp
-Require Import PFsection5 PFsection6 PFsection7 PFsection8 PFsection9.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 10: Maximal subgroups of Types III, *)
-(* IV and V. For defW : W1 \x W2 = W and MtypeP : of_typeP M U defW, and *)
-(* setting ptiW := FT_primeTI_hyp MtypeP, mu2_ i j := primeTIirr ptiW i j and *)
-(* delta_ j := primeTIsign j, we define here, for M of type III-V: *)
-(* FTtype345_TIirr_degree MtypeP == the common degree of the components of *)
-(* (locally) d the images of characters of irr W that don't have *)
-(* W2 in their kernel by the cyclicTI isometry to M. *)
-(* Thus mu2_ i j 1%g = d%:R for all j != 0. *)
-(* FTtype345_TIsign MtypeP == the common sign of the images of characters *)
-(* (locally) delta of characters of irr W that don't have W2 in *)
-(* their kernel by the cyclicTI isometry to M. *)
-(* Thus delta_ j = delta for all j != 0. *)
-(* FTtype345_ratio MtypeP == the ratio (d - delta) / #|W1|. Even though it *)
-(* (locally) n is always a positive integer we take n : algC. *)
-(* FTtype345_bridge MtypeP s i j == a virtual character that can be used to *)
-(* (locally) alpha_ i j bridge coherence between the mu2_ i j and other *)
-(* irreducibles of M; here s should be the index of *)
-(* an irreducible character of M induced from M^(1). *)
-(* := mu2_ i j - delta *: mu2_ i 0 -n *: 'chi_s. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory Num.Theory.
-
-Section Ten.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Implicit Types (p q : nat) (x y z : gT).
-Implicit Types H K L N P Q R S T U W : {group gT}.
-
-Local Notation "#1" := (inord 1) (at level 0).
-
-Section OneMaximal.
-
-(* These assumptions correspond to Peterfalvi, Hypothesis (10.1). *)
-(* We also declare the group U_M, even though it is not used in this section, *)
-(* because it is a parameter to the theorems and definitions of PFsection8 *)
-(* and PFsection9. *)
-Variables M U_M W W1 W2 : {group gT}.
-Hypotheses (maxM : M \in 'M) (defW : W1 \x W2 = W).
-Hypotheses (MtypeP : of_typeP M U_M defW) (notMtype2: FTtype M != 2).
-
-Local Notation "` 'M'" := (gval M) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W1'" := (gval W1) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W2'" := (gval W2) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W'" := (gval W) (at level 0, only parsing) : group_scope.
-Local Notation V := (cyclicTIset defW).
-Local Notation M' := M^`(1)%G.
-Local Notation "` 'M''" := `M^`(1) (at level 0) : group_scope.
-Local Notation M'' := M^`(2)%G.
-Local Notation "` 'M'''" := `M^`(2) (at level 0) : group_scope.
-
-Let defM : M' ><| W1 = M. Proof. by have [[]] := MtypeP. Qed.
-Let nsM''M' : M'' <| M'. Proof. exact: (der_normal 1 M'). Qed.
-Let nsM'M : M' <| M. Proof. exact: (der_normal 1 M). Qed.
-Let sM'M : M' \subset M. Proof. exact: der_sub. Qed.
-Let nsM''M : M'' <| M. Proof. exact: der_normal 2 M. Qed.
-
-Let notMtype1 : FTtype M != 1%N. Proof. exact: FTtypeP_neq1 MtypeP. Qed.
-Let typeMgt2 : FTtype M > 2.
-Proof. by move: (FTtype M) (FTtype_range M) notMtype1 notMtype2=> [|[|[]]]. Qed.
-
-Let defA1 : 'A1(M) = M'^#. Proof. by rewrite /= -FTcore_eq_der1. Qed.
-Let defA : 'A(M) = M'^#. Proof. by rewrite FTsupp_eq1 ?defA1. Qed.
-Let defA0 : 'A0(M) = M'^# :|: class_support V M.
-Proof. by rewrite -defA (FTtypeP_supp0_def _ MtypeP). Qed.
-Let defMs : M`_\s :=: M'. Proof. exact: FTcore_type_gt2. Qed.
-
-Let pddM := FT_prDade_hyp maxM MtypeP.
-Let ptiWM : primeTI_hypothesis M M' defW := FT_primeTI_hyp MtypeP.
-Let ctiWG : cyclicTI_hypothesis G defW := pddM.
-Let ctiWM : cyclicTI_hypothesis M defW := prime_cycTIhyp ptiWM.
-
-Let ntW1 : W1 :!=: 1. Proof. by have [[]] := MtypeP. Qed.
-Let ntW2 : W2 :!=: 1. Proof. by have [_ _ _ []] := MtypeP. Qed.
-Let cycW1 : cyclic W1. Proof. by have [[]] := MtypeP. Qed.
-Let cycW2 : cyclic W2. Proof. by have [_ _ _ []] := MtypeP. Qed.
-
-Let w1 := #|W1|.
-Let w2 := #|W2|.
-Let nirrW1 : #|Iirr W1| = w1. Proof. by rewrite card_Iirr_cyclic. Qed.
-Let nirrW2 : #|Iirr W2| = w2. Proof. by rewrite card_Iirr_cyclic. Qed.
-Let NirrW1 : Nirr W1 = w1. Proof. by rewrite -nirrW1 card_ord. Qed.
-Let NirrW2 : Nirr W2 = w2. Proof. by rewrite -nirrW2 card_ord. Qed.
-
-Let w1gt2 : w1 > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
-Let w2gt2 : w2 > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
-
-Let coM'w1 : coprime #|M'| w1.
-Proof. by rewrite (coprime_sdprod_Hall_r defM); have [[]] := MtypeP. Qed.
-
-(* This is used both in (10.2) and (10.8). *)
-Let frobMbar : [Frobenius M / M'' = (M' / M'') ><| (W1 / M'')].
-Proof.
-have [[_ hallW1 _ _] _ _ [_ _ _ sW2M'' regM'W1 ] _] := MtypeP.
-apply: Frobenius_coprime_quotient => //.
-split=> [|w /regM'W1-> //]; apply: (sol_der1_proper (mmax_sol maxM)) => //.
-by apply: subG1_contra ntW2; apply: subset_trans sW2M'' (der_sub 1 M').
-Qed.
-
-Local Open Scope ring_scope.
-
-Let sigma := (cyclicTIiso ctiWG).
-Let w_ i j := (cyclicTIirr defW i j).
-Local Notation eta_ i j := (sigma (w_ i j)).
-
-Local Notation Imu2 := (primeTI_Iirr ptiWM).
-Let mu2_ i j := primeTIirr ptiWM i j.
-Let mu_ := primeTIred ptiWM.
-Local Notation chi_ j := (primeTIres ptiWM j).
-
-Local Notation Idelta := (primeTI_Isign ptiWM).
-Local Notation delta_ j := (primeTIsign ptiWM j).
-
-Local Notation tau := (FT_Dade0 maxM).
-Local Notation "chi ^\tau" := (tau chi).
-
-Let calS0 := seqIndD M' M M`_\s 1.
-Let rmR := FTtypeP_coh_base maxM MtypeP.
-Let scohS0 : subcoherent calS0 tau rmR.
-Proof. exact: FTtypeP_subcoherent MtypeP. Qed.
-
-Let calS := seqIndD M' M M' 1.
-Let sSS0 : cfConjC_subset calS calS0.
-Proof. by apply: seqInd_conjC_subset1; rewrite /= ?defMs. Qed.
-
-Let mem_calS s : ('Ind 'chi[M']_s \in calS) = (s != 0).
-Proof.
-rewrite mem_seqInd ?normal1 ?FTcore_normal //=.
-by rewrite !inE sub1G subGcfker andbT.
-Qed.
-
-Let calSmu j : j != 0 -> mu_ j \in calS.
-Proof.
-move=> nz_j; rewrite -[mu_ j]cfInd_prTIres mem_calS -irr_eq1.
-by rewrite -(prTIres0 ptiWM) (inj_eq irr_inj) (inj_eq (prTIres_inj _)).
-Qed.
-
-Let tauM' : {subset 'Z[calS, M'^#] <= 'CF(M, 'A0(M))}.
-Proof. by rewrite defA0 => phi /zchar_on/(cfun_onS (subsetUl _ _))->. Qed.
-
-(* This is Peterfalvi (10.2). *)
-(* Note that this result is also valid for type II groups. *)
-Lemma FTtypeP_ref_irr :
- {zeta | [/\ zeta \in irr M, zeta \in calS & zeta 1%g = w1%:R]}.
-Proof.
-have [_ /has_nonprincipal_irr[s nz_s] _ _ _] := Frobenius_context frobMbar.
-exists ('Ind 'chi_s %% M'')%CF; split.
-- by rewrite cfMod_irr ?irr_induced_Frobenius_ker ?(FrobeniusWker frobMbar).
-- by rewrite -cfIndMod ?normal_sub // -mod_IirrE // mem_calS mod_Iirr_eq0.
-rewrite -cfIndMod ?cfInd1 ?normal_sub // -(index_sdprod defM) cfMod1.
-by rewrite lin_char1 ?mulr1 //; apply/char_abelianP/sub_der1_abelian.
-Qed.
-
-(* This is Peterfalvi (10.3), first assertion. *)
-Lemma FTtype345_core_prime : prime w2.
-Proof.
-have [S pairMS [xdefW [U StypeP]]] := FTtypeP_pair_witness maxM MtypeP.
-have [[_ _ maxS] _] := pairMS; rewrite {1}(negPf notMtype2) /= => Stype2 _ _.
-by have [[]] := compl_of_typeII maxS StypeP Stype2.
-Qed.
-Let w2_pr := FTtype345_core_prime.
-
-Definition FTtype345_TIirr_degree := truncC (mu2_ 0 #1 1%g).
-Definition FTtype345_TIsign := delta_ #1.
-Local Notation d := FTtype345_TIirr_degree.
-Local Notation delta := FTtype345_TIsign.
-Definition FTtype345_ratio := (d%:R - delta) / w1%:R.
-Local Notation n := FTtype345_ratio.
-
-(* This is the remainder of Peterfalvi (10.3). *)
-Lemma FTtype345_constants :
- [/\ forall i j, j != 0 -> mu2_ i j 1%g = d%:R,
- forall j, j != 0 -> delta_ j = delta,
- (d > 1)%N
- & n \in Cnat].
-Proof.
-have nz_j1 : #1 != 0 :> Iirr W2 by rewrite Iirr1_neq0.
-have invj j: j != 0 -> mu2_ 0 j 1%g = d%:R /\ delta_ j = delta.
- move=> nz_j; have [k co_k_j1 Dj] := cfExp_prime_transitive w2_pr nz_j1 nz_j.
- rewrite -(cforder_dprodr defW) -dprod_IirrEr in co_k_j1.
- have{co_k_j1} [[u Dj1u] _] := cycTIiso_aut_exists ctiWM co_k_j1.
- rewrite dprod_IirrEr -rmorphX -Dj /= -!dprod_IirrEr -!/(w_ _ _) in Dj1u.
- rewrite truncCK ?Cnat_irr1 //.
- have: delta_ j *: mu2_ 0 j == cfAut u (delta_ #1 *: mu2_ 0 #1).
- by rewrite -!(cycTIiso_prTIirr pddM) -/ctiWM -Dj1u.
- rewrite raddfZsign /= -prTIirr_aut eq_scaled_irr signr_eq0 /= /mu2_.
- by case/andP=> /eqP-> /eqP->; rewrite prTIirr_aut cfunE aut_Cnat ?Cnat_irr1.
-have d_gt1: (d > 1)%N.
- rewrite ltn_neqAle andbC -eqC_nat -ltC_nat truncCK ?Cnat_irr1 //.
- rewrite irr1_gt0 /= eq_sym; apply: contraNneq nz_j1 => mu2_lin.
- have: mu2_ 0 #1 \is a linear_char by rewrite qualifE irr_char /= mu2_lin.
- by rewrite lin_irr_der1 => /(prTIirr0P ptiWM)[i /irr_inj/prTIirr_inj[_ ->]].
-split=> // [i j /invj[<- _] | _ /invj[//] | ]; first by rewrite prTIirr_1.
-have: (d%:R == delta %[mod w1])%C by rewrite truncCK ?Cnat_irr1 ?prTIirr1_mod.
-rewrite /eqCmod unfold_in -/n (negPf (neq0CG W1)) CnatEint => ->.
-rewrite divr_ge0 ?ler0n // [delta]signrE opprB addrA -natrD subr_ge0 ler1n.
-by rewrite -(subnKC d_gt1).
-Qed.
-
-Let o_mu2_irr zeta i j :
- zeta \in calS -> zeta \in irr M -> '[mu2_ i j, zeta] = 0.
-Proof.
-case/seqIndP=> s _ -> irr_sM; rewrite -cfdot_Res_l cfRes_prTIirr cfdot_irr.
-rewrite (negPf (contraNneq _ (prTIred_not_irr ptiWM j))) // => Ds.
-by rewrite -cfInd_prTIres Ds.
-Qed.
-
-Let ZmuBzeta zeta j :
- zeta \in calS -> zeta 1%g = w1%:R -> j != 0 ->
- mu_ j - d%:R *: zeta \in 'Z[calS, M'^#].
-Proof.
-move=> Szeta zeta1w1 nz_j; have [mu1 _ _ _] := FTtype345_constants.
-rewrite -[d%:R](mulKf (neq0CiG M M')) mulrC -(mu1 0 j nz_j).
-rewrite -(cfResE _ sM'M) // cfRes_prTIirr -cfInd1 // cfInd_prTIres.
-by rewrite (seqInd_sub_lin_vchar _ Szeta) ?calSmu // -(index_sdprod defM).
-Qed.
-
-Let mu0Bzeta_on zeta :
- zeta \in calS -> zeta 1%g = w1%:R -> mu_ 0 - zeta \in 'CF(M, 'A(M)).
-Proof.
-move/seqInd_on=> M'zeta zeta1w1; rewrite [mu_ 0]prTIred0 defA cfun_onD1.
-rewrite !cfunE zeta1w1 cfuniE // group1 mulr1 subrr rpredB ?M'zeta //=.
-by rewrite rpredZ ?cfuni_on.
-Qed.
-
-(* We need to prove (10.5) - (10.7) for an arbitrary choice of zeta, to allow *)
-(* part of the proof of (10.5) to be reused in that of (11.8). *)
-Variable zeta : 'CF(M).
-Hypotheses (irr_zeta : zeta \in irr M) (Szeta : zeta \in calS).
-Hypothesis (zeta1w1 : zeta 1%g = w1%:R).
-
-Let o_mu2_zeta i j : '[mu2_ i j, zeta] = 0. Proof. exact: o_mu2_irr. Qed.
-
-Let o_mu_zeta j : '[mu_ j, zeta] = 0.
-Proof. by rewrite cfdot_suml big1 // => i _; apply: o_mu2_zeta. Qed.
-
-Definition FTtype345_bridge i j := mu2_ i j - delta *: mu2_ i 0 - n *: zeta.
-Local Notation alpha_ := FTtype345_bridge.
-
-(* This is the first part of Peterfalvi (10.5), which does not depend on the *)
-(* coherence assumption that will ultimately be refuted by (10.8). *)
-Lemma supp_FTtype345_bridge i j : j != 0 -> alpha_ i j \in 'CF(M, 'A0(M)).
-Proof.
-move=> nz_j; have [Dd Ddelta _ _] := FTtype345_constants.
-have Dmu2 := prTIirr_id pddM.
-have W1a0 x: x \in W1 -> alpha_ i j x = 0.
- move=> W1x; rewrite !cfunE; have [-> | ntx] := eqVneq x 1%g.
- by rewrite Dd // prTIirr0_1 mulr1 zeta1w1 divfK ?neq0CG ?subrr.
- have notM'x: x \notin M'.
- apply: contra ntx => M'x; have: x \in M' :&: W1 by apply/setIP.
- by rewrite coprime_TIg ?inE.
- have /sdprod_context[_ sW1W _ _ tiW21] := dprodWsdC defW.
- have abW2: abelian W2 := cyclic_abelian cycW2.
- have Wx: x \in W :\: W2.
- rewrite inE (contra _ ntx) ?(subsetP sW1W) // => W2x.
- by rewrite -in_set1 -set1gE -tiW21 inE W2x.
- rewrite !Dmu2 {Wx}// Ddelta // prTIsign0 scale1r !dprod_IirrE cfunE.
- rewrite -!(cfResE _ sW1W) ?cfDprodKl_abelian // subrr.
- have [s _ ->] := seqIndP Szeta.
- by rewrite (cfun_on0 (cfInd_normal _ _)) ?mulr0 ?subrr.
-apply/cfun_onP=> x; rewrite !inE defA notMtype1 /= => /norP[notM'x].
-set pi := \pi(M'); have [Mx /= pi_x | /cfun0->//] := boolP (x \in M).
-have hallM': pi.-Hall(M) M' by rewrite Hall_pi -?(coprime_sdprod_Hall_l defM).
-have hallW1: pi^'.-Hall(M) W1 by rewrite -(compl_pHall _ hallM') sdprod_compl.
-have{pi_x} pi'x: pi^'.-elt x.
- apply: contraR notM'x => not_pi'x; rewrite !inE (mem_normal_Hall hallM') //.
- rewrite not_pi'x andbT negbK in pi_x.
- by rewrite (contraNneq _ not_pi'x) // => ->; apply: p_elt1.
-have [|y My] := Hall_subJ (mmax_sol maxM) hallW1 _ pi'x; rewrite cycle_subG //.
-by case/imsetP=> z Wz ->; rewrite cfunJ ?W1a0.
-Qed.
-Local Notation alpha_on := supp_FTtype345_bridge.
-
-Lemma vchar_FTtype345_bridge i j : alpha_ i j \in 'Z[irr M].
-Proof.
-have [_ _ _ Nn] := FTtype345_constants.
-by rewrite !rpredB ?rpredZsign ?rpredZ_Cnat ?irr_vchar ?mem_zchar.
-Qed.
-Local Notation Zalpha := vchar_FTtype345_bridge.
-Local Hint Resolve Zalpha.
-
-Lemma vchar_Dade_FTtype345_bridge i j :
- j != 0 -> (alpha_ i j)^\tau \in 'Z[irr G].
-Proof. by move=> nz_j; rewrite Dade_vchar // zchar_split Zalpha alpha_on. Qed.
-Local Notation Zalpha_tau := vchar_Dade_FTtype345_bridge.
-
-(* This covers the last paragraph in the proof of (10.5); it's isolated here *)
-(* because it is reused in the proof of (10.10) and (11.8). *)
-
-Lemma norm_FTtype345_bridge i j :
- j != 0 -> '[(alpha_ i j)^\tau] = 2%:R + n ^+ 2.
-Proof.
-move=> nz_j; rewrite Dade_isometry ?alpha_on // cfnormBd ?cfnormZ; last first.
- by rewrite cfdotZr cfdotBl cfdotZl !o_mu2_zeta !(mulr0, subr0).
-have [_ _ _ /Cnat_ge0 n_ge0] := FTtype345_constants.
-rewrite ger0_norm // cfnormBd ?cfnorm_sign ?cfnorm_irr ?irrWnorm ?mulr1 //.
-by rewrite cfdotZr (cfdot_prTIirr pddM) (negPf nz_j) andbF ?mulr0.
-Qed.
-Local Notation norm_alpha := norm_FTtype345_bridge.
-
-Implicit Type tau : {additive 'CF(M) -> 'CF(G)}.
-
-(* This exported version is adapted to its use in (11.8). *)
-Lemma FTtype345_bridge_coherence calS1 tau1 i j X Y :
- coherent_with calS1 M^# tau tau1 -> (alpha_ i j)^\tau = X + Y ->
- cfConjC_subset calS1 calS0 -> {subset calS1 <= irr M} ->
- j != 0 -> Y \in 'Z[map tau1 calS1] -> '[Y, X] = 0 -> '[Y] = n ^+ 2 ->
- X = delta *: (eta_ i j - eta_ i 0).
-Proof.
-move=> cohS1 Dalpha sS10 irrS1 nz_j S1_Y oYX nY_n2.
-have [[_ Ddelta _ Nn] [[Itau1 Ztau1] _]] := (FTtype345_constants, cohS1).
-have [|z Zz defY] := zchar_expansion _ S1_Y.
- rewrite map_inj_in_uniq; first by case: sS10.
- by apply: sub_in2 (Zisometry_inj Itau1); apply: mem_zchar.
-have nX_2: '[X] = 2%:R.
- apply: (addrI '[Y]); rewrite -cfnormDd // addrC -Dalpha norm_alpha //.
- by rewrite addrC nY_n2.
-have Z_X: X \in 'Z[irr G].
- rewrite -[X](addrK Y) -Dalpha rpredB ?Zalpha_tau // defY big_map big_seq.
- by apply: rpred_sum => psi S1psi; rewrite rpredZ_Cint // Ztau1 ?mem_zchar.
-apply: eq_signed_sub_cTIiso => // y Vy; rewrite -[X](addrK Y) -Dalpha -/delta.
-rewrite !cfunE !cycTIiso_restrict //; set rhs := delta * _.
-rewrite Dade_id ?defA0 //; last by rewrite setUC inE mem_class_support.
-have notM'y: y \notin M'.
- by have:= subsetP (prDade_supp_disjoint pddM) y Vy; rewrite inE.
-have Wy: y \in W :\: W2 by move: Vy; rewrite !inE => /andP[/norP[_ ->]].
-rewrite !cfunE 2?{1}prTIirr_id // prTIsign0 scale1r Ddelta // cfunE -mulrBr.
-rewrite -/rhs (cfun_on0 (seqInd_on _ Szeta)) // mulr0 subr0.
-rewrite (ortho_cycTIiso_vanish ctiWG) ?subr0 // -/sigma.
-apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i1 [j1 ->]] ->].
-rewrite defY cfdot_suml big_map big1_seq //= => psi S1psi.
-by rewrite cfdotZl (coherent_ortho_cycTIiso MtypeP sS10) ?irrS1 ?mulr0.
-Qed.
-
-(* This is a specialization of the above, used in (10.5) and (10.10). *)
-Let def_tau_alpha calS1 tau1 i j :
- coherent_with calS1 M^# tau tau1 -> cfConjC_subset calS1 calS0 ->
- j != 0 -> zeta \in calS1 -> '[(alpha_ i j)^\tau, tau1 zeta] = - n ->
- (alpha_ i j)^\tau = delta *: (eta_ i j - eta_ i 0) - n *: tau1 zeta.
-Proof.
-move=> cohS1 [_ sS10 ccS1] nz_j S1zeta alpha_zeta_n.
-have [[_ _ _ Nn] [[Itau1 _] _]] := (FTtype345_constants, cohS1).
-set Y := - (n *: _); apply: canRL (addrK _) _; set X := _ + _.
-have Dalpha: (alpha_ i j)^\tau = X + Y by rewrite addrK.
-have nY_n2: '[Y] = n ^+ 2.
- by rewrite cfnormN cfnormZ norm_Cnat // Itau1 ?mem_zchar // irrWnorm ?mulr1.
-pose S2 := zeta :: zeta^*%CF; pose S2tau1 := map tau1 S2.
-have S2_Y: Y \in 'Z[S2tau1] by rewrite rpredN rpredZ_Cnat ?mem_zchar ?mem_head.
-have sS21: {subset S2 <= calS1} by apply/allP; rewrite /= ccS1 ?S1zeta.
-have cohS2 : coherent_with S2 M^# tau tau1 := subset_coherent_with sS21 cohS1.
-have irrS2: {subset S2 <= irr M} by apply/allP; rewrite /= cfAut_irr irr_zeta.
-rewrite (FTtype345_bridge_coherence cohS2 Dalpha) //; last first.
- rewrite -[X]opprK cfdotNr opprD cfdotDr nY_n2 cfdotNl cfdotNr opprK cfdotZl.
- by rewrite cfdotC alpha_zeta_n rmorphN conj_Cnat // mulrN addNr oppr0.
-split=> [|_ /sS21/sS10//|]; last first.
- by apply/allP; rewrite /= !inE cfConjCK !eqxx orbT.
-by rewrite /= inE eq_sym; have [[_ /hasPn-> //]] := scohS0; apply: sS10.
-Qed.
-
-Section NonCoherence.
-
-(* We will ultimately contradict these assumptions. *)
-(* Note that we do not need to export any lemma save the final contradiction. *)
-Variable tau1 : {additive 'CF(M) -> 'CF(G)}.
-Hypothesis cohS : coherent_with calS M^# tau tau1.
-
-Local Notation "mu ^\tau1" := (tau1 mu%CF)
- (at level 2, format "mu ^\tau1") : ring_scope.
-
-Let Dtau1 : {in 'Z[calS, M'^#], tau1 =1 tau}.
-Proof. by case: cohS => _; apply: sub_in1; apply: zchar_onS; apply: setSD. Qed.
-
-Let o_zeta_s: '[zeta, zeta^*] = 0.
-Proof. by rewrite (seqInd_conjC_ortho _ _ _ Szeta) ?mFT_odd /= ?defMs. Qed.
-
-Import ssrint rat.
-
-(* This is the second part of Peterfalvi (10.5). *)
-Let tau_alpha i j : j != 0 ->
- (alpha_ i j)^\tau = delta *: (eta_ i j - eta_ i 0) - n *: zeta^\tau1.
-Proof.
-move=> nz_j; set al_ij := alpha_ i j; have [[Itau1 Ztau1] _] := cohS.
-have [mu1 Ddelta d_gt1 Nn] := FTtype345_constants.
-pose a := '[al_ij^\tau, zeta^\tau1] + n.
-have al_ij_zeta_s: '[al_ij^\tau, zeta^*^\tau1] = a.
- apply: canRL (addNKr _) _; rewrite addrC -opprB -cfdotBr -raddfB.
- have M'dz: zeta - zeta^*%CF \in 'Z[calS, M'^#] by apply: seqInd_sub_aut_zchar.
- rewrite Dtau1 // Dade_isometry ?alpha_on ?tauM' //.
- rewrite cfdotBr opprB cfdotBl cfdot_conjCr rmorphB linearZ /=.
- rewrite -!prTIirr_aut !cfdotBl !cfdotZl !o_mu2_zeta o_zeta_s !mulr0.
- by rewrite opprB !(subr0, rmorph0) add0r irrWnorm ?mulr1.
-have Zal_ij: al_ij^\tau \in 'Z[irr G] by apply: Zalpha_tau.
-have Za: a \in Cint.
- by rewrite rpredD ?(Cint_Cnat Nn) ?Cint_cfdot_vchar ?Ztau1 ?(mem_zchar Szeta).
-have{al_ij_zeta_s} ub_da2: (d ^ 2)%:R * a ^+ 2 <= (2%:R + n ^+ 2) * w1%:R.
- have [k nz_k j'k]: exists2 k, k != 0 & k != j.
- have:= w2gt2; rewrite -nirrW2 (cardD1 0) (cardD1 j) !inE nz_j !ltnS lt0n.
- by case/pred0Pn=> k /and3P[]; exists k.
- have muk_1: mu_ k 1%g = (d * w1)%:R.
- by rewrite (prTIred_1 pddM) mu1 // mulrC -natrM.
- rewrite natrX -exprMn; have <-: '[al_ij^\tau, (mu_ k)^\tau1] = d%:R * a.
- rewrite mulrDr mulr_natl -raddfMn /=; apply: canRL (addNKr _) _.
- rewrite addrC -cfdotBr -raddfMn -raddfB -scaler_nat.
- rewrite Dtau1 ?Dade_isometry ?alpha_on ?tauM' ?ZmuBzeta // cfdotBr cfdotZr.
- rewrite rmorph_nat !cfdotBl !cfdotZl !o_mu2_zeta irrWnorm //.
- rewrite !(cfdot_prTIirr_red pddM) cfdotC o_mu_zeta conjC0 !mulr0 mulr1.
- by rewrite 2![_ == k](negPf _) 1?eq_sym // mulr0 -mulrN opprB !subr0 add0r.
- have ZSmuk: mu_ k \in 'Z[calS] by rewrite mem_zchar ?calSmu.
- have <-: '[al_ij^\tau] * '[(mu_ k)^\tau1] = (2%:R + n ^+ 2) * w1%:R.
- by rewrite Itau1 // cfdot_prTIred eqxx mul1n norm_alpha.
- by rewrite -Cint_normK ?cfCauchySchwarz // Cint_cfdot_vchar // Ztau1.
-suffices a0 : a = 0.
- by apply: (def_tau_alpha _ sSS0); rewrite // -sub0r -a0 addrK.
-apply: contraTeq (d_gt1) => /(sqr_Cint_ge1 Za) a2_ge1.
-suffices: n == 0.
- rewrite mulf_eq0 invr_eq0 orbC -implyNb neq0CG /= subr_eq0 => /eqP Dd.
- by rewrite -ltC_nat -(normr_nat _ d) Dd normr_sign ltrr.
-suffices: n ^+ 2 < n + 1.
- have d_dv_M: (d%:R %| #|M|)%C by rewrite -(mu1 0 j) // ?dvd_irr1_cardG.
- have{d_dv_M} d_odd: odd d by apply: dvdn_odd (mFT_odd M); rewrite -dvdC_nat.
- have: (2 %| n * w1%:R)%C.
- rewrite divfK ?neq0CG // -signrN signrE addrA -(natrD _ d 1).
- by rewrite rpredB // dvdC_nat dvdn2 ?odd_double // odd_add d_odd.
- rewrite -(truncCK Nn) -mulrSr -natrM -natrX ltC_nat (dvdC_nat 2) pnatr_eq0.
- rewrite dvdn2 odd_mul mFT_odd; case: (truncC n) => [|[|n1]] // _ /idPn[].
- by rewrite -leqNgt (ltn_exp2l 1).
-apply: ltr_le_trans (_ : n * - delta + 1 <= _); last first.
- have ->: n + 1 = n * `|- delta| + 1 by rewrite normrN normr_sign mulr1.
- rewrite ler_add2r ler_wpmul2l ?Cnat_ge0 ?real_ler_norm //.
- by rewrite rpredN ?rpred_sign.
-rewrite -(ltr_pmul2r (ltC_nat 0 2)) mulrDl mul1r -[rhs in rhs + _]mulrA.
-apply: ler_lt_trans (_ : n ^+ 2 * (w1%:R - 1) < _).
- rewrite -(subnKC w1gt2) -(@natrB _ _ 1) // ler_wpmul2l ?leC_nat //.
- by rewrite Cnat_ge0 ?rpredX.
-rewrite -(ltr_pmul2l (gt0CG W1)) -/w1 2!mulrBr mulr1 mulrCA -exprMn.
-rewrite mulrDr ltr_subl_addl addrCA -mulrDr mulrCA mulrA -ltr_subl_addl.
-rewrite -mulrBr mulNr opprK divfK ?neq0CG // mulr_natr addrA subrK -subr_sqr.
-rewrite sqrr_sign mulrC [_ + 2%:R]addrC (ltr_le_trans _ ub_da2) //.
-apply: ltr_le_trans (ler_wpmul2l (ler0n _ _) a2_ge1).
-by rewrite mulr1 ltr_subl_addl -mulrS -natrX ltC_nat.
-Qed.
-
-(* This is the first part of Peterfalvi (10.6)(a). *)
-Let tau1mu j : j != 0 -> (mu_ j)^\tau1 = delta *: \sum_i eta_ i j.
-Proof.
-move=> nz_j; have [[[Itau1 _] _] Smu_j] := (cohS, calSmu nz_j).
-have eta_mu i: '[delta *: (eta_ i j - eta_ i 0), (mu_ j)^\tau1] = 1.
- have Szeta_s: zeta^*%CF \in calS by rewrite cfAut_seqInd.
- have o_zeta_s_w k: '[eta_ i k, d%:R *: zeta^*^\tau1] = 0.
- have o_S_eta_ := coherent_ortho_cycTIiso MtypeP sSS0 cohS.
- by rewrite cfdotZr cfdotC o_S_eta_ ?conjC0 ?mulr0 // cfAut_irr.
- pose psi := mu_ j - d%:R *: zeta^*%CF; rewrite (canRL (subrK _) (erefl psi)).
- rewrite (raddfD tau1) raddfZnat cfdotDr addrC cfdotZl cfdotBl !{}o_zeta_s_w.
- rewrite subr0 mulr0 add0r -(canLR (subrK _) (tau_alpha i nz_j)).
- have Zpsi: psi \in 'Z[calS, M'^#].
- by rewrite ZmuBzeta // cfunE zeta1w1 rmorph_nat.
- rewrite cfdotDl cfdotZl Itau1 ?(zcharW Zpsi) ?mem_zchar // -cfdotZl Dtau1 //.
- rewrite Dade_isometry ?alpha_on ?tauM' {Zpsi}// -cfdotDl cfdotBr cfdotZr.
- rewrite subrK !cfdotBl !cfdotZl !cfdot_prTIirr_red eq_sym (negPf nz_j).
- by rewrite !o_mu2_irr ?cfAut_irr // !(mulr0, subr0) eqxx.
-have [_ Ddel _ _] := FTtype345_constants.
-have [[d1 k] Dtau1mu] := FTtypeP_coherent_TIred sSS0 cohS irr_zeta Szeta Smu_j.
-case=> [[Dd1 Dk] | [_ Dk _]]; first by rewrite Dtau1mu Dd1 Dk [_ ^+ _]Ddel.
-have /esym/eqP/idPn[] := eta_mu 0; rewrite Dtau1mu Dk /= cfdotZl cfdotZr.
-rewrite cfdot_sumr big1 ?mulr0 ?oner_eq0 // => i _; rewrite -/sigma -/(w_ i _).
-rewrite cfdotBl !(cfdot_cycTIiso pddM) !(eq_sym 0) conjC_Iirr_eq0 -!irr_eq1.
-rewrite (eq_sym j) -(inj_eq irr_inj) conjC_IirrE.
-by rewrite odd_eq_conj_irr1 ?mFT_odd ?subrr.
-Qed.
-
-(* This is the second part of Peterfalvi (10.6)(a). *)
-Let tau1mu0 : (mu_ 0 - zeta)^\tau = \sum_i eta_ i 0 - zeta^\tau1.
-Proof.
-have [j nz_j] := has_nonprincipal_irr ntW2.
-have sum_al: \sum_i alpha_ i j = mu_ j - d%:R *: zeta - delta *: (mu_ 0 - zeta).
- rewrite scalerBr opprD addrACA scaler_sumr !sumrB sumr_const; congr (_ + _).
- by rewrite -opprD -scalerBl nirrW1 -scaler_nat scalerA mulrC divfK ?neq0CG.
-have ->: mu_ 0 - zeta = delta *: (mu_ j - d%:R *: zeta - \sum_i alpha_ i j).
- by rewrite sum_al opprD addNKr opprK signrZK.
-rewrite linearZ linearB; apply: canLR (signrZK _) _; rewrite -/delta /=.
-rewrite linear_sum -Dtau1 ?ZmuBzeta //= raddfB raddfZnat addrAC scalerBr.
-rewrite (eq_bigr _ (fun i _ => tau_alpha i nz_j)) sumrB sumr_const nirrW1 opprD.
-rewrite -scaler_sumr sumrB scalerBr -tau1mu // opprD !opprK -!addrA addNKr.
-congr (_ + _); rewrite -scaler_nat scalerA mulrC divfK ?neq0CG //.
-by rewrite addrC -!scaleNr -scalerDl addKr.
-Qed.
-
-(* This is Peterfalvi (10.6)(b). *)
-Let zeta_tau1_coprime g :
- g \notin 'A~(M) -> coprime #[g] w1 -> `|zeta^\tau1 g| >= 1.
-Proof.
-move=> notAg co_g_w1; have Amu0zeta := mu0Bzeta_on Szeta zeta1w1.
-have mu0_zeta_g: (mu_ 0 - zeta)^\tau g = 0.
- have [ | ] := boolP (g \in 'A0~(M)); rewrite -FT_Dade0_supportE; last first.
- by apply: cfun_on0; apply: Dade_cfunS.
- case/bigcupP=> x A0x xRg; rewrite (DadeE _ A0x) // (cfun_on0 Amu0zeta) //.
- apply: contra notAg => Ax; apply/bigcupP; exists x => //.
- by rewrite -def_FTsignalizer0.
-have{mu0_zeta_g} zeta_g: zeta^\tau1 g = \sum_i eta_ i 0 g.
- by apply/esym/eqP; rewrite -subr_eq0 -{2}mu0_zeta_g tau1mu0 !cfunE sum_cfunE.
-have Zwg i: eta_ i 0 g \in Cint.
- have Lchi: 'chi_i \is a linear_char by apply: irr_cyclic_lin.
- rewrite Cint_cycTIiso_coprime // dprod_IirrE irr0 cfDprod_cfun1r.
- rewrite (coprime_dvdr _ co_g_w1) // dvdn_cforder.
- rewrite -rmorphX cfDprodl_eq1 -dvdn_cforder; apply/dvdn_cforderP=> x W1x.
- by rewrite -lin_charX // -expg_mod_order (eqnP (order_dvdG W1x)) lin_char1.
-have odd_zeta_g: (zeta^\tau1 g == 1 %[mod 2])%C.
- rewrite zeta_g (bigD1 0) //= [w_ 0 0]cycTIirr00 cycTIiso1 cfun1E inE.
- pose eW1 := [pred i : Iirr W1 | conjC_Iirr i < i]%N.
- rewrite (bigID eW1) (reindex_inj (can_inj (@conjC_IirrK _ _))) /=.
- set s1 := \sum_(i | _) _; set s2 := \sum_(i | _) _; suffices ->: s1 = s2.
- by rewrite -mulr2n addrC -(mulr_natr _ 2) eqCmod_addl_mul ?rpred_sum.
- apply/eq_big=> [i | i _].
- rewrite (canF_eq (@conjC_IirrK _ _)) conjC_Iirr0 conjC_IirrK -leqNgt.
- rewrite ltn_neqAle val_eqE -irr_eq1 (eq_sym i) -(inj_eq irr_inj) andbA.
- by rewrite aut_IirrE odd_eq_conj_irr1 ?mFT_odd ?andbb.
- rewrite -{1}conjC_Iirr0 [w_ _ _]cycTIirr_aut -cfAut_cycTIiso.
- by rewrite cfunE conj_Cint ?Zwg.
-rewrite norm_Cint_ge1 //; first by rewrite zeta_g rpred_sum.
-apply: contraTneq odd_zeta_g => ->.
-by rewrite eqCmod_sym /eqCmod subr0 /= (dvdC_nat 2 1).
-Qed.
-
-(* This is Peterfalvi (10.7). *)
-Let Frob_der1_type2 S :
- S \in 'M -> FTtype S == 2 -> [Frobenius S^`(1) with kernel S`_\F].
-Proof.
-move: S => L maxL /eqP Ltype2.
-have [S pairMS [xdefW [U StypeP]]] := FTtypeP_pair_witness maxM MtypeP.
-have [[_ _ maxS] _] := pairMS; rewrite {1}(negPf notMtype2) /= => Stype2 _.
-move/(_ L maxL)/implyP; rewrite Ltype2 /= => /setUP[] /imsetP[x0 _ defL].
- by case/eqP/idPn: Ltype2; rewrite defL FTtypeJ.
-pose H := (S`_\F)%G; pose HU := (S^`(1))%G.
-suffices{L Ltype2 maxL x0 defL}: [Frobenius HU = H ><| U].
- by rewrite defL derJ FcoreJ FrobeniusJker; apply: FrobeniusWker.
-have sHHU: H \subset HU by have [_ [_ _ _ /sdprodW/mulG_sub[]]] := StypeP.
-pose calT := seqIndD HU S H 1; pose tauS := FT_Dade0 maxS.
-have DcalTs: calT = seqIndD HU S S`_\s 1.
- by congr (seqIndD _ _ _ _); apply: val_inj; rewrite /= FTcore_type2.
-have notFrobM: ~~ [Frobenius M with kernel M`_\F].
- by apply/existsP=> [[U1 /Frobenius_of_typeF/(typePF_exclusion MtypeP)]].
-have{notFrobM} notSsupportM: ~~ [exists x, FTsupports M (S :^ x)].
- apply: contra notFrobM => /'exists_existsP[x [y /and3P[Ay not_sCyM sCySx]]].
- have [_ [_ /(_ y)uMS] /(_ y)] := FTsupport_facts maxM.
- rewrite inE (subsetP (FTsupp_sub0 _)) //= in uMS *.
- rewrite -(eq_uniq_mmax (uMS not_sCyM) _ sCySx) ?mmaxJ // FTtypeJ.
- by case=> // _ _ _ [_ ->].
-have{notSsupportM} tiA1M_AS: [disjoint 'A1~(M) & 'A~(S)].
- have notMG_S: gval S \notin M :^: G.
- by apply: contraL Stype2 => /imsetP[x _ ->]; rewrite FTtypeJ.
- by apply: negbNE; have [_ <- _] := FT_Dade_support_disjoint maxM maxS notMG_S.
-pose pddS := FT_prDade_hypF maxS StypeP; pose nu := primeTIred pddS.
-have{tiA1M_AS} oST phi psi:
- phi \in 'Z[calS, M^#] -> psi \in 'Z[calT, S^#] -> '[phi^\tau, tauS psi] = 0.
-- rewrite zcharD1_seqInd // -[seqInd _ _]/calS => Sphi.
- rewrite zcharD1E => /andP[Tpsi psi1_0].
- rewrite -FT_Dade1E ?defA1 ?(zchar_on Sphi) //.
- apply: cfdot_complement (Dade_cfunS _ _) _; rewrite FT_Dade1_supportE setTD.
- rewrite -[tauS _]FT_DadeE ?(cfun_onS _ (Dade_cfunS _ _)) ?FT_Dade_supportE //.
- by rewrite -disjoints_subset disjoint_sym.
- have /subsetD1P[_ /setU1K <-] := FTsupp_sub S; rewrite cfun_onD1 {}psi1_0.
- rewrite -Tpsi andbC -zchar_split {psi Tpsi}(zchar_trans_on _ Tpsi) //.
- move=> psi Tpsi; rewrite zchar_split mem_zchar //=.
- have [s /setDP[_ kerH's] ->] := seqIndP Tpsi.
- by rewrite inE in kerH's; rewrite (prDade_Ind_irr_on pddS).
-have notStype5: FTtype S != 5 by rewrite (eqP Stype2).
-have [|[_ _ _ _ -> //]] := typeP_reducible_core_cases maxS StypeP notStype5.
-case=> t []; set lambda := 'chi_t => T0C'lam lam_1 _.
-have{T0C'lam} Tlam: lambda \in calT.
- by apply: seqIndS T0C'lam; rewrite Iirr_kerDS ?sub1G.
-have{lam_1} [r [nz_r Tnu_r nu_r_1]]:
- exists r, [/\ r != 0, nu r \in calT & nu r 1%g = lambda 1%g].
-- have [_] := typeP_reducible_core_Ind maxS StypeP notStype5.
- set H0 := Ptype_Fcore_kernel _; set nuT := filter _ _; rewrite -/nu.
- case/hasP=> nu_r nuTr _ /(_ _ nuTr)/imageP[r nz_r Dr] /(_ _ nuTr)[nu_r1 _ _].
- have{nuTr} Tnu_r := mem_subseq (filter_subseq _ _) nuTr.
- by exists r; rewrite -Dr nu_r1 (seqIndS _ Tnu_r) // Iirr_kerDS ?sub1G.
-pose T2 := [:: lambda; lambda^*; nu r; (nu r)^*]%CF.
-have [rmRS scohT]: exists rmRS, subcoherent calT tauS rmRS.
- move: (FTtypeP_coh_base _ _) (FTtypeP_subcoherent maxS StypeP) => RS scohT.
- by rewrite DcalTs; exists RS.
-have [lam_irr nu_red]: lambda \in irr S /\ nu r \notin irr S.
- by rewrite mem_irr prTIred_not_irr.
-have [lam'nu lams'nu]: lambda != nu r /\ lambda^*%CF != nu r.
- by rewrite -conjC_IirrE !(contraNneq _ nu_red) // => <-; apply: mem_irr.
-have [[_ nRT ccT] _ _ _ _] := scohT.
-have{ccT} sT2T: {subset T2 <= calT} by apply/allP; rewrite /= ?Tlam ?Tnu_r ?ccT.
-have{nRT} uccT2: cfConjC_subset T2 calT.
- split; last 1 [by [] | by apply/allP; rewrite /= !inE !cfConjCK !eqxx !orbT].
- rewrite /uniq /T2 !inE !negb_or -!(inv_eq (@cfConjCK _ S)) !cfConjCK.
- by rewrite lam'nu lams'nu !(hasPn nRT).
-have scohT2 := subset_subcoherent scohT uccT2.
-have [tau2 cohT2]: coherent T2 S^# tauS.
- apply: (uniform_degree_coherence scohT2); rewrite /= !cfunE nu_r_1 eqxx.
- by rewrite conj_Cnat ?Cnat_irr1 ?eqxx.
-have [s nz_s] := has_nonprincipal_irr ntW2; have Smu_s := calSmu nz_s.
-pose alpha := mu_ s - d%:R *: zeta; pose beta := nu r - lambda.
-have Salpha: alpha \in 'Z[calS, M^#] by rewrite zcharD1_seqInd ?ZmuBzeta.
-have [T2lam T2nu_r]: lambda \in T2 /\ nu r \in T2 by rewrite !inE !eqxx !orbT.
-have Tbeta: beta \in 'Z[T2, S^#].
- by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE nu_r_1 subrr.
-have /eqP/idPn[] := oST _ _ Salpha (zchar_subset sT2T Tbeta).
-have [[_ <- //] [_ <- //]] := (cohS, cohT2).
-rewrite !raddfB raddfZnat /= subr_eq0 !cfdotBl !cfdotZl.
-have [|[dr r'] -> _] := FTtypeP_coherent_TIred _ cohT2 lam_irr T2lam T2nu_r.
- by rewrite -DcalTs.
-set sigS := cyclicTIiso _ => /=.
-have etaC i j: sigS (cyclicTIirr xdefW j i) = eta_ i j by apply: cycTIisoC.
-rewrite !cfdotZr addrC cfdot_sumr big1 => [|j _]; last first.
- by rewrite etaC (coherent_ortho_cycTIiso _ sSS0) ?mem_irr.
-rewrite !mulr0 oppr0 add0r rmorph_sign.
-have ->: '[zeta^\tau1, tau2 lambda] = 0.
- pose X1 := (zeta :: zeta^*)%CF; pose X2 := (lambda :: lambda^*)%CF.
- pose Y1 := map tau1 X1; pose Y2 := map tau2 X2; have [_ _ ccS] := sSS0.
- have [sX1S sX2T]: {subset X1 <= calS} /\ {subset X2 <= T2}.
- by split; apply/allP; rewrite /= ?inE ?eqxx ?orbT // Szeta ccS.
- have [/(sub_iso_to (zchar_subset sX1S) sub_refl)[Itau1 Ztau1] Dtau1L] := cohS.
- have [/(sub_iso_to (zchar_subset sX2T) sub_refl)[Itau2 Ztau2] Dtau2] := cohT2.
- have Z_Y12: {subset Y1 <= 'Z[irr G]} /\ {subset Y2 <= 'Z[irr G]}.
- by rewrite /Y1 /Y2; split=> ? /mapP[xi /mem_zchar] => [/Ztau1|/Ztau2] ? ->.
- have o1Y12: orthonormal Y1 && orthonormal Y2.
- rewrite !map_orthonormal //.
- by apply: seqInd_conjC_ortho2 Tlam; rewrite ?gFnormal ?mFT_odd.
- by apply: seqInd_conjC_ortho2 Szeta; rewrite ?gFnormal ?mFT_odd ?mem_irr.
- apply: orthonormal_vchar_diff_ortho Z_Y12 o1Y12 _; rewrite -2!raddfB.
- have SzetaBs: zeta - zeta^*%CF \in 'Z[calS, M^#].
- by rewrite zcharD1_seqInd // seqInd_sub_aut_zchar.
- have T2lamBs: lambda - lambda^*%CF \in 'Z[T2, S^#].
- rewrite sub_aut_zchar ?zchar_onG ?mem_zchar ?inE ?eqxx ?orbT //.
- by move=> xi /sT2T/seqInd_vcharW.
- by rewrite Dtau1L // Dtau2 // !Dade1 oST ?(zchar_subset sT2T) ?eqxx.
-have [[ds s'] /= -> _] := FTtypeP_coherent_TIred sSS0 cohS irr_zeta Szeta Smu_s.
-rewrite mulr0 subr0 !cfdotZl mulrA -signr_addb !cfdot_suml.
-rewrite (bigD1 r') //= cfdot_sumr (bigD1 s') //=.
-rewrite etaC cfdot_cycTIiso !eqxx big1 => [|j ne_s'_j]; last first.
- by rewrite etaC cfdot_cycTIiso andbC eq_sym (negPf ne_s'_j).
-rewrite big1 => [|i ne_i_r']; last first.
- rewrite cfdot_sumr big1 // => j _.
- by rewrite etaC cfdot_cycTIiso (negPf ne_i_r').
-rewrite !addr0 mulr1 big1 ?mulr0 ?signr_eq0 // => i _.
-by rewrite -etaC cfdotC (coherent_ortho_cycTIiso _ _ cohT2) ?conjC0 -?DcalTs.
-Qed.
-
-(* This is the bulk of the proof of Peterfalvi (10.8); however the result *)
-(* will be restated below to avoid the quantification on zeta and tau1. *)
-Lemma FTtype345_noncoherence_main : False.
-Proof.
-have [S pairMS [xdefW [U StypeP]]] := FTtypeP_pair_witness maxM MtypeP.
-have [[_ _ maxS] _] := pairMS; rewrite {1}(negPf notMtype2) /= => Stype2 _ _.
-pose H := (S`_\F)%G; pose HU := (S^`(1))%G.
-have [[_ hallW2 _ defS] [_ _ nUW2 defHU] _ [_ _ sW1H _ _] _] := StypeP.
-have ntU: U :!=: 1%g by have [[]] := compl_of_typeII maxS StypeP Stype2.
-pose G01 := [set g : gT | coprime #[g] w1].
-pose G0 := ~: 'A~(M) :&: G01; pose G1 := ~: 'A~(M) :\: G01.
-pose chi := zeta^\tau1; pose ddAM := FT_Dade_hyp maxM; pose rho := invDade ddAM.
-have Suzuki:
- #|G|%:R^-1 * (\sum_(g in ~: 'A~(M)) `|chi g| ^+ 2 - #|~: 'A~(M)|%:R)
- + '[rho chi] - #|'A(M)|%:R / #|M|%:R <= 0.
-- pose A_ (_ : 'I_1) := ddAM; pose Atau i := Dade_support (A_ i).
- have tiA i j : i != j -> [disjoint Atau i & Atau j] by rewrite !ord1.
- have Nchi1: '[chi] = 1 by have [[->]] := cohS; rewrite ?mem_zchar ?irrWnorm.
- have:= Dade_cover_inequality tiA Nchi1; rewrite /= !big_ord1 -/rho -addrA.
- by congr (_ * _ + _ <= 0); rewrite FT_Dade_supportE setTD.
-have{Suzuki} ub_rho: '[rho chi] <= #|'A(M)|%:R / #|M|%:R + #|G1|%:R / #|G|%:R.
- rewrite addrC -subr_le0 opprD addrCA (ler_trans _ Suzuki) // -addrA.
- rewrite ler_add2r -(cardsID G01 (~: _)) (big_setID G01) -/G0 -/G1 /=.
- rewrite mulrC mulrBr ler_subr_addl -mulrBr natrD addrK.
- rewrite ler_wpmul2l ?invr_ge0 ?ler0n // -sumr_const ler_paddr //.
- by apply: sumr_ge0 => g; rewrite exprn_ge0 ?normr_ge0.
- apply: ler_sum => g; rewrite !inE => /andP[notAg] /(zeta_tau1_coprime notAg).
- by rewrite expr_ge1 ?normr_ge0.
-have lb_M'bar: (w1 * 2 <= #|M' / M''|%g.-1)%N.
- suffices ->: w1 = #|W1 / M''|%g.
- rewrite muln2 -ltnS prednK ?cardG_gt0 //.
- by rewrite (ltn_odd_Frobenius_ker frobMbar) ?quotient_odd ?mFT_odd.
- have [_ sW1M _ _ tiM'W1] := sdprod_context defM.
- apply/card_isog/quotient_isog; first exact: subset_trans (der_norm 2 M).
- by apply/trivgP; rewrite -tiM'W1 setSI ?normal_sub.
-have lb_rho: 1 - w1%:R / #|M'|%:R <= '[rho chi].
- have cohS_A: coherent_with calS M^# (Dade ddAM) tau1.
- have [Itau1 _] := cohS; split=> // phi; rewrite zcharD1_seqInd // => Sphi.
- by rewrite Dtau1 // FT_DadeE // defA (zchar_on Sphi).
- rewrite {ub_rho}/rho [w1](index_sdprod defM); rewrite defA in (ddAM) cohS_A *.
- have [||_ [_ _ [] //]] := Dade_Ind1_sub_lin cohS_A _ irr_zeta Szeta.
- - by apply: seqInd_nontrivial Szeta; rewrite ?mem_irr ?mFT_odd.
- - by rewrite -(index_sdprod defM).
- rewrite -(index_sdprod defM) ler_pdivl_mulr ?ltr0n // -natrM.
- rewrite -leC_nat in lb_M'bar; apply: ler_trans lb_M'bar _.
- rewrite ler_subr_addl -mulrS prednK ?cardG_gt0 // leC_nat.
- by rewrite dvdn_leq ?dvdn_quotient.
-have{lb_rho ub_rho}:
- 1 - #|G1|%:R / #|G|%:R - w1%:R^-1 < w1%:R / #|M'|%:R :> algC.
-- rewrite -addrA -opprD ltr_subl_addr -ltr_subl_addl.
- apply: ler_lt_trans (ler_trans lb_rho ub_rho) _; rewrite addrC ltr_add2l.
- rewrite ltr_pdivr_mulr ?gt0CG // mulrC -(sdprod_card defM) natrM.
- by rewrite mulfK ?neq0CG // defA ltC_nat (cardsD1 1%g M') group1.
-have frobHU: [Frobenius HU with kernel H] by apply: Frob_der1_type2.
-have tiH: normedTI H^# G S.
- by have [_ _] := FTtypeII_ker_TI maxS Stype2; rewrite FTsupp1_type2.
-have sG1_HVG: G1 \subset class_support H^# G :|: class_support V G.
- apply/subsetP=> x; rewrite !inE coprime_has_primes ?cardG_gt0 // negbK.
- case/andP=> /hasP[p W1p]; rewrite /= mem_primes => /and3P[p_pr _ p_dv_x] _.
- have [a x_a a_p] := Cauchy p_pr p_dv_x.
- have nta: a != 1%g by rewrite -order_gt1 a_p prime_gt1.
- have ntx: x != 1%g by apply: contraTneq x_a => ->; rewrite /= cycle1 inE.
- have cxa: a \in 'C[x] by rewrite -cent_cycle (subsetP (cycle_abelian x)).
- have hallH: \pi(H).-Hall(G) H by apply: Hall_pi; have [] := FTcore_facts maxS.
- have{a_p} p_a: p.-elt a by rewrite /p_elt a_p pnat_id.
- have piHp: p \in \pi(H) by rewrite (piSg _ W1p).
- have [y _ Hay] := Hall_pJsub hallH piHp (subsetT _) p_a.
- do [rewrite -cycleJ cycle_subG; set ay := (a ^ y)%g] in Hay.
- rewrite -[x](conjgK y); set xy := (x ^ y)%g.
- have caxy: xy \in 'C[ay] by rewrite cent1J memJ_conjg cent1C.
- have [ntxy ntay]: xy != 1%g /\ ay != 1%g by rewrite !conjg_eq1.
- have Sxy: xy \in S.
- have H1ay: ay \in H^# by apply/setD1P.
- by rewrite (subsetP (cent1_normedTI tiH H1ay)) ?setTI.
- have [HUxy | notHUxy] := boolP (xy \in HU).
- rewrite memJ_class_support ?inE ?ntxy //=.
- have [_ _ _ regHUH] := Frobenius_kerP frobHU.
- by rewrite (subsetP (regHUH ay _)) // inE ?HUxy // inE ntay.
- suffices /imset2P[xyz z Vxzy _ ->]: xy \in class_support V S.
- by rewrite -conjgM orbC memJ_class_support.
- rewrite /V setUC -(FTsupp0_typeP maxS StypeP) !inE Sxy.
- rewrite andb_orr andNb (contra (subsetP _ _) notHUxy) /=; last first.
- by apply/bigcupsP=> z _; rewrite (eqP Stype2) setDE -setIA subsetIl.
- have /Hall_pi hallHU: Hall S HU by rewrite (sdprod_Hall defS).
- rewrite (eqP Stype2) -(mem_normal_Hall hallHU) ?gFnormal // notHUxy.
- have /mulG_sub[sHHU _] := sdprodW defHU.
- rewrite (contra (fun p'xy => pi'_p'group p'xy (piSg sHHU piHp))) //.
- by rewrite pgroupE p'natE // cycleJ cardJg p_dv_x.
-have ub_G1: #|G1|%:R / #|G|%:R <= #|H|%:R / #|S|%:R + #|V|%:R / #|W|%:R :> algC.
- rewrite ler_pdivr_mulr ?ltr0n ?cardG_gt0 // mulrC mulrDr !mulrA.
- rewrite ![_ * _ / _]mulrAC -!natf_indexg ?subsetT //= -!natrM -natrD ler_nat.
- apply: leq_trans (subset_leq_card sG1_HVG) _.
- rewrite cardsU (leq_trans (leq_subr _ _)) //.
- have unifJG B C: C \in B :^: G -> #|C| = #|B|.
- by case/imsetP=> z _ ->; rewrite cardJg.
- have oTI := card_uniform_partition (unifJG _) (partition_class_support _ _).
- have{tiH} [ntH tiH /eqP defNH] := and3P tiH.
- have [_ _ /and3P[ntV tiV /eqP defNV]] := ctiWG.
- rewrite !oTI // !card_conjugates defNH defNV /= leq_add2r ?leq_mul //.
- by rewrite subset_leq_card ?subsetDl.
-rewrite ler_gtF // addrAC ler_subr_addl -ler_subr_addr (ler_trans ub_G1) //.
-rewrite -(sdprod_card defS) -(sdprod_card defHU) addrC.
-rewrite -mulnA !natrM invfM mulVKf ?natrG_neq0 // -/w1 -/w2.
-have sW12_W: W1 :|: W2 \subset W by rewrite -(dprodWY defW) sub_gen.
-rewrite cardsD (setIidPr sW12_W) natrB ?subset_leq_card // mulrBl.
-rewrite divff ?natrG_neq0 // -!addrA ler_add2l.
-rewrite cardsU -(dprod_card defW) -/w1 -/w2; have [_ _ _ ->] := dprodP defW.
-rewrite cards1 natrB ?addn_gt0 ?cardG_gt0 // addnC natrD -addrA mulrDl mulrBl.
-rewrite {1}mulnC !natrM !invfM !mulVKf ?natrG_neq0 // opprD -addrA ler_add2l.
-rewrite mul1r -{1}[_^-1]mul1r addrC ler_oppr [- _]opprB -!mulrBl.
-rewrite -addrA -opprD ler_pdivl_mulr; last by rewrite natrG_gt0.
-apply: ler_trans (_ : 1 - (3%:R^-1 + 7%:R^-1) <= _); last first.
- rewrite ler_add2l ler_opp2.
- rewrite ler_add // lef_pinv ?qualifE ?gt0CG ?ltr0n ?ler_nat //.
- have notStype5: FTtype S != 5 by rewrite (eqP Stype2).
- have frobUW2 := Ptype_compl_Frobenius maxS StypeP notStype5.
- apply: leq_ltn_trans (ltn_odd_Frobenius_ker frobUW2 (mFT_odd _)).
- by rewrite (leq_double 3).
-apply: ler_trans (_ : 2%:R^-1 <= _); last by rewrite -!CratrE; compute.
-rewrite mulrAC ler_pdivr_mulr 1?gt0CG // ler_pdivl_mull ?ltr0n //.
-rewrite -!natrM ler_nat mulnA -(Lagrange (normal_sub nsM''M')) mulnC leq_mul //.
- by rewrite subset_leq_card //; have [_ _ _ []] := MtypeP.
-by rewrite -card_quotient ?normal_norm // mulnC -(prednK (cardG_gt0 _)) leqW.
-Qed.
-
-End NonCoherence.
-
-(* This is Peterfalvi (10.9). *)
-Lemma FTtype345_Dade_bridge0 :
- (w1 < w2)%N ->
- {chi | [/\ (mu_ 0 - zeta)^\tau = \sum_i eta_ i 0 - chi,
- chi \in 'Z[irr G], '[chi] = 1
- & forall i j, '[chi, eta_ i j] = 0]}.
-Proof.
-move=> w1_lt_w2; set psi := mu_ 0 - zeta; pose Wsig := map sigma (irr W).
-have [X wsigX [chi [DpsiG _ o_chiW]]] := orthogonal_split Wsig psi^\tau.
-exists (- chi); rewrite opprK rpredN cfnormN.
-have o_chi_w i j: '[chi, eta_ i j] = 0.
- by rewrite (orthoPl o_chiW) ?map_f ?mem_irr.
-have [Isigma Zsigma] := cycTI_Zisometry ctiWG.
-have o1Wsig: orthonormal Wsig by rewrite map_orthonormal ?irr_orthonormal.
-have [a_ Da defX] := orthonormal_span o1Wsig wsigX.
-have{Da} Da i j: a_ (eta_ i j) = '[psi^\tau, eta_ i j].
- by rewrite DpsiG cfdotDl o_chi_w addr0 Da.
-have sumX: X = \sum_i \sum_j a_ (eta_ i j) *: eta_ i j.
- rewrite pair_bigA defX big_map (big_nth 0) size_tuple big_mkord /=.
- rewrite (reindex (dprod_Iirr defW)) /=.
- by apply: eq_bigr => [[i j] /= _]; rewrite -tnth_nth.
- by exists (inv_dprod_Iirr defW) => ij; rewrite (inv_dprod_IirrK, dprod_IirrK).
-have Zpsi: psi \in 'Z[irr M].
- by rewrite rpredB ?irr_vchar ?(mem_zchar irr_zeta) ?char_vchar ?prTIred_char.
-have{Zpsi} M'psi: psi \in 'Z[irr M, M'^#].
- by rewrite -defA zchar_split Zpsi mu0Bzeta_on.
-have A0psi: psi \in 'CF(M, 'A0(M)).
- by apply: cfun_onS (zchar_on M'psi); rewrite defA0 subsetUl.
-have a_00: a_ (eta_ 0 0) = 1.
- rewrite Da [w_ 0 0](cycTIirr00 defW) [sigma 1]cycTIiso1.
- rewrite Dade_reciprocity // => [|x _ y _]; last by rewrite !cfun1E !inE.
- rewrite rmorph1 /= -(prTIirr00 ptiWM) -/(mu2_ 0 0) cfdotC.
- by rewrite cfdotBr o_mu2_zeta subr0 cfdot_prTIirr_red rmorph1.
-have n2psiG: '[psi^\tau] = w1.+1%:R.
- rewrite Dade_isometry // cfnormBd ?o_mu_zeta //.
- by rewrite cfnorm_prTIred irrWnorm // -/w1 mulrSr.
-have psiG_V0 x: x \in V -> psi^\tau x = 0.
- move=> Vx; rewrite Dade_id ?defA0; last first.
- by rewrite inE orbC mem_class_support.
- rewrite (cfun_on0 (zchar_on M'psi)) // -defA.
- suffices /setDP[]: x \in 'A0(M) :\: 'A(M) by [].
- by rewrite (FTsupp0_typeP maxM MtypeP) // mem_class_support.
-have ZpsiG: psi^\tau \in 'Z[irr G].
- by rewrite Dade_vchar // zchar_split (zcharW M'psi).
-have n2psiGsum: '[psi^\tau] = \sum_i \sum_j `|a_ (eta_ i j)| ^+ 2 + '[chi].
- rewrite DpsiG addrC cfnormDd; last first.
- by rewrite (span_orthogonal o_chiW) ?memv_span1.
- rewrite addrC defX cfnorm_sum_orthonormal // big_map pair_bigA; congr (_ + _).
- rewrite big_tuple /= (reindex (dprod_Iirr defW)) //.
- by exists (inv_dprod_Iirr defW) => ij; rewrite (inv_dprod_IirrK, dprod_IirrK).
-have NCpsiG: (cyclicTI_NC ctiWG psi^\tau < 2 * minn w1 w2)%N.
- apply: (@leq_ltn_trans w1.+1); last first.
- by rewrite /minn w1_lt_w2 mul2n -addnn (leq_add2r w1 2) cardG_gt1.
- pose z_a := [pred ij | a_ (eta_ ij.1 ij.2) == 0].
- have ->: cyclicTI_NC ctiWG psi^\tau = #|[predC z_a]|.
- by apply: eq_card => ij; rewrite !inE -Da.
- rewrite -leC_nat -n2psiG n2psiGsum ler_paddr ?cfnorm_ge0 // pair_bigA.
- rewrite (bigID z_a) big1 /= => [|ij /eqP->]; last by rewrite normCK mul0r.
- rewrite add0r -sumr_const ler_sum // => [[i j] nz_ij].
- by rewrite expr_ge1 ?norm_Cint_ge1 // Da Cint_cfdot_vchar ?Zsigma ?irr_vchar.
-have nz_psiG00: '[psi^\tau, eta_ 0 0] != 0 by rewrite -Da a_00 oner_eq0.
-have [a_i|a_j] := small_cycTI_NC psiG_V0 NCpsiG nz_psiG00.
- have psiGi: psi^\tau = \sum_i eta_ i 0 + chi.
- rewrite DpsiG sumX; congr (_ + _); apply: eq_bigr => i _.
- rewrite big_ord_recl /= Da a_i -Da a_00 mul1r scale1r.
- by rewrite big1 ?addr0 // => j1 _; rewrite Da a_i mul0r scale0r.
- split=> // [||i j]; last by rewrite cfdotNl o_chi_w oppr0.
- rewrite -(canLR (addKr _) psiGi) rpredD // rpredN rpred_sum // => j _.
- by rewrite Zsigma ?irr_vchar.
- apply: (addrI w1%:R); rewrite -mulrSr -n2psiG n2psiGsum; congr (_ + _).
- rewrite -nirrW1 // -sumr_const; apply: eq_bigr => i _.
- rewrite big_ord_recl /= Da a_i -Da a_00 mul1r normr1.
- by rewrite expr1n big1 ?addr0 // => j1 _; rewrite Da a_i normCK !mul0r.
-suffices /idPn[]: '[psi^\tau] >= w2%:R.
- rewrite odd_geq /= ?uphalf_half mFT_odd //= in w1_lt_w2.
- by rewrite n2psiG leC_nat -ltnNge odd_geq ?mFT_odd.
-rewrite n2psiGsum exchange_big /= ler_paddr ?cfnorm_ge0 //.
-rewrite -nirrW2 -sumr_const; apply: ler_sum => i _.
-rewrite big_ord_recl /= Da a_j -Da a_00 mul1r normr1.
-by rewrite expr1n big1 ?addr0 // => j1 _; rewrite Da a_j normCK !mul0r.
-Qed.
-
-Local Notation H := M'.
-Local Notation "` 'H'" := `M' (at level 0) : group_scope.
-Local Notation H' := M''.
-Local Notation "` 'H''" := `M'' (at level 0) : group_scope.
-
-(* This is the bulk of the proof of Peterfalvi, Theorem (10.10); as with *)
-(* (10.8), it will be restated below in order to remove dependencies on zeta, *)
-(* U_M and W1. *)
-Lemma FTtype5_exclusion_main : FTtype M != 5.
-Proof.
-apply/negP=> Mtype5.
-suffices [tau1]: coherent calS M^# tau by case/FTtype345_noncoherence_main.
-have [[_ U_M_1] MtypeV] := compl_of_typeV maxM MtypeP Mtype5.
-have [_ [_ _ _ defH] _ [_ _ _ sW2H' _] _] := MtypeP.
-have{U_M_1 defH} defMF: M`_\F = H by rewrite /= -defH U_M_1 sdprodg1.
-have nilH := Fcore_nil M; rewrite defMF -/w1 in MtypeV nilH.
-without loss [p [pH not_cHH ubHbar not_w1_dv_p1]]: / exists p : nat,
- [/\ p.-group H, ~~ abelian H, #|H : H'| <= 4 * w1 ^ 2 + 1 & ~ w1 %| p.-1]%N.
-- have [isoH1 solH] := (quotient1_isog H, nilpotent_sol nilH).
- have /non_coherent_chief-IHcoh := subset_subcoherent scohS0 sSS0.
- apply: IHcoh (fun coh _ => coh) _ => // [|[[_ ubH] [p [pH ab'H] /negP-dv'p]]].
- split; rewrite ?mFT_odd ?normal1 ?sub1G ?quotient_nil //.
- by rewrite joingG1 (FrobeniusWker frobMbar).
- apply; exists p; rewrite (isog_abelian isoH1) (isog_pgroup p isoH1) -subn1.
- by rewrite /= joingG1 -(index_sdprod defM) in ubH dv'p.
-have ntH: H :!=: 1%g by apply: contraNneq not_cHH => ->; apply: abelian1.
-have [sH'H nH'H] := andP nsM''M'; have sW2H := subset_trans sW2H' sH'H.
-have def_w2: w2 = p by apply/eqP; have:= pgroupS sW2H pH; rewrite pgroupE pnatE.
-have piHp q: q \in \pi(H) -> q = p.
- by rewrite /= -(part_pnat_id pH) pi_of_part // => /andP[_ /eqnP].
-have [tiHG | [_ /piHp-> []//] | [_ /piHp-> [oH w1_dv_p1 _]]] := MtypeV.
- suffices [tau1 [Itau1 Dtau1]]: coherent (seqIndD H M H 1) M^# 'Ind[G].
- exists tau1; split=> // phi Sphi; rewrite {}Dtau1 //.
- rewrite zcharD1_seqInd // -subG1 -setD_eq0 -defA in Sphi tiHG ntH.
- by have Aphi := zchar_on Sphi; rewrite -FT_DadeE // Dade_Ind.
- apply: (@Sibley_coherence _ [set:_] M H W1); first by rewrite mFT_odd.
- right; exists W2 => //; exists 'A0(M), W, defW.
- by rewrite -defA -{2}(group_inj defMs).
-have [p_pr _ _] := pgroup_pdiv pH ntH; rewrite (pcore_pgroup_id pH) in oH.
-have{not_cHH} esH: extraspecial H.
- by apply: (p3group_extraspecial pH); rewrite // oH pfactorK.
-have oH': #|H'| = p.
- by rewrite -(card_center_extraspecial pH esH); have [[_ <-]] := esH.
-have defW2: W2 :=: H' by apply/eqP; rewrite eqEcard sW2H' oH' -def_w2 /=.
-have iH'H: #|H : H'|%g = (p ^ 2)%N by rewrite -divgS // oH oH' mulKn ?prime_gt0.
-have w1_gt0: (0 < w1)%N by apply: cardG_gt0.
-(* This is step (10.10.1). *)
-have{ubHbar} [def_p_w1 w1_lt_w2]: (p = 2 * w1 - 1 /\ w1 < w2)%N.
- have /dvdnP[k def_p]: 2 * w1 %| p.+1.
- by rewrite Gauss_dvd ?coprime2n ?mFT_odd ?dvdn2 //= -{1}def_w2 mFT_odd.
- suffices k1: k = 1%N.
- rewrite k1 mul1n in def_p; rewrite -ltn_double -mul2n -def_p -addn1 addnK.
- by rewrite -addnS -addnn def_w2 leq_add2l prime_gt1.
- have [k0 | k_gt0] := posnP k; first by rewrite k0 in def_p.
- apply/eqP; rewrite eqn_leq k_gt0 andbT -ltnS -ltn_double -mul2n.
- rewrite -[(2 * k)%N]prednK ?muln_gt0 // ltnS -ltn_sqr 3?leqW //=.
- rewrite -subn1 sqrn_sub ?muln_gt0 // expnMn muln1 mulnA ltnS leq_subLR.
- rewrite addn1 addnS ltnS -mulnSr leq_pmul2l // -(leq_subLR _ 1).
- rewrite (leq_trans (leq_pmulr _ w1_gt0)) // -(leq_pmul2r w1_gt0).
- rewrite -mulnA mulnBl mul1n -2!leq_double -!mul2n mulnA mulnBr -!expnMn.
- rewrite -(expnMn 2 _ 2) mulnCA -def_p -addn1 leq_subLR sqrnD muln1.
- by rewrite (addnC p) mulnDr addnA leq_add2r addn1 addnS -iH'H.
-(* This is step (10.10.2). *)
-pose S1 := seqIndD H M H H'.
-have sS1S: {subset S1 <= calS} by apply: seqIndS; rewrite Iirr_kerDS ?sub1G.
-have irrS1: {subset S1 <= irr M}.
- move=> _ /seqIndP[s /setDP[kerH' ker'H] ->]; rewrite !inE in kerH' ker'H.
- rewrite -(quo_IirrK _ kerH') // mod_IirrE // cfIndMod // cfMod_irr //.
- rewrite (irr_induced_Frobenius_ker (FrobeniusWker frobMbar)) //.
- by rewrite quo_Iirr_eq0 // -subGcfker.
-have S1w1: {in S1, forall xi : 'CF(M), xi 1%g = w1%:R}.
- move=> _ /seqIndP[s /setDP[kerH' _] ->]; rewrite !inE in kerH'.
- by rewrite cfInd1 // -(index_sdprod defM) lin_char1 ?mulr1 // lin_irr_der1.
-have sS10: cfConjC_subset S1 calS0.
- by apply: seqInd_conjC_subset1; rewrite /= defMs.
-pose S2 := [seq mu_ j | j in predC1 0].
-have szS2: size S2 = p.-1.
- by rewrite -def_w2 size_map -cardE cardC1 card_Iirr_abelian ?cyclic_abelian.
-have uS2: uniq S2 by apply/dinjectiveP; apply: in2W (prTIred_inj pddM).
-have redS2: {subset S2 <= [predC irr M]}.
- by move=> _ /imageP[j _ ->]; apply: (prTIred_not_irr pddM).
-have sS2S: {subset S2 <= calS} by move=> _ /imageP[j /calSmu Smu_j ->].
-have S1'2: {subset S2 <= [predC S1]}.
- by move=> xi /redS2; apply: contra (irrS1 _).
-have w1_dv_p21: w1 %| p ^ 2 - 1 by rewrite (subn_sqr p 1) addn1 dvdn_mull.
-have [j nz_j] := has_nonprincipal_irr ntW2.
-have [Dmu2_1 Ddelta_ lt1d Nn] := FTtype345_constants.
-have{lt1d} [defS szS1 Dd Ddel Dn]:
- [/\ perm_eq calS (S1 ++ S2), size S1 = (p ^ 2 - 1) %/ w1,
- d = p, delta = -1 & n = 2%:R].
-- pose X_ (S0 : seq 'CF(M)) := [set s | 'Ind[M, H] 'chi_s \in S0].
- pose sumX_ cS0 := \sum_(s in X_ cS0) 'chi_s 1%g ^+ 2.
- have defX1: X_ S1 = Iirr_kerD H H H'.
- by apply/setP=> s; rewrite !inE mem_seqInd // !inE.
- have defX: X_ calS = Iirr_kerD H H 1%g.
- by apply/setP=> s; rewrite !inE mem_seqInd ?normal1 //= !inE.
- have sumX1: sumX_ S1 = (p ^ 2)%:R - 1.
- by rewrite /sumX_ defX1 sum_Iirr_kerD_square // iH'H indexgg mul1r.
- have ->: size S1 = (p ^ 2 - 1) %/ w1.
- apply/eqP; rewrite eqn_div // -eqC_nat mulnC [w1](index_sdprod defM).
- rewrite (size_irr_subseq_seqInd _ (subseq_refl S1)) //.
- rewrite natrB ?expn_gt0 ?prime_gt0 // -sumr_const -sumX1.
- apply/eqP/esym/eq_bigr => s.
- by rewrite defX1 !inE -lin_irr_der1 => /and3P[_ _ /eqP->]; rewrite expr1n.
- have oX2: #|X_ S2| = p.-1.
- by rewrite -(size_red_subseq_seqInd_typeP MtypeP uS2 sS2S).
- have sumX2: (p ^ 2 * p.-1)%:R <= sumX_ S2 ?= iff (d == p).
- rewrite /sumX_ (eq_bigr (fun _ => d%:R ^+ 2)) => [|s]; last first.
- rewrite inE => /imageP[j1 nz_j1 Dj1]; congr (_ ^+ 2).
- apply: (mulfI (neq0CiG M H)); rewrite -cfInd1 // -(index_sdprod defM).
- by rewrite Dj1 (prTIred_1 pddM) Dmu2_1.
- rewrite sumr_const oX2 mulrnA (mono_lerif (ler_pmuln2r _)); last first.
- by rewrite -def_w2 -(subnKC w2gt2).
- rewrite natrX (mono_in_lerif ler_sqr) ?rpred_nat // eq_sym lerif_nat.
- apply/leqif_eq; rewrite dvdn_leq 1?ltnW //.
- have: (mu2_ 0 j 1%g %| (p ^ 3)%N)%C.
- by rewrite -(cfRes1 H) cfRes_prTIirr -oH dvd_irr1_cardG.
- rewrite Dmu2_1 // dvdC_nat => /dvdn_pfactor[//|[_ d1|e _ ->]].
- by rewrite d1 in lt1d.
- by rewrite expnS dvdn_mulr.
- pose S3 := filter [predC S1 ++ S2] calS.
- have sumX3: 0 <= sumX_ S3 ?= iff nilp S3.
- rewrite /sumX_; apply/lerifP.
- have [-> | ] := altP nilP; first by rewrite big_pred0 // => s; rewrite !inE.
- rewrite -lt0n -has_predT => /hasP[xi S3xi _].
- have /seqIndP[s _ Dxi] := mem_subseq (filter_subseq _ _) S3xi.
- rewrite (bigD1 s) ?inE -?Dxi //= ltr_spaddl ?sumr_ge0 // => [|s1 _].
- by rewrite exprn_gt0 ?irr1_gt0.
- by rewrite ltrW ?exprn_gt0 ?irr1_gt0.
- have [_ /esym] := lerif_add sumX2 sumX3.
- have /(canLR (addKr _)) <-: sumX_ calS = sumX_ S1 + (sumX_ S2 + sumX_ S3).
- rewrite [sumX_ _](big_setID (X_ S1)); congr (_ + _).
- by apply: eq_bigl => s; rewrite !inE andb_idl // => /sS1S.
- rewrite (big_setID (X_ S2)); congr (_ + _); apply: eq_bigl => s.
- by rewrite !inE andb_idl // => S2s; rewrite [~~ _]S1'2 ?sS2S.
- by rewrite !inE !mem_filter /= mem_cat orbC negb_or andbA.
- rewrite sumX1 /sumX_ defX sum_Iirr_kerD_square ?sub1G ?normal1 // indexgg.
- rewrite addr0 mul1r indexg1 oH opprD addrACA addNr addr0 addrC.
- rewrite (expnSr p 2) -[p in (_ ^ 2 * p)%:R - _]prednK ?prime_gt0 // mulnSr.
- rewrite natrD addrK eqxx => /andP[/eqP Dd /nilP S3nil].
- have uS12: uniq (S1 ++ S2).
- by rewrite cat_uniq seqInd_uniq uS2 andbT; apply/hasPn.
- rewrite uniq_perm_eq ?seqInd_uniq {uS12}// => [|xi]; last first.
- apply/idP/idP; apply: allP xi; last by rewrite all_cat !(introT allP _).
- by rewrite -(canLR negbK (has_predC _ _)) has_filter -/S3 S3nil.
- have: (w1 %| d%:R - delta)%C.
- by rewrite unfold_in pnatr_eq0 eqn0Ngt w1_gt0 rpred_Cnat.
- rewrite /n Dd def_p_w1 /delta; case: (Idelta _) => [_|/idPn[] /=].
- by rewrite opprK -(natrD _ _ 1) subnK ?muln_gt0 // natrM mulfK ?neq0CG.
- rewrite mul2n -addnn -{1}(subnKC (ltnW w1gt2)) !addSn mulrSr addrK dvdC_nat.
- by rewrite add0n dvdn_addl // -(subnKC w1gt2) gtnNdvd // leqW.
-have scohS1 := subset_subcoherent scohS0 sS10.
-have o1S1: orthonormal S1.
- rewrite orthonormalE andbC; have [_ _ -> _ _] := scohS1.
- by apply/allP=> xi /irrS1/irrP[t ->]; rewrite /= cfnorm_irr.
-have [tau1 cohS1]: coherent S1 M^# tau.
- apply: uniform_degree_coherence scohS1 _; apply: all_pred1_constant w1%:R _ _.
- by rewrite all_map; apply/allP=> xi /S1w1/= ->.
-have [[Itau1 Ztau1] Dtau1] := cohS1.
-have o1S1tau: orthonormal (map tau1 S1) by apply: map_orthonormal.
-have S1zeta: zeta \in S1.
- by have:= Szeta; rewrite (perm_eq_mem defS) mem_cat => /orP[//|/redS2/negP].
-(* This is the main part of step 10.10.3; as the definition of alpha_ remains *)
-(* valid we do not need to reprove alpha_on. *)
-have Dalpha i (al_ij := alpha_ i j) :
- al_ij^\tau = delta *: (eta_ i j - eta_ i 0) - n *: tau1 zeta.
-- have [Y S1_Y [X [Dal_ij _ oXY]]] := orthogonal_split (map tau1 S1) al_ij^\tau.
- have [a_ Da_ defY] := orthonormal_span o1S1tau S1_Y.
- have oXS1 lam : lam \in S1 -> '[X, tau1 lam] = 0.
- by move=> S1lam; rewrite (orthoPl oXY) ?map_f.
- have{Da_} Da_ lam : lam \in S1 -> a_ (tau1 lam) = '[al_ij^\tau, tau1 lam].
- by move=> S1lam; rewrite Dal_ij cfdotDl oXS1 // addr0 Da_.
- pose a := n + a_ (tau1 zeta); have [_ oS1S1] := orthonormalP o1S1.
- have Da_z: a_ (tau1 zeta) = - n + a by rewrite addKr.
- have Za: a \in Cint.
- rewrite rpredD ?Dn ?rpred_nat // Da_ // Cint_cfdot_vchar ?Zalpha_tau //=.
- by rewrite Ztau1 ?mem_zchar.
- have Da_z' lam: lam \in S1 -> lam != zeta -> a_ (tau1 lam) = a.
- move=> S1lam zeta'lam; apply: canRL (subrK _) _.
- rewrite !Da_ // -cfdotBr -raddfB.
- have S1dlam: lam - zeta \in 'Z[S1, M^#].
- by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE !S1w1 ?subrr.
- rewrite Dtau1 // Dade_isometry ?alpha_on ?tauM' //; last first.
- by rewrite -zcharD1_seqInd ?(zchar_subset sS1S).
- have o_mu2_lam k: '[mu2_ i k, lam] = 0 by rewrite o_mu2_irr ?sS1S ?irrS1.
- rewrite !cfdotBl !cfdotZl !cfdotBr !o_mu2_lam !o_mu2_zeta !(subr0, mulr0).
- by rewrite irrWnorm ?oS1S1 // eq_sym (negPf zeta'lam) !add0r mulrN1 opprK.
- have lb_n2alij: (a - n) ^+ 2 + (size S1 - 1)%:R * a ^+ 2 <= '[al_ij^\tau].
- rewrite Dal_ij cfnormDd; last first.
- by rewrite cfdotC (span_orthogonal oXY) ?rmorph0 // memv_span1.
- rewrite ler_paddr ?cfnorm_ge0 // defY cfnorm_sum_orthonormal //.
- rewrite (big_rem (tau1 zeta)) ?map_f //= ler_eqVlt; apply/predU1P; left.
- congr (_ + _).
- by rewrite Da_z addrC Cint_normK 1?rpredD // rpredN Dn rpred_nat.
- rewrite (eq_big_seq (fun _ => a ^+ 2)) => [|tau1lam]; last first.
- rewrite rem_filter ?free_uniq ?orthonormal_free // filter_map.
- case/mapP=> lam; rewrite mem_filter /= andbC => /andP[S1lam].
- rewrite (inj_in_eq (Zisometry_inj Itau1)) ?mem_zchar // => zeta'lam ->.
- by rewrite Da_z' // Cint_normK.
- rewrite big_tnth sumr_const card_ord size_rem ?map_f // size_map.
- by rewrite mulr_natl subn1.
- have{lb_n2alij} ub_a2: (size S1)%:R * a ^+ 2 <= 2%:R * a * n + 2%:R.
- rewrite norm_alpha // addrC sqrrB !addrA ler_add2r in lb_n2alij.
- rewrite mulr_natl -mulrSr ler_subl_addl subn1 in lb_n2alij.
- by rewrite -mulrA !mulr_natl; case: (S1) => // in S1zeta lb_n2alij *.
- have{ub_a2} ub_8a2: 8%:R * a ^+ 2 <= 4%:R * a + 2%:R.
- rewrite mulrAC Dn -natrM in ub_a2; apply: ler_trans ub_a2.
- rewrite -Cint_normK // ler_wpmul2r ?exprn_ge0 ?normr_ge0 // leC_nat szS1.
- rewrite (subn_sqr p 1) def_p_w1 subnK ?muln_gt0 // mulnA mulnK // mulnC.
- by rewrite -subnDA -(mulnBr 2 _ 1%N) mulnA (@leq_pmul2l 4 2) ?ltn_subRL.
- have Z_4a1: 4%:R * a - 1%:R \in Cint by rewrite rpredB ?rpredM ?rpred_nat.
- have{ub_8a2} ub_4a1: `|4%:R * a - 1| < 3%:R.
- rewrite -ltr_sqr ?rpred_nat ?qualifE ?normr_ge0 // -natrX Cint_normK //.
- rewrite sqrrB1 exprMn -natrX -mulrnAl -mulrnA (natrD _ 8 1) ltr_add2r.
- rewrite (natrM _ 2 4) (natrM _ 2 8) -!mulrA -mulrBr ltr_pmul2l ?ltr0n //.
- by rewrite ltr_subl_addl (ler_lt_trans ub_8a2) // ltr_add2l ltr_nat.
- have{ub_4a1} a0: a = 0.
- apply: contraTeq ub_4a1 => a_nz; have:= norm_Cint_ge1 Za a_nz.
- rewrite real_ltr_norml ?real_ler_normr ?Creal_Cint //; apply: contraL.
- case/andP; rewrite ltr_subl_addr -(natrD _ 3 1) gtr_pmulr ?ltr0n //.
- rewrite ltr_oppl opprB -mulrN => /ltr_le_trans/=/(_ _ (leC_nat 3 5)).
- by rewrite (natrD _ 1 4) ltr_add2l gtr_pmulr ?ltr0n //; do 2!move/ltr_geF->.
- apply: (def_tau_alpha cohS1 sS10 nz_j S1zeta).
- by rewrite -Da_ // Da_z a0 addr0.
-have o_eta__zeta i j1: '[tau1 zeta, eta_ i j1] = 0.
- by rewrite (coherent_ortho_cycTIiso _ sS10 cohS1) ?mem_irr.
-(* This is step (10.4), the final one. *)
-have Dmu0zeta: (mu_ 0 - zeta)^\tau = \sum_i eta_ i 0 - tau1 zeta.
- have A0mu0tau: mu_ 0 - zeta \in 'CF(M, 'A0(M)).
- rewrite /'A0(M) defA; apply: (cfun_onS (subsetUl _ _)).
- rewrite cfun_onD1 [mu_ 0](prTIred0 pddM) !cfunE zeta1w1 cfuniE // group1.
- by rewrite mulr1 subrr rpredB ?rpredZnat ?cfuni_on ?(seqInd_on _ Szeta) /=.
- have [chi [Dmu0 Zchi n1chi o_chi_w]] := FTtype345_Dade_bridge0 w1_lt_w2.
- have dirr_chi: chi \in dirr G by rewrite dirrE Zchi n1chi /=.
- have dirr_zeta: tau1 zeta \in dirr G.
- by rewrite dirrE Ztau1 ?Itau1 ?mem_zchar //= irrWnorm.
- have: '[(alpha_ 0 j)^\tau, (mu_ 0 - zeta)^\tau] == - delta + n.
- rewrite Dade_isometry ?alpha_on // !cfdotBl !cfdotZl !cfdotBr.
- rewrite !o_mu2_zeta 2!cfdot_prTIirr_red (negPf nz_j) cfdotC o_mu_zeta.
- by rewrite eqxx irrWnorm // conjC0 !(subr0, add0r) mulr1 mulrN1 opprK.
- rewrite Dalpha // Dmu0 !{1}(cfdotBl, cfdotZl) !cfdotBr 2!{1}(cfdotC _ chi).
- rewrite !o_chi_w conjC0 !cfdot_sumr big1 => [|i]; first last.
- by rewrite (cfdot_cycTIiso pddM) (negPf nz_j) andbF.
- rewrite (bigD1 0) //= cfdot_cycTIiso big1 => [|i nz_i]; first last.
- by rewrite cfdot_cycTIiso eq_sym (negPf nz_i).
- rewrite big1 // !subr0 !add0r addr0 mulrN1 mulrN opprK (can_eq (addKr _)).
- rewrite {2}Dn -mulr_natl Dn (inj_eq (mulfI _)) ?pnatr_eq0 //.
- by rewrite cfdot_dirr_eq1 // => /eqP->.
-have [] := uniform_prTIred_coherent pddM nz_j; rewrite -/sigma.
-have ->: uniform_prTIred_seq pddM j = S2.
- congr (map _ _); apply: eq_enum => k; rewrite !inE -!/(mu_ _).
- by rewrite andb_idr // => nz_k; rewrite 2!{1}prTIred_1 2?Dmu2_1.
-case=> _ _ ccS2 _ _ [tau2 Dtau2 cohS2].
-have{cohS2} cohS2: coherent_with S2 M^# tau tau2 by apply: cohS2.
-have sS20: cfConjC_subset S2 calS0.
- by split=> // xi /sS2S Sxi; have [_ ->] := sSS0.
-rewrite perm_eq_sym perm_catC in defS; apply: perm_eq_coherent defS _.
-suffices: (mu_ j - d%:R *: zeta)^\tau = tau2 (mu_ j) - tau1 (d%:R *: zeta).
- apply: (bridge_coherent scohS0 sS20 cohS2 sS10 cohS1) => [phi|].
- by apply: contraL => /S1'2.
- rewrite cfunD1E !cfunE zeta1w1 prTIred_1 mulrC Dmu2_1 // subrr.
- by rewrite image_f // rpredZnat ?mem_zchar.
-have sumA: \sum_i alpha_ i j = mu_ j - delta *: mu_ 0 - (d%:R - delta) *: zeta.
- rewrite !sumrB sumr_const /= -scaler_sumr; congr (_ - _ - _).
- rewrite card_Iirr_abelian ?cyclic_abelian // -/w1 -scaler_nat.
- by rewrite scalerA mulrC divfK ?neq0CG.
-rewrite scalerBl opprD opprK addrACA in sumA.
-rewrite -{sumA}(canLR (addrK _) sumA) opprD opprK -scalerBr.
-rewrite linearD linearZ linear_sum /= Dmu0zeta scalerBr.
-rewrite (eq_bigr _ (fun i _ => Dalpha i)) sumrB sumr_const nirrW1.
-rewrite -!scaler_sumr sumrB addrAC !addrA scalerBr subrK -addrA -opprD.
-rewrite raddfZnat Dtau2 Ddelta_ //; congr (_ - _).
-by rewrite addrC -scaler_nat scalerA mulrC divfK ?neq0CG // -scalerDl subrK.
-Qed.
-
-End OneMaximal.
-
-Implicit Type M : {group gT}.
-
-(* This is the exported version of Peterfalvi, Theorem (10.8). *)
-Theorem FTtype345_noncoherence M (M' := M^`(1)%G) (maxM : M \in 'M) :
- (FTtype M > 2)%N -> ~ coherent (seqIndD M' M M' 1) M^# (FT_Dade0 maxM).
-Proof.
-rewrite ltnNge 2!leq_eqVlt => /norP[notMtype2 /norP[notMtype1 _]] [tau1 cohS].
-have [U W W1 W2 defW MtypeP] := FTtypeP_witness maxM notMtype1.
-have [zeta [irr_zeta Szeta zeta1w1]] := FTtypeP_ref_irr maxM MtypeP.
-exact: (FTtype345_noncoherence_main MtypeP _ irr_zeta Szeta zeta1w1 cohS).
-Qed.
-
-(* This is the exported version of Peterfalvi, Theorem (10.10). *)
-Theorem FTtype5_exclusion M : M \in 'M -> FTtype M != 5.
-Proof.
-move=> maxM; apply: wlog_neg; rewrite negbK => Mtype5.
-have notMtype2: FTtype M != 2 by rewrite (eqP Mtype5).
-have [U W W1 W2 defW [[MtypeP _] _]] := FTtypeP 5 maxM Mtype5.
-have [zeta [irr_zeta Szeta zeta1w1]] := FTtypeP_ref_irr maxM MtypeP.
-exact: (FTtype5_exclusion_main _ MtypeP _ irr_zeta).
-Qed.
-
-(* This the first assertion of Peterfalvi (10.11). *)
-Lemma FTtypeP_pair_primes S T W W1 W2 (defW : W1 \x W2 = W) :
- typeP_pair S T defW -> prime #|W1| /\ prime #|W2|.
-Proof.
-move=> pairST; have [[_ maxS maxT] _ _ _ _] := pairST.
-have type24 maxM := compl_of_typeII_IV maxM _ (FTtype5_exclusion maxM).
-split; first by have [U /type24[]] := typeP_pairW pairST.
-have xdefW: W2 \x W1 = W by rewrite dprodC.
-by have [U /type24[]] := typeP_pairW (typeP_pair_sym xdefW pairST).
-Qed.
-
-Corollary FTtypeP_primes M U W W1 W2 (defW : W1 \x W2 = W) :
- M \in 'M -> of_typeP M U defW -> prime #|W1| /\ prime #|W2|.
-Proof.
-move=> maxM MtypeP; have [T pairMT _] := FTtypeP_pair_witness maxM MtypeP.
-exact: FTtypeP_pair_primes pairMT.
-Qed.
-
-(* This is the remainder of Peterfalvi (10.11). *)
-Lemma FTtypeII_prime_facts M U W W1 W2 (defW : W1 \x W2 = W) (maxM : M \in 'M) :
- of_typeP M U defW -> FTtype M == 2 ->
- let H := M`_\F%G in let HU := M^`(1)%G in
- let calS := seqIndD HU M H 1 in let tau := FT_Dade0 maxM in
- let p := #|W2| in let q := #|W1| in
- [/\ p.-abelem H, (#|H| = p ^ q)%N & coherent calS M^# tau].
-Proof.
-move=> MtypeP Mtype2 H HU calS tau p q.
-have Mnot5: FTtype M != 5 by rewrite (eqP Mtype2).
-have [_ cUU _ _ _] := compl_of_typeII maxM MtypeP Mtype2.
-have [q_pr p_pr]: prime q /\ prime p := FTtypeP_primes maxM MtypeP.
-have:= typeII_IV_core maxM MtypeP Mnot5; rewrite Mtype2 -/p -/q => [[_ oH]].
-have [] := Ptype_Fcore_kernel_exists maxM MtypeP Mnot5.
-have [_ _] := Ptype_Fcore_factor_facts maxM MtypeP Mnot5.
-rewrite -/H; set H0 := Ptype_Fcore_kernel _; set Hbar := (H / H0)%G.
-rewrite def_Ptype_factor_prime // -/p -/q => oHbar chiefHbar _.
-have trivH0: H0 :=: 1%g.
- have [/maxgroupp/andP[/andP[sH0H _] nH0M] /andP[sHM _]] := andP chiefHbar.
- apply: card1_trivg; rewrite -(setIidPr sH0H) -divg_index.
- by rewrite -card_quotient ?(subset_trans sHM) // oHbar -oH divnn cardG_gt0.
-have abelHbar: p.-abelem Hbar.
- have pHbar: p.-group Hbar by rewrite /pgroup oHbar pnat_exp pnat_id.
- by rewrite -is_abelem_pgroup // (sol_chief_abelem _ chiefHbar) ?mmax_sol.
-rewrite /= trivH0 -(isog_abelem (quotient1_isog _)) in abelHbar.
-have:= Ptype_core_coherence maxM MtypeP Mnot5; rewrite trivH0.
-set C := _ MtypeP; have sCU: C \subset U by rewrite [C]unlock subsetIl.
-by rewrite (derG1P (abelianS sCU cUU)) [(1 <*> 1)%G]join1G.
-Qed.
-
-End Ten.
diff --git a/mathcomp/odd_order/PFsection11.v b/mathcomp/odd_order/PFsection11.v
deleted file mode 100644
index 3635618..0000000
--- a/mathcomp/odd_order/PFsection11.v
+++ /dev/null
@@ -1,1203 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime ssralg poly finset center.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action finalg zmodp.
-From mathcomp
-Require Import gfunctor gproduct cyclic commutator gseries nilpotent pgroup.
-From mathcomp
-Require Import sylow hall abelian maximal frobenius.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation mxabelem vector.
-From mathcomp
-Require Import BGsection1 BGsection3 BGsection7 BGsection15 BGsection16.
-From mathcomp
-Require Import ssrnum ssrint algC classfun character inertia vcharacter.
-From mathcomp
-Require Import PFsection1 PFsection2 PFsection3 PFsection4 PFsection5.
-From mathcomp
-Require Import PFsection6 PFsection7 PFsection8 PFsection9 PFsection10.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 11: Maximal subgroups of Types *)
-(* III and IV. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory FinRing.Theory Num.Theory.
-
-Section Eleven.
-
-(* This is Peterfalvi (11.1). *)
-Lemma lbound_expn_odd_prime p q :
- odd p -> odd q -> prime p -> prime q -> p != q -> 4 * q ^ 2 + 1 < p ^ q.
-Proof.
-move=> odd_p odd_q pr_p pr_q p_neq_q.
-have{pr_p pr_q} [pgt2 qgt2] : 2 < p /\ 2 < q by rewrite !odd_prime_gt2.
-have [qlt5 | qge5 {odd_q qgt2 p_neq_q}] := ltnP q 5.
- have /eqP q3: q == 3 by rewrite eqn_leq qgt2 andbT -ltnS -(odd_ltn 5).
- apply: leq_trans (_ : 5 ^ q <= p ^ q); first by rewrite q3.
- by rewrite leq_exp2r // odd_geq // ltn_neqAle pgt2 eq_sym -q3 p_neq_q.
-apply: leq_trans (_ : 3 ^ q <= p ^ q); last by rewrite -(subnKC qge5) leq_exp2r.
-elim: q qge5 => // q IHq; rewrite ltnS leq_eqVlt => /predU1P[<- // | qge5].
-rewrite (expnS 3); apply: leq_trans {IHq}(leq_mul (leqnn 3) (IHq qge5)).
-rewrite -!addnS mulnDr leq_add // mulnCA leq_mul // !(mul1n, mulSnr).
-by rewrite -addn1 sqrnD muln1 -(subnKC qge5) !leq_add ?leq_mul.
-Qed.
-
-Local Open Scope ring_scope.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Implicit Types H K L N P Q R S T U V W : {group gT}.
-
-Variables M U W W1 W2 : {group gT}.
-Hypotheses (maxM : M \in 'M) (defW : W1 \x W2 = W) (MtypeP : of_typeP M U defW).
-Hypothesis notMtype2 : FTtype M != 2.
-
-Let notMtype5 : FTtype M != 5. Proof. exact: FTtype5_exclusion. Qed.
-Let notMtype1 : FTtype M != 1%N. Proof. exact: FTtypeP_neq1 MtypeP. Qed.
-Let Mtype34 : FTtype M \in pred2 3 4.
-Proof.
-by have:= FTtype_range M; rewrite -mem_iota !inE !orbA orbC 3?[_ == _](negPf _).
-Qed.
-Let Mtype_gt2 : (FTtype M > 2)%N. Proof. by case/pred2P: Mtype34 => ->. Qed.
-
-Local Notation H0 := (Ptype_Fcore_kernel MtypeP).
-Local Notation "` 'H0'" := (gval H0) (at level 0, only parsing) : group_scope.
-Local Notation "` 'M'" := (gval M) (at level 0, only parsing) : group_scope.
-Local Notation "` 'U'" := (gval U) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W'" := (gval W) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W1'" := (gval W1) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W2'" := (gval W2) (at level 0, only parsing) : group_scope.
-Local Notation H := `M`_\F%G.
-Local Notation "` 'H'" := `M`_\F (at level 0) : group_scope.
-Local Notation HU := M^`(1)%G.
-Local Notation "` 'HU'" := `M^`(1)%g (at level 0) : group_scope.
-Local Notation U' := U^`(1)%G.
-Local Notation "` 'U''" := `U^`(1)%g (at level 0) : group_scope.
-Local Notation C := 'C_U(`H)%G.
-Local Notation "` 'C'" := 'C_`U(`H) (at level 0) : group_scope.
-Local Notation HC := (`H <*> `C)%G.
-Local Notation "` 'HC'" := (`H <*> `C) (at level 0) : group_scope.
-Local Notation H0C := (`H0 <*> `C)%G.
-Local Notation "` 'H0C'" := (`H0 <*> `C) (at level 0) : group_scope.
-Local Notation Hbar := (`H / `H0)%g.
-
-Local Notation S_ := (seqIndD HU M HU).
-Local Notation tau := (FT_Dade0 maxM).
-Local Notation R := (FTtypeP_coh_base maxM MtypeP).
-Local Notation V := (cyclicTIset defW).
-
-Let Mtype24 := compl_of_typeII_IV maxM MtypeP notMtype5.
-
-Let defMs : M`_\s = HU. Proof. exact: FTcore_type_gt2. Qed.
-Let defA1 : 'A1(M) = HU^#. Proof. by rewrite /= -defMs. Qed.
-Let defA : 'A(M) = HU^#. Proof. by rewrite FTsupp_eq1. Qed.
-Let sHU_A0 : HU^# \subset 'A0(M). Proof. by rewrite -defA FTsupp_sub0. Qed.
-
-Let calS := seqIndD HU M M`_\s 1.
-Let scohM : subcoherent calS tau R. Proof. exact: FTtypeP_subcoherent. Qed.
-Let scoh1 : subcoherent (S_ 1) tau R.
-Proof. by rewrite -{2}(group_inj defMs). Qed.
-
-Let p := #|W2|.
-Let pr_p : prime p. Proof. by have [] := FTtypeP_primes maxM MtypeP. Qed.
-Let ntW2 : W2 :!=: 1%g. Proof. by rewrite -cardG_gt1 prime_gt1. Qed.
-Let cycW2 : cyclic W2. Proof. exact: prime_cyclic. Qed.
-Let def_p : pdiv #|Hbar| = p. Proof. exact: typeIII_IV_core_prime. Qed.
-
-Let q := #|W1|.
-Let pr_q : prime q. Proof. by have [] := FTtypeP_primes maxM MtypeP. Qed.
-Let ntW1 : W1 :!=: 1%g. Proof. by rewrite -cardG_gt1 prime_gt1. Qed.
-Let cycW1 : cyclic W1. Proof. exact: prime_cyclic. Qed.
-
-Let defM : HU ><| W1 = M. Proof. by have [[]] := MtypeP. Qed.
-Let defHU : H ><| U = HU. Proof. by have [_ []] := MtypeP. Qed.
-
-Let nsHUM : HU <| M. Proof. exact: gFnormal. Qed.
-Let sHUM : HU \subset M. Proof. exact: gFsub. Qed.
-Let sHHU : H \subset HU. Proof. by have /mulG_sub[] := sdprodW defHU. Qed.
-Let sUHU : U \subset HU. Proof. by have /mulG_sub[] := sdprodW defHU. Qed.
-Let sUM : U \subset M. Proof. exact: subset_trans sUHU sHUM. Qed.
-
-Let coHUq : coprime #|HU| q.
-Proof. by rewrite (coprime_sdprod_Hall_r defM); have [[]] := MtypeP. Qed.
-Let coUq : coprime #|U| q. Proof. exact: coprimeSg coHUq. Qed.
-
-Let neq_pq : p != q.
-Proof.
-apply: contraTneq coHUq => <-; rewrite coprime_sym prime_coprime ?cardSg //.
-by rewrite -(typeP_cent_compl MtypeP) subsetIl.
-Qed.
-
-Let solHU : solvable HU. Proof. exact: solvableS sHUM (mmax_sol maxM). Qed.
-Let solH : solvable H. Proof. exact: solvableS sHHU solHU. Qed.
-
-Let ltM''HU : M^`(2)%g \proper HU.
-Proof. by rewrite (sol_der1_proper solHU) // -defMs FTcore_neq1. Qed.
-
-Let frobMtilde : [Frobenius M / M^`(2) = (HU / M^`(2)) ><| (W1 / M^`(2))].
-Proof.
-have [[_ _ _ _] _ _ [_ _ _ sW2M'' prHUW1 ] _] := MtypeP.
-by rewrite Frobenius_coprime_quotient ?gFnormal //; split=> // _ /prHUW1->.
-Qed.
-
-Let defHC : H \x C = HC.
-Proof.
-by have [defHC _ _ _] := typeP_context MtypeP; rewrite /= (dprodWY defHC).
-Qed.
-
-Let nC_UW1 : U <*> W1 \subset 'N(C).
-Proof.
-have /sdprodP[_ _ nHUW1 _] := Ptype_Fcore_sdprod MtypeP.
-by rewrite normsI ?norms_cent // join_subG normG; have [_ []] := MtypeP.
-Qed.
-
-Let nsCM : C <| M.
-Proof.
-rewrite /normal subIset ?sUM //= -{1}(sdprodW (Ptype_Fcore_sdprod MtypeP)).
-by rewrite mulG_subG cents_norm // centsC subsetIr.
-Qed.
-
-Let nsCU : C <| U. Proof. exact: normalS (subsetIl _ _) sUM nsCM. Qed.
-Let nsHC_M : HC <| M. Proof. by rewrite normalY ?gFnormal. Qed.
-Let sHC_HU : HC \subset HU. Proof. by rewrite join_subG sHHU subIset ?sUHU. Qed.
-Let nsHC_HU : HC <| HU. Proof. exact: normalS nsHC_M. Qed.
-
-Let chiefH0 : chief_factor M H0 H.
-Proof. by have [] := Ptype_Fcore_kernel_exists maxM MtypeP notMtype5. Qed.
-
-Let minHbar : minnormal Hbar (M / H0).
-Proof. exact: chief_factor_minnormal. Qed.
-
-Let abelHbar : p.-abelem Hbar.
-Proof.
-have solHbar : solvable (H / H0) by rewrite quotient_sol.
-have [_ _] := minnormal_solvable minHbar (subxx _) solHbar.
-by rewrite /is_abelem def_Ptype_factor_prime.
-Qed.
-
-Let sH0H : H0 \subset H.
-Proof. by have/andP[/maxgroupp/andP[/proper_sub]]:= chiefH0. Qed.
-
-Let nH0M: M \subset 'N(H0).
-Proof. by have /andP[/maxgroupp/andP[]] := chiefH0. Qed.
-
-Let nsH0H : H0 <| H.
-Proof. by rewrite /normal sH0H gFsub_trans. Qed.
-
-Let nsH0C_M : H0C <| M.
-Proof. by rewrite normalY // /normal ?(subset_trans sH0H) ?gFsub. Qed.
-
-Let defH0C : H0 \x C = H0C.
-Proof.
-have /dprodP[_ _ cHC tiHC] := defHC.
-by rewrite dprodEY ?(centsS sH0H) //; apply/trivgP; rewrite -tiHC setSI.
-Qed.
-
-(* Group-theoretic consequences of the coherence and non-coherence theorems *)
-(* of Sections 5, 9 and 10 for maximal subgroups of type III and IV. *)
-
-(* This is Peterfalvi (11.3). *)
-Lemma FTtype34_noncoherence : ~ coherent (S_ H0C) M^# tau.
-Proof.
-move=> cohH0C; suff: coherent (S_ 1) M^# tau by apply: FTtype345_noncoherence.
-have /mulG_sub[_ sW1M] := sdprodW defM.
-have [nsHHU _ _ nHU tiHU] := sdprod_context defHU.
-have sHM: H \subset M := gFsub _ _.
-have [sCM sH0C_M]: C \subset M /\ H0C \subset M by rewrite !normal_sub.
-have nH0_C := subset_trans sCM nH0M.
-have sH0C_HC: H0C \subset HC by apply: genS (setSU _ _).
-have defF: HC :=: 'F(M) by have [/dprodWY] := typeP_context MtypeP.
-have{defF} nilHC: nilpotent (HC / 1) by rewrite defF quotient_nil ?Fitting_nil.
-have /bounded_seqIndD_coherence-bounded_coh1 := scoh1.
-apply: bounded_coh1 nilHC cohH0C _; rewrite ?sub1G ?normal1 //.
-have[_ _ /= oHbar] := Ptype_Fcore_factor_facts maxM MtypeP notMtype5.
-rewrite -(index_sdprod defM) -divgS // -(dprod_card defHC) -(dprod_card defH0C).
-rewrite divnMr ?cardG_gt0 // divg_normal // oHbar def_p -/q.
-by rewrite lbound_expn_odd_prime ?mFT_odd.
-Qed.
-
-(* This is Peterfalvi (11.4). *)
-Lemma bounded_proper_coherent H1 :
- H1 <| M -> H1 \proper HU -> coherent (S_ H1) M^# tau ->
- (#|HU : H1| <= 2 * q * #|U : C| + 1)%N.
-Proof.
-move=> nsH1_M psH1_M' cohH1; have [nsHHU _ _ _ _] := sdprod_context defHU.
-suffices: #|HU : H1|%:R - 1 <= 2%:R * #|M : HC|%:R * sqrtC #|HC : HC|%:R :> algC.
- rewrite indexgg sqrtC1 mulr1 -leC_nat natrD -ler_subl_addr -mulnA natrM.
- congr (_ <= _ * _%:R); apply/eqP; rewrite -(eqn_pmul2l (cardG_gt0 HC)).
- rewrite Lagrange ?normal_sub // mulnCA -(dprod_card defHC) -mulnA mulnC.
- by rewrite Lagrange ?subsetIl // (sdprod_card defHU) (sdprod_card defM).
-apply/negP/(coherent_seqIndD_bound _ _ scoh1 _ _ _ FTtype34_noncoherence) => //.
-suffices /center_idP->: abelian (HC / H0C) by rewrite genS ?setSU.
-suffices /isog_abelian<-: Hbar \isog HC / H0C by apply: abelem_abelian abelHbar.
-by rewrite /= [`H0C]joingC quotient_sdprodr_isog ?(dprodWsdC defHC).
-Qed.
-
-(* This is Peterfalvi (11.5). *)
-Lemma FTtype34_der2 : M^`(2)%g = HC.
-Proof.
-have [defFM [_ not_cHU] _ _] := typeP_context MtypeP.
-have [_ sW1M _ _ tiHU_W1] := sdprod_context defM.
-have{defFM} sM''_HC: M^`(2)%g \subset HC.
- by rewrite -defHC defFM; have [_ _ []] := MtypeP.
-have scohM'': subcoherent (S_ M^`(2)) tau R.
- exact/(subset_subcoherent scoh1)/seqInd_conjC_subset1.
-have cohM'': coherent (S_ M^`(2)) M^# tau.
- apply: uniform_degree_coherence scohM'' _.
- apply: all_pred1_constant #|M : HU|%:R _ _; rewrite all_map.
- apply/allP=> _ /seqIndP[s /setDP[kerM'' _] ->] /=; rewrite inE in kerM''.
- by rewrite cfInd1 ?gFsub // lin_char1 ?mulr1 ?lin_irr_der1.
-have ubHC: (#|HC : M^`(2)| < 2 * q + 1)%N.
- rewrite -(ltn_pmul2r (indexg_gt0 U C)) mulnDl mul1n.
- apply: leq_ltn_trans (_ : 2 * q * #|U : C| + 1 < _)%N; last first.
- by rewrite ltn_add2l indexg_gt1 subsetIidl not_cHU //; have [] := Mtype24.
- have {1}->: #|U : C| = #|HU : HC| by apply: index_sdprodr (subsetIl _ _).
- by rewrite mulnC (Lagrange_index sHC_HU) // bounded_proper_coherent ?gFnormal.
-have regHC_W1: semiregular (HC / M^`(2)) (W1 / M^`(2)).
- by apply: semiregularS (Frobenius_reg_ker frobMtilde); rewrite quotientS.
-suffices /dvdnP[k Dk]: 2 * q %| #|HC : M^`(2)|.-1.
- apply: contraTeq ubHC; rewrite -leqNgt eqEsubset sM''_HC -indexg_gt1 addn1.
- by rewrite -[#|_:_|]prednK // {}Dk !ltnS muln_gt0 => /andP[/leq_pmull->].
-rewrite Gauss_dvd; last by rewrite coprime2n mFT_odd.
-rewrite dvdn2 -subn1 odd_sub // addbT negbK subn1.
-rewrite -card_quotient; last by rewrite (subset_trans sHC_HU) // (der_norm 1).
-have Dq: q = #|W1 / M^`(2)|%g.
- apply/card_isog/quotient_isog; first by rewrite (subset_trans sW1M) ?gFnorm.
- by apply/trivgP; rewrite -tiHU_W1 setSI // (der_sub 1).
-rewrite quotient_odd ?mFT_odd //= Dq regular_norm_dvd_pred ?quotient_norms //.
-by rewrite (subset_trans sW1M) ?normal_norm.
-Qed.
-Local Notation defM'' := FTtype34_der2.
-
-(* This is Peterfalvi (11.6). *)
-Lemma FTtype34_facts (H' := H^`(1)%g):
- [/\ p.-group H, U \subset 'C(H0), H0 :=: H' & C :=: U'].
-Proof.
-have nilH: nilpotent H := Fcore_nil M.
-have /sdprod_context[/andP[_ nHM] sUW1M _ _ _] := Ptype_Fcore_sdprod MtypeP.
-have coH_UW1: coprime #|H| #|U <*> W1| := Ptype_Fcore_coprime MtypeP.
-have [[_ mulHU _ tiHU] [nHU isomHU]] := (sdprodP defHU, sdprod_isom defHU).
-have{sUW1M} cH0U: U \subset 'C(H0).
- have frobUW1 := Ptype_compl_Frobenius maxM MtypeP notMtype5.
- have nH0_UW1 := subset_trans sUW1M nH0M; have [_ nH0W1] := joing_subP nH0_UW1.
- have [coH0_UW1 solH0] := (coprimeSg sH0H coH_UW1, solvableS sH0H solH).
- have [_ -> //] := Frobenius_Wielandt_fixpoint frobUW1 nH0_UW1 coH0_UW1 solH0.
- have ->: 'C_H0(W1) = H0 :&: 'C_H(W1) by rewrite setIA (setIidPl sH0H).
- have nH0C: 'C_H(W1) \subset 'N(H0) by rewrite subIset // normal_norm.
- rewrite cardMg_TI // -LagrangeMl -card_quotient {nH0C}//.
- rewrite coprime_quotient_cent ?(coprimeSg sHHU) //=.
- have [_ -> _] := Ptype_Fcore_factor_facts maxM MtypeP notMtype5.
- by rewrite (typeP_cent_core_compl MtypeP) def_p.
-have{isomHU} defC: C :=: U'.
- have [injHquo defHUb] := isomP isomHU.
- apply: (injm_morphim_inj injHquo); rewrite ?subsetIl ?morphim_der ?der_sub //.
- rewrite defHUb morphim_restrm -quotientE setIA setIid -quotientMidl /=.
- by rewrite (dprodW defHC) -defM'' -quotient_der // -mulHU mul_subG ?normG.
-have{coH_UW1} defH0: H0 :=: H'.
- pose Hhat := (H / H')%g; pose Uhat := (U / H')%g; pose HUhat := (HU / H')%g.
- have nH'H: H \subset 'N(H') by apply: gFnorm.
- have nH'U: U \subset 'N(H') by apply: gFnorm_trans.
- apply/eqP; rewrite eqEsubset andbC.
- rewrite der1_min ?(abelem_abelian abelHbar) ?normal_norm //=.
- rewrite -quotient_sub1 /= -/H'; last exact: subset_trans sH0H nH'H.
- suffices <-: 'C_Hhat(Uhat) = 1%g.
- by rewrite subsetI quotientS //= quotient_cents // centsC.
- suffices: ~~ ('C_Hhat(Uhat)^`(1)%g \proper 'C_Hhat(Uhat)).
- exact: contraNeq (sol_der1_proper (quotient_sol _ solH) (subsetIl Hhat _)).
- have {2}<-: HUhat^`(1)%g :&: 'C_Hhat(Uhat) = 'C_Hhat(Uhat).
- rewrite -quotient_der ?[HU^`(1)%g]defM''; last by rewrite -mulHU mul_subG.
- by rewrite (setIidPr _) ?subIset // quotientS ?joing_subl.
- suffices defHUhat: 'C_Hhat(Uhat) \x ([~: Hhat, Uhat] <*> Uhat) = HUhat.
- rewrite -(dprod_modl (der_dprod 1 defHUhat)) ?der_sub //= -/Hhat.
- rewrite [rhs in _ \x rhs](trivgP _) ?dprodg1 ?properxx //= -/Hhat.
- by have [_ _ _ <-] := dprodP defHUhat; rewrite setIC setIS ?der_sub.
- have coHUhat: coprime #|Hhat| #|Uhat|.
- by rewrite coprime_morph ?(coprimegS _ coH_UW1) ?joing_subl.
- have defHhat: 'C_Hhat(Uhat) \x [~: Hhat, Uhat] = Hhat.
- by rewrite dprodC coprime_abelian_cent_dprod ?der_abelian ?quotient_norms.
- rewrite /HUhat -(sdprodWY defHU) quotientY //= -(dprodWY defHhat).
- have [_ _ cCRhat tiCRhat] := dprodP defHhat.
- rewrite dprodEY ?joingA //; first by rewrite join_subG cCRhat centsC subsetIr.
- apply/trivgP; rewrite /= joingC norm_joinEl ?commg_normr //= -/Hhat -/Uhat.
- rewrite -tiCRhat !(setIAC _ 'C(_)) setSI // subsetI subsetIl /=.
- by rewrite -group_modr ?commg_subl ?quotient_norms //= coprime_TIg ?mul1g.
-suffices{defC defH0}: p.-group H by [].
-pose R := 'O_p^'(H); have hallR: p^'.-Hall(H) R := nilpotent_pcore_Hall _ nilH.
-have defRHp: R \x 'O_p(H) = H by rewrite dprodC nilpotent_pcoreC.
-suffices R_1: R :=: 1%g by rewrite -defRHp R_1 dprod1g pcore_pgroup.
-have /subsetIP[sRH cUR]: R \subset 'C_H(U).
- have oH: #|H| = (p ^ q * #|'C_H(U)|)%N.
- by have:= typeII_IV_core maxM MtypeP notMtype5 => /=; rewrite ifN => // -[].
- apply/setIidPl/eqP; rewrite eqEcard subsetIl /= (card_Hall hallR) {}oH.
- rewrite (card_Hall (setI_normal_Hall _ hallR _)) ?subsetIl ?gFnormal //.
- rewrite partnM ?expn_gt0 ?cardG_gt0 //= part_p'nat ?mul1n ?pnatNK //.
- by rewrite pnat_exp ?pnat_id.
-suffices: ~~ (R^`(1)%g \proper R) by apply: contraNeq (sol_der1_proper solH _).
-have /setIidPr {2}<-: R \subset HU^`(1)%g.
- by rewrite [HU^`(1)%g]defM'' -(dprodWY defHC) sub_gen ?subsetU ?sRH.
-suffices defRHpU: R \x ('O_p(H) <*> U) = HU.
- rewrite -(dprod_modl (der_dprod 1 defRHpU)) ?der_sub //= -/R setIC.
- rewrite [rhs in _ \x rhs](trivgP _) ?dprodg1 ?properxx //= -/R.
- by have /dprodP[_ _ _ <-] := defRHpU; rewrite setIS ?der_sub.
-rewrite -(sdprodWY defHU) -[in RHS](dprodWY defRHp) -joingA.
-have [_ _ cRHp tiRHp] := dprodP defRHp.
-rewrite dprodEY //= -/R; first by rewrite join_subG cRHp centsC.
-rewrite joingC norm_joinEl 1?gFnorm_trans //.
-by rewrite -(setIidPl sRH) -setIA -group_modr ?gFsub // tiHU mul1g.
-Qed.
-
-Let frobUW1bar : [Frobenius U <*> W1 / C = (U / C) ><| (W1 / C)].
-Proof.
-have frobUW1: [Frobenius U <*> W1 = U ><| W1].
- exact: Ptype_compl_Frobenius MtypeP notMtype5.
-have [defUW1 ntU _ _ _] := Frobenius_context frobUW1.
-have [[_ _ _ defC] regUW1] := (FTtype34_facts, Frobenius_reg_ker frobUW1).
-rewrite Frobenius_coprime_quotient // /normal ?subIset ?joing_subl //.
-by split=> [|x /regUW1->]; rewrite ?sub1G //= defC (sol_der1_proper solHU).
-Qed.
-
-(* This is Peterfalvi (11.7). *)
-(* We have recast the linear algebra arguments in the original text in pure- *)
-(* group-theoretic terms: the overhead of the abelem_rV correspondence is not *)
-(* justifiable here, as the Ssreflect linear algebra library lacks specific *)
-(* support for bilinear forms: we use D y z := [~ coset Q y, coset Q z] as *)
-(* our "linear form". D is antisymmetric as D z y = (D y z)^-1, so we only *)
-(* show that D is "linear" in z, that is, that D y is a group morphism with *)
-(* domain H whose kernel contains H0, when y \in H, and we do not bother to *)
-(* factor D to obtain a form over Hbar = H / H0. *)
-(* We further rework the argument to support this change in perspective: *)
-(* - We remove any reference to linear algebra in the "Galois" (9.7b) case, *)
-(* where U acts irreducibly on Hbar: we revert to the proof of the *)
-(* original Odd Order paper, using the fact that H / Q is extraspecial. *)
-(* - In the "non-Galois" (9.7a) case, we use the W1-conjugation class of a *)
-(* generator of H1 as an explicit basis of Hbar, indexed by W1, and we *)
-(* use the elements xbar_ w = coset H0 (x_ w) of this basis instead of *)
-(* arbitrary y in H_i, as the same argument then justifies extending *)
-(* commutativity to all of Hbar. *)
-(* - We construct phi as the morphism mapping ubar in Ubar to the n such *)
-(* that the action of ubar on H1 is exponentiation by n. We derive a *)
-(* morphism phi_ w ubar for the action of Ubar on H1 ^ w, for w in W1, by *)
-(* composign with the action QV of W1 on Ubar by inverse conjugation. *)
-(* - We exchange the two alternatives in the (9.7a) case; most of proof is *)
-(* thus by contradiction with the C_U(Hbar) != u assertion in (9.6), *)
-(* first establishing case 9.7a (as 9.7b contradicts q odd), then that D *)
-(* is nontrivial for some x_ w1 and x_ w2 (as (H / Q)' = H0 / Q != 1), *)
-(* whence (phi_ w1 u)(phi_ w2 u) = 1, whence (phi u)^-1 = phi u and *)
-(* phi = 1, i.e., Ubar centralises Wbar. *)
-(* Note finally that we simply construct U as a maximal subgroup of H0 normal *)
-(* in H, as the nilpotence of H / Q implies that H0 / Q lies in its center. *)
-Lemma FTtype34_Fcore_kernel_trivial :
- [/\ p.-abelem H, #|H| = (p ^ q)%N & `H0 = 1%g].
-Proof.
-have [[_ _ nHU tiHU] [pH cH0U defH' _]] := (sdprodP defHU, FTtype34_facts).
-have [/mulG_sub[_ sW1M] nH0H] := (sdprodW defM, normal_norm nsH0H).
-have nHW1: W1 \subset 'N(H) := subset_trans sW1M (gFnorm _ M).
-have nUW1: W1 \subset 'N(U) by have [_ []] := MtypeP.
-pose bar := coset_morphism H0; pose Hbar := (H / H0)%g; pose Ubar := (U / H0)%g.
-have [Cbar_neqU _ /= oHbar] := Ptype_Fcore_factor_facts maxM MtypeP notMtype5.
-rewrite -/Hbar def_p // -/q in oHbar.
-have [nH0U nH0W1] := (subset_trans sUM nH0M, subset_trans sW1M nH0M).
-suffices H0_1 : `H0 = 1%g.
- have isoHbar: H \isog H / H0 by rewrite H0_1 quotient1_isog.
- by rewrite (isog_abelem isoHbar) (card_isog isoHbar).
-apply: contraNeq Cbar_neqU => ntH0; rewrite [Ptype_Fcompl_kernel _]unlock.
-suffices: Hbar \subset 'C(Ubar).
- by rewrite (sameP eqP setIidPl) sub_astabQ nH0U centsC.
-have pH0 := pgroupS sH0H pH; have{ntH0} [_ _ [k oH0]] := pgroup_pdiv pH0 ntH0.
-have{k oH0} [Q maxQ nsQH]: exists2 Q : {group gT}, maximal Q H0 & Q <| H.
- have [Q [sQH0 nsQH oQ]] := normal_pgroup pH nsH0H (leq_pred _).
- exists Q => //; apply: p_index_maximal => //.
- by rewrite -divgS // oQ oH0 pfactorK //= expnS mulnK ?expn_gt0 ?cardG_gt0.
-have nsQH0: Q <| H0 := p_maximal_normal (pgroupS sH0H pH) maxQ.
-have [[sQH0 nQH0] nQH] := (andP nsQH0, normal_norm nsQH).
-have nQU: U \subset 'N(Q) by rewrite cents_norm ?(centsS sQH0).
-pose hat := coset_morphism Q; pose Hhat := (H / Q)%g; pose H0hat := (H0 / Q)%g.
-have{maxQ} oH0hat: #|H0hat| = p by rewrite card_quotient ?(p_maximal_index pH0).
-have defHhat': Hhat^`(1)%g = H0hat by rewrite -quotient_der -?defH'.
-have ntH0hat: H0hat != 1%g by rewrite -cardG_gt1 oH0hat prime_gt1.
-have pHhat: p.-group Hhat by apply: quotient_pgroup.
-have nsH0Hhat: H0hat <| Hhat by apply: quotient_normal.
-have sH0hatZ: H0hat \subset 'Z(Hhat).
- by rewrite prime_meetG ?oH0hat // meet_center_nil ?(pgroup_nil pHhat).
-have{pHhat} gal'M: ~~ typeP_Galois MtypeP.
- have sZHhat: 'Z(Hhat) \subset Hhat := center_sub _.
- have nsH0hatZ: H0hat <| 'Z(Hhat) := normalS sH0hatZ sZHhat nsH0Hhat.
- have [f injf im_f] := third_isom sQH0 nsQH nsH0H.
- have fHhat: f @* (Hhat / H0hat) = Hbar by rewrite im_f.
- apply: contra (odd (logn p #|Hhat|)) _ _; last first.
- rewrite -(divnK (cardSg (quotientS Q sH0H))) divg_normal // oH0hat.
- by rewrite -(card_injm injf) // fHhat oHbar -expnSr pfactorK //= mFT_odd.
- rewrite /typeP_Galois acts_irrQ // => /mingroupP[_ minUHbar].
- suffices /(card_extraspecial pHhat)[n _ ->]: extraspecial Hhat.
- by rewrite pfactorK //= odd_double.
- have abelH: p.-abelem (Hhat / H0hat)%g by rewrite -(injm_abelem injf) ?fHhat.
- suffices{abelH} defZHhat: 'Z(Hhat) = H0hat.
- do 2?split; rewrite defZHhat ?oH0hat //.
- apply/eqP; rewrite eqEsubset (Phi_min pHhat) ?normal_norm //=.
- by rewrite (Phi_joing pHhat) defHhat' joing_subl.
- apply: contraNeq ntH0hat; rewrite eqEsubset sH0hatZ andbT => not_esHhat.
- rewrite -defHhat'; apply/eqP/derG1P/center_idP/(quotient_inj nsH0hatZ)=> //.
- apply: (injm_morphim_inj injf); rewrite ?quotientS //= fHhat -/Hhat -/H0hat.
- rewrite minUHbar //= -/Hbar -?fHhat 1?morphim_injm_eq1 ?morphimS // -subG1.
- rewrite quotient_sub1 ?(normal_norm nsH0hatZ) // not_esHhat -['Z(_)]cosetpreK.
- rewrite im_f ?sub_cosetpre_quo // quotient_norms ?norm_quotient_pre //.
- by rewrite gFnorm_trans ?quotient_norms.
-have [H1 []] := typeP_Galois_Pn maxM notMtype5 gal'M.
-rewrite def_p => oH1 nH1Ubar _ /bigdprodWY-defHbar _.
-have /cyclicP[xbar defH1]: cyclic H1 by rewrite prime_cyclic ?oH1.
-have H1xbar: xbar \in H1 by rewrite defH1 cycle_id.
-have sH1_Hbar: H1 \subset Hbar.
- by rewrite -[Hbar]defHbar (bigD1 1%g) ?group1 ?conjsg1 ?joing_subl.
-have{sH1_Hbar} Hxbar: xbar \in Hbar := subsetP sH1_Hbar xbar H1xbar.
-have /morphimP[x nH0x Hx /= Dxbar] := Hxbar.
-have{oH1} oxbar: #[xbar] = p by rewrite orderE -defH1.
-have memH0: {in H &, forall y z, [~ y, z] \in H0}.
- by rewrite defH'; apply: mem_commg.
-have [_ /centsP-cHH0hat] := subsetIP sH0hatZ; move/subsetP in nQH.
-pose D y z := [~ hat z, hat y].
-have D_H0_1 y z: y \in H -> z \in H0 -> D y z = 1%g.
- by move=> Hy H0z; apply/eqP/commgP/cHH0hat; apply: mem_quotient.
-have H0_D: {in H &, forall y z, D y z \in H0hat}.
- by move=> y z Hy Hz; rewrite -defHhat' mem_commg ?mem_quotient.
-have Dsym y z: (D y z)^-1%g = D z y by rewrite invg_comm.
-have Dmul y: y \in H -> {in H &, {morph D y: z t / z * t}}%g.
- move=> Hy z t Hz Ht; rewrite {1}/D morphM ?nQH // commMgR; congr (_ * _)%g.
- by rewrite -{2}morphR ?nQH // -/(D t _) D_H0_1 ?memH0 // mulg1.
-pose Dm y Hy : {morphism H >-> coset_of Q} := Morphism (Dmul y Hy).
-have{D_H0_1} kerDmH0 y Hy: H0 \subset 'ker (Dm y Hy).
- by rewrite subsetI sH0H; apply/subsetP=> z H0z; rewrite !inE /= D_H0_1.
-pose x_ w := (x ^ w)%g; pose xbar_ w := (xbar ^ bar w)%g.
-move/subsetP in nHW1; move/subsetP in nHU.
-have Hx_ w: w \in W1 -> (x_ w \in H) * {in U, forall u, x_ w ^ u \in H}%g.
- by move/nHW1=> nHw; split=> [|u /nHU-nHu]; rewrite !memJ_norm.
-have Dx: {in H &, forall y z, {in W1, forall w, D (x_ w) y = 1} -> D y z = 1}%g.
- move=> y z Hy Hz Dxy1; apply/(kerP (Dm y Hy) Hz); apply: subsetP z Hz.
- rewrite -(quotientSGK nH0H) ?kerDmH0 // -defHbar gen_subG.
- apply/bigcupsP=> _ /morphimP[w nH0w W1w ->] /=.
- rewrite defH1 Dxbar -quotient_cycle -?quotientJ ?quotientS // -cycleJ.
- by rewrite cycle_subG !inE /= Hx_ //= -Dsym eq_invg1 Dxy1.
-pose ntrivD := [exists w in [predX W1 & W1], #[D (x_ w.1) (x_ w.2)] == p].
-have{ntrivD Dx} /exists_inP[[w1 w2] /andP/=[Ww1 Ww2] /eqP-oDx12]: ntrivD.
- apply: contraR ntH0hat => Dx_1; rewrite -defHhat' -subG1 gen_subG.
- apply/subsetP=> _ /imset2P[_ _ /morphimP[y ? Hy ->] /morphimP[z ? Hz ->] ->].
- apply/set1P/Dx=> // w2 Ww2; rewrite Dx ?Hx_ // => w1 Ww1.
- have abelH0hat: p.-abelem H0hat by apply: prime_abelem.
- apply: contraNeq Dx_1 => /(abelem_order_p abelH0hat)oDx12.
- by apply/exists_inP; exists (w1, w2); rewrite ?inE ?Ww1 // oDx12 ?H0_D ?Hx_.
-have /subsetP-nUW1bar: (W1 / H0)%g \subset 'N(Ubar) := quotient_norms H0 nUW1.
-move/subsetP in nH0H; move/subsetP in nH0W1.
-pose n (phi : {morphism Ubar >-> {unit 'F_p}}) ubar : nat := val (phi ubar).
-have [phi Dphi]: {phi | {in Ubar, forall ub, xbar ^ ub =xbar ^+ n phi ub}}%g.
- pose xbar_Autm := invm (injm_Zp_unitm xbar).
- have /restrmP[phi [Dphi _ _ _]]: Ubar \subset 'dom (xbar_Autm \o conj_aut H1).
- by rewrite -sub_morphim_pre //= im_Zp_unitm -defH1 Aut_conj_aut.
- rewrite /n pdiv_id // -oxbar; exists phi => ubar /(subsetP nH1Ubar)Uubar.
- transitivity (Zp_unitm (phi ubar) xbar); last by rewrite autE /= -?defH1.
- by rewrite Dphi invmK ?im_Zp_unitm -?defH1 ?Aut_aut ?norm_conj_autE.
-pose QV ubar w := (ubar ^ (bar w)^-1)%g.
-have UbarQV: {in Ubar & W1, forall ubar w, QV ubar w \in Ubar}.
- by move=> ub w Uub W1w; rewrite /= memJ_norm ?groupV ?nUW1bar ?mem_quotient.
-pose phi_ w ub := phi (QV ub w); pose nphi_ w ub := n phi (QV ub w).
-have xbarJ: {in W1 & Ubar, forall w ub, xbar_ w ^ ub = xbar_ w ^+ nphi_ w ub}%g.
- by move=> w ubar * /=; rewrite -conjgM conjgCV conjgM Dphi ?UbarQV // conjXg.
-have{oDx12} phi_w12 ubar: ubar \in Ubar -> (phi_ w1 ubar * phi_ w2 ubar = 1)%g.
- pose n_u := nphi_ ^~ ubar => Uubar; have [u nH0u Uu Dubar] := morphimP Uubar.
- suffices: n_u w1 * n_u w2 == 1 %[mod #[D (x_ w1) (x_ w2)]].
- by apply: contraTeq; rewrite oDx12 -!val_Fp_nat // natrM !natr_Zp.
- have DXn: {in H & W1, forall y w, D y (x_ w) ^+ n_u w = D y (x_ w ^ u)}%g.
- move=> y w Hy W1w; set z := x_ w; have [Hz /(_ u Uu) Hzu] := Hx_ w W1w.
- rewrite -(morphX (Dm y Hy)) //; apply/rcoset_kerP; rewrite ?groupX //.
- have /subsetP: H0 :* z ^ u \subset 'ker (Dm y Hy) :* z ^ u by rewrite mulSg.
- apply; apply/rcoset_kercosetP; rewrite ?groupX ?nH0H //.
- by rewrite morphX ?morphJ ?(nH0W1 w) // ?nH0H //= -Dubar -Dxbar xbarJ.
- rewrite -eq_expg_mod_order -{1}Dsym expgM expgVn ?(DXn, Dsym) ?Hx_ //.
- rewrite /D -!morphR ?nQH ?Hx_ // -conjRg (conjg_fixP _) //.
- by apply/commgP/esym/(centsP cH0U); rewrite ?memH0 ?Hx_.
-pose wbar := bar (w1 * w2 ^-1)%g; pose W1bar := (W1 / H0)%g.
-have W1wbar: wbar \in W1bar by rewrite mem_quotient ?groupM ?groupV.
-have{phi_w12} phiJ: {in Ubar, forall ubar, phi (ubar ^ wbar) = (phi ubar)^-1}%g.
- move=> ubar Uubar; apply/esym/eqP; rewrite eq_invg_mul.
- rewrite [wbar]morphM ?morphV ?nH0W1 ?groupV // -{1}[ubar](conjgK (bar w1)).
- by rewrite conjgM phi_w12 // memJ_norm ?nUW1bar ?mem_quotient.
-have coW1bar2: coprime #|W1bar| 2 by rewrite coprimen2 quotient_odd ?mFT_odd.
-have coUbar2: coprime #|Ubar| 2 by rewrite coprimen2 quotient_odd ?mFT_odd.
-have{wbar phiJ W1wbar} phiV: {in Ubar, forall ubar, phi ubar = (phi ubar)^-1}%g.
- move=> ubar Uubar; rewrite /= -phiJ // -(expgK coW1bar2 W1wbar) -expgM mul2n.
- elim: (expg_invn _ _) => [|k IHk]; first by rewrite conjg1.
- by do 2!rewrite expgSr conjgM phiJ ?memJ_norm ?nUW1bar ?groupX // ?invgK.
-rewrite -[Hbar]defHbar gen_subG defH1; apply/bigcupsP=> _ /morphimP[w _ Ww ->].
-rewrite -cycleJ cycle_subG -/(xbar_ _); apply/centP=> ubar Uubar; apply/commgP.
-apply/conjg_fixP; rewrite xbarJ // /nphi_ -[QV _ w](expgK coUbar2) ?UbarQV //.
-by rewrite /n !morphX ?groupX 1?expgS 1?{1}phiV ?UbarQV // mulVg expg1n.
-Qed.
-
-Let defU' : C :=: U'. Proof. by have [] := FTtype34_facts. Qed.
-Let H0_1 : H0 :=: 1%g. Proof. by have [] := FTtype34_Fcore_kernel_trivial. Qed.
-
-Lemma Ptype_Fcompl_kernel_cent : Ptype_Fcompl_kernel MtypeP :=: C.
-Proof.
-rewrite [Ptype_Fcompl_kernel MtypeP]unlock /= (group_inj H0_1).
-by rewrite astabQ -morphpreIim -injm_cent ?injmK ?ker_coset ?norms1.
-Qed.
-Local Notation defC := Ptype_Fcompl_kernel_cent.
-
-(* Character theory proper. *)
-
-Let pddM := FT_prDade_hyp maxM MtypeP.
-Let ptiWM : primeTI_hypothesis M HU defW := FT_primeTI_hyp MtypeP.
-Let ctiWG : cyclicTI_hypothesis G defW := pddM.
-Let ctiWM : cyclicTI_hypothesis M defW := prime_cycTIhyp ptiWM.
-
-Local Notation sigma := (cyclicTIiso ctiWG).
-Local Notation w_ i j := (cyclicTIirr defW i j).
-Local Notation eta_ i j := (sigma (w_ i j)).
-Local Notation mu_ := (primeTIred ptiWM).
-Local Notation Idelta := (primeTI_Isign ptiWM).
-Local Notation delta_ j := (primeTIsign ptiWM j).
-Local Notation d := (FTtype345_TIirr_degree MtypeP).
-Local Notation n := (FTtype345_ratio MtypeP).
-Local Notation delta := (FTtype345_TIsign MtypeP).
-
-Implicit Types zeta xi lambda : 'CF(M).
-
-Let u := #|U / C|%g.
-Let mu2_ i j := primeTIirr ptiWM i j.
-Let etaW := map sigma (irr W).
-Let eq_proj_eta (alpha gamma : 'CF(G)) := orthogonal (alpha - gamma) etaW.
-Let eta_col j := \sum_i eta_ i j.
-Let bridge0 zeta := mu_ 0 - zeta.
-
-Let proj_col_eta j0 i j : '[eta_col j0, eta_ i j] = (j == j0)%:R.
-Proof.
-rewrite cfdot_suml (bigD1 i) //= cfdot_cycTIiso eqxx eq_sym.
-by rewrite big1 ?addr0 // => k /negPf-i'k; rewrite cfdot_cycTIiso i'k.
-Qed.
-
-Let nirrW1 : #|Iirr W1| = q. Proof. by rewrite card_Iirr_cyclic. Qed.
-Let NirrW1 : Nirr W1 = q. Proof. by rewrite -nirrW1 card_ord. Qed.
-
-Let nirrW2 : #|Iirr W2| = p. Proof. by rewrite card_Iirr_cyclic. Qed.
-Let NirrW2 : Nirr W2 = p. Proof. by rewrite -nirrW2 card_ord. Qed.
-
-Let calT := seqIndT HU M.
-Let S1 := S_ HC.
-Let S2 := seqIndD HU M HC C.
-
-Let sS10 : cfConjC_subset S1 calS.
-Proof. by apply: seqInd_conjC_subset1; rewrite /= ?defMs. Qed.
-
-Let sS20 : cfConjC_subset S2 calS.
-Proof. by apply: seqInd_conjC_subset1; rewrite /= ?defMs. Qed.
-
-Let scohS1 : subcoherent S1 tau R. Proof. exact: subset_subcoherent sS10. Qed.
-Let scohS2 : subcoherent S2 tau R. Proof. exact: subset_subcoherent sS20. Qed.
-
-Let S1_1 : {in S1, forall zeta, zeta 1%g = q%:R}.
-Proof.
-move=> _ /seqIndP[s /setDP[kerM'' _] ->]; rewrite !inE -defM'' in kerM''.
-by rewrite cfInd1 ?gFsub // -(index_sdprod defM) lin_char1 ?mulr1 ?lin_irr_der1.
-Qed.
-
-Let cohS1 : coherent S1 M^# tau.
-Proof.
-apply: uniform_degree_coherence scohS1 _.
-by apply/(@all_pred1_constant _ q%:R)/allP=> _ /=/mapP[zeta /S1_1<- ->].
-Qed.
-
-Let irrS1 : {subset S1 <= irr M}.
-Proof.
-move=> _ /seqIndP[s /setDP[kerHC kerHU] ->]; rewrite !inE in kerHC kerHU.
-rewrite -(quo_IirrK _ kerHC) // mod_IirrE // cfIndMod // cfMod_irr //.
-have /irr_induced_Frobenius_ker := FrobeniusWker frobMtilde; rewrite defM''.
-by apply; rewrite quo_Iirr_eq0 // -subGcfker.
-Qed.
-
-Let o1S1 : orthonormal S1.
-Proof. exact: sub_orthonormal (seqInd_uniq _ _) (irr_orthonormal _). Qed.
-
-Let cfdotS1 : {in S1 &, forall zeta xi, '[zeta, xi] = (zeta == xi)%:R}.
-Proof. by case/orthonormalP: o1S1. Qed.
-
-Let omu2S1 i j : {in S1, forall zeta, '[mu2_ i j, zeta] = 0}.
-Proof.
-move=> zeta S1zeta; have [s _ Dzeta] := seqIndP S1zeta.
-rewrite Dzeta -cfdot_Res_l cfRes_prTIirr cfdot_irr mulrb ifN_eq //.
-apply: contraNneq (prTIred_not_irr ptiWM j) => Ds.
-by rewrite -cfInd_prTIres Ds -Dzeta irrS1.
-Qed.
-
-Let Tmu j : mu_ j \in calT. Proof. by rewrite -cfInd_prTIres mem_seqIndT. Qed.
-
-Let omuS1 j : {in S1, forall zeta, '[mu_ j, zeta] = 0}.
-Proof.
-by move=> zeta S1zeta /=; rewrite cfdot_suml big1 // => i _; apply: omu2S1.
-Qed.
-
-Let Zbridge0 : {in S1, forall zeta, bridge0 zeta \in 'Z[irr M, HU^#]}.
-Proof.
-have mu0_1: mu_ 0 1%g = q%:R by rewrite prTIred_1 prTIirr0_1 mulr1.
-move=> zeta S1zeta; rewrite /= zcharD1 !cfunE subr_eq0 mu0_1 S1_1 // eqxx.
-by rewrite rpredB ?(seqInd_vchar _ (Tmu 0)) ?(seqInd_vchar _ S1zeta).
-Qed.
-
-Let A0bridge0 : {in S1, forall zeta, bridge0 zeta \in 'CF(M, 'A0(M))}.
-Proof. by move=> zeta /Zbridge0/zchar_on/cfun_onS->. Qed.
-
-Let sS1S2' : {subset S1 <= [predC S2]}.
-Proof.
-by move=> _ /seqIndP[s /setDP[kHCs _] ->]; rewrite !inE mem_seqInd // inE kHCs.
-Qed.
-
-Let defS2: S2 = seqIndD HU M H H0C.
-Proof. by rewrite /S2 H0_1 -!joinGE join1G joinGC seqIndDY. Qed.
-
-Let cohS2: coherent S2 M^# tau.
-Proof.
-apply: subset_coherent (Ptype_core_coherence maxM MtypeP notMtype5).
-by rewrite defC defS2; apply: seqIndS; rewrite Iirr_kerDS ?genS ?setUS ?der_sub.
-Qed.
-
-Let Smu := [seq mu_ j | j in predC1 0].
-Let Sred := filter [predC irr M] (seqIndD HU M H H0).
-
-Let memSred : Sred =i Smu.
-Proof.
-have [szSred _ memSred _] := typeP_reducible_core_Ind maxM MtypeP notMtype5.
-have uSred: uniq Sred by apply: filter_uniq (seqInd_uniq _ _).
-suffices{uSred}: (size Smu <= size Sred)%N by case/leq_size_perm.
-by rewrite szSred def_p size_map -cardE cardC1 nirrW2.
-Qed.
-
-Let mu_1 j : j != 0 -> mu_ j 1%g = (q * u)%:R.
-Proof.
-move=> nzj; have Smuj: mu_ j \in Sred by rewrite memSred image_f.
-have [_ _ _ /(_ _ Smuj)[]] := typeP_reducible_core_Ind maxM MtypeP notMtype5.
-by rewrite defC.
-Qed.
-
-Let memS2red : [predD S2 & irr M] =i Smu.
-Proof.
-move=> xi; rewrite defS2 -memSred mem_filter; apply: andb_id2l => /= red_xi.
-apply/idP/idP=> [|Sxi]; first by apply: seqIndS; rewrite Iirr_kerDS ?joing_subl.
-have [_ _ _ /(_ xi)] := typeP_reducible_core_Ind maxM MtypeP notMtype5.
-by rewrite defC mem_filter /= red_xi; case.
-Qed.
-
-Let i1 : Iirr W1 := inord 1.
-Let nz_i1 : i1 != 0. Proof. by rewrite Iirr1_neq0. Qed.
-Let j1 : Iirr W2 := inord 1.
-Let nz_j1 : j1 != 0. Proof. by rewrite Iirr1_neq0. Qed.
-
-(* This is Peterfalvi (11.8). *)
-(* We have rearranged the argument somewhat: *)
-(* - Step (11.8.4) was out of sequence as it involves changing the definition *)
-(* of tau2, which requires showing that (11.8.2-3) are preserved by this *)
-(* change; since (11.8.4) does not use (11.8.2-3) we avoid this by proving *)
-(* (11.8.4) first. *)
-(* - The first part of step (11.8.3) is the last fact that needs to be proved *)
-(* for an arbitrary j != 0; (11.8.1, 5-6) can all use the same fixed j != 0 *)
-(* (we take j = 1), provided (11.8.3) is proved before (11.8.2), which it *)
-(* doe not use. *)
-(* - Steps (11.8.2) and (11.8.5) are really as combination, to provide an *)
-(* expression for tau (alpha i j) for an arbitrary i. We merge their proofs *)
-(* so we can use a fixed i for the whole combined step and hide some *)
-(* intermediate technical facts. *)
-(* - We also reorganise the contents of the superstep, proving most of *)
-(* (11.8.5) between the first and last two parts of (11.8.2); this *)
-(* simplifies the latter because a is then known to be even, so we can show *)
-(* directly that a is 0 or 2, and then that X = eta i j - eta i 0. *)
-Lemma FTtype34_not_ortho_cycTIiso zeta :
- zeta \in S1 -> ~~ eq_proj_eta (tau (bridge0 zeta)) (eta_col 0).
-Proof.
-move=> S1zeta; set psi := tau _; apply/negP=> proj_psi_eta.
-have irr_zeta: zeta \in irr M := irrS1 S1zeta.
-have Szeta: zeta \in S_ 1 by apply: seqInd_sub S1zeta.
-have Zzeta_S1: {in S1, forall xi, zeta - xi \in 'Z[S1, M^#]}.
- by move=> * /=; rewrite zcharD1E rpredB ?mem_zchar //= !cfunE !S1_1 ?subrr.
-have n1S1: {in S1, forall xi, '[xi] = 1} by move=> xi /irrS1/irrWnorm.
-have Z_S1: {in S1, forall xi, xi \in 'Z[S1]} by apply: mem_zchar.
-have [p_gt0 q_gt0 u_gt0]: [/\ p > 0, q > 0 & u > 0]%N by rewrite !cardG_gt0.
-have q_gt2: (q > 2)%N by rewrite odd_prime_gt2 ?mFT_odd.
-have mu2_1 i j: j != 0 -> mu2_ i j 1%g = d%:R.
- by have [/(_ i j)] := FTtype345_constants maxM MtypeP notMtype2.
-(* This is (11.8.1). *)
-have [Dd delta1 Dn]: [/\ d = u, delta = 1 & n = (size S1)%:R].
- have size_S1 : (size S1 * q = u - 1)%N.
- rewrite mulnC [q](index_sdprod defM).
- rewrite (size_irr_subseq_seqInd _ (subseq_refl _)) //.
- transitivity #|[set mod_Iirr t | t : Iirr (HU / HC) in predC1 0]|.
- apply/eq_card=> s; rewrite inE mem_seqInd // !inE subGcfker.
- apply/andP/imsetP=> [[nzs kHCs] | [t nzt ->]].
- by exists (quo_Iirr HC s); rewrite ?quo_IirrK // inE quo_Iirr_eq0.
- by rewrite mod_Iirr_eq0 // mod_IirrE // cfker_mod.
- rewrite card_imset; last exact: can_inj (mod_IirrK _).
- have isoUC: U / C \isog HU / HC by apply: quotient_sdprodr_isog.
- rewrite subn1 cardC1 card_Iirr_abelian -?(card_isog isoUC) //.
- by rewrite -(isog_abelian isoUC) defU' der_abelian.
- have Dd: d = u.
- apply/eqP; rewrite -(eqn_pmul2l q_gt0) -eqC_nat -(mu_1 nz_j1).
- by rewrite natrM prTIred_1 mu2_1.
- suffices delta1: delta = 1.
- by rewrite /n Dd delta1 -(@natrB _ _ 1) // -size_S1 natrM mulfK ?neq0CG.
- have: (delta == 1 %[mod q])%C.
- rewrite -(eqCmod_transl _ (prTIirr1_mod ptiWM 0 j1)) mu2_1 // -/q Dd.
- by rewrite /eqCmod -(@natrB _ u 1) // dvdC_nat -size_S1 dvdn_mull.
- rewrite -[1]subr0 [delta]signrE -/ptiWM eqCmodDl eqCmodN opprK.
- by rewrite eqCmod0_nat; case: (Idelta j1); first rewrite gtnNdvd.
-have deltaZ gamma: delta *: gamma = gamma by rewrite delta1 scale1r.
-have [tau1 coh_tau1] := cohS1; pose zeta1 := tau1 zeta.
-(* This is (11.8.4). *)
-without loss Dpsi: tau1 coh_tau1 @zeta1 / psi = eta_col 0 - zeta1.
- move=> IHtau1; have [[Itau1 Ztau1] Dtau1] := coh_tau1.
- have tau1_dirr: {in S1, forall xi, tau1 xi \in dirr G}.
- by move=> xi S1xi; rewrite /= dirrE Ztau1 ?Itau1 ?mem_zchar //= n1S1.
- pose chi : 'CF(G) := eta_col 0 - psi.
- have Dpsi: psi = eta_col 0 - chi by rewrite opprD opprK addNKr.
- have chi'zeta1: chi <> zeta1.
- by move=> Dchi; case: (IHtau1 tau1); rewrite -/zeta1 -?Dchi.
- have dirr_chi: chi \in dirr G.
- apply: dirr_norm1.
- rewrite rpredB ?rpred_sum // => [i _|]; first exact: cycTIiso_vchar.
- rewrite Dade_vchar // zchar_split A0bridge0 //.
- by rewrite rpredB ?char_vchar ?prTIred_char ?irrWchar.
- apply: (addrI q%:R); transitivity '[psi]; last first.
- rewrite Dade_isometry ?A0bridge0 // (cfnormBd (omuS1 _ _)) //.
- by rewrite cfnorm_prTIred n1S1.
- rewrite Dpsi [RHS]cfnormDd; last first.
- rewrite opprB cfdotC cfdot_sumr big1 ?conjC0 // => i _.
- by rewrite (orthoPl proj_psi_eta) ?map_f ?mem_irr.
- rewrite cfnormN -nirrW1 -sumr_const cfdot_sumr.
- by congr (_ + _); apply: eq_bigr => i _; rewrite proj_col_eta.
- have Dchi: {in S1, forall xi, xi != zeta -> chi = - tau1 xi}.
- move=> xi S1xi /negPf-zeta'xi; have irr_xi := irrS1 S1xi.
- suffices: '[zeta1 - tau1 xi, chi] = 1.
- by case/cfdot_add_dirr_eq1; rewrite ?rpredN ?tau1_dirr.
- rewrite /= cfdotBr cfdot_sumr big1 => [|i _]; last first.
- have oS1eta := coherent_ortho_cycTIiso MtypeP sS10 coh_tau1.
- by rewrite cfdotBl !oS1eta ?irrS1 ?subrr.
- rewrite -raddfB Dtau1 ?Zzeta_S1 // Dade_isometry ?A0bridge0 //; last first.
- exact: cfun_onS sHU_A0 (zcharD1_seqInd_on _ (Zzeta_S1 xi S1xi)).
- rewrite cfdotBr cfdotC cfdotBr 2?omuS1 // subrr conjC0 !sub0r opprK.
- by rewrite cfdotBl n1S1 // cfdotS1 // zeta'xi subr0.
- have S1zetaC: zeta^*%CF \in S1 by rewrite cfAut_seqInd.
- have Dchi_zetaC: chi = - tau1 zeta^*%CF.
- by rewrite -Dchi ?(seqInd_conjC_neq _ _ _ S1zeta) ?mFT_odd.
- suffices S1le2: (size S1 <= size [:: zeta; zeta^*%CF])%N.
- case: (IHtau1 (dual_iso tau1)); last by rewrite /= -Dchi_zetaC.
- exact: dual_coherence scohS1 coh_tau1 S1le2.
- rewrite uniq_leq_size ?seqInd_uniq // => xi S1xi.
- rewrite !inE -implyNb; apply/implyP=> zeta'xi; apply/eqP.
- apply: (Zisometry_inj Itau1); rewrite ?mem_zchar ?cfAut_seqInd //.
- by apply: oppr_inj; rewrite -Dchi.
-have [[Itau1 Ztau1] Dtau1] := coh_tau1.
-have tau1_dirr: {in S1, forall xi, tau1 xi \in dirr G}.
- by move=> xi S1xi; rewrite /= dirrE Ztau1 ?Itau1 ?mem_zchar //= n1S1.
-have oS1eta i j: {in S1, forall xi, '[tau1 xi, eta_ i j] = 0}.
- by move=> xi S1xi /=; rewrite (coherent_ortho_cycTIiso _ _ coh_tau1) ?irrS1.
-pose alpha_ := FTtype345_bridge MtypeP zeta.
-have A0alpha i j : j != 0 -> alpha_ i j \in 'CF(M, 'A0(M)).
- by move/supp_FTtype345_bridge->; rewrite ?S1_1.
-have alpha_S1 i j: {in S1, forall xi, '[alpha_ i j, xi] = n *- (xi == zeta)}.
- move=> xi S1xi; rewrite /= !cfdotBl !cfdotZl !omu2S1 // mulr0 subrr add0r.
- by rewrite cfdotS1 // eq_sym mulr_natr.
-pose beta_ i j := tau (alpha_ i j) - (eta_ i j - eta_ i 0) + n *: zeta1.
-pose beta := beta_ 0 j1.
-(* This is the first part of (11.8.3). *)
-have betaE i j: j != 0 -> beta_ i j = beta.
- move=> nz_j; transitivity (beta_ i j1); congr (_ + _); apply/eqP.
- rewrite eq_sym -subr_eq0 [rhs in _ + rhs]opprD addrACA -opprD subr_eq0.
- rewrite -linearB /= !opprB !addrA !subrK -!/(mu2_ i _).
- by rewrite [Dade pddM _]prDade_sub_TIirr ?mu2_1 //= deltaZ.
- rewrite -subr_eq0 !opprD addrACA -3!opprD opprK subr_eq0 addrACA addrA.
- rewrite -(prDade_sub2_TIirr pddM) -!/(mu2_ _ _) !deltaZ -linearB /=.
- by rewrite opprB addrA subrK !deltaZ opprD opprK addrACA addrA.
-pose j := j1. (* The remainder of the proof only uses j = 1. *)
-(* This is the second part of (11.8.3). *)
-have Rbeta: cfReal beta.
- rewrite /cfReal eq_sym -subr_eq0 rmorphD !rmorphB /= opprB 2!opprD opprB -/j.
- rewrite 2![(eta_ 0 _)^*%CF]cfAut_cycTIiso -!cycTIirr_aut !aut_Iirr0 -Dade_aut.
- set k := aut_Iirr conjC j; rewrite -(betaE 0 k) ?aut_Iirr_eq0 // addrACA.
- rewrite addrC addr_eq0 addrCA subrK opprD opprK Dn raddfZnat -!raddfB /= -Dn.
- apply/eqP; rewrite (cfConjC_Dade_coherent coh_tau1) ?mFT_odd // -raddfB.
- rewrite Dtau1 ?Zzeta_S1 ?cfAut_seqInd //= -linearZ scalerBr; congr (tau _).
- rewrite opprD !rmorphB !deltaZ /= -!prTIirr_aut !aut_Iirr0 addrACA subrr.
- by rewrite add0r opprK addrC Dn -raddfZnat.
-(* This is the consequence of Peterfalvi (11.8.2) and (11.8.5). *)
-have tau_alpha i: tau (alpha_ i j) = eta_ i j - eta_ i 0 - n *: zeta1.
- set phi := tau (alpha_ i j); pose sum_tau1 := \sum_(xi <- S1) tau1 xi.
- have A0alpha_j k: alpha_ k j \in 'CF(M, 'A0(M)) by apply: A0alpha.
- have Zphi: phi \in 'Z[irr G].
- by rewrite Dade_vchar // zchar_split vchar_FTtype345_bridge /=.
- have [Y S1_Y [X [Dphi oYX oXS1]]] := orthogonal_split (map tau1 S1) phi.
- (* This is the first part of 11.8.2 *)
- have [a Za defY]: exists2 a, a \in Cint & Y = a *: sum_tau1 - n *: zeta1.
- have [a_ Da defY] := orthonormal_span (map_orthonormal Itau1 o1S1) S1_Y.
- have{Da} Da: {in S1, forall xi, a_ (tau1 xi) = '[phi, tau1 xi]}.
- by move=> xi Sxi; rewrite Da Dphi cfdotDl (orthoPl oXS1) ?map_f ?addr0.
- exists (a_ (tau1 zeta) + n).
- by rewrite Dn rpredD ?rpred_nat // Da // Cint_cfdot_vchar ?Ztau1 ?Z_S1.
- rewrite defY big_map scaler_sumr !(bigD1_seq _ S1zeta) ?seqInd_uniq //=.
- rewrite addrAC scalerDl addrK !(big_seq_cond (predC1 _)) /=; congr (_ + _).
- apply: eq_bigr => xi /andP[S1xi zeta'xi]; congr (_ *: _); rewrite !Da //.
- apply: canRL (addNKr _) _; rewrite addrC -opprB -!raddfB Dtau1 ?Zzeta_S1//=.
- rewrite Dade_isometry //; last first.
- exact: cfun_onS (zcharD1_seqInd_on _ (Zzeta_S1 _ S1xi)).
- by rewrite cfdotBr !alpha_S1 // !mulrb eqxx ifN_eq // !(addr0, opprK).
- have psi_phi: '[psi, phi] = -1 + n. (* This is part of (11.8.5). *)
- rewrite cfdotC Dade_isometry ?A0bridge0 //.
- rewrite cfdotBr !cfdotBl deltaZ !cfdotZl n1S1 // mulr1.
- rewrite !cfdot_prTIirr_red (negPf nz_j1) eqxx !omu2S1 //= cfdotC omuS1 //.
- by rewrite conjC0 mulr0 opprB !subr0 add0r rmorphD rmorphN Dn !rmorph_nat.
- have{psi_phi} col0_beta: '[eta_col 0, beta] = a. (* Also part of (11.8.5). *)
- apply/(addIr (-1 + n))/(canRL (addNKr _)).
- rewrite addrCA addrA addrACA -{}psi_phi Dpsi cfdotBl; congr (_ + _).
- rewrite -(betaE i j) // cfdotDr !cfdotBr -/phi cfdotZr -!addrA.
- apply/(canLR (addNKr _)); rewrite addNr !cfdot_suml.
- rewrite big1 ?add0r ?opprK => [|k _]; last first.
- by rewrite cfdot_cycTIiso andbC eq_sym (negPf nz_j1).
- rewrite addrCA big1 ?mulr0 ?add0r => [|k _]; last first.
- by rewrite cfdotC oS1eta ?conjC0.
- rewrite addrC (bigD1 i) // cfnorm_cycTIiso /= addKr big1 // => k i'k.
- by rewrite cfdot_cycTIiso (negPf i'k).
- rewrite cfdotC Dphi cfdotDl (orthoPl oXS1) ?map_f // addr0.
- rewrite defY cfdotBl scaler_sumr cfproj_sum_orthonormal //.
- rewrite cfdotZl Itau1 ?mem_zchar ?n1S1 // mulr1 rmorphB opprD opprK.
- by rewrite Dn rmorph_nat conj_Cint.
- have a_even: (2 %| a)%C. (* Third internal part of (11.8.5). *)
- have Zbeta: beta \in 'Z[irr G].
- rewrite -{1}(betaE i j) // rpredD ?rpredB ?Zphi ?cycTIiso_vchar //.
- by rewrite Dn rpredZnat // Ztau1 ?mem_zchar.
- rewrite -col0_beta cfdot_real_vchar_even ?mFT_odd //; first 1 last.
- split; first by apply/rpred_sum=> k _; apply: cycTIiso_vchar.
- apply/eqP; rewrite [RHS](reindex_inj (can_inj (@conjC_IirrK _ _))) /=.
- rewrite rmorph_sum; apply/eq_bigr=> k _ /=.
- by rewrite cfAut_cycTIiso -cycTIirr_aut aut_Iirr0.
- have eta00: eta_ 0 0 = 1 by rewrite cycTIirr00 cycTIiso1.
- rewrite orbC cfdotDl 2!cfdotBl cfdotZl -eta00 oS1eta // mulr0 addr0.
- rewrite opprB addrC 2!{1}cfdot_cycTIiso (negPf nz_j1) subr0 /= eta00.
- rewrite Dade_reciprocity // => [|x _ y _]; last by rewrite !cfun1E !inE.
- rewrite cfRes_cfun1 !cfdotBl deltaZ !cfdotZl -!/(mu2_ 0 _).
- rewrite -(prTIirr00 ptiWM) !cfdot_prTIirr cfdotC omu2S1 // conjC0 mulr0.
- by rewrite (negPf nz_j1) add0r subr0 subrr rpred0.
- have nY: '[Y] = n * a * (a - 2%:R) + n ^+ 2. (* Resuming step (11.8.2). *)
- rewrite defY cfnormD cfnormN !cfnormZ cfdotNr cfdotZr.
- rewrite cfnorm_map_orthonormal // -Dn Itau1 ?mem_zchar ?n1S1 // mulr1.
- rewrite scaler_sumr cfproj_sum_orthonormal // rmorphN addrAC.
- rewrite Dn rmorphM !Cint_normK ?rpred_nat // !rmorph_nat conj_Cint // -Dn.
- by rewrite -mulr2n mulrC mulrA -mulr_natr mulNr -mulrBr.
- have{a_even} Da: (a == 0) || (a == 2%:R). (* Second part of (11.8.2). *)
- suffices (b := a - 1): b ^+ 2 == 1.
- by rewrite -!(can_eq (subrK 1) a) add0r addrK orbC -eqf_sqr expr1n.
- have S1gt0: (0 < size S1)%N by case: (S1) S1zeta.
- have: n * b ^+ 2 <= n *+ 3.
- have: 2%:R + n <= n *+ 3 by rewrite addrC ler_add2l ler_muln2r Dn ler1n.
- apply: ler_trans; rewrite sqrrB1 -mulr_natr -mulrBr mulrDr mulrA mulr1.
- rewrite ler_add2r -(ler_add2r (n ^+ 2 + '[X])) !addrA -nY -cfnormDd //.
- by rewrite -Dphi norm_FTtype345_bridge ?S1_1 // ler_addl cfnorm_ge0.
- have Zb: b \in Cint by rewrite rpredB ?rpred1 ?Za.
- have nz_b: b != 0 by rewrite subr_eq0 (memPn _ a a_even) ?(dvdC_nat 2 1).
- rewrite eqr_le sqr_Cint_ge1 {nz_b}//= andbT -Cint_normK // Dn -mulrnA.
- have /CnatP[m ->] := Cnat_norm_Cint Zb; rewrite -natrX -natrM leC_nat.
- by rewrite leq_pmul2l // lern1 -ltnS (ltn_sqr m 2) (leq_sqr m 1).
- have{nY Da} defX: X = eta_ i j - eta_ i 0. (* Last part of (11.8.2). *)
- have{nY Da} /eqP-nY: '[Y] == n ^+ 2.
- by rewrite -subr_eq0 nY addrK -mulrA !mulf_eq0 !subr_eq0 Da orbT.
- have coh_zeta_phi := FTtype345_bridge_coherence _ _ Szeta _ coh_tau1.
- have:= Dphi; rewrite addrC => /coh_zeta_phi->; rewrite ?S1_1 ?deltaZ //.
- rewrite defY scaler_sumr big_seq rpredB ?rpred_sum // => [xi Sxi|].
- by rewrite rpredZ_Cint ?mem_zchar ?map_f.
- by rewrite Dn rpredZnat ?mem_zchar ?map_f.
- have{col0_beta} a0: a = 0. (* This is the conclusion of (11.8.5). *)
- rewrite cfdot_suml big1 // in col0_beta => k _.
- rewrite -(betaE i j) // /beta_ -/phi Dphi -defX addrK defY subrK.
- rewrite cfdotZr cfdot_sumr big1_seq ?mulr0 // => xi S1xi.
- by rewrite cfdotC oS1eta ?conjC0.
- by rewrite Dphi defY defX a0 ?inE ?eqxx // scale0r sub0r addrC.
-(* This is step (11.8.6). *)
-pose theta := mu_ j - d%:R *: zeta.
-have /andP/=[red_muj S2muj]: mu_ j \in [predD S2 & irr M].
- by rewrite memS2red image_f.
-have HUtheta: theta \in 'CF(M, HU^#).
- rewrite cfun_onD1 !cfunE mu_1 ?S1_1 // Dd mulrC natrM subrr eqxx.
- by rewrite rpredB ?rpredZ ?(seqInd_on _ S1zeta) ?(seqInd_on _ S2muj).
-have Dtheta: theta = mu_ 0 - zeta + \sum_i alpha_ i j.
- rewrite !sumrB -scaler_sumr delta1 scale1r.
- rewrite [X in _ = X]addrC -!addrA -/(mu_ 0); congr (_ + _).
- rewrite [X in _ = _ + X]addrC !addrA addNr add0r -opprD; congr (- _).
- rewrite sumr_const nirrW1 -scaler_nat scalerA mulrC.
- by rewrite divfK ?neq0CG // delta1 addrC scalerBl scale1r subrK.
-have tau_theta: tau theta = eta_col j - d%:R *: zeta1.
- pose psi1 i := eta_ i j1 - eta_ i 0 - n *: zeta1.
- have Dpsi1 i: tau (alpha_ i j) = psi1 i by apply: tau_alpha.
- rewrite Dtheta [tau _]raddfD raddf_sum (eq_bigr psi1) //= {Dpsi1}/psi1 -/psi.
- rewrite Dpsi !sumrB [X in X = _]addrC -!addrA; congr (_ + _).
- rewrite -opprB -opprD -opprB -/(eta_col 0) addrA addrK; congr (- _).
- rewrite sumr_const nirrW1 -scaler_nat scalerA mulrC.
- by rewrite divfK ?neq0CG // delta1 scalerBl scale1r subrK.
-have [tau2 coh_tau2] := cohS2.
-without loss tau2muj: tau2 coh_tau2 / tau2 (mu_ j) = eta_col j; last first.
- case: FTtype34_noncoherence; rewrite H0_1 -joinGE join1G.
- have uS12: uniq (S2 ++ S1).
- by rewrite cat_uniq ?seqInd_uniq ?andbT //=; apply/hasPn.
- have /perm_eq_coherent: perm_eq (S2 ++ S1) (S_ C); last apply.
- apply: uniq_perm_eq; rewrite ?seqInd_uniq // => xi; rewrite mem_cat.
- apply/idP/idP=> [/orP | /seqIndP[i /setDP[kCi k'HUi] ->]].
- by case; apply/seqIndS/Iirr_kerDS; rewrite ?joing_subr.
- by rewrite !mem_seqInd // inE orbC inE kCi k'HUi andbT orbN.
- move: tau_theta; rewrite -tau2muj // -raddfZnat.
- apply: (bridge_coherent scohM) sS20 coh_tau2 sS10 coh_tau1 sS1S2' _.
- by rewrite (cfun_onS _ HUtheta) ?setSD // rpredZnat ?Z_S1.
-move=> IHtau2; apply: (IHtau2 tau2 coh_tau2); have [IZtau2 Dtau2] := coh_tau2.
-have{IHtau2} /hasP[xi S2xi /=irr_xi]: has [mem irr M] S2.
- apply/hasPn=> redS2 {tau2 coh_tau2 IZtau2 Dtau2}.
- have muS2: {subset S2 <= Smu} by move=> xi S2xi; rewrite -memS2red !inE redS2.
- have [_ [tau2 tau2mu coh_tau2]] := uniform_prTIred_coherent pddM nz_j1.
- have S2uniform: {subset S2 <= uniform_prTIred_seq pddM j}.
- move=> _ /muS2/imageP[k nz_k ->]; apply: image_f.
- by rewrite !inE [_ != 0]nz_k /= !mu_1.
- apply: (IHtau2 tau2); first exact: subset_coherent_with coh_tau2.
- have [_ /(_ _ nz_j1) Ez _ _] := FTtype345_constants maxM MtypeP notMtype2.
- by have:= tau2mu j; rewrite Ez -/delta delta1 scale1r.
-suffices: '[tau2 (mu_ j), eta_col j] != 0.
- have:= FTtypeP_coherent_TIred sS20 coh_tau2 irr_xi S2xi S2muj.
- case=> _ -> [[-> ->] | [-> -> _] /eqP[]]; first by rewrite deltaZ.
- rewrite -[cyclicTIiso _]/sigma cfdot_sumr big1 ?mulr0 // => i _.
- rewrite cfdotZl proj_col_eta -(inj_eq irr_inj) conjC_IirrE eq_sym.
- by rewrite odd_eq_conj_irr1 ?mFT_odd // irr_eq1 (negPf nz_j1) mulr0.
-pose gamma := xi 1%g *: mu_ j - mu_ j 1%g *: xi.
-have: '[tau2 gamma, tau theta] != 0.
- have [Txi Tzeta] := (seqInd_subT S2xi, seqInd_subT S1zeta).
- have S2gamma: gamma \in 'Z[S2, HU^#] by apply: sub_seqInd_zchar.
- rewrite Dtau2 ?zcharD1_seqInd //; move/zchar_on in S2gamma.
- rewrite Dade_isometry ?(cfun_onS sHU_A0) // cfdotBr cfdotZr !cfdotBl !cfdotZl.
- rewrite cfnorm_prTIred omuS1 // (seqInd_ortho _ _ S2muj) ?(memPn red_muj) //.
- rewrite (seqInd_ortho _ Txi) ?(memPn (sS1S2' _)) // !(mulr0, subr0) mulf_eq0.
- by rewrite char1_eq0 ?irrWchar // -cfnorm_eq0 irrWnorm ?oner_eq0 ?neq0CG.
-apply: contraNneq => o_muj_etaj; rewrite {}tau_theta !{gamma}raddfB subr_eq0 /=.
-have /CnatP[xi1 ->]: xi 1%g \in Cnat by rewrite Cnat_char1 ?irrWchar.
-rewrite mu_1 // cfdotZr !cfdotBl !raddfZnat !cfdotZl {}o_muj_etaj cfdot_sumr.
-have /orthogonalP oS2_S1: orthogonal (map tau2 S2) (map tau1 S1).
- exact: (coherent_ortho scohM) sS20 coh_tau2 sS10 coh_tau1 sS1S2'.
-rewrite !oS2_S1 ?map_f // big1 ?(mulr0, subr0) // => k _.
-exact: (coherent_ortho_cycTIiso _ _ coh_tau2).
-Qed.
-
-(* This is Peterfalvi (11.9). *)
-(* Note that in the proof of part (a), the text improperly suggests using *)
-(* (5.3.b) to show then tau (zeta - zeta^alpha) is orthogonal to the eta i j. *)
-(* Since alpha might not be conjugation, this is not obvious. Indeed the best *)
-(* way to derive this is to use (5.5) together with the coherence of S(HC). *)
-(* In part (c) we start by reducing the proof to q <= p - 1; we also don't *)
-(* compute [tau (mu0 - zeta), tau2 lambda] = [chi, tau2 lambda] since this *)
-(* is not needed to prove than u = a: one only needs to show that the *)
-(* the left-hand side is an integer, which is in fact required to show that *)
-(* the right-hand is an integer. *)
-Lemma FTtype34_structure (eta0row := \sum_j eta_ 0 j) :
- [/\ (*a*) {in S1, forall zeta, eq_proj_eta (tau (bridge0 zeta)) eta0row},
- (*b*) (p < q)%N
- & (*c*) FTtype M == 3 /\ typeP_Galois MtypeP].
-Proof.
-have sum_etaW F: \sum_(eta <- etaW) F eta = \sum_i \sum_j F (eta_ i j).
- rewrite big_map big_tuple (reindex (dprod_Iirr defW)) /=.
- by rewrite pair_bigA; apply: eq_bigr => -[i j].
- by exists (inv_dprod_Iirr defW) => ij; rewrite ?dprod_IirrK ?inv_dprod_IirrK.
-have bridgeS1: {in S1, forall zeta, eq_proj_eta (tau (bridge0 zeta)) eta0row}.
- move=> zeta S1zeta; set phi := bridge0 zeta; have irr_zeta := irrS1 S1zeta.
- have [X etaX [chi [Dchi oXchi o_chi_eta]]] := orthogonal_split etaW (tau phi).
- have [Isigma Zsigma] := cycTI_Zisometry ctiWG.
- have{o_chi_eta} o_chi_eta i j: '[chi, eta_ i j] = 0.
- by rewrite (orthoPl o_chi_eta) ?map_f ?mem_irr.
- have o1etaW: orthonormal etaW by rewrite map_orthonormal ?irr_orthonormal.
- have [a Da defX] := orthonormal_span o1etaW etaX; pose a_ := a (eta_ _ _).
- have{Da} Da i j: a_ i j = '[tau phi, eta_ i j].
- by rewrite Dchi cfdotDl o_chi_eta addr0 /a_ Da.
- have Zphi: phi \in 'Z[irr M, HU^#] by apply: Zbridge0.
- have A0phi: phi \in 'CF(M, 'A0(M)) by apply: A0bridge0.
- have a00_1 : a_ 0 0 = 1.
- rewrite Da cycTIirr00 [sigma 1]cycTIiso1.
- rewrite Dade_reciprocity // => [|x _ y _]; last by rewrite !cfun1E !inE.
- rewrite rmorph1 /= -(prTIirr00 ptiWM) -/(mu2_ 0 0) cfdotC.
- by rewrite cfdotBr cfdot_prTIirr_red omu2S1 // subr0 rmorph1.
- have aut_phi nu: cfAut nu (tau phi) = tau phi + tau (zeta - cfAut nu zeta).
- rewrite -Dade_aut !rmorphB !raddfB /= !addrA subrK.
- by rewrite -prTIred_aut aut_Iirr0.
- have Za i j: a_ i j \in Cint.
- rewrite Da Cint_cfdot_vchar ?cycTIiso_vchar //.
- by rewrite Dade_vchar ?(zchar_onS sHU_A0).
- have [tau1 coh_tau1] := cohS1; have [_ Dtau1] := coh_tau1.
- have o_tau1_eta := coherent_ortho_cycTIiso MtypeP sS10 coh_tau1.
- have a_aut nu i j: a (cfAut nu (eta_ i j)) = a_ i j.
- symmetry; transitivity '[cfAut nu (tau phi), cfAut nu (eta_ i j)].
- by rewrite cfdot_aut_vchar ?cycTIiso_vchar // -Da aut_Cint.
- rewrite aut_phi cfAut_cycTIiso -cycTIirr_aut [a _]Da cfdotDl addrC.
- rewrite -Dtau1 ?zcharD1_seqInd ?seqInd_sub_aut_zchar // raddfB cfdotBl.
- by rewrite !o_tau1_eta ?cfAut_seqInd ?cfAut_irr // subr0 add0r.
- pose a10 := a_ i1 0; pose a01 := a_ 0 j1; pose a11 := a_ i1 j1.
- have Da10 i: i != 0 -> a_ i 0 = a10.
- case/(cfExp_prime_transitive pr_q nz_i1) => k co_k_wi1 Dwi.
- rewrite -(cforder_dprodl defW) -dprod_IirrEl in co_k_wi1.
- have [[nu eta10nu] _] := cycTIiso_aut_exists ctiWG co_k_wi1.
- by rewrite /a_ dprod_IirrEl Dwi rmorphX /= -dprod_IirrEl eta10nu a_aut.
- have Da01 j: j != 0 -> a_ 0 j = a01.
- case/(cfExp_prime_transitive pr_p nz_j1) => k co_k_wj1 Dwj.
- rewrite -(cforder_dprodr defW) -dprod_IirrEr in co_k_wj1.
- have [[nu eta01nu] _] := cycTIiso_aut_exists ctiWG co_k_wj1.
- by rewrite /a_ dprod_IirrEr Dwj rmorphX /= -dprod_IirrEr eta01nu a_aut.
- have DaB1 i j: a_ i j = a_ i 0 + a_ 0 j - a_ 0 0.
- apply: (canRL (addrK _)); rewrite !Da cycTIiso_cfdot_exchange // => x Vx.
- have /setDP[A0x A'x]: x \in 'A0(M) :\: 'A(M).
- by rewrite (FTsupp0_typeP maxM MtypeP) // mem_class_support.
- by rewrite Dade_id // (cfun_on0 (zchar_on Zphi)) // -defA.
- pose p1 : algC := p.-1%:R; pose q1 : algC := q.-1%:R.
- have normX: '[X] = 1 + q1 * a10 ^+ 2 + p1 * a01 ^+ 2 + p1 * q1 * a11 ^+ 2.
- transitivity (\sum_i \sum_j a_ i j ^+ 2).
- rewrite defX cfnorm_sum_orthonormal // sum_etaW.
- by apply/eq_bigr=> i _; apply/eq_bigr=> j _; rewrite Cint_normK ?Za.
- rewrite -addrA addrACA (bigD1 0) //= (bigD1 0) //= a00_1 expr1n.
- rewrite -natrM !mulr_natl mulrnA -mulrnDl.
- rewrite -nirrW1 -nirrW2 -!(cardC1 0) -!sumr_const.
- congr (1 + _ + _); first by apply: eq_bigr => j /Da01->.
- apply: eq_bigr => i /Da10-Dai0; rewrite (bigD1 0) //= Dai0; congr (_ + _).
- by apply: eq_bigr => j /Da01-Da0j; rewrite DaB1 Dai0 Da0j -DaB1.
- have normX_le_q: '[X] <= q%:R.
- rewrite -(ler_add2r '[chi]) -cfnormDd // -Dchi -ler_subl_addl.
- have ->: '[tau phi] - q%:R = 1.
- rewrite Dade_isometry ?A0bridge0 // cfnormBd; last by rewrite omuS1.
- by rewrite cfnorm_prTIred cfdotS1 // eqxx addrC addKr.
- suffices: '[chi] != 0.
- suffices /CnatP[nchi ->]: '[chi] \in Cnat by rewrite ler1n lt0n -eqC_nat.
- rewrite Cnat_cfnorm_vchar // -(canLR (addKr _) Dchi) defX addrC rpredB //.
- by rewrite Dade_vchar // (zchar_onS (FTsupp_sub0 M)) ?defA.
- rewrite big_map big_seq rpred_sum // => _ /(cycTIirrP defW)[i [j ->]].
- by rewrite rpredZ_Cint ?Za ?cycTIiso_vchar.
- pose theta := zeta - zeta^*%CF.
- have Ztheta: theta \in 'Z[S1, HU^#] by apply: seqInd_sub_aut_zchar.
- have: '[tau phi, tau theta] != 0.
- rewrite Dade_isometry //; last by rewrite (cfun_onS _ (zchar_on Ztheta)).
- rewrite cfdotBl !cfdotBr ?omuS1 ?cfAut_seqInd // subr0 add0r oppr_eq0.
- rewrite irrWnorm // (seqInd_conjC_ortho _ _ _ S1zeta) ?mFT_odd //.
- by rewrite subr0 oner_eq0.
- rewrite cfnorm_eq0 Dchi; apply: contraNneq => ->; rewrite addr0 defX.
- rewrite -Dtau1 ?zcharD1_seqInd //.
- rewrite cfdot_suml big_map big1_seq // => _ /(cycTIirrP defW)[i [j ->]].
- apply/eqP; rewrite cfdotC fmorph_eq0 cfdotZr raddfB cfdotBl.
- by rewrite !o_tau1_eta ?cfAut_seqInd ?cfAut_irr // subrr mulr0.
- have a2_ge0 i j: 0 <= a_ i j ^+ 2 by rewrite -realEsqr Creal_Cint.
- have a11_0: a11 = 0.
- have: ('[X] < (2 * q.-1)%:R).
- rewrite (ler_lt_trans normX_le_q) // ltC_nat -subn1 mulnBr ltn_subRL.
- by rewrite !mul2n -!addnn ltn_add2r odd_prime_gt2 ?mFT_odd.
- apply: contraTeq => nz_a11; rewrite ler_gtF // normX ler_paddl //.
- by rewrite !mulr_natl ?addr_ge0 ?ler01 ?mulrn_wge0 ?a2_ge0.
- rewrite -mulr_natl -natrM ?ler_pmul ?natr_ge0 ?sqr_Cint_ge1 ?Za //.
- by rewrite leC_nat leq_mul // -subn1 ltn_subRL odd_prime_gt2 ?mFT_odd.
- rewrite a11_0 expr0n /= mulr0 addr0 in normX.
- have a10_a01: a10 + a01 = 1.
- by apply/eqP; rewrite -subr_eq0 -a00_1 -DaB1 -/a11 a11_0.
- have{o_chi_eta} o_chi_eta: orthogonal chi etaW.
- by apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i [j ->]] ->].
- have a10_0: a10 = 0.
- apply: contraNeq (FTtype34_not_ortho_cycTIiso S1zeta) => nz_a10.
- have a01_0: a01 = 0.
- apply: contraTeq normX_le_q => nz_a01; rewrite normX ltr_geF //.
- rewrite ltr_spaddr 1?mulr_gt0 ?ltr0n -?subn1 ?subn_gt0 ?prime_gt1 //.
- by rewrite ltr_def sqrf_eq0 nz_a01 a2_ge0.
- rewrite -ler_subl_addl -(natrB _ (prime_gt0 pr_q)) subn1 -mulr_natl.
- by rewrite ler_wpmul2l ?ler0n // sqr_Cint_ge1 ?Za.
- suffices <-: X = eta_col 0 by rewrite Dchi /eq_proj_eta addrC addKr.
- rewrite defX sum_etaW exchange_big (bigD1 0) //= addrC.
- rewrite big1 ?add0r => [|j nz_j]; first apply: eq_bigr => i _; last first.
- rewrite (bigD1 0) // [a _]Da01 //= a01_0 scale0r add0r big1 // => i nz_i.
- by rewrite [a _]DaB1 Da10 // Da01 // a10_a01 a00_1 subrr scale0r.
- have [-> | nz_i] := eqVneq i 0; first by rewrite [a _]a00_1 scale1r.
- by rewrite [a _]Da10 // (canRL (addrK _) a10_a01) a01_0 subr0 scale1r.
- suffices <-: X = eta0row by rewrite Dchi /eq_proj_eta addrC addKr.
- rewrite defX sum_etaW (bigD1 0) //= addrC.
- rewrite big1 ?add0r => [|i nz_i]; first apply: eq_bigr => j _; last first.
- rewrite (bigD1 0) // [a _]Da10 //= a10_0 scale0r add0r big1 // => j nz_j.
- by rewrite [a _]DaB1 Da10 // Da01 // a10_a01 a00_1 subrr scale0r.
- have [-> | nz_j] := eqVneq j 0; first by rewrite [a _]a00_1 scale1r.
- by rewrite [a _]Da01 // (canRL (addKr _) a10_a01) a10_0 oppr0 add0r scale1r.
-have [zeta [irr_zeta Szeta zeta1]] := FTtypeP_ref_irr maxM MtypeP.
-have{zeta1} [S1zeta zeta1]: zeta \in S1 /\ zeta 1%g = q%:R.
- split=> //; have [k nz_k Dzeta] := seqIndC1P Szeta.
- rewrite Dzeta mem_seqInd // !inE subGcfker nz_k -defM'' lin_char_der1 //.
- rewrite -mulr_natl Dzeta cfInd1 //= -(index_sdprod defM) in zeta1.
- by apply/andP; rewrite irr_char -(mulfI _ zeta1) ?neq0CG.
-have{Szeta} ltpq: (p < q)%N.
- rewrite ltn_neqAle neq_pq leqNgt /=.
- apply: contra (FTtype34_not_ortho_cycTIiso S1zeta) => ltqp.
- case/(FTtype345_Dade_bridge0 _ MtypeP): Szeta => // chi [-> _ _ o_chi_eta].
- rewrite /eq_proj_eta addrC addKr (orthogonal_oppl chi).
- by apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i [j ->]] ->].
-suffices galM: typeP_Galois MtypeP.
- have [_ [_ _ _ [/= cycUbar _ _]]] := typeP_Galois_P maxM notMtype5 galM.
- have{cycUbar} cycUbar: cyclic (U / U') by rewrite -defU' -defC.
- have nilU: nilpotent U by have [_ []] := MtypeP.
- case/orP: Mtype34 => // /(compl_of_typeIV maxM MtypeP)[_ /negP[]].
- exact/cyclic_abelian/cyclic_nilpotent_quo_der1_cyclic.
-apply: contraLR ltpq => gal'M; rewrite -leqNgt (leq_trans _ (leq_pred _)) //.
-have [_ _ _] := typeP_nonGalois_characters maxM notMtype5 gal'M.
-case: (_ gal'M) => H1 /= [_ _ nH1U _ []]; set a := #|U : _| => a_gt1.
-rewrite def_p -/q -defU' -defS2 => a_dv_p1 cycUhat _.
-set irr_qa := [pred lambda in irr M | lambda 1%g == (q * a)%:R] => S2_qa.
-have{S2_qa}/hasP[lambda S2lambda /andP[irr_lambda /eqP-lambda1]]: has irr_qa S2.
- have [a2_dv_pu] := S2_qa; rewrite has_count; apply: leq_trans.
- rewrite -(@ltn_pmul2r (a ^ 2 * #|C|)); last first.
- by rewrite !muln_gt0 (ltnW a_gt1) cardG_gt0.
- by rewrite mul0n divnK // muln_gt0 cardG_gt0 -subn1 subn_gt0 prime_gt1.
-have{nH1U cycUhat} a_dv_u: a %| u.
- rewrite /u card_quotient ?normal_norm // indexgS // defU'.
- rewrite der1_min ?cyclic_abelian // normsI ?normG //.
- by rewrite (subset_trans nH1U) // astab_norm.
-pose j := j1; pose psi := mu_ j - (u %/ a)%:R *: lambda.
-have /andP/=[red_muj S2muj]: mu_ j \in [predD S2 & irr M].
- by rewrite memS2red image_f.
-have S2psi: psi \in 'Z[S2, M^#].
- rewrite zcharD1E rpredB ?rpredZnat ?mem_zchar //=.
- by rewrite !cfunE mu_1 // lambda1 -natrM mulnCA divnK ?subrr.
-pose phi := tau (mu_ 0 - zeta).
-have o_phi_psi: '[phi, tau psi] = 0.
- have Apsi: psi \in 'CF(M, 'A(M)) by rewrite defA (zcharD1_seqInd_on _ S2psi).
- have [Tzeta Tlambda] := (seqInd_subT S1zeta, seqInd_subT S2lambda).
- rewrite Dade_isometry ?A0bridge0 ?(cfun_onS (FTsupp_sub0 M)) //.
- rewrite cfdotBl !cfdotBr !cfdotZr cfdot_prTIred eq_sym (negPf nz_j1) add0r.
- rewrite !(seqInd_ortho _ Tzeta) ?Tmu ?(memPnC (sS1S2' S1zeta)) // add0r.
- rewrite (seqInd_ortho _ (Tmu 0)) ?(memPnC (prTIred_not_irr _ _)) // !mulr0.
- by rewrite subrr.
-have [tau2 coh_tau2] := cohS2; have [[_ Ztau2] Dtau2] := coh_tau2.
-have ua_1: (u %/ a)%:R * `|'[phi, tau2 lambda]| == 1.
- rewrite -normr_nat -normrM mulr_natl -!raddfMn -[_ *+ _](subrK (mu_ j)) /=.
- rewrite -opprB addrC raddfB cfdotBr -scaler_nat (Dtau2 _ S2psi) o_phi_psi.
- case: (FTtypeP_coherent_TIred _ coh_tau2 _ S2lambda S2muj) => // -[b k] -> _.
- rewrite -/(eta_col k) cfdotZr rmorph_sign subr0 normrMsign.
- rewrite -[phi](subrK eta0row) cfdotDl cfdot_sumr big1 => [|j' _]; last first.
- by rewrite (orthoPl (bridgeS1 _ _)) ?map_f ?mem_irr.
- rewrite add0r cfdotC norm_conjC cfdot_sumr (bigD1 k) //= proj_col_eta eqxx.
- by rewrite big1 ?addr0 ?normr1 // => i k'i; rewrite proj_col_eta (negPf k'i).
-have Du: u = a.
- apply/eqP; rewrite -[a]mul1n eqn_mul ?(ltnW a_gt1) // -eqC_nat.
- move: ua_1; rewrite Cnat_mul_eq1 ?rpred_nat //; first by case/andP.
- rewrite Cnat_norm_Cint ?Cint_cfdot_vchar //; last by rewrite Ztau2 ?mem_zchar.
- rewrite Dade_vchar // zchar_split A0bridge0 //.
- by rewrite rpredB ?char_vchar ?prTIred_char ?irrWchar.
-have lequ: (q <= u)%N.
- have u1_gt0: (0 < u.-1)%N by rewrite -subn1 subn_gt0 Du.
- rewrite (leq_trans _ (leq_pred u)) // dvdn_leq //.
- suffices ->: q = #|W1 / C|%g by apply: Frobenius_dvd_ker1 frobUW1bar.
- apply/card_isog/quotient_isog; first by have [] := joing_subP nC_UW1.
- by rewrite setIAC (coprime_TIg coUq) setI1g.
-by rewrite (leq_trans lequ) // Du dvdn_leq // -subn1 subn_gt0 prime_gt1.
-Qed.
-
-End Eleven.
diff --git a/mathcomp/odd_order/PFsection12.v b/mathcomp/odd_order/PFsection12.v
deleted file mode 100644
index f605c0f..0000000
--- a/mathcomp/odd_order/PFsection12.v
+++ /dev/null
@@ -1,1373 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime ssralg finset center.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action finalg zmodp.
-From mathcomp
-Require Import gfunctor gproduct cyclic commutator gseries nilpotent pgroup.
-From mathcomp
-Require Import sylow hall abelian maximal frobenius.
-From mathcomp
-Require Import matrix mxalgebra mxpoly mxrepresentation mxabelem vector.
-From mathcomp
-Require Import falgebra fieldext finfield.
-From mathcomp
-Require Import BGsection1 BGsection2 BGsection3 BGsection4 BGsection7.
-From mathcomp
-Require Import BGsection14 BGsection15 BGsection16.
-From mathcomp
-Require Import ssrnum ssrint algC cyclotomic algnum.
-From mathcomp
-Require Import classfun character inertia vcharacter.
-From mathcomp
-Require Import PFsection1 PFsection2 PFsection3 PFsection4 PFsection5.
-From mathcomp
-Require Import PFsection6 PFsection7 PFsection8 PFsection9 PFsection10.
-From mathcomp
-Require Import PFsection11.
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory FinRing.Theory Num.Theory.
-Local Open Scope ring_scope.
-
-Section PFTwelve.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Implicit Types (p q : nat) (x y z : gT).
-Implicit Types H K L M N P Q R S T U V W : {group gT}.
-
-Section Twelve2.
-
-(* Hypothesis 12.1 *)
-Variable L : {group gT}.
-
-Hypotheses (maxL : L \in 'M) (Ltype1 : FTtype L == 1%N).
-
-Local Notation "` 'L'" := (gval L) (at level 0, only parsing) : group_scope.
-Local Notation H := `L`_\F%G.
-Local Notation "` 'H'" := `L`_\F (at level 0) : group_scope.
-
-Let nsHL : H <| L. Proof. exact: gFnormal. Qed.
-Let calS := seqIndD H L H 1%G.
-Let tau := FT_Dade maxL.
-Let S_ (chi : 'CF(L)) := [set i in irr_constt chi].
-Let calX : {set Iirr L} := Iirr_kerD L H 1%g.
-Let calI := [seq 'chi_i | i in calX].
-
-(* This does not actually use the Ltype1 assumption. *)
-Lemma FTtype1_ref_irr : exists2 phi, phi \in calS & phi 1%g = #|L : H|%:R.
-Proof.
-have solH: solvable H := nilpotent_sol (Fcore_nil L).
-by apply: exists_linInd; rewrite ?normal1 // proper1G mmax_Fcore_neq1.
-Qed.
-
-Let mem_calI i : i \in calX -> 'chi_i \in calI.
-Proof. by move=> i_Iirr; apply/imageP; exists i. Qed.
-
-Lemma FTtype1_irrP i :
- reflect (exists2 chi, chi \in calS & i \in S_ chi) (i \in calX).
-Proof.
-have [sHL nHL] := andP nsHL; rewrite !inE sub1G andbT.
-apply/(iffP idP) => [kerH'i | [_ /seqIndC1P[t nz_t ->]]]; last first.
- by rewrite inE => /sub_cfker_constt_Ind_irr <-; rewrite ?subGcfker.
-have [t] := constt_cfRes_irr H i; rewrite -constt_Ind_Res => tLi.
-rewrite -(sub_cfker_constt_Ind_irr tLi) // in kerH'i.
-suffices: 'Ind 'chi_t \in calS by exists ('Ind 'chi_t); rewrite // inE.
-by rewrite mem_seqInd ?normal1 // !inE sub1G kerH'i.
-Qed.
-
-Lemma FTtype1_irr_partition :
- partition [set Si in [seq S_ chi | chi <- calS]] calX.
-Proof.
-apply/and3P; split; last 1 first.
-- rewrite inE; apply/mapP=> [[chi Schi /esym/setP S_0]].
- have /eqP[] := seqInd_neq0 nsHL Schi.
- rewrite [chi]cfun_sum_constt big1 // => i chi_i.
- by have:= S_0 i; rewrite inE chi_i inE.
-- apply/eqP/setP=> i; apply/bigcupP/FTtype1_irrP=> [[S_chi] | [chi Schi Si]].
- by rewrite inE => /mapP[chi Schi ->]; exists chi.
- by exists (S_ chi); rewrite // inE map_f.
-apply/trivIsetP=> S_chi1 S_chi2.
-rewrite !inE => /mapP[chi1 Schi1 ->] /mapP[chi2 Schi2 ->] {S_chi1 S_chi2}chi2'1.
-apply/pred0P=> i; rewrite /= !inE; apply/andP=> [[chi1_i chi2_i]].
-suffices: '['chi_i] == 0 by rewrite cfnorm_irr oner_eq0.
-rewrite (constt_ortho_char (seqInd_char Schi1) (seqInd_char Schi2)) //.
-by rewrite (seqInd_ortho _ Schi1 Schi2) // (contraNneq _ chi2'1) // => ->.
-Qed.
-
-(* This is Peterfalvi (12.2)(a), first part *)
-Lemma FTtype1_seqInd_facts chi :
- chi \in calS ->
- [/\ chi = \sum_(i in S_ chi) 'chi_i,
- constant [seq 'chi_i 1%g | i in S_ chi]
- & {in S_ chi, forall i, 'chi_i \in 'CF(L, 1%g |: 'A(L))}].
-Proof.
-move=> calS_chi; have [t nz_t Dchi] := seqIndC1P calS_chi.
-pose T := 'I_L['chi_t]%g.
-have sTL: T \subset L by apply: Inertia_sub.
-have sHT: H \subset T by apply/sub_Inertia/gFsub.
-have sHL: H \subset L by apply: normal_sub.
-have hallH: Hall T H := pHall_Hall (pHall_subl sHT sTL (Fcore_Hall L)).
-have [U [LtypeF _]] := FTtypeP _ maxL Ltype1.
-have [[_ _ sdHU] [U1 inertU1] _] := LtypeF.
-have defT: H ><| 'I_U['chi_t] = T := sdprod_modl sdHU (sub_inertia 'chi_t).
-have abTbar : abelian (T / H).
- have [_ _ /(_ _ _ inertU1 nz_t)sItU1] := typeF_context LtypeF.
- by rewrite -(isog_abelian (sdprod_isog defT)) (abelianS sItU1); case: inertU1.
-have [DtL _ X_1] := cfInd_Hall_central_Inertia nsHL abTbar hallH.
-have Dchi_sum : chi = \sum_(i in S_ chi) 'chi_i.
- by rewrite {1}Dchi DtL -Dchi; apply: eq_bigl => i; rewrite !inE.
-have lichi : constant [seq 'chi_i 1%g | i in S_ chi].
- pose c := #|L : T|%:R * 'chi_t 1%g; apply: (@all_pred1_constant _ c).
- by apply/allP=> _ /imageP[s tLs ->] /=; rewrite inE Dchi in tLs; rewrite X_1.
-split=> // j Schi_j /=; apply/cfun_onP=> y A'y.
-have [Ly | /cfun0->//] := boolP (y \in L).
-have CHy1: 'C_H[y] = 1%g.
- apply: contraNeq A'y => /trivgPn[z /setIP[Hz cyz] ntz].
- rewrite !inE -implyNb; apply/implyP=> nty; apply/bigcupP.
- rewrite FTsupp1_type1 Ltype1 //=; exists z; first by rewrite !inE ntz.
- by rewrite 3!inE nty Ly cent1C.
-have: j \in calX by apply/FTtype1_irrP; exists chi.
-by rewrite !inE => /andP[/irr_reg_off_ker_0->].
-Qed.
-
-(* This is Peterfalvi (12.2)(a), second part. *)
-Lemma FTtype1_irr_isometry :
- {in 'Z[calI, L^#], isometry tau, to 'Z[irr G, G^#]}.
-Proof.
-apply: (sub_iso_to _ _ (Dade_Zisometry _)) => // phi.
-rewrite zcharD1E => /andP[S_phi phi1_0].
-have /subsetD1P[_ /setU1K <-] := FTsupp_sub L; rewrite zcharD1 {}phi1_0 andbT.
-apply: zchar_trans_on phi S_phi => _ /imageP[i /FTtype1_irrP[j calSj Sj_i] ->].
-by rewrite zchar_split irr_vchar; have [_ _ ->] := FTtype1_seqInd_facts calSj.
-Qed.
-
-Lemma FTtype1_irr_subcoherent :
- {R : 'CF(L) -> seq 'CF(G) | subcoherent calI tau R}.
-Proof.
-apply: irr_subcoherent; last exact: FTtype1_irr_isometry.
- have UcalI: uniq calI by apply/dinjectiveP; apply: in2W irr_inj.
- split=> // _ /imageP[i Ii ->]; rewrite !inE in Ii; first exact: mem_irr.
- by apply/imageP; exists (conjC_Iirr i); rewrite ?inE conjC_IirrE ?cfker_aut.
-apply/hasPn=> psi; case/imageP => i; rewrite !inE => /andP[kerH'i _] ->.
-rewrite /cfReal odd_eq_conj_irr1 ?mFT_odd // irr_eq1 -subGcfker.
-by apply: contra kerH'i; apply: gFsub_trans.
-Qed.
-Local Notation R1gen := FTtype1_irr_subcoherent.
-
-(* This is Peterfalvi (12.2)(b). *)
-Lemma FTtype1_subcoherent (R1 := sval R1gen) :
- {R : 'CF(L) -> seq 'CF(G) |
- [/\ subcoherent calS tau R,
- {in Iirr_kerD L H 1%G, forall i (phi := 'chi_i),
- [/\ orthonormal (R1 phi),
- size (R1 phi) = 2
- & tau (phi - phi^*%CF) = \sum_(mu <- R1 phi) mu]}
- & forall chi, R chi = flatten [seq R1 'chi_i | i in S_ chi]]}.
-Proof.
-have nrS: ~~ has cfReal calS by apply: seqInd_notReal; rewrite ?mFT_odd.
-have U_S: uniq calS by apply: seqInd_uniq.
-have ccS: cfConjC_closed calS by apply: cfAut_seqInd.
-have conjCS: cfConjC_subset calS (seqIndD H L H 1) by split.
-case: R1gen @R1 => /= R1 subc1.
-have [[chi_char nrI ccI] tau_iso oI h1 hortho] := subc1.
-pose R chi := flatten [seq R1 'chi_i | i in S_ chi].
-have memI phi i: phi \in calS -> i \in S_ phi -> 'chi_i \in calI.
- by move=> Sphi Sphi_i; apply/image_f/FTtype1_irrP; exists phi.
-have aux phi psi i j mu nu:
- phi \in calS -> psi \in calS -> i \in S_ phi -> j \in S_ psi ->
- mu \in R1 'chi_i -> nu \in R1 'chi_j ->
- orthogonal 'chi_i ('chi_j :: ('chi_j)^*%CF) -> '[mu, nu] = 0.
-- move=> Sphi Spsi Sphi_i Spsi_j R1i_mu R1i_nu o_ij.
- apply: orthogonalP R1i_mu R1i_nu.
- by apply: hortho o_ij; [apply: memI Spsi Spsi_j | apply: memI Sphi Sphi_i].
-exists R; split => //= => [| i Ii]; last first.
- have mem_i := mem_calI Ii; have{h1} [Zirr oR1 tau_im] := h1 _ mem_i.
- split=> //; apply/eqP; rewrite -eqC_nat -cfnorm_orthonormal // -{}tau_im.
- have ?: 'chi_i - ('chi_i)^*%CF \in 'Z[calI, L^#].
- have hchi : 'chi_i \in 'Z[calI, L] by rewrite mem_zchar_on // cfun_onG.
- rewrite sub_aut_zchar ?cfAut_zchar // => _ /mapP[j _ ->].
- exact: irr_vchar.
- have [-> // _] := tau_iso; rewrite cfnormBd ?cfnorm_conjC ?cfnorm_irr //.
- by have [_ ->] := pairwise_orthogonalP oI; rewrite ?ccI // eq_sym (hasPn nrI).
-have calS_portho : pairwise_orthogonal calS by apply: seqInd_orthogonal.
-have calS_char : {subset calS <= character} by apply: seqInd_char.
-have calS_chi_ortho :
- {in calS &, forall phi psi i j,
- i \in irr_constt phi -> j \in irr_constt psi ->
- '[phi, psi] = 0 -> '['chi_i, 'chi_j] = 0}.
-- by move=> phi psi Sphi Spsi /= i j; apply: constt_ortho_char; apply/calS_char.
-have ZisoS_tau: {in 'Z[calS, L^#], isometry tau, to 'Z[irr G, G^#]}.
- apply: (sub_iso_to _ _ (Dade_Zisometry _)) => // phi.
- have /subsetD1P[_ /setU1K <-] := FTsupp_sub L.
- rewrite zcharD1E zcharD1 => /andP[S_phi ->]; rewrite andbT.
- apply: zchar_trans_on phi S_phi => psi calS_psi.
- have [Dpsi _ hCF] := FTtype1_seqInd_facts calS_psi.
- by rewrite zchar_split (seqInd_vcharW calS_psi) /= Dpsi rpred_sum.
-split=> {ZisoS_tau}//= [phi calS_phi | phi psi calS_phi calS_psi].
- rewrite /R /[seq _ | i in _]; set e := enum _; have: uniq e := enum_uniq _.
- have: all (mem (S_ phi)) e by apply/allP=> i; rewrite mem_enum.
- have ->: phi - phi^*%CF = \sum_(i <- e) ('chi_i - ('chi_i)^*%CF).
- rewrite big_filter sumrB -rmorph_sum.
- by have [<-] := FTtype1_seqInd_facts calS_phi.
- elim: e => /= [_ _ | i e IHe /andP[Si Se] /andP[e'i Ue]].
- by rewrite !big_nil /tau linear0.
- rewrite big_cons [tau _]linearD big_cat /= -/tau orthonormal_cat.
- have{IHe Ue} [/allP Ze -> ->] := IHe Se Ue.
- have{h1} /h1[/allP Z_R1i -> -> /=] := memI _ _ calS_phi Si.
- split=> //; first by apply/allP; rewrite all_cat Z_R1i.
- apply/orthogonalP=> mu nu R1i_mu /flatten_mapP[j e_j R1j_nu].
- have /= Sj := allP Se j e_j; apply: (aux phi phi i j) => //.
- rewrite /orthogonal /= !andbT !cfdot_irr mulrb ifN_eqC ?(memPn e'i) ?eqxx //=.
- rewrite !inE in Si Sj; rewrite -conjC_IirrE; set k := conjC_Iirr j.
- rewrite (calS_chi_ortho phi phi^*%CF) ?calS_char ?ccS //.
- by rewrite irr_consttE conjC_IirrE cfdot_conjC fmorph_eq0.
- by rewrite (seqInd_conjC_ortho _ _ _ calS_phi) ?mFT_odd.
-case/andP=> /and3P[/eqP opsi_phi /eqP opsi_phiC _] _; apply/orthogonalP.
-move=> nu mu /flatten_imageP[j Spsi_j R1j_nu] /flatten_imageP[i Sphi_i R1i_mu].
-apply: (aux psi phi j i) => //; rewrite /orthogonal /= !andbT -conjC_IirrE.
-rewrite !inE in Sphi_i Spsi_j; rewrite (calS_chi_ortho psi phi) ?calS_char //.
-rewrite (calS_chi_ortho psi phi^*%CF) ?calS_char ?ccS ?eqxx //.
-by rewrite irr_consttE conjC_IirrE cfdot_conjC fmorph_eq0.
-Qed.
-
-End Twelve2.
-
-Local Notation R1gen := FTtype1_irr_subcoherent.
-Local Notation Rgen := FTtype1_subcoherent.
-
-(* This is Peterfalvi (12.3) *)
-Lemma FTtype1_seqInd_ortho L1 L2 (maxL1 : L1 \in 'M) (maxL2 : L2 \in 'M)
- (L1type1 : FTtype L1 == 1%N) (L2type1 : FTtype L2 == 1%N)
- (H1 := L1`_\F%G) (H2 := L2`_\F%G)
- (calS1 := seqIndD H1 L1 H1 1) (calS2 := seqIndD H2 L2 H2 1)
- (R1 := sval (Rgen maxL1 L1type1)) (R2 := sval (Rgen maxL2 L2type1)) :
- gval L2 \notin L1 :^: G ->
- {in calS1 & calS2, forall chi1 chi2, orthogonal (R1 chi1) (R2 chi2)}.
-Proof.
-move=> notL1G_L2; without loss{notL1G_L2} disjointA1A:
- L1 L2 maxL1 maxL2 L1type1 L2type1 @H1 @H2 @calS1 @calS2 @R1 @R2 /
- [disjoint 'A1~(L2) & 'A~(L1)].
-- move=> IH_L; have [_ _] := FT_Dade_support_disjoint maxL1 maxL2 notL1G_L2.
- by case=> /IH_L-oS12 chi1 chi2 *; first rewrite orthogonal_sym; apply: oS12.
-case: (Rgen _ _) @R1 => /= R1; set R1' := sval _ => [[subcoh1 hR1' defR1]].
-case: (Rgen _ _) @R2 => /= R2; set R2' := sval _ => [[subcoh2 hR2' defR2]].
-pose tau1 := FT_Dade maxL1; pose tau2 := FT_Dade maxL2.
-move=> chi1 chi2 calS1_chi1 calS2_chi2.
-have [_ _ _ /(_ chi1 calS1_chi1)[Z_R1 o1R1 dtau1_chi1] _] := subcoh1.
-have{o1R1} [uR1 oR1] := orthonormalP o1R1.
-apply/orthogonalP=> a b R1a R2b; pose psi2 := tau2 (chi2 - chi2^*%CF).
-have Z1a: a \in dirr G by rewrite dirrE Z_R1 //= oR1 ?eqxx.
-suffices{b R2b}: '[a, psi2] == 0.
- apply: contraTeq => nz_ab; rewrite /psi2 /tau2.
- have [_ _ _ /(_ chi2 calS2_chi2)[Z_R2 o1R2 ->] _] := subcoh2.
- suffices [e ->]: {e | a = if e then - b else b}.
- rewrite -scaler_sign cfdotC cfdotZr -cfdotZl scaler_sumr.
- by rewrite cfproj_sum_orthonormal // conjCK signr_eq0.
- have [_ oR2] := orthonormalP o1R2.
- have Z1b: b \in dirr G by rewrite dirrE Z_R2 //= oR2 ?eqxx.
- move/eqP: nz_ab; rewrite cfdot_dirr //.
- by do 2?[case: eqP => [-> | _]]; [exists true | exists false | ].
-have [chi1D _ Achi1] := FTtype1_seqInd_facts maxL1 L1type1 calS1_chi1.
-pose S_chi1 := [set i0 in irr_constt chi1].
-pose bchi i := 'chi[_ : {set gT}]_i - ('chi_i)^*%CF.
-have [t S_chi1t et]: exists2 t, t \in S_chi1 & tau1 (bchi _ t) = a - a^*%CF.
- suffices: ~~ [forall i in S_chi1, '[tau1 (bchi L1 i), a] <= 0].
- rewrite negb_forall_in => /exists_inP[i Si tau1i_a]; exists i => //.
- case/dIrrP: Z1a tau1i_a => ia ->.
- have [k ->]: exists k, tau1 (bchi _ i) = bchi G k.
- exact: Dade_irr_sub_conjC (mem_irr _) (Achi1 i Si).
- have {1}->: bchi G k = dchi (false, k) + dchi (true, conjC_Iirr k).
- by rewrite /dchi !scaler_sign conjC_IirrE.
- rewrite cfdotDl !cfdot_dchi addrACA -opprD subr_le0 -!natrD leC_nat.
- do 2?case: (_ =P ia) => [<-|] _ //; first by rewrite /dchi scale1r.
- by rewrite /dchi scaleN1r conjC_IirrE rmorphN /= cfConjCK opprK addrC.
- have: '[tau1 (chi1 - chi1^*%CF), a] == 1.
- rewrite /tau1 dtau1_chi1 (bigD1_seq a) //= cfdotDl cfdot_suml oR1 // eqxx.
- by rewrite big1_seq ?addr0 // => xi /andP[/negPf a'xi ?]; rewrite oR1 ?a'xi.
- apply: contraL => /forall_inP tau1a_le0.
- rewrite (ltr_eqF (ler_lt_trans _ ltr01)) // chi1D rmorph_sum /= -/S_chi1.
- rewrite -sumrB [tau1 _]linear_sum /= -/tau1 cfdot_suml.
- by rewrite -oppr_ge0 -sumrN sumr_ge0 // => i /tau1a_le0; rewrite oppr_ge0.
-clear Achi1 dtau1_chi1 uR1 defR1.
-suffices: '[a, psi2] == - '[a, psi2] by rewrite -addr_eq0 (mulrn_eq0 _ 2).
-have A1bchi2: chi2 - (chi2^*)%CF \in 'Z[calS2, 'A1(L2)].
- by rewrite FTsupp1_type1 // seqInd_sub_aut_zchar ?gFnormal.
-have{t S_chi1t et} /eqP{2}->: '[a, psi2] == '[a^*%CF, psi2].
- move/zchar_on in A1bchi2; rewrite -subr_eq0 -cfdotBl.
- rewrite [psi2]FT_DadeE ?(cfun_onS (FTsupp1_sub _)) // -FT_Dade1E // -et.
- rewrite (cfdot_complement (Dade_cfunS _ _)) ?(cfun_onS _ (Dade_cfunS _ _)) //.
- by rewrite FT_Dade_supportE FT_Dade1_supportE setTD -disjoints_subset.
-rewrite -2!raddfN opprB /= cfdot_conjCl -Dade_conjC rmorphB /= cfConjCK -/tau2.
-rewrite conj_Cint ?Cint_cfdot_vchar ?(Z_R1 a) // Dade_vchar //.
-rewrite (zchar_onS (FTsupp1_sub _)) // (zchar_sub_irr _ A1bchi2) //.
-exact: seqInd_vcharW.
-Qed.
-
-Section Twelve_4_to_6.
-
-Variable L : {group gT}.
-Hypothesis maxL : L \in 'M .
-
-Local Notation "` 'L'" := (gval L) (at level 0, only parsing) : group_scope.
-Local Notation H := `L`_\F%G.
-Local Notation "` 'H'" := `L`_\F (at level 0) : group_scope.
-Local Notation H' := H^`(1)%G.
-Local Notation "` 'H''" := `H^`(1) (at level 0) : group_scope.
-
-Let calS := seqIndD H L H 1%G.
-Let tau := FT_Dade maxL.
-Let rho := invDade (FT_DadeF_hyp maxL).
-
-Section Twelve_4_5.
-
-Hypothesis Ltype1 : FTtype L == 1%N.
-
-Let R := sval (Rgen maxL Ltype1).
-Let S_ (chi : 'CF(L)) := [set i in irr_constt chi].
-
-(* This is Peterfalvi (12.4). *)
-Lemma FTtype1_ortho_constant (psi : 'CF(G)) x :
- {in calS, forall phi, orthogonal psi (R phi)} -> x \in L :\: H ->
- {in x *: H, forall y, psi y = psi x}%g.
-Proof.
-move=> opsiR /setDP[Lx H'x]; pose Rpsi := 'Res[L] psi.
-have nsHL: H <| L := gFnormal _ _; have [sHL _] := andP nsHL.
-have [U [[[_ _ sdHU] [U1 inertU1] _] _]] := FTtypeP 1 maxL Ltype1.
-have /= [_ _ TIsub]:= FTtypeI_II_facts maxL Ltype1 sdHU.
-pose ddL := FT_Dade_hyp maxL.
-have A1Hdef : 'A1(L) = H^# by apply: FTsupp1_type1.
-have dot_irr xi j : xi \in calS -> j \in S_ xi -> '['chi_j, xi] = 1.
- move=> xi_calS Sj.
- have -> : xi = \sum_(i <- enum (S_ xi)) 'chi_i.
- by rewrite big_filter; have [] := FTtype1_seqInd_facts maxL Ltype1 xi_calS.
- rewrite (bigD1_seq j) ?mem_enum ?enum_uniq //= cfdotDr cfdot_sumr cfnorm_irr.
- by rewrite big1 ?addr0 // => k i'k; rewrite cfdot_irr eq_sym (negPf i'k).
-have {dot_irr} supp12B y xi j1 j2 : xi \in calS -> j1 \in S_ xi ->
- j2 \in S_ xi -> y \notin ('A(L) :\: H^#) -> ('chi_j1 - 'chi_j2) y = 0.
-- move=> calS_xi Sj1 Sj2 yADHn.
- have [xiD xi_cst sup_xi] := FTtype1_seqInd_facts maxL Ltype1 calS_xi.
- have [Hy | H'y] := boolP (y \in H); last first.
- suffices /cfun_on0->: y \notin 1%g |: 'A(L) by rewrite ?rpredB ?sup_xi.
- by rewrite !inE negb_or negb_and (group1_contra H'y) ?H'y in yADHn *.
- have [s _ xiIndD] := seqIndP calS_xi.
- pose sum_sL := \sum_(xi_z <- ('chi_s ^: L)%CF) xi_z.
- suffices Dxi: {in S_ xi, forall i, 'chi_i y = sum_sL y}.
- by rewrite !cfunE !Dxi ?subrr.
- move=> k Sk; pose phiH := 'Res[H] 'chi_k.
- transitivity (phiH y); first by rewrite cfResE ?normal_sub.
- have phiH_s_1: '[phiH, 'chi_s] = 1 by rewrite cfdot_Res_l -xiIndD dot_irr.
- have phiH_s: s \in irr_constt phiH by rewrite irr_consttE phiH_s_1 oner_eq0.
- by rewrite [phiH](Clifford_Res_sum_cfclass _ phiH_s) // phiH_s_1 scale1r.
-have {supp12B} oResD xi i1 i2 : xi \in calS -> i1 \in S_ xi -> i2 \in S_ xi ->
- '['Res[L] psi, 'chi_i1 - 'chi_i2] = 0.
-- move=> calS_xi Si1 Si2; rewrite cfdotC Frobenius_reciprocity -cfdotC.
- case: (altP (i1 =P i2))=> [-> | d12]; first by rewrite subrr linear0 cfdot0r.
- have {supp12B} supp12B y: y \notin 'A(L) :\: H^# -> ('chi_i1 - 'chi_i2) y = 0.
- exact: (supp12B _ xi _ _ calS_xi).
- case: (FTtype1_seqInd_facts maxL Ltype1 calS_xi) => _ cst1 supA.
- move/(_ _ Si1): (supA) => /cfun_onP s1; case/(constantP 0): (cst1) => [n].
- move/all_pred1P /allP => nseqD; move/(_ _ Si2): (supA) => /cfun_onP s2.
- have nchi11: 'chi_i1 1%g = n by apply/eqP/nseqD/image_f.
- have{nseqD} nchi12: 'chi_i2 1%g = n by apply/eqP/nseqD/image_f.
- have i12_1: 'chi_i1 1%g == 'chi_i2 1%g by rewrite nchi11 nchi12.
- have sH1A: H^# \subset 'A(L) by rewrite Fcore_sub_FTsupp.
- have nzAH: 'A(L) :\: H^# != set0.
- apply: contra d12 => /eqP tADH; apply/eqP; apply: irr_inj; apply/cfunP=> w.
- apply/eqP; rewrite -subr_eq0; have := supp12B w; rewrite !cfunE => -> //.
- by rewrite tADH in_set0.
- have{nzAH} tiH: normedTI ('A(L) :\: H^#) G L by rewrite -A1Hdef TIsub ?A1Hdef.
- have{supp12B} supp12B : 'chi_i1 - 'chi_i2 \in 'CF(L, 'A(L) :\: H^#).
- by apply/cfun_onP; apply: supp12B.
- have [_ /subsetIP[_ nAHL] _] := normedTI_P tiH.
- pose tau1 := restr_Dade ddL (subsetDl _ _) nAHL.
- have tauInd: {in 'CF(L, 'A(L) :\: H^#), tau1 =1 'Ind} := Dade_Ind _ tiH.
- rewrite -{}tauInd // [tau1 _]restr_DadeE {tau1 nAHL}//.
- suffices Rtau12: Dade ddL ('chi_i1 - 'chi_i2) \in 'Z[R xi].
- by rewrite (span_orthogonal (opsiR xi _)) ?memv_span1 ?(zchar_span Rtau12).
- case: (Rgen _ _) @R => rR [scohS]; case: (R1gen _ _) => /= R1 scohI ? DrR.
- rewrite -/calS in scohS; set calI := image _ _ in scohI.
- have [Ii1 Ii2]: 'chi_i1 \in calI /\ 'chi_i2 \in calI.
- by split; apply/image_f/FTtype1_irrP; exists xi.
- have [calI2 [I2i1 I2i2 sI2I] []] := pair_degree_coherence scohI Ii1 Ii2 i12_1.
- move=> tau2 cohI2; have [_ <-] := cohI2; last first.
- by rewrite zcharD1E rpredB ?mem_zchar // 2!cfunE subr_eq0.
- suffices R_I2 j: j \in S_ xi -> 'chi_j \in calI2 -> tau2 'chi_j \in 'Z[rR xi].
- by rewrite raddfB rpredB ?R_I2.
- move=> Sj /(mem_coherent_sum_subseq scohI sI2I cohI2)[e R1e ->].
- rewrite DrR big_seq rpred_sum // => phi /(mem_subseq R1e) R1phi.
- by apply/mem_zchar/flatten_imageP; exists j.
-suffices ResL: {in x *: H, forall y, Rpsi y = Rpsi x}%g.
- move=> w xHw; case/lcosetP: xHw (ResL w xHw) => h Hh -> {w}.
- by rewrite !cfResE ?subsetT ?groupM // ?(subsetP sHL).
-move=> _ /lcosetP[h Hh ->] /=; rewrite (cfun_sum_cfdot Rpsi).
-pose calX := Iirr_kerD L H 1%g; rewrite (bigID (mem calX) xpredT) /= !cfunE.
-set sumX := \sum_(i in _) _; suffices HsumX: sumX \in 'CF(L, H).
- rewrite !(cfun_on0 HsumX) ?groupMr // !sum_cfunE.
- rewrite !add0r; apply: eq_bigr => i; rewrite !inE sub1G andbT negbK => kerHi.
- by rewrite !cfunE cfkerMr ?(subsetP kerHi).
-rewrite [sumX](set_partition_big _ (FTtype1_irr_partition L)) /=.
-apply: rpred_sum => A; rewrite inE => /mapP[xi calS_xi defA].
-have [-> | [j Achij]] := set_0Vmem A; first by rewrite big_set0 rpred0.
-suffices ->: \sum_(i in A) '[Rpsi, 'chi_i] *: 'chi_i = '[Rpsi, 'chi_j] *: xi.
- by rewrite rpredZ // (seqInd_on _ calS_xi).
-have [-> _ _] := FTtype1_seqInd_facts maxL Ltype1 calS_xi; rewrite -defA.
-rewrite scaler_sumr; apply: eq_bigr => i Ai; congr (_ *: _); apply/eqP.
-by rewrite -subr_eq0 -cfdotBr (oResD xi) /S_ -?defA.
-Qed.
-
-(* This is Peterfalvi (12.5) *)
-Lemma FtypeI_invDade_ortho_constant (psi : 'CF(G)) :
- {in calS, forall phi, orthogonal psi (R phi)} ->
- {in H :\: H' &, forall x y, rho psi x = rho psi y}.
-Proof.
-have [nsH'H nsHL]: H' <| H /\ H <| L by rewrite !gFnormal.
-have [[sH'H _] [sHL _]] := (andP nsH'H, andP nsHL).
-case: (Rgen _ _) @R => /= rR [scohS _ _] opsiR; set rpsi := rho psi.
-have{rR scohS opsiR} o_rpsi_S xi1 xi2:
- xi1 \in calS -> xi2 \in calS -> xi1 1%g = xi2 1%g -> '[rpsi, xi1 - xi2] = 0.
-- move=> Sxi1 Sxi2 /eqP deg12.
- have [calS2 [S2xi1 S2xi2]] := pair_degree_coherence scohS Sxi1 Sxi2 deg12.
- move=> ccsS2S [tau2 cohS2]; have [[_ Dtau2] [_ sS2S _]] := (cohS2, ccsS2S).
- have{deg12} L1xi12: (xi1 - xi2) 1%g == 0 by rewrite !cfunE subr_eq0.
- have{ccsS2S cohS2} tau2E := mem_coherent_sum_subseq scohS ccsS2S cohS2.
- have o_psi_tau2 xi: xi \in calS2 -> '[psi, tau2 xi] = 0.
- move=> S2xi; have [e /mem_subseq Re ->] := tau2E xi S2xi.
- by rewrite cfdot_sumr big1_seq // => _ /Re/orthoPl->; rewrite ?opsiR ?sS2S.
- have A1xi12: xi1 - xi2 \in 'CF(L, H^#).
- by rewrite (@zchar_on _ _ calS) ?zcharD1 ?rpredB ?seqInd_zchar.
- rewrite cfdotC -invDade_reciprocity // -cfdotC.
- rewrite FT_DadeF_E -?FT_DadeE ?(cfun_onS (Fcore_sub_FTsupp maxL)) //.
- rewrite -Dtau2; last by rewrite zcharD1E rpredB ?mem_zchar.
- by rewrite !raddfB /= !o_psi_tau2 ?subrr.
-pose P_ i : {set Iirr H} := [set j in irr_constt ('Ind[H, H'] 'chi_i)].
-pose P : {set {set Iirr H}} := [set P_ i | i : Iirr H'].
-have tiP: trivIset P.
- apply/trivIsetP=> _ _ /imsetP[i1 _ ->] /imsetP[i2 _ ->] chi2'1.
- apply/pred0P=> j; rewrite !inE; apply: contraNF chi2'1 => /andP[i1Hj i2Hj].
- case: ifP (cfclass_Ind_cases i1 i2 nsH'H) => _; first by rewrite /P_ => ->.
- have NiH i: 'Ind[H,H'] 'chi_i \is a character by rewrite cfInd_char ?irr_char.
- case/(constt_ortho_char (NiH i1) (NiH i2) i1Hj i2Hj)/eqP/idPn.
- by rewrite cfnorm_irr oner_eq0.
-have coverP: cover P =i predT.
- move=> j; apply/bigcupP; have [i jH'i] := constt_cfRes_irr H' j.
- by exists (P_ i); [apply: mem_imset | rewrite inE constt_Ind_Res].
-have /(all_sig_cond 0)[lambda lambdaP] A: A \in P -> {i | A = P_ i}.
- by case/imsetP/sig2_eqW=> i; exists i.
-pose theta A : Iirr H := odflt 0 [pick j in A :\ 0]; pose psiH := 'Res[H] rpsi.
-pose a_ A := '[psiH, 'chi_(theta A)] / '['Ind 'chi_(lambda A), 'chi_(theta A)].
-pose a := '[psiH, 1 - 'chi_(theta (pblock P 0))].
-suffices Da: {in H :\: H', rpsi =1 (fun=> a)} by move=> /= *; rewrite !Da.
-suffices DpsiH: psiH = \sum_(A in P) a_ A *: 'Ind 'chi_(lambda A) + a%:A.
- move=> x /setDP[Hx notH'x]; transitivity (psiH x); first by rewrite cfResE.
- rewrite DpsiH !cfunE sum_cfunE cfun1E Hx mulr1 big1 ?add0r // => A _.
- by rewrite cfunE (cfun_onP (cfInd_normal _ _)) ?mulr0.
-apply: canRL (subrK _) _; rewrite [_ - _]cfun_sum_cfdot.
-rewrite -(eq_bigl _ _ coverP) big_trivIset //=; apply: eq_bigr => A P_A.
-rewrite {}/a_; set i := lambda A; set k := theta A; pose Ii := 'I_H['chi_i]%G.
-have /cfInd_central_Inertia[//|e _ [DiH _ DiH_1]]: abelian (Ii / H').
- by rewrite (abelianS _ (der_abelian 0 H)) ?quotientS ?subsetIl.
-have defA: A = P_ i := lambdaP A P_A.
-have Ak: k \in A; last 1 [have iHk := Ak; rewrite defA inE in Ak].
- have [j iHj] := constt_cfInd_irr i sH'H.
- rewrite {}/k /theta; case: pickP => [k /setDP[]//| /(_ j)/=].
- by rewrite defA !in_set iHj andbT => /negbFE/eqP <-.
-have{DiH} DiH: 'Ind 'chi_i = e *: \sum_(j in A) 'chi_j.
- by congr (_ = _ *: _): DiH; apply: eq_bigl => j; rewrite [in RHS]defA !inE.
-rewrite {2}DiH; have{DiH} ->: e = '['Ind 'chi_i, 'chi_k].
- rewrite DiH cfdotZl cfdot_suml (bigD1 k) //= cfnorm_irr big1 ?addr0 ?mulr1 //.
- by move=> j /andP[_ k'j]; rewrite cfdot_irr (negPf k'j).
-rewrite scalerA scaler_sumr divfK //; apply: eq_bigr => j Aj; congr (_ *: _).
-rewrite cfdotBl cfdotZl -irr0 cfdot_irr mulr_natr mulrb eq_sym.
-apply/(canLR (addrK _))/(canRL (addNKr _)); rewrite addrC -cfdotBr.
-have [j0 | nzj] := altP eqP; first by rewrite j0 irr0 /a -j0 (def_pblock _ P_A).
-have iHj := Aj; rewrite defA inE in iHj; rewrite cfdot_Res_l linearB /=.
-do [rewrite o_rpsi_S ?cfInd1 ?DiH_1 //=; apply/seqIndC1P]; first by exists j.
-by exists k; rewrite // /k /theta; case: pickP => [? | /(_ j)] /setD1P[].
-Qed.
-
-End Twelve_4_5.
-
-Hypothesis frobL : [Frobenius L with kernel H].
-
-Lemma FT_Frobenius_type1 : FTtype L == 1%N.
-Proof.
-have [E /Frobenius_of_typeF LtypeF] := existsP frobL.
-by apply/idPn=> /FTtypeP_witness[]// _ _ _ _ _ /typePF_exclusion/(_ E).
-Qed.
-Let Ltype1 := FT_Frobenius_type1.
-
-Lemma FTsupp_Frobenius : 'A(L) = H^#.
-Proof.
-apply/eqP; rewrite eqEsubset Fcore_sub_FTsupp // andbT.
-apply/bigcupsP=> y; rewrite Ltype1 FTsupp1_type1 //= => H1y.
-by rewrite setSD //; have [_ _ _ ->] := Frobenius_kerP frobL.
-Qed.
-
-(* This is Peterfalvi (12.6). *)
-Lemma FT_Frobenius_coherence : {subset calS <= irr L} /\ coherent calS L^# tau.
-Proof.
-have irrS: {subset calS <= irr L}.
- by move=> _ /seqIndC1P[s nz_s ->]; apply: irr_induced_Frobenius_ker.
-split=> //; have [U [MtypeF MtypeI]] := FTtypeP 1 maxL Ltype1.
-have [[ntH ntU defL] _ _] := MtypeF; have nsHL: H <| L := gFnormal _ L.
-have nilH: nilpotent H := Fcore_nil L; have solH := nilpotent_sol nilH.
-have frobHU: [Frobenius L = H ><| U] := set_Frobenius_compl defL frobL.
-have [R [scohS _ _]] := Rgen maxL Ltype1; rewrite -/calS -/tau in scohS.
-have [tiH | [cHH _] | [expUdvH1 _]] := MtypeI.
-- have /Sibley_coherence := And3 (mFT_odd L) nilH tiH.
- case/(_ U)=> [|tau1 [IZtau1 Dtau1]]; first by left.
- exists tau1; split=> // chi Schi; rewrite Dtau1 //.
- by rewrite /tau Dade_Ind ?FTsupp_Frobenius ?(zcharD1_seqInd_on _ Schi).
-- apply/(uniform_degree_coherence scohS)/(@all_pred1_constant _ #|L : H|%:R).
- apply/allP=> _ /mapP[_ /seqIndP[s _ ->] ->] /=.
- by rewrite cfInd1 ?gFsub // lin_char1 ?mulr1 //; apply/char_abelianP.
-apply: (non_coherent_chief _ _ scohS) id _ => // [|[_ [p [pH _] /negP[]]]].
- split; rewrite ?mFT_odd ?normal1 ?sub1G ?quotient_nil //= joingG1.
- apply/existsP; exists (U / H')%G.
- by rewrite Frobenius_proper_quotient ?(sol_der1_proper solH) ?gFnormal_trans.
-rewrite subn1 -(index_sdprod defL) -(isog_pgroup p (quotient1_isog H)) in pH *.
-have /expUdvH1: p \in \pi(H) by rewrite -p_part_gt1 part_pnat_id ?cardG_gt1.
-by have [-> //] := typeF_context MtypeF; split; rewrite ?(sdprodWY defL).
-Qed.
-
-End Twelve_4_to_6.
-
-Section Twelve_8_to_16.
-
-Variable p : nat.
-
-(* Equivalent reformultaion of Hypothesis (12.8), avoiding quotients. *)
-Hypothesis IHp :
- forall q M, (q < p)%N -> M \in 'M -> FTtype M == 1%N -> ('r_q(M) > 1)%N ->
- q \in \pi(M`_\F).
-
-Variables M P0 : {group gT}.
-
-Let K := M`_\F%G.
-Let K' := K^`(1)%G.
-Let nsKM : K <| M. Proof. exact: gFnormal. Qed.
-
-Hypothesis maxM : M \in 'M.
-Hypothesis Mtype1 : FTtype M == 1%N.
-Hypothesis prankM : ('r_p(M) > 1)%N.
-Hypothesis p'K : p^'.-group K.
-
-Hypothesis sylP0 : p.-Sylow(M) P0.
-
-(* This is Peterfalvi (12.9). *)
-Lemma non_Frobenius_FTtype1_witness :
- [/\ abelian P0, 'r_p(P0) = 2
- & exists2 L, L \in 'M /\ P0 \subset L`_\s
- & exists2 x, x \in 'Ohm_1(P0)^#
- & [/\ ~~ ('C_K[x] \subset K'), 'N(<[x]>) \subset M & ~~ ('C[x] \subset L)]].
-Proof.
-have ntK: K :!=: 1%g := mmax_Fcore_neq1 maxM; have [sP0M pP0 _] := and3P sylP0.
-have hallK: \pi(K).-Hall(M) K := Fcore_Hall M.
-have K'p: p \notin \pi(K) by rewrite -p'groupEpi.
-have K'P0: \pi(K)^'.-group P0 by rewrite (pi_pgroup pP0).
-have [U hallU sP0U] := Hall_superset (mmax_sol maxM) sP0M K'P0.
-have sylP0_U: p.-Sylow(U) P0 := pHall_subl sP0U (pHall_sub hallU) sylP0.
-have{hallU} defM: K ><| U = M by apply/(sdprod_normal_p'HallP nsKM hallU).
-have{K'P0} coKP0: coprime #|K| #|P0| by rewrite coprime_pi'.
-have [/(_ _ _ sylP0_U)[abP0 rankP0] uCK _] := FTtypeI_II_facts maxM Mtype1 defM.
-have{rankP0} /eqP prankP0: 'r_p(P0) == 2.
- by rewrite eqn_leq -{1}rank_pgroup // rankP0 (p_rank_Sylow sylP0).
-have piP0p: p \in \pi(P0) by rewrite -p_rank_gt0 prankP0.
-have [L maxL sP0Ls]: exists2 L, L \in 'M & P0 \subset L`_\s.
- have [DpiG _ _ _] := FT_Dade_support_partition gT.
- have:= piSg (subsetT P0) piP0p; rewrite DpiG => /exists_inP[L maxL piLs_p].
- have [_ /Hall_pi hallLs _] := FTcore_facts maxL.
- have [P sylP] := Sylow_exists p L`_\s; have [sPLs _] := andP sylP.
- have sylP_G: p.-Sylow(G) P := subHall_Sylow hallLs piLs_p sylP.
- have [y _ sP0_Py] := Sylow_subJ sylP_G (subsetT P0) pP0.
- by exists (L :^ y)%G; rewrite ?mmaxJ // FTcoreJ (subset_trans sP0_Py) ?conjSg.
-split=> //; exists L => //; set P1 := 'Ohm_1(P0).
-have abelP1: p.-abelem P1 := Ohm1_abelem pP0 abP0.
-have [pP1 abP1 _] := and3P abelP1.
-have sP10: P1 \subset P0 := Ohm_sub 1 P0; have sP1M := subset_trans sP10 sP0M.
-have nKP1: P1 \subset 'N(K) by rewrite (subset_trans sP1M) ?gFnorm.
-have nK'P1: P1 \subset 'N(K') by apply: gFnorm_trans.
-have{coKP0} coKP1: coprime #|K| #|P1| := coprimegS sP10 coKP0.
-have solK: solvable K := nilpotent_sol (Fcore_nil M).
-have isoP1: P1 \isog P1 / K'.
- by rewrite quotient_isog // coprime_TIg ?(coprimeSg (der_sub 1 K)).
-have{ntK} ntKK': (K / K' != 1)%g.
- by rewrite -subG1 quotient_sub1 ?gFnorm ?proper_subn ?(sol_der1_proper solK).
-have defKK': (<<\bigcup_(xbar in (P1 / K')^#) 'C_(K / K')[xbar]>> = K / K')%g.
- rewrite coprime_abelian_gen_cent1 ?coprime_morph ?quotient_norms //.
- by rewrite quotient_abelian.
- rewrite -(isog_cyclic isoP1) (abelem_cyclic abelP1).
- by rewrite -(p_rank_abelem abelP1) p_rank_Ohm1 prankP0.
-have [xb P1xb ntCKxb]: {xb | xb \in (P1 / K')^# & 'C_(K / K')[xb] != 1}%g.
- apply/sig2W/exists_inP; rewrite -negb_forall_in.
- apply: contra ntKK' => /eqfun_inP regKP1bar.
- by rewrite -subG1 /= -defKK' gen_subG; apply/bigcupsP=> xb /regKP1bar->.
-have [ntxb /morphimP[x nK'x P1x Dxb]] := setD1P P1xb.
-have ntx: x != 1%g by apply: contraNneq ntxb => x1; rewrite Dxb x1 morph1.
-have ntCKx: ~~ ('C_K[x] \subset K').
- rewrite -quotient_sub1 ?subIset ?gFnorm // -cent_cycle subG1 /=.
- have sXP1: <[x]> \subset P1 by rewrite cycle_subG.
- rewrite coprime_quotient_cent ?(coprimegS sXP1) ?(subset_trans sXP1) ?gFsub//.
- by rewrite quotient_cycle ?(subsetP nK'P1) // -Dxb cent_cycle.
-have{uCK} UCx: 'M('C[x]) = [set M].
- rewrite -cent_set1 uCK -?card_gt0 ?cards1 // ?sub1set ?cent_set1.
- by rewrite !inE ntx (subsetP sP0U) ?(subsetP sP10).
- by apply: contraNneq ntCKx => ->; rewrite sub1G.
-exists x; [by rewrite !inE ntx | split=> //].
- rewrite (sub_uniq_mmax UCx) /= -?cent_cycle ?cent_sub //.
- rewrite mFT_norm_proper ?cycle_eq1 //.
- by rewrite mFT_sol_proper abelian_sol ?cycle_abelian.
-apply: contraL (leqW (p_rankS p sP0Ls)) => /(eq_uniq_mmax UCx)-> //.
-by rewrite prankP0 FTcore_type1 //= ltnS p_rank_gt0.
-Qed.
-
-Variables (L : {group gT}) (x : gT).
-Hypotheses (abP0 : abelian P0) (prankP0 : 'r_p(P0) = 2).
-Hypotheses (maxL : L \in 'M) (sP0_Ls : P0 \subset L`_\s).
-Hypotheses (P0_1s_x : x \in 'Ohm_1(P0)^#) (not_sCxK' : ~~ ('C_K[x] \subset K')).
-Hypotheses (sNxM : 'N(<[x]>) \subset M) (not_sCxL : ~~ ('C[x] \subset L)).
-
-Let H := L`_\F%G.
-Local Notation "` 'H'" := (gval L)`_\F (at level 0, format "` 'H'").
-Let nsHL : H <| L. Proof. exact: gFnormal. Qed.
-
-(* This is Peterfalvi (12.10). *)
-Let frobL : [Frobenius L with kernel H].
-Proof.
-have [sP0M pP0 _] := and3P sylP0.
-have [ntx /(subsetP (Ohm_sub 1 _))P0x] := setD1P P0_1s_x.
-have [Ltype1 | notLtype1] := boolP (FTtype L == 1)%N; last first.
- have [U W W1 W2 defW LtypeP] := FTtypeP_witness maxL notLtype1.
- suffices sP0H: P0 \subset H.
- have [Hx notLtype5] := (subsetP sP0H x P0x, FTtype5_exclusion maxL).
- have [_ _ _ tiFL] := compl_of_typeII_IV maxL LtypeP notLtype5.
- have Fx: x \in 'F(L)^# by rewrite !inE ntx (subsetP (Fcore_sub_Fitting L)).
- by have /idPn[] := cent1_normedTI tiFL Fx; rewrite setTI.
- have [/=/FTcore_type2<- // | notLtype2] := boolP (FTtype L == 2).
- have [_ _ [Ltype3 galL]] := FTtype34_structure maxL LtypeP notLtype2.
- have cycU: cyclic U.
- suffices regHU: Ptype_Fcompl_kernel LtypeP :=: 1%g.
- rewrite (isog_cyclic (quotient1_isog U)) -regHU.
- by have [|_ _ [//]] := typeP_Galois_P maxL _ galL; rewrite (eqP Ltype3).
- rewrite /Ptype_Fcompl_kernel unlock /= astabQ /=.
- have [_ _ ->] := FTtype34_Fcore_kernel_trivial maxL LtypeP notLtype2.
- rewrite -morphpreIim -injm_cent ?injmK ?ker_coset ?norms1 //.
- have [_ _ _ ->] := FTtype34_facts maxL LtypeP notLtype2.
- by apply/derG1P; have [] := compl_of_typeIII maxL LtypeP Ltype3.
- have sP0L': P0 \subset L^`(1) by rewrite -FTcore_type_gt2 ?(eqP Ltype3).
- have [_ [_ _ _ defL'] _ _ _] := LtypeP.
- have [nsHL' _ /mulG_sub[sHL' _] _ _] := sdprod_context defL'.
- have hallH := pHall_subl sHL' (der_sub 1 L) (Fcore_Hall L).
- have hallU: \pi(H)^'.-Hall(L^`(1)) U.
- by rewrite -(compl_pHall U hallH) sdprod_compl.
- rewrite (sub_normal_Hall hallH) // (pi_pgroup pP0) //.
- have: ~~ cyclic P0; last apply: contraR => piK'p.
- by rewrite abelian_rank1_cyclic // (rank_pgroup pP0) prankP0.
- by have [|y _ /cyclicS->] := Hall_psubJ hallU piK'p _ pP0; rewrite ?cyclicJ.
-have sP0H: P0 \subset H by rewrite /= -FTcore_type1.
-have [U [LtypeF /= LtypeI]] := FTtypeP 1 maxL Ltype1.
-have [[_ _ defL] _ _] := LtypeF; have [/=_ sUL _ nHU _] := sdprod_context defL.
-have not_tiH: ~ normedTI H^# G L.
- have H1x: x \in H^# by rewrite !inE ntx (subsetP sP0H).
- by case/cent1_normedTI/(_ x H1x)/idPn; rewrite setTI.
-apply/existsP; exists U; have [_ -> _] := typeF_context LtypeF.
-apply/forall_inP=> Q /SylowP[q pr_q sylQ]; have [sQU qQ _] := and3P sylQ.
-rewrite (odd_pgroup_rank1_cyclic qQ) ?mFT_odd //.
-apply: wlog_neg; rewrite -ltnNge => /ltnW; rewrite p_rank_gt0 => piQq.
-have hallU: \pi(H)^'.-Hall(L) U.
- by rewrite -(compl_pHall U (Fcore_Hall L)) sdprod_compl.
-have H'q := pnatPpi (pHall_pgroup hallU) (piSg sQU piQq).
-rewrite leqNgt; apply: contra (H'q) => qrankQ; apply: IHp => //; last first.
- by rewrite (leq_trans qrankQ) ?p_rankS ?(subset_trans sQU).
-have piHp: p \in \pi(H) by rewrite (piSg sP0H) // -p_rank_gt0 prankP0.
-have pr_p: prime p by have:= piHp; rewrite mem_primes => /andP[].
-have piUq: q \in \pi(exponent U) by rewrite pi_of_exponent (piSg sQU).
-have [odd_p odd_q]: odd p /\ odd q.
- rewrite !odd_2'nat !pnatE //.
- by rewrite (pnatPpi _ piHp) ?(pnatPpi _ piQq) -?odd_2'nat ?mFT_odd.
-have pgt2 := odd_prime_gt2 odd_p pr_p.
-suffices [b dv_q_bp]: exists b : bool, q %| (b.*2 + p).-1.
- rewrite -ltn_double (@leq_ltn_trans (p + b.*2).-1) //; last first.
- by rewrite -!addnn -(subnKC pgt2) prednK // leq_add2l; case: (b).
- rewrite -(subnKC pgt2) dvdn_leq // -mul2n Gauss_dvd ?coprime2n // -{1}subn1.
- by rewrite dvdn2 odd_sub // subnKC // odd_add odd_p odd_double addnC.
-have [// | [cHH rankH] | [/(_ p piHp)Udvp1 _]] := LtypeI; last first.
- exists false; apply: dvdn_trans Udvp1.
- by have:= piUq; rewrite mem_primes => /and3P[].
-suffices: q %| p ^ 2 - 1 ^ 2.
- rewrite subn_sqr addn1 subn1 Euclid_dvdM //.
- by case/orP; [exists false | exists true].
-pose P := 'O_p(H); pose P1 := 'Ohm_1(P).
-have sylP: p.-Sylow(H) P := nilpotent_pcore_Hall p (Fcore_nil L).
-have [sPH pP _] := and3P sylP; have sP1H: P1 \subset H by rewrite 2?gFsub_trans.
-have abelP1: p.-abelem P1 by rewrite Ohm1_abelem ?(abelianS sPH).
-have prankP1: 'r_p(P1) = 2.
- apply/anti_leq; rewrite p_rank_Ohm1 (p_rank_Sylow sylP).
- by rewrite -[in (_ <= 2)%N]rankH p_rank_le_rank -prankP0 p_rankS.
-have ntP1: P1 != 1%g by rewrite -rank_gt0 ltnW // -prankP1 p_rank_le_rank.
-have [_ _ [U0 [sU0U expU0 frobHU0]]] := LtypeF.
-have nP1U0: U0 \subset 'N(P1) by rewrite (subset_trans sU0U) 2?gFnorm_trans.
-rewrite subn1 -prankP1 p_rank_abelem -?card_pgroup //= -/P1 ?abelem_pgroup //.
-have frobP1U0 := Frobenius_subl ntP1 sP1H nP1U0 frobHU0.
-apply: dvdn_trans (Frobenius_dvd_ker1 frobP1U0).
-by do [rewrite -expU0 pi_of_exponent mem_primes => /and3P[] //] in piUq.
-Qed.
-
-Let Ltype1 : FTtype L == 1%N. Proof. exact: FT_Frobenius_type1 frobL. Qed.
-Let defAL : 'A(L) = H^#. Proof. exact: FTsupp_Frobenius frobL. Qed.
-Let sP0H : P0 \subset H. Proof. by rewrite /= -FTcore_type1. Qed.
-
-(* This is the first part of Peterfalvi (12.11). *)
-Let defM : K ><| (M :&: L) = M.
-Proof.
-have [ntx /(subsetP (Ohm_sub 1 _))P0x] := setD1P P0_1s_x.
-have Dx: x \in [set y in 'A0(L) | ~~ ('C[y] \subset L)].
- by rewrite inE FTsupp0_type1 // defAL !inE ntx (subsetP sP0H).
-have [_ [_ /(_ x Dx)uCx] /(_ x Dx)[[defM _] _ _ _]] := FTsupport_facts maxL.
-rewrite /K /= setIC (eq_uniq_mmax uCx maxM) //= -cent_cycle.
-exact: subset_trans (cent_sub <[x]>) sNxM.
-Qed.
-
-(* This is the second part of Peterfalvi (12.11). *)
-Let sML_H : M :&: L \subset H.
-Proof.
-have [sP0M pP0 _] := and3P sylP0.
-rewrite (sub_normal_Hall (Fcore_Hall L)) ?subsetIr //.
-apply/pgroupP=> q pr_q /Cauchy[]// z /setIP[Mz Lz] oz; pose A := <[z]>%G.
-have z_gt1: (#[z] > 1)%N by rewrite oz prime_gt1.
-have sylP0_HM: p.-Sylow(H :&: M) P0.
- by rewrite (pHall_subl _ _ sylP0) ?subsetIr // subsetI sP0H.
-have nP0A: A \subset 'N(P0).
- have sylHp: p.-Sylow(H) 'O_p(H) := nilpotent_pcore_Hall p (Fcore_nil L).
- have sP0Hp: P0 \subset 'O_p(H) by rewrite sub_Hall_pcore.
- have <-: 'O_p(H) :&: M = P0.
- rewrite [_ :&: _](sub_pHall sylP0_HM) ?setSI ?pcore_sub //.
- by rewrite (pgroupS (subsetIl _ _)) ?pcore_pgroup.
- by rewrite subsetI sP0Hp.
- by rewrite normsI ?gFnorm_trans ?normsG // cycle_subG.
-apply: wlog_neg => piH'q.
-have coHQ: coprime #|H| #|A| by rewrite -orderE coprime_pi' // oz pnatE.
-have frobP0A: [Frobenius P0 <*> A = P0 ><| A].
- have defHA: H ><| A = H <*> A.
- by rewrite sdprodEY ?coprime_TIg // cycle_subG (subsetP (gFnorm _ _)).
- have ltH_HA: H \proper H <*> A.
- by rewrite /proper joing_subl -indexg_gt1 -(index_sdprod defHA).
- have: [Frobenius H <*> A = H ><| A].
- apply: set_Frobenius_compl defHA _.
- by apply: Frobenius_kerS frobL; rewrite // join_subG gFsub cycle_subG.
- by apply: Frobenius_subl => //; rewrite -rank_gt0 (rank_pgroup pP0) prankP0.
-have sP0A_M: P0 <*> A \subset M by rewrite join_subG sP0M cycle_subG.
-have nKP0a: P0 <*> A \subset 'N(K) := subset_trans sP0A_M (gFnorm _ _).
-have solK: solvable K := nilpotent_sol (Fcore_nil M).
-have [_ [/(compl_of_typeF defM) MtypeF _]] := FTtypeP 1 maxM Mtype1.
-have nreg_KA: 'C_K(A) != 1%g.
- have [Kq | K'q] := boolP (q \in \pi(K)).
- apply/trivgPn; exists z; rewrite -?order_gt1 //= cent_cycle inE cent1id.
- by rewrite andbT (mem_normal_Hall (Fcore_Hall M)) // /p_elt oz pnatE.
- have [defP0A ntP0 _ _ _] := Frobenius_context frobP0A.
- have coK_P0A: coprime #|K| #|P0 <*> A|.
- rewrite -(sdprod_card defP0A) coprime_mulr (p'nat_coprime p'K) //=.
- by rewrite -orderE coprime_pi' // oz pnatE.
- have: ~~ (P0 \subset 'C(K)); last apply: contraNneq.
- have [[ntK _ _] _ [U0 [sU0ML expU0 frobKU0]]] := MtypeF.
- have [P1 /pnElemP[sP1U0 abelP1 dimP1]] := p_rank_witness p U0.
- have ntP1: P1 :!=: 1%g.
- rewrite -rank_gt0 (rank_abelem abelP1) dimP1 p_rank_gt0 -pi_of_exponent.
- rewrite expU0 pi_of_exponent (piSg (setIS M (Fcore_sub L))) //=.
- by rewrite setIC -p_rank_gt0 -(p_rank_Sylow sylP0_HM) prankP0.
- have frobKP1: [Frobenius K <*> P1 = K ><| P1].
- exact: Frobenius_subr ntP1 sP1U0 frobKU0.
- have sP1M: P1 \subset M.
- by rewrite (subset_trans (subset_trans sP1U0 sU0ML)) ?subsetIl.
- have [y My sP1yP0] := Sylow_Jsub sylP0 sP1M (abelem_pgroup abelP1).
- apply: contra ntK => cP0K; rewrite -(Frobenius_trivg_cent frobKP1).
- rewrite (setIidPl _) // -(conjSg _ _ y) (normsP _ y My) ?gFnorm //.
- by rewrite -centJ centsC (subset_trans sP1yP0).
- by have [] := Frobenius_Wielandt_fixpoint frobP0A nKP0a coK_P0A solK.
-have [_ [U1 [_ abU1 sCK_U1]] _] := MtypeF.
-have [ntx /(subsetP (Ohm_sub 1 _))P0x] := setD1P P0_1s_x.
-have cAx: A \subset 'C[x].
- rewrite -cent_set1 (sub_abelian_cent2 abU1) //.
- have [y /setIP[Ky cAy] nty] := trivgPn _ nreg_KA.
- apply: subset_trans (sCK_U1 y _); last by rewrite !inE nty.
- by rewrite subsetI sub_cent1 cAy cycle_subG !inE Mz Lz.
- have [y /setIP[Ky cxy] notK'y] := subsetPn not_sCxK'.
- apply: subset_trans (sCK_U1 y _); last by rewrite !inE (group1_contra notK'y).
- rewrite sub1set inE cent1C cxy (subsetP _ x P0x) //.
- by rewrite subsetI sP0M (subset_trans sP0H) ?gFsub.
-have [_ _ _ regHL] := Frobenius_kerP frobL.
-rewrite (piSg (regHL x _)) //; first by rewrite !inE ntx (subsetP sP0H).
-by rewrite mem_primes pr_q cardG_gt0 -oz cardSg // subsetI cycle_subG Lz.
-Qed.
-
-Let E := sval (sigW (existsP frobL)).
-Let e := #|E|.
-
-Let defL : H ><| E = L.
-Proof. by rewrite /E; case: (sigW _) => E0 /=/Frobenius_context[]. Qed.
-
-Let Ecyclic_le_p : cyclic E /\ (e %| p.-1) || (e %| p.+1).
-Proof.
-pose P := 'O_p(H)%G; pose T := 'Ohm_1('Z(P))%G.
-have sylP: p.-Sylow(H) P := nilpotent_pcore_Hall p (Fcore_nil L).
-have [[sPH pP _] [sP0M pP0 _]] := (and3P sylP, and3P sylP0).
-have sP0P: P0 \subset P by rewrite (sub_normal_Hall sylP) ?pcore_normal.
-have defP0: P :&: M = P0.
- rewrite [P :&: M](sub_pHall sylP0 (pgroupS _ pP)) ?subsetIl ?subsetIr //.
- by rewrite subsetI sP0P.
-have [ntx P01x] := setD1P P0_1s_x; have P0x := subsetP (Ohm_sub 1 P0) x P01x.
-have sZP0: 'Z(P) \subset P0.
- apply: subset_trans (_ : 'C_P[x] \subset P0).
- by rewrite -cent_set1 setIS ?centS // sub1set (subsetP sP0P).
- by rewrite -defP0 setIS // (subset_trans _ sNxM) // cents_norm ?cent_cycle.
-have ntT: T :!=: 1%g.
- rewrite Ohm1_eq1 center_nil_eq1 ?(pgroup_nil pP) //.
- by apply/trivgPn; exists x; rewrite ?(subsetP sP0P).
-have [_ sEL _ nHE tiHE] := sdprod_context defL.
-have{ntT} [V minV sVT]: {V : {group gT} | minnormal V E & V \subset T}.
- by apply: mingroup_exists; rewrite ntT 3?gFnorm_trans.
-have abelT: p.-abelem T by rewrite Ohm1_abelem ?center_abelian ?(pgroupS sZP0).
-have sTP0: T \subset P0 by apply: gFsub_trans.
-have rankT: ('r_p(T) <= 2)%N by rewrite -prankP0 p_rankS.
-have [abelV /andP[ntV nVE]] := (abelemS sVT abelT, mingroupp minV).
-have pV := abelem_pgroup abelV; have [pr_p _ [n oV]] := pgroup_pdiv pV ntV.
-have frobHE: [Frobenius L = H ><| E] by rewrite /E; case: (sigW _).
-have: ('r_p(V) <= 2)%N by rewrite (leq_trans (p_rankS p sVT)).
-rewrite (p_rank_abelem abelV) // oV pfactorK // ltnS leq_eqVlt ltnS leqn0 orbC.
-have sVH: V \subset H by rewrite (subset_trans sVT) 3?gFsub_trans.
-have regVE: 'C_E(V) = 1%g.
- exact: cent_semiregular (Frobenius_reg_compl frobHE) sVH ntV.
-case/pred2P=> dimV; rewrite {n}dimV in oV.
- pose f := [morphism of restrm nVE (conj_aut V)].
- have injf: 'injm f by rewrite ker_restrm ker_conj_aut regVE.
- rewrite /e -(injm_cyclic injf) // -(card_injm injf) //.
- have AutE: f @* E \subset Aut V by rewrite im_restrm Aut_conj_aut.
- rewrite (cyclicS AutE) ?Aut_prime_cyclic ?oV // (dvdn_trans (cardSg AutE)) //.
- by rewrite card_Aut_cyclic ?prime_cyclic ?oV // totient_pfactor ?muln1.
-have defV: V :=: 'Ohm_1(P0).
- apply/eqP; rewrite eqEcard (subset_trans sVT) ?OhmS //= oV -prankP0.
- by rewrite p_rank_abelian // -card_pgroup ?(pgroupS (Ohm_sub 1 _)).
-pose rE := abelem_repr abelV ntV nVE.
-have ffulE: mx_faithful rE by apply: abelem_mx_faithful.
-have p'E: [char 'F_p]^'.-group E.
- rewrite (eq_p'group _ (charf_eq (char_Fp pr_p))) (coprime_p'group _ pV) //.
- by rewrite coprime_sym (coprimeSg sVH) ?(Frobenius_coprime frobHE).
-have dimV: 'dim V = 2 by rewrite (dim_abelemE abelV) // oV pfactorK.
-have cEE: abelian E.
- by rewrite dimV in (rE) ffulE; apply: charf'_GL2_abelian (mFT_odd E) ffulE _.
-have Enonscalar y: y \in E -> y != 1%g -> ~~ is_scalar_mx (rE y).
- move=> Ey; apply: contra => /is_scalar_mxP[a rEy]; simpl in a.
- have nXy: y \in 'N(<[x]>).
- rewrite !inE -cycleJ cycle_subG; apply/cycleP; exists a.
- have [Vx nVy]: x \in V /\ y \in 'N(V) by rewrite (subsetP nVE) ?defV.
- apply: (@abelem_rV_inj p _ V); rewrite ?groupX ?memJ_norm ?morphX //=.
- by rewrite zmodXgE -scaler_nat natr_Zp -mul_mx_scalar -rEy -abelem_rV_J.
- rewrite -in_set1 -set1gE -tiHE inE (subsetP sML_H) //.
- by rewrite inE (subsetP sEL) // (subsetP sNxM).
-have /trivgPn[y nty Ey]: E != 1%G by have [] := Frobenius_context frobHE.
-have cErEy: centgmx rE (rE y).
- by apply/centgmxP=> z Ez; rewrite -!repr_mxM // (centsP cEE).
-have irrE: mx_irreducible rE by apply/abelem_mx_irrP.
-have charFp2: p \in [char MatrixGenField.gen_finFieldType irrE cErEy].
- apply: (rmorph_char (MatrixGenField.gen_rmorphism irrE cErEy)).
- exact: char_Fp.
-pose Fp2 := primeChar_finFieldType charFp2.
-pose n1 := MatrixGenField.gen_dim (rE y).
-pose rEp2 : mx_representation Fp2 E n1 := MatrixGenField.gen_repr irrE cErEy.
-have n1_gt0: (0 < n1)%N := MatrixGenField.gen_dim_gt0 irrE cErEy.
-have n1_eq1: n1 = 1%N.
- pose d := degree_mxminpoly (rE y).
- have dgt0: (0 < d)%N := mxminpoly_nonconstant _.
- apply/eqP; rewrite eqn_leq n1_gt0 andbT -(leq_pmul2r dgt0).
- rewrite (MatrixGenField.gen_dim_factor irrE cErEy) mul1n dimV.
- by rewrite ltnNge mxminpoly_linear_is_scalar Enonscalar.
-have oFp2: #|Fp2| = (p ^ 2)%N.
- rewrite card_sub card_matrix card_Fp // -{1}n1_eq1.
- by rewrite (MatrixGenField.gen_dim_factor irrE cErEy) dimV.
-have [f rfK fK]: bijective (@scalar_mx Fp2 n1).
- rewrite n1_eq1.
- by exists (fun A : 'M_1 => A 0 0) => ?; rewrite ?mxE -?mx11_scalar.
-pose g z : {unit Fp2} := insubd (1%g : {unit Fp2}) (f (rEp2 z)).
-have val_g z : z \in E -> (val (g z))%:M = rEp2 z.
- move=> Ez; rewrite insubdK ?fK //; have:= repr_mx_unit rEp2 Ez.
- by rewrite -{1}[rEp2 z]fK unitmxE det_scalar !unitfE expf_eq0 n1_gt0.
-have ffulEp2: mx_faithful rEp2 by rewrite MatrixGenField.gen_mx_faithful.
-have gM: {in E &, {morph g: z1 z2 / z1 * z2}}%g.
- move=> z1 z2 Ez1 Ez2 /=; apply/val_inj/(can_inj rfK).
- rewrite {1}(val_g _ (groupM Ez1 Ez2)) scalar_mxM.
- by rewrite {1}(val_g _ Ez1) (val_g _ Ez2) repr_mxM.
-have inj_g: 'injm (Morphism gM).
- apply/injmP=> z1 z2 Ez1 Ez2 /(congr1 (@scalar_mx _ n1 \o val)).
- by rewrite /= {1}(val_g _ Ez1) (val_g _ Ez2); apply: mx_faithful_inj.
-split; first by rewrite -(injm_cyclic inj_g) ?field_unit_group_cyclic.
-have: e %| #|[set: {unit Fp2}]|.
- by rewrite /e -(card_injm inj_g) ?cardSg ?subsetT.
-rewrite card_finField_unit oFp2 -!subn1 (subn_sqr p 1) addn1.
-rewrite orbC Gauss_dvdr; first by move->.
-rewrite coprime_sym coprime_has_primes ?subn_gt0 ?prime_gt1 ?cardG_gt0 //.
-apply/hasPn=> r; rewrite /= !mem_primes subn_gt0 prime_gt1 ?cardG_gt0 //=.
-case/andP=> pr_r /Cauchy[//|z Ez oz]; rewrite pr_r /= subn1.
-apply: contra (Enonscalar z Ez _); last by rewrite -order_gt1 oz prime_gt1.
-rewrite -oz -(order_injm inj_g) // order_dvdn -val_eqE => /eqP gz_p1_eq1.
-have /vlineP[a Dgz]: val (g z) \in 1%VS.
- rewrite Fermat's_little_theorem dimv1 card_Fp //=.
- by rewrite -[(p ^ 1)%N]prednK ?prime_gt0 // exprS -val_unitX gz_p1_eq1 mulr1.
-apply/is_scalar_mxP; exists a; apply/row_matrixP=> i.
-apply: (can_inj ((MatrixGenField.in_genK irrE cErEy) _)).
-rewrite !rowE mul_mx_scalar MatrixGenField.in_genZ MatrixGenField.in_genJ //.
-rewrite -val_g // Dgz mul_mx_scalar; congr (_ *: _).
-rewrite -(natr_Zp a) scaler_nat.
-by rewrite -(rmorph_nat (MatrixGenField.gen_rmorphism irrE cErEy)).
-Qed.
-
-Let calS := seqIndD H L H 1.
-Notation tauL := (FT_Dade maxL).
-Notation tauL_H := (FT_DadeF maxL).
-Notation rhoL := (invDade (FT_DadeF_hyp maxL)).
-
-Section Twelve_13_to_16.
-
-Variables (tau1 : {additive 'CF(L) -> 'CF(G)}) (chi : 'CF(L)).
-Hypothesis cohS : coherent_with calS L^# tauL tau1.
-Hypotheses (Schi : chi \in calS) (chi1 : chi 1%g = e%:R).
-Let psi := tau1 chi.
-
-Let cohS_H : coherent_with calS L^# tauL_H tau1.
-Proof.
-have [? Dtau] := cohS; split=> // xi Sxi; have /zcharD1_seqInd_on Hxi := Sxi.
-by rewrite Dtau // FT_DadeF_E ?FT_DadeE ?(cfun_onS (Fcore_sub_FTsupp _)) ?Hxi.
-Qed.
-
-(* This is Peterfalvi (12.14). *)
-Let rhoL_psi : {in K, forall g, psi (x * g)%g = chi x} /\ rhoL psi x = chi x.
-Proof.
-have not_LGM: gval M \notin L :^: G.
- apply: contraL p'K => /= /imsetP[z _ ->]; rewrite FcoreJ pgroupJ.
- by rewrite p'groupEpi (piSg sP0H) // -p_rank_gt0 prankP0.
-pose rmR := sval (Rgen maxL Ltype1).
-have Zpsi: psi \in 'Z[rmR chi].
- case: (Rgen _ _) @rmR => /= rmR []; rewrite -/calS => scohS _ _.
- have sSS: cfConjC_subset calS calS by apply: seqInd_conjC_subset1.
- have [B /mem_subseq sBR Dpsi] := mem_coherent_sum_subseq scohS sSS cohS Schi.
- by rewrite [psi]Dpsi big_seq rpred_sum // => xi /sBR/mem_zchar->.
-have [ntx /(subsetP (Ohm_sub 1 P0))P0x] := setD1P P0_1s_x.
-have Mx: x \in M by rewrite (subsetP sNxM) // -cycle_subG normG.
-have psi_xK: {in K, forall g, psi (x * g)%g = psi x}.
- move=> g Kg; have{Kg}: (x * g \in x *: K)%g by rewrite mem_lcoset mulKg.
- apply: FTtype1_ortho_constant => [phi calMphi|].
- apply/orthoPl=> nu /memv_span; apply: {nu}span_orthogonal (zchar_span Zpsi).
- exact: FTtype1_seqInd_ortho.
- rewrite inE -/K (contra _ ntx) // => Kx.
- rewrite -(consttC p x) !(constt1P _) ?mulg1 ?(mem_p_elt p'K) //.
- by rewrite p_eltNK (mem_p_elt (pHall_pgroup sylP0)).
-have H1x: x \in H^# by rewrite !inE ntx (subsetP sP0H).
-have rhoL_psi_x: rhoL psi x = psi x.
- rewrite cfunElock mulrb def_FTsignalizerF H1x //=.
- apply: canLR (mulKf (neq0CG _)) _; rewrite mulr_natl -sumr_const /=.
- apply: eq_bigr => g; rewrite /'R_L (negPf not_sCxL) /= setIC => /setIP[cxz].
- have Dx: x \in [set y in 'A0(L) | ~~ ('C[y] \subset L)].
- by rewrite inE (subsetP (Fcore_sub_FTsupp0 _)).
- have [_ [_ /(_ x Dx)defNx] _] := FTsupport_facts maxL.
- rewrite (cent1P cxz) -(eq_uniq_mmax defNx maxM) => [/psi_xK//|].
- by rewrite /= -cent_cycle (subset_trans (cent_sub _)).
-suffices <-: rhoL psi x = chi x by split=> // g /psi_xK->.
-have irrS: {subset calS <= irr L} by have [] := FT_Frobenius_coherence maxL.
-have irr_chi := irrS _ Schi.
-have Sgt1: (1 < size calS)%N by apply: seqInd_nontrivial Schi; rewrite ?mFT_odd.
-have De: #|L : H| = e by rewrite -(index_sdprod defL).
-have [] := Dade_Ind1_sub_lin cohS_H Sgt1 irr_chi Schi; rewrite ?De //.
-rewrite -/tauL_H -/calS -/psi /=; set alpha := 'Ind 1 - chi.
-case=> o_tau_1 tau_alpha_1 _ [Gamma [o_tau1_Ga _ [a Za tau_alpha] _] _].
-have [[Itau1 _] Dtau1] := cohS_H.
-have o1calS: orthonormal calS.
- by rewrite (sub_orthonormal irrS) ?seqInd_uniq ?irr_orthonormal.
-have norm_alpha: '[tauL_H alpha] = e%:R + 1.
- rewrite Dade_isometry ?(cfInd1_sub_lin_on _ Schi) ?De //.
- rewrite cfnormBd; last by rewrite cfdotC (seqInd_ortho_Ind1 _ _ Schi) ?conjC0.
- by rewrite cfnorm_Ind_cfun1 // De irrWnorm.
-pose h := #|H|; have ub_a: a ^+ 2 * ((h%:R - 1) / e%:R) - 2%:R * a <= e%:R - 1.
- rewrite -[h%:R - 1](mulKf (neq0CiG L H)) -sum_seqIndC1_square // De -/calS.
- rewrite -[lhs in lhs - 1](addrK 1) -norm_alpha -[tauL_H _](subrK 1).
- rewrite cfnormDd; last by rewrite cfdotBl tau_alpha_1 cfnorm1 subrr.
- rewrite cfnorm1 addrK [in '[_]]addrC {}tau_alpha -!addrA addKr addrCA addrA.
- rewrite ler_subr_addr cfnormDd ?ler_paddr ?cfnorm_ge0 //; last first.
- rewrite cfdotBl cfdotZl cfdot_suml (orthoPr o_tau1_Ga) ?map_f // subr0.
- rewrite big1_seq ?mulr0 // => xi Sxi; rewrite cfdotZl.
- by rewrite (orthoPr o_tau1_Ga) ?map_f ?mulr0.
- rewrite cfnormB cfnormZ Cint_normK // cfdotZl cfproj_sum_orthonormal //.
- rewrite cfnorm_sum_orthonormal // Itau1 ?mem_zchar // irrWnorm ?irrS // divr1.
- rewrite chi1 divff ?neq0CG // mulr1 conj_Cint // addrAC mulr_natl.
- rewrite !ler_add2r !(mulr_suml, mulr_sumr) !big_seq ler_sum // => xi Sxi.
- rewrite irrWnorm ?irrS // !divr1 (mulrAC _^-1) -expr2 -!exprMn (mulrC _^-1).
- by rewrite normf_div normr_nat norm_Cnat // (Cnat_seqInd1 Sxi).
-have [pr_p p_dv_M]: prime p /\ p %| #|M|.
- have: p \in \pi(M) by rewrite -p_rank_gt0 ltnW.
- by rewrite mem_primes => /and3P[].
-have odd_p: odd p by rewrite (dvdn_odd p_dv_M) ?mFT_odd.
-have pgt2: (2 < p)%N := odd_prime_gt2 odd_p pr_p.
-have ub_e: e%:R <= (p%:R + 1) / 2%:R :> algC.
- rewrite ler_pdivl_mulr ?ltr0n // -natrM -mulrSr leC_nat muln2.
- have [b e_dv_pb]: exists b : bool, e %| (b.*2 + p).-1.
- by have [_ /orP[]] := Ecyclic_le_p; [exists false | exists true].
- rewrite -ltnS (@leq_trans (b.*2 + p)) //; last first.
- by rewrite (leq_add2r p _ 2) (leq_double _ 1) leq_b1.
- rewrite dvdn_double_ltn ?mFT_odd //; first by rewrite odd_add odd_double.
- by rewrite -(subnKC pgt2) !addnS.
-have lb_h: p%:R ^+ 2 <= h%:R :> algC.
- rewrite -natrX leC_nat dvdn_leq ?pfactor_dvdn ?cardG_gt0 //.
- by rewrite -prankP0 (leq_trans (p_rankS p sP0H)) ?p_rank_le_logn.
-have{ub_a ub_e} ub_a: p.-1.*2%:R * a ^+ 2 - 2%:R * a <= p.-1%:R / 2%:R :> algC.
- apply: ler_trans (ler_trans ub_a _); last first.
- rewrite -subn1 -subSS natrB ?ltnS ?prime_gt0 // mulrSr mulrBl.
- by rewrite divff ?pnatr_eq0 ?ler_add2r.
- rewrite ler_add2r mulrC -Cint_normK // -!mulrA !ler_wpmul2l ?normr_ge0 //.
- rewrite ler_pdivl_mulr ?gt0CG // ler_subr_addr (ler_trans _ lb_h) //.
- rewrite -muln2 natrM -mulrA -ler_subr_addr subr_sqr_1.
- rewrite -(natrB _ (prime_gt0 pr_p)) subn1 ler_wpmul2l ?ler0n //.
- by rewrite mulrC -ler_pdivl_mulr ?ltr0n.
-have a0: a = 0.
- apply: contraTeq ub_a => nz_a; rewrite ltr_geF // ltr_pdivr_mulr ?ltr0n //.
- rewrite mulrC -{1}mulr_natl -muln2 natrM -mulrA mulrBr mulrCA ltr_subr_addl.
- rewrite -ltr_subr_addr -mulrBr mulr_natl mulrA -expr2 -exprMn.
- apply: ltr_le_trans (_ : 2%:R * ((a *+ 2) ^+ 2 - 1) <= _); last first.
- rewrite (mulr_natl a 2) ler_wpmul2r // ?subr_ge0.
- by rewrite sqr_Cint_ge1 ?rpredMn // mulrn_eq0.
- by rewrite leC_nat -subn1 ltn_subRL.
- rewrite -(@ltr_pmul2l _ 2%:R) ?ltr0n // !mulrA -expr2 mulrBr -exprMn mulr1.
- rewrite -natrX 2!mulrnAr -[in rhs in _ < rhs]mulrnAl -mulrnA.
- rewrite ltr_subr_addl -ltr_subr_addr -(ltr_add2r 1) -mulrSr -sqrrB1.
- rewrite -Cint_normK ?rpredB ?rpredM ?rpred_nat ?rpred1 //.
- rewrite (@ltr_le_trans _ (3 ^ 2)%:R) ?ltC_nat // natrX.
- rewrite ler_sqr ?qualifE ?ler0n ?normr_ge0 //.
- rewrite (ler_trans _ (ler_sub_dist _ _)) // normr1 normrM normr_nat.
- by rewrite ler_subr_addl -mulrS mulr_natl ler_pmuln2r ?norm_Cint_ge1.
-pose chi0 := 'Ind[L, H] 1.
-have defS1: perm_eq (seqIndT H L) (chi0 :: calS).
- by rewrite [calS]seqIndC1_rem // perm_to_rem ?seqIndT_Ind1.
-have [c _ -> // _] := invDade_seqInd_sum (FT_DadeF_hyp maxL) psi defS1.
-have psi_alpha_1: '[psi, tauL_H alpha] = -1.
- rewrite tau_alpha a0 scale0r addr0 addrC addrA cfdotBr cfdotDr.
- rewrite (orthoPr o_tau_1) ?(orthoPr o_tau1_Ga) ?map_f // !add0r.
- by rewrite Itau1 ?mem_zchar ?map_f // irrWnorm ?irrS.
-rewrite (bigD1_seq chi) ?seqInd_uniq //= big1_seq => [|xi /andP[chi'xi Sxi]].
- rewrite addr0 -cfdotC chi1 cfInd1 ?gFsub // cfun11 mulr1 De divff ?neq0CG //.
- rewrite scale1r -opprB linearN cfdotNr psi_alpha_1 opprK.
- by rewrite irrWnorm ?irrS // divr1 mul1r.
-rewrite -cfdotC cfInd1 ?gFsub // cfun11 mulr1.
-rewrite /chi0 -(canLR (subrK _) (erefl alpha)) scalerDr opprD addrCA -scaleNr.
-rewrite linearD linearZ /= cfdotDr cfdotZr psi_alpha_1 mulrN1 rmorphN opprK.
-rewrite -/tauL_H -Dtau1 ?zcharD1_seqInd ?(seqInd_sub_lin_vchar _ Schi) ?De //.
-have [_ ooS] := orthonormalP o1calS.
-rewrite raddfB cfdotBr Itau1 ?mem_zchar // ooS // mulrb ifN_eqC // add0r.
-rewrite -De raddfZ_Cnat ?(dvd_index_seqInd1 _ Sxi) // De cfdotZr.
-by rewrite Itau1 ?mem_zchar ?ooS // eqxx mulr1 subrr !mul0r.
-Qed.
-
-Let rhoM := invDade (FT_DadeF_hyp maxM).
-
-Let rhoM_psi :
- [/\ {in K^#, rhoM psi =1 psi},
- {in K :\: K' &, forall g1 g2, psi g1 = psi g2}
- & {in K :\: K', forall g, psi g \in Cint}].
-Proof.
-have pr_p: prime p.
- by have:= ltnW prankM; rewrite p_rank_gt0 mem_primes => /andP[].
-have [sP0M pP0 _] := and3P sylP0; have abelP01 := Ohm1_abelem pP0 abP0.
-have not_frobM: ~~ [Frobenius M with kernel K].
- apply: contraL prankM => /(set_Frobenius_compl defM)frobM.
- rewrite -leqNgt -(p_rank_Sylow sylP0) -p_rank_Ohm1 p_rank_abelem //.
- rewrite -abelem_cyclic // (cyclicS (Ohm_sub _ _)) //.
- have sP0ML: P0 \subset M :&: L.
- by rewrite subsetI sP0M (subset_trans sP0H) ?gFsub.
- rewrite nil_Zgroup_cyclic ?(pgroup_nil pP0) // (ZgroupS sP0ML) //.
- have [U [MtypeF _]] := FTtypeP 1 maxM Mtype1.
- by have{MtypeF} /typeF_context[_ <- _] := compl_of_typeF defM MtypeF.
-pose rmR := sval (Rgen maxL Ltype1).
-have Zpsi: psi \in 'Z[rmR chi].
- case: (Rgen _ _) @rmR => /= rmR []; rewrite -/calS => scohS _ _.
- have sSS: cfConjC_subset calS calS by apply: seqInd_conjC_subset1.
- have [B /mem_subseq sBR Dpsi] := mem_coherent_sum_subseq scohS sSS cohS Schi.
- by rewrite [psi]Dpsi big_seq rpred_sum // => xi /sBR/mem_zchar->.
-have part1: {in K^#, rhoM psi =1 psi}.
- move=> g K1g; rewrite /= cfunElock mulrb def_FTsignalizerF K1g //= /'R_M.
- have [_ | sCg'M] := ifPn; first by rewrite cards1 big_set1 invr1 mul1r mul1g.
- have Dg: g \in [set z in 'A0(M) | ~~ ('C[z] \subset M)].
- by rewrite inE (subsetP (Fcore_sub_FTsupp0 _)).
- have [_ [_ /(_ g Dg)maxN] /(_ g Dg)[_ _ ANg Ntype12]] := FTsupport_facts maxM.
- have{maxN} [maxN sCgN] := mem_uniq_mmax maxN.
- have{Ntype12} Ntype1: FTtype 'N[g] == 1%N.
- have [] := Ntype12; rewrite -(mem_iota 1 2) !inE => /orP[// | Ntype2] frobM.
- by have /negP[] := not_frobM; apply/frobM/Ntype2.
- have not_frobN: ~~ [Frobenius 'N[g] with kernel 'N[g]`_\F].
- apply/Frobenius_kerP=> [[_ _ _ regFN]].
- have [/bigcupP[y]] := setDP ANg; rewrite FTsupp1_type1 Ntype1 //.
- by move=> /regFN sCyF /setD1P[ntg cNy_g]; rewrite 2!inE ntg (subsetP sCyF).
- have LG'N: gval 'N[g] \notin L :^: G.
- by apply: contra not_frobN => /imsetP[y _ ->]; rewrite FcoreJ FrobeniusJker.
- suff /(eq_bigr _)->: {in 'C_('N[g]`_\F)[g], forall z, psi (z * g)%g = psi g}.
- by rewrite sumr_const -[psi g *+ _]mulr_natl mulKf ?neq0CG.
- move=> z /setIP[Fz /cent1P cgz].
- have{Fz cgz}: (z * g \in g *: 'N[g]`_\F)%g by rewrite cgz mem_lcoset mulKg.
- apply: FTtype1_ortho_constant => [phi calMphi|].
- apply/orthoPl=> nu /memv_span; apply: span_orthogonal (zchar_span Zpsi).
- exact: FTtype1_seqInd_ortho.
- have [/(subsetP (FTsupp_sub _))/setD1P[ntg Ng]] := setDP ANg.
- by rewrite FTsupp1_type1 //= !inE ntg Ng andbT.
-have part2: {in K :\: K' &, forall g1 g2, psi g1 = psi g2}.
- have /subsetP sK1_K: K :\: K' \subset K^# by rewrite setDS ?sub1G.
- have LG'M: gval M \notin L :^: G.
- apply: contra not_frobM => /imsetP[y _ /= ->].
- by rewrite FcoreJ FrobeniusJker.
- move=> g1 g2 Kg1 Kg2; rewrite /= -!part1 ?sK1_K //.
- apply: FtypeI_invDade_ortho_constant => // phi calMphi.
- apply/orthoPl=> nu /memv_span; apply: span_orthogonal (zchar_span Zpsi).
- exact: FTtype1_seqInd_ortho.
-split=> // g KK'g; pose nKK' : algC := #|K :\: K'|%:R.
-pose nK : algC := #|K|%:R; pose nK' : algC := #|K'|%:R.
-have nzKK': nKK' != 0 by rewrite pnatr_eq0 cards_eq0; apply/set0Pn; exists g.
-have Dpsi_g: nK * '['Res[K] psi, 1] = nK' * '['Res[K'] psi, 1] + nKK' * psi g.
- rewrite !mulVKf ?neq0CG // (big_setID K') (setIidPr (gFsub _ _)) /=.
- rewrite mulr_natl -sumr_const; congr (_ + _); apply: eq_bigr => z K'z.
- by rewrite !cfun1E !cfResE ?subsetT ?(subsetP (der_sub 1 K)) ?K'z.
- have [Kz _] := setDP K'z; rewrite cfun1E Kz conjC1 mulr1 cfResE ?subsetT //.
- exact: part2.
-have{Zpsi} Zpsi: psi \in 'Z[irr G] by have [[_ ->//]] := cohS; apply: mem_zchar.
-have Qpsi1 R: '['Res[R] psi, 1] \in Crat.
- by rewrite rpred_Cint ?Cint_cfdot_vchar ?rpred1 ?cfRes_vchar.
-apply: Cint_rat_Aint (Aint_vchar g Zpsi).
-rewrite -[psi g](mulKf nzKK') -(canLR (addKr _) Dpsi_g) addrC mulrC.
-by rewrite rpred_div ?rpredB 1?rpredM ?rpred_nat ?Qpsi1.
-Qed.
-
-(* This is the main part of Peterfalvi (12.16). *)
-Lemma FTtype1_nonFrobenius_witness_contradiction : False.
-Proof.
-have pr_p: prime p.
- by have:= ltnW prankM; rewrite p_rank_gt0 mem_primes => /andP[].
-have [sP0M pP0 _] := and3P sylP0; have abelP01 := Ohm1_abelem pP0 abP0.
-have [ntx P01x] := setD1P P0_1s_x.
-have ox: #[x] = p := abelem_order_p abelP01 P01x ntx.
-have odd_p: odd p by rewrite -ox mFT_odd.
-have pgt2 := odd_prime_gt2 odd_p pr_p.
-have Zpsi: psi \in 'Z[irr G] by have [[_ ->//]] := cohS; apply: mem_zchar.
-have lb_psiM: '[rhoM psi] >= #|K :\: K'|%:R / #|M|%:R * e.-1%:R ^+ 2.
- have [g /setIP[Kg cxg] notK'g] := subsetPn not_sCxK'.
- have KK'g: g \in K :\: K' by rewrite !inE notK'g.
- have [rhoMid /(_ _ g _ KK'g)psiKK'_id /(_ g KK'g)Zpsig] := rhoM_psi.
- rewrite -mulrA mulrCA ler_pmul2l ?invr_gt0 ?gt0CG // mulr_natl.
- rewrite (big_setID (K :\: K')) (setIidPr _) ?subDset ?subsetU ?gFsub ?orbT //.
- rewrite ler_paddr ?sumr_ge0 // => [z _|]; first exact: mul_conjC_ge0.
- rewrite -sumr_const ler_sum // => z KK'z.
- rewrite {}rhoMid ?(subsetP _ z KK'z) ?setDS ?sub1G // {}psiKK'_id {z KK'z}//.
- rewrite -normCK ler_sqr ?qualifE ?ler0n ?normr_ge0 //.
- have [eps prim_eps] := C_prim_root_exists (prime_gt0 pr_p).
- have psi_xg: (psi (x * g)%g == e%:R %[mod 1 - eps])%A.
- have [-> // _] := rhoL_psi; rewrite -[x]mulg1 -chi1.
- rewrite (vchar_ker_mod_prim prim_eps) ?group1 ?(seqInd_vcharW Schi) //.
- by rewrite (subsetP _ _ P01x) // gFsub_trans ?(subset_trans sP0H) ?gFsub.
- have{psi_xg} /dvdCP[a Za /(canRL (subrK _))->]: (p %| psi g - e%:R)%C.
- rewrite (int_eqAmod_prime_prim prim_eps) ?rpredB ?rpred_nat // eqAmod0.
- apply: eqAmod_trans psi_xg; rewrite eqAmod_sym.
- by rewrite (vchar_ker_mod_prim prim_eps) ?in_setT.
- have [-> | nz_a] := eqVneq a 0.
- by rewrite mul0r add0r normr_nat leC_nat leq_pred.
- rewrite -[e%:R]opprK (ler_trans _ (ler_sub_dist _ _)) // normrN normrM.
- rewrite ler_subr_addl !normr_nat -natrD.
- apply: ler_trans (_ : 1 * p%:R <= _); last first.
- by rewrite ler_wpmul2r ?ler0n ?norm_Cint_ge1.
- rewrite mul1r leC_nat -subn1 addnBA ?cardG_gt0 // leq_subLR addnn -ltnS.
- have [b e_dv_pb]: exists b : bool, e %| (b.*2 + p).-1.
- by have [_ /orP[]] := Ecyclic_le_p; [exists false | exists true].
- apply: (@leq_trans (b.*2 + p)); last first.
- by rewrite (leq_add2r p _ 2) (leq_double b 1) leq_b1.
- rewrite dvdn_double_ltn ?odd_add ?mFT_odd ?odd_double //.
- by rewrite addnC -(subnKC pgt2).
-have irrS: {subset calS <= irr L} by have [] := FT_Frobenius_coherence maxL.
-have lb_psiL: '[rhoL psi] >= 1 - e%:R / #|H|%:R.
- have irr_chi := irrS _ Schi.
- have Sgt1: (1 < size calS)%N by apply: seqInd_nontrivial (mFT_odd L) _ Schi.
- have De: #|L : H| = e by rewrite -(index_sdprod defL).
- have [|_] := Dade_Ind1_sub_lin cohS_H Sgt1 irr_chi Schi; rewrite De //=.
- by rewrite -De odd_Frobenius_index_ler ?mFT_odd // => -[_ _ []//].
-have tiA1_LM: [disjoint 'A1~(L) & 'A1~(M)].
- apply: FT_Dade1_support_disjoint => //.
- apply: contraL p'K => /= /imsetP[z _ ->]; rewrite FcoreJ pgroupJ.
- by rewrite p'groupEpi (piSg sP0H) // -p_rank_gt0 prankP0.
-have{tiA1_LM} ub_rhoML: '[rhoM psi] + '[rhoL psi] < 1.
- have [[Itau1 Ztau1] _] := cohS.
- have n1psi: '[psi] = 1 by rewrite Itau1 ?mem_zchar ?irrWnorm ?irrS.
- rewrite -n1psi (cfnormE (cfun_onG psi)) (big_setD1 1%g) ?group1 //=.
- rewrite mulrDr ltr_spaddl 1?mulr_gt0 ?invr_gt0 ?gt0CG ?exprn_gt0 //.
- have /dirrP[s [i ->]]: psi \in dirr G.
- by rewrite dirrE Ztau1 ?mem_zchar ?n1psi /=.
- by rewrite cfunE normrMsign normr_gt0 irr1_neq0.
- rewrite (big_setID 'A1~(M)) mulrDr ler_add //=.
- rewrite FTsupp1_type1 // -FT_DadeF_supportE.
- by rewrite (setIidPr _) ?Dade_support_subD1 ?leC_cfnorm_invDade_support.
- rewrite (big_setID 'A1~(L)) mulrDr ler_paddr //=.
- rewrite mulr_ge0 ?invr_ge0 ?ler0n ?sumr_ge0 // => z _.
- by rewrite exprn_ge0 ?normr_ge0.
- rewrite (setIidPr _); last first.
- by rewrite subsetD tiA1_LM -FT_Dade1_supportE Dade_support_subD1.
- by rewrite FTsupp1_type1 // -FT_DadeF_supportE leC_cfnorm_invDade_support.
-have ubM: (#|M| <= #|K| * #|H|)%N.
- by rewrite -(sdprod_card defM) leq_mul // subset_leq_card.
-have{lb_psiM lb_psiL ub_rhoML ubM} ubK: (#|K / K'|%g < 4)%N.
- rewrite card_quotient ?gFnorm -?ltC_nat //.
- rewrite -ltf_pinv ?qualifE ?gt0CiG ?ltr0n // natf_indexg ?gFsub //.
- rewrite invfM invrK mulrC -(subrK #|K|%:R #|K'|%:R) mulrDl divff ?neq0CG //.
- rewrite -opprB mulNr addrC ltr_subr_addl -ltr_subr_addr.
- have /Frobenius_context[_ _ ntE _ _] := set_Frobenius_compl defL frobL.
- have egt2: (2 < e)%N by rewrite odd_geq ?mFT_odd ?cardG_gt1.
- have e1_gt0: 0 < e.-1%:R :> algC by rewrite ltr0n -(subnKC egt2).
- apply: ltr_le_trans (_ : e%:R / e.-1%:R ^+ 2 <= _).
- rewrite ltr_pdivl_mulr ?exprn_gt0 //.
- rewrite -(@ltr_pmul2r _ #|H|%:R^-1) ?invr_gt0 ?gt0CG // mulrAC.
- rewrite -(ltr_add2r 1) -ltr_subl_addl -addrA.
- apply: ler_lt_trans ub_rhoML; rewrite ler_add //.
- apply: ler_trans lb_psiM; rewrite -natrX ler_wpmul2r ?ler0n //.
- rewrite cardsD (setIidPr _) ?gFsub // -natrB ?subset_leq_card ?gFsub //.
- rewrite -mulrA ler_wpmul2l ?ler0n //.
- rewrite ler_pdivr_mulr ?gt0CG // ler_pdivl_mull ?gt0CG //.
- by rewrite ler_pdivr_mulr ?gt0CG // mulrC -natrM leC_nat.
- rewrite -(ler_pmul2l (gt0CG E)) -/e mulrA -expr2 invfM -exprMn.
- apply: ler_trans (_ : (1 + 2%:R^-1) ^+ 2 <= _).
- rewrite ler_sqr ?rpred_div ?rpredD ?rpred1 ?rpredV ?rpred_nat //.
- rewrite -{1}(ltn_predK egt2) mulrSr mulrDl divff ?gtr_eqF // ler_add2l.
- rewrite ler_pdivr_mulr // ler_pdivl_mull ?ltr0n //.
- by rewrite mulr1 leC_nat -(subnKC egt2).
- rewrite -(@ler_pmul2r _ (2 ^ 2)%:R) ?ltr0n // {1}natrX -exprMn -mulrA.
- rewrite mulrDl mulrBl !mul1r !mulVf ?pnatr_eq0 // (mulrSr _ 3) addrK.
- by rewrite -mulrSr ler_wpmul2r ?ler0n ?ler_nat.
-have [U [MtypeF _]] := FTtypeP 1 maxM Mtype1.
-have{U MtypeF} [_ _ [U0 [sU0ML expU0 frobU0]]] := compl_of_typeF defM MtypeF.
-have [/sdprodP[_ _ nKU0 tiKU0] ntK _ _ _] := Frobenius_context frobU0.
-have nK'U0: U0 \subset 'N(K') by apply: gFnorm_trans.
-have frobU0K': [Frobenius K <*> U0 / K' = (K / K') ><| (U0 / K')]%g.
- have solK: solvable K by rewrite ?nilpotent_sol ?Fcore_nil.
- rewrite Frobenius_proper_quotient ?(sol_der1_proper solK) // /(_ <| _).
- by rewrite (subset_trans (der_sub 1 _)) ?joing_subl // join_subG gFnorm.
-have isoU0: U0 \isog U0 / K'.
- by rewrite quotient_isog //; apply/trivgP; rewrite -tiKU0 setSI ?gFsub.
-have piU0p: p \in \pi(U0 / K')%g.
- rewrite /= -(card_isog isoU0) -pi_of_exponent expU0 pi_of_exponent.
- rewrite mem_primes pr_p cardG_gt0 /= -ox order_dvdG // (subsetP _ _ P01x) //.
- by rewrite gFsub_trans // subsetI sP0M (subset_trans sP0H) ?gFsub.
-have /(Cauchy pr_p)[z U0z oz]: p %| #|U0 / K'|%g.
- by do [rewrite mem_primes => /and3P[]//] in piU0p.
-have frobKz: [Frobenius (K / K') <*> <[z]> = (K / K') ><| <[z]>]%g.
- rewrite (Frobenius_subr _ _ frobU0K') ?cycle_subG //.
- by rewrite cycle_eq1 -order_gt1 oz ltnW.
-have: p %| #|K / K'|%g.-1 by rewrite -oz (Frobenius_dvd_ker1 frobKz) //.
-have [_ ntKK' _ _ _] := Frobenius_context frobKz.
-rewrite -subn1 gtnNdvd ?subn_gt0 ?cardG_gt1 // subn1 prednK ?cardG_gt0 //.
-by rewrite -ltnS (leq_trans ubK).
-Qed.
-
-End Twelve_13_to_16.
-
-Lemma FTtype1_nonFrobenius_contradiction : False.
-Proof.
-have [_ [tau1 cohS]] := FT_Frobenius_coherence maxL frobL.
-have [chi] := FTtype1_ref_irr maxL; rewrite -(index_sdprod defL).
-exact: FTtype1_nonFrobenius_witness_contradiction cohS.
-Qed.
-
-End Twelve_8_to_16.
-
-(* This is Peterfalvi, Theorem (12.7). *)
-Theorem FTtype1_Frobenius M :
- M \in 'M -> FTtype M == 1%N -> [Frobenius M with kernel M`_\F].
-Proof.
-set K := M`_\F => maxM Mtype1; have [U [MtypeF _]] := FTtypeP 1 maxM Mtype1.
-have hallU: \pi(K)^'.-Hall(M) U.
- by rewrite -(compl_pHall U (Fcore_Hall M)) sdprod_compl; have [[]] := MtypeF.
-apply: FrobeniusWker (U) _ _; have{MtypeF} [_ -> _] := typeF_context MtypeF.
-apply/forall_inP=> P /SylowP[p _ sylP].
-rewrite (odd_pgroup_rank1_cyclic (pHall_pgroup sylP)) ?mFT_odd // leqNgt.
-apply/negP=> prankP.
-have piUp: p \in \pi(U) by rewrite -p_rank_gt0 -(p_rank_Sylow sylP) ltnW.
-have{piUp} K'p: p \in \pi(K)^' := pnatPpi (pHall_pgroup hallU) piUp.
-have{U hallU sylP} sylP: p.-Sylow(M) P := subHall_Sylow hallU K'p sylP.
-have{P sylP prankP} prankM: (1 < 'r_p(M))%N by rewrite -(p_rank_Sylow sylP).
-case/negP: K'p => /=; move: {2}p.+1 (ltnSn p) => n ltpn.
-elim: n => // n IHn in p M @K ltpn maxM Mtype1 prankM *.
-move: ltpn; rewrite ltnS leq_eqVlt => /predU1P[Dp | /IHn-> //].
-apply/idPn=> p'K; rewrite -p'groupEpi /= -/K -{n}Dp in p'K IHn.
-have [P sylP] := Sylow_exists p M.
-case/non_Frobenius_FTtype1_witness: (sylP) => // cPP prankP [L [maxL sPLs]].
-by case=> x P1s_x []; apply: (FTtype1_nonFrobenius_contradiction IHn) P1s_x.
-Qed.
-
-(* This is Peterfalvi, Theorem (12.17). *)
-Theorem not_all_FTtype1 : ~~ all_FTtype1 gT.
-Proof.
-apply/negP=> allT1; pose k := #|'M^G|.
-have [partGpi coA1 _ [injA1 /(_ allT1)partG _]] := FT_Dade_support_partition gT.
-move/forall_inP in allT1.
-have [/subsetP maxMG _ injMG exMG] := mmax_transversalP gT.
-have{partGpi exMG} kge2: (k >= 2)%N.
- have [L MG_L]: exists L, L \in 'M^G.
- by have [L maxL] := any_mmax gT; have [x] := exMG L maxL; exists (L :^ x)%G.
- have maxL := maxMG L MG_L; have Ltype1 := allT1 L maxL.
- have /Frobenius_kerP[_ ltHL nsHL _] := FTtype1_Frobenius maxL Ltype1.
- rewrite ltnNge; apply: contra (proper_subn ltHL) => leK1.
- rewrite (sub_normal_Hall (Fcore_Hall L)) // (pgroupS (subsetT L)) //=.
- apply: sub_pgroup (pgroup_pi _) => p; rewrite partGpi => /exists_inP[M maxM].
- have /eqP defMG: [set L] == 'M^G by rewrite eqEcard sub1set MG_L cards1.
- have [x] := exMG M maxM; rewrite -defMG => /set1P/(canRL (actK 'JG _))-> /=.
- by rewrite FTcoreJ cardJg FTcore_type1.
-pose L (i : 'I_k) : {group gT} := enum_val i; pose H i := (L i)`_\F%G.
-have MG_L i: L i \in 'M^G by apply: enum_valP.
-have maxL i: L i \in 'M by apply: maxMG.
-have defH i: (L i)`_\s = H i by rewrite FTcore_type1 ?allT1.
-pose frobL_P i E := [Frobenius L i = H i ><| gval E].
-have /fin_all_exists[E frobHE] i: exists E, frobL_P i E.
- by apply/existsP/FTtype1_Frobenius; rewrite ?allT1.
-have frobL i: [/\ L i \subset G, solvable (L i) & frobL_P i (E i)].
- by rewrite subsetT mmax_sol.
-have{coA1} coH_ i j: i != j -> coprime #|H i| #|H j|.
- move=> j'i; rewrite -!defH coA1 //; apply: contra j'i => /imsetP[x Gx defLj].
- apply/eqP/enum_val_inj; rewrite -/(L i) -/(L j); apply: injMG => //.
- by rewrite defLj; apply/esym/orbit_act.
-have tiH i: normedTI (H i)^# G (L i).
- have ntA: (H i)^# != set0 by rewrite setD_eq0 subG1 mmax_Fcore_neq1.
- apply/normedTI_memJ_P=> //=; rewrite subsetT; split=> // x z H1x Gz.
- apply/idP/idP=> [H1xz | Lz]; last first.
- by rewrite memJ_norm // (subsetP _ z Lz) // normD1 gFnorm.
- have /subsetP sH1A0: (H i)^# \subset 'A0(L i) by apply: Fcore_sub_FTsupp0.
- have [/(sub_in2 sH1A0)wccH1 [_ maxN] Nfacts] := FTsupport_facts (maxL i).
- suffices{z Gz H1xz wccH1} sCxLi: 'C[x] \subset L i.
- have /imsetP[y Ly defxz] := wccH1 _ _ H1x H1xz (mem_imset _ Gz).
- rewrite -[z](mulgKV y) groupMr // (subsetP sCxLi) // !inE conjg_set1.
- by rewrite conjgM defxz conjgK.
- apply/idPn=> not_sCxM; pose D := [set y in 'A0(L i) | ~~ ('C[y] \subset L i)].
- have Dx: x \in D by rewrite inE sH1A0.
- have{maxN} /mem_uniq_mmax[maxN sCxN] := maxN x Dx.
- have Ntype1 := allT1 _ maxN.
- have [_ _ /setDP[/bigcupP[y NFy /setD1P[ntx cxy]] /negP[]]] := Nfacts x Dx.
- rewrite FTsupp1_type1 Ntype1 // in NFy cxy *.
- have /Frobenius_kerP[_ _ _ regFN] := FTtype1_Frobenius maxN Ntype1.
- by rewrite 2!inE ntx (subsetP (regFN y NFy)).
-have /negP[] := no_coherent_Frobenius_partition (mFT_odd _) kge2 frobL tiH coH_.
-rewrite eqEsubset sub1set !inE andbT; apply/andP; split; last first.
- apply/bigcupP=> [[i _ /imset2P[x y /setD1P[ntx _] _ Dxy]]].
- by rewrite -(conjg_eq1 x y) -Dxy eqxx in ntx.
-rewrite subDset setUC -subDset -(cover_partition partG).
-apply/bigcupsP=> _ /imsetP[Li MG_Li ->]; pose i := enum_rank_in MG_Li Li.
-rewrite (bigcup_max i) //=; have ->: Li = L i by rewrite /L enum_rankK_in.
-rewrite -FT_Dade1_supportE //; apply/bigcupsP=> x A1x; apply: imset2S => //.
-move: (FT_Dade1_hyp _) (tiH i); rewrite -defH => _ /Dade_normedTI_P[_ -> //].
-by rewrite mul1g sub1set -/(H i) -defH.
-Qed.
-
-End PFTwelve.
diff --git a/mathcomp/odd_order/PFsection13.v b/mathcomp/odd_order/PFsection13.v
deleted file mode 100644
index 339df0f..0000000
--- a/mathcomp/odd_order/PFsection13.v
+++ /dev/null
@@ -1,2199 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime binomial ssralg poly finset.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action finalg zmodp.
-From mathcomp
-Require Import gfunctor gproduct center cyclic commutator gseries nilpotent.
-From mathcomp
-Require Import pgroup sylow hall abelian maximal frobenius.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation mxabelem vector.
-From mathcomp
-Require Import BGsection1 BGsection3 BGsection7.
-From mathcomp
-Require Import BGsection14 BGsection15 BGsection16.
-From mathcomp
-Require Import ssrnum rat algC cyclotomic algnum.
-From mathcomp
-Require Import classfun character integral_char inertia vcharacter.
-From mathcomp
-Require Import PFsection1 PFsection2 PFsection3 PFsection4.
-From mathcomp
-Require Import PFsection5 PFsection6 PFsection7 PFsection8 PFsection9.
-From mathcomp
-Require Import PFsection10 PFsection11 PFsection12.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 13: The Subgroups S and T. *)
-(* The following definitions will be used in PFsection14: *)
-(* FTtypeP_bridge StypeP j == a virtual character of S that mixes characters *)
-(* (locally) beta_ j, betaS that do and do not contain P = S`_\F in their *)
-(* kernels, for StypeP : of_typeP S U defW. *)
-(* := 'Ind[S, P <*> W1] 1 - mu2_ 0 j. *)
-(* FTtypeP_bridge_gap StypeP == the difference between the image of beta_ j *)
-(* (locally) Gamma, GammaS under the Dade isometry for S, and its natural *)
-(* value, 1 - eta_ 0 j (this does not actually *)
-(* depend on j != 0). *)
-(* The following definitions are only used locally across sections: *)
-(* #1 == the irreducible index 1 (i.e., inord 1). *)
-(* irr_Ind_Fittinq S chi <=> chi is an irreducible character of S induced *)
-(* (locally) irrIndH from an irreducible character of 'F(S) (which *)
-(* will be linear here, as 'F(S) is abelian). *)
-(* typeP_TIred_coherent StypeP tau1 <=> tau1 maps the reducible induced *)
-(* characters mu_ j of a type P group S, which are *)
-(* the image under the cyclic TI isometry to S of *)
-(* row sums of irreducibles of W = W1 x W2, to *)
-(* the image of that sum under the cyclic TI *)
-(* isometry to G (except maybe for a sign change *)
-(* if p = #|W2| = 3). *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory FinRing.Theory Num.Theory.
-
-Section Thirteen.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Implicit Types (p q : nat) (x y z : gT).
-Implicit Types H K L N P Q R S T U W : {group gT}.
-
-Definition irr_Ind_Fitting S := [predI irr S & seqIndT 'F(S) S].
-
-Local Notation irrIndH := (irr_Ind_Fitting _).
-Local Notation "#1" := (inord 1) (at level 0).
-
-Section Thirteen_2_3_5_to_9.
-
-(* These assumptions correspond to the part of Peterfalvi, Hypothesis (13.1) *)
-(* that is used to prove (13.2-3) and (13.5-9). Because of the shortcomings *)
-(* of Coq's Section and Module features we will need to repeat most of these *)
-(* assumptions twice down this file to exploit the symmetry between S and T. *)
-(* We anticipate the use of the letter 'H' to designate the Fitting group *)
-(* of S, which Peterfalvi does only locally in (13.5-9), in order not to *)
-(* conflict with (13.17-19), where H denotes the F-core of a Frobenius group. *)
-(* This is not a problem for us, since these lemmas will only appear in the *)
-(* last section of this file, and we will have no use for H at that point *)
-(* since we will have shown in (13.12) that H coincides with P = S`_\F. *)
-
-Variables S U W W1 W2 : {group gT}.
-Hypotheses (maxS : S \in 'M) (defW : W1 \x W2 = W).
-Hypotheses (StypeP : of_typeP S U defW).
-
-Local Notation "` 'W1'" := (gval W1) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W2'" := (gval W2) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W'" := (gval W) (at level 0, only parsing) : group_scope.
-Local Notation V := (cyclicTIset defW).
-
-Local Notation "` 'S'" := (gval S) (at level 0, only parsing) : group_scope.
-Local Notation P := `S`_\F%G.
-Local Notation "` 'P'" := `S`_\F (at level 0) : group_scope.
-Local Notation PU := S^`(1)%G.
-Local Notation "` 'PU'" := `S^`(1) (at level 0) : group_scope.
-Local Notation "` 'U'" := (gval U) (at level 0, only parsing) : group_scope.
-Local Notation C := 'C_U(`P)%G.
-Local Notation "` 'C'" := 'C_`U(`P) (at level 0) : group_scope.
-Local Notation H := 'F(S)%G.
-Local Notation "` 'H'" := 'F(`S) (at level 0) : group_scope.
-
-Let defS : PU ><| W1 = S. Proof. by have [[]] := StypeP. Qed.
-Let defPU : P ><| U = PU. Proof. by have [_ []] := StypeP. Qed.
-Let defH : P \x C = H. Proof. by have [] := typeP_context StypeP. Qed.
-
-Let notStype1 : FTtype S != 1%N. Proof. exact: FTtypeP_neq1 StypeP. Qed.
-Let notStype5 : FTtype S != 5%N. Proof. exact: FTtype5_exclusion maxS. Qed.
-
-Let pddS := FT_prDade_hypF maxS StypeP.
-Let ptiWS : primeTI_hypothesis S PU defW := FT_primeTI_hyp StypeP.
-Let ctiWG : cyclicTI_hypothesis G defW := pddS.
-
-Let ntW1 : W1 :!=: 1. Proof. by have [[]] := StypeP. Qed.
-Let ntW2 : W2 :!=: 1. Proof. by have [_ _ _ []] := StypeP. Qed.
-Let cycW1 : cyclic W1. Proof. by have [[]] := StypeP. Qed.
-Let cycW2 : cyclic W2. Proof. by have [_ _ _ []] := StypeP. Qed.
-
-Let p := #|W2|.
-Let q := #|W1|.
-Let c := #|C|.
-Let u := #|U : C|.
-
-Let oU : #|U| = (u * c)%N. Proof. by rewrite mulnC Lagrange ?subsetIl. Qed.
-
-Let pr_p : prime p. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed.
-Let pr_q : prime q. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed.
-
-Let qgt2 : q > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
-Let pgt2 : p > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
-
-Let coPUq : coprime #|PU| q.
-Proof. by rewrite (coprime_sdprod_Hall_r defS); have [[]] := StypeP. Qed.
-
-Let nirrW1 : #|Iirr W1| = q. Proof. by rewrite card_Iirr_cyclic. Qed.
-Let nirrW2 : #|Iirr W2| = p. Proof. by rewrite card_Iirr_cyclic. Qed.
-Let NirrW1 : Nirr W1 = q. Proof. by rewrite -nirrW1 card_ord. Qed.
-Let NirrW2 : Nirr W2 = p. Proof. by rewrite -nirrW2 card_ord. Qed.
-
-Local Open Scope ring_scope.
-
-Let sigma := (cyclicTIiso ctiWG).
-Let w_ i j := (cyclicTIirr defW i j).
-Local Notation eta_ i j := (sigma (w_ i j)).
-
-Local Notation Imu2 := (primeTI_Iirr ptiWS).
-Let mu2_ i j := primeTIirr ptiWS i j.
-Let mu_ := primeTIred ptiWS.
-Local Notation chi_ j := (primeTIres ptiWS j).
-
-Local Notation Idelta := (primeTI_Isign ptiWS).
-Local Notation delta_ j := (primeTIsign ptiWS j).
-
-Local Notation tau := (FT_Dade0 maxS).
-Local Notation "chi ^\tau" := (tau chi).
-
-Let calS0 := seqIndD PU S S`_\s 1.
-Let rmR := FTtypeP_coh_base maxS StypeP.
-Let scohS0 : subcoherent calS0 tau rmR.
-Proof. exact: FTtypeP_subcoherent StypeP. Qed.
-
-Let calS := seqIndD PU S P 1.
-Let sSS0 : cfConjC_subset calS calS0.
-Proof. exact/seqInd_conjC_subset1/Fcore_sub_FTcore. Qed.
-
-Local Notation type34ker1 := (FTtype34_Fcore_kernel_trivial maxS StypeP).
-Local Notation type34facts := (FTtype34_structure maxS StypeP).
-Local Notation type2facts := (FTtypeII_prime_facts maxS StypeP).
-Local Notation compl2facts := (compl_of_typeII maxS StypeP).
-Local Notation compl3facts := (compl_of_typeIII maxS StypeP).
-
-Local Notation H0 := (Ptype_Fcore_kernel StypeP).
-
-Lemma Ptype_factor_prime : pdiv #|P / H0|%g = p.
-Proof. exact: def_Ptype_factor_prime. Qed.
-Local Notation pHbar_p := Ptype_factor_prime.
-
-Lemma Ptype_Fcore_kernel_trivial : H0 :=: 1%g.
-Proof.
-have [/type2facts[_ oP _]| /type34ker1[]//] := boolP (FTtype S == 2).
-have [/and3P[]] := Ptype_Fcore_kernel_exists maxS StypeP notStype5.
-case/maxgroupp/andP=> /proper_sub-sH0P nH0S /subset_trans/(_ nH0S)nH0P _ _.
-apply: card1_trivg; rewrite -(divg_indexS sH0P) -card_quotient //.
-have [_ _ ->] := Ptype_Fcore_factor_facts maxS StypeP notStype5.
-by rewrite pHbar_p -{}oP divnn ?cardG_gt0.
-Qed.
-Local Notation H0_1 := Ptype_Fcore_kernel_trivial.
-
-Lemma Ptype_Fcompl_kernel_cent : Ptype_Fcompl_kernel StypeP :=: C.
-Proof.
-rewrite [Ptype_Fcompl_kernel StypeP]unlock /= (group_inj H0_1).
-by rewrite astabQ -morphpreIim -injm_cent ?injmK ?ker_coset ?norms1.
-Qed.
-Local Notation CHbar_C := Ptype_Fcompl_kernel_cent.
-
-(* This is Peterfalvi (13.2). *)
-Lemma FTtypeP_facts :
- [/\ (*a*) [/\ pred2 2 3 (FTtype S), q < p -> FTtype S == 2,
- [Frobenius U <*> W1 = U ><| W1] & abelian U],
- (*b*) p.-abelem P /\ #|P| = p ^ q,
- (*c*) u <= (p ^ q).-1 %/ p.-1,
- (*d*) coherent calS S^# tau
- & (*e*) normedTI 'A0(S) G S /\ {in 'CF(S, 'A0(S)), tau =1 'Ind}]%N.
-Proof.
-have type23: pred2 2 3 (FTtype S).
- by rewrite /= -implyNb; apply/implyP=> /type34facts[_ _ [->]].
-have [_ ntU _ tiFS] := compl_of_typeII_IV maxS StypeP notStype5.
-have [_ /mulG_sub[_ sUPU] nPU tiPU] := sdprodP defPU.
-have cUU: abelian U by case/orP: type23 => [/compl2facts | /compl3facts] [_ ->].
-split.
-- split=> //; last exact: Ptype_compl_Frobenius StypeP _.
- by rewrite ltnNge; apply: contraR => /type34facts[_ /ltnW].
-- by have [/type2facts[] | /type34ker1[]] := boolP (FTtype S == 2).
-- have ->: u = #|U / C|%g by rewrite card_quotient ?normsI ?normG ?norms_cent.
- have p1gt0: (0 < p.-1)%N by rewrite -(subnKC pgt2).
- have [/typeP_Galois_P[]| /typeP_Galois_Pn[]]// := boolP (typeP_Galois StypeP).
- move=> _ _ [_ _]; rewrite pHbar_p CHbar_C // -/u -/q; apply: dvdn_leq.
- by rewrite divn_gt0 // -!subn1 leq_sub2r // (leq_exp2l 1) ltnW // ltnW.
- rewrite -/q CHbar_C pHbar_p => H1 [_ _ _ _ [agt1 a_dv_p1 _ [V /card_isog->]]].
- apply: leq_trans (_ : p.-1 ^ q.-1 <= _)%N; last first.
- have ltp1q: (p.-1 ^ q < p ^ q)%N by rewrite ltn_exp2r ?prednK // 2?ltnW.
- by rewrite leq_divRL // -expnSr (ltn_predK qgt2) -ltnS (ltn_predK ltp1q).
- rewrite dvdn_leq ?expn_gt0 ?p1gt0 // (dvdn_trans (cardSg (subsetT V))) //.
- by rewrite cardsT card_matrix mul1n dvdn_exp2r //= card_ord Zp_cast.
-- have:= Ptype_core_coherence maxS StypeP notStype5; rewrite H0_1 CHbar_C.
- by rewrite (derG1P (abelianS _ cUU)) ?subsetIl ?(group_inj (joing1G _)).
-have ntA0: 'A0(S) != set0 := FTsupp0_neq0 maxS.
-suffices tiA0: normedTI 'A0(S) G S by split=> //; apply: Dade_Ind.
-apply/normedTI_memJ_P=> //; rewrite subsetT; split=> // x g A0x Gg.
-apply/idP/idP=> [A0xg | /(subsetP (FTsupp0_norm S))/memJ_norm->//].
-apply/idPn=> S'g; have Dx: x \in [set y in 'A0(S) | ~~ ('C[y] \subset S)].
- rewrite inE A0x; have [_ _ [_ _ _ wccA0 _] _] := pddS.
- have /imsetP[y Sy Dxy]: x ^ g \in x ^: S by rewrite wccA0 // mem_orbit.
- apply/subsetPn; exists (g * y^-1)%g; last by rewrite groupMr ?groupV.
- by rewrite !inE conjg_set1 conjgM Dxy conjgK.
-have [_ [_ /(_ x Dx) defL] /(_ x Dx)[_ _]] := FTsupport_facts maxS.
-have{defL} [maxL _] := mem_uniq_mmax defL; set L := 'N[x] in maxL *.
-rewrite -mem_iota !inE => ALx [/orP[Ltype1 _ | Ltype2]]; last first.
- by case/(_ _)/existsP=> // ? /Frobenius_of_typeF/(typePF_exclusion StypeP).
-have /Frobenius_kerP[_ _ _ regLF_L] := FTtype1_Frobenius maxL Ltype1.
-case/andP: ALx => A1'x /bigcupP[z A1z /setD1P[ntx cLz_z]]; case/negP: A1'x.
-rewrite ntx /'A1(L) -(Fcore_eq_FTcore _ _) ?(eqP Ltype1) //= in cLz_z A1z *.
-exact: subsetP (regLF_L z A1z) _ cLz_z.
-Qed.
-
-Lemma FTseqInd_TIred j : j != 0 -> mu_ j \in calS.
-Proof.
-move=> nz_j; rewrite -[mu_ j]cfInd_prTIres mem_seqInd ?gFnormal ?normal1 //=.
-by rewrite !inE sub1G (cfker_prTIres pddS).
-Qed.
-
-Lemma FTtypeP_Fitting_abelian : abelian H.
-Proof.
-rewrite -(dprodW defH) abelianM subsetIr.
-have [[_ _ _ cUU] [/abelem_abelian-> _] _ _ _] := FTtypeP_facts.
-by rewrite (abelianS _ cUU) ?subsetIl.
-Qed.
-Hint Resolve FTtypeP_Fitting_abelian.
-
-Local Notation calH := (seqIndT H S).
-
-Lemma FTtypeP_Ind_Fitting_1 lambda : lambda \in calH -> lambda 1%g = (u * q)%:R.
-Proof.
-case/seqIndP=> i _ ->; rewrite cfInd1 -?divgS ?gFsub //; set theta := 'chi_i.
-have Ltheta: theta \is a linear_char by apply/char_abelianP.
-rewrite -(sdprod_card defS) -(sdprod_card defPU) -/q -(dprod_card defH) oU.
-by rewrite -mulnA divnMl // mulnAC mulnK ?cardG_gt0 // lin_char1 ?mulr1.
-Qed.
-Local Notation calHuq := FTtypeP_Ind_Fitting_1.
-
-(* This is Peterfalvi (13.3)(a). *)
-Lemma FTprTIred_Ind_Fitting j : j != 0 -> mu_ j \in calH.
-Proof.
-move=> nz_j; have [//|_ _ _] := typeP_reducible_core_Ind maxS StypeP.
-rewrite (group_inj H0_1) CHbar_C -/q /= (dprodWY defH) -/calS => /(_ (mu_ j)).
-case=> [|_ _ [_ /lin_char_irr/irrP[r ->] ->]]; last exact: mem_seqIndT.
-by rewrite mem_filter /= prTIred_not_irr FTseqInd_TIred.
-Qed.
-Local Notation Hmu := FTprTIred_Ind_Fitting.
-
-Lemma FTprTIred1 j : j != 0 -> mu_ j 1%g = (u * q)%:R.
-Proof. by move/Hmu/calHuq. Qed.
-Local Notation mu1uq := FTprTIred1.
-
-(* This is the first assertion of Peterfalvi (13.3)(c). *)
-Lemma FTprTIsign j : delta_ j = 1.
-Proof.
-have [[_ _ frobUW1 cUU] _ _ cohS _] := FTtypeP_facts.
-have [-> | nz_j] := eqVneq j 0; first exact: prTIsign0.
-suffices: (1 == delta_ j %[mod q])%C.
- rewrite signrE /eqCmod addrC opprB subrK dvdC_nat.
- by case: (Idelta j); rewrite ?subr0 // gtnNdvd.
-apply: eqCmod_trans (prTIirr1_mod ptiWS 0 j); rewrite -/(mu2_ 0 j) -/q.
-have ->: mu2_ 0 j 1%g = u%:R.
- by apply: (mulfI (neq0CG W1)); rewrite -prTIred_1 -/mu_ mu1uq // mulnC natrM.
-rewrite eqCmod_sym /eqCmod -(@natrB _ u 1) ?indexg_gt0 // subn1 dvdC_nat.
-have nC_UW1: U <*> W1 \subset 'N(C).
- have /sdprodP[_ _ nPUW1 _] := Ptype_Fcore_sdprod StypeP.
- by rewrite normsI ?norms_cent // join_subG normG; have [_ []] := StypeP.
-have coUq: coprime #|U| q by have /sdprod_context[_ /coprimeSg->] := defPU.
-have /Frobenius_dvd_ker1: [Frobenius U <*> W1 / C = (U / C) ><| (W1 / C)].
- have [defUW1 _ _ _ _] := Frobenius_context frobUW1.
- rewrite Frobenius_coprime_quotient // /normal ?subIset ?joing_subl //.
- split=> [|x /(Frobenius_reg_ker frobUW1)->]; last exact: sub1G.
- rewrite properEneq subsetIl -CHbar_C andbT.
- by have [] := Ptype_Fcore_factor_facts maxS StypeP notStype5.
-have [nCU nCW1] := joing_subP nC_UW1; rewrite !card_quotient // -/u.
-by rewrite -indexgI setIC setIAC (coprime_TIg coUq) setI1g indexg1.
-Qed.
-Local Notation delta1 := FTprTIsign.
-
-(* This is Peterfalvi (13.3)(b). *)
-Lemma FTtypeP_no_Ind_Fitting_facts :
- ~~ has irrIndH calS ->
- [/\ typeP_Galois StypeP, `C = 1%g & u = (p ^ q).-1 %/ p.-1].
-Proof.
-move=> noIndH; have [[_ _ _ cUU] _ _ _ _] := FTtypeP_facts.
-have [[t []] | [->]] := typeP_reducible_core_cases maxS StypeP notStype5.
- rewrite CHbar_C H0_1 (derG1P (abelianS _ cUU)) ?subsetIl //=.
- rewrite (group_inj (joing1G 1)) -/calS /= (dprodWY defH) => calSt _.
- case=> _ /lin_char_irr/irrP[r ->] Dt; case/hasP: noIndH.
- by exists 'chi_t; rewrite //= mem_irr; apply/seqIndP; exists r; rewrite ?inE.
-rewrite /= pHbar_p H0_1 oU /c => frobPU _ <- _ /=.
-suffices /eqP->: C :==: 1%g by rewrite cards1 muln1.
-suffices: 'C_(U / 1)(P / 1) == 1%g.
- by rewrite -injm_subcent ?morphim_injm_eq1 ?norms1 ?ker_coset.
-have [_ ntP _ _ _] := Frobenius_context frobPU.
-by rewrite (cent_semiregular (Frobenius_reg_compl frobPU)).
-Qed.
-
-(* Helper function for (13.3)(c). *)
-Let signW2 (b : bool) := iter b (@conjC_Iirr _ W2).
-
-Let signW2K b : involutive (signW2 b).
-Proof. by case: b => //; apply: conjC_IirrK. Qed.
-
-Let signW2_eq0 b : {mono signW2 b: j / j == 0}.
-Proof. by case: b => //; apply: conjC_Iirr_eq0. Qed.
-
-(* This is a reformulation of the definition condition part of (13.3)(c) that *)
-(* better fits its actual use in (13.7), (13.8) and (13.9) (note however that *)
-(* the p = 3 part will in fact not be used). *)
-Definition typeP_TIred_coherent tau1 :=
- exists2 b : bool, b -> p = 3
- & forall j, j != 0 -> tau1 (mu_ j) = (-1) ^+ b *: \sum_i eta_ i (signW2 b j).
-
-(* This is the main part of Peterfalvi (13.3)(c), using the definition above. *)
-(* Note that the text glosses over the quantifier inversion in the second use *)
-(* of (5.8) in the p = 3 case. We must rule out tau1 (mu_ k) = - tau1 (mu_ j) *)
-(* by using the isometry property of tau1 (alternatively, we could use (4.8) *)
-(* to compute tau1 (mu_ k) = tau (mu_ k - mu_ j) + tau1 (mu_ j) directly). *)
-Lemma FTtypeP_coherence :
- exists2 tau1 : {additive 'CF(S) -> 'CF(G)},
- coherent_with calS S^# tau tau1 & typeP_TIred_coherent tau1.
-Proof.
-have [redS|] := altP (@allP _ [predC irr S] calS).
- have [k nz_k] := has_nonprincipal_irr ntW2.
- have [_ [tau1 Dtau1]] := uniform_prTIred_coherent pddS nz_k.
- set calT := uniform_prTIred_seq pddS k => cohT.
- exists tau1; last by exists false => // j _; rewrite /= Dtau1 delta1.
- apply: subset_coherent_with cohT => xi Sxi.
- have [_ _ /(_ xi)] := typeP_reducible_core_Ind maxS StypeP notStype5.
- rewrite (group_inj H0_1) mem_filter redS // => /(_ Sxi)/imageP[j nz_j ->] _.
- by rewrite image_f // inE -/mu_ [~~ _]nz_j /= !mu1uq.
-rewrite all_predC negbK => /hasP[xi Sxi irr_xi].
-have [_ _ _ [tau1 cohS] _] := FTtypeP_facts; exists tau1 => //.
-have [|] := boolP [forall (j | j != 0), tau1 (mu_ j) == \sum_i eta_ i j].
- by move/eqfun_inP=> Dtau1; exists false => // j /Dtau1; rewrite scale1r.
-rewrite negb_forall_in => /exists_inP[j nz_j /eqP tau1muj_neq_etaj].
-have:= FTtypeP_coherent_TIred sSS0 cohS irr_xi Sxi (FTseqInd_TIred _).
-rewrite -/mu_ -/sigma -/ptiWS => tau1mu; have [dk tau1muj Ddk] := tau1mu j nz_j.
-case: Ddk tau1muj => [][-> ->]{dk}; rewrite ?signrN delta1 ?scaleNr scale1r //.
-set k := conjC_Iirr j => Dmu tau1muj.
-have{Dmu} defIW2 l: l != 0 -> pred2 j k l.
- by move=> nz_l; rewrite Dmu ?FTseqInd_TIred ?mu1uq.
-have [nz_k j'k]: k != 0 /\ k != j.
- rewrite conjC_Iirr_eq0 nz_j -(inj_eq irr_inj) conjC_IirrE.
- by rewrite odd_eq_conj_irr1 ?mFT_odd ?irr_eq1.
-have /eqP p3: p == 3.
- rewrite -nirrW2 (cardD1 0) (cardD1 j) (cardD1 k) !inE nz_j nz_k j'k !eqSS.
- by apply/pred0Pn=> [[l /and4P[k'l j'l /defIW2/norP[]]]].
-exists true => // _ /defIW2/pred2P[]->; first by rewrite scaler_sign.
-have [[[Itau1 _] _] [d t1muk Dd]] := (cohS, tau1mu k nz_k); move: Dd t1muk.
-case=> [][-> ->] => [|_]; rewrite ?signrN delta1 // scale1r.
-case/(congr1 (cfdotr (tau1 (mu_ j)) \o -%R))/eqP/idPn => /=.
-rewrite -tau1muj cfdotNl eq_sym !Itau1 ?mem_zchar ?FTseqInd_TIred //.
-by rewrite !cfdot_prTIred (negPf j'k) eqxx mul1n oppr0 neq0CG.
-Qed.
-
-(* We skip over (13.4), whose proof uses (13.2) and (13.3) for both groups of *)
-(* a type P pair. *)
-
-Let calS1 := seqIndD H S P 1.
-
-(* Some facts about calS1 used implicitly throughout (13.5-8). *)
-Let S1mu j : j != 0 -> mu_ j \in calS1.
-Proof.
-move=> nz_j; have /seqIndP[s _ Ds] := Hmu nz_j.
-rewrite Ds mem_seqInd ?gFnormal ?normal1 // !inE sub1G andbT.
-rewrite -(sub_cfker_Ind_irr s (gFsub _ _) (gFnorm _ _)) -Ds /=.
-rewrite -[mu_ j](cfInd_prTIres (FT_prDade_hypF maxS StypeP)).
-by rewrite sub_cfker_Ind_irr ?cfker_prTIres ?gFsub ?gFnorm.
-Qed.
-
-Let calSirr := [seq phi <- calS | phi \in irr S].
-Let S1cases zeta :
- zeta \in calS1 -> {j | j != 0 & zeta = mu_ j} + (zeta \in 'Z[calSirr]).
-Proof.
-move=> S1zeta; have /sig2_eqW[t /setDP[_ kerP't] Dzeta] := seqIndP S1zeta.
-rewrite inE in kerP't; have /mulG_sub[sPH _] := dprodW defH.
-have [/andP[sPPU nPPU] sUPU _ _ _] := sdprod_context defPU.
-have sHPU: H \subset PU by rewrite /= -(dprodWC defH) mulG_subG subIset ?sUPU.
-have [/eqfunP mu'zeta|] := boolP [forall j, '['Ind 'chi_t, chi_ j] == 0].
- right; rewrite Dzeta -(cfIndInd _ _ sHPU) ?gFsub //.
- rewrite ['Ind 'chi_t]cfun_sum_constt linear_sum /= rpred_sum // => s tPUs.
- rewrite linearZ rpredZ_Cnat ?Cnat_cfdot_char ?cfInd_char ?irr_char //=.
- have [[j Ds] | [irr_zeta _]] := prTIres_irr_cases ptiWS s.
- by case/eqP: tPUs; rewrite Ds mu'zeta.
- rewrite mem_zchar // mem_filter irr_zeta mem_seqInd ?gFnormal ?normal1 //=.
- by rewrite !inE sub1G andbT -(sub_cfker_constt_Ind_irr tPUs).
-rewrite negb_forall => /existsP/sigW[j].
-rewrite -irr_consttE constt_Ind_Res => jHt.
-have nz_j: j != 0; last do [left; exists j => //].
- apply: contraTneq jHt => ->; rewrite prTIres0 rmorph1 -irr0 constt_irr.
- by apply: contraNneq kerP't => ->; rewrite irr0 cfker_cfun1.
-have /pairwise_orthogonalP[_ ooS1]: pairwise_orthogonal calS1.
- by rewrite seqInd_orthogonal ?gFnormal.
-rewrite -(cfRes_prTIirr _ 0) cfResRes ?gFsub //= in jHt.
-have muj_mu0j: Imu2 (0, j) \in irr_constt (mu_ j).
- by rewrite irr_consttE cfdotC cfdot_prTIirr_red eqxx conjC1 oner_eq0.
-apply: contraNeq (constt_Res_trans (prTIred_char _ _) muj_mu0j jHt).
-by rewrite cfdot_Res_l /= -Dzeta eq_sym => /ooS1-> //; rewrite S1mu.
-Qed.
-
-Let sS1S : {subset calS1 <= 'Z[calS]}.
-Proof.
-move=> zeta /S1cases[[j nz_j ->]|]; first by rewrite mem_zchar ?FTseqInd_TIred.
-by apply: zchar_subset; apply: mem_subseq (filter_subseq _ _).
-Qed.
-
-(* This is Peterfalvi (13.5). *)
-(* We have adapted the statement to its actual use by replacing the Dade *)
-(* (partial) isometry by a (total) coherent isometry, and strengthening the *)
-(* orthogonality condition. This simplifies the assumptions as zeta0 is no *)
-(* longer needed. Note that this lemma is only used to establish various *)
-(* inequalities (13.6-8) that contribute to (13.10), so it does not need to *)
-(* be exported from this section. *)
-Let calS1_split1 (tau1 : {additive _}) zeta1 chi :
- coherent_with calS S^# tau tau1 -> zeta1 \in calS1 -> chi \in 'Z[irr G] ->
- {in calS1, forall zeta, zeta != zeta1 -> '[tau1 zeta, chi] = 0} ->
- let a := '[tau1 zeta1, chi] in
- exists2 alpha,
- alpha \in 'Z[irr H] /\ {subset irr_constt alpha <= Iirr_ker H P} &
- [/\ (*a*) {in H^#, forall x, chi x = a / '[zeta1] * zeta1 x + alpha x},
- (*b*)
- \sum_(x in H^#) `|chi x| ^+ 2 =
- a ^+ 2 / '[zeta1] * (#|S|%:R - zeta1 1%g ^+ 2 / '[zeta1])
- - 2%:R * a * (zeta1 1%g * alpha 1%g / '[zeta1])
- + (\sum_(x in H^#) `|alpha x| ^+ 2)
- & (*c*)
- \sum_(x in H^#) `|alpha x| ^+ 2 >= #|P|.-1%:R * alpha 1%g ^+ 2].
-Proof.
-case=> _ Dtau1 S1zeta1 Zchi o_tau1S_chi a.
-have sW2P: W2 \subset P by have [_ _ _ []] := StypeP.
-have /mulG_sub[sPH _] := dprodW defH.
-have ntH: H :!=: 1%g by apply: subG1_contra ntW2; apply: subset_trans sPH.
-have sH1S: H^# \subset G^# by rewrite setSD ?subsetT.
-have[nsHS nsPS ns1S]: [/\ H <| S, P <| S & 1 <| S] by rewrite !gFnormal normal1.
-have [[sHS nHS] [sPS nPS]] := (andP nsHS, andP nsPS).
-have tiH: normedTI H^# G S by have [] := compl_of_typeII_IV maxS StypeP.
-have ddH := normedTI_Dade tiH sH1S; have [_ ddH_1] := Dade_normedTI_P ddH tiH.
-pose tauH := Dade ddH.
-have DtauH: {in 'CF(S, H^#), tauH =1 'Ind} := Dade_Ind ddH tiH.
-have sS1H: {subset calS1 <= calH} by apply: seqInd_subT.
-pose zeta0 := zeta1^*%CF.
-have S1zeta0: zeta0 \in calS1 by rewrite cfAut_seqInd.
-have zeta1'0: zeta0 != zeta1.
- by rewrite (hasPn (seqInd_notReal _ _ _ _) _ S1zeta1) ?gFnormal ?mFT_odd.
-have Hzeta0 := sS1H _ S1zeta0.
-have dH_1 zeta: zeta \in calH -> (zeta - zeta0) 1%g == 0.
- by move=> Tzeta; rewrite 2!cfunE !calHuq // subrr eqxx.
-have H1dzeta zeta: zeta \in calH -> zeta - zeta0 \in 'CF(S, H^#).
- have HonH: {subset calH <= 'CF(S, H)} by apply: seqInd_on.
- by move=> Hzeta; rewrite cfun_onD1 rpredB ?HonH ?dH_1.
-pose calH1 := rem zeta1 (rem zeta0 (filter [mem calS1] calH)).
-pose calH2 := filter [predC calS1] calH.
-have DcalH: perm_eq calH (zeta0 :: zeta1 :: calH1 ++ calH2).
- rewrite -(perm_filterC [mem calS1]) -!cat_cons perm_cat2r.
- rewrite (perm_eqlP (@perm_to_rem _ zeta0 _ _)) ?mem_filter /= ?S1zeta0 //.
- rewrite perm_cons perm_to_rem // mem_rem_uniq ?filter_uniq ?seqInd_uniq //.
- by rewrite !inE mem_filter /= eq_sym zeta1'0 S1zeta1 sS1H.
-have{DcalH} [a_ _ Dchi _] := invDade_seqInd_sum ddH chi DcalH.
-have Da_ zeta: zeta \in calH -> a_ zeta = '['Ind (zeta - zeta0), chi].
- move=> Tzeta; rewrite /a_ !calHuq // divff ?scale1r; last first.
- by rewrite pnatr_eq0 -lt0n muln_gt0 indexg_gt0 cardG_gt0.
- by rewrite [Dade _ _]DtauH ?H1dzeta.
-have Za_ zeta: zeta \in calH -> a_ zeta \in Cint.
- move=> Hzeta; rewrite Da_ // Cint_cfdot_vchar ?cfInd_vchar //.
- by rewrite rpredB ?char_vchar ?(seqInd_char Hzeta) ?(seqInd_char Hzeta0).
-have{Da_} Da_ zeta: zeta \in calS1 -> a_ zeta = '[tau1 zeta, chi].
- move=> S1zeta; have Hzeta := sS1H _ S1zeta.
- rewrite Da_ //; have [_ _ _ _ [_ <-]] := FTtypeP_facts.
- rewrite -Dtau1; last by rewrite zcharD1E rpredB ?sS1S ?dH_1.
- by rewrite raddfB cfdotBl (o_tau1S_chi zeta0) ?subr0.
- by rewrite (cfun_onS (Fitting_sub_FTsupp0 maxS)) ?H1dzeta.
-pose alpha := 'Res[H] (\sum_(zeta <- calH2) (a_ zeta)^* / '[zeta] *: zeta).
-have{Dchi} Dchi: {in H^#, forall x, chi x = a / '[zeta1] * zeta1 x + alpha x}.
- move=> x H1x; have [_ Hx] := setD1P H1x.
- transitivity (invDade ddH chi x).
- by rewrite cfunElock ddH_1 // big_set1 H1x mul1g cards1 invr1 mul1r.
- rewrite cfResE ?gFsub ?Dchi // big_cons conj_Cint ?Za_ ?Da_ ?sS1H //= -/a.
- congr (_ + _); rewrite big_cat /= sum_cfunE big1_seq ?add0r //= => [|zeta].
- by apply: eq_bigr => zeta; rewrite cfunE.
- rewrite ?(mem_rem_uniq, inE) ?rem_uniq ?filter_uniq ?seqInd_uniq //=.
- rewrite mem_filter => /and4P[/= zeta1'z _ S1zeta _].
- by rewrite Da_ ?o_tau1S_chi // conjC0 !mul0r.
-have kerHalpha: {subset irr_constt alpha <= Iirr_ker H P}.
- move=> s; apply: contraR => kerP's; rewrite [alpha]rmorph_sum cfdot_suml.
- rewrite big1_seq // => psi; rewrite mem_filter /= andbC => /andP[].
- case/seqIndP=> r _ ->; rewrite mem_seqInd // !inE sub1G andbT negbK => kerPr.
- rewrite cfdot_Res_l cfdotZl mulrC cfdot_sum_irr big1 ?mul0r // => t _.
- apply: contraNeq kerP's; rewrite mulf_eq0 fmorph_eq0 inE => /norP[rSt sSt].
- by rewrite (sub_cfker_constt_Ind_irr sSt) -?(sub_cfker_constt_Ind_irr rSt).
-have Zalpha: alpha \in 'Z[irr H].
- rewrite [alpha]rmorph_sum big_seq rpred_sum // => zeta; rewrite mem_filter /=.
- case/andP=> S1'zeta Tzeta; rewrite linearZ /= -scalerA.
- rewrite rpredZ_Cint ?conj_Cint ?Za_ //; have [s _ ->] := seqIndP Tzeta.
- rewrite cfResInd_sum_cfclass ?reindex_cfclass -?cfnorm_Ind_irr //=.
- rewrite scalerK ?cfnorm_eq0 ?cfInd_eq0 ?irr_neq0 ?irr_char ?gFsub //.
- by apply: rpred_sum => i _; apply: irr_vchar.
-have{Da_ Za_} Za: a \in Cint by rewrite -[a]Da_ ?Za_ ?sS1H.
-exists alpha => //; split=> //.
- set a1 := a / _ in Dchi; pose phi := a1 *: 'Res zeta1 + alpha.
- transitivity (#|H|%:R * '[phi] - `|phi 1%g| ^+ 2).
- rewrite (cfnormE (cfun_onG phi)) mulVKf ?neq0CG // addrC.
- rewrite (big_setD1 _ (group1 H)) addKr; apply: eq_bigr => x H1x.
- by have [_ Hx] := setD1P H1x; rewrite !cfunE cfResE // Dchi.
- have Qa1: a1 \in Creal.
- apply: rpred_div; first by rewrite rpred_Cint.
- by rewrite rpred_Cnat // Cnat_cfdot_char ?(seqInd_char S1zeta1).
- rewrite cfnormDd; last first.
- rewrite [alpha]cfun_sum_constt cfdotZl cfdot_sumr big1 ?mulr0 // => s.
- move/kerHalpha; rewrite inE cfdotZr mulrC cfdot_Res_l => kerPs.
- have [r kerP'r ->] := seqIndP S1zeta1; rewrite cfdot_sum_irr big1 ?mul0r //.
- move=> t _; apply: contraTeq kerP'r; rewrite !inE sub1G andbT negbK.
- rewrite mulf_eq0 fmorph_eq0 => /norP[]; rewrite -!irr_consttE.
- by move=> /sub_cfker_constt_Ind_irr-> // /sub_cfker_constt_Ind_irr <-.
- rewrite cfnormZ 2!cfunE cfRes1 2?real_normK //; last first.
- rewrite rpredD 1?rpredM // Creal_Cint ?Cint_vchar1 // ?char_vchar //.
- by rewrite (seqInd_char S1zeta1).
- rewrite mulrDr mulrCA sqrrD opprD addrACA; congr (_ + _); last first.
- rewrite (cfnormE (cfun_onG _)) mulVKf ?neq0CG //.
- by rewrite (big_setD1 1%g) // Cint_normK ?Cint_vchar1 // addrC addKr.
- rewrite opprD addrA; congr (_ - _); last first.
- rewrite -[_ * a * _]mulrA -mulr_natl; congr (_ * _).
- by rewrite -[a1 * _]mulrA -(mulrA a); congr (_ * _); rewrite -mulrA mulrC.
- rewrite mulrBr; congr (_ - _); last first.
- by rewrite mulrACA -expr2 -!exprMn mulrAC.
- rewrite -mulrA exprMn -mulrA; congr (_ * _); rewrite expr2 -mulrA.
- congr (_ * _); apply: canLR (mulKf (cfnorm_seqInd_neq0 nsHS S1zeta1)) _.
- rewrite (cfnormE (cfun_onG _)) mulVKf ?neq0CG // mulrC.
- rewrite (cfnormE (seqInd_on nsHS S1zeta1)) mulVKf ?neq0CG //.
- by apply: eq_bigr => x Hx; rewrite cfResE.
-rewrite -subn1 natrB // -Cint_normK ?Cint_vchar1 // mulrBl mul1r ler_subl_addl.
-apply: ler_trans (_ : \sum_(x in H) `|alpha x| ^+ 2 <= _); last first.
- by rewrite (big_setD1 1%g).
-rewrite (big_setID P) /= (setIidPr sPH) ler_paddr ?sumr_ge0 // => [x _|].
- by rewrite mulr_ge0 ?normr_ge0.
-rewrite mulr_natl -sumr_const ler_sum // => y Py.
-suffices ->: alpha y = alpha 1%g by apply: lerr.
-rewrite [alpha]cfun_sum_constt !sum_cfunE; apply: eq_bigr => i.
-by rewrite !cfunE => /kerHalpha; rewrite inE => /subsetP/(_ y Py)/cfker1->.
-Qed.
-
-Local Notation eta10 := (eta_ #1 0).
-Local Notation eta01 := (eta_ 0 #1).
-
-Let o_tau1_eta (tau1 : {additive _}) i j:
- coherent_with calS S^# tau tau1 ->
- {in 'Z[calSirr], forall zeta, '[tau1 zeta, eta_ i j] = 0}.
-Proof.
-move=> cohS _ /zchar_expansion[|z Zz ->].
- by rewrite filter_uniq ?seqInd_uniq.
-rewrite raddf_sum cfdot_suml big1_seq //= => phi; rewrite mem_filter.
-case/andP=> irr_phi /(coherent_ortho_cycTIiso StypeP sSS0 cohS) o_phi_eta.
-by rewrite raddfZ_Cint {Zz}//= cfdotZl o_phi_eta ?mulr0.
-Qed.
-
-Let P1_int2_lb b : b \in Cint -> 2%:R * u%:R * b <= #|P|.-1%:R * b ^+ 2.
-Proof.
-move=> Zb; rewrite -natrM; apply: ler_trans (_ : (2 * u)%:R * b ^+ 2 <= _).
- by rewrite ler_wpmul2l ?ler0n ?Cint_ler_sqr.
-rewrite ler_wpmul2r -?realEsqr ?Creal_Cint // leC_nat mulnC -leq_divRL //.
-have [_ [_ ->] /leq_trans-> //] := FTtypeP_facts.
-by rewrite leq_div2l // -subn1 ltn_subRL.
-Qed.
-
-(* This is Peterfalvi (13.6). *)
-Lemma FTtypeP_sum_Ind_Fitting_lb (tau1 : {additive _}) lambda :
- coherent_with calS S^# tau tau1 -> lambda \in irrIndH -> lambda \in calS ->
- \sum_(x in H^#) `|tau1 lambda x| ^+ 2 >= #|S|%:R - lambda 1%g ^+ 2.
-Proof.
-move=> cohS /andP[Ilam Hlam] Slam; have [[Itau1 Ztau1] _] := cohS.
-have Zlam1: tau1 lambda \in 'Z[irr G] by rewrite Ztau1 ?mem_zchar.
-have S1lam: lambda \in calS1.
- have [[s kerP's Ds] [r _ Dr]] := (seqIndP Slam, seqIndP Hlam).
- rewrite Dr mem_seqInd ?gFnormal ?normal1 // !inE !sub1G !andbT in kerP's *.
- rewrite -(sub_cfker_Ind_irr r (gFsub _ _) (gFnorm _ _)) /= -Dr.
- by rewrite Ds sub_cfker_Ind_irr ?gFsub ?gFnorm.
-have [|alpha [Zalpha kerPalpha]] := calS1_split1 cohS S1lam Zlam1.
- move=> zeta S1zeta lam'zeta; rewrite Itau1 ?sS1S //.
- suffices: pairwise_orthogonal calS1 by case/pairwise_orthogonalP=> _ ->.
- by rewrite seqInd_orthogonal ?gFnormal.
-rewrite Itau1 ?mem_zchar // irrWnorm // expr1n !divr1 mul1r => [[Dlam ->]].
-rewrite mulr1 -ler_subl_addl addrC opprB subrK calHuq //; apply: ler_trans.
-have [[x W2x ntx] [y W1y nty]] := (trivgPn _ ntW2, trivgPn _ ntW1).
-have [_ _ _ [_ _ sW2P _ _] _] := StypeP; have Px := subsetP sW2P x W2x.
-have [eps pr_eps] := C_prim_root_exists (prime_gt0 pr_q).
-have{y W1y W2x nty} lamAmod: (tau1 lambda x == lambda x %[mod 1 - eps])%A.
- have [_ /mulG_sub[_ sW1S] _ tiPUW1] := sdprodP defS.
- have [_ /mulG_sub[sW1W sW2W] cW12 _] := dprodP defW.
- have /mulG_sub[sPPU _] := sdprodW defPU.
- have [o_y cxy]: #[y] = q /\ x \in 'C[y].
- split; last by apply/cent1P; red; rewrite (centsP cW12).
- by apply: nt_prime_order => //; apply/eqP; rewrite -order_dvdn order_dvdG.
- have lam1yx: (tau1 lambda (y * x)%g == tau1 lambda x %[mod 1 - eps])%A.
- by rewrite (vchar_ker_mod_prim pr_eps) ?in_setT.
- have [Sx Sy] := (subsetP (gFsub _ _) x Px, subsetP sW1S y W1y).
- have PUx := subsetP sPPU x Px.
- have lam_yx: (lambda (y * x)%g == lambda x %[mod 1 - eps])%A.
- by rewrite (vchar_ker_mod_prim pr_eps) ?char_vchar ?(seqInd_char Slam).
- apply: eqAmod_trans lam_yx; rewrite eqAmod_sym; apply: eqAmod_trans lam1yx.
- have PUlam: lambda \in 'CF(S, PU) by rewrite (seqInd_on _ Slam) ?gFnormal.
- have PU'yx: (y * x)%g \notin PU.
- by rewrite groupMr //= -[y \in PU]andbT -W1y -in_setI tiPUW1 !inE.
- rewrite (cfun_on0 PUlam PU'yx) (ortho_cycTIiso_vanish pddS) //.
- apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i [j ->]] ->].
- by rewrite (coherent_ortho_cycTIiso StypeP sSS0).
- rewrite !inE (groupMl x (subsetP sW1W y _)) // (subsetP sW2W) // andbT.
- rewrite groupMl // -[x \in _]andTb -PUx -in_setI tiPUW1 !inE negb_or ntx /=.
- by rewrite (contra _ PU'yx) // => /(subsetP sW2P)/(subsetP sPPU).
-have{x ntx Px lamAmod} alphaAmod: (alpha 1%g == 0 %[mod 1 - eps])%A.
- have Hx: x \in H by have/mulG_sub[/subsetP->] := dprodW defH.
- have:= lamAmod; rewrite -[lambda x]addr0 Dlam ?inE ?ntx // mul1r eqAmodDl.
- rewrite cfker1 // [alpha]cfun_sum_constt (subsetP (cfker_sum _ _ _)) //.
- rewrite !inE Hx (subsetP _ x Px) //; apply/bigcapsP=> i /kerPalpha.
- by rewrite !inE => /subset_trans-> //; apply: cfker_scale.
-have /dvdCP[b Zb ->]: (q %| alpha 1%g)%C.
- by rewrite (int_eqAmod_prime_prim pr_eps) // Cint_vchar1.
-rewrite natrM mulrACA exprMn !mulrA 2?ler_pmul2r ?gt0CG //.
-by rewrite -[_ * b * b]mulrA P1_int2_lb.
-Qed.
-
-(* This is Peterfalvi (13.7). *)
-Lemma FTtypeP_sum_cycTIiso10_lb : \sum_(x in H^#) `|eta10 x| ^+ 2 >= #|H^#|%:R.
-Proof.
-pose mu1 := mu_ #1; have S1mu1: mu1 \in calS1 by rewrite S1mu ?Iirr1_neq0.
-have Zeta10: eta10 \in 'Z[irr G] by rewrite cycTIiso_vchar.
-have [tau1 cohS [b _ Dtau1]] := FTtypeP_coherence.
-have{b Dtau1} oS1eta10: {in calS1, forall zeta, '[tau1 zeta, eta10] = 0}.
- move=> zeta /S1cases[[j nz_j ->] | /o_tau1_eta-> //].
- rewrite Dtau1 // cfdotZl cfdot_suml big1 ?mulr0 // => i _.
- by rewrite cfdot_cycTIiso signW2_eq0 (negPf nz_j) andbF.
-have [_ /oS1eta10//|alpha [Zalpha kerPalpha]] := calS1_split1 cohS S1mu1 Zeta10.
-rewrite {}oS1eta10 // expr0n mulr0 !mul0r subrr add0r => [[Deta10 -> ub_alpha]].
-have{Deta10} Deta10: {in H^#, eta10 =1 alpha}.
- by move=> x /Deta10; rewrite !mul0r add0r.
-set a1_2 := alpha 1%g ^+ 2 in ub_alpha.
-have Dsum_alpha: \sum_(x in H^#) `|alpha x| ^+ 2 = #|H|%:R * '[alpha] - a1_2.
- rewrite (cfnormE (cfun_onG _)) mulVKf ?neq0CG // (big_setD1 _ (group1 H)) /=.
- by rewrite addrC Cint_normK ?addKr ?Cint_vchar1.
-have [/mulG_sub[sPH _] [_ _ _ [_ _ sW2P _ _] _]] := (dprodW defH, StypeP).
-have nz_alpha: alpha != 0.
- have [[x W2x ntx] [y W1y nty]] := (trivgPn _ ntW2, trivgPn _ ntW1).
- have [eps pr_eps] := C_prim_root_exists (prime_gt0 pr_q).
- have [_ mulW12 cW12 tiW12] := dprodP defW.
- have [sW1W sW2W] := mulG_sub mulW12.
- have [o_y cxy]: #[y] = q /\ x \in 'C[y].
- split; last by apply/cent1P; red; rewrite (centsP cW12).
- by apply: nt_prime_order => //; apply/eqP; rewrite -order_dvdn order_dvdG.
- have eta10x: (eta10 x == eta10 (y * x)%g %[mod 1 - eps])%A.
- by rewrite eqAmod_sym (vchar_ker_mod_prim pr_eps) ?in_setT.
- have eta10xy: (eta10 (y * x)%g == 1 %[mod 1 - eps])%A.
- rewrite cycTIiso_restrict; last first.
- rewrite !inE -mulW12 mem_mulg // andbT groupMl ?groupMr // -[_ || _]andTb.
- by rewrite andb_orr -{1}W2x -W1y andbC -!in_setI tiW12 !inE (negPf ntx).
- have {2}<-: w_ #1 0 x = 1.
- rewrite -[x]mul1g /w_ dprod_IirrE cfDprodE // irr0 cfun1E W2x mulr1.
- by rewrite lin_char1 ?irr_cyclic_lin.
- rewrite (vchar_ker_mod_prim pr_eps) ?(subsetP sW1W y) ?(subsetP sW2W) //.
- by rewrite irr_vchar.
- have: (alpha x == 1 %[mod 1 - eps])%A.
- rewrite -Deta10; last by rewrite !inE ntx (subsetP sPH) ?(subsetP sW2P).
- exact: eqAmod_trans eta10x eta10xy.
- apply: contraTneq => ->; rewrite cfunE eqAmod_sym.
- apply/negP=> /(int_eqAmod_prime_prim pr_eps pr_q (rpred1 _))/idPn[].
- by rewrite (dvdC_nat q 1) -(subnKC qgt2).
-apply: wlog_neg => suma_lt_H.
-suffices{ub_alpha} lb_a1_2: a1_2 >= #|H^#|%:R.
- have Pgt2: (2 < #|P|)%N by apply: leq_trans (subset_leq_card sW2P).
- apply: ler_trans (ler_trans lb_a1_2 _) ub_alpha.
- rewrite ler_pmull ?(ltr_le_trans _ lb_a1_2) ?ler1n ?ltr0n //.
- by rewrite -(subnKC Pgt2).
- have:= leq_trans (ltnW Pgt2) (subset_leq_card sPH).
- by rewrite (cardsD1 1%g) group1.
-have /CnatP[n Dn]: '[alpha] \in Cnat by rewrite Cnat_cfnorm_vchar.
-have /CnatP[m Dm]: a1_2 \in Cnat by rewrite Cnat_exp_even ?Cint_vchar1.
-rewrite Dm leC_nat leqNgt; apply: contra suma_lt_H => a1_2_lt_H.
-rewrite {1}Dsum_alpha Dn Dm -natrM ler_subr_addl (cardsD1 1%g H) group1 /=.
-case Dn1: n => [|[|n1]]; first by rewrite -cfnorm_eq0 Dn Dn1 eqxx in nz_alpha.
- have /dirrP[b [i Dalpha]]: alpha \in dirr H by rewrite dirrE Zalpha Dn Dn1 /=.
- rewrite -Dm /a1_2 Dalpha cfunE exprMn sqrr_sign mul1r muln1 mulrS ler_add2r.
- by rewrite lin_char1 ?expr1n //; apply/char_abelianP.
-rewrite -natrD leC_nat -add2n mulnDr (addnC 1%N) mulnDl -addnA.
-by apply: leq_trans (leq_addr _ _); rewrite muln2 -addnn leq_add2r ltnW.
-Qed.
-
-(* This is Peterfalvi (13.8). *)
-(* We have filled a logical gap in the textbook, which quotes (13.3.c) to get *)
-(* a j such that eta_01 is a component of mu_j^tau1, then asserts that the *)
-(* (orthogonality) assumptions of (13.5) have been checked, apparently *)
-(* implying that because for zeta in calS1 \ mu_j, zeta^tau1 is orthogonal to *)
-(* mu_j^tau1, as per the proof of (13.6), zeta^tau1 must be orthogonal to *)
-(* eta_01. This is wrong, because zeta^tau1, mu_j^tau1 and eta_01 are not *)
-(* characters, but virtual characters. We need to use a more careful line of *)
-(* reasoning, using the more precise characterization of calS1 in the lemma *)
-(* S1cases above (which does use the orthogonal-constituent argument, but *)
-(* for chi_j and Res_H zeta), and the decomposition given in (13.3.c) for all *)
-(* the mu_k. *)
-Lemma FTtypeP_sum_cycTIiso01_lb :
- \sum_(x in H^#) `|eta01 x| ^+ 2 >= #|PU|%:R - (u ^ 2)%:R.
-Proof.
-have [tau1 cohS [b _ Dtau1]] := FTtypeP_coherence.
-have Zeta01: eta01 \in 'Z[irr G] by rewrite cycTIiso_vchar.
-pose j1 := signW2 b #1; pose d : algC := (-1) ^+ b; pose mu1 := mu_ j1.
-have nzj1: j1 != 0 by [rewrite signW2_eq0 ?Iirr1_neq0]; have S1mu1 := S1mu nzj1.
-have o_mu_eta01 j: j != 0 -> '[tau1 (mu_ j), eta01] = d *+ (j == j1).
- move/Dtau1->; rewrite -/d cfdotZl cfdot_suml big_ord_recl /=.
- rewrite cfdot_cycTIiso andTb (inv_eq (signW2K b)).
- by rewrite big1 ?addr0 ?mulr_natr // => i _; rewrite cfdot_cycTIiso.
-have [zeta | alpha [Zalpha kerPalpha [_]]] := calS1_split1 cohS S1mu1 Zeta01.
- case/S1cases=> [[j nz_j ->] | /o_tau1_eta-> //].
- by rewrite o_mu_eta01 // (inj_eq (prTIred_inj _)) => /negPf->.
-rewrite o_mu_eta01 // eqxx mulrb => -> lb_alpha.
-rewrite -ler_subl_addl cfnorm_prTIred -/q mulrAC sqrr_sign mul1r.
-rewrite mu1uq // natrM exprMn (mulrAC _ q%:R) (mulrA _ q%:R) !mulfK ?neq0CG //.
-rewrite natrX -(sdprod_card defS) natrM -mulrBl mulfK ?neq0CG //.
-rewrite addrC opprB subrK mulrACA; apply: ler_trans lb_alpha.
-apply: ler_trans (P1_int2_lb _) _; first by rewrite rpredMsign Cint_vchar1.
-by rewrite exprMn sqrr_sign mul1r lerr.
-Qed.
-
-(* These are the assumptions for (13.9); K will be set to 'F(T) in the only *)
-(* application of this lemma, in the proof of (13.10). *)
-
-Variable K : {group gT}.
-Let G0 := ~: (class_support H G :|: class_support K G).
-
-Variables (tau1 : {additive 'CF(S) -> 'CF(G)}) (lambda : 'CF(S)).
-
-Hypothesis cohS : coherent_with calS S^# tau tau1.
-Hypothesis cohSmu : typeP_TIred_coherent tau1.
-
-Hypotheses (Slam : lambda \in calS) (irrHlam : irrIndH lambda).
-
-(* This is Peterfalvi (13.9)(a). *)
-(* As this part is only used to establish (13.9.b) it can be Section-local. *)
-Let cover_G0 : {in G0, forall x, tau1 lambda x != 0 \/ eta_ #1 0 x != 0}.
-Proof.
-have [[b _ Dtau1_mu] [/= Ilam Hlam]] := (cohSmu, andP irrHlam).
-pose sum_eta1 := (-1) ^+ b *: \sum_i eta_ i #1.
-have{Dtau1_mu} [j nz_j tau1muj]: exists2 j, j != 0 & tau1 (mu_ j) = sum_eta1.
- pose j := signW2 b #1; have nz: j != 0 by rewrite signW2_eq0 Iirr1_neq0.
- by exists j; rewrite // Dtau1_mu // signW2K.
-move=> x; rewrite !inE => /norP[H'x _].
-have{tau1muj} ->: tau1 lambda x = sum_eta1 x.
- rewrite -[lambda](subrK (mu_ j)) raddfD cfunE tau1muj.
- rewrite [tau1 _ x](cfun_on0 _ H'x) ?add0r {x H'x}//=.
- have Hmuj: mu_ j \in calH := Hmu nz_j.
- have dmu1: (lambda - mu_ j) 1%g == 0 by rewrite !cfunE !calHuq ?subrr.
- have H1dmu: lambda - mu_ j \in 'CF(S, H^#).
- by rewrite cfun_onD1 rpredB ?((seqInd_on (gFnormal _ _)) setT).
- have [_ ->] := cohS; last first.
- by rewrite zcharD1E ?rpredB ?mem_zchar ?FTseqInd_TIred /=.
- have A0dmu := cfun_onS (Fitting_sub_FTsupp0 maxS) H1dmu.
- have [_ _ _ _ [_ -> //]] := FTtypeP_facts.
- by rewrite cfInd_on ?subsetT // (cfun_onS _ H1dmu) ?imset2Sl ?subsetDl.
-apply/nandP/andP=> [[/eqP sum_eta1x_0 /eqP eta1x_0]].
-have cycW: cyclic W by have [] := ctiWG.
-have W'x: x \notin class_support (cyclicTIset defW) G.
- apply: contra_eqN eta1x_0 => /imset2P[{x H'x sum_eta1x_0}x g Wx Gg ->].
- rewrite cfunJ {g Gg}// cycTIiso_restrict //.
- by rewrite lin_char_neq0 ?irr_cyclic_lin //; case/setDP: Wx.
-have nz_i1 : #1 != 0 :> Iirr W1 by rewrite Iirr1_neq0.
-have eta_x_0 i: i != 0 -> eta_ i 0 x = 0.
- rewrite /w_ dprod_IirrEl => /(cfExp_prime_transitive pr_q nz_i1)[k co_k_p ->].
- have: coprime k #[w_ #1 0]%CF by rewrite /w_ dprod_IirrEl cforder_sdprod.
- rewrite rmorphX /= -dprod_IirrEl => /(cycTIiso_aut_exists ctiWG)[[uu ->] _].
- by rewrite cfunE /= -/sigma eta1x_0 rmorph0.
-have eta_i1 i: i != 0 -> eta_ i #1 x = eta_ 0 #1 x - 1.
- move=> nz_i; apply/eqP; pose alpha := cfCyclicTIset defW i #1.
- have Walpha: alpha \in 'CF(W, cyclicTIset defW).
- by rewrite (cfCycTI_on ctiWG) ?Iirr1_neq0.
- have: sigma alpha x == 0.
- by rewrite cycTIiso_Ind // (cfun_on0 _ W'x) ?cfInd_on ?subsetT.
- rewrite [alpha]cfCycTI_E linearD !linearB /= !cfunE cycTIiso1 cfun1E inE.
- by rewrite {1}eta_x_0 //= subr0 addrC addr_eq0 opprB.
-have eta11x: eta_ #1 #1 x = - (q%:R)^-1.
- rewrite -mulN1r; apply: canRL (mulfK (neq0CG W1)) _.
- transitivity ((-1) ^+ b * sum_eta1 x - 1); last first.
- by rewrite sum_eta1x_0 mulr0 add0r.
- rewrite cfunE signrMK mulr_natr -/q -nirrW1 -sumr_const sum_cfunE.
- by rewrite !(bigD1 0 isT) /= addrAC eta_i1 // (eq_bigr _ eta_i1).
-have: - eta_ #1 #1 x \in Cint.
- rewrite rpredN Cint_rat_Aint ?Aint_vchar ?cycTIiso_vchar //.
- by rewrite eta11x rpredN rpredV rpred_nat.
-case/norm_Cint_ge1/implyP/idPn; rewrite eta11x opprK invr_eq0 neq0CG /=.
-by rewrite normfV normr_nat invf_ge1 ?gt0CG // lern1 -ltnNge ltnW.
-Qed.
-
-(* This is Peterfalvi (13.9)(b). *)
-Lemma FTtypeP_sum_nonFitting_lb :
- \sum_(x in G0) (`|tau1 lambda x| ^+ 2 + `|eta_ #1 0 x| ^+ 2) >= #|G0|%:R.
-Proof.
-pose A (xi : 'CF(G)) := [set x in G0 | xi x != 0].
-suffices A_ub xi: xi \in dirr G -> #|A xi|%:R <= \sum_(x in G0) `|xi x| ^+ 2.
- apply: ler_trans (_ : (#|A (tau1 lambda)| + #|A (eta_ #1 0)|)%:R <= _).
- rewrite leC_nat -cardsUI /A !setIdE -setIUr (leq_trans _ (leq_addr _ _)) //.
- rewrite subset_leq_card // subsetIidl.
- by apply/subsetP=> x /cover_G0/orP; rewrite !inE.
- rewrite natrD big_split ler_add ?A_ub ?cycTIiso_dirr //.
- have [[[Itau1 Ztau1] _] [Ilam _]] := (cohS, andP irrHlam).
- by rewrite dirrE Ztau1 ?Itau1 ?mem_zchar //= irrWnorm.
-case/dirrP=> d [t Dxi]; rewrite (big_setID [set x | xi x != 0]) /= addrC.
-rewrite -setIdE -/(A _) big1 ?add0r => [|x]; last first.
- by rewrite !inE negbK => /andP[/eqP-> _]; rewrite normr0 expr0n.
-rewrite -sum1_card !(partition_big_imset (@cycle _)) /= natr_sum.
-apply: ler_sum => _ /imsetP[x Ax ->].
-pose B := [pred y | generator <[x]> y]; pose phi := 'Res[<[x]>] 'chi_t.
-have defA: [pred y in A xi | <[y]> == <[x]>] =i B.
- move=> y; rewrite inE /= eq_sym andb_idl // !inE => eq_xy.
- have LGxy L (LG := class_support L G): x \notin LG -> y \notin LG.
- rewrite /LG class_supportEr; apply: contra => /bigcupP[g Gg Lg_y].
- apply/bigcupP; exists g => //; move: Lg_y.
- by rewrite -!cycle_subG (eqP eq_xy).
- move: Ax; rewrite !inE !negb_or -andbA => /and3P[/LGxy-> /LGxy->].
- apply: contraNneq => chi_y_0.
- have [k co_k_y ->]: exists2 k, coprime k #[y] & x = (y ^+ k)%g.
- have Yx: generator <[y]> x by rewrite [generator _ _]eq_sym.
- have /cycleP[k Dx] := cycle_generator Yx; exists k => //.
- by rewrite coprime_sym -generator_coprime -Dx.
- have Zxi: xi \in 'Z[irr G] by rewrite Dxi rpredZsign irr_vchar.
- have [uu <- // _] := make_pi_cfAut [group of G] co_k_y.
- by rewrite cfunE chi_y_0 rmorph0.
-have resB: {in B, forall y, `|xi y| ^+ 2 = `|phi y| ^+ 2}.
- move=> y /cycle_generator Xy.
- by rewrite Dxi cfunE normrMsign cfResE ?subsetT.
-rewrite !(eq_bigl _ _ defA) sum1_card (eq_bigr _ resB).
-apply: sum_norm2_char_generators => [|y By].
- by rewrite cfRes_char ?irr_char.
-rewrite -normr_eq0 -sqrf_eq0 -resB // sqrf_eq0 normr_eq0.
-by move: By; rewrite -defA !inE -andbA => /and3P[].
-Qed.
-
-End Thirteen_2_3_5_to_9.
-
-Section Thirteen_4_10_to_16.
-
-(* These assumptions correspond to Peterfalvi, Hypothesis (13.1), most of *)
-(* which gets used to prove (13.4) and (13.9-13). *)
-
-Variables S U W W1 W2 : {group gT}.
-Hypotheses (maxS : S \in 'M) (defW : W1 \x W2 = W).
-Hypotheses (StypeP : of_typeP S U defW).
-
-Local Notation "` 'W1'" := (gval W1) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W2'" := (gval W2) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W'" := (gval W) (at level 0, only parsing) : group_scope.
-Local Notation V := (cyclicTIset defW).
-
-Local Notation "` 'S'" := (gval S) (at level 0, only parsing) : group_scope.
-Local Notation P := `S`_\F%G.
-Local Notation "` 'P'" := `S`_\F (at level 0) : group_scope.
-Local Notation PU := S^`(1)%G.
-Local Notation "` 'PU'" := `S^`(1) (at level 0) : group_scope.
-Local Notation "` 'U'" := (gval U) (at level 0, only parsing) : group_scope.
-Local Notation C := 'C_U(`P)%G.
-Local Notation "` 'C'" := 'C_`U(`P) (at level 0) : group_scope.
-Local Notation H := 'F(S)%G.
-Local Notation "` 'H'" := 'F(`S) (at level 0) : group_scope.
-
-Let defS : PU ><| W1 = S. Proof. by have [[]] := StypeP. Qed.
-Let defPU : P ><| U = PU. Proof. by have [_ []] := StypeP. Qed.
-Let defH : P \x C = H. Proof. by have [] := typeP_context StypeP. Qed.
-
-Let notStype1 : FTtype S != 1%N. Proof. exact: FTtypeP_neq1 StypeP. Qed.
-Let notStype5 : FTtype S != 5%N. Proof. exact: FTtype5_exclusion maxS. Qed.
-
-Let pddS := FT_prDade_hypF maxS StypeP.
-Let ptiWS : primeTI_hypothesis S PU defW := FT_primeTI_hyp StypeP.
-Let ctiWG : cyclicTI_hypothesis G defW := pddS.
-Local Notation Sfacts := (FTtypeP_facts maxS StypeP).
-
-Let ntW1 : W1 :!=: 1. Proof. by have [[]] := StypeP. Qed.
-Let ntW2 : W2 :!=: 1. Proof. by have [_ _ _ []] := StypeP. Qed.
-Let cycW1 : cyclic W1. Proof. by have [[]] := StypeP. Qed.
-Let cycW2 : cyclic W2. Proof. by have [_ _ _ []] := StypeP. Qed.
-
-Let p := #|W2|.
-Let q := #|W1|.
-
-Let pr_p : prime p. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed.
-Let pr_q : prime q. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed.
-
-Let qgt2 : q > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
-Let pgt2 : p > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
-
-Let coPUq : coprime #|PU| q.
-Proof. by rewrite (coprime_sdprod_Hall_r defS); have [[]] := StypeP. Qed.
-
-Let sW2P: W2 \subset P. Proof. by have [_ _ _ []] := StypeP. Qed.
-
-Let p'q : q != p.
-Proof.
-by rewrite -dvdn_prime2 -?prime_coprime -?(cyclic_dprod defW) //; case: ctiWG.
-Qed.
-
-Let nirrW1 : #|Iirr W1| = q. Proof. by rewrite card_Iirr_cyclic. Qed.
-Let nirrW2 : #|Iirr W2| = p. Proof. by rewrite card_Iirr_cyclic. Qed.
-Let NirrW1 : Nirr W1 = q. Proof. by rewrite -nirrW1 card_ord. Qed.
-Let NirrW2 : Nirr W2 = p. Proof. by rewrite -nirrW2 card_ord. Qed.
-
-Local Open Scope ring_scope.
-
-Let sigma := (cyclicTIiso ctiWG).
-Let w_ i j := (cyclicTIirr defW i j).
-Local Notation eta_ i j := (sigma (w_ i j)).
-
-Let mu_ := primeTIred ptiWS.
-Local Notation tau := (FT_Dade0 maxS).
-
-Let calS0 := seqIndD PU S S`_\s 1.
-Let rmR := FTtypeP_coh_base maxS StypeP.
-Let scohS0 : subcoherent calS0 tau rmR.
-Proof. exact: FTtypeP_subcoherent StypeP. Qed.
-
-Let calS := seqIndD PU S P 1.
-Let sSS0 : cfConjC_subset calS calS0.
-Proof. exact/seqInd_conjC_subset1/Fcore_sub_FTcore. Qed.
-
-Local Notation calH := (seqIndT H S).
-Local Notation calHuq := (FTtypeP_Ind_Fitting_1 maxS StypeP).
-
-Section Thirteen_10_to_13_15.
-
-(* This section factors the assumption that S contains an irreducible induced *)
-(* from a linear character of H. It does not actually export (13.4) and *)
-(* and (4.11) but instead uses them to carry out the bulk of the proofs of *)
-(* (4.12), (4.13) and (4.15). The combinatorial bound m is also local to this *)
-(* Section, but (4.10) has to be exported from an inner Section that factors *)
-(* facts about T, the typeP pair associate of S. *)
-(* Note that u and c are bound locally to this section; we will set u = #|U| *)
-(* after this section. *)
-
-Variable lambda : 'CF(S).
-Hypotheses (Slam : lambda \in calS) (irrHlam : irrIndH lambda).
-Let Hlam : lambda \in calH. Proof. by have [] := andP irrHlam. Qed.
-Let Ilam : lambda \in irr S. Proof. by have [] := andP irrHlam. Qed.
-
-Let c := #|C|.
-Let u := #|U : C|.
-Let oU : #|U| = (u * c)%N. Proof. by rewrite mulnC Lagrange ?subsetIl. Qed.
-
-Let m : algC := 1 - q.-1%:R^-1 - q.-1%:R / (q ^ p)%:R + (q.-1 * q ^ p)%:R^-1.
-
-Section Thirteen_4_10.
-
-(* This Section factors assumptions and facts about T, including Lemma (13.4) *)
-(* is local to this Section. *)
-
-Variables T V : {group gT}.
-Hypotheses (maxT : T \in 'M) (xdefW : W2 \x W1 = W).
-Hypothesis TtypeP : of_typeP T V xdefW.
-
-Local Notation Q := (gval T)`_\F.
-Local Notation D := 'C_(gval V)(Q).
-Local Notation K := 'F(gval T).
-Let v := #|V : D|.
-
-Local Notation calT := (seqIndD T^`(1) T (gval T)`_\F 1).
-
-(* This part of the proof of (13.4) is reused in (13.10). *)
-Let tiHK: class_support H^# G :&: class_support K^# G = set0.
-Proof.
-apply/eqP/set0Pn => [[_ /setIP[/imset2P[x g1 H1x _ ->] /imset2P[xg g2]]]].
-pose g := (g2 * g1^-1)%g => /setD1P[_ Kxg] _ Dxg.
-have{Kxg Dxg} Kgx: x \in K :^ g by rewrite conjsgM mem_conjgV Dxg memJ_conjg.
-have{Kgx} cxQg: Q :^ g \subset 'C[x].
- rewrite sub_cent1 (subsetP _ _ Kgx) // centJ conjSg centsC.
- have [/dprodW/mulG_sub[/subset_trans-> //=]] := typeP_context TtypeP.
- exact: FTtypeP_Fitting_abelian TtypeP.
-have{cxQg} sQgS: Q :^ g \subset S.
- have sH1A0 := subset_trans (Fitting_sub_FTsupp maxS) (FTsupp_sub0 S).
- have{sH1A0} A0x: x \in 'A0(S) := subsetP sH1A0 x H1x.
- have [_ _ _ _ [tiA0 _]] := Sfacts.
- by have:= cent1_normedTI tiA0 A0x; rewrite setTI; apply: subset_trans.
-have /pHallP[_ eq_Sq_q]: q.-Hall(S) W1.
- have qW1: q.-group W1 by rewrite /pgroup pnat_id.
- have [|//] := coprime_mulGp_Hall (sdprodW defS) _ qW1.
- by rewrite /pgroup p'natE // -prime_coprime // coprime_sym.
-have:= partn_dvd q (cardG_gt0 _) (cardSg sQgS).
-rewrite cardJg /= -eq_Sq_q => /(dvdn_leq_log q (cardG_gt0 _))/idPn[].
-have [_ [_ ->] _ _ _] := FTtypeP_facts maxT TtypeP.
-by rewrite -ltnNge p_part !pfactorK // logn_prime // eqxx ltnW.
-Qed.
-
-(* This is Peterfalvi (13.4). *)
-Let T_Galois : [/\ typeP_Galois TtypeP, D = 1%g & v = (q ^ p).-1 %/ q.-1].
-Proof.
-apply: FTtypeP_no_Ind_Fitting_facts => //; apply/hasPn=> theta Ttheta.
-apply/andP=> [[/= irr_theta Ktheta]]; set calK := seqIndT _ T in Ktheta.
-have [tau1S cohS [bS _ Dtau1Smu]] := FTtypeP_coherence maxS StypeP.
-have [tau1T cohT [bT _ Dtau1Tnu]] := FTtypeP_coherence maxT TtypeP.
-have [[[Itau1S Ztau1S] Dtau1S] [[Itau1T Ztau1T] Dtau1T]] := (cohS, cohT).
-have onF0 := cfun_onS (Fitting_sub_FTsupp0 _).
-pose HG := class_support H^# G; pose KG := class_support K^# G.
-have Hdlambda xi:
- xi \in calH -> xi \in calS -> tau1S (lambda - xi) \in 'CF(G, HG).
-- move=> Hxi Sxi; have H1dxi: lambda - xi \in 'CF(S, H^#).
- rewrite cfun_onD1 rpredB ?((seqInd_on (gFnormal _ _)) setT) //=.
- by rewrite !cfunE !calHuq ?subrr.
- rewrite Dtau1S ?zcharD1E ?rpredB ?mem_zchar ?(cfun_on0 H1dxi) ?inE ?eqxx //=.
- by have [_ _ _ _ [_ ->]] := Sfacts; rewrite ?onF0 // cfInd_on ?subsetT.
-have Kdtheta xi:
- xi \in calK -> xi \in calT -> tau1T (theta - xi) \in 'CF(G, KG).
-- move=> Kxi Txi; have K1dxi: theta - xi \in 'CF(T, K^#).
- rewrite cfun_onD1 rpredB ?((seqInd_on (gFnormal _ _)) setT) //=.
- by rewrite !cfunE !(FTtypeP_Ind_Fitting_1 _ TtypeP) ?subrr.
- rewrite Dtau1T ?zcharD1E ?rpredB ?mem_zchar ?(cfun_on0 K1dxi) ?inE ?eqxx //=.
- have [_ _ _ _ [_ ->]] := FTtypeP_facts maxT TtypeP; last exact: onF0.
- by rewrite cfInd_on ?subsetT.
-have oHK alpha beta:
- alpha \in 'CF(G, HG) -> beta \in 'CF(G, KG) -> '[alpha, beta] = 0.
-- by move=> Halpha Kbeta; rewrite (cfdotElr Halpha Kbeta) tiHK big_set0 mulr0.
-have o_lambda_theta: '[tau1S lambda, tau1T theta] = 0.
- pose S1 := lambda :: lambda^*%CF; pose T1 := theta :: theta^*%CF.
- have sS1S: {subset S1 <= calS} by apply/allP; rewrite /= Slam cfAut_seqInd.
- have sT1T: {subset T1 <= calT} by apply/allP; rewrite /= Ttheta cfAut_seqInd.
- have ooS1: orthonormal (map tau1S S1).
- rewrite map_orthonormal //; first exact: (sub_in2 (zchar_subset sS1S)).
- apply: seqInd_conjC_ortho2 Slam; rewrite ?gFnormal ?mFT_odd //.
- by have /mulG_sub[] := sdprodW defPU.
- have ooT1: orthonormal (map tau1T T1).
- rewrite map_orthonormal //; first exact: (sub_in2 (zchar_subset sT1T)).
- apply: seqInd_conjC_ortho2 Ttheta; rewrite ?gFnormal ?mFT_odd //.
- by have [_ [_ _ _ /sdprodW/mulG_sub[]]] := TtypeP.
- have /andP/orthonormal_vchar_diff_ortho := conj ooS1 ooT1; apply.
- by split; apply/allP; rewrite /= ?Ztau1S ?Ztau1T ?mem_zchar ?cfAut_seqInd.
- have on1'G M beta: beta \in 'CF(G, class_support M^# G) -> beta 1%g = 0.
- move/cfun_on0->; rewrite // class_supportEr -cover_imset -class_supportD1.
- by rewrite !inE eqxx.
- rewrite -!raddfB; set alpha := tau1S _; set beta := tau1T _.
- have [Halpha Kbeta]: alpha \in 'CF(G, HG) /\ beta \in 'CF(G, KG).
- by rewrite Hdlambda ?Kdtheta ?cfAut_seqInd ?cfAut_seqIndT.
- by rewrite oHK // {1}(on1'G _ _ Halpha) (on1'G _ _ Kbeta) !eqxx.
-pose ptiWT := FT_primeTI_hyp TtypeP; pose nu_ := primeTIred ptiWT.
-have etaC := cycTIisoC (FT_cyclicTI_hyp StypeP) (FT_cyclicTI_hyp TtypeP).
-have /idPn[]: '[tau1S (lambda - mu_ #1), tau1T (theta - nu_ #1)] == 0.
- rewrite oHK //.
- by rewrite Hdlambda ?FTseqInd_TIred ?FTprTIred_Ind_Fitting ?Iirr1_neq0.
- by rewrite Kdtheta ?FTseqInd_TIred ?FTprTIred_Ind_Fitting ?Iirr1_neq0.
-rewrite !raddfB /= !cfdotBl o_lambda_theta Dtau1Smu ?Dtau1Tnu ?Iirr1_neq0 //.
-rewrite !cfdotZl !cfdotZr rmorph_sign !cfdot_suml big1 => [|i _]; last first.
- rewrite cfdotC etaC (coherent_ortho_cycTIiso TtypeP _ cohT) ?conjC0 //.
- by apply: seqInd_conjC_subset1; apply: Fcore_sub_FTcore.
-rewrite cfdot_sumr big1 ?mulr0 ?subr0 ?add0r ?opprK => [|j _]; last first.
- by rewrite -etaC (coherent_ortho_cycTIiso StypeP _ cohS).
-set i1 := iter bT _ #1; set j1 := iter bS _ #1.
-rewrite !mulf_eq0 !signr_eq0 (bigD1 i1) //= addrC big1 => [|i i1'i]; last first.
- rewrite etaC cfdot_sumr big1 // => j _; rewrite cfdot_cycTIiso.
- by rewrite (negPf i1'i) andbF.
-rewrite etaC cfdot_sumr (bigD1 j1) //= cfdot_cycTIiso !eqxx addrCA.
-rewrite big1 ?addr0 ?oner_eq0 // => j j1'j; rewrite cfdot_cycTIiso.
-by rewrite eq_sym (negPf j1'j).
-Qed.
-
-(* This is Peterfalvi (13.10). *)
-Lemma FTtypeP_compl_ker_ratio_lb : m * (p ^ q.-1)%:R / q%:R < u%:R / c%:R.
-Proof.
-have [tau1 cohS cohSmu] := FTtypeP_coherence maxS StypeP.
-pose lam1 := tau1 lambda; pose eta10 := eta_ #1 0.
-pose H1G := class_support H^# G; pose K1G := class_support K^# G.
-pose G0 := ~: (class_support H G :|: class_support K G).
-pose invJ (f : gT -> algC) := forall y x, f (x ^ y) = f x.
-pose nm2 (chi : 'CF(G)) x := `|chi x| ^+ 2; pose g : algC := #|G|%:R.
-have injJnm2 chi: invJ (nm2 chi) by move=> y x; rewrite /nm2 cfunJ ?inE.
-have nm2_dirr chi: chi \in dirr G -> g^-1 <= nm2 chi 1%g / g.
- case/dIrrP=> d ->; rewrite -{1}[g^-1]mul1r ler_pmul2r ?invr_gt0 ?gt0CG //.
- rewrite expr_ge1 ?normr_ge0 // cfunE normrMsign.
- by rewrite irr1_degree normr_nat ler1n irr_degree_gt0.
-pose mean (F M : {set gT}) (f : gT -> algC) := (\sum_(x in F) f x) / #|M|%:R.
-have meanTI M (F := 'F(gval M)^#) (FG := class_support F G) f:
- M \in 'M -> normedTI F G M -> invJ f -> mean FG G f = mean F M f.
-- move=> maxM /and3P[ntF tiF /eqP defN] fJ; apply: canLR (mulfK (neq0CG _)) _.
- rewrite (set_partition_big _ (partition_class_support ntF tiF)) /=.
- rewrite mulrAC -mulrA -natf_indexg ?subsetT //=.
- have ->: #|G : M| = #|F :^: G| by rewrite card_conjugates defN.
- rewrite mulr_natr -sumr_const; apply: eq_bigr => _ /imsetP[y _ ->].
- by rewrite (big_imset _ (in2W (conjg_inj _))) (eq_bigr _ (in1W (fJ y))).
-have{meanTI} meanG f :
- invJ f -> mean G G f = f 1%g / g + mean H^# S f + mean K^# T f + mean G0 G f.
-- have type24 maxM := compl_of_typeII_IV maxM _ (FTtype5_exclusion maxM).
- have tiH: normedTI H^# G S by have/type24[] := StypeP.
- have{type24} tiK: normedTI K^# G T by have/type24[] := TtypeP.
- move=> fJ; rewrite -!meanTI // {1}/mean (big_setD1 1%g) // (big_setID H1G) /=.
- rewrite [in rhs in _ + (_ + rhs)](big_setID K1G) /= -/g -!mulrDl !addrA.
- congr ((_ + _ + _ + _) / g); rewrite ?(setIidPr _) // /H1G /K1G.
- + by rewrite class_supportEr -cover_imset -class_supportD1 setSD ?subsetT.
- + rewrite subsetD -setI_eq0 setIC tiHK eqxx andbT.
- by rewrite class_supportEr -cover_imset -class_supportD1 setSD ?subsetT.
- rewrite !class_supportEr -!cover_imset -!class_supportD1.
- apply: eq_bigl => x; rewrite !inE andbT -!negb_or orbCA orbA orbC.
- by case: (x =P 1%g) => //= ->; rewrite mem_class_support ?group1.
-have lam1_ub: mean G0 G (nm2 lam1) <= lambda 1%g ^+ 2 / #|S|%:R - g^-1.
- have [[Itau1 Ztau1] _] := cohS.
- have{Itau1} n1lam1: '[lam1] = 1 by rewrite Itau1 ?mem_zchar ?irrWnorm.
- have{Ztau1} Zlam1: lam1 \in 'Z[irr G] by rewrite Ztau1 ?mem_zchar.
- rewrite -ler_opp2 opprB -(ler_add2l '[lam1]) {1}n1lam1 addrCA.
- rewrite (cfnormE (cfun_onG _)) (mulrC g^-1) [_ / g](meanG (nm2 _)) // addrK.
- rewrite -addrA ler_add ?nm2_dirr //; first by rewrite dirrE Zlam1 n1lam1 /=.
- rewrite ler_paddr ?divr_ge0 ?ler0n //.
- by apply: sumr_ge0 => x _; rewrite exprn_ge0 ?normr_ge0.
- rewrite ler_pdivl_mulr ?gt0CG // mulrBl mul1r divfK ?neq0CG //.
- by rewrite (FTtypeP_sum_Ind_Fitting_lb StypeP).
-pose ub_lam1 : algC := (#|T^`(1)%g|%:R - (v ^ 2)%:R - #|Q|.-1%:R) / #|T|%:R.
-have [_ D_1 Dv] := T_Galois.
-have defK : K = Q by have [<-] := typeP_context TtypeP; rewrite D_1 dprodg1.
-have eta10_ub: mean G0 G (nm2 (eta_ #1 0)) <= #|G0|%:R / g - ub_lam1.
- rewrite -ler_opp2 opprB -(ler_add2l '[eta_ #1 0]) {2}(cfnormE (cfun_onG _)).
- rewrite (mulrC g^-1) [_ / g in rhs in _ <= rhs](meanG (nm2 _)) // addrK.
- have ->: '[eta_ #1 0] = mean G G (fun _ => 1).
- by rewrite /mean sumr_const cfdot_cycTIiso eqxx divff ?neq0CG.
- rewrite meanG // [in lhs in lhs <= _]/mean !sumr_const addrACA subrr addr0.
- rewrite [lhs in lhs <= _]addrAC -addrA -mulrDl (cardsD1 1%g Q) group1 -defK.
- rewrite mul1r subrK ?ler_add ?ler_pmul2r ?invr_gt0 ?gt0CG //.
- - by rewrite nm2_dirr ?cycTIiso_dirr.
- - exact: (FTtypeP_sum_cycTIiso10_lb _ StypeP).
- congr (_ <= _): (FTtypeP_sum_cycTIiso01_lb maxT TtypeP).
- by apply: eq_bigr => x _; congr (nm2 _ x); apply: cycTIisoC.
-have: ub_lam1 < lambda 1%g ^+ 2 / #|S|%:R.
- rewrite -[_ / _](subrK g^-1) ltr_spaddr ?invr_gt0 ?gt0CG //.
- rewrite -(ler_add2r (#|G0|%:R / g)) -ler_subr_addl -addrA.
- apply: ler_trans (ler_add lam1_ub eta10_ub).
- rewrite -mulrDl -big_split /= ler_pmul2r ?invr_gt0 ?gt0CG //.
- exact: FTtypeP_sum_nonFitting_lb.
-rewrite calHuq // -/u -(sdprod_card defS) -/q -(sdprod_card defPU) oU mulnC.
-rewrite mulnCA mulnAC !natrM !invfM expr2 !mulrA !mulfK ?neq0CG ?neq0CiG //.
-rewrite mulrAC ltr_pdivl_mulr ?ltr_pdivr_mulr ?gt0CG //.
-congr (_ < _); last by rewrite -mulrA mulrC.
-have [_ [_ ->] _ _ _] := Sfacts; rewrite -/p -/q.
-rewrite -{1}(ltn_predK qgt2) expnS natrM mulrA; congr (_ * _).
-have /sdprod_card oT: T^`(1) ><| W2 = T by have [[]] := TtypeP.
-rewrite /ub_lam1 -{}oT natrM invfM mulrA divfK ?mulrBl ?divff ?neq0CG //.
-have /sdprod_card <-: Q ><| V = T^`(1)%g by have [_ []] := TtypeP.
-have ->: #|V| = v by rewrite /v D_1 indexg1.
-rewrite mulnC !natrM invfM mulrA mulfK ?neq0CiG //.
-have [_ [_ oQ] _ _ _] := FTtypeP_facts maxT TtypeP; rewrite -/p -/q /= in oQ.
-rewrite Dv natf_div ?dvdn_pred_predX // oQ.
-rewrite invfM invrK -mulrA -subn1 mulVKf ?gtr_eqF ?ltr0n //; last first.
- by rewrite subn_gt0 -(exp1n p) ltn_exp2r ltnW // ltnW.
-rewrite -oQ natrB ?cardG_gt0 // !mulrBl mul1r mulrC mulKf ?neq0CG // -invfM.
-by rewrite -natrM oQ opprD opprK addrA addrAC.
-Qed.
-
-End Thirteen_4_10.
-
-(* This is (13.10) without the dependency on T. *)
-Let gen_lb_uc : m * (p ^ q.-1)%:R / q%:R < u%:R / c%:R.
-Proof.
-have [T pairST [xdefW [V TtypeP]]] := FTtypeP_pair_witness maxS StypeP.
-by apply: FTtypeP_compl_ker_ratio_lb TtypeP; have [[]] := pairST.
-Qed.
-
-Import ssrint.
-(* This is Peterfalvi (13.11). *)
-Let lb_m_cases :
- [/\ (*a*) (q >= 7)%N -> m > 8%:R / 10%:R,
- (*b*) (q >= 5)%N -> m > 7%:R / 10%:R
- & (*c*) q = 3 ->
- m > 49%:R / 100 %:R /\ u%:R / c%:R > (p ^ 2).-1%:R / 6%:R :> algC].
-Proof.
-pose mkrat b d := fracq (b, d%:Z).
-pose test r b d := 1 - mkrat 1 r.-1 - mkrat 1 (r ^ 2)%N > mkrat b%:Z d.
-have lb_m r b d: test r.+2 b d -> (q >= r.+2)%N -> m > b%:R / d%:R.
- rewrite /test /mkrat !fracqE !CratrE /= => ub_bd le_r_q.
- apply: ltr_le_trans ub_bd _; rewrite ler_paddr ?invr_ge0 ?ler0n //.
- rewrite -!addrA ler_add2l -!opprD ler_opp2 ler_add //.
- rewrite mul1r lef_pinv ?qualifE ?ltr0n //; last by rewrite -(subnKC qgt2).
- by rewrite leC_nat -ltnS (ltn_predK qgt2).
- rewrite -(ltn_predK pgt2) expnSr natrM invfM mulrA.
- rewrite ler_pdivr_mulr ?gt0CG // mulrAC mul1r -subn1.
- rewrite ler_pmul ?invr_ge0 ?ler0n ?leC_nat ?leq_subr //.
- rewrite lef_pinv ?qualifE ?ltr0n ?leC_nat ?expn_gt0 ?(prime_gt0 pr_q) //.
- apply: leq_trans (_ : q ^ 2 <= _)%N; first by rewrite leq_exp2r.
- by rewrite -(subnKC qgt2) leq_pexp2l // -subn1 ltn_subRL.
-split=> [||q3]; try by apply: lb_m; compute.
-pose d r : algC := (3 ^ r.-1)%:R^-1; pose f r := (r ^ 2)%:R * d r.
-have Dm: m = (1 - d p) / 2%:R.
- rewrite mulrBl mul1r -mulrN mulrC /m q3 /= addrAC -addrA natrM invfM -mulrBl.
- rewrite -{1}(ltn_predK pgt2) expnS natrM invfM mulrA.
- by congr (_ + _ / _); apply/eqP; rewrite -!CratrE; compute.
-split; last apply: ler_lt_trans gen_lb_uc.
- apply: ltr_le_trans (_ : (1 - d 5) / 2%:R <= _).
- by rewrite /d -!CratrE; compute.
- rewrite Dm ler_pmul2r ?invr_gt0 ?ltr0n // ler_add2l ler_opp2.
- rewrite lef_pinv ?qualifE ?ltr0n ?expn_gt0 // leC_nat leq_pexp2l //=.
- by rewrite -subn1 ltn_subRL odd_geq ?mFT_odd //= ltn_neqAle pgt2 andbT -q3.
-rewrite -mulrA mulrCA Dm -mulrA -invfM -natrM mulrA q3 mulrBr mulr1.
-rewrite ler_pmul2r ?invr_gt0 ?ltr0n //= -subn1 natrB ?expn_gt0 ?prime_gt0 //.
-rewrite ler_add2l ler_opp2 -/(f p) -(subnKC pgt2).
-elim: (p - 3)%N => [|r]; first by rewrite /f /d -!CratrE; compute.
-apply: ler_trans; rewrite addnS /f /d; set x := (3 + r)%N.
-rewrite ler_pdivr_mulr ?ltr0n ?expn_gt0 // mulrAC (expnS 3) (natrM _ 3).
-rewrite mulrA mulfK ?gtr_eqF ?ltr0n ?expn_gt0 //.
-rewrite -ler_pdivr_mull ?ltr0n // !natrX -exprVn -exprMn.
-rewrite mulrS mulrDr mulr1 mulVf ?pnatr_eq0 //.
-apply: ler_trans (_ : (3%:R^-1 + 1) ^+ 2 <= _); last by rewrite -!CratrE.
-rewrite ler_sqr ?rpredD ?rpred1 ?rpredV ?rpred_nat // ler_add2r.
-by rewrite lef_pinv ?qualifE ?ltr0n ?leC_nat.
-Qed.
-
-(* This corollary of (13.11) is used in both (13.12) and (13.15). *)
-Let small_m_q3 : m < (q * p)%:R / (q.*2.+1 * p.-1)%:R -> q = 3 /\ (p >= 5)%N.
-Proof.
-move=> ub_m; have [lb7_m lb5_m _] := lb_m_cases.
-have [p3 | p_neq3] := eqVneq p 3.
- have ub7_m: ~~ (8%:R / 10%:R < m).
- rewrite ltr_gtF // (ltr_le_trans ub_m) // p3 /=.
- apply: ler_trans (_ : 3%:R / 4%:R <= _); last first.
- by rewrite -!CratrE; compute.
- rewrite ler_pdivl_mulr ?ltr0n // mulrAC ler_pdivr_mulr ?ltr0n ?muln_gt0 //.
- by rewrite -!natrM leC_nat mulnCA mulSn -muln2 -!mulnA leq_addl.
- have{ub7_m} q5: q = 5.
- apply: contraNeq ub7_m; rewrite neq_ltn odd_ltn ?mFT_odd //= ltnS leqNgt.
- by rewrite ltn_neqAle qgt2 -{1}p3 eq_sym p'q -(odd_geq 7) ?mFT_odd.
- have /implyP := ltr_trans (lb5_m _) ub_m.
- by rewrite q5 p3 -!CratrE; compute.
-have pge5: (5 <= p)%N by rewrite odd_geq ?mFT_odd // ltn_neqAle eq_sym p_neq3.
-have ub5_m: ~~ (7%:R / 10%:R < m).
- rewrite ltr_gtF // (ltr_le_trans ub_m) //.
- apply: ler_trans (_ : 2%:R^-1 * (1 + 4%:R^-1) <= _); last first.
- by rewrite -!CratrE; compute.
- rewrite !natrM invfM mulrACA ler_pmul ?divr_ge0 ?ler0n //.
- rewrite ler_pdivr_mulr ?ler_pdivl_mull ?ltr0n // -natrM mul2n leC_nat.
- by rewrite ltnW.
- rewrite -(subnKC pge5) [_%:R]mulrSr mulrDl divff ?pnatr_eq0 // ler_add2l.
- by rewrite mul1r lef_pinv ?qualifE ?ltr0n // leC_nat.
-split=> //; apply: contraNeq ub5_m.
-by rewrite neq_ltn ltnNge qgt2 -(odd_geq 5) ?mFT_odd.
-Qed.
-
-(* A more usable form for (13.10). *)
-Let gen_ub_m : m < (q * u)%:R / (c * p ^ q.-1)%:R.
-Proof.
-rewrite !natrM invfM mulrA ltr_pdivl_mulr ?ltr0n ?expn_gt0 ?cardG_gt0 //.
-by rewrite -mulrA -ltr_pdivr_mull ?gt0CG // mulrC.
-Qed.
-
-(* This is the bulk of the proof of Peterfalvi (13.12). *)
-Lemma FTtypeP_Ind_Fitting_reg_Fcore : c = 1%N.
-Proof.
-apply/eqP/wlog_neg; rewrite eqn_leq cardG_gt0 andbT -ltnNge => c_gt1.
-have ub_m: m < (q * (p ^ q).-1)%:R / (c * p ^ q.-1 * p.-1)%:R.
- rewrite 2!natrM invfM mulrACA mulrAC -natf_div ?dvdn_pred_predX // -natrM.
- rewrite (ltr_le_trans gen_ub_m) // ler_pmul ?invr_ge0 ?ler0n // leC_nat.
- by rewrite leq_mul //; case: Sfacts.
-have regCW1: semiregular C W1.
- have [[_ _ /Frobenius_reg_ker regUW1 _] _ _ _] := FTtypeP_facts maxS StypeP.
- by move=> _ y /regUW1 regUx; rewrite setIAC regUx setI1g.
-have{regCW1} dv_2q_c1: q.*2 %| c.-1.
- rewrite -(subnKC c_gt1) -mul2n Gauss_dvd ?coprime2n ?dvdn2 ?mFT_odd //=.
- rewrite odd_sub ?mFT_odd -?subSn // subn2 regular_norm_dvd_pred //.
- have /mulG_sub[_ sW1S] := sdprodW defS.
- apply: normsI; first by have [_ []] := StypeP.
- by rewrite (subset_trans sW1S) ?norms_cent ?gFnorm.
-have [q3 pge5]: q = 3 /\ (p >= 5)%N.
- apply: small_m_q3; apply: (ltr_le_trans ub_m).
- rewrite !natrM -!mulrA ler_pmul2l ?gt0CG //.
- rewrite !invfM !mulrA -(subnKC pgt2) ler_pmul2r ?invr_gt0 ?ltr0n //.
- rewrite ler_pdivr_mulr ?ltr0n ?expn_gt0 // mulrAC -natrM -expnS.
- rewrite prednK ?cardG_gt0 // ler_pmul ?invr_ge0 ?ler0n ?leC_nat ?leq_pred //.
- rewrite lef_pinv ?qualifE ?gt0CG ?ltr0n // leC_nat.
- by rewrite -(subnKC c_gt1) ltnS dvdn_leq //= -subSn ?subn2.
-have [_ _ [//|lb_m lb_uc]] := lb_m_cases.
-pose sum3 r : algC := (r.+1 ^ 2)%:R^-1 + r.+1%:R^-1 + 1.
-have [b Dc1] := dvdnP dv_2q_c1; rewrite q3 in Dc1.
-have [b0 | b_gt0] := posnP b; first by rewrite b0 -(subnKC c_gt1) in Dc1.
-have ub3_m r a: (r < p)%N -> (a <= b)%N -> m < 3%:R / (a * 6).+1%:R * sum3 r.
- move=> lb_p lb_b; apply: ltr_le_trans ub_m _.
- rewrite !natrM !invfM mulrACA -!mulrA q3 ler_pmul2l ?ltr0n //.
- rewrite -(ltn_predK c_gt1) Dc1 ler_pmul ?mulr_ge0 ?invr_ge0 ?ler0n //.
- by rewrite lef_pinv ?qualifE ?ltr0n // leC_nat ltnS leq_mul.
- rewrite predn_exp mulnC natrM 2!big_ord_recl big_ord1 /= /bump /= expn1.
- rewrite -(subnKC (ltnW pgt2)) add2n in lb_p *.
- rewrite mulfK ?pnatr_eq0 // addnA 2!natrD 2!mulrDr mulr1 {-1}natrM invfM.
- rewrite mulrA divfK ?mulVf ?pnatr_eq0 // ler_add2r.
- by rewrite ler_add ?lef_pinv ?qualifE ?ltr0n ?leC_nat ?leq_sqr.
-have beq1: b = 1%N.
- apply: contraTeq lb_m; rewrite neq_ltn ltnNge b_gt0 => /(ub3_m 4) ub41.
- by rewrite ltr_gtF // (ltr_trans (ub41 _)) // /sum3 -!CratrE; compute.
-have c7: c = 7 by rewrite -(ltn_predK c_gt1) Dc1 beq1.
-have plt11: (p < 11)%N.
- rewrite ltnNge; apply: contraL lb_m => /ub3_m/(_ b_gt0) ub100.
- by rewrite ltr_gtF // (ltr_trans ub100) // /sum3 -!CratrE; compute.
-have{plt11} p5: p = 5.
- suffices: p \in [seq r <- iota q.+1 7 | prime r & coprime r c].
- by rewrite c7 q3 inE => /eqP.
- rewrite mem_filter mem_iota ltn_neqAle p'q q3 pgt2 pr_p (coprimeSg sW2P) //.
- by rewrite (coprimegS _ (Ptype_Fcore_coprime StypeP)) ?subIset ?joing_subl.
-have [galS | gal'S] := boolP (typeP_Galois StypeP); last first.
- have [H1 [_ _ _ _ []]] := typeP_Galois_Pn maxS notStype5 gal'S.
- case/pdivP=> r pr_r r_dv_a /(dvdn_trans r_dv_a)/idPn[].
- rewrite Ptype_factor_prime // -/p p5 (Euclid_dvdM 2 2) // gtnNdvd //.
- rewrite odd_prime_gt2 ?(dvdn_odd (dvdn_trans r_dv_a (dvdn_indexg _ _))) //.
- by rewrite mFT_odd.
-have{galS} u_dv_31: u %| 31.
- have [_ _ [_ _]] := typeP_Galois_P maxS notStype5 galS.
- rewrite Ptype_factor_prime ?Ptype_Fcompl_kernel_cent // -/p -/q p5 q3.
- rewrite card_quotient // normsI ?normG ?norms_cent //.
- by have [] := sdprodP defPU.
-have hallH: Hall S H.
- rewrite /Hall -divgS ?gFsub //= -(sdprod_card defS) -(sdprod_card defPU).
- rewrite -(dprod_card defH) -mulnA divnMl ?cardG_gt0 // -/c oU mulnAC c7.
- have [_ [_ ->] _ _ _] := FTtypeP_facts maxS StypeP.
- by rewrite mulnK // -/q -/p q3 p5 coprime_mulr (coprime_dvdr u_dv_31).
-rewrite -(leq_pmul2l (cardG_gt0 P)) muln1 (dprod_card defH) subset_leq_card //.
-by rewrite (Fcore_max (Hall_pi hallH)) ?gFnormal ?Fitting_nil.
-Qed.
-Local Notation c1 := FTtypeP_Ind_Fitting_reg_Fcore.
-
-(* This is the main part of the proof of Peterfalvi (13.13). *)
-Lemma FTtypeP_Ind_Fitting_nonGalois_facts :
- ~~ typeP_Galois StypeP -> q = 3 /\ #|U| = (p.-1./2 ^ 2)%N.
-Proof.
-have even_p1: 2 %| p.-1 by rewrite -subn1 -subSS dvdn_sub ?dvdn2 //= mFT_odd.
-move=> gal'S; have{gal'S} u_dv_p2q: u %| p.-1./2 ^ q.-1.
- have [H1 [_ _ _ _ []]] := typeP_Galois_Pn maxS notStype5 gal'S.
- rewrite Ptype_factor_prime ?Ptype_Fcompl_kernel_cent // -/p -/q.
- set a := #|U : _| => a_gt1 a_dv_p1 _ [Uhat isoUhat].
- have a_odd: odd a by rewrite (dvdn_odd (dvdn_indexg _ _)) ?mFT_odd.
- have [_ _ nPU _] := sdprodP defPU.
- rewrite /u -card_quotient ?normsI ?normG ?norms_cent // (card_isog isoUhat).
- apply: dvdn_trans (cardSg (subsetT _)) _; rewrite cardsT card_matrix mul1n.
- rewrite card_ord Zp_cast ?dvdn_exp2r // -(@Gauss_dvdl a _ 2) ?coprimen2 //.
- by rewrite -divn2 divnK.
-have [_ lb5_m lb3_m] := lb_m_cases.
-pose f r : algC := r%:R / (2 ^ r.-1)%:R.
-have ub_m: m < f q.
- apply: ltr_le_trans gen_ub_m _; rewrite c1 mul1n.
- rewrite natrM ler_pdivr_mulr ?ltr0n ?expn_gt0 ?cardG_gt0 // -mulrA.
- rewrite ler_wpmul2l ?ler0n // mulrC !natrX -expr_div_n.
- apply: ler_trans (_ : (p.-1 %/ 2)%:R ^+ q.-1 <= _).
- by rewrite -natrX leC_nat divn2 dvdn_leq // expn_gt0 -(subnKC pgt2).
- rewrite -(subnKC qgt2) ler_pexpn2r ?rpred_div ?rpred_nat // natf_div //.
- by rewrite ler_wpmul2r ?invr_ge0 ?ler0n // leC_nat leq_pred.
-have{ub_m} q3: q = 3.
- apply: contraTeq ub_m; rewrite neq_ltn ltnNge qgt2 -(odd_geq 5) ?mFT_odd //=.
- move=> qge5; rewrite ltr_gtF // -(subnKC qge5).
- elim: (q - 5)%N => [|r]; last apply: ler_lt_trans.
- by apply: ltr_trans (lb5_m qge5); rewrite /f -!CratrE; compute.
- rewrite addnS ler_pdivr_mulr ?ltr0n ?expn_gt0 // natrM mulrACA mulrA.
- by rewrite divfK ?pnatr_eq0 ?expn_eq0 // mulr_natr mulrS ler_add2r ler1n.
-have [[]] := dvdnP u_dv_p2q; rewrite q3; first by rewrite -(subnKC pgt2).
-case=> [|b] Du; first by rewrite oU c1 Du muln1 mul1n.
-have [_ /idPn[]] := lb3_m q3; rewrite c1 divr1 ler_gtF //.
-apply: ler_trans (_ : (p.-1 ^ 2)%:R / 8%:R <= _).
- rewrite (natrX _ 2 3) exprSr invfM mulrA natrX -expr_div_n -natf_div // divn2.
- by rewrite -natrX Du ler_pdivl_mulr ?ltr0n // mulrC -natrM leC_nat leq_mul.
-rewrite -!subn1 (subn_sqr p 1) !natrM -!mulrA ler_wpmul2l ?ler0n //.
-rewrite ler_pdivr_mulr 1?mulrAC ?ler_pdivl_mulr ?ltr0n // -!natrM leC_nat.
-rewrite (mulnA _ 3 2) (mulnA _ 4 2) leq_mul // mulnBl mulnDl leq_subLR.
-by rewrite addnCA (mulnSr p 3) -addnA leq_addr.
-Qed.
-
-(* This is the bulk of the proof of Peterfalvi (13.15). *)
-(* We improve slightly on the end of the argument by maing better use of the *)
-(* bound on u to get p = 5 directly. *)
-Lemma FTtypeP_Ind_Fitting_Galois_ub b :
- (p ^ q).-1 %/ p.-1 = (b * u)%N -> (b <= q.*2)%N.
-Proof.
-move=> Dbu; have: U :!=: 1%g by have [[_ _ /Frobenius_context[]]] := Sfacts.
-rewrite trivg_card1 oU c1 muln1 leqNgt; apply: contra => bgt2q.
-have [|q3 pge5] := small_m_q3.
- apply: ltr_le_trans gen_ub_m _; rewrite c1 mul1n !natrM -!mulrA.
- rewrite ler_wpmul2l ?ler0n // ler_pdivr_mulr ?ltr0n ?expn_gt0 ?cardG_gt0 //.
- rewrite mulrAC invfM -natrM -expnS prednK ?cardG_gt0 // mulrCA.
- rewrite ler_pdivl_mull ?ltr0n // -natrM.
- apply: ler_trans (_ : (b * u)%:R <= _); first by rewrite leC_nat leq_mul.
- rewrite -Dbu natf_div ?dvdn_pred_predX // ler_wpmul2r ?invr_ge0 ?ler0n //.
- by rewrite leC_nat leq_pred.
-have ub_p: ((p - 3) ^ 2 < 4 ^ 2)%N.
- have [_ _ [] // _] := lb_m_cases; rewrite c1 divr1 ltr_pdivr_mulr ?ltr0n //.
- rewrite -natrM ltC_nat prednK ?expn_gt0 ?cardG_gt0 // => /(leq_mul bgt2q).
- rewrite mulnC mulnA -Dbu q3 predn_exp mulKn; last by rewrite -(subnKC pgt2).
- rewrite 2!big_ord_recl big_ord1 /= /bump /= !mulnDl expn0 expn1.
- rewrite addnA mulnS leq_add2r -(leq_add2r 9) (mulnCA p 2 3) -addnA addnCA.
- by rewrite -leq_subLR -(sqrn_sub pgt2).
-have{ub_p pge5} p5: p = 5.
- apply/eqP; rewrite eqn_leq pge5 andbT.
- by rewrite ltn_sqr ltnS leq_subLR -ltnS odd_ltn ?mFT_odd in ub_p.
-have bgt1: (1 < b)%N by rewrite -(subnKC bgt2q) q3.
-rewrite -(eqn_pmul2l (ltnW bgt1)) muln1 eq_sym.
-by apply/eqP/prime_nt_dvdP; rewrite ?dvdn_mulr ?gtn_eqF // -Dbu q3 p5.
-Qed.
-
-End Thirteen_10_to_13_15.
-
-(* This is Peterfalvi (13.12). *)
-Lemma FTtypeP_reg_Fcore : C :=: 1%g.
-Proof.
-have [] := boolP (has irrIndH calS); last first.
- by case/(FTtypeP_no_Ind_Fitting_facts maxS StypeP).
-by case/hasP=> lambda Slam /FTtypeP_Ind_Fitting_reg_Fcore/card1_trivg->.
-Qed.
-
-Lemma Ptype_Fcompl_kernel_trivial : Ptype_Fcompl_kernel StypeP :=: 1%g.
-Proof. by rewrite Ptype_Fcompl_kernel_cent ?FTtypeP_reg_Fcore. Qed.
-
-(* Since C is trivial, from here on u will denote #|U|. *)
-Let u := #|U|.
-Let ustar := (p ^ q).-1 %/ p.-1.
-
-(* This is Peterfalvi (13.13). *)
-Lemma FTtypeP_nonGalois_facts :
- ~~ typeP_Galois StypeP -> q = 3 /\ u = (p.-1./2 ^ 2)%N.
-Proof.
-move=> gal'S; have: has irrIndH calS.
- by apply: contraR gal'S => /(FTtypeP_no_Ind_Fitting_facts maxS StypeP)[].
-by case/hasP=> lambda Slam /FTtypeP_Ind_Fitting_nonGalois_facts; apply.
-Qed.
-
-Import FinRing.Theory.
-
-(* This is Peterfalvi (13.14). *)
-Lemma FTtypeP_primes_mod_cases :
- [/\ odd ustar,
- p == 1 %[mod q] -> q %| ustar
- & p != 1 %[mod q] ->
- [/\ coprime ustar p.-1, ustar == 1 %[mod q]
- & forall b, b %| ustar -> b == 1 %[mod q]]].
-Proof.
-have ustar_mod r: p = 1 %[mod r] -> ustar = q %[mod r].
- move=> pr1; rewrite -[q]card_ord -sum1_card /ustar predn_exp //.
- rewrite -(subnKC pgt2) mulKn // subnKC //.
- elim/big_rec2: _ => // i s1 s2 _ eq_s12.
- by rewrite -modnDm -modnXm pr1 eq_s12 modnXm modnDm exp1n.
-have ustar_odd: odd ustar.
- by apply: (can_inj oddb); rewrite -modn2 ustar_mod ?modn2 ?mFT_odd.
-split=> // [p1_q|p'1_q]; first by rewrite /dvdn ustar_mod ?modnn //; apply/eqP.
-have ustar_gt0: (ustar > 0)%N by rewrite odd_geq.
-have [p1_gt0 p_gt0]: (p.-1 > 0 /\ p > 0)%N by rewrite -(subnKC pgt2).
-have co_ustar_p1: coprime ustar p.-1.
- rewrite coprime_pi' //; apply/pnatP=> //= r pr_r.
- rewrite inE -subn1 -eqn_mod_dvd //= mem_primes pr_r ustar_gt0 => /eqP rp1.
- rewrite /dvdn ustar_mod // [_ == _]dvdn_prime2 //.
- by apply: contraNneq p'1_q => <-; apply/eqP.
-suffices ustar_mod_q b: b %| ustar -> b == 1 %[mod q].
- by split; rewrite // ustar_mod_q.
-move=> b_dv_ustar; have b_gt0 := dvdn_gt0 ustar_gt0 b_dv_ustar.
-rewrite (prod_prime_decomp b_gt0) prime_decompE big_map /= big_seq.
-elim/big_rec: _ => // r s /(pi_of_dvd b_dv_ustar ustar_gt0).
-rewrite mem_primes -modnMml -modnXm => /and3P[pr_r _ r_dv_ustar].
-suffices{s} ->: r = 1 %[mod q] by rewrite modnXm modnMml exp1n mul1n.
-apply/eqP; rewrite eqn_mod_dvd ?prime_gt0 // subn1.
-have ->: r.-1 = #|[set: {unit 'F_r}]|.
- rewrite card_units_Zp ?prime_gt0 ?pdiv_id //.
- by rewrite -[r]expn1 totient_pfactor ?muln1.
-have pq_r: p%:R ^+ q == 1 :> 'F_r.
- rewrite -subr_eq0 -natrX -(@natrB _ _ 1) ?expn_gt0 ?cardG_gt0 // subn1.
- rewrite -(divnK (dvdn_pred_predX p q)) -Fp_nat_mod //.
- by rewrite -modnMml (eqnP r_dv_ustar) mod0n.
-have Up_r: (p%:R : 'F_r) \is a GRing.unit.
- by rewrite -(unitrX_pos _ (prime_gt0 pr_q)) (eqP pq_r) unitr1.
-congr (_ %| _): (order_dvdG (in_setT (FinRing.unit 'F_r Up_r))).
-apply/prime_nt_dvdP=> //; last by rewrite order_dvdn -val_eqE val_unitX.
-rewrite -dvdn1 order_dvdn -val_eqE /= -subr_eq0 -val_eqE -(@natrB _ p 1) //=.
-rewrite subn1 val_Fp_nat //; apply: contraFN (esym (mem_primes r 1)).
-by rewrite pr_r /= -(eqnP co_ustar_p1) dvdn_gcd r_dv_ustar.
-Qed.
-
-(* This is Peterfalvi (13.15). *)
-Lemma card_FTtypeP_Galois_compl :
- typeP_Galois StypeP -> u = (if p == 1 %[mod q] then ustar %/ q else ustar).
-Proof.
-case/typeP_Galois_P=> //= _ _ [_ _ /dvdnP[b]]; rewrite Ptype_factor_prime //.
-rewrite -/ustar Ptype_Fcompl_kernel_trivial -(card_isog (quotient1_isog _)) -/u.
-move=> Dbu; have ub_b: (b <= q.*2)%N.
- have [[lambda Slam irrHlam]| ] := altP (@hasP _ irrIndH calS).
- apply: (FTtypeP_Ind_Fitting_Galois_ub Slam irrHlam).
- by rewrite FTtypeP_reg_Fcore indexg1.
- case/(FTtypeP_no_Ind_Fitting_facts maxS StypeP) => _ /= ->.
- rewrite indexg1 -/ustar -(leq_pmul2r (cardG_gt0 U)) -/u => Du.
- by rewrite -Dbu -Du -(subnKC qgt2) leq_pmull.
-have [ustar_odd p1_q p'1_q] := FTtypeP_primes_mod_cases.
-have b_odd: odd b by rewrite Dbu odd_mul mFT_odd andbT in ustar_odd.
-case: ifPn => [/p1_q q_dv_ustar | /p'1_q[_ _ /(_ b)]].
- have /dvdnP[c Db]: q %| b.
- rewrite Dbu Gauss_dvdl // coprime_sym in q_dv_ustar.
- by apply: coprimeSg coPUq; have /mulG_sub[_ sUPU] := sdprodW defPU.
- have c_odd: odd c by rewrite Db odd_mul mFT_odd andbT in b_odd.
- suffices /eqP c1: c == 1%N by rewrite Dbu Db c1 mul1n mulKn ?prime_gt0.
- rewrite eqn_leq odd_gt0 // andbT -ltnS -(odd_ltn 3) // ltnS.
- by rewrite -(leq_pmul2r (ltnW (ltnW qgt2))) -Db mul2n.
-have Db: b = (b - 1).+1 by rewrite subn1 prednK ?odd_gt0.
-rewrite Dbu dvdn_mulr // eqn_mod_dvd Db // -Db => /(_ isT)/dvdnP[c Db1].
-have c_even: ~~ odd c by rewrite Db Db1 /= odd_mul mFT_odd andbT in b_odd.
-suffices /eqP->: b == 1%N by rewrite mul1n.
-have:= ub_b; rewrite Db Db1 -mul2n ltn_pmul2r ?cardG_gt0 //.
-by rewrite -ltnS odd_ltn //= !ltnS leqn0 => /eqP->.
-Qed.
-
-(* This is Peterfalvi (13.16). *)
-(* We have transposed T and Q here so that the lemma does not require *)
-(* assumptions on the associate group. *)
-Lemma FTtypeP_norm_cent_compl : P ><| W1 = 'N(W2) /\ P ><| W1 = 'C(W2).
-Proof.
-have [/mulG_sub[_ sW1S] /mulG_sub[sPPU sUPU]] := (sdprodW defS, sdprodW defPU).
-have nPW1: W1 \subset 'N(P) by rewrite (subset_trans sW1S) ?gFnorm.
-have [[_ _ frobUW1 cUU] [abelP _] _ _ _] := Sfacts.
-have [pP cPP _] := and3P abelP; have [_ _ cW12 tiW12] := dprodP defW.
-have cW2P: P \subset 'C(W2) by rewrite sub_abelian_cent.
-suffices sNPW2: 'N(W2) \subset P <*> W1.
- have cW2PW1: P <*> W1 \subset 'C(W2) by rewrite join_subG cW2P centsC.
- rewrite sdprodEY ?coprime_TIg ?(coprimeSg sPPU) //.
- split; apply/eqP; rewrite eqEsubset ?(subset_trans cW2PW1) ?cent_sub //.
- by rewrite (subset_trans (cent_sub _)).
-have tiP: normedTI P^# G S.
- have [_ _ _] := compl_of_typeII_IV maxS StypeP notStype5.
- by rewrite -defH FTtypeP_reg_Fcore dprodg1.
-have ->: 'N(W2) = 'N_S(W2).
- apply/esym/setIidPr/subsetP=> y nW2y; have [x W2x ntx] := trivgPn _ ntW2.
- have [_ _ tiP_J] := normedTI_memJ_P tiP.
- by rewrite -(tiP_J x) ?inE ?conjg_eq1 // ntx (subsetP sW2P) ?memJ_norm.
-rewrite -{1}(sdprodW defS) setIC -group_modr ?cents_norm 1?centsC //=.
-rewrite mulG_subG joing_subr /= -(sdprodW defPU) setIC.
-rewrite -group_modl ?cents_norm //= mulG_subG joing_subl /= andbT.
-set K := 'N_U(W2); have sKPU: K \subset PU by rewrite subIset ?sUPU.
-have{sKPU} nPKW1: K <*> W1 \subset 'N(P).
- by rewrite gFnorm_trans ?normsG // -(sdprodWY defS) genS ?setSU.
-have nW2KW1: K <*> W1 \subset 'N(W2).
- by rewrite join_subG subsetIr cents_norm // centsC.
-have coPKW1: coprime #|P| #|K <*> W1|.
- by rewrite (coprimegS _ (Ptype_Fcore_coprime StypeP)) ?genS ?setSU ?subsetIl.
-have p'KW1: p^'.-group (K <*> W1).
- by rewrite /pgroup p'natE // -prime_coprime ?(coprimeSg sW2P).
-have [Q1 defP nQ1KW1] := Maschke_abelem abelP p'KW1 sW2P nPKW1 nW2KW1.
-have [-> | ntK] := eqVneq K 1%g; first by rewrite sub1G.
-have frobKW1: [Frobenius K <*> W1 = K ><| W1].
- apply: Frobenius_subl frobUW1; rewrite ?subsetIl //.
- rewrite normsI ?norms_norm //; first by have [_ []] := StypeP.
- by rewrite cents_norm // centsC.
-have regQ1W1: 'C_Q1(W1) = 1%g.
- have [_ /mulG_sub[_ /setIidPl defQ1] _ tiW2Q1] := dprodP defP.
- by rewrite -defQ1 -setIA (typeP_cent_core_compl StypeP) setIC.
-have cQ1K: K \subset 'C(Q1).
- have /mulG_sub[_ sQ1P] := dprodW defP; have coQ1KW1 := coprimeSg sQ1P coPKW1.
- have solQ1 := solvableS sQ1P (abelian_sol cPP).
- by have [_ ->] := Frobenius_Wielandt_fixpoint frobKW1 nQ1KW1 coQ1KW1 solQ1.
-have /subsetIP[_ cW1K]: K \subset 'C_(K <*> W1)(W2).
- have cCW1: W1 \subset 'C_(K <*> W1)(W2) by rewrite subsetI joing_subr centsC.
- apply: contraR ntW1 => /(Frobenius_normal_proper_ker frobKW1) ltCK.
- rewrite -subG1; have [/eqP/sdprodP[_ _ _ <-] _] := andP frobKW1.
- rewrite subsetIidr (subset_trans cCW1) // proper_sub //.
- rewrite ltCK //; last by rewrite norm_normalI ?norms_cent.
- by rewrite (solvableS _ (abelian_sol cUU)) ?subsetIl.
-case/negP: ntK; rewrite -subG1 -FTtypeP_reg_Fcore subsetI subsetIl /=.
-by rewrite -(dprodW defP) centM subsetI cW1K.
-Qed.
-
-End Thirteen_4_10_to_16.
-
-Section Thirteen_17_to_19.
-
-(* These assumptions repeat the part of Peterfalvi, Hypothesis (13.1) used *)
-(* to prove (13.17-19). *)
-
-Variables S U W W1 W2 : {group gT}.
-Hypotheses (maxS : S \in 'M) (defW : W1 \x W2 = W).
-Hypotheses (StypeP : of_typeP S U defW).
-
-Local Notation "` 'W1'" := (gval W1) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W2'" := (gval W2) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W'" := (gval W) (at level 0, only parsing) : group_scope.
-Local Notation V := (cyclicTIset defW).
-
-Local Notation "` 'S'" := (gval S) (at level 0, only parsing) : group_scope.
-Local Notation P := `S`_\F%G.
-Local Notation "` 'P'" := `S`_\F (at level 0) : group_scope.
-Local Notation PU := S^`(1)%G.
-Local Notation "` 'PU'" := `S^`(1) (at level 0) : group_scope.
-Local Notation "` 'U'" := (gval U) (at level 0, only parsing) : group_scope.
-
-Let defS : PU ><| W1 = S. Proof. by have [[]] := StypeP. Qed.
-Let defPU : P ><| U = PU. Proof. by have [_ []] := StypeP. Qed.
-
-Let notStype1 : FTtype S != 1%N. Proof. exact: FTtypeP_neq1 StypeP. Qed.
-Let notStype5 : FTtype S != 5%N. Proof. exact: FTtype5_exclusion maxS. Qed.
-
-Let pddS := FT_prDade_hypF maxS StypeP.
-Let ptiWS : primeTI_hypothesis S PU defW := FT_primeTI_hyp StypeP.
-Let ctiWG : cyclicTI_hypothesis G defW := pddS.
-Local Notation Sfacts := (FTtypeP_facts maxS StypeP).
-
-Let ntW1 : W1 :!=: 1. Proof. by have [[]] := StypeP. Qed.
-Let ntW2 : W2 :!=: 1. Proof. by have [_ _ _ []] := StypeP. Qed.
-Let cycW1 : cyclic W1. Proof. by have [[]] := StypeP. Qed.
-Let cycW2 : cyclic W2. Proof. by have [_ _ _ []] := StypeP. Qed.
-
-Let p := #|W2|.
-Let q := #|W1|.
-
-Let pr_p : prime p. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed.
-Let pr_q : prime q. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed.
-
-Let qgt2 : q > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
-Let pgt2 : p > 2. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
-
-Let coPUq : coprime #|PU| q.
-Proof. by rewrite (coprime_sdprod_Hall_r defS); have [[]] := StypeP. Qed.
-
-Let sW2P: W2 \subset P. Proof. by have [_ _ _ []] := StypeP. Qed.
-
-Let p'q : q != p.
-Proof.
-by rewrite -dvdn_prime2 -?prime_coprime -?(cyclic_dprod defW) //; case: ctiWG.
-Qed.
-
-Let nirrW1 : #|Iirr W1| = q. Proof. by rewrite card_Iirr_cyclic. Qed.
-Let nirrW2 : #|Iirr W2| = p. Proof. by rewrite card_Iirr_cyclic. Qed.
-Let NirrW1 : Nirr W1 = q. Proof. by rewrite -nirrW1 card_ord. Qed.
-Let NirrW2 : Nirr W2 = p. Proof. by rewrite -nirrW2 card_ord. Qed.
-
-Local Open Scope ring_scope.
-
-Let sigma := (cyclicTIiso ctiWG).
-Let w_ i j := (cyclicTIirr defW i j).
-Local Notation eta_ i j := (sigma (w_ i j)).
-
-Let mu_ := primeTIred ptiWS.
-Local Notation tau := (FT_Dade0 maxS).
-
-Let calS0 := seqIndD PU S S`_\s 1.
-Let rmR := FTtypeP_coh_base maxS StypeP.
-Let scohS0 : subcoherent calS0 tau rmR.
-Proof. exact: FTtypeP_subcoherent StypeP. Qed.
-
-Let calS := seqIndD PU S P 1.
-Let sSS0 : cfConjC_subset calS calS0.
-Proof. exact/seqInd_conjC_subset1/Fcore_sub_FTcore. Qed.
-
-(* This is Peterfalvi (13.17). *)
-Lemma FTtypeII_support_facts T L (Q := T`_\F) (H := L`_\F) :
- FTtype S == 2 -> typeP_pair S T defW -> L \in 'M('N(U)) ->
- [/\ (*a*) [Frobenius L with kernel H],
- (*b*) U \subset H
- & (*c*) H ><| W1 = L \/ (exists2 y, y \in Q & H ><| (W1 <*> W2 :^ y) = L)].
-Proof.
-move=> Stype2 pairST /setIdP[maxL sNU_L].
-have [pgt0 qgt0] := (ltnW (ltnW pgt2), ltnW (ltnW qgt2)).
-have [[_ _ maxT] _ _ _ allST] := pairST.
-have [[_ ntU _ _] _ not_sNU_S _ _] := compl_of_typeII maxS StypeP Stype2.
-have [[_ _ frobUW1 cUU] _ _ _ _] := Sfacts.
-have xdefW: W2 \x W1 = W by rewrite dprodC.
-have [V TtypeP] := typeP_pairW (typeP_pair_sym xdefW pairST).
-have [abelQ oQ]: q.-abelem Q /\ #|Q| = (q ^ p)%N.
- by have [] := FTtypeP_facts maxT TtypeP.
-have sUL: U \subset L := subset_trans (normG U) sNU_L.
-have [/mulG_sub[sPPU sUPU] sPUS] := (sdprodW defPU, der_sub 1 S).
-have nUW1: W1 \subset 'N(U) by have [_ []] := StypeP.
-have sW1L := subset_trans nUW1 sNU_L.
-have Ltype1: FTtype L == 1%N.
- apply: contraR not_sNU_S => /allST/setUP[]// /imsetP[y _ defL].
- have hallU: \pi(U).-Hall(S) U.
- have /Hall_pi/(subHall_Hall _ (piSg sUPU)): Hall PU U.
- have /pHall_Hall:= pHall_subl sPPU sPUS (Fcore_Hall S).
- by rewrite (sdprod_Hall defPU).
- by apply; rewrite Hall_pi // -(coprime_sdprod_Hall_l defS).
- have hallUy: \pi(U).-Hall(S) (U :^ y^-1).
- by rewrite pHallE sub_conjgV -defL sUL /= cardJg -(card_Hall hallU).
- have [x /conjGid <- ->] := Hall_trans (mmax_sol maxS) hallU hallUy.
- by rewrite !normJ conjSg sub_conjgV -defL.
- have oH: #|H| = (q ^ p)%N by rewrite /H defL FcoreJ cardJg.
- have sW1H: W1 \subset H.
- rewrite (sub_normal_Hall (Fcore_Hall L)) ?gFnormal //=.
- by rewrite oH pi_of_exp ?prime_gt0 // pgroup_pi.
- have regUW1: 'C_U(W1) = 1%g := Frobenius_trivg_cent frobUW1.
- have /negP[] := ntU; rewrite -subG1 -regUW1 subsetIidl (sameP commG1P trivgP).
- have /coprime_TIg <-: coprime #|U| #|H|.
- by rewrite oH coprime_pexpr ?(coprimeSg sUPU).
- rewrite commg_subI //; last by rewrite subsetI sW1H.
- by rewrite subsetIidl (subset_trans sUL) ?gFnorm.
-have frobL := FTtype1_Frobenius maxL Ltype1.
-have solH: solvable H by rewrite nilpotent_sol ?Fcore_nil.
-have coHW1: coprime #|H| #|W1|.
- rewrite -(coprime_pexpr _ _ pgt0) -oQ.
- apply/(coprimegS (Fcore_sub_FTcore maxT))/(coprimeSg (Fcore_sub_FTcore maxL)).
- have [_ -> //] := FT_Dade_support_partition gT.
- have: FTtype T != 1%N := FTtypeP_neq1 maxT TtypeP.
- by apply: contra => /imsetP[y _ ->] /=; rewrite FTtypeJ.
-have tiHW1: H :&: W1 = 1%g := coprime_TIg coHW1.
-have sUH: U \subset H; last split=> //.
- have [ntH _ /andP[sHL nHL] regHL] := Frobenius_kerP frobL.
- have regHE E: gval E != 1%g -> E \subset L -> H :&: E = 1%g -> 'C_H(E) = 1%g.
- move=> ntE sEL tiHE; apply: contraNeq ntE => /trivgPn[x /setIP[Hx cEx] ntx].
- rewrite -subG1 -tiHE subsetIidr (subset_trans _ (regHL x _)) ?inE ?ntx //.
- by rewrite subsetI sEL sub_cent1.
- suffices /trivgPn[x /setIP[Hx Ux] ntx]: H :&: U != 1%g.
- apply: subset_trans (regHL x _); last by rewrite !inE ntx.
- by rewrite subsetI sUL sub_cent1 (subsetP cUU).
- apply: contraNneq (ntH) => tiHU; rewrite trivg_card1.
- have [nHU nHW1] := (subset_trans sUL nHL, subset_trans sW1L nHL).
- have nHUW1: U <*> W1 \subset 'N(H) by rewrite join_subG nHU.
- have coHUW1: coprime #|H| #|U <*> W1|.
- have [/eqP defUW1 _] := andP frobUW1.
- rewrite (sdprodWY defUW1) -(sdprod_card defUW1) coprime_mulr coHW1 andbT.
- have defHU: H ><| U = H <*> U by rewrite sdprodEY.
- rewrite (coprime_sdprod_Hall_l defHU).
- apply: pHall_Hall (pHall_subl (joing_subl _ _) _ (Fcore_Hall L)).
- by rewrite join_subG sHL.
- have [_ _] := Frobenius_Wielandt_fixpoint frobUW1 nHUW1 coHUW1 solH.
- by move->; rewrite regHE // cards1 exp1n.
-have [E sW1E frobHE]: exists2 E, W1 \subset gval E & [Frobenius L = H ><| E].
- have [E frobHE] := existsP frobL; have [/eqP defL _] := andP frobHE.
- have hallE: \pi(H)^'.-Hall(L) E.
- by rewrite -(compl_pHall E (Fcore_Hall L)) sdprod_compl.
- have [|x Lx sW1Ex] := Hall_subJ (mmax_sol maxL) hallE sW1L.
- by rewrite /pgroup -coprime_pi' ?cardG_gt0.
- rewrite -(FrobeniusJ x) conjGid // (normsP (gFnorm _ _)) // in frobHE.
- by exists (E :^ x)%G.
-have [defL ntH ntE _ _] := Frobenius_context frobHE.
-have [_ sEL _ nHE _] := sdprod_context defL.
-have solE := solvableS sEL (mmax_sol maxL).
-have [regHE regEH] := (Frobenius_reg_ker frobHE, Frobenius_reg_compl frobHE).
-have qW1: q.-group W1 by apply: pnat_id.
-have cycEr (r : nat) R: r.-group R -> R \subset E -> cyclic R.
- move=> rR sRE; have nHR := subset_trans sRE nHE.
- apply: odd_regular_pgroup_cyclic rR (mFT_odd _) ntH nHR _.
- by move=> y /setD1P[nty Ry]; rewrite regHE // !inE nty (subsetP sRE).
-have /normal_norm nW1E: W1 <| E.
- exact: prime_odd_regular_normal (mFT_odd E) _ _ _ (Frobenius_reg_ker frobHE).
-have defNW1: Q ><| W2 = 'N(W1).
- by have [] := FTtypeP_norm_cent_compl maxT TtypeP.
-have [nsQN sW2N _ _ _] := sdprod_context defNW1.
-have sylQ: q.-Sylow('N(W1)) Q.
- rewrite /pHall normal_sub // abelem_pgroup //=.
- by rewrite -(index_sdprod defNW1) pnatE //= !inE eq_sym.
-have hallW2: q^'.-Hall('N(W1)) W2 by rewrite -(compl_pHall _ sylQ) sdprod_compl.
-pose Q1 := Q :&: E; have sylQ1: q.-Sylow(E) Q1 by apply: setI_normal_Hall nW1E.
-have defQ1: Q1 = W1.
- have abelQ1: q.-abelem Q1 := abelemS (subsetIl Q E) abelQ.
- have sW1Q: W1 \subset Q by have [_ _ _ []] := TtypeP.
- have sW1Q1: W1 \subset Q1 by apply/subsetIP.
- have ntQ1: Q1 != 1%g by apply: subG1_contra ntW1.
- apply/esym/eqP; rewrite eqEcard sW1Q1 (cyclic_abelem_prime abelQ1) //=.
- by rewrite (cycEr q) ?(pHall_pgroup sylQ1) ?subsetIr.
-have [P2 hallP2] := Hall_exists q^' solE; have [sP2E q'P2 _] := and3P hallP2.
-have defE: W1 ><| P2 = E.
- apply/(sdprod_normal_p'HallP _ hallP2); rewrite /= -defQ1 //.
- by rewrite /Q1 setIC norm_normalI // (subset_trans nW1E) ?normal_norm.
-have [P2_1 | ntP2] := eqsVneq P2 1%g.
- by left; rewrite -defE P2_1 sdprodg1 in defL.
-have solNW1: solvable 'N(W1).
- by rewrite mFT_sol ?mFT_norm_proper // mFT_sol_proper (solvableS sW1E).
-have [zy /=] := Hall_subJ solNW1 hallW2 (subset_trans sP2E nW1E) q'P2.
-rewrite -{1}(sdprodWC defNW1) => /mulsgP[z y W2z Qy ->{zy}].
-rewrite conjsgM (conjGid W2z) {z W2z} => sP2W2y.
-right; exists y => //; congr (_ ><| _ = _): defL.
-rewrite -(sdprodWY defE); congr (W1 <*> _).
-by apply/eqP; rewrite eqEsubset sP2W2y prime_meetG ?cardJg ?(setIidPr _).
-Qed.
-
-Local Notation Imu2 := (primeTI_Iirr ptiWS).
-Local Notation mu2_ i j := (primeTIirr ptiWS i j).
-
-Definition FTtypeP_bridge j := 'Ind[S, P <*> W1] 1 - mu2_ 0 j.
-Local Notation beta_ := FTtypeP_bridge.
-Definition FTtypeP_bridge_gap := tau (beta_ #1) - 1 + eta_ 0 #1.
-Local Notation Gamma := FTtypeP_bridge_gap.
-
-Let u := #|U|.
-
-(* This is Peterfalvi (13.18). *)
-(* Part (d) is stated with a slightly weaker hypothesis that fits better with *)
-(* the usage pattern in (13.19) and (14.9). *)
-Lemma FTtypeP_bridge_facts (V_S := class_support (cyclicTIset defW) S) :
- [/\ (*a*) [/\ forall j, j != 0 -> beta_ j \in 'CF(S, 'A0(S))
- & forall j, j != 0 -> beta_ j \in 'CF(S, P^# :|: V_S)],
- (*b*) forall j, j != 0 -> '[beta_ j] = (u.-1 %/ q + 2)%:R,
- (*c*) [/\ forall j, j != 0 -> tau (beta_ j) - 1 + eta_ 0 j = Gamma,
- '[Gamma, 1] = 0 & cfReal Gamma],
- (*d*) forall X Y : 'CF(G),
- Gamma = X + Y -> '[X, Y] = 0 ->
- orthogonal Y (map sigma (irr W)) ->
- '[Y] <= (u.-1 %/ q)%:R
- & q %| u.-1].
-Proof.
-have [_ sW1S _ nPUW1 tiPUW1] := sdprod_context defS.
-have /mulG_sub[sPPU sUPU] := sdprodW defPU.
-have sPW1S: P <*> W1 \subset S by rewrite join_subG gFsub.
-have /= defS_P := Ptype_Fcore_sdprod StypeP; have nsPS: P <| S := gFnormal _ _.
-have defPW1: P ><| W1 = P <*> W1 := sdprod_subr defS_P (joing_subr U W1).
-pose W1bar := (W1 / P)%g; pose Sbar := (S / P)%g; pose Ubar := (U / P)%g.
-pose gamma := 'Ind[Sbar, W1bar] 1.
-have Dgamma: 'Ind[S, P <*> W1] 1 = (gamma %% P)%CF.
- rewrite -(rmorph1 _ : 1 %% P = 1)%CF cfIndMod ?joing_subl //.
- by rewrite quotientYidl //; have [] := sdprodP defPW1.
-have gamma1: gamma 1%g = u%:R.
- rewrite -cfMod1 -Dgamma cfInd1 // cfun11 -divgS // -(sdprod_card defPW1).
- by rewrite mulr1 -(sdprod_card defS) -(sdprod_card defPU) divnMr // mulKn.
-have frobUW1: [Frobenius U <*> W1 = U ><| W1] by have [[]] := Sfacts.
-have q_dv_u1: q %| u.-1 := Frobenius_dvd_ker1 frobUW1.
-have [nP_UW1 /isomP[/=]] := sdprod_isom defS_P; set h := restrm _ _ => injh hS.
-have /joing_sub[sUUW1 sW1UW1] := erefl (U <*> W1).
-have [hU hW1]: h @* U = Ubar /\ h @* W1 = W1bar.
- by rewrite !morphim_restrm /= !(setIidPr _).
-have{hS} frobSbar: [Frobenius Sbar = Ubar ><| W1bar].
- by rewrite -[Sbar]hS -hU -hW1 injm_Frobenius.
-have tiW1bar: normedTI W1bar^# Sbar W1bar by have /and3P[] := frobSbar.
-have gammaW1 xbar: xbar \in W1bar^# -> gamma xbar = 1.
- move=> W1xbar; have [ntxbar _] := setD1P W1xbar.
- rewrite cfIndE ?quotientS //; apply: canLR (mulKf (neq0CG _)) _.
- have ->: #|W1bar| = #|Sbar :&: W1bar| by rewrite (setIidPr _) ?quotientS.
- rewrite mulr1 cardsE -sumr_const big_mkcondr; apply: eq_bigr => zbar Szbar.
- have [_ _ W1bar_xJ] := normedTI_memJ_P tiW1bar.
- by rewrite -mulrb -(W1bar_xJ xbar) // !inE conjg_eq1 ntxbar cfun1E.
-have PVSbeta j: j != 0 -> beta_ j \in 'CF(S, P^# :|: V_S).
- move=> nzj; apply/cfun_onP=> z; rewrite !inE => /norP[P'z VS'z].
- have [Sz | /cfun0->//] := boolP (z \in S); apply/eqP; rewrite !cfunE subr_eq0.
- have [[_ mulW12 _ tiW12] C1] := (dprodP defW, FTtypeP_reg_Fcore maxS StypeP).
- have [PUz {VS'z} | PU'z {P'z}] := boolP (z \in PU).
- rewrite eq_sym -(cfResE _ _ PUz) ?gFsub // -['Res _](scalerK (neq0CG W1)).
- rewrite cfRes_prTIirr -cfRes_prTIred -/q cfunE cfResE ?gFsub // mulrC.
- case/nandP: P'z => [/negbNE/eqP-> | P'z].
- rewrite Dgamma cfModE // morph1 gamma1 FTprTIred1 // C1 indexg1.
- by rewrite natrM mulfK ?neq0CG.
- have:= seqInd_on (Fitting_normal S) (FTprTIred_Ind_Fitting maxS StypeP nzj).
- have [/= <- _ _ _] := typeP_context StypeP; rewrite C1 dprodg1 -/(mu_ j).
- move/cfun_on0->; rewrite // mul0r (cfun_on0 (cfInd_on _ (cfun_onG _))) //.
- rewrite -(sdprodW defPW1); apply: contra P'z => /imset2P[x t PW1x St Dz].
- rewrite Dz !memJ_norm ?(subsetP (gFnorm _ _)) // in PUz *.
- by rewrite -(mulg1 P) -tiPUW1 setIC group_modl // inE PW1x.
- have /imset2P[x t /setD1P[ntx W1x] St ->]: z \in class_support W1^# S.
- have /bigcupP[_ /rcosetsP[x W1x ->]]: z \in cover (rcosets PU W1).
- by rewrite (cover_partition (rcosets_partition_mul _ _)) (sdprodW defS).
- have [-> | ntx] := eqVneq x 1%g; first by rewrite mulg1 => /idPn[].
- have nPUx: x \in 'N(PU) by rewrite (subsetP nPUW1).
- have coPUx: coprime #|PU| #[x] by rewrite (coprime_dvdr (order_dvdG W1x)).
- have [/cover_partition <- _] := partition_cent_rcoset nPUx coPUx.
- have [_ _ _ [_ _ _ _ prPUW1] _] := StypeP; rewrite {}prPUW1 ?inE ?ntx //.
- rewrite cover_imset => /bigcupP[t PUt /imsetP[_ /rcosetP[y W2y ->] Dz]].
- have{PUt} St: t \in S by rewrite (subsetP _ _ PUt) ?der_sub.
- have [y1 | nty] := eqVneq y 1%g.
- by rewrite Dz y1 mul1g memJ_class_support // !inE ntx.
- rewrite Dz memJ_class_support // !inE groupMr // groupMl // in VS'z.
- rewrite -(dprodWC defW) mem_mulg // andbT; apply/norP.
- by rewrite -!in_set1 -set1gE -tiW12 !inE W1x W2y andbT in ntx nty.
- rewrite !cfunJ // Dgamma cfModE ?(subsetP sW1S) // gammaW1; last first.
- by rewrite !inE (morph_injm_eq1 injh) ?(subsetP sW1UW1) ?ntx ?mem_quotient.
- rewrite prTIirr_id ?FTprTIsign // ?scale1r ?dprod_IirrEr; last first.
- rewrite -in_set1 -set1gE -tiW12 inE W1x /= in ntx.
- by rewrite inE ntx -mulW12 (subsetP (mulG_subl W2 W1)).
- by rewrite -[x]mulg1 cfDprodEr ?lin_char1 ?irr_prime_lin.
-have A0beta j: j != 0 -> beta_ j \in 'CF(S, 'A0(S)).
- move/PVSbeta; apply: cfun_onS; rewrite (FTtypeP_supp0_def _ StypeP) //.
- by rewrite setSU ?(subset_trans _ (FTsupp1_sub _)) ?setSD ?Fcore_sub_FTcore.
-have norm_beta j: j != 0 -> '[beta_ j] = (u.-1 %/ q + 2)%:R.
- move=> nzj; rewrite cfnormBd ?Dgamma; last first.
- apply: contraNeq (cfker_prTIres pddS nzj); rewrite -irr_consttE => S1_mu0j.
- rewrite -(cfRes_prTIirr _ 0) sub_cfker_Res //.
- rewrite (subset_trans _ (cfker_constt _ S1_mu0j)) ?cfker_mod //.
- by rewrite -Dgamma cfInd_char ?rpred1.
- have [[/eqP defUW1 _] [/eqP defSbar _]] := (andP frobUW1, andP frobSbar).
- rewrite cfnorm_irr cfMod_iso //.
- rewrite (cfnormE (cfInd_on _ (cfun_onG _))) ?quotientS // -/gamma.
- rewrite card_quotient ?gFnorm // -(index_sdprod defS_P) -(sdprod_card defUW1).
- rewrite -/u -/q (big_setD1 1%g) ?mem_class_support ?group1 //=.
- have{tiW1bar} [_ tiW1bar /eqP defNW1bar] := and3P tiW1bar.
- rewrite gamma1 normr_nat class_supportD1 big_trivIset //=.
- rewrite (eq_bigr (fun xbar => #|W1bar|.-1%:R)) ?sumr_const; last first.
- rewrite (cardsD1 1%g) group1 /= => _ /imsetP[tbar Stbar ->].
- rewrite -sumr_const big_imset /=; last exact: in2W (conjg_inj tbar).
- by apply: eq_bigr => xbar W1xbar; rewrite cfunJ ?gammaW1 // normr1 expr1n.
- rewrite card_conjugates -divgS ?subsetIl //= -(sdprod_card defSbar) defNW1bar.
- rewrite mulnK ?cardG_gt0 // -hU -hW1 ?card_injm // -/q -/u natrM invfM mulrC.
- rewrite -[rhs in _ ^+ 2 + rhs]mulr_natr -mulrDl mulrA mulfK ?neq0CG //.
- rewrite -subn1 natrB ?cardG_gt0 // addrCA mulrDl divff ?neq0CG //.
- by rewrite -natrB ?cardG_gt0 // subn1 -natf_div // addrAC addrC natrD.
-have nzj1: #1 != 0 :> Iirr W2 by apply: Iirr1_neq0.
-have [_ _ _ _ [_ Dtau]] := Sfacts; pose eta01 := eta_ 0 #1.
-have oeta01_1: '[eta01, 1] = 0.
- by rewrite -(cycTIiso1 ctiWG) -(cycTIirr00 defW) cfdot_cycTIiso (negPf nzj1).
-have Deta01s: eta01^*%CF = eta_ 0 (conjC_Iirr #1).
- by rewrite cfAut_cycTIiso /w_ !dprod_IirrEr cfAutDprodr aut_IirrE.
-have oGamma1: '[Gamma, 1] = 0.
- rewrite cfdotDl cfdotBl cfnorm1 oeta01_1 addr0 Dtau ?A0beta //.
- rewrite -cfdot_Res_r rmorph1 cfdotBl -cfdot_Res_r rmorph1 cfnorm1.
- by rewrite -(prTIirr00 ptiWS) cfdot_prTIirr (negPf nzj1) subr0 subrr.
-have defGamma j: j != 0 -> tau (beta_ j) - 1 + eta_ 0 j = Gamma.
- move=> nzj; apply/eqP; rewrite -subr_eq0 opprD addrACA opprB !addrA subrK.
- rewrite -linearB opprD addrACA subrr add0r -opprD linearN /=.
- move/prDade_sub_TIirr: pddS => -> //; last first.
- by apply: (mulfI (neq0CG W1)); rewrite -!prTIred_1 !FTprTIred1.
- by rewrite -/sigma FTprTIsign // scale1r -addrA addNr.
-have GammaReal: cfReal Gamma.
- rewrite /cfReal rmorphD rmorphB rmorph1 /= Deta01s Dtau ?A0beta // cfAutInd.
- rewrite rmorphB /= cfAutInd rmorph1 -prTIirr_aut aut_Iirr0 -/(beta_ _).
- by rewrite -Dtau ?A0beta ?defGamma ?aut_Iirr_eq0.
-split=> // X Y defXY oXY oYeta; pose a := '[Gamma, eta01].
-have Za: a \in Cint.
- rewrite Cint_cfdot_vchar ?(rpredB, rpredD, rpred1, cycTIiso_vchar) //.
- by rewrite Dtau ?A0beta // !(cfInd_vchar, rpredB) ?rpred1 ?irr_vchar.
-have{oYeta} oYeta j: '[Y, eta_ 0 j] = 0.
- by rewrite (orthoPl oYeta) ?map_f ?mem_irr.
-have o_eta1s1: '[eta01^*, eta01] = 0.
- rewrite Deta01s cfdot_cycTIiso /= -(inj_eq irr_inj) aut_IirrE.
- by rewrite odd_eq_conj_irr1 ?mFT_odd // irr_eq1 (negPf nzj1).
-rewrite -(ler_add2r 2%:R) -natrD -(norm_beta #1) //.
-have ->: '[beta_ #1] = '[Gamma - eta01 + 1].
- by rewrite addrK subrK Dade_isometry ?A0beta.
-rewrite addrA cfnormDd ?cfnorm1 ?ler_add2r; last first.
- by rewrite cfdotBl oeta01_1 oGamma1 subrr.
-rewrite defXY addrAC addrC cfnormDd ?ler_add2r; last first.
- by rewrite cfdotBl oXY cfdotC oYeta conjC0 subrr.
-have oXeta j: '[X, eta_ 0 j] = '[Gamma, eta_ 0 j].
- by rewrite defXY cfdotDl oYeta addr0.
-pose X1 := X - a *: eta01 - a *: eta01^*%CF.
-have ->: X - eta01 = X1 + a *: eta01^*%CF + (a - 1) *: eta01.
- by rewrite scalerBl scale1r addrA !subrK.
-rewrite cfnormDd; last first.
- rewrite cfdotZr subrK cfdotBl oXeta -/a cfdotZl cfnorm_cycTIiso mulr1.
- by rewrite subrr mulr0.
-rewrite cfnormDd; last first.
- rewrite cfdotZr !cfdotBl !cfdotZl Deta01s cfnorm_cycTIiso oXeta -Deta01s.
- rewrite !cfdot_conjCr o_eta1s1 conjC0 mulr0 ((_ =P Gamma) GammaReal) -/a.
- by rewrite conj_Cint // mulr1 subr0 subrr mulr0.
-rewrite -addrA ler_paddl ?cfnorm_ge0 // !cfnormZ Deta01s !cfnorm_cycTIiso.
-rewrite !mulr1 !Cint_normK ?rpredB ?rpred1 // sqrrB1 !addrA -mulr2n.
-by rewrite -subr_ge0 addrK subr_ge0 ler_pmuln2r ?Cint_ler_sqr.
-Qed.
-
-(* The assumptions of Peterfalvi (13.19). *)
-(* We do not need to put these in a subsection as this is the last Lemma. *)
-Variable L : {group gT}.
-Hypotheses (maxL : L \in 'M) (Ltype1 : FTtype L == 1%N).
-
-Local Notation "` 'L'" := (gval L) (at level 0, only parsing) : group_scope.
-Local Notation H := `L`_\F%G.
-Local Notation "` 'H'" := `L`_\F (at level 0) : group_scope.
-
-Let e := #|L : H|.
-Let tauL := FT_DadeF maxL.
-Let calL := seqIndD H L H 1.
-
-Let frobL : [Frobenius L with kernel H]. Proof. exact: FTtype1_Frobenius. Qed.
-
-(* The coherence part of the preamble of (13.19). *)
-Lemma FTtype1_coherence : coherent calL L^# tauL.
-Proof.
-have [_ [tau1 [IZtau1 Dtau1]]] := FT_Frobenius_coherence maxL frobL.
-exists tau1; split=> // phi Sphi; rewrite ?Dtau1 //.
-move/(zcharD1_seqInd_on (Fcore_normal _)) in Sphi.
-by rewrite /tauL FT_DadeF_E ?FT_DadeE ?(cfun_onS (Fcore_sub_FTsupp _)).
-Qed.
-
-Lemma FTtype1_Ind_irr : {subset calL <= irr L}.
-Proof. by case: (FT_Frobenius_coherence maxL frobL). Qed.
-Let irrL := FTtype1_Ind_irr.
-
-(* We re-quantify over the witnesses so that the main part of the lemma can *)
-(* be used for Section variables in the very last part of Section 14. *)
-Variables (tau1 : {additive 'CF(L) -> 'CF(G)}) (phi : 'CF(L)).
-Hypothesis cohL : coherent_with calL L^# tauL tau1.
-Hypotheses (Lphi : phi \in calL) (phi1e : phi 1%g = e%:R).
-
-Let betaL := 'Ind[L, H] 1 - phi.
-Let betaS := beta_ #1.
-Let eta01 := eta_ 0 #1.
-
-(* This is Peterfalvi (13.19). *)
-Lemma FTtypeI_bridge_facts :
- [/\ (*a*) 'A~(L) :&: (class_support P G :|: class_support W G) = set0,
- (*b*) orthogonal (map tau1 calL) (map sigma (irr W)),
- (*c*) forall j, j != 0 -> '[tauL betaL, eta_ 0 j] = '[tauL betaL, eta01]
- & (*c1*) ('[tau betaS, tau1 phi] == 1 %[mod 2])%C
- /\ #|H|.-1%:R / e%:R <= (u.-1 %/ q)%:R :> algC
- \/ (*c2*) ('[tauL betaL, eta01] == 1 %[mod 2])%C /\ (p <= e)%N].
-Proof.
-have nsHL: H <| L := gFnormal _ L; have [sHL nHL] := andP nsHL.
-have coHr T r: T \in 'M -> FTtype T != 1%N -> r.-abelem T`_\F -> coprime #|H| r.
- move=> maxT notTtype1 /andP[rR _].
- have [_ _ [n oR]] := pgroup_pdiv rR (mmax_Fcore_neq1 maxT).
- rewrite -(coprime_pexpr _ r (ltn0Sn n)) -oR /= -FTcore_type1 //.
- apply: coprimegS (Fcore_sub_FTcore maxT) _.
- have [_ -> //] := FT_Dade_support_partition gT.
- by apply: contra notTtype1 => /imsetP[y _ ->] /=; rewrite FTtypeJ.
-have coHp: coprime #|H| p by apply: (coHr S) => //; have [_ []] := Sfacts.
-have{coHr} coHq: coprime #|H| q.
- have [T pairST [xdefW [V TtypeP]]] := FTtypeP_pair_witness maxS StypeP.
- have [[_ _ maxT] _ _ _ _] := pairST; have Ttype'1 := FTtypeP_neq1 maxT TtypeP.
- by rewrite (coHr T) ?Ttype'1 //; have [_ []] := FTtypeP_facts maxT TtypeP.
-have defA: 'A(L) = H^# := FTsupp_Frobenius maxL frobL.
-set PWG := class_support P G :|: class_support W G.
-have tiA_PWG: 'A~(L) :&: PWG = set0.
- apply/setP=> x; rewrite !inE; apply/andP=> [[Ax PWGx]].
- suffices{Ax}: \pi(H)^'.-elt x.
- have [y Ay /imset2P[_ t /rcosetP[z Rz ->] _ ->]] := bigcupP Ax => H'zyt.
- do [rewrite -def_FTsignalizer //; set ddL := FT_Dade_hyp maxL] in Rz.
- have /setD1P[nty Hy]: y \in H^# by rewrite -defA.
- have /idPn[]: (z * y).`_\pi('C_H[y]) == 1%g.
- rewrite (constt1P _) // -(p_eltJ _ _ t); apply: sub_in_pnat H'zyt => r _.
- by apply: contra; apply: piSg; apply: subsetIl.
- rewrite consttM; last first.
- exact: cent1P (subsetP (Dade_signalizer_cent _ y) z Rz).
- rewrite (constt1P (mem_p_elt _ Rz)) ?mul1g; last first.
- rewrite /pgroup -coprime_pi' ?cardG_gt0 // coprime_sym.
- by rewrite (coprimegS _ (Dade_coprime _ Ay Ay)) ?setSI.
- by rewrite (constt_p_elt (mem_p_elt (pgroup_pi _) _)) // inE Hy cent1id.
- suffices /pnat_dvd: #[x] %| #|P| * #|W|.
- have [_ [_ ->] _ _ _] := Sfacts; rewrite -(dprod_card defW) -/p -/q.
- by apply; rewrite !pnat_mul pnat_exp -!coprime_pi' ?cardG_gt0 ?coHp ?coHq.
- case/orP: PWGx => /imset2P[y z PWy _ ->]; rewrite {z}orderJ.
- by rewrite dvdn_mulr ?order_dvdG.
- by rewrite dvdn_mull ?order_dvdG.
-have ZsubL psi: psi \in calL -> psi - psi^*%CF \in 'Z[calL, L^#].
- have ZcalL: {subset calL <= 'Z[irr L]} by apply: seqInd_vcharW.
- by move=> Lpsi; rewrite sub_aut_zchar ?zchar_onG ?mem_zchar ?cfAut_seqInd.
-have mem_eta j: eta_ 0 j \in map sigma (irr W) by rewrite map_f ?mem_irr.
-have otau1eta: orthogonal (map tau1 calL) (map sigma (irr W)).
- apply/orthogonalP=> _ _ /mapP[psi Lpsi ->] /mapP[w irr_w ->].
- have{w irr_w} [i [j ->]] := cycTIirrP defW irr_w; rewrite -/(w_ i j).
- pose Psi := tau1 (psi - psi^*%CF); pose NC := cyclicTI_NC ctiWG.
- have [[Itau1 Ztau1] Dtau1] := cohL.
- have Lpsis: psi^*%CF \in calL by rewrite cfAut_seqInd.
- have Z1dpsi := ZsubL _ Lpsi; have Zdpsi := zcharW Z1dpsi.
- have{Dtau1} PsiV0: {in V, Psi =1 \0}.
- move=> x /setDP[Wx _]; rewrite /Psi Dtau1 ?(cfun_on0 (Dade_cfunS _ _)) //.
- rewrite FT_DadeF_supportE -defA; apply: contra_eqN tiA_PWG => Ax.
- by apply/set0Pn; exists x; rewrite !inE Ax orbC mem_class_support.
- have opsi: '[psi, psi^*] = 0 by apply: seqInd_conjC_ortho (mFT_odd _) _ Lpsi.
- have n2Psi: '[Psi] = 2%:R.
- by rewrite Itau1 ?cfnormBd // cfnorm_conjC ?irrWnorm ?irrL.
- have NC_Psi: (NC Psi < minn q p)%N.
- by rewrite (@leq_ltn_trans 2) ?leq_min ?qgt2 // cycTI_NC_norm ?Ztau1 ?n2Psi.
- apply: contraTeq (NC_Psi) => t1psi_eta; rewrite -leqNgt cycTI_NC_minn //.
- rewrite mul2n -addnn (leq_trans NC_Psi) ?leq_addl // andbT card_gt0.
- suffices [b Deta]: exists b : bool, eta_ i j = (-1) ^+ b *: tau1 psi.
- apply/set0Pn; exists (i, j); rewrite !inE /= /Psi raddfB cfdotBl {2}Deta.
- by rewrite cfdotZr Itau1 ?mem_zchar // cfdot_conjCl opsi conjC0 mulr0 subr0.
- exists (tau1 psi == - eta_ i j); apply: (canRL (signrZK _)).
- move/eqP: t1psi_eta; rewrite cfdot_dirr ?cycTIiso_dirr //; last first.
- by rewrite dirrE Itau1 ?Ztau1 ?mem_zchar //= irrWnorm ?irrL.
- by rewrite scaler_sign; do 2!case: eqP => //.
-have [[A0beta PVbeta] n2beta [defGa Ga1 R_Ga] ubGa dvu] := FTtypeP_bridge_facts.
-have [_ _ _ _ [_ Dtau]] := Sfacts.
-have o_tauL_S zeta j: j != 0 -> '[tauL zeta, tau (beta_ j)] = 0.
- move=> nzj; pose ABS := class_support (P^# :|: class_support V S) G.
- have ABSbeta: tau (beta_ j) \in 'CF(G, ABS).
- by rewrite Dtau ?A0beta // cfInd_on ?subsetT ?PVbeta.
- have{ABSbeta} PWGbeta: tau (beta_ j) \in 'CF(G, PWG).
- apply: cfun_onS ABSbeta; apply/subsetP=> _ /imset2P[x t PVSx _ ->].
- case/setUP: PVSx => [/setD1P[_ Px] | /imset2P[y z /setDP[Wy _] _ ->]].
- by rewrite inE memJ_class_support ?inE.
- by rewrite -conjgM inE orbC memJ_class_support ?inE.
- rewrite (cfdotElr (Dade_cfunS _ _) PWGbeta) big_pred0 ?mulr0 // => x.
- by rewrite FT_DadeF_supportE -defA tiA_PWG inE.
-have betaLeta j: j != 0 -> '[tauL betaL, eta_ 0 j] = '[tauL betaL, eta01].
- move=> nzj; apply/eqP; rewrite -subr_eq0 -cfdotBr.
- rewrite (canRL (addKr _) (defGa j nzj)) !addrA addrK -addrA addrCA.
- by rewrite opprD subrK cfdotBr !o_tauL_S ?subrr ?Iirr1_neq0.
-split=> //; have [[[Itau1 Ztau1] Dtau1] irr_phi] := (cohL, irrL Lphi).
-pose GammaL := tauL betaL - (1 - tau1 phi).
-have DbetaL: tauL betaL = 1 - tau1 phi + GammaL by rewrite addrC subrK.
-have RealGammaL: cfReal GammaL.
- rewrite /cfReal -subr_eq0 !rmorphB rmorph1 /= !opprB !addrA subrK addrC.
- rewrite -addrA addrCA addrA addr_eq0 opprB -Dade_aut -linearB /= -/tauL.
- rewrite rmorphB /= cfAutInd rmorph1 addrC opprB addrA subrK.
- by rewrite (cfConjC_Dade_coherent cohL) ?mFT_odd // -raddfB Dtau1 // ZsubL.
-have:= Dade_Ind1_sub_lin cohL _ irr_phi Lphi; rewrite -/betaL -/tauL -/calL.
-rewrite (seqInd_nontrivial _ _ _ Lphi) ?odd_Frobenius_index_ler ?mFT_odd //.
-case=> // -[o_tauL_1 o_betaL_1 ZbetaL] ub_betaL _.
-have{o_tauL_1 o_betaL_1} o_GaL_1: '[GammaL, 1] = 0.
- by rewrite !cfdotBl cfnorm1 o_betaL_1 (orthoPr o_tauL_1) ?map_f ?subr0 ?subrr.
-have Zt1phi: tau1 phi \in 'Z[irr G] by rewrite Ztau1 ?mem_zchar.
-have Zeta01: eta01 \in 'Z[irr G] by apply: cycTIiso_vchar.
-have ZbetaS: tau betaS \in 'Z[irr G].
- rewrite Dade_vchar // zchar_split A0beta ?Iirr1_neq0 //.
- by rewrite rpredB ?irr_vchar ?cfInd_vchar ?rpred1.
-have Z_Ga: Gamma \in 'Z[irr G] by rewrite rpredD ?rpredB ?rpred1.
-have Z_GaL: GammaL \in 'Z[irr G] by rewrite !rpredB ?rpred1.
-have{RealGammaL} Gamma_even: (2 %| '[GammaL, Gamma])%C.
- by rewrite cfdot_real_vchar_even ?mFT_odd // o_GaL_1 (dvdC_nat 2 0).
-set bSphi := '[tau betaS, tau1 phi]; set bLeta := '[tauL betaL, eta01].
-have [ZbSphi ZbLeta]: bSphi \in Cint /\ bLeta \in Cint.
- by rewrite !Cint_cfdot_vchar.
-have{Gamma_even} odd_bSphi_bLeta: (bSphi + bLeta == 1 %[mod 2])%C.
- rewrite -(conj_Cint ZbSphi) -cfdotC /bLeta DbetaL cfdotDl cfdotBl.
- have: '[tauL betaL, tau betaS] == 0 by rewrite o_tauL_S ?Iirr1_neq0.
- have ->: tau betaS = 1 - eta01 + Gamma by rewrite addrCA !addrA !subrK.
- rewrite !['[tau1 _, _]]cfdotDr 2!cfdotDr !cfdotNr DbetaL.
- rewrite 2!cfdotDl 2!['[_, eta01]]cfdotDl 2!['[_, Gamma]]cfdotDl !cfdotNl.
- rewrite cfnorm1 o_GaL_1 ['[1, Gamma]]cfdotC Ga1 conjC0 addr0 add0r.
- have ->: 1 = eta_ 0 0 by rewrite /w_ cycTIirr00 cycTIiso1.
- rewrite cfdot_cycTIiso mulrb ifN_eqC ?Iirr1_neq0 // add0r.
- rewrite 2?(orthogonalP otau1eta _ _ (map_f _ _) (mem_eta _)) // oppr0 !add0r.
- by rewrite addr0 addrA addrC addr_eq0 !opprB addrA /eqCmod => /eqP <-.
-have abs_mod2 a: a \in Cint -> {b : bool | a == b%:R %[mod 2]}%C.
- move=> Za; pose n := truncC `|a|; exists (odd n).
- apply: eqCmod_trans (eqCmod_addl_mul _ (rpred_nat _ n./2) _).
- rewrite addrC -natrM -natrD muln2 odd_double_half truncCK ?Cnat_norm_Cint //.
- rewrite -{1}[a]mul1r -(canLR (signrMK _) (CintEsign Za)) eqCmodMr // signrE.
- by rewrite /eqCmod opprB addrC subrK dvdC_nat dvdn2 odd_double.
-have [[bL DbL] [bS DbS]] := (abs_mod2 _ ZbLeta, abs_mod2 _ ZbSphi).
-have{odd_bSphi_bLeta} xor_bS_bL: bS (+) bL.
- rewrite eqCmod_sym in odd_bSphi_bLeta.
- have:= eqCmod_trans odd_bSphi_bLeta (eqCmodD DbS DbL).
- rewrite -natrD eqCmod_sym -(eqCmodDr _ 1) -mulrSr => xor_bS_bL.
- have:= eqCmod_trans xor_bS_bL (eqCmodm0 _); rewrite /eqCmod subr0.
- by rewrite (dvdC_nat 2 _.+1) dvdn2 /= negbK odd_add !oddb; case: (_ (+) _).
-have ?: (0 != 1 %[mod 2])%C by rewrite eqCmod_sym /eqCmod subr0 (dvdC_nat 2 1).
-case is_c1: bS; [left | right].
- rewrite is_c1 in DbS; split=> //.
- pose a_ (psi : 'CF(L)) := psi 1%g / e%:R.
- have Na_ psi: psi \in calL -> a_ psi \in Cnat by apply: dvd_index_seqInd1.
- have [X tau1X [D [dGa oXD oDtau1]]] := orthogonal_split (map tau1 calL) Gamma.
- have oo_L: orthonormal calL.
- by apply: sub_orthonormal (irr_orthonormal L); rewrite ?seqInd_uniq.
- have oo_tau1L: orthonormal (map tau1 calL) by apply: map_orthonormal.
- have defX: X = bSphi *: (\sum_(psi <- calL) a_ psi *: tau1 psi).
- have [_ -> defX] := orthonormal_span oo_tau1L tau1X.
- rewrite defX big_map scaler_sumr; apply: eq_big_seq => psi Lpsi.
- rewrite scalerA; congr (_ *: _); apply/eqP; rewrite -subr_eq0 mulrC.
- rewrite -[X](addrK D) -dGa cfdotBl (orthoPl oDtau1) ?map_f // subr0.
- rewrite cfdotC cfdotDr cfdotBr -/betaS -/eta01.
- have ->: 1 = eta_ 0 0 by rewrite /w_ cycTIirr00 cycTIiso1.
- rewrite 2?(orthogonalP otau1eta _ _ (map_f _ _) (mem_eta _)) // subrK.
- rewrite -cfdotC -(conj_Cnat (Na_ _ Lpsi)) -cfdotZr -cfdotBr.
- rewrite -raddfZ_Cnat ?Na_ // -raddfB cfdotC.
- rewrite Dtau1; last by rewrite zcharD1_seqInd ?seqInd_sub_lin_vchar.
- by rewrite o_tauL_S ?Iirr1_neq0 ?conjC0.
- have nz_bSphi: bSphi != 0 by apply: contraTneq DbS => ->.
- have ub_a: \sum_(psi <- calL) a_ psi ^+ 2 <= (u.-1 %/ q)%:R.
- apply: ler_trans (ubGa D X _ _ _); first 1 last; first by rewrite addrC.
- - by rewrite cfdotC oXD conjC0.
- - apply/orthoPl=> eta Weta; rewrite (span_orthogonal otau1eta) //.
- exact: memv_span.
- rewrite defX cfnormZ cfnorm_sum_orthonormal // mulr_sumr !big_seq.
- apply: ler_sum => psi Lpsi; rewrite -{1}(norm_Cnat (Na_ _ _)) //.
- by rewrite ler_pemull ?exprn_ge0 ?normr_ge0 // Cint_normK // sqr_Cint_ge1.
- congr (_ <= _): ub_a; do 2!apply: (mulIf (neq0CiG L H)); rewrite -/e.
- rewrite divfK ?neq0CiG // -mulrA -expr2 mulr_suml.
- rewrite -subn1 natrB ?neq0CG // -indexg1 mulrC.
- rewrite -(sum_seqIndD_square nsHL) ?normal1 ?sub1G // -/calL.
- apply: eq_big_seq => psi Lpsi; rewrite irrWnorm ?irrL // divr1.
- by rewrite -exprMn divfK ?neq0CiG.
-rewrite is_c1 /= in xor_bS_bL; rewrite xor_bS_bL in DbL; split=> //.
-have nz_bL: bLeta != 0 by apply: contraTneq DbL => ->.
-have{ub_betaL} [X [otau1X oX1 [a Za defX]] [//|_ ubX]] := ub_betaL.
-rewrite -/e in defX; rewrite -leC_nat -(ler_add2r (-1)); apply: ler_trans ubX.
-pose calX0 := [seq w_ 0 j | j in predC1 0].
-have ooX0: orthonormal calX0.
- apply: sub_orthonormal (irr_orthonormal W).
- by move=> _ /imageP[j _ ->]; apply: mem_irr.
- by apply/dinjectiveP=> j1 j2 _ _ /irr_inj/dprod_Iirr_inj[].
-have Isigma: {in 'Z[calX0] &, isometry sigma}.
- by apply: in2W; apply: cycTIisometry.
-rewrite -[X](subrK (bLeta *: (\sum_(xi <- calX0) sigma xi))).
-rewrite cfnormDd ?ler_paddl ?cfnorm_ge0 //; last first.
- rewrite cfdotZr cfdot_sumr big1_seq ?mulr0 // => xi X0xi.
- apply/eqP; rewrite cfdotBl scaler_sumr cfproj_sum_orthonormal // subr_eq0.
- have {xi X0xi}[j nzj ->] := imageP X0xi; rewrite inE /= in nzj.
- rewrite -[bLeta](betaLeta j nzj) defX cfdotDl -addrA cfdotDl.
- have ->: 1 = eta_ 0 0 by rewrite /w_ cycTIirr00 cycTIiso1.
- rewrite cfdot_cycTIiso mulrb (ifN_eqC _ _ nzj) add0r eq_sym -subr_eq0 addrK.
- rewrite (span_orthogonal otau1eta) //; last by rewrite memv_span ?mem_eta.
- rewrite big_seq rpredD ?(rpredN, rpredZ, rpred_sum) ?memv_span ?map_f //.
- by move=> xi Lxi; rewrite rpredZ ?memv_span ?map_f.
-rewrite cfnormZ cfnorm_map_orthonormal // size_image cardC1 nirrW2.
-rewrite -(natrB _ (prime_gt0 pr_p)) Cint_normK // subn1.
-by rewrite ler_pemull ?ler0n ?sqr_Cint_ge1.
-Qed.
-
-End Thirteen_17_to_19.
-
-End Thirteen.
-
diff --git a/mathcomp/odd_order/PFsection14.v b/mathcomp/odd_order/PFsection14.v
deleted file mode 100644
index 1b8a531..0000000
--- a/mathcomp/odd_order/PFsection14.v
+++ /dev/null
@@ -1,1271 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime binomial ssralg poly finset.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action finalg zmodp.
-From mathcomp
-Require Import gfunctor gproduct center cyclic commutator gseries nilpotent.
-From mathcomp
-Require Import pgroup sylow hall abelian maximal frobenius.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation mxabelem vector.
-From mathcomp
-Require Import BGsection1 BGsection3 BGsection7.
-From mathcomp
-Require Import BGsection14 BGsection15 BGsection16 BGappendixC.
-From mathcomp
-Require Import ssrnum rat algC cyclotomic algnum.
-From mathcomp
-Require Import classfun character integral_char inertia vcharacter.
-From mathcomp
-Require Import PFsection1 PFsection2 PFsection3 PFsection4.
-From mathcomp
-Require Import PFsection5 PFsection6 PFsection7 PFsection8 PFsection9.
-From mathcomp
-Require Import PFsection10 PFsection11 PFsection12 PFsection13.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 14: Non_existence of G. *)
-(* It completes the proof of the Odd Order theorem. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory FinRing.Theory Num.Theory.
-
-Section Fourteen.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Implicit Types (p q : nat) (x y z : gT).
-Implicit Types H K L N P Q R S T U W : {group gT}.
-
-Local Notation "#1" := (inord 1) (at level 0).
-
-(* Supplementary results that apply to both S and T, but that are not *)
-(* formally stated as such; T, V, L, tau1L and phi are only used at the end *)
-(* of this section, to state and prove FTtype2_support_coherence. *)
-Section MoreSTlemmas.
-
-Local Open Scope ring_scope.
-Variables W W1 W2 S T U V L : {group gT}.
-Variables (tau1L : {additive 'CF(L) -> 'CF(G)}) (phi : 'CF(L)).
-
-(* Implicit (dependent) forward assuptions. *)
-Hypotheses (defW : W1 \x W2 = W) (xdefW : W2 \x W1 = W) (maxL : L \in 'M).
-
-Local Notation "` 'S'" := (gval S) (at level 0, only parsing) : group_scope.
-Local Notation P := `S`_\F%G.
-Local Notation "` 'P'" := `S`_\F (at level 0) : group_scope.
-Local Notation PU := S^`(1)%G.
-Local Notation "` 'PU'" := `S^`(1)%g (at level 0) : group_scope.
-Local Notation "` 'L'" := (gval L) (at level 0, only parsing).
-Local Notation H := `L`_\F%G.
-Local Notation "` 'H'" := `L`_\F%g (at level 0, format "` 'H'") : group_scope.
-
-Let p := #|W2|.
-Let q := #|W1|.
-Let u := #|U|.
-Let v := #|V|.
-Let h := #|H|.
-Let e := #|L : H|.
-Let ccG A := class_support A G.
-
-Let calL := seqIndD H L H 1.
-Let betaL := 'Ind[L, H] 1 - phi.
-Local Notation tauL := (FT_DadeF maxL).
-
-(* Explicit (non-dependent) forward assumptions. *)
-Hypotheses (StypeP : of_typeP S U defW) (TtypeP : of_typeP T V xdefW).
-Hypothesis (cohL : coherent_with calL L^# tauL tau1L) (Lphi : phi \in calL).
-
-(* The remaining assumptions can be generated as backchaining gools. *)
-Hypotheses (maxS : S \in 'M) (maxT : T \in 'M).
-
-Let pddS := FT_prDade_hypF maxS StypeP.
-Let pddT := FT_prDade_hypF maxT TtypeP.
-Let ctiWG : cyclicTI_hypothesis G defW := pddS.
-Let sigma := cyclicTIiso ctiWG.
-Let w_ i j := cyclicTIirr defW i j.
-
-(* An inequality used in the proof of (14.11.4), at the bottom of page 90, to *)
-(* show that 1/uq and 1/vp are less that 1/2q^2 (so Wn is either W1 or W2). *)
-Lemma FTtypeP_complV_ltr (Wn : {group gT}) :
- (#|Wn| <= q)%N -> (u * q)%:R^-1 < (2 * #|Wn| ^ 2)%:R^-1 :> algC.
-Proof.
-move=> leWn_q; rewrite !natrM ltf_pinv ?rpredM ?qualifE ?gt0CG ?ltr0n //.
-rewrite -!natrM ltr_nat (@leq_ltn_trans (2 * q ^ 2)) ?mulnA ?leq_mul // mul2n.
-have: [Frobenius U <*> W1 = U ><| W1] by have [[]] := FTtypeP_facts maxS StypeP.
-by move/ltn_odd_Frobenius_ker/implyP; rewrite mFT_odd ltn_pmul2r ?cardG_gt0.
-Qed.
-
-(* This formalizes the loose symmetry used in (14.11.3) to show that #[g] is *)
-(* coprime to pq. *)
-Lemma coprime_typeP_Galois_core g :
- typeP_Galois StypeP -> g \notin ccG W^# -> g \notin ccG P^# -> coprime #[g] p.
-Proof.
-move=> galS W'g; apply: contraR => p_g.
-have ntg: g != 1%g by apply: contraNneq p_g => ->; rewrite order1 coprime1n.
-have [pr_q pr_p]: prime q /\ prime p := FTtypeP_primes maxS StypeP.
-have [[_ hallW1 _ defS] [_ _ _ defPU] _ [_ _ sW2P _ regPUW1] _] := StypeP.
-have coPUq: coprime #|PU| q by rewrite (coprime_sdprod_Hall_r defS).
-have [[_ _ nPUW1 _] [_ _ nPU _]] := (sdprodP defS, sdprodP defPU).
-have ntP: P :!=: 1%g := mmax_Fcore_neq1 maxS.
-have frobPU: [Frobenius PU = P ><| U].
- have notS5 := FTtype5_exclusion maxS.
- have inN1 x: x \in 'N(1) by rewrite norm1 inE.
- have [_ ntU _ _] := compl_of_typeII_IV maxS StypeP notS5.
- have [] := typeP_Galois_P maxS notS5 galS; rewrite Ptype_factor_prime //.
- rewrite (group_inj (Ptype_Fcore_kernel_trivial _ _)) // => F [fP [fU _]].
- rewrite Ptype_Fcompl_kernel_trivial //.
- case=> /trivgP injfU fJ [_ /isomP[injfP _] _] _.
- apply/Frobenius_semiregularP=> // y /setD1P[nty Uy].
- apply/trivgP/subsetP=> x /setIP[Px /cent1P-cxy]; apply: contraR nty.
- rewrite -(morph_injm_eq1 injfU) // -val_eqE -(cosetpre1 1) !(inN1, inE) /=.
- rewrite -(morph_injm_eq1 injfP) ?mem_quotient //= => /mulfI/inj_eq <-.
- rewrite mulr1 -[_ * _]fJ ?mem_quotient //= qactE ?dom_qactJ //=.
- by rewrite conjgE cxy mulKg.
-have pP: p.-group P by have [_ [/andP[]]] := FTtypeP_facts _ StypeP.
-have{p_g}[y [a P1a cagy]]: exists y, exists2 a, a \in P^# & g ^ y \in 'C[a].
- have sylP: p.-Sylow(G) P.
- have [/Hall_pi/= hallP _ _] := FTcore_facts maxS; apply: etrans hallP.
- have [_ _ [n ->]] := pgroup_pdiv pP (mmax_Fcore_neq1 maxS).
- by apply/eq_pHall => r1; rewrite pi_of_exp ?pi_of_prime.
- have [y _ Pa] := Sylow_Jsub sylP (subsetT _) (p_elt_constt p g).
- pose a := g.`_p ^ y; have{Pa} Pa: a \in P by rewrite -cycle_subG cycleJ.
- exists y, a; last by rewrite cent1C /a conjXg groupX ?cent1id.
- rewrite !inE conjg_eq1 (contraNneq _ p_g) // => /constt1P/p'nat_coprime-> //.
- exact: pnat_id.
-have /(mem_sdprod defS)[x [w [PUx W1w Dgy _]]]: g ^ y \in S.
- have A0a: a \in 'A0(S) := subsetP (Fcore_sub_FTsupp0 maxS) a P1a.
- have [_ _ _ _ [tiA0 _]] := FTtypeP_facts _ StypeP.
- by rewrite (subsetP (cent1_normedTI tiA0 A0a)) // 2!inE.
-suffices w_eq1: w = 1%g.
- have sCaP: 'C_PU[a] \subset P := Frobenius_cent1_ker frobPU P1a.
- rewrite -[g](conjgK y) mem_imset2 ?inE //= conjg_eq1 ntg /=.
- by rewrite (subsetP sCaP) // inE cagy Dgy w_eq1 mulg1 PUx.
-apply: contraNeq W'g => ntw; have nPUw := subsetP nPUW1 w W1w.
-have{x PUx Dgy} /imset2P[x z W2w_x _ Dgy]: g ^ y \in class_support (W2 :* w) PU.
- rewrite -(regPUW1 w) ?inE ?ntw // class_supportEr -cover_imset.
- have coPUw := coprime_dvdr (order_dvdG W1w) coPUq.
- have [/cover_partition-> _] := partition_cent_rcoset nPUw coPUw.
- by rewrite Dgy mem_rcoset mulgK.
-rewrite -[g](conjgK (y * z^-1)%g) mem_imset2 ?inE //= conjg_eq1 ntg /= conjgM.
-by rewrite Dgy conjgK -(dprodWC defW) -[x](mulgKV w) mem_mulg -?mem_rcoset.
-Qed.
-
-Hypothesis Stype2 : FTtype S == 2.
-
-(* This is used to bound #|ccG P^#| and #|ccG Q^#| in the proof of (14.11.4). *)
-Lemma FTtype2_cc_core_ler : #|G|%:R^-1 * #|ccG P^#|%:R <= (u * q)%:R^-1 :> algC.
-Proof.
-have ->: (u * q)%:R^-1 = #|S|%:R^-1 * #|P|%:R :> algC.
- have [[_ _ _ /sdprod_card <-] [_ _ _ /sdprod_card <-] _ _ _] := StypeP.
- by rewrite mulrC -mulnA [in RHS]natrM invfM mulVKf ?neq0CG.
-have [_ _] := FTtypeII_ker_TI maxS Stype2; rewrite FTsupp1_type2 // => tiP1.
-rewrite {tiP1}(card_support_normedTI tiP1) natrM natf_indexg ?subsetT //.
-rewrite mulrCA mulKf ?neq0CG // mulrC ler_pmul2l ?invr_gt0 ?gt0CG // leC_nat.
-by rewrite cardsDS ?sub1G ?leq_subr.
-Qed.
-
-Hypotheses (maxNU_L : L \in 'M('N(U))) (phi1 : phi 1%g = e%:R).
-
-(* This is Peterfalvi (14.11.2), stated for S and L rather than T and M; it *)
-(* is loosely used in this form at the very end of the proof of (14.16). *)
-Lemma FTtype2_support_coherence :
- (u.-1 %/ q < h.-1 %/ e)%N -> (v.-1 %/ p < h.-1 %/ e)%N ->
- [/\ e = (p * q)%N
- & exists nb, exists2 chi, chi = tau1L phi \/ chi = - tau1L phi^*%CF
- & tauL betaL = \sum_ij (-1)^+ nb ij *: sigma 'chi_ij - chi].
-Proof.
-move=> ub_u ub_v; have nsHL : H <| L := gFnormal _ _.
-have pairST := of_typeP_pair maxS StypeP maxT TtypeP.
-have [//|frobL sUH defL] := FTtypeII_support_facts maxS StypeP _ pairST maxNU_L.
-have Ltype1 := FT_Frobenius_type1 maxL frobL.
-have irr_phi: phi \in irr L by apply: FTtype1_Ind_irr Lphi.
-have betaL_P := FTtypeI_bridge_facts _ _ Ltype1 cohL Lphi phi1.
-have e_dv_h1: e %| h.-1 by apply: Frobenius_ker_dvd_ker1.
-pose a i j := '[tauL betaL, sigma (w_ i j)].
-have a0j j: j != 0 -> (a 0 j == 1 %[mod 2])%C.
- rewrite /a => nz_j; case/betaL_P: StypeP => _ _ -> //.
- by case=> [[_ /idPn[]] | [//]]; rewrite -natf_div // leC_nat -ltnNge.
-have ai0 i: i != 0 -> (a i 0 == 1 %[mod 2])%C.
- rewrite /a (cycTIisoC _ pddT) => nz_i; case/betaL_P: TtypeP => _ _ -> //.
- by case=> [[_ /idPn[]] | [//]]; rewrite -natf_div // leC_nat -ltnNge.
-have HbetaL: betaL \in 'CF(L, H^#) by apply: cfInd1_sub_lin_on Lphi phi1.
-have betaL_W_0: {in cyclicTIset defW, tauL betaL =1 \0}.
- move=> z; case/betaL_P: StypeP => tiAM_W _ _ _.
- rewrite !inE -(setCK W) inE => /andP[_]; apply: cfun_onP z.
- apply: cfun_onS (Dade_cfunS _ _); rewrite FT_DadeF_supportE -disjoints_subset.
- rewrite -FTsupp_Frobenius // -setI_eq0 -subset0 -tiAM_W setIS //.
- by rewrite setUC subsetU ?sub_class_support.
-have calL_gt1: (1 < size calL)%N.
- by apply: seqInd_nontrivial Lphi; rewrite ?mFT_odd.
-have [] := Dade_Ind1_sub_lin cohL calL_gt1 irr_phi Lphi phi1; rewrite -/betaL.
-rewrite -/calL odd_Frobenius_index_ler ?mFT_odd //= -/e -/h.
-case=> _ a00 ZbetaL [Gamma [o_tau1_Ga o_1_Ga [aa Zaa Dbeta] []// _ ubGa _]].
-have{a00} a00: a 0 0 = 1 by rewrite /a /w_ cycTIirr00 cycTIiso1.
-have{a0j ai0} a_odd i j: (a i j == 1 %[mod 2])%C.
- have [[-> | /ai0 ai01] [-> | /a0j a0j1] //] := (eqVneq i 0, eqVneq j 0).
- by rewrite a00 (eqCmod_nat 2 1 1).
- by rewrite -(eqCmodDr _ 1) -{1}a00 cycTIiso_cfdot_exchange // eqCmodD.
-have [_ o_tauLeta _ _] := FTtypeI_bridge_facts _ StypeP Ltype1 cohL Lphi phi1.
-pose etaW := map sigma (irr W).
-have o1eta: orthonormal etaW := cycTIiso_orthonormal _.
-have [X etaX [Y [defGa oXY oYeta]]] := orthogonal_split etaW (Gamma + 1).
-have lbY: 0 <= '[Y] ?= iff (Y == 0).
- by split; rewrite ?cfnorm_ge0 // eq_sym cfnorm_eq0.
-have [b Db defX] := orthonormal_span o1eta etaX.
-do [rewrite addrC !addrA addrAC -addrA; set Z := _ - _] in Dbeta.
-have oZeta: orthogonal Z etaW.
- apply/orthoPl=> xi /memv_span; apply: {xi}(span_orthogonal o_tauLeta).
- rewrite rpredB ?rpredZ ?big_seq ?rpred_sum ?memv_span ?map_f // => xi Lxi.
- by rewrite rpredZ ?memv_span ?map_f.
-have lb_b ij (b_ij := b (sigma 'chi_ij)):
- 1 <= `|b_ij| ^+ 2 ?= iff [exists n : bool, b_ij == (-1) ^+ n].
-- have /codomP[[i j] Dij] := dprod_Iirr_onto defW ij.
- have{b_ij} ->: b_ij = a i j.
- rewrite /a /w_ -Dij Dbeta defGa 2!cfdotDl.
- have ->: '[X, sigma 'chi_ij] = b_ij by rewrite /b_ij Db.
- by rewrite (orthoPl oYeta) ?(orthoPl oZeta) ?map_f ?mem_irr // !addr0.
- have Zaij: a i j \in Cint by rewrite Cint_cfdot_vchar ?cycTIiso_vchar.
- rewrite Cint_normK //; split.
- rewrite sqr_Cint_ge1 //; apply: contraTneq (a_odd i j) => ->.
- by rewrite (eqCmod_nat 2 0 1).
- apply/eqP/exists_eqP=> [a2_1|[n ->]]; last by rewrite sqrr_sign.
- rewrite (CintEsign Zaij) normC_def conj_Cint // -expr2 -a2_1 sqrtC1 mulr1.
- by exists (a i j < 0).
-have ub_e: e%:R <= #|Iirr W|%:R ?= iff (e == p * q)%N :> algC.
- rewrite lerif_nat card_Iirr_cyclic //; last by have [] := ctiWG.
- rewrite -(dprod_card xdefW); apply: leqif_eq.
- case: defL => [|[y Qy]] defL; rewrite /e -(index_sdprod defL).
- by rewrite leq_pmull ?cardG_gt0.
- suffices /normP <-: y \in 'N(W1).
- by rewrite -conjYg !cardJg (dprodWY defW) -(dprod_card xdefW).
- have cQQ: abelian T`_\F by have [_ [/and3P[]]] := FTtypeP_facts maxT TtypeP.
- have sW1Q: W1 \subset T`_\F by have [_ _ _ []] := TtypeP.
- by rewrite (subsetP _ y Qy) // sub_abelian_norm.
-have /(_ predT) := lerif_add (lerif_sum (in1W lb_b)) lbY.
-rewrite sumr_const addr0 => /(lerif_trans ub_e)/ger_lerif/esym.
-have ->: \sum_i `|b (sigma 'chi_i)| ^+ 2 = '[X].
- rewrite defX cfnorm_sum_orthonormal // big_map (big_nth 0) big_mkord.
- by rewrite size_tuple; apply: eq_bigr => ij _; rewrite -tnth_nth.
-rewrite -cfnormDd // -defGa cfnormDd // cfnorm1 -ler_subr_addr ubGa.
-case/and3P=> /eqP-De /'forall_exists_eqP/fin_all_exists[/= n Dn] /eqP-Y0.
-pose chi := X - tauL betaL; split=> //; exists n, chi; last first.
- apply: canRL (addrK _) _; rewrite addrC subrK defX big_map (big_nth 0).
- by rewrite big_mkord size_tuple; apply: eq_bigr => ij; rewrite -tnth_nth Dn.
-have Z1chi: chi \in dirr G.
- rewrite dirrE rpredB //=; last first.
- rewrite defX big_map (big_nth 0) big_mkord size_tuple rpred_sum //= => ij.
- have [_ Zsigma] := cycTI_Zisometry ctiWG.
- by rewrite -tnth_nth Dn rpredZsign ?Zsigma ?irr_vchar.
- apply/eqP/(addIr '[X]); rewrite -cfnormBd; last first.
- rewrite /chi Dbeta defGa Y0 addr0 opprD addNKr cfdotNl.
- by rewrite (span_orthogonal oZeta) ?oppr0 // memv_span ?mem_head.
- rewrite addrAC subrr add0r cfnormN Dade_isometry // cfnormBd; last first.
- by rewrite cfdotC (seqInd_ortho_Ind1 _ _ Lphi) ?conjC0.
- rewrite cfnorm_Ind_cfun1 // -/e irrWnorm // addrC; congr (1 + _).
- rewrite defX cfnorm_sum_orthonormal // big_map big_tuple.
- rewrite De (dprod_card xdefW) -card_Iirr_cyclic //; last by have[]:= ctiWG.
- by rewrite -sumr_const; apply: eq_bigr => ij _; rewrite Dn normr_sign expr1n.
-have [[Itau1 Ztau1] Dtau1] := cohL.
-suffices /cfdot_add_dirr_eq1: '[tau1L phi - tau1L phi^*%CF, chi] = 1.
- rewrite -(cfConjC_Dade_coherent cohL) ?mFT_odd // rpredN dirr_aut.
- by apply; rewrite // dirrE Ztau1 ?Itau1 ?mem_zchar ?irrWnorm /=.
-rewrite cfdotBr (span_orthogonal o_tauLeta) ?add0r //; last first.
- by rewrite rpredB ?memv_span ?map_f ?cfAut_seqInd.
-have Zdphi := seqInd_sub_aut_zchar nsHL conjC Lphi.
-rewrite -raddfB Dtau1 ?zcharD1_seqInd // Dade_isometry ?(zchar_on Zdphi) //.
-rewrite cfdotBr !cfdotBl cfdot_conjCl cfAutInd rmorph1 irrWnorm //.
-rewrite (seqInd_ortho_Ind1 _ _ Lphi) // conjC0 subrr add0r opprK.
-by rewrite cfdot_conjCl (seqInd_conjC_ortho _ _ _ Lphi) ?mFT_odd ?conjC0 ?subr0.
-Qed.
-
-End MoreSTlemmas.
-
-Section NonconjType1.
-(* Properties of non-conjugate type I groups, used symmetrically for L and M *)
-(* in the proofs of (14.14) and (14.16). *)
-
-Local Open Scope ring_scope.
-Variables (M L : {group gT}) (phi : 'CF(L)) (psi : 'CF(M)).
-Variable (tau1L : {additive 'CF(L) -> 'CF(G)}).
-Variable (tau1M : {additive 'CF(M) -> 'CF(G)}).
-Hypotheses (maxL : L \in 'M) (maxM : M \in 'M).
-Let ddL := FT_DadeF_hyp maxL.
-Let ddM := FT_DadeF_hyp maxM.
-Let tauL := Dade ddL.
-Let tauM := Dade ddM.
-Let H := L`_\F%G.
-Let K := M`_\F%G.
-Let calL := seqIndD H L H 1.
-Let calM := seqIndD K M K 1.
-Let u : algC := #|L : H|%:R.
-Let v : algC := #|M : K|%:R.
-Let betaL := 'Ind[L, H] 1 - phi.
-Let a := '[tauL betaL, tau1M psi].
-
-Hypothesis (cohL : coherent_with calL L^# tauL tau1L).
-Hypothesis (cohM : coherent_with calM M^# tauM tau1M).
-Hypotheses (Lphi : phi \in calL) (Mpsi : psi \in calM).
-Hypotheses (phi1 : phi 1%g = u) (psi1 : psi 1%g = v).
-Hypotheses (Ltype1 : FTtype L == 1%N) (Mtype1 : FTtype M == 1%N).
-Hypothesis not_MG_L : gval L \notin M :^: G.
-
-Let irrL := FTtype1_Ind_irr maxL Ltype1.
-Let irrM := FTtype1_Ind_irr maxM Mtype1.
-
-Lemma disjoint_Dade_FTtype1 : [disjoint Dade_support ddM & Dade_support ddL].
-Proof.
-by rewrite !FT_DadeF_supportE -!FTsupp1_type1 ?FT_Dade1_support_disjoint.
-Qed.
-Let TItauML := disjoint_Dade_FTtype1.
-
-Lemma coherent_FTtype1_ortho : orthogonal (map tau1M calM) (map tau1L calL).
-Proof.
-apply/orthogonalP=> _ _ /mapP[xiM Mxi ->] /mapP[xiL Lxi ->].
-have [irrLxi irrMxi] := (irrL Lxi, irrM Mxi).
-exact: (disjoint_coherent_ortho (mFT_odd _) _ cohM cohL).
-Qed.
-Let oML := coherent_FTtype1_ortho.
-
-(* This is the inequality used in both branches of (14.14). *)
-Lemma coherent_FTtype1_core_ltr : a != 0 -> #|K|.-1%:R / v <= u - 1.
-Proof.
-have [nsHL nsKM]: H <| L /\ K <| M by rewrite !gFnormal.
-have [irr_phi irr_psi] := (irrL Lphi, irrM Mpsi).
-have frobL: [Frobenius L with kernel H] := FTtype1_Frobenius maxL Ltype1.
-have [[Itau1 Ztau1] Dtau1] := cohM.
-have o1M: orthonormal (map tau1M calM).
- apply: map_orthonormal Itau1 _.
- exact: sub_orthonormal (undup_uniq _) (irr_orthonormal M).
-have Lgt1: (1 < size calL)%N by apply: seqInd_nontrivial (mFT_odd _ ) _ Lphi.
-have [[_ _]] := Dade_Ind1_sub_lin cohL Lgt1 irr_phi Lphi phi1.
-rewrite -/tauL -/betaL -/calL => ZbetaL [Gamma [_ _ [b _ Dbeta]]].
-rewrite odd_Frobenius_index_ler ?mFT_odd // -/u => -[]// _ ub_Ga _ nz_a.
-have Za: a \in Cint by rewrite Cint_cfdot_vchar // ?Ztau1 ?mem_zchar.
-have [X M_X [Del [defGa oXD oDM]]] := orthogonal_split (map tau1M calM) Gamma.
-apply: ler_trans ub_Ga; rewrite defGa cfnormDd // ler_paddr ?cfnorm_ge0 //.
-suffices ->: '[X] = (a / v) ^+ 2 * (\sum_(xi <- calM) xi 1%g ^+ 2 / '[xi]).
- rewrite sum_seqIndC1_square // -(natrB _ (cardG_gt0 K)) subn1.
- rewrite exprMn !mulrA divfK ?neq0CiG // mulrAC -mulrA.
- by rewrite ler_pemull ?sqr_Cint_ge1 // divr_ge0 ?ler0n.
-have [_ -> defX] := orthonormal_span o1M M_X.
-have Mgt1: (1 < size calM)%N by apply: seqInd_nontrivial (mFT_odd _ ) _ Mpsi.
-have [[oM1 _ _] _ _] := Dade_Ind1_sub_lin cohM Mgt1 irr_psi Mpsi psi1.
-rewrite exprMn -(Cint_normK Za) -[v]normr_nat -normfV -/v mulr_sumr.
-rewrite defX cfnorm_sum_orthonormal // big_map; apply: eq_big_seq => xi Mxi.
-have Zxi1 := Cint_seqInd1 Mxi; rewrite -(Cint_normK Zxi1) -(conj_Cint Zxi1).
-rewrite irrWnorm ?irrM // divr1 -!exprMn -!normrM; congr (`|_| ^+ 2).
-rewrite -mulrA mulrC -mulrA; apply: canRL (mulKf (neq0CiG _ _)) _.
-rewrite -(canLR (addrK _) defGa) cfdotBl (orthoPl oDM) ?map_f // subr0.
-rewrite -(canLR (addKr _) Dbeta) cfdotDl cfdotNl cfdotC cfdotDr cfdotBr.
-rewrite (orthoPr oM1) ?map_f // (orthogonalP oML) ?map_f // subrr add0r.
-rewrite cfdotZr cfdot_sumr big1_seq ?mulr0 ?oppr0 => [|nu Mnu]; last first.
- by rewrite cfdotZr (orthogonalP oML) ?map_f ?mulr0.
-apply/eqP; rewrite conjC0 oppr0 add0r -subr_eq0 -conjC_nat -!cfdotZr.
-rewrite -raddfZnat -raddfZ_Cint // -cfdotBr -raddfB -/v -psi1.
-rewrite Dtau1 ?zcharD1_seqInd ?sub_seqInd_zchar //.
-rewrite (cfdotElr (Dade_cfunS _ _) (Dade_cfunS _ _)) setIC.
-by have:= TItauML; rewrite -setI_eq0 => /eqP->; rewrite big_set0 mulr0.
-Qed.
-
-End NonconjType1.
-
-(* This is the context associated with Hypothesis (13.1). *)
-Variables S T U V W W1 W2 : {group gT}.
-Hypotheses (defW : W1 \x W2 = W) (xdefW : W2 \x W1 = W).
-Hypotheses (pairST : typeP_pair S T defW) (maxS : S \in 'M) (maxT : T \in 'M).
-Hypotheses (StypeP : of_typeP S U defW) (TtypeP : of_typeP T V xdefW).
-
-Local Notation "` 'W1'" := (gval W1) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W2'" := (gval W2) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W'" := (gval W) (at level 0, only parsing) : group_scope.
-Local Notation What := (cyclicTIset defW).
-
-Local Notation "` 'S'" := (gval S) (at level 0, only parsing) : group_scope.
-Local Notation P := `S`_\F%G.
-Local Notation "` 'P'" := `S`_\F (at level 0) : group_scope.
-Local Notation PU := S^`(1)%G.
-Local Notation "` 'PU'" := `S^`(1) (at level 0) : group_scope.
-Local Notation "` 'U'" := (gval U) (at level 0, only parsing) : group_scope.
-
-Local Notation "` 'T'" := (gval T) (at level 0, only parsing) : group_scope.
-Local Notation Q := `T`_\F%G.
-Local Notation "` 'Q'" := `T`_\F (at level 0) : group_scope.
-Local Notation QV := T^`(1)%G.
-Local Notation "` 'QV'" := `T^`(1) (at level 0) : group_scope.
-Local Notation "` 'V'" := (gval V) (at level 0, only parsing) : group_scope.
-
-Let defS : PU ><| W1 = S. Proof. by have [[]] := StypeP. Qed.
-Let defPU : P ><| U = PU. Proof. by have [_ []] := StypeP. Qed.
-
-Let defT : QV ><| W2 = T. Proof. by have [[]] := TtypeP. Qed.
-Let defQV : Q ><| V = QV. Proof. by have [_ []] := TtypeP. Qed.
-
-Let notStype1 : FTtype S != 1%N. Proof. exact: FTtypeP_neq1 StypeP. Qed.
-Let notStype5 : FTtype S != 5%N. Proof. exact: FTtype5_exclusion maxS. Qed.
-
-Let pddS := FT_prDade_hypF maxS StypeP.
-Let ptiWS : primeTI_hypothesis S PU defW := FT_primeTI_hyp StypeP.
-Let ctiWG : cyclicTI_hypothesis G defW := pddS.
-
-Let pddT := FT_prDade_hypF maxT TtypeP.
-Let ptiWT : primeTI_hypothesis T QV xdefW := FT_primeTI_hyp TtypeP.
-
-Let ntW1 : W1 :!=: 1. Proof. by have [[]] := StypeP. Qed.
-Let ntW2 : W2 :!=: 1. Proof. by have [_ _ _ []] := StypeP. Qed.
-Let cycW1 : cyclic W1. Proof. by have [[]] := StypeP. Qed.
-Let cycW2 : cyclic W2. Proof. by have [_ _ _ []] := StypeP. Qed.
-
-Let p := #|W2|.
-Let q := #|W1|.
-Let u := #|U|.
-Let v := #|V|.
-Let nU := (p ^ q).-1 %/ p.-1.
-Let nV := (q ^ p).-1 %/ q.-1.
-
-Let pr_p : prime p. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed.
-Let pr_q : prime q. Proof. by have [] := FTtypeP_primes maxS StypeP. Qed.
-
-Local Open Scope ring_scope.
-
-Let qgt2 : (q > 2)%N. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
-Let pgt2 : (p > 2)%N. Proof. by rewrite odd_gt2 ?mFT_odd ?cardG_gt1. Qed.
-
-Let coPUq : coprime #|PU| q.
-Proof. by rewrite (coprime_sdprod_Hall_r defS); have [[]] := StypeP. Qed.
-
-Let nirrW1 : #|Iirr W1| = q. Proof. by rewrite card_Iirr_cyclic. Qed.
-Let nirrW2 : #|Iirr W2| = p. Proof. by rewrite card_Iirr_cyclic. Qed.
-Let NirrW1 : Nirr W1 = q. Proof. by rewrite -nirrW1 card_ord. Qed.
-Let NirrW2 : Nirr W2 = p. Proof. by rewrite -nirrW2 card_ord. Qed.
-
-Let sigma := (cyclicTIiso ctiWG).
-Let w_ i j := (cyclicTIirr defW i j).
-Local Notation eta_ i j := (sigma (w_ i j)).
-
-Local Notation Imu2 := (primeTI_Iirr ptiWS).
-Let mu2_ i j := primeTIirr ptiWS i j.
-Let mu_ := primeTIred ptiWS.
-Local Notation chi_ j := (primeTIres ptiWS j).
-
-Local Notation Inu2 := (primeTI_Iirr ptiWT).
-Let nu2_ i j := primeTIirr ptiWT j i.
-Let nu_ := primeTIred ptiWT.
-
-Local Notation tauS := (FT_Dade0 maxS).
-Local Notation tauT := (FT_Dade0 maxT).
-
-Let calS0 := seqIndD PU S S`_\s 1.
-Let rmR_S := FTtypeP_coh_base maxS StypeP.
-Let scohS0 : subcoherent calS0 tauS rmR_S.
-Proof. exact: FTtypeP_subcoherent StypeP. Qed.
-
-Let calS := seqIndD PU S P 1.
-Let sSS0 : cfConjC_subset calS calS0.
-Proof. exact/seqInd_conjC_subset1/Fcore_sub_FTcore. Qed.
-
-Let calT := seqIndD QV T Q 1.
-
-(* This is Hypothesis (14.1). *)
-Hypothesis ltqp: (q < p)%N.
-
-(* This corresponds to Peterfalvi, Theorem (14.2). *)
-(* As we import the conclusion of BGappendixC, which covers Appendix C of the *)
-(* Bender and Glauberman text, we can state this theorem negatively. This *)
-(* will avoid having to repeat its statement thoughout the proof : we will *)
-(* simply end each nested set of assumptions (corresponding to (14.3) and *)
-(* (14.10)) with a contradiction. *)
-Theorem no_full_FT_Galois_structure :
- ~ [/\ (*a*) exists Fpq : finFieldImage P W2 U,
- [/\ #|P| = (p ^ q)%N, #|U| = nU & coprime nU p.-1]
- & (*b*) [/\ q.-abelem Q, W2 \subset 'N(Q)
- & exists2 y, y \in Q & W2 :^ y \subset 'N(U)]].
-Proof.
-case=> [[Fpq [oP oU coUp1]] [abelQ nQW2 nU_W2Q]].
-have /idPn[] := ltqp; rewrite -leqNgt.
-exact: (prime_dim_normed_finField _ _ _ defPU) nU_W2Q.
-Qed.
-
-(* Justification for Hypothesis (14.3). *)
-Fact FTtypeP_max_typeII : FTtype S == 2.
-Proof. by have [[_ ->]] := FTtypeP_facts maxS StypeP. Qed.
-Let Stype2 := FTtypeP_max_typeII.
-
-(* These correspond to Peterfalvi, Hypothesis (14.3). *)
-Variables (L : {group gT}) (tau1L : {additive 'CF(L) -> 'CF(G)}) (phi : 'CF(L)).
-Local Notation "` 'L'" := (gval L) (at level 0, only parsing).
-Local Notation H := `L`_\F%G.
-Local Notation "` 'H'" := `L`_\F%g (at level 0, format "` 'H'") : group_scope.
-
-Hypothesis maxNU_L : L \in 'M('N(U)).
-
-(* Consequences of the above. *)
-Hypotheses (maxL : L \in 'M) (sNUL : 'N(U) \subset L) (sUH : U \subset H).
-Hypotheses (frobL : [Frobenius L with kernel H]) (Ltype1 : FTtype L == 1%N).
-
-Let calL := seqIndD H L H 1.
-Local Notation tauL := (FT_DadeF maxL).
-Let nsHL : H <| L. Proof. exact: gFnormal. Qed.
-Let irrL : {subset calL <= irr L}. Proof. exact: FTtype1_Ind_irr. Qed.
-
-Hypothesis cohL : coherent_with calL L^# tauL tau1L.
-Hypotheses (Lphi : phi \in calL) (phi1 : phi 1%g = #|L : H|%:R).
-
-Let betaS := FTtypeP_bridge StypeP #1.
-Let betaT := FTtypeP_bridge TtypeP #1.
-Let betaL := 'Ind[L, H] 1 - phi.
-
-(* This is the first assertion of Peterfalvi (14.4). *)
-Let galT : typeP_Galois TtypeP.
-Proof.
-apply: contraLR ltqp => /(FTtypeP_nonGalois_facts maxT)[].
-by rewrite -/p -leqNgt => ->.
-Qed.
-
-(* This is the second assertion of Peterfalvi (14.4). *)
-Let oV : v = nV.
-Proof.
-rewrite /v (card_FTtypeP_Galois_compl maxT galT) -/nV.
-by rewrite !modn_small ?gtn_eqF // ltnW.
-Qed.
-
-(* This is Peterfalvi (14.5). *)
-Let defL : exists2 y, y \in Q & H ><| (W1 <*> W2 :^ y) = L.
-Proof.
-have [//|_ _ []// defL] := FTtypeII_support_facts maxS StypeP _ pairST maxNU_L.
-have [_ _ /negP[]] := compl_of_typeII maxS StypeP Stype2.
-have [_ _ _] := FTtypeI_bridge_facts maxS StypeP Ltype1 cohL Lphi phi1.
-case=> [[_ ubH] | [_ /idPn[]]]; last by rewrite -(index_sdprod defL) -ltnNge.
-have{ubH} /eqP defH: `H == U.
- rewrite eq_sym eqEcard sUH /= -(prednK (cardG_gt0 U)) -add1n -leq_subLR subn1.
- have [_ _ _ _ /divnK <-] := FTtypeP_bridge_facts maxS StypeP.
- by rewrite -leC_nat natrM -ler_pdivr_mulr ?gt0CG // {1}(index_sdprod defL).
-rewrite (subset_trans sNUL) // -(sdprodW defL) -(sdprodW defS) mulSg //.
-by rewrite -(sdprodW defPU) defH mulG_subr.
-Qed.
-
-Let indexLH : #|L : H| = (p * q)%N.
-Proof.
-have [y Qy /index_sdprod <-] := defL; rewrite (dprod_card xdefW).
-suffices /normP <-: y \in 'N(W1) by rewrite -conjYg cardJg (dprodWY defW).
-have cQQ: abelian Q by have [_ [/and3P[]]] := FTtypeP_facts _ TtypeP.
-by apply: (subsetP (sub_abelian_norm cQQ _)) => //; have [_ _ _ []] := TtypeP.
-Qed.
-
-(* This is Peterfalvi (14.6). *)
-Let galS : typeP_Galois StypeP.
-Proof.
-apply/idPn=> gal'S; have [q3 oU] := FTtypeP_nonGalois_facts maxS gal'S.
-have [H1 [_ _ _ _]] := typeP_Galois_Pn maxS (FTtype5_exclusion maxS) gal'S.
-rewrite def_Ptype_factor_prime // Ptype_Fcompl_kernel_trivial // -/p q3 /=.
-set a := #|U : _| => [] [a_gt1 a_dv_p1 _ [U1 isoU1]].
-have{isoU1} isoU: U \isog U1 := isog_trans (quotient1_isog U) isoU1.
-have{a_gt1 a_dv_p1} defU1: U1 :=: [set: 'rV_2].
- apply/eqP; rewrite eqEcard subsetT -(card_isog isoU) oU.
- rewrite cardsT card_matrix card_ord Zp_cast // leq_sqr -/p.
- apply: dvdn_leq; first by rewrite -(subnKC pgt2).
- rewrite -divn2 -(@Gauss_dvdl a _ 2) ?divnK //.
- by rewrite dvdn2 -subn1 odd_sub ?odd_gt0 ?mFT_odd.
- by rewrite coprimen2 (dvdn_odd (dvdn_indexg U _)) ?mFT_odd.
-have [r pr_r r_r_U] := rank_witness U.
-have [R0 sylR0] := Sylow_exists r U; have [sR0U rR0 _] := and3P sylR0.
-have [R sylR sR0R] := Sylow_superset (subset_trans sR0U sUH) rR0.
-have [sRH rR _] := and3P sylR.
-have cUU: abelian U by have [[]] := FTtypeP_facts maxS StypeP.
-have tiA0: normedTI 'A0(S) G S by have [_ _ _ _ []] := FTtypeP_facts _ StypeP.
-have [_ sUPU _ nPU _] := sdprod_context defPU.
-have coPU := coprimegS (joing_subl U W1) (Ptype_Fcore_coprime StypeP).
-have abR0: abelian R0 := abelianS sR0U cUU.
-have{a U1 defU1 isoU r_r_U} rR0_2: 'r(R0) = 2.
- by rewrite (rank_Sylow sylR0) -r_r_U (isog_rank isoU) defU1 rank_mx_group.
-have piUr: r \in \pi(U) by rewrite -p_rank_gt0 -(rank_Sylow sylR0) rR0_2.
-have /exists_inP[x /setD1P[ntx R0x] ntCPx]: [exists x in R0^#, 'C_P[x] != 1%g].
- have ncycR0: ~~ cyclic R0 by rewrite abelian_rank1_cyclic ?rR0_2.
- have coPR0: coprime #|P| #|R0| := coprimegS sR0U coPU.
- rewrite -negb_forall_in; apply: contra (mmax_Fcore_neq1 maxS) => regR0P.
- rewrite -subG1 -(coprime_abelian_gen_cent1 abR0 _ (subset_trans sR0U nPU)) //.
- by rewrite gen_subG; apply/bigcupsP=> x /(eqfun_inP regR0P)->.
-have{x ntx R0x ntCPx} sZR_R0: 'Z(R) \subset R0.
- have A0x: x \in 'A0(S).
- have [z /setIP[Pz cyz] ntz] := trivgPn _ ntCPx.
- apply/setUP; left; apply/bigcupP; exists z.
- by rewrite !inE ntz (subsetP (Fcore_sub_FTcore maxS)).
- by rewrite (eqP Stype2) 3!inE ntx cent1C (subsetP sUPU) ?(subsetP sR0U).
- have sCxS: 'C[x] \subset S by rewrite -['C[x]]setTI (cent1_normedTI tiA0).
- suffices <-: 'C_R[x] = R0.
- by rewrite -cent_set1 setIS ?centS // sub1set (subsetP sR0R).
- have /Hall_pi hallU: Hall PU U by rewrite -(coprime_sdprod_Hall_r defPU).
- have /Hall_pi hallPU: Hall S PU by rewrite -(coprime_sdprod_Hall_l defS).
- have sylR0_S: r.-Sylow(S) R0.
- by apply: subHall_Sylow piUr sylR0; apply: subHall_Hall (piSg sUPU) hallU.
- rewrite ['C_R[x]](sub_pHall sylR0_S) ?(pgroupS _ rR) ?subsetIl //.
- by rewrite subsetI sR0R sub_cent1 (subsetP abR0).
- by rewrite subIset ?sCxS ?orbT.
-pose R1 := 'Ohm_1('Z(R))%G; pose m := logn r #|R1|.
-have sR10: R1 \subset R0 by apply: gFsub_trans.
-have oR1: #|R1| = (r ^ m)%N by rewrite -card_pgroup ?(pgroupS sR10).
-have{sZR_R0 rR0_2} m12: pred2 1%N 2 m.
- transitivity (0 < m < 1 + 2)%N; first by rewrite -mem_iota !inE.
- rewrite -[m]p_rank_abelian ?center_abelian -?rank_pgroup ?(pgroupS sZR_R0) //.
- rewrite rank_gt0 ltnS -rR0_2 rankS // center_nil_eq1 ?(pgroup_nil rR) //.
- by rewrite (subG1_contra sR0R) // -rank_gt0 rR0_2.
-have [y Qy defLy] := defL; have [_ _ /joing_subP[_ nHW2y] _] := sdprodP defLy.
-have chR1H: R1 \char H.
- by rewrite !gFchar_trans // (nilpotent_Hall_pcore (Fcore_nil L) sylR) gFchar.
-have nR1W2y: W2 :^ y \subset 'N(R1) by apply: char_norm_trans chR1H nHW2y.
-have regR1W2y: semiregular R1 (W2 :^ y).
- have /Frobenius_reg_ker regHW12y := set_Frobenius_compl defLy frobL.
- exact: semiregularS (char_sub chR1H) (joing_subr _ _) regHW12y.
-have /idPn[]: r %| p.-1./2.
- have:= piUr; rewrite mem_primes => /and3P[_ _ /=].
- by rewrite oU Euclid_dvdX ?andbT.
-rewrite gtnNdvd //; first by rewrite -(subnKC pgt2).
-apply: leq_trans (_ : p.-1 <= r)%N.
- by rewrite -divn2 ltn_divLR // -{1}[p.-1]muln1 -(subnKC pgt2) ltn_pmul2l.
-have: p %| (r ^ m).-1.
- by have:= regular_norm_dvd_pred nR1W2y regR1W2y; rewrite cardJg oR1.
-rewrite -[p.-1]subn1 leq_subLR predn_exp Euclid_dvdM // => /orP[]/dvdn_leq.
- by rewrite -(subnKC (prime_gt1 pr_r)) => /(_ isT)/leq_trans->; rewrite 2?ltnW.
-case/pred2P: m12 => ->; rewrite ?(big_ord_recl 1) big_ord1 => /(_ isT) //.
-by move/leq_trans->.
-Qed.
-
-(* This is Peterfalvi (14.7). *)
-Let not_charUH : ~~ (U \char H).
-Proof.
-have [y Qy defLy] := defL; have [_ _ /joing_subP[_ nHW2y] _] := sdprodP defLy.
-apply/negP=> chUH; have nUW2y := char_norm_trans chUH nHW2y.
-case: no_full_FT_Galois_structure; split; last first.
- split; [by have [_ []] := FTtypeP_facts _ TtypeP | | by exists y].
- by have /sdprodP[_ _ /joing_subP[]] := Ptype_Fcore_sdprod TtypeP.
-have <-: #|U| = nU.
- have regUW2y: semiregular U (W2 :^ y).
- have /Frobenius_reg_ker regHW12y := set_Frobenius_compl defLy frobL.
- exact: semiregularS (char_sub chUH) (joing_subr _ _) regHW12y.
- case: ifP (card_FTtypeP_Galois_compl maxS galS) => //.
- rewrite -/p -/q -/nU => p_modq_1 oU.
- have{p_modq_1 oU} oU: (#|U| * q)%N = nU.
- by rewrite oU divnK //; have [|_ ->] := FTtypeP_primes_mod_cases _ StypeP.
- have /eqP Umodp: #|U| == 1 %[mod p].
- have:= regular_norm_dvd_pred nUW2y regUW2y.
- by rewrite cardJg -/p -subn1 eqn_mod_dvd.
- have: nU == 1 %[mod p].
- rewrite /nU predn_exp mulKn; last by rewrite -(subnKC pgt2).
- rewrite -(ltn_predK qgt2) big_ord_recl addnC -modnDml -modn_summ modnDml.
- by rewrite big1 // => i _; rewrite expnS modnMr.
- by rewrite -oU -modnMml Umodp modnMml mul1n !modn_small ?gtn_eqF ?prime_gt1.
-have [F []] := typeP_Galois_P maxS (FTtype5_exclusion maxS) galS.
-rewrite Ptype_factor_prime ?(group_inj (Ptype_Fcore_kernel_trivial _ _)) //.
-rewrite Ptype_Fcompl_kernel_trivial // => psiP [psiU _ [/trivgP inj_psiU psiJ]].
-rewrite /= -injm_subcent ?coset1_injm ?norms1 // -morphim_comp -/p.
-rewrite (typeP_cent_core_compl StypeP) => [[_ /isomP[inj_psiP im_psiP] psiW2]].
-rewrite -(card_isog (quotient1_isog U)) => [[_ coUp1 _]].
-suffices FPU: finFieldImage P W2 U.
- by exists FPU; have [_ []] := FTtypeP_facts maxS StypeP.
-have /domP[sig [Dsig Ksig _ im_sig]]: 'dom (psiP \o coset 1) = P.
- by apply: injmK; rewrite ?coset1_injm ?norms1.
-have{Ksig} inj_sig: 'injm sig by rewrite Ksig injm_comp ?coset1_injm.
-exists F sig; first by apply/isomP; rewrite im_sig morphim_comp.
- by rewrite -psiW2 -im_sig injmK // -(typeP_cent_core_compl StypeP) subsetIl.
-exists psiU => // z x Pz Ux /=; have inN1 x1: x1 \in 'N(1) by rewrite norm1 inE.
-by rewrite !Dsig -psiJ ?mem_morphim //= qactE ?dom_qactJ.
-Qed.
-
-(* This is Peterfalvi (14.8)(a). *)
-(* In order to avoid the use of real analysis and logarithms we bound the *)
-(* binomial expansion of n.+1 ^ q.+1 directly. *)
-Let qp1_gt_pq1 : (q ^ p.+1 > p ^ q.+1)%N.
-Proof.
-have: (4 < p)%N by rewrite odd_geq ?mFT_odd ?(leq_trans _ ltqp).
-elim: p ltqp => // n IHn; rewrite !ltnS => ngeq.
-rewrite leq_eqVlt => /predU1P[/esym n4 | ngt4].
- suffices /eqP <-: 3 == q by rewrite n4.
- by rewrite eqn_leq qgt2 -ltnS -(odd_ltn 5) ?mFT_odd // -n4.
-apply: leq_trans (_ : q * n ^ q.+1 <= _)%N; last first.
- rewrite (expnS q) leq_mul //.
- by move: ngeq; rewrite leq_eqVlt => /predU1P[-> | /IHn/(_ ngt4)/ltnW].
-apply: leq_trans (_ : (2 * q.+1 + n) * n ^ q <= _)%N; last first.
- rewrite expnS mulnA leq_mul // addnC.
- move: ngeq; rewrite leq_eqVlt => /predU1P[-> | n_gtq].
- apply: leq_trans (_ : 4 * n <= _)%N; last by rewrite leq_mul // ltnW.
- by rewrite mulnSr addnA -mulSn (mulSnr 3) leq_add2l 3?ltnW.
- by rewrite -{2}(subnKC qgt2) addSn (mulSn _ n) leq_add2l leq_mul.
-rewrite mulnDl -expnS -[n.+1]add1n expnDn big_ord_recr binn subnn !mul1n /=.
-rewrite ltn_add2r -(@ltn_pmul2l (2 ^ q)) ?expn_gt0 // !mulnA -expnSr.
-apply: leq_ltn_trans (_ : (2 ^ q.+1).-1 * q.+1 * n ^ q < _)%N; last first.
- by rewrite -(subnKC ngt4) !ltn_pmul2r ?prednK ?expn_gt0.
-rewrite -mulnA predn_exp mul1n big_distrr big_distrl leq_sum // => [[i]] /=.
-rewrite ltnS exp1n mul1n => leiq _; rewrite -{1 4}(subnKC leiq) !expnD.
-rewrite -mulnA leq_mul // mulnA mulnCA mulnC leq_mul // -bin_sub ?leqW //.
-rewrite -(leq_pmul2r (fact_gt0 (q.+1 - i))) -mulnA bin_ffact mulnC subSn //.
-rewrite ffactnS /= -!mulnA leq_mul //=; elim: {i leiq}(q - i)%N => //= i IHi.
-rewrite ffactnSr expnSr mulnACA expnS factS (mulnACA n) mulnC leq_mul //.
-by rewrite leq_mul // (leq_trans (leq_subr _ _)).
-Qed.
-
-(* This is Peterfalvi (14.8)(b). *)
-Let v1p_gt_u1q : (v.-1 %/ p > u.-1 %/ q)%N.
-Proof.
-have ub_u: (u.-1 <= nU - 1)%N.
- rewrite -subn1 leq_sub2r //; have [_ _] := FTtypeP_facts maxS StypeP.
- by rewrite (FTtypeP_reg_Fcore maxS StypeP) indexg1.
-rewrite ltn_divLR ?prime_gt0 // {ub_u}(leq_ltn_trans ub_u) //.
-have p_dv_v1: p %| v.-1 by have [] := FTtypeP_bridge_facts maxT TtypeP.
-rewrite divn_mulAC // ltn_divRL ?dvdn_mulr // oV -subn1.
-rewrite -(@ltn_pmul2l q.-1) ?(mulnCA q.-1); last by rewrite -(subnKC qgt2).
-rewrite !mulnA -(@ltn_pmul2l p.-1); last by rewrite -(subnKC pgt2).
-rewrite -mulnA mulnCA mulnA !(mulnBl _ _ _.-1) !divnK ?dvdn_pred_predX //.
-rewrite !mul1n mulnCA -!subn1 ltn_mul ?ltn_sub2r ?prime_gt1 //.
-rewrite -!subnDA !subnKC ?prime_gt0 // !mulnBl -!expnSr !mulnn.
-by rewrite -subSn ?leq_exp2l ?leqW ?prime_gt1 ?leq_sub ?leq_exp2r // ltnW.
-Qed.
-
-Let calT0 := seqIndD QV T T`_\s 1.
-Let rmR_T := FTtypeP_coh_base maxT TtypeP.
-Let scohT0 : subcoherent calT0 tauT rmR_T.
-Proof. exact: FTtypeP_subcoherent. Qed.
-
-Let sTT0 : cfConjC_subset calS calS0.
-Proof. exact/seqInd_conjC_subset1/Fcore_sub_FTcore. Qed.
-
-(* This is Peterfalvi (14.9). *)
-Lemma FTtypeP_min_typeII : FTtype T == 2.
-Proof.
-apply: contraLR v1p_gt_u1q => notTtype2; rewrite -leqNgt -leC_nat.
-have [o_betaT0_eta _ [Ttype3 _]] := FTtype34_structure maxT TtypeP notTtype2.
-have Ttype_gt2: (2 < FTtype T)%N by rewrite (eqP Ttype3).
-have [[_ _ frobVW2 cVV] _ _ _ _] := FTtypeP_facts _ TtypeP.
-pose calT1 := seqIndD QV T QV Q; have sT10: cfConjC_subset calT1 calT0.
- by apply/seqInd_conjC_subset1; rewrite /= FTcore_eq_der1.
-rewrite (FTtypeP_reg_Fcore maxT TtypeP) (group_inj (joingG1 _)) in o_betaT0_eta.
-do [rewrite -/calT1; set eta_0 := \sum_j _] in o_betaT0_eta.
-have scohT1: subcoherent calT1 tauT rmR_T := subset_subcoherent scohT0 sT10.
-have [nsQQV sVQV _ _ _] := sdprod_context defQV.
-have nsQVT: QV <| T := der_normal 1 T.
-have calT1_1p zeta: zeta \in calT1 -> zeta 1%g = p%:R.
- case/seqIndP=> s /setDP[kerQs _] -> /=; rewrite inE in kerQs.
- rewrite cfInd1 ?gFsub // -(index_sdprod defT) lin_char1 ?mulr1 //.
- rewrite lin_irr_der1 (subset_trans _ kerQs) // der1_min ?normal_norm //.
- by rewrite -(isog_abelian (sdprod_isog defQV)).
-have [tau1T cohT1]: coherent calT1 T^# tauT.
- apply/(uniform_degree_coherence scohT1)/(@all_pred1_constant _ p%:R).
- by apply/allP=> _ /mapP[zeta T1zeta ->]; rewrite /= calT1_1p.
-have irrT1: {subset calT1 <= irr T}.
- move=> _ /seqIndP[s /setDP[kerQs nz_s] ->]; rewrite inE in kerQs.
- rewrite inE subGcfker in nz_s; rewrite -(quo_IirrK nsQQV kerQs) mod_IirrE //.
- rewrite cfIndMod ?normal_sub ?cfMod_irr ?gFnormal //.
- rewrite irr_induced_Frobenius_ker ?quo_Iirr_eq0 //=.
- have /sdprod_isom[nQ_VW1 /isomP[injQ <-]] := Ptype_Fcore_sdprod TtypeP.
- have ->: (QV / Q)%g = (V / Q)%g by rewrite -(sdprodW defQV) quotientMidl.
- have ->: (V / Q)%g = restrm nQ_VW1 (coset Q) @* V.
- by rewrite morphim_restrm (setIidPr _) // joing_subl.
- by rewrite injm_Frobenius_ker // (FrobeniusWker frobVW2).
-have [[A0betaS PVbetaS] _ [_]] := FTtypeP_bridge_facts maxS StypeP.
-rewrite -/q -/u; set Gamma := FTtypeP_bridge_gap _ _ => oGa1 R_Ga lb_Ga _.
-have oT1eta: orthogonal (map tau1T calT1) (map sigma (irr W)).
- apply/orthogonalP=> _ _ /mapP[zeta T1zeta ->] /mapP[omega Womega ->].
- have{omega Womega} [i [j ->]] := cycTIirrP defW Womega.
- by rewrite (cycTIisoC _ pddT) (coherent_ortho_cycTIiso _ sT10 cohT1) ?irrT1.
-have [[Itau1T Ztau1T] Dtau1T] := cohT1.
-have nzT1_Ga zeta: zeta \in calT1 -> `|'[Gamma, tau1T zeta]| ^+ 2 >= 1.
- have Z_Ga: Gamma \in 'Z[irr G].
- rewrite rpredD ?cycTIiso_vchar // rpredB ?rpred1 ?Dade_vchar // zchar_split.
- by rewrite A0betaS ?Iirr1_neq0 // rpredB ?cfInd_vchar ?rpred1 ?irr_vchar.
- move=> T1zeta; rewrite expr_ge1 ?normr_ge0 // norm_Cint_ge1 //.
- by rewrite Cint_cfdot_vchar ?Ztau1T ?(mem_zchar T1zeta).
- suffices: ('[Gamma, tau1T zeta] == 1 %[mod 2])%C.
- by apply: contraTneq => ->; rewrite (eqCmod_nat 2 0 1).
- pose betaT0 := nu_ 0 - zeta.
- have{o_betaT0_eta} o_eta0_betaT0 j: '[eta_ 0 j, tauT betaT0] = (j == 0)%:R.
- transitivity '[eta_ 0 j, eta_0]; rewrite (cycTIisoC _ pddT).
- apply/eqP; rewrite -subr_eq0 -cfdotBr cfdotC.
- by rewrite (orthoPl (o_betaT0_eta _ _)) ?conjC0 // map_f ?mem_irr.
- rewrite cfdot_sumr (bigD1 0) //= cfdot_cycTIiso andbT big1 ?addr0 //.
- by move=> i /negPf nz_i; rewrite cfdot_cycTIiso andbC eq_sym nz_i.
- have QVbetaT0: betaT0 \in 'CF(T, QV^#).
- rewrite cfun_onD1 rpredB ?(seqInd_on _ T1zeta) //=; last first.
- by rewrite /nu_ -cfInd_prTIres cfInd_normal.
- by rewrite !cfunE prTIred_1 prTIirr0_1 mulr1 calT1_1p ?subrr.
- have A0betaT0: betaT0 \in 'CF(T, 'A0(T)).
- by rewrite (cfun_onS (FTsupp1_sub0 _)) // /'A1(T) ?FTcore_eq_der1.
- have ZbetaT0: betaT0 \in 'Z[irr T].
- by rewrite rpredB ?char_vchar ?(seqInd_char T1zeta) ?prTIred_char.
- pose Delta := tauT betaT0 - 1 + tau1T zeta.
- have nz_i1: #1 != 0 := Iirr1_neq0 ntW2.
- rewrite -(canLR (addKr _) (erefl Delta)) opprB cfdotDr cfdotBr oGa1 add0r.
- rewrite cfdotDl cfdotBl -/betaS o_eta0_betaT0 (negPf nz_i1) // addr0 opprB.
- rewrite -(cycTIiso1 pddS) -(cycTIirr00 defW) {}o_eta0_betaT0 mulr1n.
- have QV'betaS: tauS betaS \in 'CF(G, ~: class_support QV^# G).
- have [_ [pP _] _ _ [_ ->]] := FTtypeP_facts _ StypeP; rewrite ?A0betaS //.
- apply: cfun_onS (cfInd_on (subsetT S) (PVbetaS _ nz_i1)).
- apply/subsetP=> x PWx; rewrite inE.
- have{PWx}: p \in \pi(#[x]).
- case/imset2P: PWx => {x}x y PWx _ ->; rewrite {y}orderJ.
- case/setUP: PWx => [/setD1P[ntx Px] | /imset2P[{x}x y Wx _ ->]].
- rewrite -p_rank_gt0 -rank_pgroup ?rank_gt0 ?cycle_eq1 //.
- exact: mem_p_elt (abelem_pgroup pP) Px.
- case/setDP: Wx; rewrite {y}orderJ; have [_ <- cW12 _] := dprodP defW.
- case/mulsgP=> {x}x y W1x W2y ->; have cyx := centsP cW12 _ W2y _ W1x.
- have [-> | nty _] := eqVneq y 1%g; first by rewrite inE mulg1 W1x.
- have p'x: p^'.-elt x.
- by rewrite (mem_p_elt _ W1x) /pgroup ?pnatE ?inE ?ltn_eqF.
- have p_y: p.-elt y by rewrite (mem_p_elt (pnat_id _)).
- rewrite -cyx orderM ?(pnat_coprime p_y) // pi_ofM // inE /=.
- by rewrite -p_rank_gt0 -rank_pgroup // rank_gt0 cycle_eq1 nty.
- apply: contraL => /imset2P[z y /setD1P[_ QVz] _ ->]; rewrite {x y}orderJ.
- rewrite -p'natEpi // [_.-nat _](mem_p_elt _ QVz) // /pgroup ?p'natE //.
- rewrite -prime_coprime // coprime_sym (coprime_sdprod_Hall_r defT).
- by have [[]] := TtypeP.
- have [_ _ _ _ [_ -> //]] := FTtypeP_facts _ TtypeP.
- rewrite (cfdotElr QV'betaS (cfInd_on _ QVbetaT0)) ?subsetT //=.
- rewrite setIC setICr big_set0 mulr0 subr0 addrC /eqCmod addrK.
- rewrite cfdot_real_vchar_even ?mFT_odd ?oGa1 ?rpred0 //; split.
- rewrite rpredD ?Ztau1T ?(mem_zchar T1zeta) // rpredB ?rpred1 //.
- by rewrite Dade_vchar // zchar_split ZbetaT0.
- rewrite /cfReal -subr_eq0 opprD opprB rmorphD rmorphB rmorph1 /= addrACA.
- rewrite !addrA subrK -Dade_aut -linearB /= -/tauT rmorphB opprB /=.
- rewrite -prTIred_aut aut_Iirr0 -/nu_ [sum in tauT sum]addrC addrA subrK.
- rewrite -Dtau1T; last first.
- by rewrite (zchar_onS _ (seqInd_sub_aut_zchar _ _ _)) // setSD ?der_sub.
- rewrite raddfB -addrA addrC addrA subrK subr_eq0.
- by rewrite (cfConjC_Dade_coherent cohT1) ?mFT_odd ?irrT1.
-have [Y T1_Y [X [defGa oYX oXT1]]] := orthogonal_split (map tau1T calT1) Gamma.
-apply: ler_trans (lb_Ga X Y _ _ _); first 1 last; rewrite 1?addrC //.
-- by rewrite cfdotC oYX conjC0.
-- by apply/orthoPl=> eta Weta; rewrite (span_orthogonal oT1eta) // memv_span.
-have ->: v.-1 = (p * size calT1)%N; last rewrite mulKn ?prime_gt0 //.
- rewrite [p](index_sdprod defT); have isoV := sdprod_isog defQV.
- rewrite [v](card_isog isoV) -card_Iirr_abelian -?(isog_abelian isoV) //.
- rewrite -(card_imset _ (can_inj (mod_IirrK nsQQV))) (cardD1 0) /=.
- rewrite -{1}(mod_Iirr0 QV Q) mem_imset //=.
- rewrite (size_irr_subseq_seqInd _ (subseq_refl _)) //=.
- apply: eq_card => s; rewrite !inE mem_seqInd ?gFnormal // !inE subGcfker.
- congr (_ && _); apply/idP/idP=> [/imsetP[r _ ->] | kerQs].
- by rewrite mod_IirrE ?cfker_mod.
- by rewrite -(quo_IirrK nsQQV kerQs) mem_imset.
-have o1T1: orthonormal (map tau1T calT1).
- rewrite map_orthonormal ?(sub_orthonormal irrT1) ?seqInd_uniq //.
- exact: irr_orthonormal.
-have [_ -> ->] := orthonormal_span o1T1 T1_Y.
-rewrite cfnorm_sum_orthonormal // big_map -sum1_size natr_sum !big_seq.
-apply: ler_sum => // zeta T1zeta; rewrite -(canLR (addrK X) defGa).
-by rewrite cfdotBl (orthoPl oXT1) ?subr0 ?nzT1_Ga ?map_f.
-Qed.
-Let Ttype2 := FTtypeP_min_typeII.
-
-(* These declarations correspond to Hypothesis (14.10). *)
-Variables (M : {group gT}) (tau1M : {additive 'CF(M) -> 'CF(G)}) (psi : 'CF(M)).
-Hypothesis maxNV_M : M \in 'M('N(V)).
-
-Local Notation "` 'M'" := (gval M) (at level 0, only parsing).
-Local Notation K := `M`_\F%G.
-Local Notation "` 'K'" := `M`_\F%g (at level 0, format "` 'K'") : group_scope.
-
-(* Consequences of the above. *)
-Hypotheses (maxM : M \in 'M) (sNVM : 'N(V) \subset M).
-Hypotheses (frobM : [Frobenius M with kernel K]) (Mtype1 : FTtype M == 1%N).
-
-Let calM := seqIndD K M K 1.
-Local Notation tauM := (FT_DadeF maxM).
-Let nsKM : K <| M. Proof. exact: gFnormal. Qed.
-Let irrM : {subset calM <= irr M}. Proof. exact: FTtype1_Ind_irr. Qed.
-
-Hypothesis cohM : coherent_with calM M^# tauM tau1M.
-Hypotheses (Mpsi : psi \in calM) (psi1 : psi 1%g = #|M : K|%:R).
-
-Let betaM := 'Ind[M, K] 1 - psi.
-
-Let pairTS : typeP_pair T S xdefW. Proof. exact: typeP_pair_sym pairST. Qed.
-
-Let pq : algC := (p * q)%:R.
-Let h := #|H|.
-
-(* This is the first (and main) part of Peterfalvi (14.11). *)
-Let defK : `K = V.
-Proof.
-pose e := #|M : K|; pose k := #|K|; apply: contraTeq isT => notKV.
-have [_ sVK defM] := FTtypeII_support_facts maxT TtypeP Ttype2 pairTS maxNV_M.
-have ltVK: V \proper K by rewrite properEneq eq_sym notKV.
-have e_dv_k1: e %| k.-1 := Frobenius_ker_dvd_ker1 frobM.
-have [e_lepq regKW2]: (e <= p * q)%N /\ semiregular K W2.
- case: defM => [|[y Py]] defM; rewrite /e -(index_sdprod defM).
- have /Frobenius_reg_ker regHW1 := set_Frobenius_compl defM frobM.
- by rewrite leq_pmulr ?cardG_gt0.
- have /Frobenius_reg_ker regHW21y := set_Frobenius_compl defM frobM.
- split; last exact: semiregularS (joing_subl _ _) regHW21y.
- suffices /normP <-: y \in 'N(W2).
- by rewrite -conjYg cardJg (dprodWY xdefW) -(dprod_card xdefW).
- have cPP: abelian P by have [_ [/and3P[]]] := FTtypeP_facts maxS StypeP.
- have sW2P: W2 \subset P by have [_ _ _ []] := StypeP.
- by rewrite (subsetP _ y Py) // sub_abelian_norm.
-(* This is (14.11.1). *)
-have{regKW2} [lb_k lb_k1e_v]: (2 * p * v < k /\ v.-1 %/ p < k.-1 %/ e)%N.
- have /dvdnP[x Dk]: v %| k := cardSg sVK.
- have lb_x: (p.*2 < x)%N.
- have x_gt1: (1 < x)%N.
- by rewrite -(ltn_pmul2r (cardG_gt0 V)) -Dk mul1n proper_card.
- have x_gt0 := ltnW x_gt1; rewrite -(prednK x_gt0) ltnS -subn1.
- rewrite dvdn_leq ?subn_gt0 // -mul2n Gauss_dvd ?coprime2n ?mFT_odd //.
- rewrite dvdn2 odd_sub // (dvdn_odd _ (mFT_odd K)) -/k ?Dk ?dvdn_mulr //=.
- rewrite -eqn_mod_dvd // -[x]muln1 -modnMmr.
- have nVW2: W2 \subset 'N(V) by have [_ []] := TtypeP.
- have /eqP{1} <-: (v == 1 %[mod p]).
- rewrite eqn_mod_dvd ?cardG_gt0 // subn1 regular_norm_dvd_pred //.
- exact: semiregularS regKW2.
- rewrite modnMmr -Dk /k eqn_mod_dvd // subn1 regular_norm_dvd_pred //.
- by rewrite (subset_trans (subset_trans nVW2 sNVM)) ?gFnorm.
- have lb_k: (2 * p * v < k)%N by rewrite mul2n Dk ltn_pmul2r ?cardG_gt0.
- split=> //; rewrite ltn_divLR ?cardG_gt0 // divn_mulAC ?prednK ?cardG_gt0 //.
- rewrite leq_divRL ?indexg_gt0 // (leq_trans (leq_mul (leqnn v) e_lepq)) //.
- rewrite mulnA mulnAC leq_mul // -ltnS prednK ?cardG_gt0 //.
- apply: leq_ltn_trans lb_k; rewrite mulnC leq_mul // ltnW ?(leq_trans ltqp) //.
- by rewrite mul2n -addnn leq_addl.
-have lb_k1e_u := ltn_trans v1p_gt_u1q lb_k1e_v; have irr_psi := irrM Mpsi.
-have Mgt1: (1 < size calM)%N by apply: seqInd_nontrivial Mpsi; rewrite ?mFT_odd.
-(* This is (14.11.2). *)
-have [] // := FTtype2_support_coherence TtypeP StypeP cohM Mpsi.
-rewrite -/e -/p -/q mulnC /= => De [nb [chi Dchi]].
-rewrite cycTIiso_irrelC -/sigma -/betaM => DbetaM.
-pose ddMK := FT_DadeF_hyp maxM; pose AM := Dade_support ddMK.
-have defAM: AM = 'A~(M) by rewrite FTsupp_Frobenius -?FT_DadeF_supportE.
-pose ccG A := class_support A G.
-pose G0 := ~: ('A~(M) :|: ccG What :|: ccG P^# :|: ccG Q^#).
-have sW2P: W2 \subset P by have [_ _ _ []] := StypeP.
-have sW1Q: W1 \subset Q by have [_ _ _ []] := TtypeP.
-(* This is (14.11.3). *)
-have lbG0 g: g \in G0 -> 1 <= `|tau1M psi g| ^+ 2.
- rewrite !inE ?expr_ge1 ?normr_ge0 // => /norP[/norP[/norP[AM'g W'g P'g Q'g]]].
- have{W'g} /coprime_typeP_Galois_core-co_p_g: g \notin ccG W^#.
- apply: contra W'g => /imset2P[x y /setD1P[ntx Wx] Gy Dg].
- rewrite Dg mem_imset2 // !inE Wx andbT; apply/norP; split.
- by apply: contra Q'g => /(subsetP sW1Q)?; rewrite Dg mem_imset2 ?inE ?ntx.
- by apply: contra P'g => /(subsetP sW2P)Px; rewrite Dg mem_imset2 ?inE ?ntx.
- have{AM'g} betaMg0: tauM betaM g = 0.
- by apply: cfun_on0 AM'g; rewrite -defAM Dade_cfunS.
- suffices{betaMg0}: 1 <= `|(\sum_ij (-1) ^+ nb ij *: sigma 'chi_ij) g|.
- rewrite -[\sum_i _](subrK chi) -DbetaM !cfunE betaMg0 add0r.
- case: Dchi => -> //; rewrite cfunE normrN.
- by rewrite -(cfConjC_Dade_coherent cohM) ?mFT_odd ?cfunE ?norm_conjC.
- have{co_p_g} Zeta_g ij: sigma 'chi_ij g \in Cint.
- apply/Cint_cycTIiso_coprime/(coprime_dvdr (cforder_lin_char_dvdG _)).
- by apply: irr_cyclic_lin; have [] := ctiWG.
- rewrite -(dprod_card defW) coprime_mulr.
- by apply/andP; split; [apply: co_p_g galT _ | apply: co_p_g galS _].
- rewrite sum_cfunE norm_Cint_ge1 ?rpred_sum // => [ij _|].
- by rewrite cfunE rpredMsign.
- set a := \sum_i _; suffices: (a == 1 %[mod 2])%C.
- by apply: contraTneq=> ->; rewrite (eqCmod_nat 2 0 1).
- have signCmod2 n ij (b := sigma 'chi_ij g): ((-1) ^+ n * b == b %[mod 2])%C.
- rewrite -signr_odd mulr_sign eqCmod_sym; case: ifP => // _.
- by rewrite -(eqCmodDl _ b) subrr -[b + b](mulr_natr b 2) eqCmodMl0 /b.
- rewrite -[1]addr0 [a](bigD1 0) {a}//= cfunE eqCmodD //.
- by rewrite (eqCmod_trans (signCmod2 _ _)) // irr0 cycTIiso1 cfun1E inE.
- rewrite (partition_big_imset (fun ij => [set ij; conjC_Iirr ij])) /= eqCmod0.
- apply: rpred_sum => _ /=/imsetP[ij /negPf nz_ij ->].
- rewrite (bigD1 ij) /=; last by rewrite unfold_in nz_ij eqxx.
- rewrite (big_pred1 (conjC_Iirr ij)) => [|ij1 /=]; last first.
- rewrite unfold_in eqEsubset !subUset !sub1set !inE !(eq_sym ij).
- rewrite !(can_eq (@conjC_IirrK _ _)) (canF_eq (@conjC_IirrK _ _)).
- rewrite -!(eq_sym ij1) -!(orbC (_ == ij)) !andbb andbAC -andbA.
- rewrite andb_orr andNb andbA andb_idl // => /eqP-> {ij1}.
- rewrite conjC_Iirr_eq0 nz_ij -(inj_eq irr_inj) conjC_IirrE.
- by rewrite odd_eq_conj_irr1 ?mFT_odd // irr_eq1 nz_ij.
- rewrite -signr_odd -[odd _]negbK signrN !cfunE mulNr addrC.
- apply: eqCmod_trans (signCmod2 _ _) _.
- by rewrite eqCmod_sym conjC_IirrE -cfAut_cycTIiso cfunE conj_Cint.
-have cardG_D1 R: #|R^#| = #|R|.-1 by rewrite [#|R|](cardsD1 1%g) group1.
-pose rho := invDade ddMK; pose nG : algC := #|G|%:R.
-pose sumG0 := \sum_(g in G0) `|tau1M psi g| ^+ 2.
-pose sumG0_diff := sumG0 - (#|G0| + #|ccG What| + #|ccG P^#| + #|ccG Q^#|)%:R.
-have ub_rho: '[rho (tau1M psi)] <= k.-1%:R / #|M|%:R - nG^-1 * sumG0_diff.
- have NtauMpsi: '[tau1M psi] = 1.
- by have [[Itau1 _] _] := cohM; rewrite Itau1 ?mem_zchar //= irrWnorm.
- rewrite ler_subr_addl -subr_le0 -addrA.
- have ddM_ i j: i != j :> 'I_1 -> [disjoint AM & AM] by rewrite !ord1.
- apply: ler_trans (Dade_cover_inequality ddM_ NtauMpsi); rewrite -/nG -/AM.
- rewrite !big_ord1 cardG_D1 ler_add2r ler_pmul2l ?invr_gt0 ?gt0CG //= defAM.
- rewrite setTD ler_add ?ler_opp2 ?leC_nat //; last first.
- do 3!rewrite -?addnA -cardsUI ?addnA (leq_trans _ (leq_addr _ _)) //.
- by rewrite subset_leq_card // -setCD setCS -!setUA subDset setUC.
- rewrite (big_setID G0) /= (setIidPr _) ?setCS -?setUA ?subsetUl // ler_addl.
- by apply: sumr_ge0 => g _; rewrite ?exprn_ge0 ?normr_ge0.
-have lb_rho: 1 - pq / k%:R <= '[rho (tau1M psi)].
- have [_] := Dade_Ind1_sub_lin cohM Mgt1 irr_psi Mpsi psi1; rewrite -/e -/k.
- rewrite odd_Frobenius_index_ler ?mFT_odd // => -[_ _ [|/(ler_trans _)->] //].
- by rewrite ler_add2l ler_opp2 ler_pmul2r ?invr_gt0 ?gt0CG // leC_nat.
-have{rho sumG0 sumG0_diff ub_rho lb_rho} []:
- ~ pq / k%:R + 2%:R / pq + (u * q)%:R^-1 + (v * p)%:R^-1 < p%:R^-1 + q%:R^-1.
-- rewrite ler_gtF // -!addrA -ler_subl_addl -ler_subr_addl -(ler_add2l 1).
- apply: ler_trans {ub_rho lb_rho}(ler_trans lb_rho ub_rho) _.
- rewrite /sumG0_diff -!addnA natrD opprD addrA mulrBr opprB addrA.
- rewrite ler_subl_addr ler_paddr //.
- by rewrite mulr_ge0 ?invr_ge0 ?ler0n // subr_ge0 -sumr_const ler_sum.
- rewrite mulrDl -!addrA addrCA [1 + _]addrA [_ + (_ - _)]addrA ler_add //.
- rewrite -(Lagrange (normal_sub nsKM)) natrM invfM mulrA -/k -/e /pq -De.
- rewrite ler_pmul2r ?invr_gt0 ?gt0CiG // ler_pdivr_mulr ?gt0CG //.
- by rewrite mul1r leC_nat leq_pred.
- rewrite [1 + _ + _]addrA addrAC !natrD !mulrDr !ler_add //; first 1 last.
- + exact: (FTtype2_cc_core_ler StypeP).
- + exact: (FTtype2_cc_core_ler TtypeP).
- have [_ _ /card_support_normedTI->] := ctiWG.
- rewrite natrM natf_indexg ?subsetT // mulrCA mulKf ?neq0CG // card_cycTIset.
- rewrite mulnC -(dprod_card xdefW) /pq !natrM -!subn1 !natrB // -/p -/q invfM.
- rewrite mulrACA !mulrBl ?divff ?neq0CG // !mul1r mulrBr mulr1 opprB.
- by rewrite addrACA -opprB opprK.
-rewrite -!addrA ler_lt_add //; last first.
- pose q2 : algC := (q ^ 2)%:R.
- apply: ltr_le_trans (_ : 2%:R / q2 + (2%:R * q2)^-1 *+ 2 <= _); last first.
- rewrite addrC -[_ *+ 2]mulr_natl invfM mulVKf ?pnatr_eq0 //.
- rewrite mulr_natl -mulrS -mulr_natl [q2]natrM.
- by rewrite ler_pdivr_mulr ?mulr_gt0 ?gt0CG // mulKf ?neq0CG ?leC_nat.
- rewrite -natrM !addrA ltr_add ?(FTtypeP_complV_ltr TtypeP) 1?ltnW //.
- rewrite ltr_add ?(FTtypeP_complV_ltr StypeP) // /pq mulnC /q2 !natrM !invfM.
- by rewrite !ltr_pmul2l ?ltf_pinv ?invr_gt0 ?qualifE ?gt0CG ?ltr0n ?ltr_nat.
-rewrite ler_pdivr_mulr ?ler_pdivl_mull ?gt0CG // -natrM leC_nat.
-apply: leq_trans lb_k; rewrite leqW // mulnAC mulnC leq_mul //.
-have [[_ _ frobVW2 _] _ _ _ _] := FTtypeP_facts maxT TtypeP.
-rewrite -[(p * q)%N]mul1n leq_mul // (leq_trans _ (leq_pred v)) // dvdn_leq //.
- by rewrite -subn1 subn_gt0 cardG_gt1; have[] := Frobenius_context frobVW2.
-rewrite Gauss_dvd ?prime_coprime ?(dvdn_prime2 pr_p pr_q) ?gtn_eqF //.
-rewrite (Frobenius_dvd_ker1 frobVW2) /= oV /nV predn_exp.
-rewrite -(subnKC qgt2) -(ltn_predK pgt2) mulKn // subnKC //.
-by rewrite big_ord_recl dvdn_sum // => i _; rewrite expnS dvdn_mulr.
-Qed.
-
-(* This is the first part of Peterfalvi (14.11). *)
-Let indexMK : #|M : K| = (p * q)%N.
-Proof.
-have [_ _ [defM|]] := FTtypeII_support_facts maxT TtypeP Ttype2 pairTS maxNV_M.
- have:= Ttype2; rewrite (mmax_max maxM (mmax_proper maxT)) ?(eqP Mtype1) //.
- rewrite -(sdprodW (Ptype_Fcore_sdprod TtypeP)) -defK (sdprodWY defM).
- exact: mulG_subr.
-case=> y Py /index_sdprod <-; rewrite (dprod_card xdefW) -(dprodWY xdefW).
-suffices /normP {1}<-: y \in 'N(W2) by rewrite -conjYg cardJg.
-have cPP: abelian P by have [_ [/and3P[]]] := FTtypeP_facts maxS StypeP.
-by rewrite (subsetP (sub_abelian_norm cPP _)) //; have [_ _ _ []] := StypeP.
-Qed.
-
-(* This is Peterfalvi (14.12), and also (14.13) since we have already proved *)
-(* the negation of Theorem (14.2). *)
-Let not_MG_L : (L : {set gT}) \notin M :^: G.
-Proof.
-rewrite orbit_sym; apply: contra not_charUH => /imsetP[z _ /= defLz].
-rewrite sub_cyclic_char // -(cyclicJ _ z) -FcoreJ -defLz defK.
-have [_ _ [cycV _ _]] := typeP_Galois_P maxT (FTtype5_exclusion maxT) galT.
-rewrite Ptype_Fcompl_kernel_trivial // in cycV.
-by rewrite -(isog_cyclic (quotient1_isog V)) in cycV.
-Qed.
-
-(* This is Peterfalvi (14.14). *)
-Let LM_cases :
- '[tauM betaM, tau1L phi] != 0 /\ h.-1%:R / pq <= pq - 1
- \/ '[tauL betaL, tau1M psi] != 0 /\ q = 3 /\ p = 5.
-Proof.
-have [irr_phi irr_psi] := (irrL Lphi, irrM Mpsi).
-have:= Dade_sub_lin_nonorthogonal (mFT_odd _) _ cohM cohL _ Mpsi _ _ Lphi.
-rewrite -/betaL -/betaM disjoint_Dade_FTtype1 //.
-case=> //; set a := '[_, _] => nz_a; [left | right]; split=> //.
- rewrite {1}/pq -indexLH /pq -indexMK.
- by rewrite (coherent_FTtype1_core_ltr cohM cohL Mpsi Lphi) // orbit_sym.
-have ub_v: v.-1%:R / pq <= pq - 1.
- rewrite {1}/pq -indexMK /pq -indexLH /v -defK.
- exact: (coherent_FTtype1_core_ltr cohL cohM Lphi Mpsi).
-have{ub_v} ub_qp: (q ^ (p - 3) < p ^ 2)%N.
- rewrite -(@ltn_pmul2l (q ^ 3)) ?expn_gt0 ?cardG_gt0 // -expnD subnKC //.
- have: v.-1%:R < pq ^+ 2.
- rewrite -ltr_pdivr_mulr ?ltr0n ?muln_gt0 ?cardG_gt0 //.
- by rewrite (ler_lt_trans ub_v) // ltr_subl_addl -mulrS ltC_nat.
- rewrite -natrX ltC_nat prednK ?cardG_gt0 // mulnC expnMn oV.
- rewrite leq_divLR ?dvdn_pred_predX // mulnC -subn1 leq_subLR.
- move/leq_ltn_trans->; rewrite // -addSn addnC -(leq_add2r (q ^ 2 * p ^ 2)).
- rewrite addnAC -mulSnr prednK ?cardG_gt0 // mulnA leq_add2l -expnMn.
- by rewrite (ltn_sqr 1) (@ltn_mul 1 1) ?prime_gt1.
-have q3: q = 3.
- apply/eqP; rewrite eqn_leq qgt2 -ltnS -(odd_ltn 5) ?mFT_odd // -ltnS.
- rewrite -(ltn_exp2l _ _ (ltnW pgt2)) (leq_trans qp1_gt_pq1) // ltnW //.
- by rewrite -{1}(subnK pgt2) -addnS expnD (expnD p 2 4) ltn_mul ?ltn_exp2r.
-split=> //; apply/eqP; rewrite eqn_leq -ltnS andbC.
-rewrite (odd_geq 5) -1?(odd_ltn 7) ?mFT_odd //= doubleS -{1}q3 ltqp /=.
-move: ub_qp; rewrite 2!ltnNge q3; apply: contra.
-elim: p => // x IHx; rewrite ltnS leq_eqVlt => /predU1P[<- // | xgt6].
-apply: (@leq_trans (3 * x ^ 2)); last first.
- rewrite subSn ?(leq_trans _ xgt6) //.
- by rewrite [rhs in (_ <= rhs)%N]expnS leq_mul ?IHx.
-rewrite -addn1 sqrnD -addnA (mulSn 2) leq_add2l muln1.
-rewrite (@leq_trans (2 * (x * 7))) ?leq_mul //.
-by rewrite mulnCA (mulnDr x 12 2) mulnC leq_add2r -(subnKC xgt6).
-Qed.
-
-(* This is Peterfalvi (14.15). *)
-Let oU : u = nU.
-Proof.
-case: ifP (card_FTtypeP_Galois_compl maxS galS) => // p1modq oU.
-pose x := #|H : U|; rewrite -/u -/nU -/p -/q in p1modq oU.
-have DnU: (q * u)%N = nU.
- rewrite mulnC oU divnK //.
- by have [_ ->] := FTtypeP_primes_mod_cases maxS StypeP.
-have oH: h = (u * x)%N by rewrite Lagrange.
-have xmodp: x = q %[mod p].
- have hmodp: h = 1 %[mod p].
- apply/eqP; rewrite eqn_mod_dvd ?cardG_gt0 // subn1.
- apply: dvdn_trans (Frobenius_ker_dvd_ker1 frobL).
- have [y _ /index_sdprod <-] := defL.
- by rewrite -[p](cardJg _ y) cardSg ?joing_subr.
- rewrite -[q]muln1 -modnMmr -hmodp modnMmr oH mulnA DnU -modnMml.
- suffices ->: nU = 1 %[mod p] by rewrite modnMml mul1n.
- rewrite /nU predn_exp mulKn; last by rewrite -(subnKC pgt2).
- apply/eqP; rewrite -(ltn_predK qgt2) big_ord_recl eqn_mod_dvd ?subn1 //=.
- by apply: dvdn_sum => i _; rewrite expnS dvdn_mulr.
-have{xmodp} [n Dx]: {n | x = q + n * p}%N.
- by exists (x %/ p); rewrite -(modn_small ltqp) addnC -xmodp -divn_eq.
-have nmodq: n = 1 %[mod q].
- have [y _ defLy] := defL; have [_ _ /joing_subP[nHW1 _] _] := sdprodP defLy.
- have regHW1: semiregular H W1.
- have /Frobenius_reg_ker := set_Frobenius_compl defLy frobL.
- by apply: semiregularS; rewrite ?joing_subl.
- have hmodq: h = 1 %[mod q].
- apply/eqP; rewrite eqn_mod_dvd ?cardG_gt0 // subn1.
- exact: regular_norm_dvd_pred regHW1.
- have umodq: u = 1 %[mod q].
- apply/eqP; rewrite eqn_mod_dvd ?cardG_gt0 // subn1.
- apply: regular_norm_dvd_pred; first by have [_ []] := StypeP.
- exact: semiregularS regHW1.
- rewrite -hmodq oH -modnMml umodq modnMml mul1n Dx modnDl.
- by rewrite -modnMmr (eqP p1modq) modnMmr muln1.
-have{n nmodq Dx} lb_x: (q + q.+1 * p <= x)%N.
- rewrite (divn_eq n q) nmodq (modn_small (ltnW qgt2)) addn1 in Dx.
- rewrite Dx leq_add2l leq_mul // ltnS leq_pmull // lt0n.
- have: odd x by rewrite (dvdn_odd (dvdn_indexg _ _)) ?mFT_odd.
- by rewrite Dx odd_add odd_mul !mFT_odd; apply: contraNneq => ->.
-have lb_h: (p ^ q < h)%N.
- rewrite (@leq_trans (p * nU)) //; last first.
- rewrite -DnU oH mulnA mulnC leq_mul // (leq_trans _ lb_x) //.
- by rewrite mulSn addnA mulnC leq_addl.
- rewrite /nU predn_exp mulKn; last by rewrite -(subnKC pgt2).
- rewrite -(subnKC (ltnW qgt2)) subn2 big_ord_recr big_ord_recl /=.
- by rewrite -add1n !mulnDr -!expnS -addnA leq_add ?leq_addl // cardG_gt0.
-have ub_h: (h <= p ^ 2 * q ^ 2)%N.
- have [[_ ub_h] | [_ [q3 p5]]] := LM_cases; last by rewrite q3 p5 in p1modq.
- rewrite -expnMn -(ltn_predK lb_h) -ltC_nat natrM -/pq.
- rewrite -ltr_pdivr_mulr ?ltr0n ?muln_gt0 ?cardG_gt0 //.
- by rewrite (ler_lt_trans ub_h) // ltr_subl_addl -mulrS ltC_nat.
-have{lb_h} lb_q2: (p ^ q.-2 < q ^ 2)%N.
- rewrite -(@ltn_pmul2l (p ^ 2)) ?expn_gt0 ?cardG_gt0 // (leq_trans _ ub_h) //.
- by rewrite -subn2 -expnD subnKC // ltnW.
-have q3: q = 3.
- apply/eqP; rewrite eqn_leq qgt2 -(subnKC (ltnW qgt2)) subn2 ltnS.
- by rewrite -(ltn_exp2l _ _ (ltnW pgt2)) (ltn_trans lb_q2) ?ltn_exp2r.
-have{lb_q2 p1modq} p7: p = 7.
- suff: p \in [seq n <- iota 4 5 | prime n & n == 1 %[mod 3]] by case/predU1P.
- by rewrite mem_filter pr_p mem_iota -q3 p1modq ltqp; rewrite q3 in lb_q2 *.
-rewrite oH mulnC oU /nU q3 p7 -leq_divRL //= in ub_h lb_x.
-by have:= leq_trans lb_x ub_h.
-Qed.
-
-(* This is Peterfalvi (14.16), the last step towards the final contradiction. *)
-Let defH : `H = U.
-Proof.
-pose x := #|H : U|; have oH: h = (u * x)%N by rewrite Lagrange.
-apply/eqP/idPn; rewrite eqEsubset sUH andbT -indexg_gt1 -/x => xgt1.
-have hmodpq: h = 1 %[mod p * q].
- apply/eqP; rewrite eqn_mod_dvd ?cardG_gt0 // -indexLH subn1.
- exact: Frobenius_ker_dvd_ker1.
-have [[_ _ frobUW1 _] _ _ _ _] := FTtypeP_facts maxS StypeP.
-have /eqP umodpq: u == 1 %[mod p * q].
- rewrite chinese_remainder ?prime_coprime ?dvdn_prime2 ?(gtn_eqF ltqp) //.
- rewrite !eqn_mod_dvd ?cardG_gt0 // subn1 (Frobenius_dvd_ker1 frobUW1).
- rewrite oU /nU predn_exp mulKn; last by rewrite -(subnKC pgt2).
- by rewrite -(ltn_predK qgt2) big_ord_recl dvdn_sum //= => i; rewrite dvdn_exp.
-have{hmodpq} lb_x: (p * q < x)%N.
- rewrite -(subnKC (ltnW xgt1)) ltnS dvdn_leq ?subn_gt0 //.
- by rewrite -eqn_mod_dvd 1?ltnW // -hmodpq oH -modnMml umodpq modnMml mul1n.
-have [[_ ub_h] | [nz_a [q3 p5]]] := LM_cases.
- have /idPn[]: (p * q < u)%N.
- have ugt1: (1 < u)%N.
- by rewrite cardG_gt1; have [] := Frobenius_context frobUW1.
- rewrite -(subnKC (ltnW ugt1)) ltnS dvdn_leq ?subn_gt0 //.
- by rewrite -eqn_mod_dvd ?umodpq 1?ltnW.
- rewrite -leqNgt -(leq_pmul2r (indexg_gt0 L H)) indexLH.
- apply: (@leq_trans h.-1).
- by rewrite -ltnS prednK ?cardG_gt0 // oH ltn_pmul2l ?cardG_gt0.
- rewrite -indexLH -leC_nat natrM -ler_pdivr_mulr ?gt0CiG // indexLH -/pq.
- by rewrite (ler_trans ub_h) // ler_subl_addl -mulrS leC_nat ltnW.
-have lb_h1e_v: (v.-1 %/ p < h.-1 %/ #|L : H|)%N.
- rewrite -(@ltn_pmul2l u) ?cardG_gt0 // -oH oU /nU q3 p5 /= in lb_x.
- rewrite -(ltn_subRL 1) /= subn1 in lb_x.
- by rewrite leq_divRL ?indexG_gt0 // oV /nV indexLH q3 p5 (leq_trans _ lb_x).
-have oLM: orthogonal (map tau1L calL) (map tau1M calM).
- by rewrite orthogonal_sym coherent_FTtype1_ortho.
-case/eqP: nz_a; have lb_h1e_u := ltn_trans v1p_gt_u1q lb_h1e_v.
-have [] // := FTtype2_support_coherence StypeP TtypeP cohL Lphi.
-rewrite -/tauL -/sigma => _ [nb [chi Dchi ->]].
-rewrite cfdotBl cfdot_suml big1 => [|ij _]; last first.
- have [_ o_tauMeta _ _] := FTtypeI_bridge_facts _ StypeP Mtype1 cohM Mpsi psi1.
- rewrite cfdotZl cfdotC (orthogonalP o_tauMeta) ?map_f ?mem_irr //.
- by rewrite conjC0 mulr0.
-case: Dchi => ->; first by rewrite (orthogonalP oLM) ?map_f // subr0.
-by rewrite cfdotNl opprK add0r (orthogonalP oLM) ?map_f // cfAut_seqInd.
-Qed.
-
-Lemma FTtype2_exclusion : False.
-Proof. by have /negP[] := not_charUH; rewrite /= defH char_refl. Qed.
-
-End Fourteen.
-
-Lemma no_minSimple_odd_group (gT : minSimpleOddGroupType) : False.
-Proof.
-have [/forall_inP | [S [T [_ W W1 W2 defW pairST]]]] := FTtypeP_pair_cases gT.
- exact/negP/not_all_FTtype1.
-have xdefW: W2 \x W1 = W by rewrite dprodC.
-have pairTS := typeP_pair_sym xdefW pairST.
-pose p := #|W2|; pose q := #|W1|.
-have p'q: q != p.
- have [[[ctiW _ _] _ _ _ _] /mulG_sub[sW1W sW2W]] := (pairST, dprodW defW).
- have [cycW _ _] := ctiW; apply: contraTneq (cycW) => eq_pq.
- rewrite (cyclic_dprod defW) ?(cyclicS _ cycW) // -/q eq_pq.
- by rewrite /coprime gcdnn -trivg_card1; have [] := cycTI_nontrivial ctiW.
-without loss{p'q} ltqp: S T W1 W2 defW xdefW pairST pairTS @p @q / q < p.
- move=> IH_ST; rewrite neq_ltn in p'q.
- by case/orP: p'q; [apply: (IH_ST S T) | apply: (IH_ST T S)].
-have [[_ maxS maxT] _ _ _ _] := pairST.
-have [[U StypeP] [V TtypeP]] := (typeP_pairW pairST, typeP_pairW pairTS).
-have Stype2: FTtype S == 2 := FTtypeP_max_typeII maxS StypeP ltqp.
-have Ttype2: FTtype T == 2 := FTtypeP_min_typeII maxS maxT StypeP TtypeP ltqp.
-have /mmax_exists[L maxNU_L]: 'N(U) \proper setT.
- have [[_ ntU _ _] cUU _ _ _] := compl_of_typeII maxS StypeP Stype2.
- by rewrite mFT_norm_proper // mFT_sol_proper abelian_sol.
-have /mmax_exists[M maxNV_M]: 'N(V) \proper setT.
- have [[_ ntV _ _] cVV _ _ _] := compl_of_typeII maxT TtypeP Ttype2.
- by rewrite mFT_norm_proper // mFT_sol_proper abelian_sol.
-have [[maxL sNU_L] [maxM sNV_M]] := (setIdP maxNU_L, setIdP maxNV_M).
-have [frobL sUH _] := FTtypeII_support_facts maxS StypeP Stype2 pairST maxNU_L.
-have [frobM _ _] := FTtypeII_support_facts maxT TtypeP Ttype2 pairTS maxNV_M.
-have Ltype1 := FT_Frobenius_type1 maxL frobL.
-have Mtype1 := FT_Frobenius_type1 maxM frobM.
-have [tau1L cohL] := FTtype1_coherence maxL Ltype1.
-have [tau1M cohM] := FTtype1_coherence maxM Mtype1.
-have [phi Lphi phi1] := FTtype1_ref_irr maxL.
-have [psi Mpsi psi1] := FTtype1_ref_irr maxM.
-exact: (FTtype2_exclusion pairST maxS maxT StypeP TtypeP ltqp
- maxNU_L sNU_L sUH frobL Ltype1 cohL Lphi phi1
- maxNV_M sNV_M frobM Mtype1 cohM Mpsi psi1).
-Qed.
-
-Theorem Feit_Thompson (gT : finGroupType) (G : {group gT}) :
- odd #|G| -> solvable G.
-Proof. exact: (minSimpleOdd_ind no_minSimple_odd_group). Qed.
-
-Theorem simple_odd_group_prime (gT : finGroupType) (G : {group gT}) :
- odd #|G| -> simple G -> prime #|G|.
-Proof. exact: (minSimpleOdd_prime no_minSimple_odd_group). Qed.
-
-
diff --git a/mathcomp/odd_order/PFsection2.v b/mathcomp/odd_order/PFsection2.v
deleted file mode 100644
index c982642..0000000
--- a/mathcomp/odd_order/PFsection2.v
+++ /dev/null
@@ -1,830 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime ssralg poly finset center.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action zmodp.
-From mathcomp
-Require Import gfunctor gproduct cyclic pgroup frobenius ssrnum.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation vector algC classfun character.
-From mathcomp
-Require Import inertia vcharacter PFsection1.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 2: the Dade isometry *)
-(* Defined here: *)
-(* Dade_hypothesis G L A <-> G, L, and A satisfy the hypotheses under which *)
-(* which the Dade isometry relative to G, L and *)
-(* A is well-defined. *)
-(* For ddA : Dade_hypothesis G L A, we also define *)
-(* Dade ddA == the Dade isometry relative to G, L and A. *)
-(* Dade_signalizer ddA a == the normal complement to 'C_L[a] in 'C_G[a] for *)
-(* a in A (this is usually denoted by H a). *)
-(* Dade_support1 ddA a == the set of elements identified with a by the Dade *)
-(* isometry. *)
-(* Dade_support ddA == the natural support of the Dade isometry. *)
-(* The following are used locally in expansion of the Dade isometry as a sum *)
-(* of induced characters: *)
-(* Dade_transversal ddA == a transversal of the L-conjugacy classes *)
-(* of non empty subsets of A. *)
-(* Dade_set_signalizer ddA B == the generalization of H to B \subset A, *)
-(* denoted 'H(B) below. *)
-(* Dade_set_normalizer ddA B == the generalization of 'C_G[a] to B. *)
-(* denoted 'M(B) = 'H(B) ><| 'N_L(B) below. *)
-(* Dade_cfun_restriction ddA B aa == the composition of aa \in 'CF(L, A) *)
-(* with the projection of 'M(B) onto 'N_L(B), *)
-(* parallel to 'H(B). *)
-(* In addition, if sA1A : A1 \subset A and nA1L : L \subset 'N(A1), we have *)
-(* restr_Dade_hyp ddA sA1A nA1L : Dade_hypothesis G L A1 H *)
-(* restr_Dade ddA sA1A nA1L == the restriction of the Dade isometry to *)
-(* 'CF(L, A1). *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory Num.Theory.
-Local Open Scope ring_scope.
-
-Reserved Notation "alpha ^\tau" (at level 2, format "alpha ^\tau").
-
-Section Two.
-
-Variable gT : finGroupType.
-
-(* This is Peterfalvi (2.1). *)
-Lemma partition_cent_rcoset (H : {group gT}) g (C := 'C_H[g]) (Cg := C :* g) :
- g \in 'N(H) -> coprime #|H| #[g] ->
- partition (Cg :^: H) (H :* g) /\ #|Cg :^: H| = #|H : C|.
-Proof.
-move=> nHg coHg; pose pi := \pi(#[g]).
-have notCg0: Cg != set0 by apply/set0Pn; exists g; apply: rcoset_refl.
-have id_pi: {in Cg, forall u, u.`_ pi = g}.
- move=> _ /rcosetP[u /setIP[Hu cgu] ->]; rewrite consttM; last exact/cent1P.
- rewrite (constt_p_elt (pgroup_pi _)) (constt1P _) ?mul1g //.
- by rewrite (mem_p_elt _ Hu) // /pgroup -coprime_pi' // coprime_sym.
-have{id_pi} /and3P[_ tiCg /eqP defC]: normedTI Cg H C.
- apply/normedTI_P; rewrite subsetI subsetIl normsM ?normG ?subsetIr //.
- split=> // x Hx /pred0Pn[u /andP[/= Cu Cxu]]; rewrite !inE Hx /= conjg_set1.
- by rewrite -{2}(id_pi _ Cu) -(conjgKV x u) consttJ id_pi -?mem_conjg.
-have{tiCg} partCg := partition_class_support notCg0 tiCg.
-have{defC} oCgH: #|Cg :^: H| = #|H : C| by rewrite -defC -astab1Js -card_orbit.
-split=> //; congr (partition _ _): (partCg); apply/eqP.
-rewrite eqEcard card_rcoset {1}class_supportEr; apply/andP; split.
- apply/bigcupsP=> x Hx; rewrite conjsgE -rcosetM conjgCV rcosetM mulgA.
- by rewrite mulSg ?mul_subG ?subsetIl // sub1set ?memJ_norm ?groupV.
-have oCg Cx: Cx \in Cg :^: H -> #|Cx| = #|C|.
- by case/imsetP=> x _ ->; rewrite cardJg card_rcoset.
-by rewrite (card_uniform_partition oCg partCg) oCgH mulnC Lagrange ?subsetIl.
-Qed.
-
-Definition is_Dade_signalizer (G L A : {set gT}) (H : gT -> {group gT}) :=
- {in A, forall a, H a ><| 'C_L[a] = 'C_G[a]}.
-
-(* This is Peterfalvi Definition (2.2). *)
-Definition Dade_hypothesis (G L A : {set gT}) :=
- [/\ A <| L, L \subset G, 1%g \notin A,
- (*a*) {in A &, forall x, {subset x ^: G <= x ^: L}}
- & (*b*) exists2 H, is_Dade_signalizer G L A H
- & (*c*) {in A &, forall a b, coprime #|H a| #|'C_L[b]| }].
-
-Variables (G L : {group gT}) (A : {set gT}).
-
-Let pi := [pred p | [exists a in A, p \in \pi('C_L[a])]].
-
-Let piCL a : a \in A -> pi.-group 'C_L[a].
-Proof.
-move=> Aa; apply: sub_pgroup (pgroup_pi _) => p cLa_p.
-by apply/exists_inP; exists a.
-Qed.
-
-Fact Dade_signalizer_key : unit. Proof. by []. Qed.
-Definition Dade_signalizer_def a := 'O_pi^'('C_G[a])%G.
-Definition Dade_signalizer of Dade_hypothesis G L A :=
- locked_with Dade_signalizer_key Dade_signalizer_def.
-
-Hypothesis ddA : Dade_hypothesis G L A.
-Notation H := (Dade_signalizer ddA).
-Canonical Dade_signalizer_unlockable := [unlockable fun H].
-
-Let pi'H a : pi^'.-group (H a). Proof. by rewrite unlock pcore_pgroup. Qed.
-Let nsHC a : H a <| 'C_G[a]. Proof. by rewrite unlock pcore_normal. Qed.
-
-Lemma Dade_signalizer_sub a : H a \subset G.
-Proof. by have /andP[/subsetIP[]] := nsHC a. Qed.
-
-Lemma Dade_signalizer_cent a : H a \subset 'C[a].
-Proof. by have /andP[/subsetIP[]] := nsHC a. Qed.
-
-Let nsAL : A <| L. Proof. by have [->] := ddA. Qed.
-Let sAL : A \subset L. Proof. exact: normal_sub nsAL. Qed.
-Let nAL : L \subset 'N(A). Proof. exact: normal_norm nsAL. Qed.
-Let sLG : L \subset G. Proof. by have [_ ->] := ddA. Qed.
-Let notA1 : 1%g \notin A. Proof. by have [_ _ ->] := ddA. Qed.
-Let conjAG : {in A &, forall x, {subset x ^: G <= x ^: L}}.
-Proof. by have [_ _ _ ? _] := ddA. Qed.
-Let sHG := Dade_signalizer_sub.
-Let cHA := Dade_signalizer_cent.
-Let notHa0 a : H a :* a :!=: set0.
-Proof. by rewrite -cards_eq0 -lt0n card_rcoset cardG_gt0. Qed.
-
-Let HallCL a : a \in A -> pi.-Hall('C_G[a]) 'C_L[a].
-Proof.
-move=> Aa; have [_ _ _ _ [H1 /(_ a Aa)/sdprodP[_ defCa _ _] coH1L]] := ddA.
-have [|//] := coprime_mulGp_Hall defCa _ (piCL Aa).
-apply: sub_pgroup (pgroup_pi _) => p; apply: contraL => /exists_inP[b Ab].
-by apply: (@pnatPpi \pi(_)^'); rewrite -coprime_pi' ?cardG_gt0 ?coH1L.
-Qed.
-
-Lemma def_Dade_signalizer H1 : is_Dade_signalizer G L A H1 -> {in A, H =1 H1}.
-Proof.
-move=> defH1 a Aa; apply/val_inj; rewrite unlock /=; have defCa := defH1 a Aa.
-have /sdprod_context[nsH1Ca _ _ _ _] := defCa.
-by apply/normal_Hall_pcore=> //; apply/(sdprod_normal_pHallP _ (HallCL Aa)).
-Qed.
-
-Lemma Dade_sdprod : is_Dade_signalizer G L A H.
-Proof.
-move=> a Aa; have [_ _ _ _ [H1 defH1 _]] := ddA.
-by rewrite (def_Dade_signalizer defH1) ?defH1.
-Qed.
-Let defCA := Dade_sdprod.
-
-Lemma Dade_coprime : {in A &, forall a b, coprime #|H a| #|'C_L[b]| }.
-Proof. by move=> a b _ Ab; apply: p'nat_coprime (pi'H a) (piCL Ab). Qed.
-Let coHL := Dade_coprime.
-
-Definition Dade_support1 a := class_support (H a :* a) G.
-Local Notation dd1 := Dade_support1.
-
-Lemma mem_Dade_support1 a x : a \in A -> x \in H a -> (x * a)%g \in dd1 a.
-Proof. by move=> Aa Hx; rewrite -(conjg1 (x * a)) !mem_imset2 ?set11. Qed.
-
-(* This is Peterfalvi (2.3), except for the existence part, which is covered *)
-(* below in the NormedTI section. *)
-Lemma Dade_normedTI_P :
- reflect (A != set0 /\ {in A, forall a, H a = 1%G}) (normedTI A G L).
-Proof.
-apply: (iffP idP) => [tiAG | [nzA trivH]].
- split=> [|a Aa]; first by have [] := andP tiAG.
- apply/trivGP; rewrite -(coprime_TIg (coHL Aa Aa)) subsetIidl subsetI cHA.
- by rewrite (subset_trans (normal_sub (nsHC a))) ?(cent1_normedTI tiAG).
-apply/normedTI_memJ_P; split=> // a g Aa Gg.
-apply/idP/idP=> [Aag | Lg]; last by rewrite memJ_norm ?(subsetP nAL).
-have /imsetP[k Lk def_ag] := conjAG Aa Aag (mem_imset _ Gg).
-suffices: (g * k^-1)%g \in 'C_G[a].
- by rewrite -Dade_sdprod ?trivH // sdprod1g inE groupMr ?groupV // => /andP[].
-rewrite !inE groupM ?groupV // ?(subsetP sLG) //=.
-by rewrite conjg_set1 conjgM def_ag conjgK.
-Qed.
-
-(* This is Peterfalvi (2.4)(a) (extended to all a thanks to our choice of H). *)
-Lemma DadeJ a x : x \in L -> H (a ^ x) :=: H a :^ x.
-Proof.
-by move/(subsetP sLG)=> Gx; rewrite unlock -pcoreJ conjIg -cent1J conjGid.
-Qed.
-
-Lemma Dade_support1_id a x : x \in L -> dd1 (a ^ x) = dd1 a.
-Proof.
-move=> Lx; rewrite {1}/dd1 DadeJ // -conjg_set1 -conjsMg.
-by rewrite class_supportGidl ?(subsetP sLG).
-Qed.
-
-Let piHA a u : a \in A -> u \in H a :* a -> u.`_pi = a.
-Proof.
-move=> Aa /rcosetP[{u}u Hu ->]; have pi'u: pi^'.-elt u by apply: mem_p_elt Hu.
-rewrite (consttM _ (cent1P (subsetP (cHA a) u Hu))).
-suffices pi_a: pi.-elt a by rewrite (constt1P pi'u) (constt_p_elt _) ?mul1g.
-by rewrite (mem_p_elt (piCL Aa)) // inE cent1id (subsetP sAL).
-Qed.
-
-(* This is Peterfalvi (2.4)(b). *)
-Lemma Dade_support1_TI : {in A &, forall a b,
- ~~ [disjoint dd1 a & dd1 b] -> exists2 x, x \in L & b = a ^ x}.
-Proof.
-move=> a b Aa Ab /= /pred0Pn[_ /andP[/imset2P[x u /(piHA Aa) def_x Gu ->]]] /=.
-case/imset2P=> y v /(piHA Ab) def_y Gv /(canLR (conjgK v)) def_xuv.
-have def_b: a ^ (u * v^-1) = b by rewrite -def_x -consttJ conjgM def_xuv def_y.
-by apply/imsetP/conjAG; rewrite // -def_b mem_imset ?groupM ?groupV.
-Qed.
-
-(* This is an essential strengthening of Peterfalvi (2.4)(c). *)
-Lemma Dade_cover_TI : {in A, forall a, normedTI (H a :* a) G 'C_G[a]}.
-Proof.
-move=> a Aa; apply/normedTI_P; split=> // [|g Gg].
- by rewrite subsetI subsetIl normsM ?subsetIr ?normal_norm ?nsHC.
-rewrite disjoint_sym => /pred0Pn[_ /andP[/imsetP[u Ha_u ->] Ha_ug]].
-by rewrite !inE Gg /= conjg_set1 -{1}(piHA Aa Ha_u) -consttJ (piHA Aa).
-Qed.
-
-(* This is Peterfalvi (2.4)(c). *)
-Lemma norm_Dade_cover : {in A, forall a, 'N_G(H a :* a) = 'C_G[a]}.
-Proof. by move=> a /Dade_cover_TI /and3P[_ _ /eqP]. Qed.
-
-Definition Dade_support := \bigcup_(a in A) dd1 a.
-Local Notation Atau := Dade_support.
-
-Lemma not_support_Dade_1 : 1%g \notin Atau.
-Proof.
-apply: contra notA1 => /bigcupP[a Aa /imset2P[u x Ha_u _ ux1]].
-suffices /set1P <-: a \in [1] by [].
-have [_ _ _ <-] := sdprodP (defCA Aa).
-rewrite 2!inE cent1id (subsetP sAL) // !andbT.
-by rewrite -groupV -(mul1g a^-1)%g -mem_rcoset -(conj1g x^-1) ux1 conjgK.
-Qed.
-
-Lemma Dade_support_sub : Atau \subset G.
-Proof.
-apply/bigcupsP=> a Aa; rewrite class_support_subG // mul_subG ?sHG //.
-by rewrite sub1set (subsetP sLG) ?(subsetP sAL).
-Qed.
-
-Lemma Dade_support_norm : G \subset 'N(Atau).
-Proof.
-by rewrite norms_bigcup //; apply/bigcapsP=> a _; apply: class_support_norm.
-Qed.
-
-Lemma Dade_support_normal : Atau <| G.
-Proof. by rewrite /normal Dade_support_sub Dade_support_norm. Qed.
-
-Lemma Dade_support_subD1 : Atau \subset G^#.
-Proof. by rewrite subsetD1 Dade_support_sub not_support_Dade_1. Qed.
-
-(* This is Peterfalvi Definition (2.5). *)
-Fact Dade_subproof (alpha : 'CF(L)) :
- is_class_fun <<G>> [ffun x => oapp alpha 0 [pick a in A | x \in dd1 a]].
-Proof.
-rewrite genGid; apply: intro_class_fun => [x y Gx Gy | x notGx].
- congr (oapp _ _); apply: eq_pick => a; rewrite memJ_norm //.
- by apply: subsetP Gy; apply: class_support_norm.
-case: pickP => // a /andP[Aa Ha_u].
-by rewrite (subsetP Dade_support_sub) // in notGx; apply/bigcupP; exists a.
-Qed.
-Definition Dade alpha := Cfun 1 (Dade_subproof alpha).
-
-Lemma Dade_is_linear : linear Dade.
-Proof.
-move=> mu alpha beta; apply/cfunP=> x; rewrite !cfunElock.
-by case: pickP => [a _ | _] /=; rewrite ?mulr0 ?addr0 ?cfunE.
-Qed.
-Canonical Dade_additive := Additive Dade_is_linear.
-Canonical Dade_linear := Linear Dade_is_linear.
-
-Local Notation "alpha ^\tau" := (Dade alpha).
-
-(* This is the validity of Peterfalvi, Definition (2.5) *)
-Lemma DadeE alpha a u : a \in A -> u \in dd1 a -> alpha^\tau u = alpha a.
-Proof.
-move=> Aa Ha_u; rewrite cfunElock.
-have [b /= /andP[Ab Hb_u] | ] := pickP; last by move/(_ a); rewrite Aa Ha_u.
-have [|x Lx ->] := Dade_support1_TI Aa Ab; last by rewrite cfunJ.
-by apply/pred0Pn; exists u; rewrite /= Ha_u.
-Qed.
-
-Lemma Dade_id alpha : {in A, forall a, alpha^\tau a = alpha a}.
-Proof.
-by move=> a Aa; rewrite /= -{1}[a]mul1g (DadeE _ Aa) ?mem_Dade_support1.
-Qed.
-
-Lemma Dade_cfunS alpha : alpha^\tau \in 'CF(G, Atau).
-Proof.
-apply/cfun_onP=> x; rewrite cfunElock.
-by case: pickP => [a /andP[Aa Ha_x] /bigcupP[] | //]; exists a.
-Qed.
-
-Lemma Dade_cfun alpha : alpha^\tau \in 'CF(G, G^#).
-Proof. by rewrite (cfun_onS Dade_support_subD1) ?Dade_cfunS. Qed.
-
-Lemma Dade1 alpha : alpha^\tau 1%g = 0.
-Proof. by rewrite (cfun_on0 (Dade_cfun _)) // !inE eqxx. Qed.
-
-Lemma Dade_id1 :
- {in 'CF(L, A) & 1%g |: A, forall alpha a, alpha^\tau a = alpha a}.
-Proof.
-move=> alpha a Aalpha; case/setU1P=> [-> |]; last exact: Dade_id.
-by rewrite Dade1 (cfun_on0 Aalpha).
-Qed.
-
-Section AutomorphismCFun.
-
-Variable u : {rmorphism algC -> algC}.
-Local Notation "alpha ^u" := (cfAut u alpha).
-
-Lemma Dade_aut alpha : (alpha^u)^\tau = (alpha^\tau)^u.
-Proof.
-apply/cfunP => g; rewrite cfunE.
-have [/bigcupP[a Aa A1g] | notAtau_g] := boolP (g \in Atau).
- by rewrite !(DadeE _ Aa A1g) cfunE.
-by rewrite !(cfun_on0 _ notAtau_g) ?rmorph0 ?Dade_cfunS.
-Qed.
-
-End AutomorphismCFun.
-
-Lemma Dade_conjC alpha : (alpha^*)^\tau = ((alpha^\tau)^*)%CF.
-Proof. exact: Dade_aut. Qed.
-
-(* This is Peterfalvi (2.7), main part *)
-Lemma general_Dade_reciprocity alpha (phi : 'CF(G)) (psi : 'CF(L)) :
- alpha \in 'CF(L, A) ->
- {in A, forall a, psi a = #|H a|%:R ^-1 * (\sum_(x in H a) phi (x * a)%g)} ->
- '[alpha^\tau, phi] = '[alpha, psi].
-Proof.
-move=> CFalpha psiA; rewrite (cfdotEl _ (Dade_cfunS _)).
-pose T := [set repr (a ^: L) | a in A].
-have sTA: {subset T <= A}.
- move=> _ /imsetP[a Aa ->]; have [x Lx ->] := repr_class L a.
- by rewrite memJ_norm ?(subsetP nAL).
-pose P_G := [set dd1 x | x in T].
-have dd1_id: {in A, forall a, dd1 (repr (a ^: L)) = dd1 a}.
- by move=> a Aa /=; have [x Lx ->] := repr_class L a; apply: Dade_support1_id.
-have ->: Atau = cover P_G.
- apply/setP=> u; apply/bigcupP/bigcupP=> [[a Aa Fa_u] | [Fa]]; last first.
- by case/imsetP=> a /sTA Aa -> Fa_u; exists a.
- by exists (dd1 a) => //; rewrite -dd1_id //; do 2!apply: mem_imset.
-have [tiP_G inj_dd1]: trivIset P_G /\ {in T &, injective dd1}.
- apply: trivIimset => [_ _ /imsetP[a Aa ->] /imsetP[b Ab ->] |]; last first.
- apply/imsetP=> [[a]]; move/sTA=> Aa; move/esym; move/eqP; case/set0Pn.
- by exists (a ^ 1)%g; apply: mem_imset2; rewrite ?group1 ?rcoset_refl.
- rewrite !dd1_id //; apply: contraR.
- by case/Dade_support1_TI=> // x Lx ->; rewrite classGidl.
-rewrite big_trivIset //= big_imset {P_G tiP_G inj_dd1}//=.
-symmetry; rewrite (cfdotEl _ CFalpha).
-pose P_A := [set a ^: L | a in T].
-have rLid x: repr (x ^: L) ^: L = x ^: L.
- by have [y Ly ->] := repr_class L x; rewrite classGidl.
-have {1}<-: cover P_A = A.
- apply/setP=> a; apply/bigcupP/idP=> [[_ /imsetP[d /sTA Ab ->]] | Aa].
- by case/imsetP=> x Lx ->; rewrite memJ_norm ?(subsetP nAL).
- by exists (a ^: L); rewrite ?class_refl // -rLid; do 2!apply: mem_imset.
-have [tiP_A injFA]: trivIset P_A /\ {in T &, injective (class^~ L)}.
- apply: trivIimset => [_ _ /imsetP[a Aa ->] /imsetP[b Ab ->] |]; last first.
- by apply/imsetP=> [[a _ /esym/eqP/set0Pn[]]]; exists a; apply: class_refl.
- rewrite !rLid; apply: contraR => /pred0Pn[c /andP[/=]].
- by do 2!move/class_eqP <-.
-rewrite big_trivIset //= big_imset {P_A tiP_A injFA}//=.
-apply: canRL (mulKf (neq0CG G)) _; rewrite mulrA big_distrr /=.
-apply: eq_bigr => a /sTA=> {T sTA}Aa.
-have [La def_Ca] := (subsetP sAL a Aa, defCA Aa).
-rewrite (eq_bigr (fun _ => alpha a * (psi a)^*)) => [|ax]; last first.
- by case/imsetP=> x Lx ->{ax}; rewrite !cfunJ.
-rewrite sumr_const -index_cent1 mulrC -mulr_natr -!mulrA.
-rewrite (eq_bigr (fun xa => alpha a * (phi xa)^*)) => [|xa Fa_xa]; last first.
- by rewrite (DadeE _ Aa).
-rewrite -big_distrr /= -rmorph_sum; congr (_ * _).
-rewrite mulrC mulrA -natrM mulnC -(Lagrange (subsetIl G 'C[a])).
-rewrite -mulnA mulnCA -(sdprod_card def_Ca) -mulnA Lagrange ?subsetIl //.
-rewrite mulnA natrM mulfK ?neq0CG // -conjC_nat -rmorphM; congr (_ ^*).
-have /and3P[_ tiHa _] := Dade_cover_TI Aa.
-rewrite (set_partition_big _ (partition_class_support _ _)) //=.
-rewrite (eq_bigr (fun _ => \sum_(x in H a) phi (x * a)%g)); last first.
- move=> _ /imsetP[x Gx ->]; rewrite -rcosetE.
- rewrite (big_imset _ (in2W (conjg_inj x))) (big_imset _ (in2W (mulIg a))) /=.
- by apply: eq_bigr => u Hu; rewrite cfunJ ?groupM ?(subsetP sLG a).
-rewrite sumr_const card_orbit astab1Js norm_Dade_cover //.
-by rewrite natrM -mulrA mulr_natl psiA // mulVKf ?neq0CG.
-Qed.
-
-(* This is Peterfalvi (2.7), second part. *)
-Lemma Dade_reciprocity alpha (phi : 'CF(G)) :
- alpha \in 'CF(L, A) ->
- {in A, forall a, {in H a, forall u, phi (u * a)%g = phi a}} ->
- '[alpha^\tau, phi] = '[alpha, 'Res[L] phi].
-Proof.
-move=> CFalpha phiH; apply: general_Dade_reciprocity => // a Aa.
-rewrite cfResE ?(subsetP sAL) //; apply: canRL (mulKf (neq0CG _)) _.
-by rewrite mulr_natl -sumr_const; apply: eq_bigr => x Hx; rewrite phiH.
-Qed.
-
-(* This is Peterfalvi (2.6)(a). *)
-Lemma Dade_isometry : {in 'CF(L, A) &, isometry Dade}.
-Proof.
-move=> alpha beta CFalpha CFbeta /=.
-rewrite Dade_reciprocity ?Dade_cfun => // [|a Aa u Hu]; last first.
- by rewrite (DadeE _ Aa) ?mem_Dade_support1 ?Dade_id.
-rewrite !(cfdotEl _ CFalpha); congr (_ * _); apply: eq_bigr => x Ax.
-by rewrite cfResE ?(subsetP sAL) // Dade_id.
-Qed.
-
-(* Supplement to Peterfalvi (2.3)/(2.6)(a); implies Isaacs Lemma 7.7. *)
-Lemma Dade_Ind : normedTI A G L -> {in 'CF(L, A), Dade =1 'Ind}.
-Proof.
-case/Dade_normedTI_P=> _ trivH alpha Aalpha.
-rewrite [alpha^\tau]cfun_sum_cfdot ['Ind _]cfun_sum_cfdot.
-apply: eq_bigr => i _; rewrite -cfdot_Res_r -Dade_reciprocity // => a Aa /= u.
-by rewrite trivH // => /set1P->; rewrite mul1g.
-Qed.
-
-Definition Dade_set_signalizer (B : {set gT}) := \bigcap_(a in B) H a.
-Local Notation "''H' ( B )" := (Dade_set_signalizer B)
- (at level 8, format "''H' ( B )") : group_scope.
-Canonical Dade_set_signalizer_group B := [group of 'H(B)].
-Definition Dade_set_normalizer B := 'H(B) <*> 'N_L(B).
-Local Notation "''M' ( B )" := (Dade_set_normalizer B)
- (at level 8, format "''M' ( B )") : group_scope.
-Canonical Dade_set_normalizer_group B := [group of 'M(B)].
-
-Let calP := [set B : {set gT} | B \subset A & B != set0].
-
-(* This is Peterfalvi (2.8). *)
-Lemma Dade_set_sdprod : {in calP, forall B, 'H(B) ><| 'N_L(B) = 'M(B)}.
-Proof.
-move=> B /setIdP[sBA notB0]; apply: sdprodEY => /=.
- apply/subsetP=> x /setIP[Lx nBx]; rewrite inE.
- apply/bigcapsP=> a Ba; have Aa := subsetP sBA a Ba.
- by rewrite sub_conjg -DadeJ ?groupV // bigcap_inf // memJ_norm ?groupV.
-have /set0Pn[a Ba] := notB0; have Aa := subsetP sBA a Ba.
-have [_ /mulG_sub[sHaC _] _ tiHaL] := sdprodP (defCA Aa).
-rewrite -(setIidPl sLG) -setIA setICA (setIidPl sHaC) in tiHaL.
-by rewrite setICA ['H(B)](bigD1 a) //= !setIA tiHaL !setI1g.
-Qed.
-
-Section DadeExpansion.
-
-Variable aa : 'CF(L).
-Hypothesis CFaa : aa \in 'CF(L, A).
-
-Definition Dade_restrm B :=
- if B \in calP then remgr 'H(B) 'N_L(B) else trivm 'M(B).
-Fact Dade_restrM B : {in 'M(B) &, {morph Dade_restrm B : x y / x * y}%g}.
-Proof.
-rewrite /Dade_restrm; case: ifP => calP_B; last exact: morphM.
-have defM := Dade_set_sdprod calP_B; have [nsHM _ _ _ _] := sdprod_context defM.
-by apply: remgrM; first apply: sdprod_compl.
-Qed.
-Canonical Dade_restr_morphism B := Morphism (@Dade_restrM B).
-Definition Dade_cfun_restriction B :=
- cfMorph ('Res[Dade_restrm B @* 'M(B)] aa).
-
-Local Notation "''aa_' B" := (Dade_cfun_restriction B)
- (at level 3, B at level 2, format "''aa_' B") : ring_scope.
-
-Definition Dade_transversal := [set repr (B :^: L) | B in calP].
-Local Notation calB := Dade_transversal.
-
-Lemma Dade_restrictionE B x :
- B \in calP -> 'aa_B x = aa (remgr 'H(B) 'N_L(B) x) *+ (x \in 'M(B)).
-Proof.
-move=> calP_B; have /sdprodP[_ /= defM _ _] := Dade_set_sdprod calP_B.
-have [Mx | /cfun0-> //] := boolP (x \in 'M(B)).
-rewrite mulrb cfMorphE // morphimEdom /= /Dade_restrm calP_B.
-rewrite cfResE ?mem_imset {x Mx}//= -defM.
-by apply/subsetP=> _ /imsetP[x /mem_remgr/setIP[Lx _] ->].
-Qed.
-Local Notation rDadeE := Dade_restrictionE.
-
-Lemma Dade_restriction_vchar B : aa \in 'Z[irr L] -> 'aa_B \in 'Z[irr 'M(B)].
-Proof.
-rewrite /'aa_B => /vcharP[a1 Na1 [a2 Na2 ->]].
-by rewrite !linearB /= rpredB // char_vchar ?cfMorph_char ?cfRes_char.
-Qed.
-
-Let sMG B : B \in calP -> 'M(B) \subset G.
-Proof.
-case/setIdP=> /subsetP sBA /set0Pn[a Ba].
-by rewrite join_subG ['H(B)](bigD1 a Ba) !subIset ?sLG ?sHG ?sBA.
-Qed.
-
-(* This is Peterfalvi (2.10.1) *)
-Lemma Dade_Ind_restr_J :
- {in L & calP, forall x B, 'Ind[G] 'aa_(B :^ x) = 'Ind[G] 'aa_B}.
-Proof.
-move=> x B Lx dB; have [defMB [sBA _]] := (Dade_set_sdprod dB, setIdP dB).
-have dBx: B :^ x \in calP.
- by rewrite !inE -{2}(normsP nAL x Lx) conjSg -!cards_eq0 cardJg in dB *.
-have defHBx: 'H(B :^ x) = 'H(B) :^ x.
- rewrite /'H(_) (big_imset _ (in2W (conjg_inj x))) -bigcapJ /=.
- by apply: eq_bigr => a Ba; rewrite DadeJ ?(subsetP sBA).
-have defNBx: 'N_L(B :^ x) = 'N_L(B) :^ x by rewrite conjIg -normJ (conjGid Lx).
-have [_ mulHNB _ tiHNB] := sdprodP defMB.
-have defMBx: 'M(B :^ x) = 'M(B) :^ x.
- rewrite -mulHNB conjsMg -defHBx -defNBx.
- by case/sdprodP: (Dade_set_sdprod dBx).
-have def_aa_x y: 'aa_(B :^ x) (y ^ x) = 'aa_B y.
- rewrite !rDadeE // defMBx memJ_conjg !mulrb -mulHNB defHBx defNBx.
- have [[h z Hh Nz ->] | // ] := mulsgP.
- by rewrite conjMg !remgrMid ?cfunJ ?memJ_conjg // -conjIg tiHNB conjs1g.
-apply/cfunP=> y; have Gx := subsetP sLG x Lx.
-rewrite [eq]lock !cfIndE ?sMG //= {1}defMBx cardJg -lock; congr (_ * _).
-rewrite (reindex_astabs 'R x) ?astabsR //=.
-by apply: eq_bigr => z _; rewrite conjgM def_aa_x.
-Qed.
-
-(* This is Peterfalvi (2.10.2) *)
-Lemma Dade_setU1 : {in calP & A, forall B a, 'H(a |: B) = 'C_('H(B))[a]}.
-Proof.
-move=> B a dB Aa; rewrite /'H(_) bigcap_setU big_set1 -/'H(B).
-apply/eqP; rewrite setIC eqEsubset setIS // subsetI subsetIl /=.
-have [sHBG pi'HB]: 'H(B) \subset G /\ pi^'.-group 'H(B).
- have [sBA /set0Pn[b Bb]] := setIdP dB; have Ab := subsetP sBA b Bb.
- have sHBb: 'H(B) \subset H b by rewrite ['H(B)](bigD1 b) ?subsetIl.
- by rewrite (pgroupS sHBb) ?pi'H ?(subset_trans sHBb) ?sHG.
-have [nsHa _ defCa _ _] := sdprod_context (defCA Aa).
-have [hallHa _] := coprime_mulGp_Hall defCa (pi'H a) (piCL Aa).
-by rewrite (sub_normal_Hall hallHa) ?(pgroupS (subsetIl _ _)) ?setSI.
-Qed.
-
-Let calA g (X : {set gT}) := [set x in G | g ^ x \in X]%g.
-
-(* This is Peterfalvi (2.10.3) *)
-Lemma Dade_Ind_expansion B g :
- B \in calP ->
- [/\ g \notin Atau -> ('Ind[G, 'M(B)] 'aa_B) g = 0
- & {in A, forall a, g \in dd1 a ->
- ('Ind[G, 'M(B)] 'aa_B) g =
- (aa a / #|'M(B)|%:R) *
- \sum_(b in 'N_L(B) :&: a ^: L) #|calA g ('H(B) :* b)|%:R}].
-Proof.
-move=> dB; set LHS := 'Ind _ g.
-have defMB := Dade_set_sdprod dB; have [_ mulHNB nHNB tiHNB] := sdprodP defMB.
-have [sHMB sNMB] := mulG_sub mulHNB.
-have{LHS} ->: LHS = #|'M(B)|%:R^-1 * \sum_(x in calA g 'M(B)) 'aa_B (g ^ x).
- rewrite {}/LHS cfIndE ?sMG //; congr (_ * _).
- rewrite (bigID [pred x | g ^ x \in 'M(B)]) /= addrC big1 ?add0r => [|x].
- by apply: eq_bigl => x; rewrite inE.
- by case/andP=> _ notMgx; rewrite cfun0.
-pose fBg x := remgr 'H(B) 'N_L(B) (g ^ x).
-pose supp_aBg := [pred b in A | g \in dd1 b].
-have supp_aBgP: {in calA g 'M(B), forall x,
- ~~ supp_aBg (fBg x) -> 'aa_B (g ^ x)%g = 0}.
-- move=> x /setIdP[]; set b := fBg x => Gx MBgx notHGx; rewrite rDadeE // MBgx.
- have Nb: b \in 'N_L(B) by rewrite mem_remgr ?mulHNB.
- have Cb: b \in 'C_L[b] by rewrite inE cent1id; have [-> _] := setIP Nb.
- rewrite (cfun_on0 CFaa) // -/(fBg x) -/b; apply: contra notHGx => Ab.
- have nHb: b \in 'N('H(B)) by rewrite (subsetP nHNB).
- have [sBA /set0Pn[a Ba]] := setIdP dB; have Aa := subsetP sBA a Ba.
- have [|/= partHBb _] := partition_cent_rcoset nHb.
- rewrite (coprime_dvdr (order_dvdG Cb)) //= ['H(B)](bigD1 a) //=.
- by rewrite (coprimeSg (subsetIl _ _)) ?coHL.
- have Hb_gx: g ^ x \in 'H(B) :* b by rewrite mem_rcoset mem_divgr ?mulHNB.
- have [defHBb _ _] := and3P partHBb; rewrite -(eqP defHBb) in Hb_gx.
- case/bigcupP: Hb_gx => Cy; case/imsetP=> y HBy ->{Cy} Cby_gx.
- have sHBa: 'H(B) \subset H a by rewrite bigcap_inf.
- have sHBG: 'H(B) \subset G := subset_trans sHBa (sHG a).
- rewrite Ab -(memJ_conjg _ x) class_supportGidr // -(conjgKV y (g ^ x)).
- rewrite mem_imset2 // ?(subsetP sHBG) {HBy}// -mem_conjg.
- apply: subsetP Cby_gx; rewrite {y}conjSg mulSg //.
- have [nsHb _ defCb _ _] := sdprod_context (defCA Ab).
- have [hallHb _] := coprime_mulGp_Hall defCb (pi'H b) (piCL Ab).
- rewrite (sub_normal_Hall hallHb) ?setSI // (pgroupS _ (pi'H a)) //=.
- by rewrite subIset ?sHBa.
-split=> [notHGg | a Aa Hag].
- rewrite big1 ?mulr0 // => x; move/supp_aBgP; apply; set b := fBg x.
- by apply: contra notHGg; case/andP=> Ab Hb_x; apply/bigcupP; exists b.
-rewrite -mulrA mulrCA; congr (_ * _); rewrite big_distrr /=.
-set nBaL := _ :&: _; rewrite (bigID [pred x | fBg x \in nBaL]) /= addrC.
-rewrite big1 ?add0r => [|x /andP[calAx not_nBaLx]]; last first.
- apply: supp_aBgP => //; apply: contra not_nBaLx.
- set b := fBg x => /andP[Ab Hb_g]; have [Gx MBx] := setIdP calAx.
- rewrite inE mem_remgr ?mulHNB //; apply/imsetP/Dade_support1_TI => //.
- by apply/pred0Pn; exists g; apply/andP.
-rewrite (partition_big fBg (mem nBaL)) /= => [|x]; last by case/andP.
-apply: eq_bigr => b; case/setIP=> Nb aLb; rewrite mulr_natr -sumr_const.
-apply: eq_big => x; rewrite ![x \in _]inE -!andbA.
- apply: andb_id2l=> Gx; apply/and3P/idP=> [[Mgx _] /eqP <- | HBb_gx].
- by rewrite mem_rcoset mem_divgr ?mulHNB.
- suffices ->: fBg x = b.
- by rewrite inE Nb (subsetP _ _ HBb_gx) // -mulHNB mulgS ?sub1set.
- by rewrite /fBg; have [h Hh ->] := rcosetP HBb_gx; apply: remgrMid.
-move/and4P=> [_ Mgx _ /eqP def_fx].
-rewrite rDadeE // Mgx -/(fBg x) def_fx; case/imsetP: aLb => y Ly ->.
-by rewrite cfunJ // (subsetP sAL).
-Qed.
-
-(* This is Peterfalvi (2.10) *)
-Lemma Dade_expansion :
- aa^\tau = - \sum_(B in calB) (- 1) ^+ #|B| *: 'Ind[G, 'M(B)] 'aa_B.
-Proof.
-apply/cfunP=> g; rewrite !cfunElock sum_cfunE.
-pose n1 (B : {set gT}) : algC := (-1) ^+ #|B| / #|L : 'N_L(B)|%:R.
-pose aa1 B := ('Ind[G, 'M(B)] 'aa_B) g.
-have dBJ: {acts L, on calP | 'Js}.
- move=> x Lx /= B; rewrite !inE -!cards_eq0 cardJg.
- by rewrite -{1}(normsP nAL x Lx) conjSg.
-transitivity (- (\sum_(B in calP) n1 B * aa1 B)); last first.
- congr (- _); rewrite {1}(partition_big_imset (fun B => repr (B :^: L))) /=.
- apply: eq_bigr => B /imsetP[B1 dB1 defB].
- have B1L_B: B \in B1 :^: L by rewrite defB (mem_repr B1) ?orbit_refl.
- have{dB1} dB1L: {subset B1 :^: L <= calP}.
- by move=> _ /imsetP[x Lx ->]; rewrite dBJ.
- have dB: B \in calP := dB1L B B1L_B.
- rewrite (eq_bigl (mem (B :^: L))) => [|B2 /=]; last first.
- apply/andP/idP=> [[_ /eqP <-] | /orbit_trans/(_ B1L_B)-B1L_B2].
- by rewrite orbit_sym (mem_repr B2) ?orbit_refl.
- by rewrite [B2 :^: L](orbit_eqP B1L_B2) -defB dB1L.
- rewrite (eq_bigr (fun _ => n1 B * aa1 B)) => [|_ /imsetP[x Lx ->]].
- rewrite cfunE sumr_const -mulr_natr mulrAC card_orbit astab1Js divfK //.
- by rewrite pnatr_eq0 -lt0n indexg_gt0.
- rewrite /aa1 Dade_Ind_restr_J //; congr (_ * _).
- by rewrite /n1 cardJg -{1 2}(conjGid Lx) normJ -conjIg indexJg.
-case: pickP => /= [a /andP[Aa Ha_g] | notHAg]; last first.
- rewrite big1 ?oppr0 // /aa1 => B dB.
- have [->] := Dade_Ind_expansion g dB; first by rewrite mulr0.
- by apply/bigcupP=> [[a Aa Ha_g]]; case/andP: (notHAg a).
-pose P_ b := [set B in calP | b \in 'N_L(B)].
-pose aa2 B b : algC := #|calA g ('H(B) :* b)|%:R.
-pose nn2 (B : {set gT}) : algC := (-1) ^+ #|B| / #|'H(B)|%:R.
-pose sumB b := \sum_(B in P_ b) nn2 B * aa2 B b.
-transitivity (- aa a / #|L|%:R * \sum_(b in a ^: L) sumB b); last first.
- rewrite !mulNr; congr (- _).
- rewrite (exchange_big_dep (mem calP)) => [|b B _] /=; last by case/setIdP.
- rewrite big_distrr /aa1; apply: eq_bigr => B dB; rewrite -big_distrr /=.
- have [_ /(_ a) -> //] := Dade_Ind_expansion g dB; rewrite !mulrA.
- congr (_ * _); last by apply: eq_bigl => b; rewrite inE dB /= andbC -in_setI.
- rewrite -mulrA mulrCA -!mulrA; congr (_ * _).
- rewrite -invfM mulrCA -invfM -!natrM; congr (_ / _%:R).
- rewrite -(sdprod_card (Dade_set_sdprod dB)) mulnA mulnAC; congr (_ * _)%N.
- by rewrite mulnC Lagrange ?subsetIl.
-rewrite (eq_bigr (fun _ => sumB a)) /= => [|_ /imsetP[x Lx ->]]; last first.
- rewrite {1}/sumB (reindex_inj (@conjsg_inj _ x)) /=.
- symmetry; apply: eq_big => B.
- rewrite ![_ \in P_ _]inE dBJ //.
- by rewrite -{2}(conjGid Lx) normJ -conjIg memJ_conjg.
- case/setIdP=> dB Na; have [sBA _] := setIdP dB.
- have defHBx: 'H(B :^ x) = 'H(B) :^ x.
- rewrite /'H(_) (big_imset _ (in2W (conjg_inj x))) -bigcapJ /=.
- by apply: eq_bigr => b Bb; rewrite DadeJ ?(subsetP sBA).
- rewrite /nn2 /aa2 defHBx !cardJg; congr (_ * _%:R).
- rewrite -(card_rcoset _ x); apply: eq_card => y.
- rewrite !(inE, mem_rcoset, mem_conjg) conjMg conjVg conjgK -conjgM.
- by rewrite groupMr // groupV (subsetP sLG).
-rewrite sumr_const mulrC [sumB a](bigD1 [set a]) /=; last first.
- by rewrite 3!inE cent1id sub1set Aa -cards_eq0 cards1 (subsetP sAL).
-rewrite -[_ *+ _]mulr_natr -mulrA mulrDl -!mulrA ['H(_)]big_set1 cards1.
-have ->: aa2 [set a] a = #|'C_G[a]|%:R.
- have [u x Ha_ux Gx def_g] := imset2P Ha_g.
- rewrite -(card_lcoset _ x^-1); congr _%:R; apply: eq_card => y.
- rewrite ['H(_)]big_set1 mem_lcoset invgK inE def_g -conjgM.
- rewrite -(groupMl y Gx) inE; apply: andb_id2l => Gxy.
- by have [_ _ -> //] := normedTI_memJ_P (Dade_cover_TI Aa); rewrite inE Gxy.
-rewrite mulN1r mulrC mulrA -natrM -(sdprod_card (defCA Aa)).
-rewrite -mulnA card_orbit astab1J Lagrange ?subsetIl // mulnC natrM.
-rewrite mulrAC mulfK ?neq0CG // mulrC divfK ?neq0CG // opprK.
-rewrite (bigID [pred B : {set gT} | a \in B]) /= mulrDl addrA.
-apply: canRL (subrK _) _; rewrite -mulNr -sumrN; congr (_ + _ * _).
-symmetry.
-rewrite (reindex_onto (fun B => a |: B) (fun B => B :\ a)) /=; last first.
- by move=> B; case/andP=> _; apply: setD1K.
-symmetry; apply: eq_big => B.
- rewrite setU11 andbT -!andbA; apply/and3P/and3P; case.
- do 2![case/setIdP] => sBA ntB /setIP[La nBa] _ notBa.
- rewrite 3!inE subUset sub1set Aa sBA La setU1K // -cards_eq0 cardsU1 notBa.
- rewrite -sub1set normsU ?sub1set ?cent1id //= eq_sym eqEcard subsetUl /=.
- by rewrite cards1 cardsU1 notBa ltnS leqn0 cards_eq0.
- do 2![case/setIdP] => /subUsetP[_ sBA] _ /setIP[La].
- rewrite inE conjUg (normP (cent1id a)) => /subUsetP[_ sBa_aB].
- rewrite eq_sym eqEcard subsetUl cards1 (cardsD1 a) setU11 ltnS leqn0 /=.
- rewrite cards_eq0 => notB0 /eqP defB.
- have notBa: a \notin B by rewrite -defB setD11.
- split=> //; last by apply: contraNneq notBa => ->; apply: set11.
- rewrite !inE sBA La -{1 3}defB notB0 subsetD1 sBa_aB.
- by rewrite mem_conjg /(a ^ _) invgK mulgA mulgK.
-do 2![case/andP] => /setIdP[dB Na] _ notBa.
-suffices ->: aa2 B a = #|'H(B) : 'H(a |: B)|%:R * aa2 (a |: B) a.
- rewrite /nn2 cardsU1 notBa exprS mulN1r !mulNr; congr (- _).
- rewrite !mulrA; congr (_ * _); rewrite -!mulrA; congr (_ * _).
- apply: canLR (mulKf (neq0CG _)) _; apply: canRL (mulfK (neq0CG _)) _ => /=.
- by rewrite -natrM mulnC Lagrange //= Dade_setU1 ?subsetIl.
-rewrite /aa2 Dade_setU1 //= -natrM; congr _%:R.
-have defMB := Dade_set_sdprod dB; have [_ mulHNB nHNB tiHNB] := sdprodP defMB.
-have [sHMB sNMB] := mulG_sub mulHNB; have [La nBa] := setIP Na.
-have nHa: a \in 'N('H(B)) by rewrite (subsetP nHNB).
-have Ca: a \in 'C_L[a] by rewrite inE cent1id La.
-have [|/= partHBa nbHBa] := partition_cent_rcoset nHa.
- have [sBA] := setIdP dB; case/set0Pn=> b Bb; have Ab := subsetP sBA b Bb.
- rewrite (coprime_dvdr (order_dvdG Ca)) //= ['H(B)](bigD1 b) //=.
- by rewrite (coprimeSg (subsetIl _ _)) ?coHL.
-pose pHBa := mem ('H(B) :* a).
-rewrite -sum1_card (partition_big (fun x => g ^ x) pHBa) /= => [|x]; last first.
- by case/setIdP=> _ ->.
-rewrite (set_partition_big _ partHBa) /= -nbHBa -sum_nat_const.
-apply: eq_bigr => _ /imsetP[x Hx ->].
-rewrite (big_imset _ (in2W (conjg_inj x))) /=.
-rewrite -(card_rcoset _ x) -sum1_card; symmetry; set HBaa := 'C_(_)[a] :* a.
-rewrite (partition_big (fun y => g ^ (y * x^-1)) (mem HBaa)); last first.
- by move=> y; rewrite mem_rcoset => /setIdP[].
-apply: eq_bigr => /= u Ca_u; apply: eq_bigl => z.
-rewrite -(canF_eq (conjgKV x)) -conjgM; apply: andb_id2r; move/eqP=> def_u.
-have sHBG: 'H(B) \subset G.
- have [sBA /set0Pn[b Bb]] := setIdP dB; have Ab := subsetP sBA b Bb.
- by rewrite (bigcap_min b) ?sHG.
-rewrite mem_rcoset !inE groupMr ?groupV ?(subsetP sHBG x Hx) //=.
-congr (_ && _); have [/eqP defHBa _ _] := and3P partHBa.
-symmetry; rewrite def_u Ca_u -defHBa -(mulgKV x z) conjgM def_u -/HBaa.
-by rewrite cover_imset -class_supportEr mem_imset2.
-Qed.
-
-End DadeExpansion.
-
-(* This is Peterfalvi (2.6)(b) *)
-Lemma Dade_vchar alpha : alpha \in 'Z[irr L, A] -> alpha^\tau \in 'Z[irr G].
-Proof.
-rewrite [alpha \in _]zchar_split => /andP[Zaa CFaa].
-rewrite Dade_expansion // rpredN rpred_sum // => B dB.
-suffices calP_B: B \in calP.
- by rewrite rpredZsign cfInd_vchar // Dade_restriction_vchar.
-case/imsetP: dB => B0 /setIdP[sB0A notB00] defB.
-have [x Lx ->]: exists2 x, x \in L & B = B0 :^ x.
- by apply/imsetP; rewrite defB (mem_repr B0) ?orbit_refl.
-by rewrite inE -cards_eq0 cardJg cards_eq0 -(normsP nAL x Lx) conjSg sB0A.
-Qed.
-
-(* This summarizes Peterfalvi (2.6). *)
-Lemma Dade_Zisometry : {in 'Z[irr L, A], isometry Dade, to 'Z[irr G, G^#]}.
-Proof.
-split; first by apply: sub_in2 Dade_isometry; apply: zchar_on.
-by move=> phi Zphi; rewrite /= zchar_split Dade_vchar ?Dade_cfun.
-Qed.
-
-End Two.
-
-Section RestrDade.
-
-Variables (gT : finGroupType) (G L : {group gT}) (A A1 : {set gT}).
-Hypothesis ddA : Dade_hypothesis G L A.
-Hypotheses (sA1A : A1 \subset A) (nA1L : L \subset 'N(A1)).
-Let ssA1A := subsetP sA1A.
-
-(* This is Peterfalvi (2.11), first part. *)
-Lemma restr_Dade_hyp : Dade_hypothesis G L A1.
-Proof.
-have [/andP[sAL nAL] notA_1 sLG conjAG [H defCa coHL]] := ddA.
-have nsA1L: A1 <| L by rewrite /normal (subset_trans sA1A).
-split; rewrite ?(contra (@ssA1A _)) //; first exact: sub_in2 conjAG.
-by exists H; [apply: sub_in1 defCa | apply: sub_in2 coHL].
-Qed.
-Local Notation ddA1 := restr_Dade_hyp.
-
-Local Notation H dd := (Dade_signalizer dd).
-Lemma restr_Dade_signalizer H1 : {in A, H ddA =1 H1} -> {in A1, H ddA1 =1 H1}.
-Proof.
-move=> defH1; apply: def_Dade_signalizer => a /ssA1A Aa.
-by rewrite -defH1 ?Dade_sdprod.
-Qed.
-
-Lemma restr_Dade_support1 : {in A1, Dade_support1 ddA1 =1 Dade_support1 ddA}.
-Proof.
-by move=> a A1a; rewrite /Dade_support1 (@restr_Dade_signalizer (H ddA)).
-Qed.
-
-Lemma restr_Dade_support :
- Dade_support ddA1 = \bigcup_(a in A1) Dade_support1 ddA a.
-Proof. by rewrite -(eq_bigr _ restr_Dade_support1). Qed.
-
-Definition restr_Dade := Dade ddA1.
-
-(* This is Peterfalvi (2.11), second part. *)
-Lemma restr_DadeE : {in 'CF(L, A1), restr_Dade =1 Dade ddA}.
-Proof.
-move=> aa CF1aa; apply/cfunP=> g; rewrite cfunElock.
-have CFaa: aa \in 'CF(L, A) := cfun_onS sA1A CF1aa.
-have [a /= /andP[A1a Ha_g] | no_a /=] := pickP.
- by apply/esym/DadeE; rewrite -1?restr_Dade_support1 ?ssA1A.
-rewrite cfunElock; case: pickP => //= a /andP[_ Ha_g].
-rewrite (cfun_on0 CF1aa) //; apply: contraFN (no_a a) => A1a.
-by rewrite A1a restr_Dade_support1.
-Qed.
-
-End RestrDade.
-
-Section NormedTI.
-
-Variables (gT : finGroupType) (G L : {group gT}) (A : {set gT}).
-Hypotheses (tiAG : normedTI A G L) (sAG1 : A \subset G^#).
-
-(* This is the existence part of Peterfalvi (2.3). *)
-Lemma normedTI_Dade : Dade_hypothesis G L A.
-Proof.
-have [[sAG notA1] [_ _ /eqP defL]] := (subsetD1P sAG1, and3P tiAG).
-have [_ sLG tiAG_L] := normedTI_memJ_P tiAG.
-split=> // [|a b Aa Ab /imsetP[x Gx def_b]|].
-- rewrite /(A <| L) -{2}defL subsetIr andbT; apply/subsetP=> a Aa.
- by rewrite -(tiAG_L a) ?(subsetP sAG) // conjgE mulKg.
-- by rewrite def_b mem_imset // -(tiAG_L a) -?def_b.
-exists (fun _ => 1%G) => [a Aa | a b _ _]; last by rewrite cards1 coprime1n.
-by rewrite sdprod1g -(setIidPl sLG) -setIA (setIidPr (cent1_normedTI tiAG Aa)).
-Qed.
-
-Let def_ddA := Dade_Ind normedTI_Dade tiAG.
-
-(* This is the identity part of Isaacs, Lemma 7.7. *)
-Lemma normedTI_Ind_id1 :
- {in 'CF(L, A) & 1%g |: A, forall alpha, 'Ind[G] alpha =1 alpha}.
-Proof. by move=> aa a CFaa A1a; rewrite /= -def_ddA // Dade_id1. Qed.
-
-(* A more restricted, but more useful form. *)
-Lemma normedTI_Ind_id :
- {in 'CF(L, A) & A, forall alpha, 'Ind[G] alpha =1 alpha}.
-Proof. by apply: sub_in11 normedTI_Ind_id1 => //; apply/subsetP/subsetUr. Qed.
-
-(* This is the isometry part of Isaacs, Lemma 7.7. *)
-(* The statement in Isaacs is slightly more general in that it allows for *)
-(* beta \in 'CF(L, 1%g |: A); this appears to be more cumbersome than useful. *)
-Lemma normedTI_isometry : {in 'CF(L, A) &, isometry 'Ind[G]}.
-Proof. by move=> aa bb CFaa CFbb; rewrite /= -!def_ddA // Dade_isometry. Qed.
-
-End NormedTI. \ No newline at end of file
diff --git a/mathcomp/odd_order/PFsection3.v b/mathcomp/odd_order/PFsection3.v
deleted file mode 100644
index e229772..0000000
--- a/mathcomp/odd_order/PFsection3.v
+++ /dev/null
@@ -1,1864 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime ssralg matrix poly finset.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action finalg zmodp.
-From mathcomp
-Require Import gfunctor center gproduct cyclic pgroup abelian frobenius.
-From mathcomp
-Require Import mxalgebra mxrepresentation vector falgebra fieldext galois.
-From mathcomp
-Require Import ssrnum rat algC algnum classfun character.
-From mathcomp
-Require Import integral_char inertia vcharacter.
-From mathcomp
-Require Import PFsection1 PFsection2.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 3: TI-Subsets with Cyclic Normalizers *)
-(******************************************************************************)
-(* Given a direct product decomposition defW : W1 \x W2 = W, we define here: *)
-(* cyclicTIset defW == the set complement of W1 and W2 in W; this *)
-(* (locally) V definition is usually Let-bound to V. *)
-(* := W :\: (W1 :|: W2). *)
-(* cyclicTI_hypothesis G defW <-> W is a cyclic of odd order that is the *)
-(* normaliser in G of its non-empty TI subset *)
-(* V = cyclicTIset defW = W :\: (W1 :|: W2). *)
-(* -> This is Peterfalvi, Hypothesis (3.1), or Feit-Thompson (13.1). *)
-(* cyclicTIirr defW i j == the irreducible character of W coinciding with *)
-(* (locally) w_ i j chi_i and 'chi_j on W1 and W2, respectively. *)
-(* This notation is usually Let-bound to w_ i j. *)
-(* := 'chi_(dprod_Iirr defW (i, j)). *)
-(* cfCyclicTIset defW i j == the virtual character of 'Z[irr W, V] coinciding *)
-(* (locally) alpha_ i j with 1 - chi_i and 1 - 'chi_j on W1 and W2, *)
-(* respectively. This definition is denoted by *)
-(* alpha_ i j in this file, and is only used in the *)
-(* proof if Peterfalvi (13.9) in the sequel. *)
-(* := cfDprod defW (1 - 'chi_i) (1 - 'chi_j). *)
-(* = 1 - w_ i 0 - w_ 0 j + w_ i j. *)
-(* cfCyclicTIsetBase defW := the tuple of all the alpha_ i j, for i, j != 0. *)
-(* (locally) cfWVbase This is a basis of 'CF(W, V); this definition is *)
-(* not used outside this file. *)
-(* For ctiW : cyclicTI_hypothesis defW G we also define *)
-(* cyclicTIiso ctiW == a linear isometry from 'CF(W) to 'CF(G) that *)
-(* (locally) sigma that extends induction on 'CF(W, V), maps the *)
-(* w_ i j to virtual characters, and w_ 0 0 to 1. *)
-(* This definition is usually Let-bound to sigma, *)
-(* and only depends extensionally on W, V and G. *)
-(* (locally) eta_ i j := sigma (w_ i j), as in sections 13 and 14 of *)
-(* tha Peterfalv text. *)
-(* cyclicTI_NC ctiW phi == the number of eta_ i j constituents of phi. *)
-(* (locally) NC phi := #|[set ij | '[phi, eta_ ij .1 ij.2] != 0]|. *)
-(* The construction of sigma involves a large combinatorial proof, for which *)
-(* it is worthwhile to use reflection techniques to automate mundane and *)
-(* repetitive arguments. We isolate the necessary boilerplate in a separate *)
-(* CyclicTIisoReflexion module. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory Num.Theory.
-Local Open Scope ring_scope.
-
-Section Definitions.
-
-Variables (gT : finGroupType) (G W W1 W2 : {set gT}).
-
-Definition cyclicTIset of W1 \x W2 = W := W :\: (W1 :|: W2).
-
-Definition cyclicTI_hypothesis (defW : W1 \x W2 = W) :=
- [/\ cyclic W, odd #|W| & normedTI (cyclicTIset defW) G W].
-
-End Definitions.
-
-(* These is defined as a Notation which clients can bind with a Section Let *)
-(* that can be folded easily. *)
-Notation cyclicTIirr defW i j := 'chi_(dprod_Iirr defW (i, j)).
-
-Module CyclicTIisoReflexion.
-
-(******************************************************************************)
-(* Support for carrying out the combinatorial parts of the proof of Theorem *)
-(* (3.5) by reflection. Specifically, we need to show that in a rectangular *)
-(* array of virtual characters of norm 3, of even dimensions, and such that *)
-(* the dot product of two entries is 1 if they are on the same row or column, *)
-(* the entries of each column contain a "pivot" normal virtual character *)
-(* orthogonal to all other columns. The proof never needs to consider more *)
-(* than a 4 x 2 rectangle, but frequently renumbers lines, columns and *)
-(* orthonormal components in order to do so. *)
-(* We want to use reflection to automate this renumbering; we also want to *)
-(* automate the evaluation of the dot product constaints for partially *)
-(* described entries of the matrix. *)
-(* To do so we define a "theory" data structure to store a reifed form of *)
-(* such partial descriptions: a set of "clauses", each consisting in an index *)
-(* (i, j) into the array, and a collection of "literals" (k, v) representing *)
-(* constraints '[b_(i, j), x`_k] = v%:~R, with v = 0, 1 or -1. A clause with *)
-(* exactly three nonzero literals defines b_(i, j) exactly. *)
-(* We define special notation for the concrete instances that appear in *)
-(* reflected proofs; for example *)
-(* |= & b11 = -x1 + x2 + x3 & x1, ~x2 in b12 & ? in b31 *)
-(* denotes the "theory" of arrays whose two left entries decomposes into *)
-(* x1 + x2 + x3 for some orthonormal x1, x2, and x3, such that the second top *)
-(* entry has x1 is a signed component but is orthogonal to x2, and which have *)
-(* an (unconstrained) first entry in the third column. (The concrete encoding *)
-(* shifts indices to start at 0.) *)
-(* The "models" in which such theories are interpreted supply the dimensions *)
-(* of the array, which must be even, nonequal and at least 2, the function *)
-(* mapping indices to array entries, which must be virtual characters with *)
-(* the requisite norms and dot products, and an orthonormal sequence of *)
-(* virtual characters that will be used to interpret the xij; a model coerces *)
-(* to any of these three components. *)
-(* We are primarily interested in two predicates: *)
-(* sat m th <=> the interpretation of th in m is well-defined (no out of *)
-(* bound indices) and valid (all constraints true). *)
-(* unsat th <-> forall m, ~ sat m th *)
-(* While the main theorem of this section, column_pivot, can be seen as an *)
-(* instance of "sat", all the principal combinatorial lemmas use "unsat", *)
-(* whose universal quantifier allows symmetry reductions. We present the set *)
-(* of lemmas implementing reflection-assisted proofs of "unsat th" as a small *)
-(* domain-specific proof language consisting of the following tactics: *)
-(* consider bij ::= add a clause for bij, which must not appear in th, *)
-(* changing the goal to unsat th & ? in bij. *)
-(* bij must be within a 4 x 2 bounding box, and th *)
-(* must be symmetric if bij "breaks" the 2 x 2 box. *)
-(* fill bij ::= add an x(k.+1) literal to the bij clause in th, *)
-(* where x1, ..., xk are all the normal characters *)
-(* appearing in th, and the clause for bij exists and *)
-(* contains assumptions for all of x1, ..., xk, at *)
-(* two of which are nonzero. *)
-(* uwlog Dcl: cl [by tac] ::= add the clause cl to th, replacing an existing *)
-(* clause for the same matrix entry. This produces a *)
-(* side goal of unsat th, but with an additional *)
-(* assumption Dcl : unsat th+cl, which can be resolved *)
-(* with the optional "by tac". *)
-(* uhave lit in bij as T(ij, kl) ::= adds the literal lit (one of xk, -xk, or *)
-(* ~xk) to an existing clause for bij in th, using the *)
-(* reflection lemma T(ij, kl) to rule out the other *)
-(* possibilities for xk. Here T can be either O *)
-(* (general dot product evaluation) or L (specific *)
-(* line/column constraints following from (3.5.2)). *)
-(* uhave lit, lit' in bij as T(ij, kl) ::= adds both lit and lit'. *)
-(* uhave lit | lit' in bij as T(ij, kl) ::= produces two subgoals, where lit *)
-(* (resp. lit') is added to the ... in bij clause in *)
-(* th, using T(ij, kl) to eliminate the third literal. *)
-(* (lit and lit' must constrain the same component). *)
-(* uhave lit | lit' | lit'' in bij ::= produces three subgoals, where lit *)
-(* (resp. lit', lit'') is added to the bij clause in *)
-(* th; lit, lit', lit'' should be a permutation of xk, *)
-(* -xk, and ~xk for some k. *)
-(* uwlog Ebij: lit | lit' in bij as T(ij, kl) ::= adds lit to the bij clause *)
-(* in th, but produces a side goal where lit' has been *)
-(* added instead, with an additional assumption *)
-(* Ebij: th + (lit in bij); T(ij, kl) is used to rule *)
-(* out the third value. *)
-(* counter to T(ij, kl) ::= use T(ij, kl) to conclude that unsat th. *)
-(* uexact Hth' ::= use Hth' : unsat th', where th' is a subset of th *)
-(* (with the same order of literals) to conclude. *)
-(* symmetric to Hth' ::= use Hth' : unsat th', where th' is a permutation *)
-(* of a subset of th (preserving columns, and with at *)
-(* most one row exchange) to conclude. *)
-(******************************************************************************)
-
-Import ssrint.
-
-(* Clause left-hand side, a reference to a value of beta; in the reference *)
-(* model m, (i, j) stands for beta_ (inord i.+1) (inord j.+1). *)
-Definition ref := (nat * nat)%type.
-Implicit Type ij : ref.
-Definition Ref b_ij : ref := edivn (b_ij - 11) 10. (* Ref 21 = (1, 0). *)
-Notation "''b' ij" := (Ref ij) (at level 0, ij at level 0, format "''b' ij").
-Notation b11 := 'b11. Notation b12 := 'b12.
-Notation b21 := 'b21. Notation b22 := 'b22.
-Notation b31 := 'b31. Notation b32 := 'b32.
-Notation b41 := 'b41. Notation b42 := 'b42.
-
-Definition bbox := (nat * nat)%type. (* bounding box for refs. *)
-Implicit Type bb : bbox.
-Identity Coercion pair_of_bbox : bbox >-> prod.
-
-Definition sub_bbox bb1 bb2 := (bb1.1 <= bb2.1)%N && (bb1.2 <= bb2.2)%N.
-Definition wf_ref bb := [pred ij : ref | (ij.1 < bb.1)%N && (ij.2 < bb.2)%N].
-Definition dot_ref ij1 ij2 := ((ij1.1 == ij2.1).+1 * (ij1.2 == ij2.2).+1 - 1)%N.
-
-Lemma bbox_refl bb : sub_bbox bb bb. Proof. exact/andP. Qed.
-
-(* Clause right-hand side litteral, denoting the projection of the left-hand *)
-(* side on an irreducible character of G: in a valid model m, (k, v) stands *)
-(* for the component m`_k *~ v = (model_xi m)`_k, and for the projection *)
-(* constraint '[m i j, m`_k] == v%:~R. *)
-Definition lit := (nat * int)%type. (* +x1 = (0,1) ~x2 = (1,0) -x3 = (2, -1) *)
-Implicit Types (kv : lit) (kvs : seq lit).
-Definition Lit k1 v : lit := if (0 + k1)%N is k.+1 then (k, v) else (k1, v).
-Notation "+x k" := (Lit k 1) (at level 0, k at level 0, format "+x k").
-Notation "-x k" := (Lit k (-1)) (at level 0, k at level 0, format "-x k").
-Notation "~x k" := (Lit k 0) (at level 0, k at level 0, format "~x k").
-Notation x1 := +x1. Notation x2 := +x2.
-Notation x3 := +x3. Notation x4 := +x4.
-Notation x5 := +x5. Notation x6 := +x6.
-Notation x7 := +x7. Notation x8 := +x8.
-
-Definition AndLit kvs kv := kv :: kvs.
-Definition AddLit := AndLit.
-Notation "(*dummy*)" := (Prop Prop) (at level 0) : defclause_scope.
-Arguments AddLit _%defclause_scope _.
-Infix "+" := AddLit : defclause_scope.
-Definition SubLit kvs kv := AddLit kvs (kv.1, - kv.2).
-Arguments SubLit _%defclause_scope _.
-Infix "-" := SubLit : defclause_scope.
-Coercion LastLit kv := [:: kv].
-
-Fixpoint norm_cl kvs : nat :=
- (if kvs is (_, v) :: kvs1 then `|v| ^ 2 + norm_cl kvs1 else 0)%N.
-
-Definition clause := (ref * seq lit)%type.
-Implicit Type cl : clause.
-Definition Clause ij kvs : clause := (ij, kvs).
-Notation "& kv1 , .. , kvn 'in' ij" :=
- (Clause ij (AndLit .. (AndLit nil kv1) .. kvn))
- (at level 200, ij, kv1, kvn at level 0,
- format "& kv1 , .. , kvn 'in' ij").
-Notation "& ? 'in' ij" := (Clause ij nil)
- (at level 200, ij at level 0, format "& ? 'in' ij").
-Definition DefClause := Clause.
-Arguments DefClause _ _%defclause_scope.
-Notation "& ij = kvs" := (DefClause ij kvs)
- (at level 200, ij at level 0, format "& ij = kvs").
-
-Definition theory := seq clause.
-Implicit Type th : theory.
-Definition AddClause th cl : theory := cl :: th.
-Notation "|= cl1 .. cln" := (AddClause .. (AddClause nil cl1) .. cln)
- (at level 8, cl1, cln at level 200,
- format "|= '[hv' cl1 '/' .. '/' cln ']'").
-
-(* Transpose (W1 / W2 symmetry). *)
-
-Definition tr (ij : nat * nat) : ref := (ij.2, ij.1).
-Definition tr_th th : theory := [seq (tr cl.1, cl.2) | cl <- th].
-
-Lemma trK : involutive tr. Proof. by case. Qed.
-Lemma tr_thK : involutive tr_th. Proof. by apply: mapK => [[[i j] kvs]]. Qed.
-
-(* Index range of a theory. *)
-
-Fixpoint th_bbox th : bbox :=
- if th is (i, j, _) :: th1 then
- let: (ri, rj) := th_bbox th1 in (maxn i.+1 ri, maxn j.+1 rj)
- else (0, 0)%N.
-
-Lemma th_bboxP th bb :
- reflect {in th, forall cl, cl.1 \in wf_ref bb} (sub_bbox (th_bbox th) bb).
-Proof.
-pose in_bb := [pred cl : clause | cl.1 \in wf_ref bb].
-suffices ->: sub_bbox (th_bbox th) bb = all in_bb th by apply: allP.
-elim: th => [|[[i j] _] th] //=; case: (th_bbox th) => ri rj /=.
-by rewrite /sub_bbox /= !geq_max andbACA => ->.
-Qed.
-Arguments th_bboxP [th bb].
-
-Fixpoint th_dim th : nat :=
- if th is (_, kvs) :: th1 then
- foldr (fun kv => maxn kv.1.+1) (th_dim th1) kvs
- else 0%N.
-
-Lemma th_dimP th bk :
- reflect {in th, forall cl, {in cl.2, forall kv, kv.1 < bk}}%N
- (th_dim th <= bk)%N.
-Proof.
-pose in_bk := [pred cl : clause | all (fun kv => kv.1 < bk)%N cl.2].
-suffices ->: (th_dim th <= bk)%N = all in_bk th.
- by apply: (iffP allP) => bk_th cl /bk_th/allP.
-elim: th => // [[_ kvs] th /= <-]; elim: kvs => //= kv kvs.
-by rewrite -andbA geq_max => ->.
-Qed.
-Arguments th_dimP [th bk].
-
-(* Theory and clause lookup. *)
-
-CoInductive get_spec T (P : T -> Prop) (Q : Prop) : option T -> Prop :=
- | GetSome x of P x : get_spec P Q (Some x)
- | GetNone of Q : get_spec P Q None.
-
-Fixpoint get_cl ij (th : theory) : option clause :=
- if th is cl :: th1 then if cl.1 == ij then Some cl else get_cl ij th1
- else None.
-
-Lemma get_clP ij (th : theory) :
- get_spec (fun cl : clause => cl \in th /\ cl.1 = ij) True (get_cl ij th).
-Proof.
-elim: th => /= [|cl th IHth]; first by right.
-case: eqP => [Dij | _]; first by left; rewrite ?mem_head.
-by case: IHth => [cl1 [th_cl1 Dij]|]; constructor; rewrite // mem_behead.
-Qed.
-
-Fixpoint get_lit (k0 : nat) kvs : option int :=
- if kvs is (k, v) :: kvs1 then if k == k0 then Some v else get_lit k0 kvs1
- else None.
-
-Lemma get_litP k0 kvs :
- get_spec (fun v => (k0, v) \in kvs) (k0 \notin unzip1 kvs) (get_lit k0 kvs).
-Proof.
-elim: kvs => [|[k v] kvs IHkvs /=]; [by right | rewrite inE eq_sym].
-have [-> | k'0] := altP eqP; first by left; rewrite ?mem_head.
-by have [v0 kvs_k0v | kvs'k0] := IHkvs; constructor; rewrite // mem_behead.
-Qed.
-
-(* Theory extension. *)
-
-Fixpoint set_cl cl2 th : wrapped theory :=
- if th is cl :: th1 then
- let: Wrap th2 := set_cl cl2 th1 in
- if cl.1 == cl2.1 then Wrap (AddClause th2 cl2) else Wrap (AddClause th2 cl)
- else Wrap nil.
-
-Definition ext_cl th cl k v :=
- let: (ij, kvs) := cl in set_cl (Clause ij (AndLit kvs (Lit k.+1 v))) th.
-
-Definition wf_ext_cl cl k rk := (k \notin unzip1 cl.2) && (k < rk)%N.
-
-Definition wf_fill k kvs := (size kvs == k) && (norm_cl kvs < 3)%N.
-
-Lemma ext_clP cl1 th k v (cl1k := (cl1.1, (k, v) :: cl1.2)) :
- cl1 \in th ->
- exists2 th1, ext_cl th cl1 k v = Wrap th1
- & cl1k \in th1
- /\ th1 =i [pred cl | if cl.1 == cl1.1 then cl == cl1k else cl \in th].
-Proof.
-case: cl1 => ij kvs /= in cl1k * => th_cl1; set th1p := [pred cl | _].
-pose th1 := [seq if cl.1 == ij then cl1k else cl | cl <- th].
-exists th1; first by elim: (th) @th1 => //= cl th' ->; rewrite -2!fun_if.
-suffices Dth1: th1 =i th1p by rewrite Dth1 !inE !eqxx.
-move=> cl; rewrite inE; apply/mapP/idP=> [[{cl}cl th_cl ->] | ].
- by case cl_ij: (cl.1 == ij); rewrite ?eqxx ?cl_ij.
-case: ifP => [_ /eqP-> | cl'ij th_cl]; last by exists cl; rewrite ?cl'ij.
-by exists (ij, kvs); rewrite ?eqxx.
-Qed.
-
-(* Satisfiability tests. *)
-
-Definition sat_test (rO : rel clause) ij12 th :=
- if get_cl (Ref ij12.1) th is Some cl1 then
- oapp (rO cl1) true (get_cl (Ref ij12.2) th)
- else true.
-
-(* This reflects the application of (3.5.1) for an arbitrary pair of entries. *)
-Definition Otest cl1 cl2 :=
- let: (ij1, kvs1) := cl1 in let: (ij2, kvs2) := cl2 in
- let fix loop s1 s2 kvs2 :=
- if kvs2 is (k, v2) :: kvs2 then
- if get_lit k kvs1 is Some v1 then loop (v1 * v2 + s1) s2 kvs2 else
- loop s1 s2.+1 kvs2
- else (s1, if norm_cl kvs1 == 3 then 0%N else s2) in
- let: (s1, s2) := loop 0 0%N kvs2 in
- (norm_cl kvs2 == 3) ==> (`|s1 - dot_ref ij1 ij2| <= s2)%N.
-
-(* Matching up to a permutation of the rows, columns, and base vectors. *)
-
-Definition sub_match th1 th2 :=
- let match_cl cl1 cl2 :=
- if cl2.1 == cl1.1 then subseq cl1.2 cl2.2 else false in
- all [pred cl1 | has (match_cl cl1) th2] th1.
-
-Definition wf_consider ij th (ri := (th_bbox th).1) :=
- (ij.1 < 2 + ((2 < ri) || sub_match th (tr_th th)).*2)%N && (ij.2 < 2)%N.
-
-CoInductive sym := Sym (si : seq nat) (sj : seq nat) (sk : seq nat).
-
-Definition sym_match s th1 th2 :=
- let: Sym si sj sk := s in let: (ri, rj, rk) := (th_bbox th1, th_dim th1) in
- let is_sym r s := uniq s && all (gtn r) s in
- let match_cl cl2 :=
- let: (i2, j2, kvs2) := cl2 in let ij := (nth ri si i2, nth rj sj j2) in
- let match_lit kvs1 kv := (nth rk sk kv.1, kv.2) \in kvs1 in
- let match_cl1 cl1 :=
- let: (ij1, kvs1) := cl1 in (ij1 == ij) && all (match_lit kvs1) kvs2 in
- uniq (unzip1 kvs2) && has match_cl1 th1 in
- [&& is_sym ri si, is_sym rj sj, is_sym rk sk & all match_cl th2].
-
-(* Try to compute the base vector permutation for a given row and column *)
-(* permutation. We assume each base vector is determined by the entries of *)
-(* which it is a proper constituent, and that there are at most two columns. *)
-Definition find_sym_k th1 th2 (si sj : seq nat) :=
- let store_lit c kv ksig :=
- let: (k, v) := kv in if v == 0 then ksig else let cv := (c, v) in
- let fix insert_in (cvs : seq (nat * int)) :=
- if cvs is cv' :: cvs' then
- if (c < cv'.1)%N then cv :: cvs else cv' :: insert_in cvs'
- else [:: cv] in
- set_nth nil ksig k (insert_in (nth nil ksig k)) in
- let fix read_lit ksig1 ksig2 :=
- if ksig1 is cvs :: ksig1' then
- let k := index cvs ksig2 in
- k :: read_lit ksig1' (set_nth nil ksig2 k nil)
- else nil in
- let fix store2 ksig1 ksig2 cls1 :=
- if cls1 is (i1, j1, kvs1) :: cls1' then
- if get_cl (nth 0 si i1, nth 0 sj j1)%N th2 is Some (_, kvs2) then
- let st_kvs := foldr (store_lit (i1.*2 + j1)%N) in (* assume j1 <= 1 *)
- store2 (st_kvs ksig1 kvs1) (st_kvs ksig2 kvs2) cls1'
- else None
- else
- let sk := read_lit ksig1 ksig2 in
- if all (gtn (size ksig2)) sk then Some (Sym si sj sk) else None in
- store2 nil nil th1.
-
-(* Try to find a symmetry that maps th1 to th2, assuming the same number of *)
-(* rows and columns, and considering at most one row exchange. *)
-Definition find_sym th1 th2 :=
- let: (ri, rj) := th_bbox th2 in let si := iota 0 ri in let sj := iota 0 rj in
- if find_sym_k th1 th2 si sj is Some _ as s then s else
- let fix loop m :=
- if m is i.+1 then
- let fix inner_loop m' :=
- if m' is i'.+1 then
- let si' := (set_nth 0 (set_nth 0 si i i') i' i)%N in
- if find_sym_k th1 th2 si' sj is Some _ as s then s else inner_loop i'
- else None in
- if inner_loop i is Some _ as s then s else loop i
- else None in
- loop ri.
-
-Section Interpretation.
-
-Variables (gT : finGroupType) (G : {group gT}).
-
-Definition is_Lmodel bb b :=
- [/\ [/\ odd bb.1.+1, odd bb.2.+1, bb.1 > 1, bb.2 > 1 & bb.1 != bb.2]%N,
- forall ij, b ij \in 'Z[irr G]
- & {in wf_ref bb &, forall ij1 ij2, '[b ij1, b ij2] = (dot_ref ij1 ij2)%:R}].
-
-Definition is_Rmodel X := orthonormal X /\ {subset X <= 'Z[irr G]}.
-
-Inductive model := Model bb f X of is_Lmodel bb f & is_Rmodel X.
-
-Coercion model_bbox m := let: Model d _ _ _ _ := m in d.
-Definition model_entry m := let: Model _ f _ _ _ := m in f.
-Coercion model_entry : model >-> Funclass.
-Coercion model_basis m := let: Model _ _ X _ _ := m in X.
-Lemma LmodelP (m : model) : is_Lmodel m m. Proof. by case: m. Qed.
-Lemma RmodelP (m : model) : is_Rmodel m. Proof. by case: m. Qed.
-
-Fact nil_RmodelP : is_Rmodel nil. Proof. by []. Qed.
-
-Definition eval_cl (m : model) kvs := \sum_(kv <- kvs) m`_kv.1 *~ kv.2.
-
-Definition sat_lit (m : model) ij kv := '[m ij, m`_kv.1] == kv.2%:~R.
-Definition sat_cl m cl := uniq (unzip1 cl.2) && all (sat_lit m cl.1) cl.2.
-
-Definition sat (m : model) th :=
- [&& sub_bbox (th_bbox th) m, th_dim th <= size m & all (sat_cl m) th]%N.
-Definition unsat th := forall m, ~ sat m th.
-
-Lemma satP (m : model) th :
- reflect {in th, forall cl,
- [/\ cl.1 \in wf_ref m, uniq (unzip1 cl.2)
- & {in cl.2, forall kv, kv.1 < size m /\ sat_lit m cl.1 kv}%N]}
- (sat m th).
-Proof.
-apply: (iffP and3P) => [[/th_bboxP thbP /th_dimP thdP /allP thP] cl th_cl |thP].
- have /andP[-> clP] := thP _ th_cl; split=> // [|kv cl_kv]; first exact: thbP.
- by rewrite (thdP _ th_cl) ?(allP clP).
-split; first by apply/th_bboxP=> cl /thP[].
- by apply/th_dimP=> cl /thP[_ _ clP] kv /clP[].
-by apply/allP=> cl /thP[_ Ucl clP]; rewrite /sat_cl Ucl; apply/allP=> kv /clP[].
-Qed.
-Arguments satP [m th].
-
-(* Reflexion of the dot product. *)
-
-Lemma norm_clP m th cl :
- sat m th -> cl \in th ->
- let norm := norm_cl cl.2 in let beta := m cl.1 in
- [/\ (norm <= 3)%N, norm == 3 -> beta = eval_cl m cl.2
- & (norm < 3)%N -> size cl.2 == size m ->
- exists2 dk, dk \in dirr_constt beta & orthogonal (dchi dk) m].
-Proof.
-case: cl => ij kvs /satP thP /thP[wf_ij Uks clP] norm beta.
-have [[_ ZmL Dm] [o1m ZmR]] := (LmodelP m, RmodelP m).
-set ks := unzip1 kvs in Uks; pose Aij := [seq m`_k | k <- ks].
-have lt_ks k: k \in ks -> (k < size m)%N by case/mapP=> kv /clP[ltk _] ->.
-have sAm: {subset Aij <= (m : seq _)}
- by move=> _ /mapP[k /lt_ks ltk ->]; rewrite mem_nth.
-have o1Aij: orthonormal Aij.
- have [Um _] := orthonormalP o1m; apply: sub_orthonormal o1m => //.
- rewrite map_inj_in_uniq // => k1 k2 /lt_ks ltk1 /lt_ks ltk2 /eqP.
- by apply: contraTeq; rewrite nth_uniq.
-have [X AijX [Y [defXY oXY oYij]]] := orthogonal_split Aij beta.
-have{AijX} defX: X = \sum_(xi <- Aij) '[beta, xi] *: xi.
- have [_ -> ->] := orthonormal_span o1Aij AijX; apply: eq_big_seq => xi CFxi.
- by rewrite defXY cfdotDl (orthoPl oYij) ?addr0.
-have ->: eval_cl m kvs = X.
- rewrite {}defX !big_map; apply: eq_big_seq => kv /clP[_ /eqP->].
- by rewrite scaler_int.
-rewrite -leC_nat -ltC_nat -eqC_nat /=.
-have <-: '[beta] = 3%:R by rewrite Dm // /dot_ref !eqxx.
-have <-: '[X] = norm%:R.
- rewrite {}defX {}/norm cfnorm_sum_orthonormal // {o1Aij oYij sAm}/Aij.
- transitivity (\sum_(kv <- kvs) `|kv.2%:~R| ^+ 2 : algC).
- by rewrite !big_map; apply: eq_big_seq => kv /clP[_ /eqP->].
- rewrite unlock /=; elim: (kvs) => //= [[k v] kvs' ->].
- by rewrite -intr_norm -natrX -natrD.
-rewrite defXY cfnormDd //; split; first by rewrite ler_paddr ?cfnorm_ge0.
- by rewrite eq_sym addrC -subr_eq0 addrK cfnorm_eq0 => /eqP->; rewrite addr0.
-have{ZmL} Zbeta: beta \in 'Z[irr G] by apply: ZmL.
-have Z_X: X \in 'Z[irr G].
- rewrite defX big_seq rpred_sum // => xi /sAm/ZmR Zxi.
- by rewrite rpredZ_Cint ?Cint_cfdot_vchar.
-rewrite -ltr_subl_addl subrr cnorm_dconstt; last first.
- by rewrite -[Y](addKr X) -defXY addrC rpredB.
-have [-> | [dk Ydk] _ /eqP sz_kvs] := set_0Vmem (dirr_constt Y).
- by rewrite big_set0 ltrr.
-have Dks: ks =i iota 0 (size m).
- have: {subset ks <= iota 0 (size m)} by move=> k /lt_ks; rewrite mem_iota.
- by case/leq_size_perm=> //; rewrite size_iota size_map sz_kvs.
-suffices o_dk_m: orthogonal (dchi dk) m.
- exists dk; rewrite // dirr_consttE defX cfdotDl cfdot_suml.
- rewrite big1_seq ?add0r -?dirr_consttE // => xi /sAm CFxi.
- by rewrite cfdotC cfdotZr (orthoPl o_dk_m) // mulr0 conjC0.
-apply/orthoPl=> _ /(nthP 0)[k ltk <-]; have [Um o_m] := orthonormalP o1m.
-have Z1k: m`_k \in dirr G by rewrite dirrE ZmR ?o_m ?eqxx ?mem_nth.
-apply: contraTeq Ydk => /eqP; rewrite dirr_consttE cfdot_dirr ?dirr_dchi //.
-have oYm: '[Y, m`_k] = 0 by rewrite (orthoPl oYij) ?map_f // Dks mem_iota.
-by do 2?case: eqP => [-> | _]; rewrite // ?cfdotNr oYm ?oppr0 ltrr.
-Qed.
-
-Lemma norm_cl_eq3 m th cl :
- sat m th -> cl \in th -> norm_cl cl.2 == 3 -> m cl.1 = eval_cl m cl.2.
-Proof. by move=> m_th /(norm_clP m_th)[]. Qed.
-
-Lemma norm_lit m th cl kv :
- sat m th -> cl \in th -> kv \in cl.2 -> (`|kv.2| <= 1)%N.
-Proof.
-move=> m_th /(norm_clP m_th)[cl_le3 _ _].
-elim: cl.2 => //= [[k v] kvs IHkvs] in cl_le3 * => /predU1P[-> | /IHkvs->//].
- by apply: contraLR cl_le3; rewrite -ltnNge -leq_sqr => /subnKC <-.
-exact: leq_trans (leq_addl _ _) cl_le3.
-Qed.
-
-(* Decision procedure framework (in which we will define O and L). *)
-
-Definition is_sat_test (tO : pred theory) := forall m th, sat m th -> tO th.
-
-Lemma sat_testP (rO : rel clause) ij12 :
- (forall m th cl1 cl2, sat m th -> cl1 \in th -> cl2 \in th -> rO cl1 cl2) ->
- is_sat_test (sat_test rO ij12).
-Proof.
-rewrite /sat_test => O m th /O O_th; case: get_clP => // cl1 [th_cl1 _].
-by case: get_clP => // cl2 [th_cl2 _]; apply: O_th.
-Qed.
-
-(* Case analysis on the value of a specific projection. *)
-
-Definition lit_vals : seq int := [:: 0; 1; -1].
-
-Lemma sat_cases (m : model) th k cl :
- sat m th -> cl \in th -> wf_ext_cl cl k (size m) ->
- exists2 v, v \in lit_vals & sat m (unwrap (ext_cl th cl k v)).
-Proof.
-case: cl => ij kvs /satP thP th_cl /andP[cl'k ltkm].
-have [[_ ZmL _] [o1m ZmR]] := (LmodelP m, RmodelP m).
-have [m_ij Uij clP] := thP _ th_cl.
-have /CintP[v Dv]: '[m ij, m`_k] \in Cint.
- by rewrite Cint_cfdot_vchar ?ZmL ?ZmR ?mem_nth.
-have [/= th1 Dthx [th1_cl Dth1]] := ext_clP k v th_cl.
-suffices{Dthx} m_th1: sat m th1.
- exists v; last by rewrite /ext_cl Dthx.
- by case: (v) (norm_lit m_th1 th1_cl (mem_head _ _)); do 2?case.
-apply/satP=> cl1; rewrite Dth1 inE; case: ifP => [_ /eqP-> | _ /thP] //=.
-by rewrite cl'k; split=> // kv /predU1P[-> | /clP//]; rewrite /sat_lit Dv.
-Qed.
-Arguments sat_cases [m th] k [cl].
-
-Definition unsat_cases_hyp th0 kvs tO cl :=
- let: (k, _) := head (2, 0) kvs in let thk_ := ext_cl th0 cl k in
- let th's := [seq unwrap (thk_ v) | v <- lit_vals & v \notin unzip2 kvs] in
- let add hyp kv :=
- let: (_, v) := kv in let: Wrap th := thk_ v in hyp /\ unsat th in
- foldl add (wf_ext_cl cl k (th_dim th0) && all (predC tO) th's) kvs.
-
-Lemma unsat_cases th ij kvs tO :
- is_sat_test tO -> oapp (unsat_cases_hyp th kvs tO) False (get_cl ij th) ->
- unsat th.
-Proof.
-case: get_clP => //= cl [th_cl _] O; rewrite /unsat_cases_hyp.
-case: head => k _; set thk_ := ext_cl th cl k; set add := fun _ _ => _.
-set wf_kvs := _ && _; rewrite -[kvs]revK foldl_rev => Ukvs m m_th.
-have{Ukvs}: all (fun kv => ~~ sat m (unwrap (thk_ kv.2))) (rev kvs) && wf_kvs.
- elim: rev Ukvs => // [[_ v] /= kvs' IH]; case Dthk: (thk_ v) => [thv] [/IH].
- by rewrite -andbA => -> Uthk; rewrite andbT; apply/negP; apply: Uthk.
-case/and3P=> /allP Uthkvs /andP[cl'k ltkr] /allP Uthkv's.
-have [|{cl'k ltkr} v lit_v m_thv] := sat_cases k m_th th_cl.
- by rewrite /wf_ext_cl cl'k (leq_trans ltkr) //; have [] := and3P m_th.
-have /idPn[] := O _ _ m_thv; apply: Uthkv's; apply: map_f.
-rewrite mem_filter lit_v andbT -mem_rev -map_rev.
-by apply: contraL m_thv => /mapP[kv /Uthkvs m'thkv ->].
-Qed.
-
-(* Dot product reflection. *)
-
-Lemma O ij12 : is_sat_test (sat_test Otest ij12).
-Proof.
-apply: sat_testP => m th [ij1 kvs1] [ij2 kvs2] /= m_th th_cl1 th_cl2.
-set cl1eq := _ == 3; set cl2eq := _ == 3; have [_ _ Dm] := LmodelP m.
-pose goal s1 s2 := cl2eq ==> (`|s1 - (dot_ref ij1 ij2)%:~R| <= s2%:R :> algC).
-set kvs := kvs2; set s1 := 0; set s2 := {2}0%N; have thP := satP m_th.
-have{thP} [[wf_cl1 _ cl1P] [wf_cl2 _ cl2P]] := (thP _ th_cl1, thP _ th_cl2).
-have: goal (s1%:~R + '[m ij1, eval_cl m kvs]) (if cl1eq then 0%N else s2).
- apply/implyP=> /(norm_cl_eq3 m_th th_cl2) <-.
- by rewrite if_same Dm // addrK normr0.
-have /allP: {subset kvs <= kvs2} by [].
-rewrite cfdot_sumr unlock; elim: kvs s1 s2 => [|[k v2] kvs IHkvs] s1 s2 /=.
- by rewrite addr0 /goal -rmorphB pmulrn -!CintrE.
-case/andP=> kvs2_v /IHkvs{IHkvs}IHkvs; have{cl2P} [ltk _] := cl2P _ kvs2_v.
-have [v1 /cl1P[_ /eqP/=Dv1] | kvs1'k] := get_litP.
- rewrite addrA => gl12; apply: IHkvs; congr (goal (_ + _) _): gl12.
- by rewrite raddfMz addrC /= Dv1 -mulrzA -rmorphD.
-move=> gl12; apply: IHkvs; case: ifP gl12 => [/(norm_cl_eq3 m_th th_cl1)->|_].
- rewrite cfdot_suml big1_seq ?add0r //= => kv1 kvs1_kv1.
- have [[ltk1 _] [/orthonormalP[Um oom] _]] := (cl1P _ kvs1_kv1, RmodelP m).
- rewrite -!scaler_int cfdotZl cfdotZr oom ?mem_nth ?nth_uniq // mulrb.
- by rewrite ifN ?mulr0 //; apply: contraNneq kvs1'k => <-; apply: map_f.
-rewrite /goal -(ler_add2r 1) -mulrSr; case: (cl2eq) => //; apply: ler_trans.
-set s := '[_, _]; rewrite -[_ + _](addrK s) (ler_trans (ler_norm_sub _ _)) //.
-rewrite 2![_ + s]addrAC addrA ler_add2l {}/s -scaler_int cfdotZr rmorph_int.
-have [|v1 _] := sat_cases k m_th th_cl1; first exact/andP.
-have [th1 -> /= [th1_cl1 _] m_th1] := ext_clP k v1 th_cl1.
-have [_ _ /(_ _ (mem_head _ _))[_ /eqP->]] := satP m_th1 _ th1_cl1.
-have ubv1: (`|v1| <= 1)%N := norm_lit m_th1 th1_cl1 (mem_head _ _).
-have ubv2: (`|v2| <= 1)%N := norm_lit m_th th_cl2 kvs2_v.
-by rewrite -rmorphM -intr_norm lern1 abszM /= (leq_mul ubv2 ubv1).
-Qed.
-
-(* "Without loss" cut rules. *)
-
-Lemma unsat_wlog cl th :
- (let: Wrap th1 := set_cl cl th in (unsat th1 -> unsat th) /\ unsat th1) ->
- unsat th.
-Proof. by case: set_cl => th1 [Uth /Uth]. Qed.
-
-Lemma unsat_wlog_cases th1 th2 :
- (unsat th1 -> unsat th2) -> unsat th1 -> (true /\ unsat th1) /\ unsat th2.
-Proof. by move=> Uth2 Uth1; split; last apply: Uth2. Qed.
-
-(* Extend the orthonormal basis *)
-
-Lemma sat_fill m th cl (k := th_dim th) :
- sat m th -> cl \in th -> wf_fill k cl.2 ->
- exists mr : {CFk | is_Rmodel CFk},
- sat (Model (LmodelP m) (svalP mr)) (unwrap (ext_cl th cl k 1)).
-Proof.
-move=> m_th th_cl /andP[/eqP sz_kvs n3cl].
-wlog sz_m: m m_th / size m = k.
- have lekm: (k <= size m)%N by have [] := and3P m_th.
- have mrP: is_Rmodel (take k m).
- have [] := RmodelP m; rewrite -{1 2}(cat_take_drop k m) orthonormal_cat /=.
- by case/andP=> o1mr _ /allP; rewrite all_cat => /andP[/allP].
- move/(_ (Model (LmodelP m) mrP)); apply; rewrite ?size_takel //.
- congr (_ && _): m_th; rewrite lekm size_takel ?leqnn //=.
- apply: eq_in_all => cl1 /th_dimP lt_cl1; congr (_ && _).
- by apply: eq_in_all => kv1 /lt_cl1 lt_kv1; rewrite /sat_lit nth_take ?lt_kv1.
-have [_ _ [//||dk cl_dk o_dk_m]] := norm_clP m_th th_cl.
- by rewrite sz_kvs sz_m.
-have CFkP: is_Rmodel (rcons m (dchi dk)).
- have [o1m /allP Zm] := RmodelP m.
- split; last by apply/allP; rewrite all_rcons /= dchi_vchar.
- rewrite -cats1 orthonormal_cat o1m orthogonal_sym o_dk_m.
- by rewrite /orthonormal /= cfnorm_dchi eqxx.
-exists (exist _ _ CFkP); set mk := Model _ _.
-have{m_th} mk_th: sat mk th.
- congr (_ && _): m_th; rewrite size_rcons sz_m leqnn ltnW //=.
- apply: eq_in_all => cl1 /th_dimP lt_cl1; congr (_ && _).
- apply: eq_in_all => kv1 /lt_cl1 lt_kv1; congr ('[_, _] == _).
- by rewrite nth_rcons sz_m lt_kv1.
-have [|{mk_th}v ub_v m_th] := sat_cases k mk_th th_cl.
- rewrite /wf_ext_cl size_rcons sz_m (contraFN _ (ltnn k)) //=.
- by case/mapP=> kv kv_cl {1}->; rewrite (th_dimP _ _ th_cl).
-suffices: 0 < v by case/or4P: ub_v m_th => // /eqP->.
-case: (ext_clP k v th_cl) m_th => th1 -> [th1_cl1 _] /and3P[_ _].
-case/allP/(_ _ th1_cl1)/and3P=> _ /eqP/=.
-by rewrite nth_rcons sz_m ltnn eqxx CintrE => <- _; rewrite -dirr_consttE.
-Qed.
-
-Lemma unsat_fill ij th :
- let fill_cl cl :=
- if (th_dim th).+1 %/ 1 is k.+1 then
- let: Wrap thk := ext_cl th cl k 1 in wf_fill k cl.2 /\ unsat thk
- else True in
- oapp fill_cl False (get_cl ij th) -> unsat th.
-Proof.
-rewrite divn1; case: get_clP => //= cl [th_cl _].
-case Dthk: ext_cl => [th1] [wf_thk Uth1] m m_th.
-by have [mk] := sat_fill m_th th_cl wf_thk; rewrite Dthk => /Uth1.
-Qed.
-
-(* Matching an assumption exactly. *)
-
-Lemma sat_exact m th1 th2 : sub_match th1 th2 -> sat m th2 -> sat m th1.
-Proof.
-move/allP=> s_th12 /satP th2P; apply/satP => cl1 /s_th12/hasP[cl2 th_cl2].
-case: eqP => // <- s_cl12; have [wf_ij2 Ucl2 cl2P] := th2P _ th_cl2.
-split=> // [|kv /(mem_subseq s_cl12)/cl2P//].
-by rewrite (subseq_uniq _ Ucl2) ?map_subseq.
-Qed.
-
-Lemma unsat_exact th1 th2 : sub_match th1 th2 -> unsat th1 -> unsat th2.
-Proof. by move=> sth21 Uth1 m /(sat_exact sth21)/Uth1. Qed.
-
-(* Transpose (W1 / W2 symmetry). *)
-
-Fact tr_Lmodel_subproof (m : model) : is_Lmodel (tr m) (fun ij => m (tr ij)).
-Proof.
-case: m => /= d f _ [[odd_d1 odd_d2 d1gt1 d2gt1 neq_d12] Zf fP] _.
-split=> // [|[j1 i1] [j2 i2]]; first by rewrite eq_sym.
-by rewrite ![_ \in _]andbC /= => wf_ij1 wf_ij2; rewrite fP // /dot_ref mulnC.
-Qed.
-
-Definition tr_model m := Model (tr_Lmodel_subproof m) (RmodelP m).
-
-Lemma sat_tr m th : sat m th -> sat (tr_model m) (tr_th th).
-Proof.
-move/satP=> thP; apply/satP=> _ /mapP[[[i j] kvs] /thP[m_ij Uks kvsP] ->].
-by rewrite inE /= andbC.
-Qed.
-
-(* Extend the theory (add a new empty clause). *)
-
-Lemma unsat_consider ij th :
- wf_consider ij th -> unsat (AddClause th (& ? in ij)) -> unsat th.
-Proof.
-case: ij => i j; case/andP; set sym_t := sub_match _ _ => lti ltj Uthij m m_th.
-wlog le_m21: m m_th / sym_t -> (m.2 <= m.1)%N.
- move=> IH; apply: (IH m m_th) => sym_th.
- rewrite leqNgt; apply/negP=> /leqW le_m1_m2.
- by have /(sat_exact sym_th)/IH[] := sat_tr m_th.
-apply: (Uthij m); congr (_ && _): (m_th) => /=; case: (th_bbox th) => ri rj /=.
-have [[odd_m1 _ m1gt1 m2gt1 neq_m12] _ _] := LmodelP m.
-rewrite /sub_bbox !geq_max (leq_trans ltj) ?(leq_trans lti) //; case: orP => //.
-rewrite -(ltnS 4) (odd_geq _ odd_m1) ltnS.
-case=> [/leq_trans-> // | /le_m21]; first by have [/andP[]] := and3P m_th.
-by rewrite leq_eqVlt eq_sym (negPf neq_m12); apply: leq_trans.
-Qed.
-
-(* Matching up to a permutation of the rows, columns, and base vectors. *)
-
-Lemma unsat_match s th1 th2 : sym_match s th1 th2 -> unsat th2 -> unsat th1.
-Proof.
-pose I_ si mi := si ++ filter [predC si] (iota 0 mi).
-have SsP mi si ri (Ii := I_ si mi):
- uniq si && all (gtn ri) si -> (ri <= mi)%N ->
- [/\ {in Ii, forall i, i < mi}%N, uniq Ii & size Ii = mi].
-- case/andP=> Usi /allP/=ltsi le_ri_mi; have uIm := iota_uniq 0 mi.
- have uIi: uniq Ii by rewrite cat_uniq Usi -all_predC filter_all filter_uniq.
- have defIi: Ii =i iota 0 mi.
- move=> i; rewrite mem_cat mem_filter orb_andr orbN mem_iota.
- by apply: orb_idl => /ltsi/leq_trans->.
- split=> // [i|]; first by rewrite defIi mem_iota.
- by rewrite (perm_eq_size (uniq_perm_eq _ _ defIi)) ?size_iota.
-have lt_nth ri si i: (nth ri si i < ri)%N -> (i < size si)%N.
- by rewrite !ltnNge; apply: contra => le_si; rewrite nth_default.
-case: s => [si sj sk] /= sym12 Uth2 m m_th1; case/and3P: (m_th1) sym12.
-case: th_bbox (th_bboxP (bbox_refl (th_bbox th1))) => ri rj rijP.
-case/andP=> /= leri lerj lerk _ /and4P[Ssi Ssj /andP[Usk /allP/=lesrk] sym12].
-have{Ssi} /SsP/(_ leri)[ltIi uIi szIi] := Ssi.
-have{Ssj SsP} /SsP/(_ lerj)[ltIj uIj szIj] := Ssj.
-pose smL ij := m (nth ri (I_ si m.1) ij.1, nth rj (I_ sj m.2) ij.2)%N.
-pose smR := [seq m`_k | k <- sk].
-have [[lb_m ZmL Dm] [o1m ZmR]] := (LmodelP m, RmodelP m).
-have{lb_m} smLP: is_Lmodel m smL.
- split=> // [ij | ij1 ij2 /andP[lti1 ltj1] /andP[lti2 ltj2]]; first exact: ZmL.
- by rewrite Dm ?inE /dot_ref/= ?nth_uniq ?ltIi ?ltIj ?mem_nth ?szIi ?szIj.
-have{lesrk} ubk k: k \in sk -> (k < size m)%N by move=> /lesrk/leq_trans->.
-have smRP: is_Rmodel smR.
- have ssmR: {subset smR <= (m : seq _)}.
- by move=> _ /mapP[k s_k ->]; rewrite mem_nth ?ubk.
- split=> [|xi /ssmR/ZmR//]; have [Um _] := orthonormalP o1m.
- apply: sub_orthonormal o1m; rewrite ?map_inj_in_uniq //.
- by apply: can_in_inj (index^~ m) _ => k s_k; rewrite /= index_uniq ?ubk.
-apply: (Uth2 (Model smLP smRP)); apply/satP=> [][[i2 j2] kvs2] /(allP sym12).
-case/andP=> -> /hasP[[[i1 j1] kvs1] th1_cl1 /andP[/eqP[Di1 Dj1] /allP s_kv12]].
-have:= rijP _ th1_cl1; rewrite Di1 Dj1 => /andP[/lt_nth lti1 /lt_nth ltj1].
-rewrite !inE -szIi -szIj !size_cat !(leq_trans _ (leq_addr _ _)) //.
-split=> // kv /s_kv12 kvs1_kv1; rewrite size_map /sat_lit /=.
-have /lt_nth ltk := th_dimP (leqnn _) _ th1_cl1 _ kvs1_kv1; split=> //.
-rewrite (nth_map (th_dim th1)) // /smL !nth_cat lti1 ltj1 -Di1 -Dj1.
-by have [_ _ /(_ _ kvs1_kv1)[]] := satP m_th1 _ th1_cl1.
-Qed.
-
-Lemma unsat_sym th1 th2 :
- (if find_sym th1 th2 is Some s then sym_match s th2 th1 else false) ->
- unsat th1 -> unsat th2.
-Proof. by case: find_sym => // s; apply: unsat_match. Qed.
-
-End Interpretation.
-
-Arguments satP [gT G m th].
-Arguments unsat [gT G].
-Arguments sat_cases [gT G m th] k [cl].
-Arguments unsat_cases [gT G th] ij kvs [tO].
-Arguments unsat_wlog [gT G].
-Arguments unsat_fill [gT G].
-Arguments unsat_consider [gT G].
-Arguments unsat_match [gT G] s [th1 th2].
-
-(* The domain-specific tactic language. *)
-
-Tactic Notation "consider" constr(ij) :=
- apply: (unsat_consider ij); first exact isT.
-
-(* Note that "split" here would be significantly less efficient, because it *)
-(* would evaluate the reflected assumption four times. *)
-Tactic Notation "fill" constr(ij) :=
- apply: (unsat_fill ij); apply: (conj isT _).
-
-Tactic Notation "uwlog" simple_intropattern(IH) ":" constr(cl) :=
- apply: (unsat_wlog cl); split=> [IH | ].
-
-Tactic Notation "uwlog" simple_intropattern(IH) ":" constr(cl)
- "by" tactic4(tac) :=
- apply: (unsat_wlog cl); split=> [IH | ]; first by [tac].
-
-Tactic Notation "uhave" constr(kv) "in" constr(ij)
- "as" constr(T) constr(ij12) :=
- apply: (unsat_cases ij [:: kv] (T ij12)); apply: (conj isT _).
-
-Tactic Notation "uhave" constr(kv1) "," constr(kv2) "in" constr(ij)
- "as" constr(T) constr(ij12) :=
- uhave kv1 in ij as T ij12; uhave kv2 in ij as T ij12.
-
-Tactic Notation "uhave" constr(kv1) "|" constr(kv2) "in" constr(ij)
- "as" constr(T) constr(ij12) :=
- apply: (unsat_cases ij [:: kv1; kv2] (T ij12)); apply: (conj (conj isT _) _).
-
-Tactic Notation "uhave" constr(kv1) "|" constr(kv2) "|" constr(kv3)
- "in" constr(ij) :=
- apply: (unsat_cases ij [:: kv1; kv2; kv3] (fun _ _ _ => isT));
- apply: (conj (conj (conj isT _) _) _).
-
-Tactic Notation "uwlog" simple_intropattern(IH) ":"
- constr(kv1) "|" constr(kv2) "in" constr(ij)
- "as" constr(T) constr(ij12) :=
- apply: (unsat_cases ij [:: kv1; kv2] (T ij12));
- apply: unsat_wlog_cases => [IH | ].
-
-Tactic Notation "counter" "to" constr(T) constr(ij12) := by move=> ? /(T ij12).
-
-Tactic Notation "uexact" constr(IH) := apply: unsat_exact IH; exact isT.
-
-Tactic Notation "symmetric" "to" constr(IH) := apply: unsat_sym (IH); exact isT.
-
-End CyclicTIisoReflexion.
-
-Section Three.
-
-Variables (gT : finGroupType) (G W W1 W2 : {group gT}).
-Hypothesis defW : W1 \x W2 = W.
-
-Let V := cyclicTIset defW.
-Let w_ i j := cyclicTIirr defW i j.
-Let w1 := #|W1|.
-Let w2 := #|W2|.
-
-Lemma cyclicTIirrC (xdefW : W2 \x W1 = W) i j :
- cyclicTIirr xdefW j i = w_ i j.
-Proof. by rewrite (dprod_IirrC xdefW defW). Qed.
-
-Lemma cycTIirrP chi : chi \in irr W -> {i : Iirr W1 & {j | chi = w_ i j}}.
-Proof.
-case/irrP/sig_eqW=> k ->{chi}.
-by have /codomP/sig_eqW[[i j] ->] := dprod_Iirr_onto defW k; exists i, j.
-Qed.
-
-Lemma cycTIirr_aut u i j : w_ (aut_Iirr u i) (aut_Iirr u j) = cfAut u (w_ i j).
-Proof. by rewrite /w_ !dprod_IirrE cfAutDprod !aut_IirrE. Qed.
-
-Let sW1W : W1 \subset W. Proof. by have /mulG_sub[] := dprodW defW. Qed.
-Let sW2W : W2 \subset W. Proof. by have /mulG_sub[] := dprodW defW. Qed.
-
-Lemma card_cycTIset : #|V| = (w1.-1 * w2.-1)%N.
-Proof.
-have [_ _ _ tiW12] := dprodP defW.
-rewrite cardsD (setIidPr _) ?subUset ?sW1W // cardsU {}tiW12 cards1.
-rewrite -(dprod_card defW) -addnBA // -!subn1 -/w1 -/w2 subnDA.
-by rewrite mulnBl mulnBr mul1n muln1.
-Qed.
-
-Definition cfCyclicTIset i j := cfDprod defW (1 - 'chi_i) (1 - 'chi_j).
-Local Notation alpha_ := cfCyclicTIset.
-
-Lemma cycTIirr00 : w_ 0 0 = 1. Proof. by rewrite /w_ dprod_Iirr0 irr0. Qed.
-Local Notation w_00 := cycTIirr00.
-
-Lemma cycTIirr_split i j : w_ i j = w_ i 0 * w_ 0 j.
-Proof. by rewrite /w_ !dprod_IirrE !irr0 cfDprod_split. Qed.
-
-Lemma cfker_cycTIl j : W1 \subset cfker (w_ 0 j).
-Proof. by rewrite /w_ dprod_IirrE irr0 cfDprod_cfun1l cfker_sdprod. Qed.
-
-Lemma cfker_cycTIr i : W2 \subset cfker (w_ i 0).
-Proof. by rewrite /w_ dprod_IirrE irr0 cfDprod_cfun1r cfker_sdprod. Qed.
-
-Let cfdot_w i1 j1 i2 j2 : '[w_ i1 j1, w_ i2 j2] = ((i1 == i2) && (j1 == j2))%:R.
-Proof. exact: cfdot_dprod_irr. Qed.
-
-Lemma cfCycTI_E i j : alpha_ i j = 1 - w_ i 0 - w_ 0 j + w_ i j.
-Proof.
-rewrite -w_00 -[w_ i j]opprK /w_ !dprod_IirrE !irr0 -addrA -opprD -!mulrBl.
-by rewrite -mulrBr -!rmorphB.
-Qed.
-Local Notation alphaE := cfCycTI_E.
-
-Lemma cfCycTI_vchar i j : alpha_ i j \in 'Z[irr W].
-Proof. by rewrite alphaE rpredD ?rpredB ?rpred1 ?irr_vchar. Qed.
-
-Definition cfCyclicTIsetBase :=
- [seq alpha_ ij.1 ij.2 | ij in setX [set~ 0] [set~ 0]].
-Local Notation cfWVbase := cfCyclicTIsetBase.
-
-Let cfdot_alpha_w i1 j1 i2 j2 :
- i2 != 0 -> j2 != 0 -> '[alpha_ i1 j1, w_ i2 j2] = [&& i1 == i2 & j1 == j2]%:R.
-Proof.
-move=> nzi2 nzj2; rewrite alphaE -w_00 !cfdotDl !cfdotNl !cfdot_w.
-by rewrite !(eq_sym 0) (negPf nzi2) (negPf nzj2) /= andbF !subr0 add0r.
-Qed.
-
-Let cfdot_alpha_1 i j : i != 0 -> j != 0 -> '[alpha_ i j, 1] = 1.
-Proof.
-move=> nzi nzj; rewrite alphaE -w_00 !cfdotDl !cfdotNl !cfdot_w.
-by rewrite !eqxx andbT /= (negPf nzi) (negPf nzj) addr0 !subr0.
-Qed.
-
-Let cfnorm_alpha i j : i != 0 -> j != 0 -> '[alpha_ i j] = 4%:R.
-Proof.
-move=> nzi nzj; rewrite -[4]/(size [:: 1; - w_ i 0; - w_ 0 j; w_ i j]).
-rewrite -cfnorm_orthonormal 3?big_cons ?big_seq1 ?addrA -?alphaE //.
-rewrite /orthonormal -w_00 /= !cfdotNl !cfdotNr !opprK !oppr_eq0 !cfnorm_irr.
-by rewrite !cfdot_w !eqxx /= !(eq_sym 0) (negPf nzi) (negPf nzj) !eqxx.
-Qed.
-
-Lemma cfCycTIbase_free : free cfWVbase.
-Proof.
-apply/freeP=> s /= s_alpha_0 ij; case def_ij: (enum_val ij) => [i j].
-have /andP[nzi nzj]: (i != 0) && (j != 0).
- by rewrite -!in_setC1 -in_setX -def_ij enum_valP.
-have:= congr1 (cfdotr (w_ i j)) s_alpha_0; rewrite raddf_sum raddf0 => <-.
-rewrite (bigD1 ij) //= nth_image def_ij cfdotZl cfdot_alpha_w // !eqxx mulr1.
-rewrite big1 ?addr0 // => ij1; rewrite nth_image -(inj_eq enum_val_inj) def_ij.
-case: (enum_val ij1) => i1 j1 /= => ne_ij1_ij.
-by rewrite cfdotZl cfdot_alpha_w // mulr_natr mulrb ifN.
-Qed.
-
-(* Further results on alpha_ depend on the assumption that W is cyclic. *)
-
-Hypothesis ctiW : cyclicTI_hypothesis G defW.
-
-Let cycW : cyclic W. Proof. by case: ctiW. Qed.
-Let oddW : odd #|W|. Proof. by case: ctiW. Qed.
-Let tiV : normedTI V G W. Proof. by case: ctiW. Qed.
-Let ntV : V != set0. Proof. by case/andP: tiV. Qed.
-
-Lemma cyclicTIhyp_sym (xdefW : W2 \x W1 = W) : cyclicTI_hypothesis G xdefW.
-Proof. by split; rewrite // /cyclicTIset setUC. Qed.
-
-Let cycW1 : cyclic W1. Proof. exact: cyclicS cycW. Qed.
-Let cycW2 : cyclic W2. Proof. exact: cyclicS cycW. Qed.
-Let coW12 : coprime w1 w2. Proof. by rewrite -(cyclic_dprod defW). Qed.
-
-Let Wlin k : 'chi[W]_k \is a linear_char. Proof. exact/irr_cyclic_lin. Qed.
-Let W1lin i : 'chi[W1]_i \is a linear_char. Proof. exact/irr_cyclic_lin. Qed.
-Let W2lin i : 'chi[W2]_i \is a linear_char. Proof. exact/irr_cyclic_lin. Qed.
-Let w_lin i j : w_ i j \is a linear_char. Proof. exact: Wlin. Qed.
-
-Let nirrW1 : #|Iirr W1| = w1. Proof. exact: card_Iirr_cyclic. Qed.
-Let nirrW2 : #|Iirr W2| = w2. Proof. exact: card_Iirr_cyclic. Qed.
-Let NirrW1 : Nirr W1 = w1. Proof. by rewrite -nirrW1 card_ord. Qed.
-Let NirrW2 : Nirr W2 = w2. Proof. by rewrite -nirrW2 card_ord. Qed.
-
-Lemma cycTI_nontrivial : W1 :!=: 1%g /\ W2 :!=: 1%g.
-Proof.
-apply/andP; rewrite -!cardG_gt1 -!(subn_gt0 1) !subn1 -muln_gt0.
-by rewrite -card_cycTIset card_gt0.
-Qed.
-
-Let ntW1 : W1 :!=: 1%g. Proof. by case: cycTI_nontrivial. Qed.
-Let ntW2 : W2 :!=: 1%g. Proof. by case: cycTI_nontrivial. Qed.
-Let oddW1 : odd w1. Proof. exact: oddSg oddW. Qed.
-Let oddW2 : odd w2. Proof. exact: oddSg oddW. Qed.
-Let w1gt2 : (2 < w1)%N. Proof. by rewrite odd_gt2 ?cardG_gt1. Qed.
-Let w2gt2 : (2 < w2)%N. Proof. by rewrite odd_gt2 ?cardG_gt1. Qed.
-
-Let neq_w12 : w1 != w2.
-Proof.
-by apply: contraTneq coW12 => ->; rewrite /coprime gcdnn -(subnKC w2gt2).
-Qed.
-
-Let cWW : abelian W. Proof. exact: cyclic_abelian. Qed.
-Let nsVW : V <| W. Proof. by rewrite -sub_abelian_normal ?subsetDl. Qed.
-Let sWG : W \subset G. Proof. by have [_ /subsetIP[]] := normedTI_P tiV. Qed.
-Let sVG : V \subset G^#. Proof. by rewrite setDSS ?subsetU ?sub1G. Qed.
-
-Let alpha1 i j : alpha_ i j 1%g = 0.
-Proof. by rewrite cfDprod1 !cfunE cfun11 lin_char1 // subrr mul0r. Qed.
-
-(* This first part of Peterfalvi (3.4) will be used in (4.10) and (13.9). *)
-Lemma cfCycTI_on i j : alpha_ i j \in 'CF(W, V).
-Proof.
-apply/cfun_onP=> x; rewrite !inE negb_and negbK orbC.
-case/or3P => [/cfun0->// | W1x | W2x].
- by rewrite -[x]mulg1 cfDprodE // !cfunE cfun11 lin_char1 ?subrr ?mulr0.
-by rewrite -[x]mul1g cfDprodE // !cfunE cfun11 lin_char1 ?subrr ?mul0r.
-Qed.
-
-(* This is Peterfalvi (3.4). *)
-Lemma cfCycTIbase_basis : basis_of 'CF(W, V) cfWVbase.
-Proof.
-rewrite basisEfree cfCycTIbase_free /=.
-have ->: \dim 'CF(W, V) = #|V| by rewrite dim_cfun_on_abelian ?subsetDl.
-rewrite size_tuple cardsX !cardsC1 nirrW1 nirrW2 -card_cycTIset leqnn andbT.
-by apply/span_subvP=> _ /imageP[[i j] _ ->]; apply: cfCycTI_on.
-Qed.
-Local Notation cfWVbasis := cfCycTIbase_basis.
-
-Section CyclicTIisoBasis.
-
-Import CyclicTIisoReflexion ssrint.
-
-Local Notation unsat := (@unsat gT G).
-Local Notation O := (@O gT G).
-Local Notation "#1" := (inord 1).
-
-(* This is the combinatorial core of Peterfalvi (3.5.2). *)
-(* Peterfalvi uses evaluation at 1%g to conclude after the second step; since *)
-(* this is not covered by our model, we have used the dot product constraints *)
-(* between b12 and b11, b21 instead. *)
-Let unsat_J : unsat |= & x1 in b11 & -x1 in b21.
-Proof.
-uwlog b11x1: (& b11 = x1 + x2 + x3) by do 2!fill b11.
-uwlog b21x1: (& b21 = -x1 + x2 + x3) by uhave x2, x3 in b21 as O(21, 11).
-consider b12; uhave -x2 | x2 | ~x2 in b12.
-- by uhave x1 in b12 as O(12, 11); counter to O(12, 21).
-- uhave x1 | ~x1 in b12 as O(12, 21).
- by uhave ~x3 in b12 as O(12, 21); counter to O(12, 11).
- by uhave ~x3 in b12 as O(12, 11); counter to O(12, 21).
-uhave x3 | ~x3 in b12 as O(12, 11).
- by uhave x1 in b12 as O(12, 21); counter to O(12, 11).
-by uhave x1 in b12 as O(12, 11); counter to O(12, 21).
-Qed.
-
-Let unsat_II: unsat |= & x1, x2 in b11 & x1, x2 in b21.
-Proof. by fill b11; uhave -x3 in b21 as O(21, 11); symmetric to unsat_J. Qed.
-
-(* This reflects the application of (3.5.2), but only to rule out nonzero *)
-(* components of the first entry that conflict with positive components of *)
-(* the second entry; Otest covers all the other uses of (3.5.2) in the proof. *)
-Let Ltest (cl1 cl2 : clause) :=
- let: (i1, j1, kvs1) := cl1 in let: (i2, j2, kvs2) := cl2 in
- let fix loop mm kvs2' :=
- if kvs2' is (k, v2) :: kvs2'' then
- let v1 := odflt 0 (get_lit k kvs1) in
- if (v2 != 1) || (v1 == 0) then loop mm kvs2'' else
- if (v1 != 1) || mm then false else loop true kvs2''
- else true in
- (i1 == i2) (+) (j1 == j2) ==> loop false kvs2.
-
-Let L ij12 : is_sat_test G (sat_test Ltest ij12).
-Proof.
-apply: sat_testP => m th [[i1 j1] kvs1] [[i2 j2] kvs2] m_th th_cl1 th_cl2.
-wlog eq_j: m th i1 i2 j1 j2 m_th th_cl1 th_cl2 / j1 == j2.
- move=> IH; case eq_j: (j1 == j2); first exact: IH m_th th_cl1 th_cl2 eq_j.
- case eq_i: (i1 == i2); last by rewrite /= eq_i eq_j.
- have /(_ (_, _, _)) mem_trt: _ \in tr_th th := map_f _ _.
- by rewrite /= addbC; apply: IH (sat_tr m_th) _ _ eq_i; rewrite ?mem_trt.
-apply/implyP; rewrite eq_j addbT => neq_i.
-rewrite -[f in f _ kvs2]/(idfun _); set f := idfun _; rewrite /= in f *.
-have [/= _ Ukvs2 kvsP] := satP m_th _ th_cl2.
-move: Ukvs2; set kvs2' := kvs2; set mm := false.
-have /allP: {subset kvs2' <= kvs2} by [].
-pose lit12 k := (k, 1) \in kvs1 /\ (k, 1) \in kvs2.
-have: mm -> {k | lit12 k & k \notin unzip1 kvs2'} by [].
-elim: kvs2' mm => [|[k v2] kvs2' IH] //= mm mmP /andP[kvs2k /IH{IH}IHkvs].
-case/andP=> kvs2'k /IHkvs{IHkvs}IHkvs; case: ifP => [_ | /norP[]].
- by apply/IHkvs=> /mmP[kv kvs12kv /norP[]]; exists kv.
-have [v1 /= kvs1k | //] := get_litP; case: eqP => // -> in kvs2k * => _ nz_v1.
-case Dbb: (th_bbox th) (th_bboxP (bbox_refl (th_bbox th))) => [ri rj] rijP.
-have [/andP[/=lti1r ltj1r] /andP[/=lti2r _]] := (rijP _ th_cl1, rijP _ th_cl2).
-have rkP := th_dimP (leqnn _) _ th_cl1; have /= ltkr := rkP _ kvs1k.
-have symP := unsat_match (Sym [:: i2; i1] [:: j1] _) _ _ m m_th.
-rewrite /= Dbb lti1r lti2r ltj1r inE eq_sym neq_i /= in symP.
-have [Dv1 | v1_neq1] /= := altP eqP; first rewrite Dv1 in kvs1k.
- case: ifP => [/mmP[k0 [kvs1k0 kvs2k0]] | _]; last by apply: IHkvs; exists k.
- case/norP=> k'k0; have [/=] := symP [:: k0; k] _ _ unsat_II.
- rewrite inE k'k0 ltkr (rkP _ kvs1k0) /= andbT; apply/andP; split; apply/hasP.
- by exists (i1, j1, kvs1) => //=; rewrite eqxx kvs1k kvs1k0.
- by exists (i2, j2, kvs2) => //=; rewrite (eqP eq_j) eqxx kvs2k kvs2k0.
-have{nz_v1 v1_neq1} Dv1: v1 = -1; last rewrite Dv1 in kvs1k.
- by case: (v1) nz_v1 v1_neq1 (norm_lit m_th th_cl1 kvs1k) => [[|[]] | []].
-have[] := symP [:: k] _ _ unsat_J; rewrite /= ltkr !andbT /=; apply/andP; split.
- by apply/hasP; exists (i1, j1, kvs1); rewrite //= eqxx kvs1k.
-by apply/hasP; exists (i2, j2, kvs2); rewrite //= (eqP eq_j) eqxx kvs2k.
-Qed.
-
-(* This is the combinatorial core of Peterfalvi (3.5.4). *)
-(* We have made a few simplifications to the combinatorial analysis in the *)
-(* text: we omit the (unused) step (3.5.4.4) entirely, which lets us inline *)
-(* step (3.5.4.1) in the proof of (3.5.4.2); we clear the assumptions on b31 *)
-(* and b32 before the final step (3.5.4.5), exposing a hidden symmetry. *)
-Let unsat_Ii : unsat |= & x1 in b11 & x1 in b21 & ~x1 in b31.
-Proof.
-uwlog Db11: (& b11 = x1 + x2 + x3) by do 2!fill b11.
-uwlog Db21: (& b21 = x1 + x4 + x5).
- by uhave ~x2, ~x3 in b21 as L(21, 11); do 2!fill b21; uexact Db21.
-uwlog Db31: (& b31 = x2 + x4 + x6).
- uwlog b31x2: x2 | ~x2 in b31 as L(31, 11).
- by uhave x3 in b31 as O(31, 11); symmetric to b31x2.
- uwlog b31x4: x4 | ~x4 in b31 as L(31, 21).
- by uhave x5 in b31 as O(31, 21); symmetric to b31x4.
- uhave ~x3 in b31 as O(31, 11); uhave ~x5 in b31 as L(31, 21).
- by fill b31; uexact Db31.
-consider b41; uwlog b41x1: x1 | ~x1 in b41 as L(41, 11).
- uwlog Db41: (& b41 = x3 + x5 + x6) => [|{b41x1}].
- uhave ~x2 | x2 in b41 as L(41, 11); last symmetric to b41x1.
- uhave ~x4 | x4 in b41 as L(41, 21); last symmetric to b41x1.
- uhave x3 in b41 as O(41, 11); uhave x5 in b41 as O(41, 21).
- by uhave x6 in b41 as O(41, 31); uexact Db41.
- consider b12; uwlog b12x1: x1 | ~x1 in b12 as L(12, 11).
- uhave ~x2 | x2 in b12 as L(12, 11); last symmetric to b12x1.
- by uhave x3 in b12 as O(12, 11); symmetric to b12x1.
- uwlog b12x4: -x4 | ~x4 in b12 as O(12, 21).
- by uhave -x5 in b12 as O(12, 21); symmetric to b12x4.
- uhave ~x2, ~x3 in b12 as L(12, 11); uhave ~x5 in b12 as O(12, 21).
- by uhave x6 in b12 as O(12, 31); counter to O(12, 41).
-uwlog Db41: (& b41 = x1 + x6 + x7).
- uhave ~x2, ~x3 in b41 as L(41, 11); uhave ~x4, ~x5 in b41 as L(41, 21).
- by uhave x6 in b41 as O(41, 31); fill b41; uexact Db41.
-consider b32; uwlog Db32: (& b32 = x6 - x7 + x8).
- uwlog b32x6: x6 | ~x6 in b32 as L(32, 31).
- uhave ~x2 | x2 in b32 as L(32, 31); last symmetric to b32x6.
- by uhave x4 in b32 as O(32, 31); symmetric to b32x6.
- uhave ~x2, ~x4 in b32 as L(32, 31).
- uhave -x7 | ~x7 in b32 as O(32, 41).
- uhave ~x1 in b32 as O(32, 41); uhave ~x3 in b32 as O(32, 11).
- by uhave ~x5 in b32 as O(32, 21); fill b32; uexact Db32.
- uhave -x1 in b32 as O(32, 41).
- by uhave x3 in b32 as O(32, 11); counter to O(32, 21).
-consider b42; uwlog Db42: (& b42 = x6 - x4 + x5).
- uhave ~x6 | x6 in b42 as L(42, 41).
- uhave ~x7 | x7 in b42 as L(42, 41); last counter to O(42, 32).
- uhave x1 in b42 as O(42, 41); uhave x8 in b42 as O(42, 32).
- uhave ~x2 | -x2 in b42 as O(42, 11); last counter to O(42, 21).
- by uhave -x3 in b42 as O(42, 11); counter to O(42, 21).
- uwlog b42x4: -x4 | ~x4 in b42 as O(42, 31).
- by uhave -x2 in b42 as O(42, 31); symmetric to b42x4.
- by uhave ~x1 in b42 as L(42, 41); uhave x5 in b42 as O(42, 21); uexact Db42.
-uwlog Db32: (& ? in b32); first uexact Db32.
-uwlog Db41: (& ? in b41); first uexact Db41.
-consider b12; uwlog b12x5: x5 | ~x5 in b12 as L(12, 42).
- uhave ~x6 | x6 in b12 as L(12, 42); last by consider b22; symmetric to b12x5.
- uhave -x4 in b12 as O(12, 42); uhave x1 in b12 as O(12, 21).
- by uhave ~x2 in b12 as L(12, 11); counter to O(12, 31).
-uhave ~x6 in b12 as L(12, 42); uhave ~x4 in b12 as O(12, 42).
-uhave ~x2 in b12 as O(12, 31).
-by uhave -x1 in b12 as O(12, 21); counter to L(12, 11).
-Qed.
-
-Let unsat_C : unsat |= & x1 in b11 & x1 in b21 & x1 in b12.
-Proof.
-consider b31; uwlog Db21: (& b21 = x1 + x2 + x3) by do 2!fill b21.
-uwlog Db12: (& b12 = x1 - x2 + x4).
- uwlog b21x2: -x2 | ~x2 in b12 as O(12, 21).
- by uhave -x3 in b12 as O(12, 21); symmetric to b21x2.
- by uhave ~x3 in b12 as O(12, 21); fill b12; uexact Db12.
-uwlog Db31: (& b31 = x1 - x4 + x5).
- uhave x1 | ~x1 in b31 as L(31, 21); last uexact unsat_Ii.
- uhave ~x2, ~x3 in b31 as L(31, 21).
- by uhave -x4 in b31 as O(31, 12); fill b31; uexact Db31.
-consider b41; uhave x1 | ~x1 in b41 as L(41, 21); last symmetric to unsat_Ii.
-uhave ~x5 in b41 as L(41, 31); uhave ~x4 in b41 as O(41, 31).
-by uhave ~x2 in b41 as L(41, 21); counter to O(41, 12).
-Qed.
-
-(* This refinement of Peterfalvi (3.5.4) is the essential part of (3.5.5). *)
-Let column_pivot (m : model G) (j0 : 'I_m.2.+1) :
- exists dk, forall (i : 'I_m.1.+1) (j : 'I_m.2.+1),
- j0 != 0 -> i != 0 -> j != 0 -> '[m (i.-1, j.-1), dchi dk] = (j == j0)%:R.
-Proof.
-pose t_i (i0 i1 : nat) := [eta id with i0 |-> i1, i1 |-> i0].
-pose t_ij i0 i1 ij : ref := (t_i i0 i1 ij.1, ij.2).
-have t_iK i0 i1: involutive (t_i i0 i1).
- move=> i /=; have [-> | i0'i] := altP (i =P i0).
- by rewrite eqxx; case: eqP.
- by have [-> | /negPf->] := altP (i =P i1); rewrite ?eqxx // ifN.
-have lt_t_i i0 i1 ri i: (i0 <= i1 < ri)%N -> (t_i i0 i1 i < ri)%N = (i < ri)%N.
- case/andP=> le_i01 lti1 /=.
- by do 2?case: eqP => [-> | _] //; rewrite ?(leq_trans _ lti1).
-have t_mP i0 i1 (m0 : model G):
- (i0 <= i1 < m0.1)%N -> is_Lmodel m0 (m0 \o t_ij i0 i1).
-- have [lbm0 Zm0 Dm0] := LmodelP m0; split=> //= ij1 ij2 wf_ij1 wf_ij2.
- by rewrite Dm0 /dot_ref ?(can_eq (t_iK _ _)) // !inE ?lt_t_i.
-pose t_m i0 i1 m0 lti01 := Model (t_mP i0 i1 m0 lti01) (RmodelP m0).
-without loss suffices{j0 lt_t_i} IHm: m /
- exists dk, {in wf_ref m, forall ij, '[m ij, dchi dk] = (ij.2 == 0%N)%:R}.
-- have [_ | nzj0] := altP eqP; first by exists (dirr1 G).
- have ltj0: (j0.-1 < m.2)%N by rewrite prednK ?lt0n ?leq_ord.
- have{IHm} [dk Ddk] := IHm (tr_model (t_m 0%N j0.-1 (tr_model m) ltj0)).
- exists dk => i j _ nzi nzj; rewrite -[j.-1](t_iK 0%N j0.-1).
- rewrite (Ddk (_, _)) ?inE ?lt_t_i // ?prednK ?lt0n ?leq_ord //.
- by rewrite (inv_eq (t_iK _ _)) -eqSS !prednK ?lt0n.
-pose cl11 := & b11 = x1 + x2 + x3.
-without loss m_th: m / sat m |= cl11 & ? in b21.
- move=> IHm; suffices{IHm}: sat m |= & ? in b11 & ? in b21.
- have fill_b11 := sat_fill _ (mem_nth cl11 (_ : 1 < _))%N.
- by do 3![case/fill_b11=> // ?]; apply: IHm.
- have [[_ _ m1gt2 /ltnW m2gt0 _] _ _] := LmodelP m.
- by rewrite /sat /= -!andbA /= m2gt0 -(subnKC m1gt2).
-without loss{m_th} m_th: m / sat m |= & x1 in b11 & x1 in b21.
- pose sat123P := @allP _ (fun k => sat_lit m _ (k, _)) (rev (iota 0 3)).
- have [m123 | ] := altP (sat123P b21 0).
- suffices: sat m |= cl11 & ~x1, ~x2, ~x3 in b21 by move/(O(21, 11)).
- by rewrite /sat /= {1}/sat_cl /= !m123.
- case/allPn=> k k012 /negP nz_m21 IHm; rewrite -[sat_lit _ _ _]andbT in nz_m21.
- have ltk3: (k < 3)%N by rewrite mem_rev mem_iota in k012.
- have [[/andP[/allP/=n1m _] Zm] [_ /= m_gt2 _]] := (RmodelP m, and3P m_th).
- have ltk := leq_trans ltk3 m_gt2.
- have{n1m Zm} mkP: is_Rmodel [:: m`_k].
- by split=> [|_ /predU1P[->|//]]; rewrite /orthonormal /= ?n1m ?Zm ?mem_nth.
- pose mk := Model (LmodelP m) mkP; apply: {IHm}(IHm mk).
- have{m_th} [v lit_v m_th] := sat_cases k m_th (mem_head _ _) ltk.
- suffices: sat mk |= & x1 in b11 & (Lit 1 v) in b21.
- by case/or4P: lit_v m_th => // /eqP-> => [/and4P[] | | _ /(L(21,11))].
- have [m_bb _ m_b21 /sat123P m_b11 _] := and5P m_th.
- by apply/and5P; split; rewrite // /sat_cl /= [sat_lit _ _ _]m_b11.
-have /dIrrP[dk Ddk]: m`_0 \in dirr G.
- have [[/andP[/allP n1m _] Zm] [_ m_gt0 _]] := (RmodelP m, and3P m_th).
- by rewrite dirrE Zm ?[_ == 1]n1m ?mem_nth.
-exists dk => [][i j] /andP[/= lti ltj]; apply/eqP.
-suffices{dk Ddk}: sat_cl m (& (Lit 1 (j == 0))%N in (i, j)).
- by rewrite /sat_cl /= andbT /sat_lit Ddk.
-without loss{i lti} ->: m i ltj m_th / i = 0%N.
- have [bb21_m m_gt0 m11_x1 m21_x1 _] := and5P m_th.
- move=> IHi; suffices{IHi} m_i1_x1: sat_lit m (i, 0)%N x1 && true.
- apply: (IHi (t_m 0%N i m lti) 0%N); rewrite /sat /sat_cl //= bb21_m m_gt0.
- by rewrite /= m_i1_x1 /sat_lit /= andbT /t_ij /=; case: ifP.
- case i_gt1: (1 < i)%N; last by case: (i) i_gt1 => [|[|[]]].
- have itv_i: (1 < i < m.1)%N by [apply/andP]; pose m2 := t_m 2 i m itv_i.
- have m2_th: sat m2 |= & x1 in b11 & x1 in b21 & ? in b31.
- rewrite /sat m_gt0 -andbA (leq_trans _ lti) ?(leq_trans _ ltj) /sat_cl //=.
- by rewrite /sat_lit /= -(subnKC i_gt1); have [_ _] := and3P m_th.
- have [v] := sat_cases _ m2_th (mem_head _ _) m_gt0; rewrite !inE.
- by case/or3P=> /eqP-> => [/unsat_Ii | /and4P[] | /(L(31,11))].
-have [-> | nzj] := posnP j; first by case/and5P: m_th.
-without loss{ltj nzj} ->: m j m_th / j = 1%N.
- have itv_j: (0 < j < m.2)%N by rewrite nzj.
- move/(_ (tr_model (t_m _ j (tr_model m) itv_j)) _ _ (erefl _)) => /=.
- by rewrite /sat /sat_cl /sat_lit /= -(prednK nzj) => ->.
-have{m_th}[/= _ m_gt0 m_x1] := and3P m_th.
-have{m_x1} m_th: sat m |= & x1 in b11 & x1 in b21 & ? in b12.
- by rewrite /sat m_gt0 /sub_bbox; have [[_ _ -> ->]] := LmodelP m.
-have [v] := sat_cases 0%N m_th (mem_head _ _) m_gt0; rewrite !inE.
-by case/or3P=> /eqP-> => [/and4P[] | /unsat_C | /(L(12,11))].
-Qed.
-
-(* This is Peterfalvi (3.5). *)
-(* We have inlined part of the proof of (3.5.5) in this main proof, replacing *)
-(* some combinatorial arguments with direct computation of the dot product, *)
-(* this avoids the duplicate case analysis required to exploit (3.5.5) as it *)
-(* is stated in the text. *)
-Lemma cyclicTIiso_basis_exists :
- exists xi_ : Iirr W1 -> Iirr W2 -> 'CF(G),
- [/\ xi_ 0 0 = 1, forall i j, xi_ i j \in 'Z[irr G],
- forall i j, i != 0 -> j != 0 ->
- 'Ind (alpha_ i j) = 1 - xi_ i 0 - xi_ 0 j + xi_ i j
- & forall i1 j1 i2 j2, '[xi_ i1 j1, xi_ i2 j2] = ((i1, j1) == (i2, j2))%:R].
-Proof.
-(* Instantiate the abstract theory vertically and horizontally. *)
-pose beta i j : 'CF(G) := 'Ind[G] (alpha_ i j) - 1.
-have Zbeta i j: beta i j \in 'Z[irr G].
- by rewrite rpredB ?rpred1 ?cfInd_vchar ?cfCycTI_vchar.
-have o_alphaG_1 i j: i != 0 -> j != 0 -> '['Ind[G] (alpha_ i j), 1] = 1.
- by move=> nz_i nz_j; rewrite -cfdot_Res_r rmorph1 cfdot_alpha_1.
-have o_beta_1 i j: i != 0 -> j != 0 -> '[beta i j, 1] = 0.
- by move=> nzi nzj; rewrite cfdotBl o_alphaG_1 // cfnorm1 subrr.
-have o_beta i1 j1 i2 j2 : i1 != 0 -> j1 != 0 -> i2 != 0 -> j2 != 0 ->
- '[beta i1 j1, beta i2 j2] = ((i1 == i2).+1 * (j1 == j2).+1 - 1)%:R.
-- move=> nzi1 nzj1 nzi2 nzj2; rewrite mulSnr addnS mulnSr /=.
- rewrite cfdotBr o_beta_1 // subr0 cfdotBl (cfdotC 1) o_alphaG_1 //.
- rewrite (normedTI_isometry tiV) ?cfCycTI_on // rmorph1 addrC.
- rewrite (alphaE i2) cfdotDr !cfdotBr cfdot_alpha_1 // -!addrA addKr addrA.
- rewrite addrC cfdot_alpha_w // subn1 -addnA !natrD mulnb; congr (_ + _).
- rewrite alphaE -w_00 !(cfdotBl, cfdotDl) !cfdot_w !eqxx !(eq_sym 0).
- rewrite (negPf nzi1) (negPf nzj1) (negPf nzi2) (negPf nzj2) /= !andbF !andbT.
- by rewrite !addr0 !subr0 !opprB !subr0.
-pose beta_fun := [fun ij => beta (inord ij.1.+1) (inord ij.2.+1)].
-have beta_modelP: is_Lmodel ((Nirr W1).-1, (Nirr W2).-1) beta_fun.
- split=> [ | //= | ij1 ij2 /=/andP[lti1 ltj1] /andP[lti2 ltj2]].
- by rewrite -!(ltnS 2) -eqSS NirrW1 NirrW2.
- by rewrite o_beta -?val_eqE /= ?inordK.
-pose beta_model := Model beta_modelP (nil_RmodelP G).
-have betaE i j: i != 0 -> j != 0 -> beta i j = beta_fun (i.-1, j.-1).
- by move=> nzi nzj /=; rewrite !prednK ?lt0n ?inord_val.
-have /fin_all_exists [dXi0 betaXi0] i0: exists dX, i0 != 0 ->
- forall i j, i != 0 -> j != 0 -> '[beta i j, dchi dX] = (i == i0)%:R.
-- have [/= dX DdX] := @column_pivot (tr_model beta_model) i0.
- by exists dX => nzi0 i j nzi nzj; rewrite betaE ?DdX.
-have /fin_all_exists [dX0j betaX0j] j0: exists dX, j0 != 0 ->
- forall i j, i != 0 -> j != 0 -> '[beta i j, dchi dX] = (j == j0)%:R.
-- have [dX DdX] := @column_pivot beta_model j0.
- by exists dX => nzj0 i j nzi nzj; rewrite betaE ?DdX.
-pose Xi0 j := dchi (dXi0 j); pose X0j i := dchi (dX0j i).
-(* Construct the orthonormal family xi_ i j. *)
-pose xi_ i j := if i == 0 then if j == 0 then 1 else - X0j j else
- if j == 0 then - Xi0 i else beta i j - Xi0 i - X0j j.
-exists xi_; split=> [| i j | i j nzi nzj | i1 j1 i2 j2].
-- by rewrite /xi_ !eqxx.
-- rewrite /xi_; do 2!case: ifP => _; rewrite ?rpred1 ?rpredN ?dchi_vchar //.
- by rewrite 2?rpredB ?dchi_vchar.
-- by rewrite /xi_ /= !ifN // addrCA subrK addrACA subrK addrA addrK.
-have o_dchi i j dk1 dk2 (phi := beta i j):
- '[phi, dchi dk1] = 1 -> '[phi, dchi dk2] = 0 -> '[dchi dk1, dchi dk2] = 0.
-- move=> phi1 phi0; have /eqP: 1 != 0 :> algC := oner_neq0 _.
- rewrite -phi1 cfdot_dchi; do 2!case: eqP => [->|_]; rewrite ?subrr //.
- by rewrite dchi_ndirrE cfdotNr phi0 oppr0.
-have [nzi01 nzj01] := (Iirr1_neq0 ntW1, Iirr1_neq0 ntW2).
-have X0j_1 j: j != 0 -> '[X0j j, 1] = 0.
- by move=> nzj; rewrite -dchi1 (o_dchi #1 j) ?betaX0j ?eqxx ?dchi1 ?o_beta_1.
-have Xi0_1 i: i != 0 -> '[Xi0 i, 1] = 0.
- by move=> nzi; rewrite -dchi1 (o_dchi i #1) ?betaXi0 ?eqxx ?dchi1 ?o_beta_1.
-have Xi0_X0j i j: i != 0 -> j != 0 -> '[Xi0 i, X0j j] = 0.
- move=> nzi nzj; pose j' := conjC_Iirr j.
- apply: (o_dchi i j'); rewrite (betaX0j, betaXi0) ?conjC_Iirr_eq0 ?eqxx //.
- by rewrite -(inj_eq irr_inj) conjC_IirrE mulrb ifN ?odd_eq_conj_irr1 ?irr_eq1.
-have X0j_X0j j j0: j != 0 -> j0 != 0 -> '[X0j j, X0j j0] = (j == j0)%:R.
- move=> nzj nzj0; case: (altP eqP) => [-> | j0'j]; first exact: cfnorm_dchi.
- by apply: (o_dchi #1 j); rewrite ?betaX0j ?eqxx ?(negPf j0'j).
-have Xi0_Xi0 i i0: i != 0 -> i0 != 0 -> '[Xi0 i, Xi0 i0] = (i == i0)%:R.
- move=> nzi nzi0; case: (altP eqP) => [-> | i0'i]; first exact: cfnorm_dchi.
- by apply: (o_dchi i #1); rewrite ?betaXi0 ?eqxx ?(negPf i0'i).
-have oxi_00 i j: '[xi_ i j, xi_ 0 0] = ((i == 0) && (j == 0))%:R.
- rewrite /xi_; case: ifPn => [_ | nzi].
- by case: ifPn => [_ | nzj]; rewrite ?cfnorm1 // cfdotNl X0j_1 ?oppr0.
- case: ifPn => [_ | nzj]; first by rewrite cfdotNl Xi0_1 ?oppr0.
- by rewrite 2!cfdotBl o_beta_1 ?X0j_1 ?Xi0_1 ?subr0.
-have oxi_0j i j j0: '[xi_ i j, xi_ 0 j0] = ((i == 0) && (j == j0))%:R.
- rewrite /xi_; have [-> | nzj0] := altP (j0 =P 0); first exact: oxi_00.
- rewrite cfdotNr; case: ifPn => [_ | nzi].
- have [-> | nzj] := altP eqP; last by rewrite cfdotNl opprK X0j_X0j.
- by rewrite cfdotC X0j_1 // conjC0 oppr0 mulrb ifN_eqC.
- have [_ | nzj] := ifPn; first by rewrite cfdotNl Xi0_X0j ?oppr0.
- by rewrite 2!cfdotBl Xi0_X0j // subr0 betaX0j ?X0j_X0j // subrr oppr0.
-have{oxi_00} oxi_i0 i j i0: '[xi_ i j, xi_ i0 0] = ((i == i0) && (j == 0))%:R.
- rewrite /xi_; have [-> | nzi0] := altP (i0 =P 0); first exact: oxi_00.
- rewrite cfdotNr andbC; have [_ | nzj] := boolP (j == 0).
- have [-> | nzi] := altP eqP; last by rewrite cfdotNl opprK Xi0_Xi0.
- by rewrite cfdotC Xi0_1 // conjC0 oppr0 mulrb ifN_eqC.
- have [_ | nzi] := ifPn; first by rewrite cfdotNl opprK cfdotC Xi0_X0j ?conjC0.
- rewrite 2!cfdotBl betaXi0 ?Xi0_Xi0 // subrr add0r opprK.
- by rewrite cfdotC Xi0_X0j // conjC0.
-have [-> | nzi2] := altP (i2 =P 0); first exact: oxi_0j.
-have [-> | nzj2] := altP (j2 =P 0); first exact: oxi_i0.
-rewrite cfdotC eq_sym; apply: canLR (@conjCK _) _; rewrite rmorph_nat.
-have [-> | nzi1] := altP (i1 =P 0); first exact: oxi_0j.
-have [-> | nzj1] := altP (j1 =P 0); first exact: oxi_i0.
-have ->: xi_ i1 j1 = beta i1 j1 + xi_ i1 0 + xi_ 0 j1 by rewrite /xi_ !ifN.
-rewrite 2!cfdotDr oxi_i0 oxi_0j andbC /xi_ (negPf nzi2) (negPf nzj2) !addr0.
-rewrite eq_sym xpair_eqE cfdotC 2!cfdotBr o_beta // betaXi0 ?betaX0j //.
-by rewrite -!CintrE /= rmorph_int; do 2!case: (_ == _).
-Qed.
-
-End CyclicTIisoBasis.
-
-(* This is PeterFalvi, Theorem (3.2)(a, b, c). *)
-Theorem cyclicTIiso_exists :
- {sigma : 'Hom(cfun_vectType W, cfun_vectType G) |
- [/\ {in 'Z[irr W], isometry sigma, to 'Z[irr G]}, sigma 1 = 1
- & {in 'CF(W, V), forall phi : 'CF(W), sigma phi = 'Ind[G] phi}]}.
-Proof.
-pose sigmaVP f := ('CF(W, V) <= lker (linfun f - linfun 'Ind[G]))%VS.
-pose sigmaP f := [&& orthonormal (map f (irr W)), f 1 == 1 & sigmaVP f].
-pose sigma_base f := [seq (dchi (f k) : 'CF(G)) | k : Iirr W].
-pose sigma_spec f := sigmaP (sval (linear_of_free (irr W) (sigma_base f))).
-suffices /sigW[f /and3P[]]: exists f : {ffun _}, sigma_spec f.
- case: linear_of_free => /=sigma Dsigma o1sigma /eqP sigma1 /eqlfun_inP sigmaV.
- exists (linfun sigma); split=> [|| phi /sigmaV]; try by rewrite !lfunE.
- do [rewrite size_map !size_tuple => /(_ (irr_free W) (card_ord _))] in Dsigma.
- have [inj_sigma dot_sigma] := orthonormalP o1sigma.
- rewrite -(map_tnth_enum (irr W)) -map_comp in Dsigma inj_sigma.
- move/eq_in_map in Dsigma; move/injectiveP in inj_sigma.
- split=> [|_ /zchar_tuple_expansion[z Zz ->]].
- apply: isometry_in_zchar=> _ _ /irrP[k1 ->] /irrP[k2 ->] /=.
- by rewrite !lfunE dot_sigma ?map_f ?mem_irr // cfdot_irr (inj_eq inj_sigma).
- rewrite linear_sum rpred_sum // => k _; rewrite linearZ rpredZ_Cint //=.
- by rewrite -tnth_nth lfunE [sigma _]Dsigma ?mem_enum ?dchi_vchar.
-have [xi_ [xi00 Zxi Dxi o1xi]] := cyclicTIiso_basis_exists.
-pose f := [ffun k => dirr_dIirr (prod_curry xi_) (inv_dprod_Iirr defW k)].
-exists f; apply/and3P; case: linear_of_free => /= sigma Dsigma.
-have{f Dsigma} Deta i j: sigma (w_ i j) = xi_ i j.
- rewrite /w_ -tnth_map /= (tnth_nth 0) /=.
- rewrite Dsigma ?irr_free //; last by rewrite !size_tuple card_ord.
- rewrite nth_mktuple ffunE dprod_IirrK dirr_dIirrE // => {i j} [[i j]] /=.
- by rewrite dirrE Zxi o1xi !eqxx.
-have sigma1: sigma 1 = 1 by rewrite -w_00 Deta.
-rewrite sigma1 /sigmaVP -(span_basis cfWVbasis); split=> //.
- rewrite map_orthonormal ?irr_orthonormal //; apply: isometry_in_zchar.
- move=> _ _ /cycTIirrP[i1 [j1 ->]] /cycTIirrP[i2 [j2 ->]] /=.
- by rewrite !Deta o1xi cfdot_w.
-apply/span_subvP=> _ /imageP[[i j] /setXP[nzi nzj] ->]; rewrite !inE in nzi nzj.
-rewrite memv_ker !lfun_simp /= subr_eq0 Dxi //.
-by rewrite alphaE linearD !linearB sigma1 !Deta.
-Qed.
-
-Fact cyclicTIiso_key : unit. Proof. by []. Qed.
-Definition cyclicTIiso :=
- locked_with cyclicTIiso_key (lfun_linear (sval cyclicTIiso_exists)).
-Local Notation sigma := cyclicTIiso.
-Let im_sigma := map sigma (irr W).
-Let eta_ i j := sigma (w_ i j).
-
-Lemma cycTI_Zisometry : {in 'Z[irr W], isometry sigma, to 'Z[irr G]}.
-Proof. by rewrite [sigma]unlock; case: cyclicTIiso_exists => ? []. Qed.
-
-Let Isigma : {in 'Z[irr W] &, isometry sigma}.
-Proof. by case: cycTI_Zisometry. Qed.
-Let Zsigma : {in 'Z[irr W], forall phi, sigma phi \in 'Z[irr G]}.
-Proof. by case: cycTI_Zisometry. Qed.
-
-Lemma cycTIisometry : isometry sigma.
-Proof.
-move=> phi psi; have [[a ->] [b ->]] := (cfun_irr_sum phi, cfun_irr_sum psi).
-rewrite !linear_sum !cfdot_suml; apply: eq_bigr => i _.
-rewrite !cfdot_sumr; apply: eq_bigr => j _.
-by rewrite !linearZ !cfdotZl !cfdotZr /= Isigma ?irr_vchar.
-Qed.
-
-Lemma cycTIiso_vchar i j : eta_ i j \in 'Z[irr G].
-Proof. by rewrite Zsigma ?irr_vchar. Qed.
-
-Lemma cfdot_cycTIiso i1 i2 j1 j2 :
- '[eta_ i1 j1, eta_ i2 j2] = ((i1 == i2) && (j1 == j2))%:R.
-Proof. by rewrite cycTIisometry. Qed.
-
-Lemma cfnorm_cycTIiso i j : '[eta_ i j] = 1.
-Proof. by rewrite cycTIisometry cfnorm_irr. Qed.
-
-Lemma cycTIiso_dirr i j : eta_ i j \in dirr G.
-Proof. by rewrite dirrE cycTIiso_vchar /= cfnorm_cycTIiso. Qed.
-
-Lemma cycTIiso_orthonormal : orthonormal im_sigma.
-Proof. by rewrite map_orthonormal ?irr_orthonormal. Qed.
-
-Lemma cycTIiso_eqE i1 i2 j1 j2 :
- (eta_ i1 j1 == eta_ i2 j2) = ((i1 == i2) && (j1 == j2)).
-Proof.
-have /inj_in_eq-> := Zisometry_inj Isigma; try exact: irr_vchar.
-by rewrite (inj_eq irr_inj) (inj_eq (dprod_Iirr_inj _)).
-Qed.
-
-Lemma cycTIiso_neqN i1 i2 j1 j2 : (eta_ i1 j1 == - eta_ i2 j2) = false.
-Proof.
-rewrite -addr_eq0; apply/eqP=> /(congr1 (cfdot (eta_ i1 j1)))/eqP.
-by rewrite cfdot0r cfdotDr !cfdot_cycTIiso !eqxx -mulrS pnatr_eq0.
-Qed.
-
-Lemma cycTIiso1 : sigma 1 = 1.
-Proof. by rewrite [sigma]unlock; case: cyclicTIiso_exists => ? []. Qed.
-
-Lemma cycTIiso_Ind : {in 'CF(W, V), forall phi, sigma phi = 'Ind[G, W] phi}.
-Proof. by rewrite [sigma]unlock; case: cyclicTIiso_exists => ? []. Qed.
-
-Let sigma_Res_V :
- [/\ forall phi, {in V, sigma phi =1 phi}
- & forall psi : 'CF(G), orthogonal psi im_sigma -> {in V, psi =1 \0}].
-Proof.
-have sigW i j : '[sigma 'chi_i, sigma 'chi_j] = (i == j)%:R.
- by rewrite cycTIisometry cfdot_irr.
-have [j | sigmaV sigma'V] := equiv_restrict_compl_ortho sWG nsVW cfWVbasis sigW.
- rewrite /= -/cfWVbase -(eq_bigr _ (fun _ _ => linearZ _ _)) /= -linear_sum.
- rewrite -cfun_sum_cfdot cycTIiso_Ind //.
- by rewrite (basis_mem cfWVbasis) ?mem_nth ?size_image.
-split=> [phi v Vv | psi /orthoPl o_psi_sigma].
- rewrite [phi]cfun_sum_cfdot linear_sum !sum_cfunE.
- by apply: eq_bigr => k _; rewrite linearZ !cfunE sigmaV.
-by apply: sigma'V => k; rewrite o_psi_sigma ?map_f ?mem_irr.
-Qed.
-
-(* This is Peterfalvi, Theorem (3.2)(d). *)
-Theorem cycTIiso_restrict phi : {in V, sigma phi =1 phi}.
-Proof. by case: sigma_Res_V. Qed.
-
-(* This is Peterfalvi, Theorem (3.2)(e). *)
-Theorem ortho_cycTIiso_vanish (psi : 'CF(G)) :
- orthogonal psi im_sigma -> {in V, forall x, psi x = 0}.
-Proof. by case: sigma_Res_V psi. Qed.
-
-(* This is PeterFalvi (3.7). *)
-Lemma cycTIiso_cfdot_exchange (psi : 'CF(G)) i1 i2 j1 j2 :
- {in V, forall x, psi x = 0} ->
- '[psi, eta_ i1 j1] + '[psi, eta_ i2 j2]
- = '[psi, eta_ i1 j2] + '[psi, eta_ i2 j1].
-Proof.
-move=> psiV_0; pose phi : 'CF(W) := w_ i1 j1 + w_ i2 j2 - w_ i1 j2 - w_ i2 j1.
-have Vphi: phi \in 'CF(W, V).
- apply/cfun_onP=> g; rewrite inE negb_and negbK !inE orbC.
- case/or3P=> [/cfun0-> // | W1g | W2g]; apply/eqP; rewrite !cfunE subr_eq0.
- by rewrite addrC -[g]mulg1 /w_ !dprod_IirrE !cfDprodE ?lin_char1 ?addKr.
- by rewrite -[g]mul1g /w_ !dprod_IirrE !cfDprodE ?lin_char1 ?addrK.
-suffices: '[psi, 'Ind[G] phi] == 0.
- rewrite -!cycTIiso_Ind // !linearB !linearD !cfdotBr !cfdotDr.
- by rewrite -addrA -opprD subr_eq0 => /eqP.
-rewrite (cfdotEr _ (cfInd_on sWG Vphi)) big1 ?mulr0 //.
-by move=> _ /imset2P[x y Vx Gy ->]; rewrite cfunJ ?psiV_0 ?mul0r.
-Qed.
-
-(* This is NC as defined in PeterFalvi (3.6). *)
-Definition cyclicTI_NC phi := #|[set ij | '[phi, eta_ ij.1 ij.2] != 0]|.
-Local Notation NC := cyclicTI_NC.
-
-Lemma cycTI_NC_opp (phi : 'CF(G)) : (NC (- phi)%R = NC phi)%N.
-Proof. by apply: eq_card=> [[i j]]; rewrite !inE cfdotNl oppr_eq0. Qed.
-
-Lemma cycTI_NC_sign (phi : 'CF(G)) n : (NC ((-1) ^+ n *: phi)%R = NC phi)%N.
-Proof.
-elim: n=> [|n IH]; rewrite ?(expr0,scale1r) //.
-by rewrite exprS -scalerA scaleN1r cycTI_NC_opp.
-Qed.
-
-Lemma cycTI_NC_iso i j : NC (eta_ i j) = 1%N.
-Proof.
-rewrite -(cards1 (i, j)); apply: eq_card => [[i1 j1]]; rewrite !inE /=.
-rewrite cfdot_cycTIiso //= pnatr_eq0 (can_eq oddb _ false) eqbF_neg negbK.
-by rewrite -xpair_eqE eq_sym.
-Qed.
-
-Lemma cycTI_NC_irr i : (NC 'chi_i <= 1)%N.
-Proof.
-apply: wlog_neg; rewrite -ltnNge => /ltnW/card_gt0P[[i1 j1]].
-rewrite inE cfdot_dirr ?(irr_dirr, cycTIiso_dirr) //=.
-case: ('chi_i =P _) => [-> | _]; first by rewrite cycTI_NC_opp cycTI_NC_iso.
-by case: ('chi_i =P _)=> [-> | _]; rewrite (cycTI_NC_iso, eqxx).
-Qed.
-
-Lemma cycTI_NC_dirr f : f \in dirr G -> (NC f <= 1)%N.
-Proof. by case/dirrP=> b [i ->]; rewrite cycTI_NC_sign cycTI_NC_irr. Qed.
-
-Lemma cycTI_NC_dchi di : (NC (dchi di) <= 1)%N.
-Proof. by rewrite cycTI_NC_dirr ?dirr_dchi. Qed.
-
-Lemma cycTI_NC_0 : NC 0 = 0%N.
-Proof. by apply: eq_card0 => ij; rewrite !inE cfdot0l eqxx. Qed.
-
-Lemma cycTI_NC_add n1 n2 phi1 phi2 :
- (NC phi1 <= n1 -> NC phi2 <= n2 -> NC (phi1 + phi2)%R <= n1 + n2)%N.
-Proof.
-move=> ub1 ub2; apply: leq_trans {ub1 ub2}(leq_add ub1 ub2).
-rewrite -cardsUI -[NC _]addn0 leq_add // subset_leq_card //.
-apply/subsetP=> [[i j]]; rewrite !inE /= -negb_and cfdotDl.
-by apply: contra => /andP[/eqP-> /eqP->]; rewrite addr0.
-Qed.
-
-Lemma cycTI_NC_sub n1 n2 phi1 phi2 :
- (NC phi1 <= n1 -> NC phi2 <= n2 -> NC (phi1 - phi2)%R <= n1 + n2)%N.
-Proof. by move=> ub1 ub2; rewrite cycTI_NC_add ?cycTI_NC_opp. Qed.
-
-Lemma cycTI_NC_scale_nz a phi : a != 0 -> NC (a *: phi) = NC phi.
-Proof.
-move=> nz_a; apply: eq_card => ij.
-by rewrite !inE cfdotZl mulf_eq0 negb_or nz_a.
-Qed.
-
-Lemma cycTI_NC_scale a phi n : (NC phi <= n -> NC (a *: phi) <= n)%N.
-Proof.
-have [-> _ | /cycTI_NC_scale_nz-> //] := eqVneq a 0.
-by rewrite scale0r cycTI_NC_0.
-Qed.
-
-Lemma cycTI_NC_norm phi n :
- phi \in 'Z[irr G] -> '[phi] <= n%:R -> (NC phi <= n)%N.
-Proof.
-move=> Zphi ub_phi; apply: leq_trans (_ : #|dirr_constt phi| <= n)%N.
- rewrite {1}[phi]cfun_sum_dconstt // -sum1_card.
- elim/big_rec2: _ => [|/= i n1 phi1 _]; first by rewrite cycTI_NC_0.
- by apply: cycTI_NC_add; rewrite cycTI_NC_scale ?cycTI_NC_dchi.
-rewrite -leC_nat (ler_trans _ ub_phi) ?cnorm_dconstt // -sumr_const.
-apply: ler_sum => i phi_i; rewrite sqr_Cint_ge1 ?Cint_Cnat ?Cnat_dirr //.
-by rewrite gtr_eqF -?dirr_consttE.
-Qed.
-
-(* This is PeterFalvi (3.8). *)
-Lemma small_cycTI_NC phi i0 j0 (a0 := '[phi, eta_ i0 j0]) :
- {in V, forall x, phi x = 0} -> (NC phi < 2 * minn w1 w2)%N -> a0 != 0 ->
- (forall i j, '[phi, eta_ i j] = (j == j0)%:R * a0)
- \/ (forall i j, '[phi, eta_ i j] = (i == i0)%:R * a0).
-Proof.
-pose a i j := '[phi, eta_ i j]; pose A := [set ij | a ij.1 ij.2 != 0].
-rewrite -[NC phi]/#|A| ltnNge => phiV_0 ubA nz_a0.
-have{phiV_0} Da i2 j2 i1 j1 : a i1 j1 = a i1 j2 + a i2 j1 - a i2 j2.
- by rewrite cycTIiso_cfdot_exchange ?addrK.
-have ubA2: ~~ (w2 + w1 <= #|A| + 2)%N.
- rewrite addnC addn2 -ltnS (contra _ ubA) //; apply: (@leq_trans _ _.+3).
- rewrite odd_geq /= ?odd_add ?oddW1 ?oddW2 // mul2n -addn_min_max -addnn.
- by rewrite uphalf_double leq_add2l gtn_min !leq_max !ltnn orbF -neq_ltn.
-(* This is step (3.8.1). *)
-have Za i1 i2 j1 j2 : a i1 j2 == 0 -> a i2 j1 == 0 -> a i1 j1 == 0.
- have [-> // | /negPf i2'1 /eqP Za12 /eqP Za21] := eqVneq i1 i2.
- apply: contraR ubA2 => nz_a11.
- pose L := [set (if a i1 j == 0 then i2 else i1, j) | j : Iirr W2].
- pose C := [set (i, if a i j1 == 0 then j2 else j1) | i : Iirr W1].
- have [<- <-]: #|L| = w2 /\ #|C| = w1 by rewrite !card_imset // => ? ? [].
- have <-: #|[set (i1, j1); (i2, j2)]| = 2 by rewrite cards2 xpair_eqE i2'1.
- rewrite -cardsUI leq_add ?subset_leq_card //; last first.
- apply/subsetP=> _ /setIP[/imsetP[j _ ->] /imsetP[i _ []]].
- by case: ifP => _ <- ->; rewrite !inE ?Za21 ?(negPf nz_a11) !eqxx ?orbT.
- apply/subsetP=> ij /setUP[] /imsetP[] => [j | i] _ {ij}->; rewrite inE.
- by case: ifPn => // /eqP Za1j; rewrite (Da i1 j1) Za21 Za1j !add0r oppr_eq0.
- by case: ifPn => // /eqP Zai1; rewrite (Da i1 j1) Za12 Zai1 !add0r oppr_eq0.
-pose L i := [set ij | ij.1 == i] :&: A; pose C j := [set ij | ij.2 == j] :&: A.
-have{ubA2} ubLC i j: (#|L i| + #|C j| != w2 + w1)%N.
- apply: contraNneq ubA2 => <-; rewrite addnS leqW // -cardsUI -setIUl -setIIl.
- rewrite -(card1 (i, j)) leq_add ?subset_leq_card ?subsetIr //.
- by apply/subsetP=> ij /setIP[]; rewrite !inE.
-have lbA L1 L2: L1 :&: L2 =i set0 -> (#|L1 :&: A| + #|L2 :&: A| <= #|A|)%N.
- rewrite -cardsUI -setIUl -setIIl => /setP->.
- by rewrite set0I cards0 addn0 subset_leq_card ?subsetIr.
-have oL i1: ~~ [exists j, a i1 j == 0] -> #|L i1| = w2.
- rewrite negb_exists => /forallP nz_a1.
- transitivity #|predX (pred1 i1) (Iirr W2)|; last by rewrite cardX card1 mul1n.
- by apply/eq_card=> ij; rewrite !inE andbT andb_idr // => /eqP->.
-have oC i1 j1 j2 : a i1 j1 != 0 -> a i1 j2 == 0 -> #|C j1| = w1.
- move=> nz_a11 /(Za i1)/contra/(_ nz_a11) nz_a1.
- transitivity #|predX (Iirr W1) (pred1 j1)|; last by rewrite cardX card1 muln1.
- by apply/eq_card=> ij; rewrite !inE andb_idr // => /eqP->.
-(* This is step (3.8.2). *)
-have [/existsP[j1 Za01] | /oL oL0] := boolP [exists j, a i0 j == 0].
- have j0'1 : j1 != j0 by apply: contraTneq Za01 => ->.
- have oC0: #|C j0| = w1 by apply: oC nz_a0 Za01.
- suffices Za0 i j: j != j0 -> a i j = 0.
- left=> i j; rewrite -/(a i j) mulr_natl mulrb; have [->|/Za0//] := altP eqP.
- by rewrite (Da i0 j1) !(Za0 _ j1) // subr0 add0r.
- move=> j0'j; apply: contraNeq (ubLC i j0) => nz_aij; rewrite oC0 oL //.
- apply: contra ubA => /existsP[_ /Za/contra/(_ nz_aij) nz_a_j].
- rewrite minn_mulr geq_min mul2n -addnn -{2}oC0 -(oC i0 j j1) ?lbA // => ij.
- by rewrite !inE; apply/andP=> [[/eqP-> /idPn]].
-(* This is step (3.8.3). *)
-suffices Za0 i j: i != i0 -> a i j = 0.
- right=> i j; rewrite -/(a i j) mulr_natl mulrb; have [->|/Za0//] := altP eqP.
- have /card_gt0P[i1 i0'i]: (0 < #|predC1 i0|)%N.
- by rewrite cardC1 nirrW1 -(subnKC w1gt2).
- by rewrite (Da i1 j0) !(Za0 i1) // subr0 addr0.
-move=> i0'i; suffices /existsP[j1 Zai1]: [exists j, a i j == 0].
- by apply: contraNeq (ubLC i0 j) => /oC/(_ Zai1)->; rewrite oL0.
-apply: contraR ubA; rewrite minn_mulr geq_min orbC mul2n -addnn => /oL{1}<-.
-by rewrite -oL0 lbA // => ij; rewrite !inE; apply/andP=> [[/eqP-> /idPn]].
-Qed.
-
-(* A weaker version of PeterFalvi (3.8). *)
-Lemma cycTI_NC_minn (phi : 'CF(G)) :
- {in V, forall x, phi x = 0} -> (0 < NC phi < 2 * minn w1 w2)%N ->
- (minn w1 w2 <= NC phi)%N.
-Proof.
-move=> phiV_0 /andP[/card_gt0P[[i0 j0]]]; rewrite inE /= => nz_a0 ubNC.
-pose L := [seq (i0, j) | j : Iirr W2]; pose C := [seq (i, j0) | i : Iirr W1].
-have [oL oC]: #|L| = w2 /\ #|C| = w1 by rewrite !card_image // => i j [].
-have [Da | Da] := small_cycTI_NC phiV_0 ubNC nz_a0.
- rewrite geq_min -oC subset_leq_card //.
- by apply/subsetP=> _ /codomP[i ->]; rewrite !inE /= Da eqxx mul1r.
-rewrite geq_min orbC -oL subset_leq_card //.
-by apply/subsetP=> _ /codomP[j ->]; rewrite !inE /= Da eqxx mul1r.
-Qed.
-
-(* Another consequence of (3.8), used in (4.8), (10.5), (10.10) and (11.8). *)
-Lemma eq_signed_sub_cTIiso phi e i j1 j2 :
- let rho := (-1) ^+ e *: (eta_ i j1 - eta_ i j2) in
- phi \in 'Z[irr G] -> '[phi] = 2%:R -> j1 != j2 ->
- {in V, phi =1 rho} -> phi = rho.
-Proof.
-set rho := _ - _; move: phi => phi0 /= Zphi0 n2phi0 neq_j12 eq_phi_rho.
-pose phi := (-1) ^+ e *: phi0; pose psi := phi - rho.
-have{eq_phi_rho} psiV0 z: z \in V -> psi z = 0.
- by move=> Vz; rewrite !cfunE eq_phi_rho // !cfunE signrMK subrr.
-have{Zphi0} Zphi: phi \in 'Z[irr G] by rewrite rpredZsign.
-have{n2phi0} n2phi: '[phi] = 2%:R by rewrite cfnorm_sign.
-have Zrho: rho \in 'Z[irr G] by rewrite rpredB ?cycTIiso_vchar.
-have n2rho: '[rho] = 2%:R.
- by rewrite cfnormBd !cfdot_cycTIiso ?eqxx ?(negPf neq_j12) ?andbF.
-have [oIphi _ Dphi] := dirr_small_norm Zphi n2phi isT.
-have [oIrho _ Drho] := dirr_small_norm Zrho n2rho isT.
-set Iphi := dirr_constt _ in oIphi Dphi.
-set Irho := dirr_constt _ in oIrho Drho.
-suffices /eqP eqIrho: Irho == Iphi by rewrite Drho eqIrho -Dphi signrZK.
-have psi_phi'_lt0 di: di \in Irho :\: Iphi -> '[psi, dchi di] < 0.
- case/setDP=> rho_di phi'di; rewrite cfdotBl subr_lt0.
- move: rho_di; rewrite dirr_consttE; apply: ler_lt_trans.
- rewrite real_lerNgt -?dirr_consttE ?real0 ?Creal_Cint //.
- by rewrite Cint_cfdot_vchar ?dchi_vchar.
-have NCpsi: (NC psi < 2 * minn w1 w2)%N.
- suffices NCpsi4: (NC psi <= 2 + 2)%N.
- by rewrite (leq_ltn_trans NCpsi4) // !addnn mul2n ltn_double leq_min w1gt2.
- by rewrite cycTI_NC_sub // cycTI_NC_norm ?n2phi ?n2rho.
-pose rhoId := dirr_dIirr (fun sk => (-1) ^+ (sk.1 : bool) *: eta_ i sk.2).
-have rhoIdE s k: dchi (rhoId (s, k)) = (-1) ^+ s *: eta_ i k.
- by apply: dirr_dIirrE => sk; rewrite rpredZsign cycTIiso_dirr.
-rewrite eqEcard oIrho oIphi andbT -setD_eq0; apply/set0Pn=> [[dk1 phi'dk1]].
-have [[rho_dk1 _] psi_k1_lt0] := (setDP phi'dk1, psi_phi'_lt0 _ phi'dk1).
-have dot_dk1: '[rho, dchi dk1] = 1.
- rewrite Drho cfdot_suml (big_setD1 dk1) //= cfnorm_dchi big1 ?addr0 //.
- move=> dk2 /setD1P[/negPf dk1'2 /dirr_constt_oppl]; rewrite cfdot_dchi dk1'2.
- by case: eqP => [-> /negP[] | _ _]; rewrite ?subrr ?ndirrK.
-have dot_dk2: 0 < '[rho, rho - dchi dk1].
- by rewrite cfdotBr dot_dk1 n2rho addrK ltr01.
-have{dot_dk1 dot_dk2} [s [k Dk1 rho_k2]]:
- exists s, exists2 k, rhoId (s, k.1) = dk1 & rhoId (~~ s, k.2) \in Irho.
-- move/cfdot_add_dirr_eq1: dot_dk1.
- rewrite dirr_dchi rpredN !cycTIiso_dirr //.
- case=> // Dk1; [exists false, (j1, j2) | exists true, (j2, j1)];
- try apply: dirr_inj; rewrite ?dirr_consttE rhoIdE scaler_sign //=.
- + by rewrite addrC Dk1 addKr in dot_dk2.
- by rewrite Dk1 addrK in dot_dk2.
-rewrite -Dk1 rhoIdE cfdotZr rmorph_sign in psi_k1_lt0.
-have psi_k1_neq0: '[psi, eta_ i k.1] != 0.
- by rewrite -(can_eq (signrMK s)) mulr0 ltr_eqF.
-set dk2 := rhoId _ in rho_k2.
-have NCk2'_le1 (dI : {set _}):
- dk2 \in dI -> #|dI| = 2%N -> (NC (\sum_(dk in dI :\ dk2) dchi dk)%R <= 1)%N.
-- rewrite (cardsD1 dk2) => -> /eqP/cards1P[dk ->].
- by rewrite big_set1 cycTI_NC_dirr ?dirr_dchi.
-suffices /psi_phi'_lt0/ltr_geF/idP[]: dk2 \in Irho :\: Iphi.
- rewrite rhoIdE cfdotZr signrN rmorphN mulNr oppr_ge0 rmorph_sign.
- have := small_cycTI_NC psiV0 NCpsi psi_k1_neq0.
- by case=> // ->; rewrite mulrCA nmulr_lle0 ?ler0n.
-have: (1 + 1 < NC psi)%N.
- apply (@leq_trans (minn w1 w2)); first by rewrite leq_min w1gt2.
- apply: cycTI_NC_minn => //; rewrite NCpsi /NC.
- by rewrite (cardsD1 (i, k.1)) inE /= psi_k1_neq0.
-rewrite inE rho_k2 andbT ltnNge; apply: contra => phi_k2.
-rewrite /psi Drho (big_setD1 dk2) //= Dphi (big_setD1 dk2) //=.
-by rewrite addrAC opprD addNKr addrC cycTI_NC_sub ?NCk2'_le1.
-Qed.
-
-(* This is PeterFalvi (3.9)(a). *)
-Lemma eq_in_cycTIiso (i : Iirr W) (phi : 'CF(G)) :
- phi \in dirr G -> {in V, phi =1 'chi_i} -> phi = sigma 'chi_i.
-Proof.
-move=> Dphi; rewrite -(inv_dprod_IirrK defW i).
-case: (inv_dprod_Iirr _)=> /= i1 j1 EphiC.
-pose psi : 'CF(G) := eta_ i1 j1 - phi.
-have ZpsiV: {in V, forall g, psi g = 0}=> [g GiV|].
- by rewrite /psi !cfunE cycTIiso_restrict // -(EphiC _ GiV) subrr.
-pose a i j := '[psi, eta_ i j]; pose S := [set ij | a ij.1 ij.2 != 0].
-case: (boolP ((i1, j1) \in S))=> [I1J1iS|]; last first.
- rewrite inE negbK /a cfdotBl cfdot_cycTIiso !eqxx /=.
- rewrite cfdot_dirr ?(irr_dirr, cycTIiso_dirr) //.
- case: (boolP (phi == _))=> [|_].
- by rewrite opprK -(natrD _ 1 1) pnatr_eq0.
- case: (boolP (phi == _))=> [/eqP //|].
- by rewrite subr0 oner_eq0.
-have SPos : (0 < #|S|)%N by rewrite (cardD1 (i1,j1)) I1J1iS.
-have SLt: (#|S| <= 2)%N.
- by rewrite -[2]add1n cycTI_NC_sub // !cycTI_NC_dirr // cycTIiso_dirr.
-have: (0 < #|S| < 2 * minn w1 w2)%N.
- rewrite SPos; apply: leq_ltn_trans SLt _.
- by rewrite -{1}[2%N]muln1 ltn_mul2l /= leq_min ![(1 < _)%N]ltnW.
-move/(cycTI_NC_minn ZpsiV); rewrite leqNgt; case/negP.
-by apply: leq_ltn_trans SLt _; rewrite leq_min w1gt2.
-Qed.
-
-(* This is the second part of Peterfalvi (3.9)(a). *)
-Lemma cfAut_cycTIiso u phi : cfAut u (sigma phi) = sigma (cfAut u phi).
-Proof.
-rewrite [phi]cfun_sum_cfdot !raddf_sum; apply: eq_bigr => ij _.
-rewrite /= !(linearZ, cfAutZ) /= -aut_IirrE; congr (_ *: _) => {phi}.
-apply: eq_in_cycTIiso => [|x Vx /=].
- by have /cycTIirrP[i [j ->]] := mem_irr ij; rewrite dirr_aut cycTIiso_dirr.
-by rewrite cfunE cycTIiso_restrict // aut_IirrE cfunE.
-Qed.
-
-Section AutCyclicTI.
-
-Variable iw : Iirr W.
-Let w := 'chi_iw.
-Let a := #[w]%CF.
-
-Let Zsigw : sigma w \in 'Z[irr G].
-Proof. by have [_ -> //] := cycTI_Zisometry; apply: irr_vchar. Qed.
-
-Let lin_w: w \is a linear_char := Wlin iw.
-
-(* This is Peterfalvi (3.9)(b). *)
-Lemma cycTIiso_aut_exists k :
- coprime k a ->
- [/\ exists u, sigma (w ^+ k) = cfAut u (sigma w)
- & forall x, coprime #[x] a -> sigma (w ^+ k) x = sigma w x].
-Proof.
-case/(make_pi_cfAut G)=> u Du_a Du_a'.
-suffices Dwk: sigma (w ^+ k) = cfAut u (sigma w).
- by split=> [|x co_x_a]; [exists u | rewrite Dwk Du_a'].
-rewrite cfAut_cycTIiso; congr (sigma _); apply/cfun_inP=> x Wx.
-have Wxbar: coset _ x \in (W / cfker w)%G by rewrite mem_quotient.
-rewrite exp_cfunE // cfunE -cfQuoEker //.
-rewrite -lin_charX ?cfQuo_lin_char ?cfker_normal // -Du_a ?cfunE //.
- by rewrite char_vchar ?cfQuo_char ?irr_char.
-by rewrite [a]cforder_lin_char // dvdn_exponent.
-Qed.
-
-(* This is Peterfalvi (3.9)(c). *)
-Lemma Cint_cycTIiso_coprime x : coprime #[x] a -> sigma w x \in Cint.
-Proof.
-move=> co_x_a; apply: Cint_rat_Aint (Aint_vchar _ Zsigw).
-have [Qb galQb [QbC AutQbC [w_b genQb memQb]]] := group_num_field_exists <[x]>.
-have{memQb} [wx Dwx]: exists wx, sigma w x = QbC wx.
- have /memQb Qbx := dvdnn #[x].
- have [sw1 /Qbx[wx1 Dwx1] [sw2 /Qbx[wx2 Dwx2] ->]] := vcharP _ Zsigw.
- by exists (wx1 - wx2); rewrite rmorphB !cfunE Dwx1 Dwx2.
-suffices: wx \in fixedField 'Gal({:Qb} / 1).
- rewrite Dwx (galois_fixedField galQb) ?subvf // => /vlineP[z ->].
- by rewrite -in_algE fmorph_eq_rat fmorph_rat Crat_rat.
-apply/fixedFieldP=> [|v_b _]; first exact: memvf.
-have [v Dv] := AutQbC v_b; apply: (fmorph_inj QbC); rewrite Dv -Dwx.
-have [u uQb uQb'] := dvd_restrict_cfAut (W / cfker w) #[x] v.
-transitivity (sigma (cfAut u w) x); first by rewrite -cfAut_cycTIiso cfunE -uQb.
-congr (sigma _ _); apply/cfun_inP=> y Wy; rewrite cfunE -cfQuoEker //.
-rewrite uQb' ?char_vchar ?cfQuo_char ?irr_char // coprime_sym.
-apply: coprime_dvdr co_x_a; rewrite [a]cforder_lin_char //.
-by rewrite dvdn_exponent ?mem_quotient.
-Qed.
-
-End AutCyclicTI.
-
-End Three.
-
-Arguments ortho_cycTIiso_vanish [gT G W W1 W2 defW] ctiW [psi].
-
-Section ThreeSymmetry.
-
-Variables (gT : finGroupType) (G W W1 W2 : {group gT}).
-Implicit Types (defW : W1 \x W2 = W) (xdefW : W2 \x W1 = W).
-Local Notation sigma_ := (@cyclicTIiso gT G W _ _).
-Local Notation w_ defW i j := (cyclicTIirr defW i j).
-
-Lemma cycTIisoC defW xdefW ctiW xctiW i j :
- @sigma_ defW ctiW (w_ defW i j) = @sigma_ xdefW xctiW (w_ xdefW j i).
-Proof.
-apply: eq_in_cycTIiso; first exact: cycTIiso_dirr.
-by rewrite /cyclicTIset setUC cyclicTIirrC; apply: cycTIiso_restrict.
-Qed.
-
-Lemma cycTIiso_irrelC defW xdefW ctiW xctiW :
- @sigma_ defW ctiW = @sigma_ xdefW xctiW.
-Proof.
-suffices: sigma_ ctiW =1 sigma_ xctiW by rewrite ![sigma_ _]unlock => /lfunP->.
-move=> phi; have [z_ ->] := cfun_irr_sum phi; rewrite !linear_sum.
-apply/eq_bigr=> ij _; have [i [j ->]] := cycTIirrP defW (mem_irr ij).
-by rewrite !linearZ /= {1}cycTIisoC cyclicTIirrC.
-Qed.
-
-Lemma cycTIiso_irrel defW defW' ctiW ctiW' :
- @sigma_ defW ctiW = @sigma_ defW' ctiW'.
-Proof.
-have xdefW: W2 \x W1 = W by rewrite dprodC.
-by rewrite !(cycTIiso_irrelC _ (cyclicTIhyp_sym ctiW xdefW)).
-Qed.
-
-End ThreeSymmetry.
diff --git a/mathcomp/odd_order/PFsection4.v b/mathcomp/odd_order/PFsection4.v
deleted file mode 100644
index 3cdff96..0000000
--- a/mathcomp/odd_order/PFsection4.v
+++ /dev/null
@@ -1,994 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime ssralg poly finset fingroup.
-From mathcomp
-Require Import morphism perm automorphism quotient action gfunctor gproduct.
-From mathcomp
-Require Import center commutator zmodp cyclic pgroup nilpotent hall frobenius.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation vector ssrnum algC classfun.
-From mathcomp
-Require Import character inertia vcharacter PFsection1 PFsection2 PFsection3.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 4: The Dade isometry of a certain *)
-(* type of subgroup. *)
-(* Given defW : W1 \x W2 = W, we define here: *)
-(* primeTI_hypothesis L K defW <-> *)
-(* L = K ><| W1, where W1 acts in a prime manner on K (see *)
-(* semiprime in frobenius.v), and both W1 and W2 = 'C_K(W1) *)
-(* are nontrivial and cyclic of odd order; these conditions *)
-(* imply that cyclicTI_hypothesis L defW holds. *)
-(* -> This is Peterfalvi, Hypothesis (4.2), or Feit-Thompson (13.2). *)
-(* prime_Dade_definition L K H A A0 defW <-> *)
-(* A0 = A :|: class_support (cyclicTIset defW) L where A is *)
-(* an L-invariant subset of K^# containing all the elements *)
-(* of K that do not act freely on H <| L; in addition *)
-(* W2 \subset H \subset K. *)
-(* prime_Dade_hypothesis G L K H A A0 defW <-> *)
-(* The four assumptions primeTI_hypothesis L K defW, *)
-(* cyclicTI_hypothesis G defW, Dade_hypothesis G L A0 and *)
-(* prime_Dade_definition L K H A A0 defW hold jointly. *)
-(* -> This is Peterfalvi, Hypothesis (4.6), or Feit-Thompson (13.3) (except *)
-(* that H is not required to be nilpotent, and the "supporting groups" *)
-(* assumptions have been replaced by Dade hypothesis). *)
-(* -> This hypothesis is one of the alternatives under which Sibley's *)
-(* coherence theorem holds (see PFsection6.v), and is verified by all *)
-(* maximal subgroups of type P in a minimal simple odd group. *)
-(* -> prime_Dade_hypothesis coerces to Dade_hypothesis, cyclicTI_hypothesis, *)
-(* primeTI_hypothesis and prime_Dade_definition. *)
-(* For ptiW : primeTI_hypothesis L K defW we also define: *)
-(* prime_cycTIhyp ptiW :: cyclicTI_hypothesis L defW (though NOT a coercion) *)
-(* primeTIirr ptiW i j == the (unique) irreducible constituent of the image *)
-(* (locally) mu2_ i j in 'CF(L) of w_ i j = cyclicTIirr defW i j under *)
-(* the sigma = cyclicTIiso (prime_cycTIhyp ptiW). *)
-(* primeTI_Iirr ptiW ij == the index of mu2_ ij.1 ij.2; indeed mu2_ i j is *)
-(* just notation for 'chi_(primeTI_Iirr ptiW (i, j)). *)
-(* primeTIsign ptiW j == the sign of mu2_ i j in sigma (w_ i j), which does *)
-(* (locally) delta_ j not depend on i. *)
-(* primeTI_Isign ptiW j == the boolean b such that delta_ j := (-1) ^+ b. *)
-(* primeTIres ptiW j == the restriction to K of mu2_ i j, which is an *)
-(* (locally) chi_ j irreducible character that does not depend on i. *)
-(* primeTI_Ires ptiW j == the index of chi_ j := 'chi_(primeTI_Ires ptiW j). *)
-(* primeTIred ptiW j == the (reducible) character equal to the sum of all *)
-(* (locally) mu_ j the mu2_ i j, and also to 'Ind (chi_ j). *)
-(* uniform_prTIred_seq ptiW k == the sequence of all the mu_ j, j != 0, with *)
-(* the same degree as mu_ k (s.t. mu_ j 1 = mu_ k 1). *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory Num.Theory.
-Local Open Scope ring_scope.
-
-Section Four_1_to_2.
-
-(* This is Peterfalvi (4.1). *)
-
-Variable gT : finGroupType.
-
-Lemma vchar_pairs_orthonormal (X : {group gT}) (a b c d : 'CF(X)) u v :
- {subset (a :: b) <= 'Z[irr X]} /\ {subset (c :: d) <= 'Z[irr X]} ->
- orthonormal (a :: b) && orthonormal (c :: d) ->
- [&& u \is Creal, v \is Creal, u != 0 & v != 0] ->
- [&& '[a - b, u *: c - v *: d] == 0,
- (a - b) 1%g == 0 & (u *: c - v *: d) 1%g == 0] ->
- orthonormal [:: a; b; c; d].
-Proof.
-have osym2 (e f : 'CF(X)) : orthonormal (e :: f) -> orthonormal (f :: e).
- by rewrite !(orthonormal_cat [::_] [::_]) orthogonal_sym andbCA.
-have def_o f S: orthonormal (f :: S) -> '[f : 'CF(X)] = 1.
- by case/andP=> /andP[/eqP].
-case=> /allP/and3P[Za Zb _] /allP/and3P[Zc Zd _] /andP[o_ab o_cd].
-rewrite (orthonormal_cat (a :: b)) o_ab o_cd /=.
-case/and4P=> r_u r_v nz_u nz_v /and3P[o_abcd ab1 cd1].
-wlog suff: a b c d u v Za Zb Zc Zd o_ab o_cd r_u r_v nz_u nz_v o_abcd ab1 cd1 /
- '[a, c]_X == 0.
-- move=> IH; rewrite /orthogonal /= !andbT (IH a b c d u v) //=.
- have vc_sym (e f : 'CF(X)) : ((e - f) 1%g == 0) = ((f - e) 1%g == 0).
- by rewrite -opprB cfunE oppr_eq0.
- have ab_sym e: ('[b - a, e] == 0) = ('[a - b, e] == 0).
- by rewrite -opprB cfdotNl oppr_eq0.
- rewrite (IH b a c d u v) // 1?osym2 1?vc_sym ?ab_sym //=.
- rewrite -oppr_eq0 -cfdotNr opprB in o_abcd.
- by rewrite (IH a b d c v u) ?(IH b a d c v u) // 1?osym2 1?vc_sym ?ab_sym.
-apply: contraLR cd1 => nz_ac.
-have [/orthonormal2P[ab0 a1 b1] /orthonormal2P[cd0 c1 d1]] := (o_ab, o_cd).
-have [ea [ia def_a]] := vchar_norm1P Za a1.
-have{nz_ac} [e defc]: exists e : bool, c = (-1) ^+ e *: a.
- have [ec [ic def_c]] := vchar_norm1P Zc c1; exists (ec (+) ea).
- move: nz_ac; rewrite def_a def_c scalerA; rewrite -signr_addb addbK.
- rewrite cfdotZl cfdotZr cfdot_irr mulrA mulrC mulf_eq0.
- by have [-> // | _]:= ia =P ic; rewrite eqxx.
-have def_vbd: v * '[b, d]_X = - ((-1) ^+ e * u).
- apply/eqP; have:= o_abcd; rewrite cfdotDl cfdotNl !raddfB /=.
- rewrite defc !cfdotZr a1 (cfdotC b) ab0 rmorph0 mulr1.
- rewrite -[a]scale1r -{2}[1]/((-1) ^+ false) -(addbb e) signr_addb -scalerA.
- rewrite -defc cfdotZl cd0 !mulr0 opprK addrA !subr0 mulrC addrC addr_eq0.
- by rewrite rmorph_sign !conj_Creal.
-have nz_bd: '[b, d] != 0.
- move/esym/eqP: def_vbd; apply: contraTneq => ->.
- by rewrite mulr0 oppr_eq0 mulf_eq0 signr_eq0.
-have{nz_bd} defd: d = '[b, d] *: b.
- move: nz_bd; have [eb [ib ->]] := vchar_norm1P Zb b1.
- have [ed [id ->]] := vchar_norm1P Zd d1.
- rewrite scalerA cfdotZl cfdotZr rmorph_sign mulrA cfdot_irr.
- have [-> _ | _] := ib =P id; last by rewrite !mulr0 eqxx.
- by rewrite mulr1 mulrAC -!signr_addb addbb.
-rewrite defd scalerA def_vbd scaleNr opprK defc scalerA mulrC -raddfD cfunE.
-rewrite !mulf_neq0 ?signr_eq0 // -(subrK a b) -opprB addrCA 2!cfunE.
-rewrite (eqP ab1) oppr0 add0r cfunE -mulr2n -mulr_natl mulf_eq0 pnatr_eq0.
-by rewrite /= def_a cfunE mulf_eq0 signr_eq0 /= irr1_neq0.
-Qed.
-
-Corollary orthonormal_vchar_diff_ortho (X : {group gT}) (a b c d : 'CF(X)) :
- {subset a :: b <= 'Z[irr X]} /\ {subset c :: d <= 'Z[irr X]} ->
- orthonormal (a :: b) && orthonormal (c :: d) ->
- [&& '[a - b, c - d] == 0, (a - b) 1%g == 0 & (c - d) 1%g == 0] ->
- '[a, c] = 0.
-Proof.
-move=> Zabcd Oabcd; rewrite -[c - d]scale1r scalerBr.
-move/(vchar_pairs_orthonormal Zabcd Oabcd) => /implyP.
-rewrite rpred1 oner_eq0 (orthonormal_cat (a :: b)) /=.
-by case/and3P=> _ _ /andP[] /andP[] /eqP.
-Qed.
-
-(* This is Peterfalvi, Hypothesis (4.2), with explicit parameters. *)
-Definition primeTI_hypothesis (L K W W1 W2 : {set gT}) of W1 \x W2 = W :=
- [/\ (*a*) [/\ K ><| W1 = L, W1 != 1, Hall L W1 & cyclic W1],
- (*b*) [/\ W2 != 1, W2 \subset K & cyclic W2],
- {in W1^#, forall x, 'C_K[x] = W2}
- & (*c*) odd #|W|]%g.
-
-End Four_1_to_2.
-
-Arguments primeTI_hypothesis _ _%g _%g _%g _ _%g _%g.
-
-Section Four_3_to_5.
-
-Variables (gT : finGroupType) (L K W W1 W2 : {group gT}) (defW : W1 \x W2 = W).
-Hypothesis ptiWL : primeTI_hypothesis L K defW.
-
-Let V := cyclicTIset defW.
-Let w1 := #|W1|.
-Let w2 := #|W2|.
-
-Let defL : K ><| W1 = L. Proof. by have [[]] := ptiWL. Qed.
-Let ntW1 : W1 :!=: 1%g. Proof. by have [[]] := ptiWL. Qed.
-Let cycW1 : cyclic W1. Proof. by have [[]] := ptiWL. Qed.
-Let hallW1 : Hall L W1. Proof. by have [[]] := ptiWL. Qed.
-
-Let ntW2 : W2 :!=: 1%g. Proof. by have [_ []] := ptiWL. Qed.
-Let sW2K : W2 \subset K. Proof. by have [_ []] := ptiWL. Qed.
-Let cycW2 : cyclic W2. Proof. by have [_ []] := ptiWL. Qed.
-Let prKW1 : {in W1^#, forall x, 'C_K[x] = W2}. Proof. by have [] := ptiWL. Qed.
-
-Let oddW : odd #|W|. Proof. by have [] := ptiWL. Qed.
-
-Let nsKL : K <| L. Proof. by case/sdprod_context: defL. Qed.
-Let sKL : K \subset L. Proof. by case/andP: nsKL. Qed.
-Let sW1L : W1 \subset L. Proof. by case/sdprod_context: defL. Qed.
-Let sWL : W \subset L.
-Proof. by rewrite -(dprodWC defW) -(sdprodW defL) mulgSS. Qed.
-Let sW1W : W1 \subset W. Proof. by have /mulG_sub[] := dprodW defW. Qed.
-Let sW2W : W2 \subset W. Proof. by have /mulG_sub[] := dprodW defW. Qed.
-
-Let coKW1 : coprime #|K| #|W1|.
-Proof. by rewrite (coprime_sdprod_Hall_r defL). Qed.
-Let coW12 : coprime #|W1| #|W2|.
-Proof. by rewrite coprime_sym (coprimeSg sW2K). Qed.
-
-Let cycW : cyclic W. Proof. by rewrite (cyclic_dprod defW). Qed.
-Let cWW : abelian W. Proof. exact: cyclic_abelian. Qed.
-Let oddW1 : odd w1. Proof. exact: oddSg oddW. Qed.
-Let oddW2 : odd w2. Proof. exact: oddSg oddW. Qed.
-
-Let ntV : V != set0.
-Proof.
-by rewrite -card_gt0 card_cycTIset muln_gt0 -!subn1 !subn_gt0 !cardG_gt1 ntW1.
-Qed.
-
-Let sV_V2 : V \subset W :\: W2. Proof. by rewrite setDS ?subsetUr. Qed.
-
-Lemma primeTIhyp_quotient (M : {group gT}) :
- (W2 / M != 1)%g -> M \subset K -> M <| L ->
- {defWbar : (W1 / M) \x (W2 / M) = W / M
- & primeTI_hypothesis (L / M) (K / M) defWbar}%g.
-Proof.
-move=> ntW2bar sMK /andP[_ nML].
-have coMW1: coprime #|M| #|W1| by rewrite (coprimeSg sMK).
-have [nMW1 nMW] := (subset_trans sW1L nML, subset_trans sWL nML).
-have defWbar: (W1 / M) \x (W2 / M) = (W / M)%g.
- by rewrite (quotient_coprime_dprod nMW) ?quotient_odd.
-exists defWbar; split; rewrite ?quotient_odd ?quotient_cyclic ?quotientS //.
- have isoW1: W1 \isog W1 / M by rewrite quotient_isog ?coprime_TIg.
- by rewrite -(isog_eq1 isoW1) ?morphim_Hall // (quotient_coprime_sdprod nML).
-move=> Kx /setD1P[ntKx /morphimP[x nKx W1x defKx]] /=.
-rewrite -cent_cycle -cycle_eq1 {Kx}defKx -quotient_cycle // in ntKx *.
-rewrite -strongest_coprime_quotient_cent ?cycle_subG //; first 1 last.
-- by rewrite subIset ?sMK.
-- by rewrite (coprimeSg (subsetIl M _)) // (coprimegS _ coMW1) ?cycle_subG.
-- by rewrite orbC abelian_sol ?cycle_abelian.
-rewrite cent_cycle prKW1 // !inE W1x (contraNneq _ ntKx) // => ->.
-by rewrite cycle1 quotient1.
-Qed.
-
-(* This is the first part of PeterFalvi, Theorem (4.3)(a). *)
-Theorem normedTI_prTIset : normedTI (W :\: W2) L W.
-Proof.
-have [[_ _ cW12 _] [_ _ nKW1 tiKW1]] := (dprodP defW, sdprodP defL).
-have nV2W: W \subset 'N(W :\: W2) by rewrite sub_abelian_norm ?subsetDl.
-have piW1_W: {in W1 & W2, forall x y, (x * y).`_\pi(W1) = x}.
- move=> x y W1x W2y /=; rewrite consttM /commute ?(centsP cW12 y) //.
- rewrite constt_p_elt ?(mem_p_elt _ W1x) ?pgroup_pi // (constt1P _) ?mulg1 //.
- by rewrite /p_elt -coprime_pi' // (coprimegS _ coW12) ?cycle_subG.
-have nzV2W: W :\: W2 != set0 by apply: contraNneq ntV; rewrite -subset0 => <-.
-apply/normedTI_memJ_P; split=> // xy g V2xy Lg.
-apply/idP/idP=> [| /(subsetP nV2W)/memJ_norm->//].
-have{xy V2xy} [/(mem_dprod defW)[x [y [W1x W2y -> _]]] W2'xy] := setDP V2xy.
-have{W2'xy} ntx: x != 1%g by have:= W2'xy; rewrite groupMr // => /group1_contra.
-have{g Lg} [k [w [Kk /(subsetP sW1W)Ww -> _]]] := mem_sdprod defL Lg.
-rewrite conjgM memJ_norm ?(subsetP nV2W) ?(groupMr k) // => /setDP[Wxyk _].
-have{Wxyk piW1_W} W1xk: x ^ k \in W1.
- have [xk [yk [W1xk W2yk Dxyk _]]] := mem_dprod defW Wxyk.
- by rewrite -(piW1_W x y) // -consttJ Dxyk piW1_W.
-rewrite (subsetP sW2W) // -(@prKW1 x) ?in_setD1 ?ntx // inE Kk /=.
-rewrite cent1C (sameP cent1P commgP) -in_set1 -set1gE -tiKW1 inE.
-by rewrite (subsetP _ _ (mem_commg W1x Kk)) ?commg_subr // groupM ?groupV.
-Qed.
-
-(* Second part of PeterFalvi, Theorem (4.3)(a). *)
-Theorem prime_cycTIhyp : cyclicTI_hypothesis L defW.
-Proof.
-have nVW: W \subset 'N(V) by rewrite sub_abelian_norm ?subsetDl.
-by split=> //; apply: normedTI_S normedTI_prTIset.
-Qed.
-Local Notation ctiW := prime_cycTIhyp.
-Let sigma := cyclicTIiso ctiW.
-Let w_ i j := cyclicTIirr defW i j.
-
-Let Wlin k : 'chi[W]_k \is a linear_char. Proof. exact/irr_cyclic_lin. Qed.
-Let W1lin i : 'chi[W1]_i \is a linear_char. Proof. exact/irr_cyclic_lin. Qed.
-Let W2lin i : 'chi[W2]_i \is a linear_char. Proof. exact/irr_cyclic_lin. Qed.
-Let w_lin i j : w_ i j \is a linear_char. Proof. exact: Wlin. Qed.
-
-Let nirrW1 : #|Iirr W1| = w1. Proof. exact: card_Iirr_cyclic. Qed.
-Let nirrW2 : #|Iirr W2| = w2. Proof. exact: card_Iirr_cyclic. Qed.
-Let NirrW1 : Nirr W1 = w1. Proof. by rewrite -nirrW1 card_ord. Qed.
-Let NirrW2 : Nirr W2 = w2. Proof. by rewrite -nirrW2 card_ord. Qed.
-Let w1gt1 : (1 < w1)%N. Proof. by rewrite cardG_gt1. Qed.
-
-Let cfdot_w i1 j1 i2 j2 : '[w_ i1 j1, w_ i2 j2] = ((i1 == i2) && (j1 == j2))%:R.
-Proof. exact: cfdot_dprod_irr. Qed.
-
-(* Witnesses for Theorem (4.3)(b). *)
-Fact primeTIdIirr_key : unit. Proof. by []. Qed.
-Definition primeTIdIirr_def := dirr_dIirr (sigma \o prod_curry w_).
-Definition primeTIdIirr := locked_with primeTIdIirr_key primeTIdIirr_def.
-Definition primeTI_Iirr ij := (primeTIdIirr ij).2.
-Definition primeTI_Isign j := (primeTIdIirr (0, j)).1.
-Local Notation Imu2 := primeTI_Iirr.
-Local Notation mu2_ i j := 'chi_(primeTI_Iirr (i, j)).
-Local Notation delta_ j := (GRing.sign algCring (primeTI_Isign j)).
-
-Let ew_ i j := w_ i j - w_ 0 j.
-Let V2ew i j : ew_ i j \in 'CF(W, W :\: W2).
-Proof.
-apply/cfun_onP=> x; rewrite !inE negb_and negbK => /orP[W2x | /cfun0->//].
-by rewrite -[x]mul1g !cfunE /w_ !dprod_IirrE !cfDprodE ?lin_char1 ?subrr.
-Qed.
-
-(* This is Peterfalvi, Theorem (4.3)(b, c). *)
-Theorem primeTIirr_spec :
- [/\ (*b*) injective Imu2,
- forall i j, 'Ind (ew_ i j) = delta_ j *: (mu2_ i j - mu2_ 0 j),
- forall i j, sigma (w_ i j) = delta_ j *: mu2_ i j,
- (*c*) forall i j, {in W :\: W2, mu2_ i j =1 delta_ j *: w_ i j}
- & forall k, k \notin codom Imu2 -> {in W :\: W2, 'chi_k =1 \0}].
-Proof.
-have isoV2 := normedTI_isometry normedTI_prTIset (setDSS sWL (sub1G W2)).
-have /fin_all_exists2[dmu injl_mu Ddmu] j:
- exists2 dmu : bool * {ffun Iirr W1 -> Iirr L}, injective dmu.2
- & forall i, 'Ind (ew_ i j) = dchi (dmu.1, dmu.2 i) - dchi (dmu.1, dmu.2 0).
-- pose Sj := [tuple w_ i j | i < Nirr W1].
- have Sj0: Sj`_0 = w_ 0 j by rewrite (nth_mktuple _ 0 0).
- have irrSj: {subset Sj <= irr W} by move=> ? /mapP[i _ ->]; apply: mem_irr.
- have: {in 'Z[Sj, W :\: W2], isometry 'Ind, to 'Z[irr L, L^#]}.
- split=> [|phi]; first by apply: sub_in2 isoV2; apply: zchar_on.
- move/(zchar_subset irrSj)/(zchar_onS (setDS W (sub1G W2))).
- by rewrite !zcharD1E cfInd1 // mulf_eq0 orbC => /andP[/cfInd_vchar-> // ->].
- case/vchar_isometry_base=> // [|||i|mu Umu [d Ddmu]]; first by rewrite NirrW1.
- + rewrite orthonormal_free // (sub_orthonormal irrSj) ?irr_orthonormal //.
- by apply/injectiveP=> i1 i2 /irr_inj/dprod_Iirr_inj[].
- + by move=> _ /mapP[i _ ->]; rewrite Sj0 !lin_char1.
- + by rewrite nth_mktuple Sj0 V2ew.
- exists (d, [ffun i => tnth mu i]) => [|i].
- apply/injectiveP; congr (uniq _): Umu.
- by rewrite (eq_map (ffunE _)) map_tnth_enum.
- by rewrite -scalerBr /= !ffunE !(tnth_nth 0 mu) -Ddmu nth_mktuple Sj0.
-pose Imu ij := (dmu ij.2).2 ij.1; pose mu i j := 'chi_(Imu (i, j)).
-pose d j : algC := (-1) ^+ (dmu j).1.
-have{Ddmu} Ddmu i j: 'Ind (ew_ i j) = d j *: (mu i j - mu 0 j).
- by rewrite Ddmu scalerBr.
-have{injl_mu} inj_Imu: injective Imu.
- move=> [i1 j1] [i2 j2]; rewrite /Imu /=; pose S i j k := mu i j :: mu k j.
- have [-> /injl_mu-> // | j2'1 /eqP/negPf[] /=] := eqVneq j1 j2.
- apply/(can_inj oddb)/eqP; rewrite -eqC_nat -cfdot_irr -!/(mu _ _) mulr0n.
- have oIew_j12 i k: '['Ind[L] (ew_ i j1), 'Ind[L] (ew_ k j2)] = 0.
- by rewrite isoV2 // cfdotBl !cfdotBr !cfdot_w (negPf j2'1) !andbF !subr0.
- have defSd i j k: mu i j - mu k j = d j *: ('Ind (ew_ i j) - 'Ind (ew_ k j)).
- by rewrite !Ddmu -scalerBr signrZK opprB addrA subrK.
- have Sd1 i j k: (mu i j - mu k j) 1%g == 0.
- by rewrite defSd !(cfunE, cfInd1) ?lin_char1 // !subrr mulr0.
- have exS i j: {k | {subset S i j k <= 'Z[irr L]} & orthonormal (S i j k)}.
- have:= w1gt1; rewrite -nirrW1 (cardD1 i) => /card_gt0P/sigW[k /andP[i'k _]].
- exists k; first by apply/allP; rewrite /= !irr_vchar.
- apply/andP; rewrite /= !cfdot_irr !eqxx !andbT /=.
- by rewrite (inj_eq (injl_mu j)) mulrb ifN_eqC.
- have [[k1 ZS1 o1S1] [k2 ZS2 o1S2]] := (exS i1 j1, exS i2 j2).
- rewrite (orthonormal_vchar_diff_ortho (conj ZS1 ZS2)) ?o1S1 ?Sd1 ?andbT //.
- by rewrite !defSd cfdotZl cfdotZr cfdotBl !cfdotBr !oIew_j12 !subrr !mulr0.
-pose V2base := [tuple of [seq ew_ ij.1 ij.2 | ij in predX (predC1 0) predT]].
-have V2basis: basis_of 'CF(W, W :\: W2) V2base.
- suffices V2free: free V2base.
- rewrite basisEfree V2free size_image /= cardX cardC1 nirrW1 nirrW2 -subn1.
- rewrite mulnBl mul1n dim_cfun_on_abelian ?subsetDl //.
- rewrite cardsD (setIidPr _) // (dprod_card defW) leqnn andbT.
- by apply/span_subvP=> _ /mapP[ij _ ->].
- apply/freeP=> /= z zV2e0 k.
- move Dk: (enum_val k) (enum_valP k) => [i j] /andP[/= nz_i _].
- rewrite -(cfdot0l (w_ i j)) -{}zV2e0 cfdot_suml (bigD1 k) //= cfdotZl.
- rewrite nth_image Dk cfdotBl !cfdot_w !eqxx eq_sym (negPf nz_i) subr0 mulr1.
- rewrite big1 ?addr0 // => k1; rewrite -(inj_eq enum_val_inj) {}Dk nth_image.
- case: (enum_val k1) => /= i1 j1 ij'ij1.
- rewrite cfdotZl cfdotBl !cfdot_dprod_irr [_ && _](negPf ij'ij1).
- by rewrite eq_sym (negPf nz_i) subr0 mulr0.
-have nsV2W: W :\: W2 <| W by rewrite -sub_abelian_normal ?subsetDl.
-pose muW k := let: ij := inv_dprod_Iirr defW k in d ij.2 *: mu ij.1 ij.2.
-have inW := codomP (dprod_Iirr_onto defW _).
-have ImuW k1 k2: '[muW k1, muW k2] = (k1 == k2)%:R.
- have [[[i1 j1] -> {k1}] [[i2 j2] -> {k2}]] := (inW k1, inW k2).
- rewrite cfdotZl cfdotZr !dprod_IirrK (can_eq (dprod_IirrK _)) /= rmorph_sign.
- rewrite cfdot_irr (inj_eq inj_Imu (_, _) (_, _)) -/(d _).
- by case: eqP => [[_ ->] | _]; rewrite ?signrMK ?mulr0.
-have [k|muV2 mu'V2] := equiv_restrict_compl_ortho sWL nsV2W V2basis ImuW.
- rewrite nth_image; case: (enum_val k) (enum_valP k) => /= i j /andP[/= nzi _].
- pose inWj i1 := dprod_Iirr defW (i1, j); rewrite (bigD1 (inWj 0)) //=.
- rewrite (bigD1 (inWj i)) ?(can_eq (dprod_IirrK _)) ?xpair_eqE ?(negPf nzi) //.
- rewrite /= big1 ?addr0 => [|k1 /andP[]]; last first.
- rewrite !(eq_sym k1); have [[i1 j1] -> {k1}] := inW k1.
- rewrite !(can_eq (dprod_IirrK _)) => ij1'i ij1'0.
- by rewrite cfdotBl !cfdot_w !mulrb !ifN // subrr scale0r.
- rewrite /muW !dprod_IirrK /= addrC !cfdotBl !cfdot_w !eqxx /= !andbT.
- by rewrite eq_sym (negPf nzi) subr0 add0r scaleNr !scale1r -scalerBr.
-have Dsigma i j: sigma (w_ i j) = d j *: mu i j.
- apply/esym/eq_in_cycTIiso=> [|x Vx]; first exact: (dirr_dchi (_, _)).
- by rewrite -muV2 ?(subsetP sV_V2) // /muW dprod_IirrK.
-have /all_and2[Dd Dmu] j: d j = delta_ j /\ forall i, Imu (i, j) = Imu2 (i, j).
- suffices DprTI i: primeTIdIirr (i, j) = ((dmu j).1, (dmu j).2 i).
- by split=> [|i]; rewrite /primeTI_Isign /Imu2 DprTI.
- apply: dirr_inj; rewrite /primeTIdIirr unlock_with dirr_dIirrE /= ?Dsigma //.
- by case=> i1 j1; apply: cycTIiso_dirr.
-split=> [[i1 j1] [i2 j2] | i j | i j | i j x V2x | k mu2p'k].
-- by rewrite -!Dmu => /inj_Imu.
-- by rewrite -!Dmu -Dd -Ddmu.
-- by rewrite -Dmu -Dd -Dsigma.
-- by rewrite cfunE -muV2 // /muW dprod_IirrK Dd cfunE signrMK -Dmu.
-apply: mu'V2 => k1; have [[i j] ->{k1}] := inW k1.
-apply: contraNeq mu2p'k; rewrite cfdotZr rmorph_sign mulf_eq0 signr_eq0 /=.
-rewrite /mu Dmu dprod_IirrK -irr_consttE constt_irr inE /= => /eqP <-.
-exact: codom_f.
-Qed.
-
-(* These lemmas restate the various parts of Theorem (4.3)(b, c) separately. *)
-Lemma prTIirr_inj : injective Imu2. Proof. by case: primeTIirr_spec. Qed.
-
-Corollary cfdot_prTIirr i1 j1 i2 j2 :
- '[mu2_ i1 j1, mu2_ i2 j2] = ((i1 == i2) && (j1 == j2))%:R.
-Proof. by rewrite cfdot_irr (inj_eq prTIirr_inj). Qed.
-
-Lemma cfInd_sub_prTIirr i j :
- 'Ind[L] (w_ i j - w_ 0 j) = delta_ j *: (mu2_ i j - mu2_ 0 j).
-Proof. by case: primeTIirr_spec i j. Qed.
-
-Lemma cycTIiso_prTIirr i j : sigma (w_ i j) = delta_ j *: mu2_ i j.
-Proof. by case: primeTIirr_spec. Qed.
-
-Lemma prTIirr_id i j : {in W :\: W2, mu2_ i j =1 delta_ j *: w_ i j}.
-Proof. by case: primeTIirr_spec. Qed.
-
-Lemma not_prTIirr_vanish k : k \notin codom Imu2 -> {in W :\: W2, 'chi_k =1 \0}.
-Proof. by case: primeTIirr_spec k. Qed.
-
-(* This is Peterfalvi, Theorem (4.3)(d). *)
-Theorem prTIirr1_mod i j : (mu2_ i j 1%g == delta_ j %[mod w1])%C.
-Proof.
-rewrite -(cfRes1 W1) -['Res _](subrK ('Res (delta_ j *: w_ i j))) cfunE.
-set phi := _ - _; pose a := '[phi, 1].
-have phi_on_1: phi \in 'CF(W1, 1%g).
- apply/cfun_onP=> g; have [W1g | /cfun0-> //] := boolP (g \in W1).
- rewrite -(coprime_TIg coW12) inE W1g !cfunE !cfResE //= => W2'g.
- by rewrite prTIirr_id ?cfunE ?subrr // inE W2'g (subsetP sW1W).
-have{phi_on_1} ->: phi 1%g = a * w1%:R.
- rewrite mulrC /a (cfdotEl _ phi_on_1) mulVKf ?neq0CG //.
- by rewrite big_set1 cfun11 conjC1 mulr1.
-rewrite cfResE // cfunE lin_char1 // mulr1 eqCmod_addl_mul //.
-by rewrite Cint_cfdot_vchar ?rpred1 ?rpredB ?cfRes_vchar ?rpredZsign ?irr_vchar.
-Qed.
-
-Lemma prTIsign_aut u j : delta_ (aut_Iirr u j) = delta_ j.
-Proof.
-have /eqP := cfAut_cycTIiso ctiW u (w_ 0 j).
-rewrite -cycTIirr_aut aut_Iirr0 -/sigma !cycTIiso_prTIirr raddfZsign /=.
-by rewrite -aut_IirrE eq_scaled_irr => /andP[/eqP].
-Qed.
-
-Lemma prTIirr_aut u i j :
- mu2_ (aut_Iirr u i) (aut_Iirr u j) = cfAut u (mu2_ i j).
-Proof.
-rewrite -!(canLR (signrZK _) (cycTIiso_prTIirr _ _)) -!/(delta_ _).
-by rewrite prTIsign_aut raddfZsign /= cfAut_cycTIiso -cycTIirr_aut.
-Qed.
-
-(* The (reducible) column sums of the prime TI irreducibles. *)
-Definition primeTIred j : 'CF(L) := \sum_i mu2_ i j.
-Local Notation mu_ := primeTIred.
-
-Definition uniform_prTIred_seq j0 :=
- image mu_ [pred j | j != 0 & mu_ j 1%g == mu_ j0 1%g].
-
-Lemma prTIred_aut u j : mu_ (aut_Iirr u j) = cfAut u (mu_ j).
-Proof.
-rewrite raddf_sum [mu_ _](reindex_inj (aut_Iirr_inj u)).
-by apply: eq_bigr => i _; rewrite /= prTIirr_aut.
-Qed.
-
-Lemma cfdot_prTIirr_red i j k : '[mu2_ i j, mu_ k] = (j == k)%:R.
-Proof.
-rewrite cfdot_sumr (bigD1 i) // cfdot_prTIirr eqxx /=.
-rewrite big1 ?addr0 // => i1 neq_i1i.
-by rewrite cfdot_prTIirr eq_sym (negPf neq_i1i).
-Qed.
-
-Lemma cfdot_prTIred j1 j2 : '[mu_ j1, mu_ j2] = ((j1 == j2) * w1)%:R.
-Proof.
-rewrite cfdot_suml (eq_bigr _ (fun i _ => cfdot_prTIirr_red i _ _)) sumr_const.
-by rewrite mulrnA card_Iirr_cyclic.
-Qed.
-
-Lemma cfnorm_prTIred j : '[mu_ j] = w1%:R.
-Proof. by rewrite cfdot_prTIred eqxx mul1n. Qed.
-
-Lemma prTIred_neq0 j : mu_ j != 0.
-Proof. by rewrite -cfnorm_eq0 cfnorm_prTIred neq0CG. Qed.
-
-Lemma prTIred_char j : mu_ j \is a character.
-Proof. by apply: rpred_sum => i _; apply: irr_char. Qed.
-
-Lemma prTIred_1_gt0 j : 0 < mu_ j 1%g.
-Proof. by rewrite char1_gt0 ?prTIred_neq0 ?prTIred_char. Qed.
-
-Lemma prTIred_1_neq0 i : mu_ i 1%g != 0.
-Proof. by rewrite char1_eq0 ?prTIred_neq0 ?prTIred_char. Qed.
-
-Lemma prTIred_inj : injective mu_.
-Proof.
-move=> j1 j2 /(congr1 (cfdot (mu_ j1)))/esym/eqP; rewrite !cfdot_prTIred.
-by rewrite eqC_nat eqn_pmul2r ?cardG_gt0 // eqxx; case: (j1 =P j2).
-Qed.
-
-Lemma prTIred_not_real j : j != 0 -> ~~ cfReal (mu_ j).
-Proof.
-apply: contraNneq; rewrite -prTIred_aut -irr_eq1 -odd_eq_conj_irr1 //.
-by rewrite -aut_IirrE => /prTIred_inj->.
-Qed.
-
-Lemma prTIsign0 : delta_ 0 = 1.
-Proof.
-have /esym/eqP := cycTIiso_prTIirr 0 0; rewrite -[sigma _]scale1r.
-by rewrite /w_ /sigma cycTIirr00 cycTIiso1 -irr0 eq_scaled_irr => /andP[/eqP].
-Qed.
-
-Lemma prTIirr00 : mu2_ 0 0 = 1.
-Proof.
-have:= cycTIiso_prTIirr 0 0; rewrite prTIsign0 scale1r.
-by rewrite /w_ /sigma cycTIirr00 cycTIiso1.
-Qed.
-
-(* This is PeterFalvi (4.4). *)
-Lemma prTIirr0P k :
- reflect (exists i, 'chi_k = mu2_ i 0) (K \subset cfker 'chi_k).
-Proof.
-suff{k}: [set k | K \subset cfker 'chi_k] == [set Imu2 (i, 0) | i : Iirr W1].
- move/eqP/setP/(_ k); rewrite inE => ->.
- by apply: (iffP imsetP) => [[i _]|[i /irr_inj]] ->; exists i.
-have [isoW1 abW1] := (sdprod_isog defL, cyclic_abelian cycW1).
-have abLbar: abelian (L / K) by rewrite -(isog_abelian isoW1).
-rewrite eqEcard andbC card_imset ?nirrW1 => [| i1 i2 /prTIirr_inj[] //].
-rewrite [w1](card_isog isoW1) -card_Iirr_abelian //.
-rewrite -(card_image (can_inj (mod_IirrK nsKL))) subset_leq_card; last first.
- by apply/subsetP=> _ /imageP[k1 _ ->]; rewrite inE mod_IirrE ?cfker_mod.
-apply/subsetP=> k; rewrite inE => kerKk.
-have /irrP[ij DkW]: 'Res 'chi_k \in irr W.
- rewrite lin_char_irr ?cfRes_lin_char // lin_irr_der1.
- by apply: subset_trans kerKk; rewrite der1_min ?normal_norm.
-have{ij DkW} [i DkW]: exists i, 'Res 'chi_k = w_ i 0.
- have /codomP[[i j] Dij] := dprod_Iirr_onto defW ij; exists i.
- rewrite DkW Dij; congr (w_ i _); apply/eqP; rewrite -subGcfker.
- rewrite -['chi_j](cfDprodKr_abelian defW i) // -dprod_IirrE -{}Dij -{}DkW.
- by rewrite cfResRes // sub_cfker_Res // (subset_trans sW2K kerKk).
-apply/imsetP; exists i => //=; apply/irr_inj.
-suffices ->: 'chi_k = delta_ 0 *: mu2_ i 0 by rewrite prTIsign0 scale1r.
-rewrite -cycTIiso_prTIirr -(eq_in_cycTIiso _ (irr_dirr k)) // => x /setDP[Wx _].
-by rewrite -/(w_ i 0) -DkW cfResE.
-Qed.
-
-(* This is the first part of PeterFalvi, Theorem (4.5)(a). *)
-Theorem cfRes_prTIirr_eq0 i j : 'Res[K] (mu2_ i j) = 'Res (mu2_ 0 j).
-Proof.
-apply/eqP; rewrite -subr_eq0 -rmorphB /=; apply/eqP/cfun_inP=> x0 Kx0.
-rewrite -(canLR (signrZK _) (cfInd_sub_prTIirr i j)) -/(delta_ j).
-rewrite cfResE // !cfunE (cfun_on0 (cfInd_on _ (V2ew i j))) ?mulr0 //.
-apply: contraL Kx0 => /imset2P[x y /setDP[Wx W2'x] Ly ->] {x0}.
-rewrite memJ_norm ?(subsetP (normal_norm nsKL)) //; apply: contra W2'x => Kx.
-by rewrite -(mul1g W2) -(coprime_TIg coKW1) group_modr // inE Kx (dprodW defW).
-Qed.
-
-Lemma prTIirr_1 i j : mu2_ i j 1%g = mu2_ 0 j 1%g.
-Proof. by rewrite -!(@cfRes1 _ K L) cfRes_prTIirr_eq0. Qed.
-
-Lemma prTIirr0_1 i : mu2_ i 0 1%g = 1.
-Proof. by rewrite prTIirr_1 prTIirr00 cfun11. Qed.
-
-Lemma prTIirr0_linear i : mu2_ i 0 \is a linear_char.
-Proof. by rewrite qualifE irr_char /= prTIirr0_1. Qed.
-
-Lemma prTIred_1 j : mu_ j 1%g = w1%:R * mu2_ 0 j 1%g.
-Proof.
-rewrite mulr_natl -nirrW1 sum_cfunE.
-by rewrite -sumr_const; apply: eq_bigr => i _; rewrite prTIirr_1.
-Qed.
-
-Definition primeTI_Ires j : Iirr K := cfIirr ('Res[K] (mu2_ 0 j)).
-Local Notation Ichi := primeTI_Ires.
-Local Notation chi_ j := 'chi_(Ichi j).
-
-(* This is the rest of PeterFalvi, Theorem (4.5)(a). *)
-Theorem prTIres_spec j : chi_ j = 'Res (mu2_ 0 j) /\ mu_ j = 'Ind (chi_ j).
-Proof.
-rewrite /Ichi; set chi_j := 'Res _.
-have [k chi_j_k]: {k | k \in irr_constt chi_j} := constt_cfRes_irr K _.
-have Nchi_j: chi_j \is a character by rewrite cfRes_char ?irr_char.
-have lb_mu_1: w1%:R * 'chi_k 1%g <= mu_ j 1%g ?= iff (chi_j == 'chi_k).
- have [chi' Nchi' Dchi_j] := constt_charP _ Nchi_j chi_j_k.
- rewrite prTIred_1 (mono_lerif (ler_pmul2l (gt0CG W1))).
- rewrite -subr_eq0 Dchi_j addrC addKr -(canLR (addrK _) Dchi_j) !cfunE.
- rewrite lerif_subLR addrC -lerif_subLR cfRes1 subrr -char1_eq0 // eq_sym.
- by apply: lerif_eq; rewrite char1_ge0.
-pose psi := 'Ind 'chi_k - mu_ j; have Npsi: psi \is a character.
- apply/forallP=> l; rewrite coord_cfdot cfdotBl; set a := '['Ind _, _].
- have Na: a \in Cnat by rewrite Cnat_cfdot_char_irr ?cfInd_char ?irr_char.
- have [[i /eqP Dl] | ] := altP (@existsP _ (fun i => 'chi_l == mu2_ i j)).
- have [n Da] := CnatP a Na; rewrite Da cfdotC Dl cfdot_prTIirr_red.
- rewrite rmorph_nat -natrB ?Cnat_nat // eqxx lt0n -eqC_nat -Da.
- by rewrite -irr_consttE constt_Ind_Res Dl cfRes_prTIirr_eq0.
- rewrite negb_exists => /forallP muj'l.
- rewrite cfdot_suml big1 ?subr0 // => i _.
- rewrite cfdot_irr -(inj_eq irr_inj) mulrb ifN_eqC ?muj'l //.
-have ub_mu_1: mu_ j 1%g <= 'Ind[L] 'chi_k 1%g ?= iff ('Ind 'chi_k == mu_ j).
- rewrite -subr_eq0 -/psi (canRL (subrK _) (erefl psi)) cfunE -lerif_subLR.
- by rewrite subrr -char1_eq0 // eq_sym; apply: lerif_eq; rewrite char1_ge0.
-have [_ /esym] := lerif_trans lb_mu_1 ub_mu_1; rewrite cfInd1 //.
-by rewrite -(index_sdprod defL) eqxx => /andP[/eqP-> /eqP <-]; rewrite irrK.
-Qed.
-
-Lemma cfRes_prTIirr i j : 'Res[K] (mu2_ i j) = chi_ j.
-Proof. by rewrite cfRes_prTIirr_eq0; case: (prTIres_spec j). Qed.
-
-Lemma cfInd_prTIres j : 'Ind[L] (chi_ j) = mu_ j.
-Proof. by have [] := prTIres_spec j. Qed.
-
-Lemma cfRes_prTIred j : 'Res[K] (mu_ j) = w1%:R *: chi_ j.
-Proof.
-rewrite -nirrW1 scaler_nat -sumr_const linear_sum /=; apply: eq_bigr => i _.
-exact: cfRes_prTIirr.
-Qed.
-
-Lemma prTIres_aut u j : chi_ (aut_Iirr u j) = cfAut u (chi_ j).
-Proof.
-by rewrite -(cfRes_prTIirr (aut_Iirr u 0)) prTIirr_aut -cfAutRes cfRes_prTIirr.
-Qed.
-
-Lemma prTIres0 : chi_ 0 = 1.
-Proof. by rewrite -(cfRes_prTIirr 0) prTIirr00 cfRes_cfun1. Qed.
-
-Lemma prTIred0 : mu_ 0 = w1%:R *: '1_K.
-Proof.
-by rewrite -cfInd_prTIres prTIres0 cfInd_cfun1 // -(index_sdprod defL).
-Qed.
-
-Lemma prTIres_inj : injective Ichi.
-Proof. by move=> j1 j2 Dj; apply: prTIred_inj; rewrite -!cfInd_prTIres Dj. Qed.
-
-(* This is the first assertion of Peterfalvi (4.5)(b). *)
-Theorem prTIres_irr_cases k (theta := 'chi_k) (phi := 'Ind theta) :
- {j | theta = chi_ j} + {phi \in irr L /\ (forall i j, phi != mu2_ i j)}.
-Proof.
-pose imIchi := [set Ichi j | j : Iirr W2].
-have [/imsetP/sig2_eqW[j _] | imIchi'k] := boolP (k \in imIchi).
- by rewrite /theta => ->; left; exists j.
-suffices{phi} theta_inv: 'I_L[theta] = K.
- have irr_phi: phi \in irr L by apply: inertia_Ind_irr; rewrite ?theta_inv.
- right; split=> // i j; apply: contraNneq imIchi'k => Dphi; apply/imsetP.
- exists j => //; apply/eqP; rewrite -[k == _]constt_irr -(cfRes_prTIirr i).
- by rewrite -constt_Ind_Res -/phi Dphi irr_consttE cfnorm_irr oner_eq0.
-rewrite -(sdprodW (sdprod_modl defL (sub_inertia _))); apply/mulGidPl.
-apply/subsetP=> z /setIP[W1z Itheta_z]; apply: contraR imIchi'k => K'z.
-have{K'z} [Lz ntz] := (subsetP sW1L z W1z, group1_contra K'z : z != 1%g).
-have [p p_pr p_z]: {p | prime p & p %| #[z]} by apply/pdivP; rewrite order_gt1.
-have coKp := coprime_dvdr (dvdn_trans p_z (order_dvdG W1z)) coKW1.
-wlog{p_z} p_z: z W1z Lz Itheta_z ntz / p.-elt z.
- move/(_ z.`_p)->; rewrite ?groupX ?p_elt_constt //.
- by rewrite (sameP eqP constt1P) /p_elt p'natE ?negbK.
-have JirrP: is_action L (@conjg_Iirr gT K); last pose Jirr := Action JirrP.
- split=> [y k1 k2 eq_k12 | k1 y1 y2 Gy1 Gy2]; apply/irr_inj.
- by apply/(can_inj (cfConjgK y)); rewrite -!conjg_IirrE eq_k12.
- by rewrite !conjg_IirrE (cfConjgM _ nsKL).
-have [[_ nKL] [nKz _]] := (andP nsKL, setIdP Itheta_z).
-suffices{k theta Itheta_z} /eqP->: imIchi == 'Fix_Jirr[z].
- by apply/afix1P/irr_inj; rewrite conjg_IirrE inertiaJ.
-rewrite eqEcard; apply/andP; split.
- apply/subsetP=> _ /imsetP[j _ ->]; apply/afix1P/irr_inj.
- by rewrite conjg_IirrE -(cfRes_prTIirr 0) (cfConjgRes _ _ nsKL) ?cfConjg_id.
-have ->: #|imIchi| = w2 by rewrite card_imset //; apply: prTIres_inj.
-have actsL_KK: [acts L, on classes K | 'Js \ subsetT L].
- rewrite astabs_ract subsetIidl; apply/subsetP=> y Ly; rewrite !inE /=.
- apply/subsetP=> _ /imsetP[x Kx ->]; rewrite !inE /= -class_rcoset.
- by rewrite norm_rlcoset ?class_lcoset ?mem_classes ?memJ_norm ?(subsetP nKL).
-rewrite (card_afix_irr_classes Lz actsL_KK) => [|k x y Kx /=]; last first.
- by case/imsetP=> _ /imsetP[t Kt ->] ->; rewrite conjg_IirrE cfConjgEJ ?cfunJ.
-apply: leq_trans (subset_leq_card _) (leq_imset_card (class^~ K) _).
-apply/subsetP=> _ /setIP[/imsetP[x Kx ->] /afix1P/normP nxKz].
-suffices{Kx} /pred0Pn[t /setIP[xKt czt]]: #|'C_(x ^: K)[z]| != 0%N.
- rewrite -(class_eqP xKt); apply: mem_imset; have [y Ky Dt] := imsetP xKt.
- by rewrite -(@prKW1 z) ?(czt, inE) ?ntz // Dt groupJ.
-have{coKp}: ~~ (p %| #|K|) by rewrite -prime_coprime // coprime_sym.
-apply: contraNneq => /(congr1 (modn^~ p))/eqP; rewrite mod0n.
-rewrite -cent_cycle -afixJ -sylow.pgroup_fix_mod ?astabsJ ?cycle_subG //.
-by move/dvdn_trans; apply; rewrite -index_cent1 dvdn_indexg.
-Qed.
-
-(* Implicit elementary converse to the above. *)
-Lemma prTIred_not_irr j : mu_ j \notin irr L.
-Proof. by rewrite irrEchar cfnorm_prTIred pnatr_eq1 gtn_eqF ?andbF. Qed.
-
-(* This is the second assertion of Peterfalvi (4.5)(b). *)
-Theorem prTIind_irr_cases ell (phi := 'chi_ell) :
- {i : _ & {j | phi = mu2_ i j}}
- + {k | k \notin codom Ichi & phi = 'Ind 'chi_k}.
-Proof.
-have [k] := constt_cfRes_irr K ell; rewrite -constt_Ind_Res => kLell.
-have [[j Dk] | [/irrP/sig_eqW[l1 DkL] chi'k]] := prTIres_irr_cases k.
- have [i /=/eqP <- | mu2j'l] := pickP (fun i => mu2_ i j == phi).
- by left; exists i, j.
- case/eqP: kLell; rewrite Dk cfInd_prTIres cfdot_suml big1 // => i _.
- by rewrite cfdot_irr -(inj_eq irr_inj) mu2j'l.
-right; exists k; last by move: kLell; rewrite DkL constt_irr inE => /eqP <-.
-apply/codomP=> [[j Dk]]; have/negP[] := prTIred_not_irr j.
-by rewrite -cfInd_prTIres -Dk DkL mem_irr.
-Qed.
-
-End Four_3_to_5.
-
-Notation primeTIsign ptiW j :=
- (GRing.sign algCring (primeTI_Isign ptiW j)) (only parsing).
-Notation primeTIirr ptiW i j := 'chi_(primeTI_Iirr ptiW (i, j)) (only parsing).
-Notation primeTIres ptiW j := 'chi_(primeTI_Ires ptiW j) (only parsing).
-
-Arguments prTIirr_inj [gT L K W W1 W2 defW] ptiWL [x1 x2].
-Arguments prTIred_inj [gT L K W W1 W2 defW] ptiWL [x1 x2].
-Arguments prTIres_inj [gT L K W W1 W2 defW] ptiWL [x1 x2].
-Arguments not_prTIirr_vanish [gT L K W W1 W2 defW] ptiWL [k].
-
-Section Four_6_t0_10.
-
-Variables (gT : finGroupType) (G L K H : {group gT}) (A A0 : {set gT}).
-Variables (W W1 W2 : {group gT}) (defW : W1 \x W2 = W).
-
-Local Notation V := (cyclicTIset defW).
-
-(* These correspond to Peterfalvi, Hypothesis (4.6). *)
-Definition prime_Dade_definition :=
- [/\ (*c*) [/\ H <| L, W2 \subset H & H \subset K],
- (*d*) [/\ A <| L, \bigcup_(h in H^#) 'C_K[h]^# \subset A & A \subset K^#]
- & (*e*) A0 = A :|: class_support V L].
-
-Record prime_Dade_hypothesis : Prop := PrimeDadeHypothesis {
- prDade_cycTI :> cyclicTI_hypothesis G defW;
- prDade_prTI :> primeTI_hypothesis L K defW;
- prDade_hyp :> Dade_hypothesis G L A0;
- prDade_def :> prime_Dade_definition
-}.
-
-Hypothesis prDadeHyp : prime_Dade_hypothesis.
-
-Let ctiWG : cyclicTI_hypothesis G defW := prDadeHyp.
-Let ptiWL : primeTI_hypothesis L K defW := prDadeHyp.
-Let ctiWL : cyclicTI_hypothesis L defW := prime_cycTIhyp ptiWL.
-Let ddA0 : Dade_hypothesis G L A0 := prDadeHyp.
-Local Notation ddA0def := (prDade_def prDadeHyp).
-
-Local Notation w_ i j := (cyclicTIirr defW i j).
-Local Notation sigma := (cyclicTIiso ctiWG).
-Local Notation eta_ i j := (sigma (w_ i j)).
-Local Notation mu2_ i j := (primeTIirr ptiWL i j).
-Local Notation delta_ j := (primeTIsign ptiWL j).
-Local Notation chi_ j := (primeTIres ptiWL j).
-Local Notation mu_ := (primeTIred ptiWL).
-Local Notation tau := (Dade ddA0).
-
-Let defA0 : A0 = A :|: class_support V L. Proof. by have [] := ddA0def. Qed.
-Let nsAL : A <| L. Proof. by have [_ []] := ddA0def. Qed.
-Let sAA0 : A \subset A0. Proof. by rewrite defA0 subsetUl. Qed.
-
-Let nsHL : H <| L. Proof. by have [[]] := ddA0def. Qed.
-Let sHK : H \subset K. Proof. by have [[]] := ddA0def. Qed.
-Let defL : K ><| W1 = L. Proof. by have [[]] := ptiWL. Qed.
-Let sKL : K \subset L. Proof. by have /mulG_sub[] := sdprodW defL. Qed.
-Let coKW1 : coprime #|K| #|W1|.
-Proof. by rewrite (coprime_sdprod_Hall_r defL); have [[]] := ptiWL. Qed.
-
-Let sIH_A : \bigcup_(h in H^#) 'C_K[h]^# \subset A.
-Proof. by have [_ []] := ddA0def. Qed.
-
-Let sW2H : W2 \subset H. Proof. by have [[]] := ddA0def. Qed.
-Let ntW1 : W1 :!=: 1%g. Proof. by have [[]] := ptiWL. Qed.
-Let ntW2 : W2 :!=: 1%g. Proof. by have [_ []] := ptiWL. Qed.
-
-Let oddW : odd #|W|. Proof. by have [] := ctiWL. Qed.
-Let sW1W : W1 \subset W. Proof. by have /mulG_sub[] := dprodW defW. Qed.
-Let sW2W : W2 \subset W. Proof. by have /mulG_sub[] := dprodW defW. Qed.
-Let tiW12 : W1 :&: W2 = 1%g. Proof. by have [] := dprodP defW. Qed.
-
-Let cycW : cyclic W. Proof. by have [] := ctiWG. Qed.
-Let cycW1 : cyclic W1. Proof. by have [[]] := ptiWL. Qed.
-Let cycW2 : cyclic W2. Proof. by have [_ []] := ptiWL. Qed.
-Let sLG : L \subset G. Proof. by case: ddA0. Qed.
-Let sW2K : W2 \subset K. Proof. by have [_ []] := ptiWL. Qed.
-
-Let sWL : W \subset L.
-Proof. by rewrite -(dprodWC defW) -(sdprodW defL) mulgSS. Qed.
-Let sWG : W \subset G. Proof. exact: subset_trans sWL sLG. Qed.
-
-Let oddW1 : odd #|W1|. Proof. exact: oddSg oddW. Qed.
-Let oddW2 : odd #|W2|. Proof. exact: oddSg oddW. Qed.
-
-Let w1gt1 : (2 < #|W1|)%N. Proof. by rewrite odd_gt2 ?cardG_gt1. Qed.
-Let w2gt2 : (2 < #|W2|)%N. Proof. by rewrite odd_gt2 ?cardG_gt1. Qed.
-
-Let nirrW1 : #|Iirr W1| = #|W1|. Proof. exact: card_Iirr_cyclic. Qed.
-Let nirrW2 : #|Iirr W2| = #|W2|. Proof. exact: card_Iirr_cyclic. Qed.
-Let W1lin i : 'chi[W1]_i \is a linear_char. Proof. exact/irr_cyclic_lin. Qed.
-Let W2lin i : 'chi[W2]_i \is a linear_char. Proof. exact/irr_cyclic_lin. Qed.
-
-(* This is the first part of Peterfalvi (4.7). *)
-Lemma prDade_irr_on k :
- ~~ (H \subset cfker 'chi[K]_k) -> 'chi_k \in 'CF(K, 1%g |: A).
-Proof.
-move=> kerH'i; apply/cfun_onP=> g; rewrite !inE => /norP[ntg A'g].
-have [Kg | /cfun0-> //] := boolP (g \in K).
-apply: irr_reg_off_ker_0 (normalS _ _ nsHL) kerH'i _ => //.
-apply/trivgP/subsetP=> h /setIP[Hh cgh]; apply: contraR A'g => nth.
-apply/(subsetP sIH_A)/bigcupP; exists h; first exact/setDP.
-by rewrite 3!inE ntg Kg cent1C.
-Qed.
-
-(* This is the second part of Peterfalvi (4.7). *)
-Lemma prDade_Ind_irr_on k :
- ~~ (H \subset cfker 'chi[K]_k) -> 'Ind[L] 'chi_k \in 'CF(L, 1%g |: A).
-Proof.
-move/prDade_irr_on/(cfInd_on sKL); apply: cfun_onS; rewrite class_supportEr.
-by apply/bigcupsP=> _ /normsP-> //; rewrite normsU ?norms1 ?normal_norm.
-Qed.
-
-(* Third part of Peterfalvi (4.7). *)
-Lemma cfker_prTIres j : j != 0 -> ~~ (H \subset cfker (chi_ j)).
-Proof.
-rewrite -(cfRes_prTIirr _ 0) cfker_Res ?irr_char // subsetI sHK /=.
-apply: contra => kerHmu0j; rewrite -irr_eq1; apply/eqP/cfun_inP=> y W2y.
-have [[x W1x ntx] mulW] := (trivgPn _ ntW1, dprodW defW).
-rewrite cfun1E W2y -(cfDprodEr defW _ W1x W2y) -dprodr_IirrE -dprod_Iirr0l.
-have{ntx} W2'x: x \notin W2 by rewrite -[x \in W2]andTb -W1x -in_setI tiW12 inE.
-have V2xy: (x * y)%g \in W :\: W2 by rewrite inE -mulW mem_mulg ?groupMr ?W2'x.
-rewrite -[w_ 0 j](signrZK (primeTI_Isign ptiWL j)) cfunE -prTIirr_id //.
-have V2x: x \in W :\: W2 by rewrite inE W2'x (subsetP sW1W).
-rewrite cfkerMr ?(subsetP (subset_trans sW2H kerHmu0j)) ?prTIirr_id // cfunE.
-by rewrite signrMK -[x]mulg1 dprod_Iirr0l dprodr_IirrE cfDprodEr ?lin_char1.
-Qed.
-
-(* Fourth part of Peterfalvi (4.7). *)
-Lemma prDade_TIres_on j : j != 0 -> chi_ j \in 'CF(K, 1%g |: A).
-Proof. by move/cfker_prTIres/prDade_irr_on. Qed.
-
-(* Last part of Peterfalvi (4.7). *)
-Lemma prDade_TIred_on j : j != 0 -> mu_ j \in 'CF(L, 1%g |: A).
-Proof. by move/cfker_prTIres/prDade_Ind_irr_on; rewrite cfInd_prTIres. Qed.
-
-Import ssrint.
-
-(* Second part of PeterFalvi (4.8). *)
-Lemma prDade_TIsign_eq i j k :
- mu2_ i j 1%g = mu2_ i k 1%g -> delta_ j = delta_ k.
-Proof.
-move=> eqjk; have{eqjk}: (delta_ j == delta_ k %[mod #|W1|])%C.
- apply: eqCmod_trans (prTIirr1_mod ptiWL i k).
- by rewrite eqCmod_sym -eqjk (prTIirr1_mod ptiWL).
-have /negP: ~~ (#|W1| %| 2) by rewrite gtnNdvd.
-rewrite /eqCmod -![delta_ _]intr_sign -rmorphB dvdC_int ?Cint_int //= intCK.
-by do 2!case: (primeTI_Isign _ _).
-Qed.
-
-(* First part of PeterFalvi (4.8). *)
-Lemma prDade_sub_TIirr_on i j k :
- j != 0 -> k != 0 -> mu2_ i j 1%g = mu2_ i k 1%g ->
- mu2_ i j - mu2_ i k \in 'CF(L, A0).
-Proof.
-move=> nzj nzk eq_mu1.
-apply/cfun_onP=> g; rewrite defA0 !inE negb_or !cfunE => /andP[A'g V'g].
-have [Lg | L'g] := boolP (g \in L); last by rewrite !cfun0 ?subrr.
-have{Lg} /bigcupP[_ /rcosetsP[x W1x ->] Kx_g]: g \in cover (rcosets K W1).
- by rewrite (cover_partition (rcosets_partition_mul W1 K)) (sdprodW defL).
-have [x1 | ntx] := eqVneq x 1%g.
- have [-> | ntg] := eqVneq g 1%g; first by rewrite eq_mu1 subrr.
- have{A'g} A1'g: g \notin 1%g |: A by rewrite !inE negb_or ntg.
- rewrite x1 mulg1 in Kx_g; rewrite -!(cfResE (mu2_ i _) sKL) ?cfRes_prTIirr //.
- by rewrite !(cfun_onP (prDade_TIres_on _)) ?subrr.
-have coKx: coprime #|K| #[x] by rewrite (coprime_dvdr (order_dvdG W1x)).
-have nKx: x \in 'N(K) by have [_ _ /subsetP->] := sdprodP defL.
-have [/cover_partition defKx _] := partition_cent_rcoset nKx coKx.
-have def_cKx: 'C_K[x] = W2 by have [_ _ -> //] := ptiWL; rewrite !inE ntx.
-move: Kx_g; rewrite -defKx def_cKx cover_imset => /bigcupP[z /(subsetP sKL)Lz].
-case/imsetP=> _ /rcosetP[y W2y ->] Dg; rewrite Dg !cfunJ //.
-have V2yx: (y * x)%g \in W :\: W2.
- rewrite inE -(dprodWC defW) mem_mulg // andbT groupMl //.
- by rewrite -[x \in W2]andTb -W1x -in_setI tiW12 inE.
-rewrite 2?{1}prTIirr_id //.
-have /set1P->: y \in [1].
- rewrite -tiW12 inE W2y andbT; apply: contraR V'g => W1'y.
- by rewrite Dg mem_imset2 // !inE negb_or -andbA -in_setD groupMr ?W1'y.
-rewrite -commute1 (prDade_TIsign_eq eq_mu1) !cfunE -mulrBr.
-by rewrite !dprod_IirrE !cfDprodE // !lin_char1 // subrr mulr0.
-Qed.
-
-(* This is last part of PeterFalvi (4.8). *)
-Lemma prDade_sub_TIirr i j k :
- j != 0 -> k != 0 -> mu2_ i j 1%g = mu2_ i k 1%g ->
- tau (mu2_ i j - mu2_ i k) = delta_ j *: (eta_ i j - eta_ i k).
-Proof.
-move=> nz_j nz_k eq_mu2jk_1.
-have [-> | k'j] := eqVneq j k; first by rewrite !subrr !raddf0.
-have [[Itau Ztau] [_ Zsigma]] := (Dade_Zisometry ddA0, cycTI_Zisometry ctiWL).
-set dmu2 := _ - _; set dsw := _ - _; have Dmu2 := prTIirr_id ptiWL.
-have Zmu2: dmu2 \in 'Z[irr L, A0].
- by rewrite zchar_split rpredB ?irr_vchar ?prDade_sub_TIirr_on.
-apply: eq_signed_sub_cTIiso => // [||x Vx].
-- exact: zcharW (Ztau _ Zmu2).
-- rewrite Itau // cfnormBd ?cfnorm_irr // (cfdot_prTIirr ptiWL).
- by rewrite (negPf k'j) andbF.
-have V2x: x \in W :\: W2 by rewrite (subsetP _ x Vx) // setDS ?subsetUr.
-rewrite !(cfunE, Dade_id) ?(cycTIiso_restrict _ _ Vx) //; last first.
- by rewrite defA0 inE orbC mem_class_support.
-by rewrite !Dmu2 // (prDade_TIsign_eq eq_mu2jk_1) !cfunE -mulrBr.
-Qed.
-
-Lemma prDade_supp_disjoint : V \subset ~: K.
-Proof.
-rewrite subDset setUC -subDset setDE setCK setIC -(dprod_modr defW sW2K).
-by rewrite coprime_TIg // dprod1g subsetUr.
-Qed.
-
-(* This is Peterfalvi (4.9). *)
-(* We have added the "obvious" fact that calT is pairwise orthogonal, since *)
-(* we require this to prove membership in 'Z[calT], we encapsulate the *)
-(* construction of tau1, and state its conformance to tau on the "larger" *)
-(* domain 'Z[calT, L^#], so that clients can avoid using the domain equation *)
-(* in part (a). *)
-Theorem uniform_prTIred_coherent k (calT := uniform_prTIred_seq ptiWL k) :
- k != 0 ->
- (*a*) [/\ pairwise_orthogonal calT, ~~ has cfReal calT, cfConjC_closed calT,
- 'Z[calT, L^#] =i 'Z[calT, A]
- & exists2 psi, psi != 0 & psi \in 'Z[calT, A]]
- (*b*) /\ (exists2 tau1 : {linear 'CF(L) -> 'CF(G)},
- forall j, tau1 (mu_ j) = delta_ k *: (\sum_i sigma (w_ i j))
- & {in 'Z[calT], isometry tau1, to 'Z[irr G]}
- /\ {in 'Z[calT, L^#], tau1 =1 tau}).
-Proof.
-have uniqT: uniq calT by apply/dinjectiveP; apply: in2W; apply: prTIred_inj.
-have sTmu: {subset calT <= codom mu_} by apply: image_codom.
-have oo_mu: pairwise_orthogonal (codom mu_).
- apply/pairwise_orthogonalP; split=> [|_ _ /codomP[j1 ->] /codomP[j2 ->]].
- apply/andP; split; last by apply/injectiveP; apply: prTIred_inj.
- by apply/codomP=> [[i /esym/eqP/idPn[]]]; apply: prTIred_neq0.
- by rewrite cfdot_prTIred; case: (j1 =P j2) => // -> /eqP.
-have real'T: ~~ has cfReal calT.
- by apply/hasPn=> _ /imageP[j /andP[nzj _] ->]; apply: prTIred_not_real.
-have ccT: cfConjC_closed calT.
- move=> _ /imageP[j Tj ->]; rewrite -prTIred_aut image_f // inE aut_Iirr_eq0.
- by rewrite prTIred_aut cfunE conj_Cnat ?Cnat_char1 ?prTIred_char.
-have TonA: 'Z[calT, L^#] =i 'Z[calT, A].
- have A'1: 1%g \notin A by apply: contra (subsetP sAA0 _) _; have [] := ddA0.
- move=> psi; rewrite zcharD1E -(setU1K A'1) zcharD1; congr (_ && _).
- apply/idP/idP; [apply: zchar_trans_on psi => psi Tpsi | exact: zcharW].
- have [j /andP[nz_j _] Dpsi] := imageP Tpsi.
- by rewrite zchar_split mem_zchar // Dpsi prDade_TIred_on.
-move=> nzk; split.
- split=> //; first exact: sub_pairwise_orthogonal oo_mu.
- have Tmuk: mu_ k \in calT by rewrite image_f // inE nzk /=.
- exists ((mu_ k)^*%CF - mu_ k); first by rewrite subr_eq0 (hasPn real'T).
- rewrite -TonA -rpredN opprB sub_aut_zchar ?zchar_onG ?mem_zchar ?ccT //.
- by move=> _ /mapP[j _ ->]; rewrite char_vchar ?prTIred_char.
-pose f0 j := delta_ k *: (\sum_i eta_ i j); have in_mu := codom_f mu_.
-pose f1 psi := f0 (iinv (valP (insigd (in_mu k) psi))).
-have f1mu j: f1 (mu_ j) = f0 j.
- have in_muj := in_mu j.
- rewrite /f1 /insigd /insubd /= insubT /=; [idtac].
- by rewrite iinv_f //; apply: prTIred_inj.
-have iso_f1: {in codom mu_, isometry f1, to 'Z[irr G]}.
- split=> [_ _ /codomP[j1 ->] /codomP[j2 ->] | _ /codomP[j ->]]; last first.
- by rewrite f1mu rpredZsign rpred_sum // => i _; apply: cycTIiso_vchar.
- rewrite !f1mu cfdotZl cfdotZr rmorph_sign signrMK !cfdot_suml.
- apply: eq_bigr => i1 _; rewrite !cfdot_sumr; apply: eq_bigr => i2 _.
- by rewrite cfdot_cycTIiso cfdot_prTIirr.
-have [tau1 Dtau1 Itau1] := Zisometry_of_iso (orthogonal_free oo_mu) iso_f1.
-exists tau1 => [j|]; first by rewrite Dtau1 ?codom_f ?f1mu.
-split=> [|psi]; first by apply: sub_iso_to Itau1 => //; apply: zchar_subset.
-rewrite zcharD1E => /andP[/zchar_expansion[//|z _ Dpsi] /eqP psi1_0].
-rewrite -[psi]subr0 -(scale0r (mu_ k)) -(mul0r (mu_ k 1%g)^-1) -{}psi1_0.
-rewrite {psi}Dpsi sum_cfunE mulr_suml scaler_suml -sumrB !raddf_sum /=.
-apply: eq_big_seq => _ /imageP[j /andP[nzj /eqP eq_mujk_1] ->].
-rewrite cfunE eq_mujk_1 mulfK ?prTIred_1_neq0 // -scalerBr !linearZ /=.
-congr (_ *: _); rewrite {z}linearB !Dtau1 ?codom_f // !f1mu -scalerBr -!sumrB.
-rewrite !linear_sum; apply: eq_bigr => i _ /=.
-have{eq_mujk_1} eq_mu2ijk_1: mu2_ i j 1%g = mu2_ i k 1%g.
- by apply: (mulfI (neq0CG W1)); rewrite !prTIirr_1 -!prTIred_1.
-by rewrite -(prDade_TIsign_eq eq_mu2ijk_1) prDade_sub_TIirr.
-Qed.
-
-(* This is Peterfalvi (4.10). *)
-Lemma prDade_sub2_TIirr i j :
- tau (delta_ j *: mu2_ i j - delta_ j *: mu2_ 0 j - mu2_ i 0 + mu2_ 0 0)
- = eta_ i j - eta_ 0 j - eta_ i 0 + eta_ 0 0.
-Proof.
-pose V0 := class_support V L; have sVV0: V \subset V0 := sub_class_support L V.
-have sV0A0: V0 \subset A0 by rewrite defA0 subsetUr.
-have nV0L: L \subset 'N(V0) := class_support_norm V L.
-have [_ _ /normedTI_memJ_P[ntV _ tiV]] := ctiWG.
-have [/andP[sA0L _] _ A0'1 _ _] := ddA0.
-have{sA0L A0'1} sV0G: V0 \subset G^#.
- by rewrite (subset_trans sV0A0) // subsetD1 A0'1 (subset_trans sA0L).
-have{sVV0} ntV0: V0 != set0 by apply: contraNneq ntV; rewrite -subset0 => <-.
-have{ntV} tiV0: normedTI V0 G L.
- apply/normedTI_memJ_P; split=> // _ z /imset2P[u y Vu Ly ->] Gz.
- apply/idP/idP=> [/imset2P[u1 y1 Vu1 Ly1 Duyz] | Lz]; last first.
- by rewrite -conjgM mem_imset2 ?groupM.
- rewrite -[z](mulgKV y1) groupMr // -(groupMl _ Ly) (subsetP sWL) //.
- by rewrite -(tiV u) ?groupM ?groupV // ?(subsetP sLG) // !conjgM Duyz conjgK.
-have{ntV0 sV0A0 nV0L tiV0} DtauV0: {in 'CF(L, V0), tau =1 'Ind}.
- by move=> beta V0beta; rewrite /= -(restr_DadeE _ sV0A0) //; apply: Dade_Ind.
-pose alpha := cfCyclicTIset defW i j; set beta := _ *: mu2_ i j - _ - _ + _.
-have Valpha: alpha \in 'CF(W, V) := cfCycTI_on ctiWL i j.
-have Dalpha: alpha = w_ i j - w_ 0 j - w_ i 0 + w_ 0 0.
- by rewrite addrC {1}cycTIirr00 addrA addrAC addrA addrAC -cfCycTI_E.
-rewrite -!(linearB sigma) -linearD -Dalpha cycTIiso_Ind //.
-suffices ->: beta = 'Ind[L] alpha by rewrite DtauV0 ?cfInd_on ?cfIndInd.
-rewrite Dalpha -addrA -[w_ 0 0]opprK -opprD linearB /= /beta -scalerBr.
-by rewrite !(cfInd_sub_prTIirr ptiWL) prTIsign0 scale1r opprD opprK addrA.
-Qed.
-
-End Four_6_t0_10.
diff --git a/mathcomp/odd_order/PFsection5.v b/mathcomp/odd_order/PFsection5.v
deleted file mode 100644
index 94e9c42..0000000
--- a/mathcomp/odd_order/PFsection5.v
+++ /dev/null
@@ -1,1609 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime ssralg poly finset center.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action zmodp.
-From mathcomp
-Require Import gfunctor gproduct cyclic pgroup frobenius.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation vector ssrint.
-From mathcomp
-Require Import ssrnum algC classfun character inertia vcharacter.
-From mathcomp
-Require Import PFsection1 PFsection2 PFsection3 PFsection4.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 5: Coherence. *)
-(* Defined here: *)
-(* coherent_with S A tau tau1 <-> tau1 is a Z-linear isometry from 'Z[S] to *)
-(* 'Z[irr G] that coincides with tau on 'Z[S, A]. *)
-(* coherent S A tau <-> (S, A, tau) is coherent, i.e., there is a Z-linear *)
-(* isometry tau1 s.t. coherent_with S A tau tau1. *)
-(* subcoherent S tau R <-> S : seq 'cfun(L) is non empty, pairwise orthogonal *)
-(* and closed under complex conjugation, tau is an *)
-(* isometry from 'Z[S, L^#] to virtual characters in *)
-(* G that maps the difference chi - chi^*, for each *)
-(* chi \in S, to the sum of an orthonormal family *)
-(* R chi of virtual characters of G; also, R chi and *)
-(* R phi are orthogonal unless phi \in chi :: chi^*. *)
-(* dual_iso nu == the Z-linear (additive) mapping phi |-> - nu phi^* *)
-(* for nu : {additive 'CF(L) -> 'CF(G)}. If nu is an *)
-(* isometry extending a subcoherent tau on 'Z[S] with *)
-(* size S = 2, then so is dual_iso nu. *)
-(* We provide a set of definitions that cover the various \cal S notations *)
-(* introduced in Peterfalvi sections 5, 6, 7, and 9 to 14. *)
-(* Iirr_ker K A == the set of all i : Iirr K such that the kernel of *)
-(* 'chi_i contains A. *)
-(* Iirr_kerD K B A == the set of all i : Iirr K such that the kernel of *)
-(* 'chi_i contains A but not B. *)
-(* seqInd L calX == the duplicate-free sequence of characters of L *)
-(* induced from K by the 'chi_i for i in calX. *)
-(* seqIndT K L == the duplicate-free sequence of all characters of L *)
-(* induced by irreducible characters of K. *)
-(* seqIndD K L H M == the duplicate-free sequence of characters of L *)
-(* induced by irreducible characters of K that have M *)
-(* in their kernel, but not H. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory Num.Theory.
-Local Open Scope ring_scope.
-
-(* Results about the set of induced irreducible characters *)
-Section InducedIrrs.
-
-Variables (gT : finGroupType) (K L : {group gT}).
-Implicit Types (A B : {set gT}) (H M : {group gT}).
-Implicit Type u : {rmorphism algC -> algC}.
-
-Section KerIirr.
-
-Definition Iirr_ker A := [set i | A \subset cfker 'chi[K]_i].
-
-Lemma Iirr_kerS A B : B \subset A -> Iirr_ker A \subset Iirr_ker B.
-Proof. by move/subset_trans=> sBA; apply/subsetP=> i; rewrite !inE => /sBA. Qed.
-
-Lemma sum_Iirr_ker_square H :
- H <| K -> \sum_(i in Iirr_ker H) 'chi_i 1%g ^+ 2 = #|K : H|%:R.
-Proof.
-move=> nsHK; rewrite -card_quotient ?normal_norm // -irr_sum_square.
-rewrite (eq_bigl _ _ (in_set _)) (reindex _ (mod_Iirr_bij nsHK)) /=.
-by apply: eq_big => [i | i _]; rewrite mod_IirrE ?cfker_mod ?cfMod1.
-Qed.
-
-Definition Iirr_kerD B A := Iirr_ker A :\: Iirr_ker B.
-
-Lemma sum_Iirr_kerD_square H M :
- H <| K -> M <| K -> M \subset H ->
- \sum_(i in Iirr_kerD H M) 'chi_i 1%g ^+ 2 = #|K : H|%:R * (#|H : M|%:R - 1).
-Proof.
-move=> nsHK nsMK sMH; have [sHK _] := andP nsHK.
-rewrite mulrBr mulr1 -natrM Lagrange_index // -!sum_Iirr_ker_square //.
-apply/esym/(canLR (addrK _)); rewrite /= addrC (big_setID (Iirr_ker H)).
-by rewrite (setIidPr _) ?Iirr_kerS //.
-Qed.
-
-Lemma Iirr_ker_aut u A i : (aut_Iirr u i \in Iirr_ker A) = (i \in Iirr_ker A).
-Proof. by rewrite !inE aut_IirrE cfker_aut. Qed.
-
-Lemma Iirr_ker_conjg A i x :
- x \in 'N(A) -> (conjg_Iirr i x \in Iirr_ker A) = (i \in Iirr_ker A).
-Proof.
-move=> nAx; rewrite !inE conjg_IirrE.
-have [nKx | /cfConjgEout-> //] := boolP (x \in 'N(K)).
-by rewrite cfker_conjg // -{1}(normP nAx) conjSg.
-Qed.
-
-Lemma Iirr_kerDS A1 A2 B1 B2 :
- A2 \subset A1 -> B1 \subset B2 -> Iirr_kerD B1 A1 \subset Iirr_kerD B2 A2.
-Proof. by move=> sA12 sB21; rewrite setDSS ?Iirr_kerS. Qed.
-
-Lemma Iirr_kerDY B A : Iirr_kerD (A <*> B) A = Iirr_kerD B A.
-Proof. by apply/setP=> i; rewrite !inE join_subG; apply: andb_id2r => ->. Qed.
-
-Lemma mem_Iirr_ker1 i : (i \in Iirr_kerD K 1%g) = (i != 0).
-Proof. by rewrite !inE sub1G andbT subGcfker. Qed.
-
-End KerIirr.
-
-Hypothesis nsKL : K <| L.
-Let sKL := normal_sub nsKL.
-Let nKL := normal_norm nsKL.
-Let e := #|L : K|%:R : algC.
-Let nze : e != 0 := neq0CiG _ _.
-
-Section SeqInd.
-
-Variable calX : {set (Iirr K)}.
-
-(* The set of characters induced from the irreducibles in calX. *)
-Definition seqInd := undup [seq 'Ind[L] 'chi_i | i in calX].
-Local Notation S := seqInd.
-
-Lemma seqInd_uniq : uniq S. Proof. exact: undup_uniq. Qed.
-
-Lemma seqIndP phi :
- reflect (exists2 i, i \in calX & phi = 'Ind[L] 'chi_i) (phi \in S).
-Proof. by rewrite mem_undup; apply: imageP. Qed.
-
-Lemma seqInd_on : {subset S <= 'CF(L, K)}.
-Proof. by move=> _ /seqIndP[i _ ->]; apply: cfInd_normal. Qed.
-
-Lemma seqInd_char : {subset S <= character}.
-Proof. by move=> _ /seqIndP[i _ ->]; rewrite cfInd_char ?irr_char. Qed.
-
-Lemma Cnat_seqInd1 phi : phi \in S -> phi 1%g \in Cnat.
-Proof. by move/seqInd_char/Cnat_char1. Qed.
-
-Lemma Cint_seqInd1 phi : phi \in S -> phi 1%g \in Cint.
-Proof. by rewrite CintE; move/Cnat_seqInd1->. Qed.
-
-Lemma seqInd_neq0 psi : psi \in S -> psi != 0.
-Proof. by move=> /seqIndP[i _ ->]; apply: Ind_irr_neq0. Qed.
-
-Lemma seqInd1_neq0 psi : psi \in S -> psi 1%g != 0.
-Proof. by move=> Spsi; rewrite char1_eq0 ?seqInd_char ?seqInd_neq0. Qed.
-
-Lemma cfnorm_seqInd_neq0 psi : psi \in S -> '[psi] != 0.
-Proof. by move/seqInd_neq0; rewrite cfnorm_eq0. Qed.
-
-Lemma seqInd_ortho : {in S &, forall phi psi, phi != psi -> '[phi, psi] = 0}.
-Proof.
-move=> _ _ /seqIndP[i _ ->] /seqIndP[j _ ->].
-by case: ifP (cfclass_Ind_cases i j nsKL) => // _ -> /eqP.
-Qed.
-
-Lemma seqInd_orthogonal : pairwise_orthogonal S.
-Proof.
-apply/pairwise_orthogonalP; split; last exact: seqInd_ortho.
-by rewrite /= undup_uniq andbT; move/memPn: seqInd_neq0.
-Qed.
-
-Lemma seqInd_free : free S.
-Proof. exact: (orthogonal_free seqInd_orthogonal). Qed.
-
-Lemma seqInd_zcharW : {subset S <= 'Z[S]}.
-Proof. by move=> phi Sphi; rewrite mem_zchar ?seqInd_free. Qed.
-
-Lemma seqInd_zchar : {subset S <= 'Z[S, K]}.
-Proof. by move=> phi Sphi; rewrite zchar_split seqInd_zcharW ?seqInd_on. Qed.
-
-Lemma seqInd_vcharW : {subset S <= 'Z[irr L]}.
-Proof. by move=> phi Sphi; rewrite char_vchar ?seqInd_char. Qed.
-
-Lemma seqInd_vchar : {subset S <= 'Z[irr L, K]}.
-Proof. by move=> phi Sphi; rewrite zchar_split seqInd_vcharW ?seqInd_on. Qed.
-
-Lemma zcharD1_seqInd : 'Z[S, L^#] =i 'Z[S, K^#].
-Proof.
-move=> phi; rewrite zcharD1E (zchar_split _ K^#) cfun_onD1.
-by apply: andb_id2l => /(zchar_trans_on seqInd_zchar)/zchar_on->.
-Qed.
-
-Lemma zcharD1_seqInd_on : {subset 'Z[S, L^#] <= 'CF(L, K^#)}.
-Proof. by move=> phi; rewrite zcharD1_seqInd => /zchar_on. Qed.
-
-Lemma zcharD1_seqInd_Dade A :
- 1%g \notin A -> {subset S <= 'CF(L, 1%g |: A)} -> 'Z[S, L^#] =i 'Z[S, A].
-Proof.
-move=> notA1 A_S phi; rewrite zcharD1E (zchar_split _ A).
-apply/andb_id2l=> ZSphi; apply/idP/idP=> [phi10 | /cfun_on0-> //].
-rewrite -(setU1K notA1) cfun_onD1 {}phi10 andbT.
-have{phi ZSphi} [c -> _] := free_span seqInd_free (zchar_span ZSphi).
-by rewrite big_seq memv_suml // => xi /A_S/memvZ.
-Qed.
-
-Lemma dvd_index_seqInd1 phi : phi \in S -> phi 1%g / e \in Cnat.
-Proof.
-by case/seqIndP=> i _ ->; rewrite cfInd1 // mulrC mulKf ?Cnat_irr1.
-Qed.
-
-Lemma sub_seqInd_zchar phi psi :
- phi \in S -> psi \in S -> psi 1%g *: phi - phi 1%g *: psi \in 'Z[S, K^#].
-Proof.
-move=> Sphi Spsi; rewrite zcharD1 !cfunE mulrC subrr eqxx.
-by rewrite rpredB ?scale_zchar ?Cint_seqInd1 ?seqInd_zchar.
-Qed.
-
-Lemma sub_seqInd_on phi psi :
- phi \in S -> psi \in S -> psi 1%g *: phi - phi 1%g *: psi \in 'CF(L, K^#).
-Proof. by move=> Sphi Spsi; apply: zchar_on (sub_seqInd_zchar Sphi Spsi). Qed.
-
-Lemma size_irr_subseq_seqInd S1 :
- subseq S1 S -> {subset S1 <= irr L} ->
- (#|L : K| * size S1 = #|[set i | 'Ind 'chi[K]_i \in S1]|)%N.
-Proof.
-move=> sS1S irrS1; have uniqS1: uniq S1 := subseq_uniq sS1S seqInd_uniq.
-rewrite (card_imset_Ind_irr nsKL) => [|i|i y]; first 1 last.
-- by rewrite inE => /irrS1.
-- by rewrite !inE => *; rewrite conjg_IirrE -(cfConjgInd _ _ nsKL) ?cfConjg_id.
-congr (_ * _)%N; transitivity #|map cfIirr S1|.
- rewrite (card_uniqP _) ?size_map ?map_inj_in_uniq //.
- exact: sub_in2 irrS1 _ (can_in_inj (@cfIirrE _ _)).
-apply: eq_card => s; apply/idP/imsetP=> [/mapP[phi S1phi] | [i S1iG]] {s}->.
- have /seqIndP[i _ Dphi]: phi \in S := mem_subseq sS1S S1phi.
- by exists i; rewrite ?inE -Dphi.
-by apply: map_f; rewrite inE in S1iG.
-Qed.
-
-Section Beta.
-
-Variable xi : 'CF(L).
-Hypotheses (Sxi : xi \in S) (xi1 : xi 1%g = e).
-
-Lemma cfInd1_sub_lin_vchar : 'Ind[L, K] 1 - xi \in 'Z[irr L, K^#].
-Proof.
-rewrite zcharD1 !cfunE xi1 cfInd1 // cfun11 mulr1 subrr eqxx andbT.
-rewrite rpredB ?(seqInd_vchar Sxi) // zchar_split cfInd_normal ?char_vchar //.
-by rewrite cfInd_char ?cfun1_char.
-Qed.
-
-Lemma cfInd1_sub_lin_on : 'Ind[L, K] 1 - xi \in 'CF(L, K^#).
-Proof. exact: zchar_on cfInd1_sub_lin_vchar. Qed.
-
-Lemma seqInd_sub_lin_vchar :
- {in S, forall phi : 'CF(L), phi - (phi 1%g / e) *: xi \in 'Z[S, K^#]}.
-Proof.
-move=> phi Sphi; rewrite /= zcharD1 !cfunE xi1 divfK // subrr eqxx.
-by rewrite rpredB ?scale_zchar ?seqInd_zchar // CintE dvd_index_seqInd1.
-Qed.
-
-Lemma seqInd_sub_lin_on :
- {in S, forall phi : 'CF(L), phi - (phi 1%g / e) *: xi \in 'CF(L, K^#)}.
-Proof. by move=> phi /seqInd_sub_lin_vchar/zchar_on. Qed.
-
-End Beta.
-
-End SeqInd.
-
-Arguments seqIndP [calX phi].
-
-Lemma seqIndS (calX calY : {set Iirr K}) :
- calX \subset calY -> {subset seqInd calX <= seqInd calY}.
-Proof.
-by move=> sXY _ /seqIndP[i /(subsetP sXY)Yi ->]; apply/seqIndP; exists i.
-Qed.
-
-Definition seqIndT := seqInd setT.
-
-Lemma seqInd_subT calX : {subset seqInd calX <= seqIndT}.
-Proof. exact: seqIndS (subsetT calX). Qed.
-
-Lemma mem_seqIndT i : 'Ind[L, K] 'chi_i \in seqIndT.
-Proof. by apply/seqIndP; exists i; rewrite ?inE. Qed.
-
-Lemma seqIndT_Ind1 : 'Ind[L, K] 1 \in seqIndT.
-Proof. by rewrite -irr0 mem_seqIndT. Qed.
-
-Lemma cfAut_seqIndT u : cfAut_closed u seqIndT.
-Proof.
-by move=> _ /seqIndP[i _ ->]; rewrite cfAutInd -aut_IirrE mem_seqIndT.
-Qed.
-
-Definition seqIndD H M := seqInd (Iirr_kerD H M).
-
-Lemma seqIndDY H M : seqIndD (M <*> H) M = seqIndD H M.
-Proof. by rewrite /seqIndD Iirr_kerDY. Qed.
-
-Lemma mem_seqInd H M i :
- H <| L -> M <| L -> ('Ind 'chi_i \in seqIndD H M) = (i \in Iirr_kerD H M).
-Proof.
-move=> nsHL nsML; apply/seqIndP/idP=> [[j Xj] | Xi]; last by exists i.
-case/cfclass_Ind_irrP/cfclassP=> // y Ly; rewrite -conjg_IirrE => /irr_inj->.
-by rewrite inE !Iirr_ker_conjg -?in_setD ?(subsetP _ y Ly) ?normal_norm.
-Qed.
-
-Lemma seqIndC1P phi :
- reflect (exists2 i, i != 0 & phi = 'Ind 'chi[K]_i) (phi \in seqIndD K 1).
-Proof.
-by apply: (iffP seqIndP) => [] [i nzi ->];
- exists i; rewrite // mem_Iirr_ker1 in nzi *.
-Qed.
-
-Lemma seqIndC1_filter : seqIndD K 1 = filter (predC1 ('Ind[L, K] 1)) seqIndT.
-Proof.
-rewrite filter_undup filter_map (eq_enum (in_set _)) enumT.
-congr (undup (map _ _)); apply: eq_filter => i /=.
-by rewrite mem_Iirr_ker1 cfInd_irr_eq1.
-Qed.
-
-Lemma seqIndC1_rem : seqIndD K 1 = rem ('Ind[L, K] 1) seqIndT.
-Proof. by rewrite rem_filter ?seqIndC1_filter ?undup_uniq. Qed.
-
-Section SeqIndD.
-
-Variables H0 H M : {group gT}.
-
-Local Notation S := (seqIndD H M).
-
-Lemma cfAut_seqInd u : cfAut_closed u S.
-Proof.
-move=> _ /seqIndP[i /setDP[kMi not_kHi] ->]; rewrite cfAutInd -aut_IirrE.
-by apply/seqIndP; exists (aut_Iirr u i); rewrite // inE !Iirr_ker_aut not_kHi.
-Qed.
-
-Lemma seqInd_conjC_subset1 : H \subset H0 -> cfConjC_subset S (seqIndD H0 1).
-Proof.
-move=> sHH0; split; [exact: seqInd_uniq | apply: seqIndS | exact: cfAut_seqInd].
-by rewrite Iirr_kerDS ?sub1G.
-Qed.
-
-Lemma seqInd_sub_aut_zchar u :
- {in S, forall phi, phi - cfAut u phi \in 'Z[S, K^#]}.
-Proof.
-move=> phi Sphi /=; rewrite sub_aut_zchar ?seqInd_zchar ?cfAut_seqInd //.
-exact: seqInd_vcharW.
-Qed.
-
-Lemma seqIndD_nonempty : H <| K -> M <| K -> M \proper H -> {phi | phi \in S}.
-Proof.
-move=> nsHK nsMK /andP[sMH ltMH]; pose X := Iirr_kerD H M.
-suffices: \sum_(i in X) 'chi_i 1%g ^+ 2 > 0.
- have [->|[i Xi]] := set_0Vmem X; first by rewrite big_set0 ltrr.
- by exists ('Ind 'chi_i); apply/seqIndP; exists i.
-by rewrite sum_Iirr_kerD_square ?mulr_gt0 ?gt0CiG ?subr_gt0 // ltr1n indexg_gt1.
-Qed.
-
-Hypothesis sHK : H \subset K.
-
-Lemma seqInd_sub : {subset S <= seqIndD K 1}.
-Proof. by apply: seqIndS; apply: Iirr_kerDS (sub1G M) sHK. Qed.
-
-Lemma seqInd_ortho_Ind1 : {in S, forall phi, '[phi, 'Ind[L, K] 1] = 0}.
-Proof.
-move=> _ /seqInd_sub/seqIndC1P[i nzi ->].
-by rewrite -irr0 not_cfclass_Ind_ortho // irr0 cfclass1 // inE irr_eq1.
-Qed.
-
-Lemma seqInd_ortho_cfuni : {in S, forall phi, '[phi, '1_K] = 0}.
-Proof.
-move=> phi /seqInd_ortho_Ind1/eqP; apply: contraTeq => not_o_phi_1K.
-by rewrite cfInd_cfun1 // cfdotZr rmorph_nat mulf_neq0.
-Qed.
-
-Lemma seqInd_ortho_1 : {in S, forall phi, '[phi, 1] = 0}.
-Proof.
-move=> _ /seqInd_sub/seqIndC1P[i nzi ->].
-by rewrite -cfdot_Res_r cfRes_cfun1 // -irr0 cfdot_irr (negbTE nzi).
-Qed.
-
-Lemma sum_seqIndD_square :
- H <| L -> M <| L -> M \subset H ->
- \sum_(phi <- S) phi 1%g ^+ 2 / '[phi] = #|L : H|%:R * (#|H : M|%:R - 1).
-Proof.
-move=> nsHL nsML sMH; rewrite -(Lagrange_index sKL sHK) natrM -/e -mulrA.
-rewrite -sum_Iirr_kerD_square ?(normalS _ sKL) ?(subset_trans sMH) //.
-pose h i := @Ordinal (size S).+1 _ (index_size ('Ind 'chi[K]_i) S).
-rewrite (partition_big h (ltn^~ (size S))) => /= [|i Xi]; last first.
- by rewrite index_mem mem_seqInd.
-rewrite big_distrr big_ord_narrow //= big_index_uniq ?seqInd_uniq //=.
-apply: eq_big_seq => phi Sphi; rewrite /eq_op insubT ?index_mem //= => _.
-have /seqIndP[i kHMi def_phi] := Sphi.
-have/cfunP/(_ 1%g) := scaled_cfResInd_sum_cfclass i nsKL.
-rewrite !cfunE sum_cfunE -def_phi cfResE // mulrAC => ->; congr (_ * _).
-rewrite reindex_cfclass //=; apply/esym/eq_big => j; last by rewrite !cfunE.
-rewrite (sameP (cfclass_Ind_irrP _ _ nsKL) eqP) -def_phi -mem_seqInd //.
-by apply/andP/eqP=> [[Sj /eqP/(congr1 (nth 0 S))] | ->]; rewrite ?nth_index.
-Qed.
-
-Section Odd.
-
-Hypothesis oddL : odd #|L|.
-
-Lemma seqInd_conjC_ortho : {in S, forall phi, '[phi, phi^*] = 0}.
-Proof.
-by move=> _ /seqInd_sub/seqIndC1P[i nzi ->]; apply: odd_induced_orthogonal.
-Qed.
-
-Lemma seqInd_conjC_neq : {in S, forall phi, phi^* != phi}%CF.
-Proof.
-move=> phi Sphi; apply: contraNneq (cfnorm_seqInd_neq0 Sphi) => {2}<-.
-by rewrite seqInd_conjC_ortho.
-Qed.
-
-Lemma seqInd_notReal : ~~ has cfReal S.
-Proof. exact/hasPn/seqInd_conjC_neq. Qed.
-
-Lemma seqInd_nontrivial chi : chi \in S -> (1 < size S)%N.
-Proof.
-move=> Schi; pose S2 := chi^*%CF :: chi.
-have: {subset S2 <= S} by apply/allP/and3P; rewrite /= cfAut_seqInd.
-by apply: uniq_leq_size; rewrite /= inE seqInd_conjC_neq.
-Qed.
-
-Variable chi : 'CF(L).
-Hypotheses (irr_chi : chi \in irr L) (Schi : chi \in S).
-
-Lemma seqInd_conjC_ortho2 : orthonormal (chi :: chi^*)%CF.
-Proof.
-by rewrite /orthonormal/= cfnorm_conjC irrWnorm ?seqInd_conjC_ortho ?eqxx.
-Qed.
-
-Lemma seqInd_nontrivial_irr : (#|[set i | 'chi_i \in S]| > 1)%N.
-Proof.
-have /irrP[i Dchi] := irr_chi; rewrite (cardsD1 i) (cardsD1 (conjC_Iirr i)).
-rewrite !inE -(inj_eq irr_inj) conjC_IirrE -Dchi seqInd_conjC_neq //.
-by rewrite cfAut_seqInd Schi.
-Qed.
-
-End Odd.
-
-End SeqIndD.
-
-Lemma sum_seqIndC1_square :
- \sum_(phi <- seqIndD K 1) phi 1%g ^+ 2 / '[phi] = e * (#|K|%:R - 1).
-Proof. by rewrite sum_seqIndD_square ?normal1 ?sub1G // indexg1. Qed.
-
-End InducedIrrs.
-
-Arguments seqIndP [gT K L calX phi].
-Arguments seqIndC1P [gT K L phi].
-
-Section Five.
-
-Variable gT : finGroupType.
-
-Section Defs.
-
-Variables L G : {group gT}.
-
-(* This is Peterfalvi, Definition (5.1). *)
-(* We depart from the text in Section 5 on three points: *)
-(* - We drop non-triviality condition in Z[S, A], which is not used *)
-(* consistently in the rest of the proof. In particular, it is *)
-(* incompatible with the use of "not coherent" in (6.2), and it is only *)
-(* really used in (7.8), where it is equivalent to the simpler condition *)
-(* (size S > 1). For us the empty S is coherent; this avoids duplicate *)
-(* work in some inductive proofs, e.g., subcoherent_norm - Lemma (5.4) - *)
-(* below. *)
-(* - The preconditions for coherence (A < L, S < Z[irr L], and tau Z-linear *)
-(* on some E < Z[irr L]) are not part of the definition of "coherent". *)
-(* These will be captured as separate requirements; in particular in the *)
-(* Odd Order proof tau will always be C-linear on all of 'CF(L). *)
-(* - By contrast, our "coherent" only supplies an additive (Z-linear) *)
-(* isometry, where the source text ambiguously specifies a "linear" one. *)
-(* When S consists of virtual characters this implies the existence of *)
-(* a C-linear one: the linear extension of the restriction of the *)
-(* isometry to a basis of the Z-module Z[S]. The latter can be found from *)
-(* the Smith normal form (see intdiv.v) of the coordinate matrix of S. *)
-(* The weaker Z-linearity lets us use the dual_iso construction when *)
-(* size S = 2. *)
-(* Finally, note that although we have retained the A parameter, in the *)
-(* sequel we shall always take A = L^#, as in the text it is always the case *)
-(* that Z[S, A] = Z[S, L^#]. *)
-Definition coherent_with S A tau (tau1 : {additive 'CF(L) -> 'CF(G)}) :=
- {in 'Z[S], isometry tau1, to 'Z[irr G]} /\ {in 'Z[S, A], tau1 =1 tau}.
-
-Definition coherent S A tau := exists tau1, coherent_with S A tau tau1.
-
-(* This is Peterfalvi, Hypothesis (5.2). *)
-(* The Z-linearity constraint on tau will be expressed by an additive or *)
-(* linear structure on tau. *)
-Definition subcoherent S tau R :=
- [/\ (*a*) [/\ {subset S <= character}, ~~ has cfReal S & cfConjC_closed S],
- (*b*) {in 'Z[S, L^#], isometry tau, to 'Z[@irr gT G, G^#]},
- (*c*) pairwise_orthogonal S,
- (*d*) {in S, forall xi : 'CF(L : {set gT}),
- [/\ {subset R xi <= 'Z[irr G]}, orthonormal (R xi)
- & tau (xi - xi^*%CF) = \sum_(alpha <- R xi) alpha]}
- & (*e*) {in S &, forall xi phi : 'CF(L),
- orthogonal phi (xi :: xi^*%CF) -> orthogonal (R phi) (R xi)}].
-
-Definition dual_iso (nu : {additive 'CF(L) -> 'CF(G)}) :=
- [additive of -%R \o nu \o cfAut conjC].
-
-End Defs.
-
-Section SubsetCoherent.
-
-Variables L G : {group gT}.
-Implicit Type tau : 'CF(L) -> 'CF(G).
-
-Lemma subgen_coherent S1 S2 A tau:
- {subset S2 <= 'Z[S1]} -> coherent S1 A tau -> coherent S2 A tau.
-Proof.
-move/zchar_trans=> sS21 [tau1 [[Itau1 Ztau1] def_tau]].
-exists tau1; split; last exact: sub_in1 def_tau.
-by split; [apply: sub_in2 Itau1 | apply: sub_in1 Ztau1].
-Qed.
-
-Lemma subset_coherent S1 S2 A tau:
- {subset S2 <= S1} -> coherent S1 A tau -> coherent S2 A tau.
-Proof.
-by move=> sS21; apply: subgen_coherent => phi /sS21/mem_zchar->.
-Qed.
-
-Lemma subset_coherent_with S1 S2 A tau (tau1 : {additive 'CF(L) -> 'CF(G)}) :
- {subset S1 <= S2} -> coherent_with S2 A tau tau1 ->
- coherent_with S1 A tau tau1.
-Proof.
-move=> /zchar_subset sS12 [Itau1 Dtau1].
-by split=> [|xi /sS12/Dtau1//]; apply: sub_iso_to Itau1.
-Qed.
-
-Lemma perm_eq_coherent S1 S2 A tau:
- perm_eq S1 S2 -> coherent S1 A tau -> coherent S2 A tau.
-Proof.
-by move=> eqS12; apply: subset_coherent => phi; rewrite (perm_eq_mem eqS12).
-Qed.
-
-Lemma dual_coherence S tau R nu :
- subcoherent S tau R -> coherent_with S L^# tau nu -> (size S <= 2)%N ->
- coherent_with S L^# tau (dual_iso nu).
-Proof.
-move=> [[charS nrS ccS] _ oSS _ _] [[Inu Znu] Dnu] szS2.
-split=> [|{Inu Znu oSS} phi ZSphi].
- have{oSS} ccZS := cfAut_zchar ccS.
- have vcharS: {subset S <= 'Z[irr L]} by move=> phi /charS/char_vchar.
- split=> [phi1 phi2 Sphi1 Sphi2 | phi Sphi].
- rewrite cfdotNl cfdotNr opprK Inu ?ccZS // cfdot_conjC aut_Cint //.
- by rewrite Cint_cfdot_vchar ?(zchar_sub_irr vcharS).
- by rewrite rpredN Znu ?ccZS.
-rewrite -{}Dnu //; move: ZSphi; rewrite zcharD1E => /andP[].
-case/zchar_nth_expansion=> x Zx -> {phi} /=.
-case: S charS nrS ccS szS2 x Zx => [_ _ _ _ x _| eta S1].
- by rewrite big_ord0 !raddf0.
-case/allP/andP=> Neta _ /norP[eta'c _] /allP/andP[S1_etac _].
-rewrite inE [_ == _](negPf eta'c) /= in S1_etac.
-case S1E: S1 S1_etac => [|u []] // /predU1P[] //= <- _ z Zz.
-rewrite big_ord_recl big_ord1 !raddfD !raddfZ_Cint //=.
-rewrite !cfunE (conj_Cnat (Cnat_char1 Neta)) -mulrDl mulf_eq0.
-rewrite addr_eq0 char1_eq0 // !scalerN /= cfConjCK addrC.
-by case/pred2P => ->; rewrite ?raddf0 //= !scaleNr opprK.
-Qed.
-
-Lemma coherent_seqInd_conjCirr S tau R nu r :
- subcoherent S tau R -> coherent_with S L^# tau nu ->
- let chi := 'chi_r in let chi2 := (chi :: chi^*)%CF in
- chi \in S ->
- [/\ {subset map nu chi2 <= 'Z[irr G]}, orthonormal (map nu chi2),
- chi - chi^*%CF \in 'Z[S, L^#] & (nu chi - nu chi^*)%CF 1%g == 0].
-Proof.
-move=> [[charS nrS ccS] [_ Ztau] oSS _ _] [[Inu Znu] Dnu] chi chi2 Schi.
-have sSZ: {subset S <= 'Z[S]} by apply: mem_zchar.
-have vcharS: {subset S <= 'Z[irr L]} by move=> phi /charS/char_vchar.
-have Schi2: {subset chi2 <= 'Z[S]} by apply/allP; rewrite /= !sSZ ?ccS.
-have Schi_diff: chi - chi^*%CF \in 'Z[S, L^#].
- by rewrite sub_aut_zchar // zchar_onG sSZ ?ccS.
-split=> // [_ /mapP[xi /Schi2/Znu ? -> //]||].
- apply: map_orthonormal; first by apply: sub_in2 Inu; apply: zchar_trans_on.
- rewrite orthonormalE (conjC_pair_orthogonal ccS) //=.
- by rewrite cfnorm_conjC !cfnorm_irr !eqxx.
-by rewrite -raddfB -cfunD1E Dnu // irr_vchar_on ?Ztau.
-Qed.
-
-(* There is a simple, direct way of establishing that S is coherent when S *)
-(* has a pivot character eta1 whose degree divides the degree of all other *)
-(* eta_i in S, as then (eta_i - a_i *: eta1)_i>1 will be a basis of Z[S, L^#] *)
-(* for some integers a_i. In that case we just need to find a virtual *)
-(* character zeta1 of G with the same norm as eta1, and the same dot product *)
-(* on the image of the eta_i - a_i *: eta1 under tau, for then the linear *)
-(* extension of tau that assigns zeta1 to eta1 is an isometry. *)
-(* This is used casually by Peterfalvi, e.g., in (5.7), but a rigorous *)
-(* proof does require some work, which is best factored as a Lemma. *)
-Lemma pivot_coherence S (tau : {additive 'CF(L) -> 'CF(G)}) R eta1 zeta1 :
- subcoherent S tau R -> eta1 \in S -> zeta1 \in 'Z[irr G] ->
- {in [predD1 S & eta1], forall eta : 'CF(L),
- exists2 a, a \in Cnat /\ eta 1%g = a * eta1 1%g
- & '[tau (eta - a *: eta1), zeta1] = - a * '[eta1]} ->
- '[zeta1] = '[eta1] ->
- coherent S L^# tau.
-Proof.
-case=> -[N_S _ _] [Itau Ztau] oSS _ _ Seta1 Zzeta1 isoS Izeta1.
-have freeS := orthogonal_free oSS; have uniqS := free_uniq freeS.
-have{oSS} [/andP[S'0 _] oSS] := pairwise_orthogonalP oSS.
-pose d := eta1 1%g; pose a (eta : 'CF(L)) := truncC (eta 1%g / d).
-have{S'0} nzd: d != 0 by rewrite char1_eq0 ?N_S ?(memPn S'0).
-pose S1 := eta1 :: [seq eta - eta1 *+ a eta | eta <- rem eta1 S].
-have sS_ZS1: {subset S <= 'Z[S1]}; last apply: (subgen_coherent sS_ZS1).
- have Zeta1: eta1 \in 'Z[S1] by rewrite mem_zchar ?mem_head.
- apply/allP; rewrite (eq_all_r (perm_eq_mem (perm_to_rem Seta1))) /= Zeta1.
- apply/allP=> eta Seta; rewrite -(rpredBr eta (rpredMn (a eta) Zeta1)).
- exact/mem_zchar/mem_behead/map_f.
-have{sS_ZS1} freeS1: free S1.
- have Sgt0: (0 < size S)%N by case: (S) Seta1.
- rewrite /free eqn_leq dim_span /= size_map size_rem ?prednK // -(eqnP freeS).
- by apply/dimvS/span_subvP => eta /sS_ZS1/zchar_span.
-pose iso_eta1 zeta := zeta \in 'Z[S, L^#] /\ '[tau zeta, zeta1] = '[zeta, eta1].
-have{isoS} isoS: {in behead S1, forall zeta, iso_eta1 zeta}.
- rewrite /iso_eta1 => _ /mapP[eta Seta ->]; rewrite mem_rem_uniq // in Seta.
- have{Seta} [/isoS[q [Nq Dq] Itau_eta1] [eta1'eta Seta]] := (Seta, andP Seta).
- rewrite zcharD1E rpredB ?rpredMn ?mem_zchar //= -scaler_nat /a Dq mulfK //.
- by rewrite truncCK // !cfunE Dq subrr cfdotBl cfdotZl -mulNr oSS ?add0r.
-have isoS1: {in S1, isometry [eta tau with eta1 |-> zeta1], to 'Z[irr G]}.
- split=> [xi eta | eta]; rewrite !in_cons /=; last first.
- by case: eqP => [-> | _ /isoS[/Ztau/zcharW]].
- do 2!case: eqP => [-> _|_ /isoS[? ?]] //; last exact: Itau.
- by apply/(can_inj (@conjCK _)); rewrite -!cfdotC.
-have [nu Dnu IZnu] := Zisometry_of_iso freeS1 isoS1.
-exists nu; split=> // phi; rewrite zcharD1E => /andP[].
-case/(zchar_expansion (free_uniq freeS1)) => b Zb {phi}-> phi1_0.
-have{phi1_0} b_eta1_0: b eta1 = 0.
- have:= phi1_0; rewrite sum_cfunE big_cons big_seq big1 ?addr0 => [|zeta].
- by rewrite !cfunE (mulIr_eq0 _ (mulIf nzd)) => /eqP.
- by case/isoS; rewrite cfunE zcharD1E => /andP[_ /eqP->] _; rewrite mulr0.
-rewrite !raddf_sum; apply/eq_big_seq=> xi S1xi; rewrite !raddfZ_Cint //=.
-by rewrite Dnu //=; case: eqP => // ->; rewrite b_eta1_0 !scale0r.
-Qed.
-
-End SubsetCoherent.
-
-(* This is Peterfalvi (5.3)(a). *)
-Lemma irr_subcoherent (L G : {group gT}) S tau :
- cfConjC_subset S (irr L) -> ~~ has cfReal S ->
- {in 'Z[S, L^#], isometry tau, to 'Z[irr G, G^#]} ->
- {R | subcoherent S tau R}.
-Proof.
-case=> uniqS irrS ccS nrS [isoL Ztau].
-have N_S: {subset S <= character} by move=> _ /irrS/irrP[i ->]; apply: irr_char.
-have Z_S: {subset S <= 'Z[irr L]} by move=> chi /N_S/char_vchar.
-have o1S: orthonormal S by apply: sub_orthonormal (irr_orthonormal L).
-have [[_ dotSS] oS] := (orthonormalP o1S, orthonormal_orthogonal o1S).
-pose beta chi := tau (chi - chi^*%CF); pose eqBP := _ =P beta _.
-have Zbeta: {in S, forall chi, chi - (chi^*)%CF \in 'Z[S, L^#]}.
- move=> chi Schi; rewrite /= zcharD1E rpredB ?mem_zchar ?ccS //= !cfunE.
- by rewrite subr_eq0 conj_Cnat // Cnat_char1 ?N_S.
-pose sum_beta chi R := \sum_(alpha <- R) alpha == beta chi.
-pose Zortho R := all (mem 'Z[irr G]) R && orthonormal R.
-have R chi: {R : 2.-tuple 'CF(G) | (chi \in S) ==> sum_beta chi R && Zortho R}.
- apply: sigW; case Schi: (chi \in S) => /=; last by exists [tuple 0; 0].
- move/(_ _ Schi) in Zbeta; have /irrP[i def_chi] := irrS _ Schi.
- have: '[beta chi] = 2%:R.
- rewrite isoL // cfnormBd ?dotSS ?ccS ?eqxx // eq_sym -/(cfReal _).
- by rewrite (negPf (hasPn nrS _ _)).
- case/zchar_small_norm; rewrite ?(zcharW (Ztau _ _)) // => R [oR ZR sumR].
- by exists R; apply/and3P; split; [apply/eqP | apply/allP | ].
-exists (fun xi => val (val (R xi))); split=> // [chi Schi | chi phi Schi Sphi].
- by case: (R chi) => Rc /=; rewrite Schi => /and3P[/eqBP-> /allP].
-case/andP => /and3P[/=/eqP-opx /eqP-opx' _] _.
-have{opx opx'} obpx: '[beta phi, beta chi] = 0.
- rewrite isoL ?Zbeta // cfdotBl !cfdotBr -{3}[chi]cfConjCK.
- by rewrite !cfdot_conjC opx opx' rmorph0 !subr0.
-case: (R phi) => [[[|a [|b []]] //= _]].
-rewrite Sphi => /and3P[/eqBP sum_ab Zab o_ab].
-case: (R chi) => [[[|c [|d []]] //= _]].
-rewrite Schi => /and3P[/eqBP-sum_cd Zcd o_cd].
-suffices: orthonormal [:: a; - b; c; d].
- rewrite (orthonormal_cat [:: a; _]) => /and3P[_ _].
- by rewrite /orthogonal /= !cfdotNl !oppr_eq0.
-apply: vchar_pairs_orthonormal 1 (-1) _ _ _ _.
-- by split; apply/allP; rewrite //= rpredN.
-- by rewrite o_cd andbT /orthonormal/= cfnormN /orthogonal /= cfdotNr !oppr_eq0.
-- by rewrite oppr_eq0 oner_eq0 rpredN rpred1.
-rewrite !(big_seq1, big_cons) in sum_ab sum_cd.
-rewrite scale1r scaleN1r !opprK sum_ab sum_cd obpx eqxx /=.
-by rewrite !(cfun_on0 (zchar_on (Ztau _ _))) ?Zbeta ?inE ?eqxx.
-Qed.
-
-(* This is Peterfalvi (5.3)(b). *)
-Lemma prDade_subcoherent (G L K H W W1 W2 : {group gT}) A A0 S
- (defW : W1 \x W2 = W) (ddA : prime_Dade_hypothesis G L K H A A0 defW)
- (w_ := fun i j => cyclicTIirr defW i j) (sigma := cyclicTIiso ddA)
- (mu := primeTIred ddA) (delta := fun j => primeTIsign ddA j)
- (tau := Dade ddA) :
- let dsw j k := [seq delta j *: sigma (w_ i k) | i : Iirr W1] in
- let Rmu j := dsw j j ++ map -%R (dsw j (conjC_Iirr j)) in
- cfConjC_subset S (seqIndD K L H 1) -> ~~ has cfReal S ->
- {R | [/\ subcoherent S tau R,
- {in [predI S & irr L] & irr W,
- forall phi w, orthogonal (R phi) (sigma w)}
- & forall j, R (mu j) = Rmu j ]}.
-Proof.
-pose mu2 i j := primeTIirr ddA i j.
-set S0 := seqIndD K L H 1 => dsw Rmu [uS sSS0 ccS] nrS.
-have nsKL: K <| L by have [[/sdprod_context[]]] := prDade_prTI ddA.
-have /subsetD1P[sAK notA1]: A \subset K^# by have [_ []] := prDade_def ddA.
-have [_ _ defA0] := prDade_def ddA.
-have defSA: 'Z[S, L^#] =i 'Z[S, A].
- have sS0A1: {subset S0 <= 'CF(L, 1%g |: A)}.
- move=> _ /seqIndP[i /setDP[_ kerH'i] ->]; rewrite inE in kerH'i.
- exact: (prDade_Ind_irr_on ddA) kerH'i.
- move=> phi; have:= zcharD1_seqInd_Dade nsKL notA1 sS0A1 phi.
- rewrite !{1}(zchar_split _ A, zchar_split _ L^#) => eq_phiAL.
- by apply: andb_id2l => /(zchar_subset sSS0) S0phi; rewrite S0phi in eq_phiAL.
-have Itau: {in 'Z[S, L^#], isometry tau, to 'Z[irr G, G^#]}.
- apply: sub_iso_to sub_refl (Dade_Zisometry _) => phi; rewrite defSA => SAphi.
- rewrite defA0; apply: zchar_onS (subsetUl _ _) _ _.
- by apply: zchar_sub_irr SAphi => ? /sSS0/seqInd_vcharW.
-have orthoS: pairwise_orthogonal S.
- exact: sub_pairwise_orthogonal sSS0 uS (seqInd_orthogonal nsKL _).
-pose S1 := filter (mem (irr L)) S.
-have sS1S: {subset S1 <= S} by apply/mem_subseq/filter_subseq.
-have sZS1S: {subset 'Z[S1, L^#] <= 'Z[S, L^#]}.
- by apply: zchar_subset sS1S; apply: orthogonal_free.
-have [||R1 cohR1] := irr_subcoherent _ _ (sub_iso_to sZS1S sub_refl Itau).
-- split=> [|phi|phi]; rewrite ?mem_filter ?filter_uniq //; try case/andP=> //.
- by case/irrP=> i {2}-> /=/ccS->; rewrite cfConjC_irr.
-- by apply/hasPn=> phi /sS1S/(hasPn nrS).
-have{cohR1} [[charS1 _ _] _ _ R1ok R1ortho] := cohR1.
-pose R phi := oapp Rmu (R1 phi) [pick j | phi == mu j].
-have inS1 phi: [pred j | phi == mu j] =1 pred0 -> phi \in S -> phi \in S1.
- move=> mu'phi Sphi; rewrite mem_filter Sphi andbT /=.
- have{Sphi} /seqIndP[ell _ Dphi] := sSS0 _ Sphi; rewrite Dphi.
- have [[j Dell] | [] //] := prTIres_irr_cases ddA ell.
- by have /=/eqP[] := mu'phi j; rewrite Dphi Dell cfInd_prTIres.
-have Smu_nz j: mu j \in S -> j != 0.
- move/(hasPn nrS); apply: contraNneq => ->.
- by rewrite /cfReal -(prTIred_aut ddA) aut_Iirr0.
-have oS1sigma phi: phi \in S1 -> orthogonal (R1 phi) (map sigma (irr W)).
- move=> S1phi; have [zR1 oR1] := R1ok _ S1phi; set psi := _ - _=> Dpsi.
- suffices o_psi_sigma: orthogonal (tau psi) (map sigma (irr W)).
- apply/orthogonalP=> aa sw R1aa Wsw; have:= orthoPl o_psi_sigma _ Wsw.
- have{sw Wsw} /dirrP[bw [lw ->]]: sw \in dirr G.
- have [_ /(cycTIirrP defW)[i [j ->]] ->] := mapP Wsw.
- exact: cycTIiso_dirr.
- have [|ba [la Daa]] := vchar_norm1P (zR1 _ R1aa).
- by have [_ -> //] := orthonormalP oR1; rewrite eqxx.
- rewrite Daa cfdotZl !cfdotZr cfdot_irr.
- case: eqP => [<-{lw} | _ _]; last by rewrite !mulr0.
- move/(congr1 ( *%R ((-1) ^+ (ba (+) bw))^*)); rewrite mulr0 => /eqP/idPn[].
- rewrite mulrA -rmorphM -signr_addb {bw}addbK -cfdotZr -{ba la}Daa.
- rewrite Dpsi -(eq_bigr _ (fun _ _ => scale1r _)).
- by rewrite cfproj_sum_orthonormal ?oner_eq0.
- apply/orthoPl=> _ /mapP[_ /(cycTIirrP defW)[i [j ->]] ->]; rewrite -/w_.
- pose w1 := #|W1|; pose w2 := #|W2|.
- have minw_gt2: (2 < minn w1 w2)%N.
- have [[_ ntW1 _ _] [ntW2 _ _] _] := prDade_prTI ddA.
- rewrite -(dprod_card defW) odd_mul => /andP[oddW1 oddW2].
- by rewrite leq_min !odd_gt2 ?cardG_gt1.
- apply: contraTeq (minw_gt2) => ntNC; rewrite -leqNgt.
- pose NC := cyclicTI_NC ddA.
- have /andP[/=/irrP[l Dphi] Sphi]: phi \in [predI irr L & S].
- by rewrite mem_filter in S1phi.
- have Zpsi: psi \in 'Z[S, L^#].
- rewrite sub_aut_zchar ?mem_zchar_on ?orthogonal_free ?ccS ?cfun_onG //.
- by move=> ? /sSS0/seqInd_vcharW.
- have NCpsi_le2: (NC (tau psi) <= 2)%N.
- have{Itau} [Itau Ztau] := Itau.
- suff: '[tau psi] <= 2%:R by apply: cycTI_NC_norm; apply: zcharW (Ztau _ _).
- rewrite Itau // cfnormBd; first by rewrite cfnorm_conjC Dphi cfnorm_irr.
- have /pairwise_orthogonalP[_ -> //] := orthoS; first exact: ccS.
- by rewrite eq_sym (hasPn nrS).
- apply: leq_trans (NCpsi_le2).
- have: (0 < NC (tau psi) < 2 * minn w1 w2)%N.
- rewrite -(subnKC minw_gt2) (leq_ltn_trans NCpsi_le2) // andbT lt0n.
- by apply/existsP; exists (i, j); rewrite /= topredE inE.
- apply: cycTI_NC_minn (ddA) _ _ => x Vx.
- rewrite Dade_id; last by rewrite defA0 inE orbC mem_class_support.
- rewrite defSA in Zpsi; rewrite (cfun_on0 (zchar_on Zpsi)) // -in_setC.
- by apply: subsetP (subsetP (prDade_supp_disjoint ddA) x Vx); rewrite setCS.
-exists R; split=> [|phi w S1phi irr_w|j]; first 1 last.
-- rewrite /R; case: pickP => [j /eqP Dphi | _ /=].
- by case/nandP: S1phi; right; rewrite /= Dphi (prTIred_not_irr ddA).
- apply/orthoPr=> aa R1aa; rewrite (orthogonalP (oS1sigma phi _)) ?map_f //.
- by rewrite mem_filter andbC.
-- by rewrite /R; case: pickP => /= [k /eqP/(prTIred_inj ddA)-> | /(_ j)/eqP].
-have Zw i j: w_ i j \in 'Z[irr W] by apply: irr_vchar.
-have{oS1sigma} oS1dsw psi j: psi \in S1 -> orthogonal (R1 psi) (dsw _ j).
- move/oS1sigma/orthogonalP=> opsiW.
- apply/orthogonalP=> aa _ R1aa /codomP[i ->].
- by rewrite cfdotZr opsiW ?map_f ?mem_irr ?mulr0.
-have odsw j1 j2: j1 != j2 -> orthogonal (dsw _ j1) (dsw _ j2).
- move/negPf=> j2'1; apply/orthogonalP=> _ _ /codomP[i1 ->] /codomP[i2 ->].
- by rewrite cfdotZl cfdotZr (cfdot_cycTIiso ddA) j2'1 andbF !mulr0.
-split=> // [|phi Sphi|phi xi Sphi Sxi].
-- by split=> // phi /sSS0; apply: seqInd_char.
-- rewrite /R; case: pickP => [j /eqP Dphi /= | /inS1/(_ Sphi)/R1ok//].
- have nz_j: j != 0 by rewrite Smu_nz -?Dphi.
- have [Isig Zsig]: {in 'Z[irr W], isometry sigma, to 'Z[irr G]}.
- exact: cycTI_Zisometry.
- split=> [aa | |].
- - rewrite mem_cat -map_comp.
- by case/orP=> /codomP[i ->]; rewrite ?rpredN rpredZsign Zsig.
- - rewrite orthonormal_cat orthogonal_oppr odsw ?andbT; last first.
- rewrite -(inj_eq (prTIred_inj ddA)) (prTIred_aut ddA) -/mu -Dphi.
- by rewrite eq_sym (hasPn nrS).
- suffices oNdsw k: orthonormal (dsw j k).
- by rewrite map_orthonormal ?oNdsw //; apply: in2W; apply: opp_isometry.
- apply/orthonormalP; split=> [|_ _ /codomP[i1 ->] /codomP[i2 ->]].
- rewrite map_inj_uniq ?enum_uniq // => i1 i2 /(can_inj (signrZK _))/eqP.
- by rewrite (cycTIiso_eqE ddA) eqxx andbT => /eqP.
- rewrite cfdotZl cfdotZr rmorph_sign signrMK (cfdot_cycTIiso ddA).
- by rewrite -(cycTIiso_eqE ddA) (inj_eq (can_inj (signrZK _))).
- have [Tstruct [tau1 Dtau1 [_ Dtau]]] := uniform_prTIred_coherent ddA nz_j.
- have{Tstruct} [/orthogonal_free freeT _ ccT _ _] := Tstruct.
- have phi1c: (phi 1%g)^* = phi 1%g := conj_Cnat (Cnat_seqInd1 (sSS0 _ Sphi)).
- rewrite -[tau _]Dtau; last first.
- rewrite zcharD1E !cfunE phi1c subrr Dphi eqxx andbT.
- by rewrite rpredB ?mem_zchar ?ccT ?image_f ?inE // nz_j eqxx.
- rewrite linearB Dphi -(prTIred_aut ddA) !Dtau1 -/w_ -/sigma -/(delta j).
- by rewrite big_cat /= !big_map !raddf_sum.
-rewrite /R; case: pickP => [j1 /eqP Dxi | /inS1/(_ Sxi)S1xi]; last first.
- case: pickP => [j2 _ _ | /inS1/(_ Sphi)S1phi]; last exact: R1ortho.
- by rewrite orthogonal_catr orthogonal_oppr !oS1dsw.
-case: pickP => [j2 /eqP Dphi | /inS1/(_ Sphi)S1phi _]; last first.
- by rewrite orthogonal_sym orthogonal_catr orthogonal_oppr !oS1dsw.
-case/andP=> /and3P[/= /eqP o_xi_phi /eqP o_xi_phi'] _ _.
-have /eqP nz_xi: '[xi] != 0 := cfnorm_seqInd_neq0 nsKL (sSS0 _ Sxi).
-have [Dj1 | j2'1] := eqVneq j1 j2.
- by rewrite {2}Dxi Dj1 -Dphi o_xi_phi in nz_xi.
-have [Dj1 | j2c'1] := eqVneq j1 (conjC_Iirr j2).
- by rewrite {2}Dxi Dj1 /mu (prTIred_aut ddA) -/mu -Dphi o_xi_phi' in nz_xi.
-rewrite orthogonal_catl orthogonal_oppl !orthogonal_catr !orthogonal_oppr.
-by rewrite !odsw ?(inv_eq (@conjC_IirrK _ _)) ?conjC_IirrK.
-Qed.
-
-Section SubCoherentProperties.
-
-Variables (L G : {group gT}) (S : seq 'CF(L)) (R : 'CF(L) -> seq 'CF(G)).
-Variable tau : {linear 'CF(L) -> 'CF(G)}.
-Hypothesis cohS : subcoherent S tau R.
-
-Lemma nil_coherent A : coherent [::] A tau.
-Proof.
-exists [additive of 'Ind[G]]; split=> [|u /zchar_span]; last first.
- by rewrite span_nil memv0 => /eqP-> /=; rewrite !raddf0.
-split=> [u v | u] /zchar_span; rewrite span_nil memv0 => /eqP->.
- by rewrite raddf0 !cfdot0l.
-by rewrite raddf0 rpred0.
-Qed.
-
-Lemma subset_subcoherent S1 : cfConjC_subset S1 S -> subcoherent S1 tau R.
-Proof.
-case=> uS1 sS1 ccS1; have [[N_S nrS _] Itau oS defR oR] := cohS.
-split; last 1 [exact: sub_in1 defR | exact: sub_in2 oR].
-- split=> // [xi /sS1/N_S// | ].
- by apply/hasPn; apply: sub_in1 (hasPn nrS).
-- by apply: sub_iso_to Itau => //; apply: zchar_subset.
-exact: sub_pairwise_orthogonal oS.
-Qed.
-
-Lemma subset_ortho_subcoherent S1 chi :
- {subset S1 <= S} -> chi \in S -> chi \notin S1 -> orthogonal S1 chi.
-Proof.
-move=> sS1S Schi S1'chi; apply/orthoPr=> phi S1phi; have Sphi := sS1S _ S1phi.
-have [_ _ /pairwise_orthogonalP[_ -> //]] := cohS.
-by apply: contraNneq S1'chi => <-.
-Qed.
-
-Lemma subcoherent_split chi beta :
- chi \in S -> beta \in 'Z[irr G] ->
- exists2 X, X \in 'Z[R chi]
- & exists Y, [/\ beta = X - Y, '[X, Y] = 0 & orthogonal Y (R chi)].
-Proof.
-move=> Schi Zbeta; have [_ _ _ /(_ _ Schi)[ZR oRR _] _] := cohS.
-have [X RX [Y [defXY oXY oYR]]] := orthogonal_split (R chi) beta.
-exists X; last first.
- by exists (- Y); rewrite opprK (orthogonal_oppl Y) cfdotNr oXY oppr0.
-have [_ -> ->] := orthonormal_span oRR RX; rewrite big_seq rpred_sum // => a Ra.
-rewrite rpredZ_Cint ?mem_zchar // -(addrK Y X) -defXY.
-by rewrite cfdotBl (orthoPl oYR) // subr0 Cint_cfdot_vchar // ZR.
-Qed.
-
-(* This is Peterfalvi (5.4). *)
-(* The assumption X \in 'Z[R chi] has been weakened to '[X, Y] = 0; this *)
-(* stronger form of the lemma is needed to strengthen the proof of (5.6.3) so *)
-(* that it can actually be reused in (9.11.8), as the text suggests. *)
-Lemma subcoherent_norm chi psi (tau1 : {additive 'CF(L) -> 'CF(G)}) X Y :
- [/\ chi \in S, psi \in 'Z[irr L] & orthogonal (chi :: chi^*)%CF psi] ->
- let S0 := chi - psi :: chi - chi^*%CF in
- {in 'Z[S0], isometry tau1, to 'Z[irr G]} ->
- tau1 (chi - chi^*%CF) = tau (chi - chi^*%CF) ->
- [/\ tau1 (chi - psi) = X - Y, '[X, Y] = 0 & orthogonal Y (R chi)] ->
- [/\ (*a*) '[chi] <= '[X]
- & (*b*) '[psi] <= '[Y] ->
- [/\ '[X] = '[chi], '[Y] = '[psi]
- & exists2 E, subseq E (R chi) & X = \sum_(xi <- E) xi]].
-Proof.
-case=> Schi Zpsi /and3P[/andP[/eqP-ochi_psi _] /andP[/eqP-ochic_psi _] _] S0.
-move=> [Itau1 Ztau1] tau1dchi [defXY oXY oYR].
-have [[ZS nrS ccS] [tS Zt] oS /(_ _ Schi)[ZR o1R tau_dchi] _] := cohS.
-have [/=/andP[S'0 uS] oSS] := pairwise_orthogonalP oS.
-have [nRchi Schic] := (hasPn nrS _ Schi, ccS _ Schi).
-have ZtauS00: tau1 S0`_0 \in 'Z[irr G] by rewrite Ztau1 ?mem_zchar ?mem_head.
-have{ZtauS00} [X1 R_X1 [Y1 [dXY1 oXY1 oY1R]]] := subcoherent_split Schi ZtauS00.
-have [uR _] := orthonormalP o1R; have [a Za defX1] := zchar_expansion uR R_X1.
-have dotS00R xi: xi \in R chi -> '[tau1 S0`_0, xi] = a xi.
- move=> Rxi; rewrite dXY1 cfdotBl (orthoPl oY1R) // subr0.
- by rewrite defX1 cfproj_sum_orthonormal.
-have nchi: '[chi] = \sum_(xi <- R chi) a xi.
- transitivity '[tau1 S0`_0, tau1 S0`_1]; last first.
- by rewrite tau1dchi tau_dchi cfdot_sumr; apply: eq_big_seq dotS00R.
- rewrite [RHS]cfdotC Itau1 ?mem_zchar ?mem_nth // cfdotBl !cfdotBr.
- by rewrite ochi_psi ochic_psi (oSS chi^*%CF) // !subr0 -cfdotC.
-have normX: '[X1] <= '[X] ?= iff (X == X1).
- rewrite -[in '[X]](subrK X1 X) -subr_eq0 cfnormDd.
- by rewrite -lerif_subLR subrr -cfnorm_eq0 eq_sym; apply/lerif_eq/cfnorm_ge0.
- rewrite defX1 cfdot_sumr big1_seq // => xi Rxi.
- rewrite cfdotZr cfdotBl cfproj_sum_orthonormal // -{2}dotS00R // defXY.
- by rewrite cfdotBl (orthoPl oYR) // subr0 subrr mulr0.
-pose is01a xi := a xi == (a xi != 0)%:R.
-have leXa xi: a xi <= `|a xi| ^+ 2 ?= iff is01a xi.
- rewrite Cint_normK //; split; first by rewrite Cint_ler_sqr.
- rewrite eq_sym -subr_eq0 -[lhs in _ - lhs]mulr1 -mulrBr mulf_eq0 subr_eq0.
- by rewrite /is01a; case a_xi_0: (a xi == 0).
-have{nchi normX} part_a: '[chi] <= '[X] ?= iff all is01a (R chi) && (X == X1).
- apply: lerif_trans normX; rewrite nchi defX1 cfnorm_sum_orthonormal //.
- by rewrite -big_all !(big_tnth _ _ (R chi)) big_andE; apply: lerif_sum.
-split=> [|/lerif_eq part_b]; first by case: part_a.
-have [_ /esym] := lerif_add part_a part_b; rewrite -!cfnormBd // -defXY.
-rewrite Itau1 ?mem_zchar ?mem_head // eqxx => /andP[a_eq /eqP->].
-split=> //; first by apply/esym/eqP; rewrite part_a.
-have{a_eq} [/allP a01 /eqP->] := andP a_eq; rewrite defX1.
-exists [seq xi <- R chi | a xi != 0]; first exact: filter_subseq.
-rewrite big_filter [rhs in _ = rhs]big_mkcond /=.
-by apply: eq_big_seq => xi Rxi; rewrite -mulrb -scaler_nat -(eqP (a01 _ _)).
-Qed.
-
-(* This is Peterfalvi (5.5). *)
-Lemma coherent_sum_subseq chi (tau1 : {additive 'CF(L) -> 'CF(G)}) :
- chi \in S ->
- {in 'Z[chi :: chi^*%CF], isometry tau1, to 'Z[irr G]} ->
- tau1 (chi - chi^*%CF) = tau (chi - chi^*%CF) ->
- exists2 E, subseq E (R chi) & tau1 chi = \sum_(a <- E) a.
-Proof.
-set S1 := chi :: _ => Schi [iso_t1 Zt1] t1cc'.
-have freeS1: free S1.
- have [[_ nrS ccS] _ oS _ _] := cohS.
- by rewrite orthogonal_free ?(conjC_pair_orthogonal ccS).
-have subS01: {subset 'Z[chi - 0 :: chi - chi^*%CF] <= 'Z[S1]}.
- apply: zchar_trans setT _; apply/allP; rewrite subr0 /= andbT.
- by rewrite rpredB !mem_zchar ?inE ?eqxx ?orbT.
-have Zt1c: tau1 (chi - 0) \in 'Z[irr G].
- by rewrite subr0 Zt1 ?mem_zchar ?mem_head.
-have [X R_X [Y defXY]] := subcoherent_split Schi Zt1c.
-case/subcoherent_norm: (defXY); last 2 [by []].
-- by rewrite Schi rpred0 /orthogonal /= !cfdot0r eqxx.
-- by split; [apply: sub_in2 iso_t1 | apply: sub_in1 Zt1].
-move=> _ [|_ /eqP]; rewrite cfdot0l ?cfnorm_ge0 // cfnorm_eq0 => /eqP Y0.
-case=> E sER defX; exists E => //; rewrite -defX -[X]subr0 -Y0 -[chi]subr0.
-by case: defXY.
-Qed.
-
-(* A reformulation of (5.5) that is more convenient to use. *)
-Corollary mem_coherent_sum_subseq S1 chi (tau1 : {additive 'CF(L) -> 'CF(G)}) :
- cfConjC_subset S1 S -> coherent_with S1 L^# tau tau1 -> chi \in S1 ->
- exists2 E, subseq E (R chi) & tau1 chi = \sum_(a <- E) a.
-Proof.
-move=> uccS1 [Itau1 Dtau1] S1chi; have [uS1 sS1S ccS1] := uccS1.
-have S1chi_s: chi^*%CF \in S1 by apply: ccS1.
-apply: coherent_sum_subseq; first exact: sS1S.
- by apply: sub_iso_to Itau1 => //; apply: zchar_subset; apply/allP/and3P.
-apply: Dtau1; rewrite sub_aut_zchar ?zchar_onG ?mem_zchar // => phi /sS1S-Sphi.
-by apply: char_vchar; have [[->]] := cohS.
-Qed.
-
-(* A frequently used consequence of (5.5). *)
-Corollary coherent_ortho_supp S1 chi (tau1 : {additive 'CF(L) -> 'CF(G)}) :
- cfConjC_subset S1 S -> coherent_with S1 L^# tau tau1 ->
- chi \in S -> chi \notin S1 ->
- orthogonal (map tau1 S1) (R chi).
-Proof.
-move=> uccS1 cohS1 Schi S1'chi; have [uS1 sS1S ccS1] := uccS1.
-apply/orthogonalP=> _ mu /mapP[phi S1phi ->] Rmu; have Sphi := sS1S _ S1phi.
-have [e /mem_subseq Re ->] := mem_coherent_sum_subseq uccS1 cohS1 S1phi.
-rewrite cfdot_suml big1_seq // => xi {e Re}/Re Rxi.
-apply: orthogonalP xi mu Rxi Rmu; have [_ _ _ _ -> //] := cohS.
-rewrite /orthogonal /= !andbT cfdot_conjCr fmorph_eq0.
-by rewrite !(orthoPr (subset_ortho_subcoherent sS1S _ _)) ?ccS1 ?eqxx.
-Qed.
-
-(* An even more frequently used corollary of the corollary above. *)
-Corollary coherent_ortho S1 S2 (tau1 tau2 : {additive 'CF(L) -> 'CF(G)}) :
- cfConjC_subset S1 S -> coherent_with S1 L^# tau tau1 ->
- cfConjC_subset S2 S -> coherent_with S2 L^# tau tau2 ->
- {subset S2 <= [predC S1]} ->
- orthogonal (map tau1 S1) (map tau2 S2).
-Proof.
-move=> uccS1 cohS1 uccS2 cohS2 S1'2; have [_ sS2S _] := uccS2.
-apply/orthogonalP=> mu _ S1mu /mapP[phi S2phi ->].
-have [e /mem_subseq Re ->] := mem_coherent_sum_subseq uccS2 cohS2 S2phi.
-rewrite cfdot_sumr big1_seq // => xi {e Re}/Re; apply: orthogonalP mu xi S1mu.
-by apply: coherent_ortho_supp; rewrite ?sS2S //; apply: S1'2.
-Qed.
-
-(* A glueing lemma exploiting the corollary above. *)
-Lemma bridge_coherent S1 S2 (tau1 tau2 : {additive 'CF(L) -> 'CF(G)}) chi phi :
- cfConjC_subset S1 S -> coherent_with S1 L^# tau tau1 ->
- cfConjC_subset S2 S -> coherent_with S2 L^# tau tau2 ->
- {subset S2 <= [predC S1]} ->
- [/\ chi \in S1, phi \in 'Z[S2] & chi - phi \in 'CF(L, L^#)] ->
- tau (chi - phi) = tau1 chi - tau2 phi ->
- coherent (S1 ++ S2) L^# tau.
-Proof.
-move=> uccS1 cohS1 uccS2 cohS2 S1'2 [S1chi S2phi chi1_phi] tau_chi_phi.
-do [rewrite cfunD1E !cfunE subr_eq0 => /eqP] in chi1_phi.
-have [[uS1 sS1S _] [uS2 sS2S _]] := (uccS1, uccS2).
-have [[[Itau1 Ztau1] Dtau1] [[Itau2 Ztau2] Dtau2]] := (cohS1, cohS2).
-have [[N_S1 _ _] _ oS11 _ _] := subset_subcoherent uccS1.
-have [_ _ oS22 _ _] := subset_subcoherent uccS2.
-have nz_chi1: chi 1%g != 0; last move/mem_zchar in S1chi.
- by rewrite char1_eq0 ?N_S1 //; have [/memPn->] := andP oS11.
-have oS12: orthogonal S1 S2.
- apply/orthogonalP=> xi1 xi2 Sxi1 Sxi2; apply: orthoPr xi1 Sxi1.
- by rewrite subset_ortho_subcoherent ?sS2S //; apply: S1'2.
-set S3 := S1 ++ S2; pose Y := map tau1 S1 ++ map tau2 S2.
-have oS3: pairwise_orthogonal S3 by rewrite pairwise_orthogonal_cat oS11 oS22.
-have oY: pairwise_orthogonal Y.
- by rewrite pairwise_orthogonal_cat !map_pairwise_orthogonal ?coherent_ortho.
-have Z_Y: {subset Y <= 'Z[irr G]}.
- move=> psi; rewrite mem_cat.
- by case/orP=> /mapP[xi /mem_zchar] => [/Ztau1 | /Ztau2]-Zpsi ->.
-have normY: map cfnorm Y = map cfnorm (S1 ++ S2).
- rewrite !map_cat -!map_comp; congr (_ ++ _).
- by apply/eq_in_map => xi S1xi; rewrite /= Itau1 ?mem_zchar.
- by apply/eq_in_map => xi S2xi; rewrite /= Itau2 ?mem_zchar.
-have [tau3 defY ZItau3] := Zisometry_of_cfnorm oS3 oY normY Z_Y.
-have{defY} [defY1 defY2]: {in S1, tau3 =1 tau1} /\ {in S2, tau3 =1 tau2}.
- have/eqP := defY; rewrite map_cat eqseq_cat ?size_map //.
- by case/andP; split; apply/eq_in_map/eqP.
-exists tau3; split=> {ZItau3}// eta; rewrite zcharD1E.
-case/andP=> /(zchar_expansion (free_uniq (orthogonal_free oS3)))[b Zb {eta}->].
-pose bS Si := \sum_(xi <- Si) b xi *: xi.
-have ZbS Si: bS Si \in 'Z[Si].
- by rewrite /bS big_seq rpred_sum // => eta /mem_zchar/rpredZ_Cint->.
-rewrite big_cat /= -!/(bS _) cfunE addrC addr_eq0 linearD => /eqP-bS2_1.
-transitivity (tau1 (bS S1) + tau2 (bS S2)).
- by rewrite !raddf_sum; congr (_ + _); apply/eq_big_seq=> xi Si_xi;
- rewrite !raddfZ_Cint // -(defY1, defY2).
-have Z_S1_1 psi: psi \in 'Z[S1] -> psi 1%g \in Cint.
- by move/zchar_sub_irr=> Zpsi; apply/Cint_vchar1/Zpsi => ? /N_S1/char_vchar.
-apply/(scalerI nz_chi1)/(addIr (- bS S1 1%g *: tau (chi - phi))).
-rewrite [in LHS]tau_chi_phi !scalerDr -!raddfZ_Cint ?rpredN ?Z_S1_1 //=.
-rewrite addrACA -!raddfD -raddfB !scalerDr !scaleNr scalerN !opprK.
-rewrite Dtau2 ?Dtau1 ?zcharD1E ?cfunE; first by rewrite -raddfD addrACA.
- by rewrite mulrC subrr rpredB ?rpredZ_Cint ?Z_S1_1 /=.
-by rewrite mulrC bS2_1 -chi1_phi mulNr addNr rpredD ?rpredZ_Cint ?Z_S1_1 /=.
-Qed.
-
-(* This is essentially Peterfalvi (5.6.3), which gets reused in (9.11.8). *)
-(* While the assumptions are similar to those of the pivot_coherence lemma, *)
-(* the two results are mostly independent: here S1 need not have a pivot, and *)
-(* extend_coherent_with does not apply to the base case (size S = 2) of *)
-(* pivot_coherence, which is almost as hard to prove as the general case. *)
-Lemma extend_coherent_with S1 (tau1 : {additive 'CF(L) -> 'CF(G)}) chi phi a X :
- cfConjC_subset S1 S -> coherent_with S1 L^# tau tau1 ->
- [/\ phi \in S1, chi \in S & chi \notin S1] ->
- [/\ a \in Cint, chi 1%g = a * phi 1%g & '[X, a *: tau1 phi] = 0] ->
- tau (chi - a *: phi) = X - a *: tau1 phi ->
- coherent (chi :: chi^*%CF :: S1) L^# tau.
-Proof.
-set beta := _ - _ => sS10 cohS1 [S1phi Schi S1'chi] [Za chi1 oXaphi] tau_beta.
-have [[uS1 sS1S ccS1] [[Itau1 Ztau1] _]] := (sS10, cohS1).
-have [[N_S nrS ccS] ZItau _ R_P _] := cohS; have [Itau Ztau] := ZItau.
-have [Sphi [ZR o1R sumR]] := (sS1S _ S1phi, R_P _ Schi).
-have Zbeta: beta \in 'Z[S, L^#].
- by rewrite zcharD1E !cfunE -chi1 subrr rpredB ?scale_zchar ?mem_zchar /=.
-have o_aphi_R: orthogonal (a *: tau1 phi) (R chi).
- have /orthogonalP oS1R := coherent_ortho_supp sS10 cohS1 Schi S1'chi.
- by apply/orthoPl=> xi Rxi; rewrite cfdotZl oS1R ?map_f ?mulr0.
-have /orthoPl o_chi_S1: orthogonal chi S1.
- by rewrite orthogonal_sym subset_ortho_subcoherent.
-have Zdchi: chi - chi^*%CF \in 'Z[S, L^#].
- by rewrite sub_aut_zchar ?zchar_onG ?mem_zchar ?ccS // => xi /N_S/char_vchar.
-have [||_] := subcoherent_norm _ _ (erefl _) (And3 tau_beta oXaphi o_aphi_R).
-- rewrite Schi rpredZ_Cint ?char_vchar ?N_S /orthogonal //= !cfdotZr.
- by rewrite cfdot_conjCl !o_chi_S1 ?ccS1 // conjC0 !mulr0 !eqxx.
-- apply: sub_iso_to ZItau; [apply: zchar_trans_on; apply/allP | exact: zcharW].
- by rewrite /= Zbeta Zdchi.
-case=> [|nX _ [e Re defX]]; first by rewrite !cfnormZ Itau1 ?mem_zchar.
-have uR: uniq (R chi) by have [] := orthonormalP o1R.
-have{uR} De: e = filter (mem e) (R chi) by apply/subseq_uniqP.
-pose ec := filter [predC e] (R chi); pose Xc := - \sum_(xi <- ec) xi.
-have defR: perm_eq (e ++ ec) (R chi) by rewrite De perm_filterC.
-pose S2 := chi :: chi^*%CF; pose X2 := X :: Xc.
-have{nrS} uS2: uniq S2 by rewrite /= andbT inE eq_sym (hasPn nrS).
-have sS20: cfConjC_subset S2 S.
- by split=> //; apply/allP; rewrite /= ?cfConjCK ?inE ?eqxx ?orbT // ccS Schi.
-have oS2: pairwise_orthogonal S2 by have [] := subset_subcoherent sS20.
-have nz_chi: chi != 0 by rewrite eq_sym; have [/norP[]] := andP oS2.
-have o_chi_chic: '[chi, chi^*] = 0 by have [_ /andP[/andP[/eqP]]] := and3P oS2.
-have def_XXc: X - Xc = tau (chi - chi^*%CF).
- by rewrite opprK defX -big_cat sumR; apply: eq_big_perm.
-have oXXc: '[X, Xc] = 0.
- have /span_orthogonal o_e_ec: orthogonal e ec.
- by move: o1R; rewrite -(eq_orthonormal defR) orthonormal_cat => /and3P[].
- by rewrite defX /Xc !big_seq o_e_ec ?rpredN ?rpred_sum // => xi /memv_span.
-have{o_chi_chic} nXc: '[Xc] = '[chi^*].
- by apply: (addrI '[X]); rewrite -cfnormBd // nX def_XXc Itau // cfnormBd.
-have{oXXc} oX2: pairwise_orthogonal X2.
- rewrite /pairwise_orthogonal /= oXXc eqxx !inE !(eq_sym 0) -!cfnorm_eq0.
- by rewrite nX nXc cfnorm_conjC cfnorm_eq0 orbb nz_chi.
-have{nX nXc} nX2: map cfnorm X2 = map cfnorm S2 by congr [:: _; _].
-have [|tau2 [tau2X tau2Xc] Itau2] := Zisometry_of_cfnorm oS2 oX2 nX2.
- apply/allP; rewrite /= defX De rpredN !big_seq.
- by rewrite !rpred_sum // => xi; rewrite mem_filter => /andP[_ /ZR].
-have{Itau2} cohS2: coherent_with S2 L^# tau tau2.
- split=> // psi; rewrite zcharD1E => /andP[/zchar_expansion[//|z Zz ->]].
- rewrite big_cons big_seq1 !cfunE conj_Cnat ?Cnat_char1 ?N_S // addrC addr_eq0.
- rewrite -mulNr (inj_eq (mulIf _)) ?char1_eq0 ?N_S // => /eqP->.
- by rewrite scaleNr -scalerBr !raddfZ_Cint // raddfB /= tau2X tau2Xc -def_XXc.
-have: tau beta = tau2 chi - tau1 (a *: phi) by rewrite tau2X raddfZ_Cint.
-apply: (bridge_coherent sS20 cohS2 sS10 cohS1) => //.
- by apply/hasPn; rewrite has_sym !negb_or S1'chi (contra (ccS1 _)) ?cfConjCK.
-by rewrite mem_head (zchar_on Zbeta) rpredZ_Cint ?mem_zchar.
-Qed.
-
-(* This is Peterfalvi (5.6): Feit's result that a coherent set can always be *)
-(* extended by a character whose degree is below a certain threshold. *)
-Lemma extend_coherent S1 xi1 chi :
- cfConjC_subset S1 S -> xi1 \in S1 -> chi \in S -> chi \notin S1 ->
- [/\ (*a*) coherent S1 L^# tau,
- (*b*) (xi1 1%g %| chi 1%g)%C
- & (*c*) 2%:R * chi 1%g * xi1 1%g < \sum_(xi <- S1) xi 1%g ^+ 2 / '[xi]] ->
- coherent (chi :: chi^*%CF :: S1) L^# tau.
-Proof.
-move=> ccsS1S S1xi1 Schi notS1chi [[tau1 cohS1] xi1_dv_chi1 ub_chi1].
-have [[uS1 sS1S ccS1] [[Itau1 Ztau1] Dtau1]] := (ccsS1S, cohS1).
-have{xi1_dv_chi1} [a Za chi1] := dvdCP _ _ xi1_dv_chi1.
-have [[N_S nrS ccS] ZItau oS R_P oR] := cohS; have [Itau Ztau] := ZItau.
-have [Sxi1 [ZRchi o1Rchi sumRchi]] := (sS1S _ S1xi1, R_P _ Schi).
-have ocS1 xi: xi \in S1 -> '[chi, xi] = 0.
- by apply: orthoPl; rewrite orthogonal_sym subset_ortho_subcoherent.
-have /andP[/memPn/=nzS _] := oS; have [Nchi nz_chi] := (N_S _ Schi, nzS _ Schi).
-have oS1: pairwise_orthogonal S1 by apply: sub_pairwise_orthogonal oS.
-have [freeS freeS1] := (orthogonal_free oS, orthogonal_free oS1).
-have nz_nS1 xi: xi \in S1 -> '[xi] != 0 by rewrite cfnorm_eq0 => /sS1S/nzS.
-have nz_xi11: xi1 1%g != 0 by rewrite char1_eq0 ?N_S ?nzS.
-have inj_tau1: {in 'Z[S1] &, injective tau1} := Zisometry_inj Itau1.
-have Z_S1: {subset S1 <= 'Z[S1]} by move=> xi /mem_zchar->.
-have inj_tau1_S1: {in S1 &, injective tau1} := sub_in2 Z_S1 inj_tau1.
-pose a_ t1xi := S1`_(index t1xi (map tau1 S1)) 1%g / xi1 1%g / '[t1xi].
-have a_E xi: xi \in S1 -> a_ (tau1 xi) = xi 1%g / xi1 1%g / '[xi].
- by move=> S1xi; rewrite /a_ nth_index_map // Itau1 ?Z_S1.
-have a_xi1 : a_ (tau1 xi1) = '[xi1]^-1 by rewrite a_E // -mulrA mulVKf //.
-have Zachi: chi - a *: xi1 \in 'Z[S, L^#].
- by rewrite zcharD1E !cfunE -chi1 subrr rpredB ?scale_zchar ?mem_zchar /=.
-have Ztau_achi := zcharW (Ztau _ Zachi).
-have [X R_X [Y defXY]] := subcoherent_split Schi Ztau_achi.
-have [eqXY oXY oYRchi] := defXY; pose X1 := map tau1 (in_tuple S1).
-suffices defY: Y = a *: tau1 xi1.
- by move: eqXY; rewrite defY; apply: extend_coherent_with; rewrite -?defY.
-have oX1: pairwise_orthogonal X1 by apply: map_pairwise_orthogonal.
-have N_S1_1 xi: xi \in S1 -> xi 1%g \in Cnat by move/sS1S/N_S/Cnat_char1.
-have oRchiX1 psi: psi \in 'Z[R chi] -> orthogonal psi X1.
- move/zchar_span=> Rpsi; apply/orthoPl=> chi2 /memv_span.
- by apply: span_orthogonal Rpsi; rewrite orthogonal_sym coherent_ortho_supp.
-have [lam Zlam [Z oZS1 defY]]:
- exists2 lam, lam \in Cint & exists2 Z : 'CF(G), orthogonal Z (map tau1 S1) &
- Y = a *: tau1 xi1 - lam *: (\sum_(xi <- X1) a_ xi *: xi) + Z.
-- pose lam := a * '[xi1] - '[Y, tau1 xi1]; exists lam.
- rewrite rpredD ?mulr_natl ?rpredN //.
- by rewrite rpredM // CintE Cnat_cfdot_char ?N_S.
- rewrite Cint_cfdot_vchar ?Ztau1 ?Z_S1 // -(subrK X Y) -opprB -eqXY addrC.
- by rewrite rpredB // (zchar_trans ZRchi).
- set Z' := _ - _; exists (Y - Z'); last by rewrite addrC subrK.
- have oXtau1 xi: xi \in S1 -> '[Y, tau1 xi] = - '[X - Y, tau1 xi].
- move=> S1xi; rewrite cfdotBl opprB.
- by rewrite (orthogonalP (oRchiX1 X R_X) X) ?subr0 ?mem_head ?map_f.
- apply/orthogonalP=> _ _ /predU1P[-> | //] /mapP[xi S1xi ->].
- rewrite !cfdotBl !cfdotZl Itau1 ?mem_zchar //.
- rewrite cfproj_sum_orthogonal ?map_f // a_E // Itau1 ?Z_S1 //.
- apply: (mulIf nz_xi11); rewrite divfK ?nz_nS1 // 2!mulrBl mulrA divfK //.
- rewrite mul0r mulrBl opprB -addrA addrCA addrC !addrA !oXtau1 // !mulNr.
- rewrite -(conj_Cnat (N_S1_1 _ S1xi)) -(conj_Cnat (N_S1_1 _ S1xi1)).
- rewrite opprK [- _ + _]addrC -!(mulrC _^*) -!cfdotZr -cfdotBr.
- rewrite -!raddfZ_Cnat ?N_S1_1 // -raddfB; set beta : 'CF(L) := _ - _.
- have Zbeta: beta \in 'Z[S1, L^#].
- rewrite zcharD1E !cfunE mulrC subrr eqxx.
- by rewrite rpredB ?rpredZ_Cint ?Z_S1 // CintE N_S1_1.
- rewrite -eqXY Dtau1 // Itau // ?(zchar_subset sS1S) //.
- rewrite cfdotBl !cfdotBr !cfdotZr !ocS1 // !mulr0 subrr add0r !cfdotZl.
- by rewrite opprB addrAC subrK subrr.
-have [||leXchi _] := subcoherent_norm _ _ (erefl _) defXY.
-- rewrite Schi scale_zchar ?char_vchar ?N_S /orthogonal //= !cfdotZr ocS1 //.
- by rewrite -[xi1]cfConjCK cfdot_conjC ocS1 ?ccS1 // conjC0 mulr0 eqxx.
-- apply: sub_iso_to ZItau; [apply: zchar_trans_on; apply/allP | exact: zcharW].
- rewrite /= Zachi sub_aut_zchar ?zchar_onG ?mem_zchar ?ccS //.
- by move=> xi /N_S/char_vchar.
-have normXY: '[X] + '[Y] = '[chi] + '[a *: xi1].
- by rewrite -!cfnormBd // ?cfdotZr ?ocS1 ?mulr0 // -eqXY Itau.
-have{leXchi normXY}: '[Y] <= a ^+ 2 * '[xi1].
- by rewrite -(ler_add2l '[X]) normXY cfnormZ Cint_normK // ler_add2r.
-rewrite {}defY cfnormDd; last first.
- rewrite cfdotC (span_orthogonal oZS1) ?rmorph0 ?memv_span1 //.
- rewrite big_seq memvB ?memvZ ?memv_suml ?memv_span ?map_f //.
- by move=> theta S1theta; rewrite memvZ ?memv_span.
-rewrite -cfnormN opprB cfnormB !cfnormZ !Cint_normK // addrAC ler_subl_addl.
-rewrite cfdotZl cfdotZr cfnorm_sum_orthogonal ?cfproj_sum_orthogonal ?map_f //.
-rewrite a_xi1 Itau1 ?Z_S1 // addrAC ler_add2r !(divfK, mulrA) ?nz_nS1 //.
-rewrite !conj_Cint ?rpredM // => /ler_gtF-lb_2_lam_a.
-suffices lam0: lam = 0; last apply: contraFeq lb_2_lam_a => nz_lam.
- suffices ->: Z = 0 by rewrite lam0 scale0r subrK.
- by apply: contraFeq lb_2_lam_a; rewrite -cfnorm_gt0 lam0 expr0n !mul0r !add0r.
-rewrite ltr_paddr ?cfnorm_ge0 // -mulr2n -mulr_natl mulrCA.
-have xi11_gt0: xi1 1%g > 0 by rewrite char1_gt0 ?N_S ?sS1S -?cfnorm_eq0 ?nz_nS1.
-have a_gt0: a > 0 by rewrite -(ltr_pmul2r xi11_gt0) mul0r -chi1 char1_gt0.
-apply: ler_lt_trans (_ : lam ^+ 2 * (2%:R * a) < _).
- by rewrite ler_pmul2r ?mulr_gt0 ?ltr0n ?Cint_ler_sqr.
-rewrite ltr_pmul2l ?(ltr_le_trans ltr01) ?sqr_Cint_ge1 {lam Zlam nz_lam}//.
-rewrite -(ltr_pmul2r xi11_gt0) -mulrA -chi1 -(ltr_pmul2r xi11_gt0).
-congr (_ < _): ub_chi1; rewrite -mulrA -expr2 mulr_suml big_map.
-apply/eq_big_seq=> xi S1xi; rewrite a_E // Itau1 ?mem_zchar //.
-rewrite ger0_norm ?divr_ge0 ?cfnorm_ge0 ?char1_ge0 ?N_S ?sS1S //.
-rewrite [_ / _ / _]mulrAC [RHS]mulrAC -exprMn divfK //.
-by rewrite [RHS]mulrAC divfK ?nz_nS1 // mulrA.
-Qed.
-
-(* This is Peterfalvi (5.7). *)
-(* This is almost a superset of (1.4): we could use it to get a coherent *)
-(* isometry, which would necessarily map irreducibles to signed irreducibles. *)
-(* It would then only remain to show that the signs are chosen consistently, *)
-(* by considering the degrees of the differences. *)
-(* This result is complementary to (5.6): it follow from it when S has 4 or *)
-(* fewer characters, or reducible characters. On the contrary, (5.7) can be *)
-(* used to provide an initial set of characters with a threshold high enough *)
-(* to enable (repeated) application of (5.6), as in seqIndD_irr_coherence. *)
-Lemma uniform_degree_coherence :
- constant [seq chi 1%g | chi : 'CF(L) <- S] -> coherent S L^# tau.
-Proof.
-case defS: {1}S => /= [|chi1 S1] szS; first by rewrite defS; apply nil_coherent.
-have{szS} unifS xi: xi \in S -> xi 1%g = chi1 1%g.
- by rewrite defS => /predU1P[-> // | S'xi]; apply/eqP/(allP szS)/map_f.
-have{S1 defS} Schi1: chi1 \in S by rewrite defS mem_head.
-have [[N_S nrS ccS] IZtau oS R_P oR] := cohS; have [Itau Ztau] := IZtau.
-have Zd: {in S &, forall xi1 xi2, xi1 - xi2 \in 'Z[S, L^#]}.
- move=> xi1 xi2 Sxi1 Sxi2 /=.
- by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE !unifS ?subrr.
-pose chi2 := chi1^*%CF; have Schi2: chi2 \in S by rewrite ccS.
-have ch1'2: chi2 != chi1 by apply/(hasPn nrS).
-have [_ oSS] := pairwise_orthogonalP oS.
-pose S1 xi := [predD1 S & xi]; pose S2 xi := [predD1 (S1 xi) & xi^*%CF].
-have{oR} oR xi1 xi2: xi1 \in S -> xi2 \in S2 xi1 -> orthogonal (R xi1) (R xi2).
- move=> Sxi1 /and3P[/= xi1J'2 xi1'2 Sxi2].
- by rewrite orthogonal_sym oR // /orthogonal /= !oSS ?eqxx // ccS.
-have oSc xi: xi \in S -> '[xi, xi^*] = 0.
- by move=> Sxi; rewrite oSS ?ccS // eq_sym (hasPn nrS).
-pose D xi := tau (chi1 - xi).
-have Z_D xi: xi \in S -> D xi \in 'Z[irr G] by move/(Zd _ _ Schi1)/Ztau/zcharW.
-have /CnatP[N defN]: '[chi1] \in Cnat by rewrite Cnat_cfdot_char ?N_S.
-have dotD: {in S1 chi1 &, forall xi1 xi2, '[D xi1, D xi2] = N%:R + '[xi1, xi2]}.
- move=> xi1 xi2 /andP[ch1'xi1 Sxi1] /andP[chi1'xi2 Sxi2].
- rewrite Itau ?Zd // cfdotBl !cfdotBr defN.
- by rewrite 2?oSS // 1?eq_sym // opprB !subr0.
-have /R_P[ZRchi oRchi defRchi] := Schi1.
-have szRchi: size (R chi1) = (N + N)%N.
- apply: (can_inj natCK); rewrite -cfnorm_orthonormal // -defRchi.
- by rewrite dotD ?inE ?ccS ?(hasPn nrS) // cfnorm_conjC defN -natrD.
-pose subRchi1 X := exists2 E, subseq E (R chi1) & X = \sum_(a <- E) a.
-pose Xspec X := [/\ X \in 'Z[R chi1], '[X] = N%:R & subRchi1 X].
-pose Xi_spec (X : 'CF(G)) xi := X - D xi \in 'Z[R xi] /\ '[X, D xi] = N%:R.
-have haveX xi: xi \in S2 chi1 -> exists2 X, Xspec X & Xi_spec X xi.
- move=> S2xi; have /and3P[/= chi2'xi ch1'xi Sxi] := S2xi.
- have [neq_xi' Sxi'] := (hasPn nrS xi Sxi, ccS xi Sxi).
- have [X RchiX [Y1 defXY1]] := subcoherent_split Schi1 (Z_D _ Sxi).
- have [[eqXY1 oXY1 oY1chi] sRchiX] := (defXY1, zchar_span RchiX).
- have Z_Y1: Y1 \in 'Z[irr G].
- by rewrite -rpredN -(rpredDl _ (zchar_trans ZRchi RchiX)) -eqXY1 Z_D.
- have [X1 RxiX1 [Y defX1Y]] := subcoherent_split Sxi Z_Y1.
- have [[eqX1Y oX1Y oYxi] sRxiX1] := (defX1Y, zchar_span RxiX1).
- pose Y2 : 'CF(G) := X + Y; pose D2 : 'CF(G) := tau (xi - chi1).
- have oY2Rxi: orthogonal Y2 (R xi).
- apply/orthoPl=> phi Rxi_phi; rewrite cfdotDl (orthoPl oYxi) // addr0.
- by rewrite (span_orthogonal (oR chi1 xi _ _)) // memv_span.
- have{oY2Rxi} defX1Y2: [/\ D2 = X1 - Y2, '[X1, Y2] = 0 & orthogonal Y2 (R xi)].
- rewrite -opprB -addrA -opprB -eqX1Y -eqXY1 -linearN opprB cfdotC.
- by rewrite (span_orthogonal oY2Rxi) ?conjC0 ?memv_span1 ?(zchar_span RxiX1).
- have [||minX eqX1] := subcoherent_norm _ _ (erefl _) defXY1.
- - by rewrite char_vchar ?N_S /orthogonal //= !oSS ?eqxx // eq_sym.
- - apply: sub_iso_to IZtau; last exact: zcharW.
- by apply: zchar_trans_on; apply/allP; rewrite /= !Zd.
- have [||minX1 _]:= subcoherent_norm _ _ (erefl _) defX1Y2.
- - rewrite char_vchar ?N_S /orthogonal //= !oSS ?eqxx // inv_eq //.
- exact: cfConjCK.
- - apply: sub_iso_to IZtau; last exact: zcharW.
- by apply: zchar_trans_on; apply/allP; rewrite /= !Zd.
- rewrite eqX1Y cfnormBd // defN in eqX1.
- have{eqX1} [|nX n_xi defX] := eqX1; first by rewrite ler_paddr ?cfnorm_ge0.
- exists X => //; split; last by rewrite eqXY1 cfdotBr oXY1 subr0.
- suffices Y0: Y = 0 by rewrite eqXY1 eqX1Y Y0 subr0 opprB addrC subrK.
- apply/eqP; rewrite -cfnorm_eq0 lerif_le ?cfnorm_ge0 //.
- by rewrite -(ler_add2l '[X1]) addr0 n_xi.
-pose XDspec X := {in S2 chi1, forall xi, '[X, D xi] = N%:R}.
-have [X [RchiX nX defX] XD_N]: exists2 X, Xspec X & XDspec X.
- have [sSchi | /allPn[xi1 Sxi1]] := altP (@allP _ (pred2 chi1 chi2) S).
- pose E := take N (R chi1).
- exists (\sum_(a <- E) a) => [|xi]; last by case/and3P=> ? ? /sSchi/norP[].
- have defE: E ++ drop N (R chi1) = R chi1 by rewrite cat_take_drop.
- have sER: subseq E (R chi1) by rewrite -defE prefix_subseq.
- split; last by [exists E]; move/mem_subseq in sER.
- by rewrite big_seq rpred_sum // => a Ea; rewrite mem_zchar ?sER.
- rewrite cfnorm_orthonormal ?size_takel ?szRchi ?leq_addl //.
- by have:= oRchi; rewrite -defE orthonormal_cat => /andP[].
- case/norP=> chi1'xi1 chi2'xi1'; have S2xi1: xi1 \in S2 chi1 by apply/and3P.
- pose xi2 := xi1^*%CF; have /haveX[X [RchiX nX defX] [Rxi1X1 XD_N]] := S2xi1.
- exists X => // xi S2xi; have [chi1'xi chi2'xi /= Sxi] := and3P S2xi.
- have /R_P[_ _ defRxi1] := Sxi1; have [-> // | xi1'xi] := eqVneq xi xi1.
- have [sRchiX sRxi1X1] := (zchar_span RchiX, zchar_span Rxi1X1).
- have [-> | xi2'xi] := eqVneq xi xi2.
- rewrite /D -[chi1](subrK xi1) -addrA linearD cfdotDr XD_N defRxi1 big_seq.
- rewrite (span_orthogonal (oR chi1 xi1 _ _)) ?addr0 ?rpred_sum //.
- exact/memv_span.
- have /haveX[X' [RchiX' nX' _] [Rxi3X' X'D_N]] := S2xi.
- have [sRchiX' sRxi1X'] := (zchar_span RchiX', zchar_span Rxi3X').
- suffices: '[X - X'] == 0 by rewrite cfnorm_eq0 subr_eq0 => /eqP->.
- have ZXX': '[X, X'] \in Cint by rewrite Cint_cfdot_vchar ?(zchar_trans ZRchi).
- rewrite cfnormB subr_eq0 nX nX' aut_Cint {ZXX'}//; apply/eqP/esym.
- congr (_ *+ 2); rewrite -(addNKr (X - D xi1) X) cfdotDl cfdotC.
- rewrite (span_orthogonal (oR chi1 xi1 _ _)) // conjC0.
- rewrite -(subrK (D xi) X') cfdotDr cfdotDl cfdotNl opprB subrK.
- rewrite (span_orthogonal (oR xi1 xi _ _)) //; last exact/and3P.
- rewrite (span_orthogonal (oR chi1 xi _ _)) // oppr0 !add0r.
- by rewrite dotD ?oSS ?addr0 1?eq_sym //; apply/andP.
-have{RchiX} ZX: X \in 'Z[irr G] := zchar_trans ZRchi RchiX.
-apply: (pivot_coherence cohS Schi1 ZX); rewrite defN //.
-move=> xi /andP[chi1'xi Sxi]; exists 1; first by rewrite rpred1 mul1r unifS.
-rewrite scale1r mulN1r -conjC_nat -opprB raddfN cfdotNl cfdotC; congr (- _^*).
-have [-> /= | chi2'xi] := eqVneq xi chi2; last exact/XD_N/and3P.
-have{defX}[E ssER defX] := defX; pose Ec := filter [predC E] (R chi1).
-have eqRchi: perm_eq (R chi1) (E ++ Ec).
- rewrite -(perm_filterC (mem E)) -(subseq_uniqP _ _) //.
- exact/free_uniq/orthonormal_free.
-have /and3P[oE _ oEEc]: [&& orthonormal E, orthonormal Ec & orthogonal E Ec].
- by rewrite (eq_orthonormal eqRchi) orthonormal_cat in oRchi.
-rewrite defRchi (eq_big_perm _ eqRchi) big_cat -defX cfdotDr nX defX !big_seq.
-by rewrite (span_orthogonal oEEc) ?addr0 ?rpred_sum //; apply: memv_span.
-Qed.
-
-End SubCoherentProperties.
-
-(* A corollary of Peterfalvi (5.7) used (sometimes implicitly!) in the proof *)
-(* of lemmas (11.9), (12.4) and (12.5). *)
-Lemma pair_degree_coherence L G S (tau : {linear _ -> 'CF(gval G)}) R :
- subcoherent S tau R ->
- {in S &, forall phi1 phi2 : 'CF(gval L), phi1 1%g == phi2 1%g ->
- exists S1 : seq 'CF(L),
- [/\ phi1 \in S1, phi2 \in S1, cfConjC_subset S1 S & coherent S1 L^# tau]}.
-Proof.
-move=> scohS phi1 phi2 Sphi1 Sphi2 /= eq_phi12_1.
-have [[N_S _ ccS] _ _ _ _] := scohS.
-pose S1 := undup (phi1 :: phi1^* :: phi2 :: phi2^*)%CF.
-have sS1S: cfConjC_subset S1 S.
- split=> [|chi|chi]; rewrite ?undup_uniq //= !mem_undup; move: chi; apply/allP.
- by rewrite /= !ccS ?Sphi1 ?Sphi2.
- by rewrite /= !inE !cfConjCK !eqxx !orbT.
-exists S1; rewrite !mem_undup !inE !eqxx !orbT; split=> //.
-apply: uniform_degree_coherence (subset_subcoherent scohS sS1S) _.
-apply/(@all_pred1_constant _ (phi2 1%g))/allP=> _ /mapP[chi S1chi ->] /=.
-rewrite mem_undup in S1chi; move: chi S1chi; apply/allP.
-by rewrite /= !cfAut_char1 ?N_S // eqxx eq_phi12_1.
-Qed.
-
-(* This is Peterfalvi (5.8). *)
-Lemma coherent_prDade_TIred (G H L K W W1 W2 : {group gT}) S A A0
- k (tau1 : {additive 'CF(L) -> 'CF(G)})
- (defW : W1 \x W2 = W) (ddA : prime_Dade_hypothesis G L K H A A0 defW)
- (sigma := cyclicTIiso ddA)
- (eta_ := fun i j => sigma (cyclicTIirr defW i j))
- (mu := primeTIred ddA) (dk := primeTIsign ddA k) (tau := Dade ddA) :
- cfConjC_subset S (seqIndD K L H 1) ->
- [/\ ~~ has cfReal S, has (mem (irr L)) S & mu k \in S] ->
- coherent_with S L^# tau tau1 ->
- let j := conjC_Iirr k in
- tau1 (mu k) = dk *: (\sum_i eta_ i k)
- \/ tau1 (mu k) = - dk *: (\sum_i eta_ i j)
- /\ (forall ell, mu ell \in S -> mu ell 1%g = mu k 1%g -> ell = k \/ ell = j).
-Proof.
-set phi := tau1 (mu k) => uccS [nrS /hasP[zeta Szeta irr_zeta] Sk] cohS j.
-pose sum_eta a ell := \sum_i a i ell *: eta_ i ell.
-have [R [subcohS oS1sig defR]] := prDade_subcoherent ddA uccS nrS.
-have [[charS _ ccS] _ /orthogonal_free freeS Rok _] := subcohS.
-have [[Itau1 _] Dtau1] := cohS.
-have natS1 xi: xi \in S -> xi 1%g \in Cnat by move/charS/Cnat_char1.
-have k'j: j != k by rewrite -(inj_eq (prTIred_inj ddA)) prTIred_aut (hasPn nrS).
-have nzSmu l (Sl : mu l \in S): l != 0.
- apply: contraNneq (hasPn nrS _ Sl) => ->.
- by rewrite /cfReal -prTIred_aut aut_Iirr0.
-have [nzk nzj]: k != 0 /\ j != 0 by rewrite !nzSmu // /mu (prTIred_aut ddA) ccS.
-have sSS: cfConjC_subset S S by have:= free_uniq freeS; split.
-have{sSS} Dtau1S:= mem_coherent_sum_subseq subcohS sSS cohS.
-have o_sum_eta a j1 i j2: j1 != j2 -> '[sum_eta a j1, eta_ i j2] = 0.
- move/negPf=> neq_j; rewrite cfdot_suml big1 // => i1 _.
- by rewrite cfdotZl cfdot_cycTIiso neq_j andbF mulr0.
-have proj_sum_eta a i j1: '[sum_eta a j1, eta_ i j1] = a i j1.
- rewrite cfdot_suml (bigD1 i) //= cfdotZl cfdot_cycTIiso !eqxx mulr1.
- rewrite big1 ?addr0 // => i1 /negPf i'i1.
- by rewrite cfdotZl cfdot_cycTIiso i'i1 mulr0.
-have [a Dphi Da0]: exists2 a, phi = sum_eta a k + sum_eta a j
- & pred2 0 dk (a 0 k) /\ pred2 0 (- dk) (a 0 j).
-- have uRk: uniq (R (mu k)) by have [_ /orthonormal_free/free_uniq] := Rok _ Sk.
- have [E sER Dphi] := Dtau1S _ Sk; rewrite /phi Dphi (subseq_uniqP uRk sER).
- pose a i ell (alpha := dk *: eta_ i ell) :=
- if alpha \in E then dk else if - alpha \in E then - dk else 0.
- have sign_eq := inj_eq (can_inj (signrZK _)).
- have E'Nsk i: (- (dk *: eta_ i k) \in E) = false.
- apply/idP=> /(mem_subseq sER); rewrite defR -/dk -/sigma mem_cat -map_comp.
- case/orP=> /codomP[i1 /esym/eqP/idPn[]].
- by rewrite -scalerN sign_eq cycTIiso_neqN.
- by rewrite (inj_eq oppr_inj) sign_eq cycTIiso_eqE (negPf k'j) andbF.
- have E'sj i: (dk *: eta_ i j \in E) = false.
- apply/idP=> /(mem_subseq sER); rewrite defR -/dk -/sigma mem_cat -map_comp.
- case/orP=> /codomP[i1 /eqP/idPn[]].
- by rewrite sign_eq cycTIiso_eqE (negPf k'j) andbF.
- by rewrite /= -scalerN sign_eq cycTIiso_neqN.
- exists a; last first.
- by rewrite !(fun_if (pred2 _ _)) /= !eqxx !orbT E'Nsk !(if_same, E'sj).
- rewrite big_filter big_mkcond defR big_cat !big_map -/dk -/sigma /=.
- congr (_ + _); apply: eq_bigr => i _; rewrite /a -/(eta_ i _).
- by rewrite E'Nsk; case: ifP => // _; rewrite scale0r.
- by rewrite E'sj; case: ifP => _; rewrite (scaleNr, scale0r).
-pose V := cyclicTIset defW; have zetaV0: {in V, tau1 zeta =1 \0}.
- apply: (ortho_cycTIiso_vanish ddA); apply/orthoPl=> _ /mapP[ww Www ->].
- rewrite (span_orthogonal (oS1sig zeta ww _ _)) ?memv_span1 ?inE ?Szeta //.
- have [E sER ->] := Dtau1S _ Szeta; rewrite big_seq rpred_sum // => aa Raa.
- by rewrite memv_span ?(mem_subseq sER).
-pose zeta1 := zeta 1%g *: mu k - mu k 1%g *: zeta.
-have Zzeta1: zeta1 \in 'Z[S, L^#].
- rewrite zcharD1E !cfunE mulrC subrr eqxx andbT.
- by rewrite rpredB ?scale_zchar ?mem_zchar // CintE ?natS1.
-have /cfun_onP A1zeta1: zeta1 \in 'CF(L, 1%g |: A).
- rewrite memvB ?memvZ ?prDade_TIred_on //; have [_ sSS0 _] := uccS.
- have /seqIndP[kz /setIdP[kerH'kz _] Dzeta] := sSS0 _ Szeta.
- by rewrite Dzeta (prDade_Ind_irr_on ddA) //; rewrite inE in kerH'kz.
-have{A1zeta1} zeta1V0: {in V, zeta1 =1 \0}.
- move=> x Vx; rewrite /= A1zeta1 // -in_setC.
- apply: subsetP (subsetP (prDade_supp_disjoint ddA) x Vx); rewrite setCS.
- by rewrite subUset sub1G; have [/= _ _ _ [_ [_ _ /subsetD1P[->]]]] := ddA.
-have o_phi_0 i: '[phi, eta_ i 0] = 0 by rewrite Dphi cfdotDl !o_sum_eta ?addr0.
-have{o_phi_0 zeta1V0} proj_phi0 i ell: '[phi, eta_ i ell] = '[phi, eta_ 0 ell].
- rewrite -[LHS]add0r -(o_phi_0 0) -[RHS]addr0 -(o_phi_0 i).
- apply: (cycTIiso_cfdot_exchange ddA); rewrite -/V => x Vx.
- have: tau zeta1 x == 0.
- have [_ _ defA0] := prDade_def ddA; rewrite Dade_id ?zeta1V0 //.
- by rewrite defA0 inE orbC mem_class_support.
- rewrite -Dtau1 // raddfB !raddfZ_Cnat ?natS1 // !cfunE zetaV0 //.
- rewrite oppr0 mulr0 addr0 mulf_eq0 => /orP[/idPn[] | /eqP->//].
- by have /irrP[iz ->] := irr_zeta; apply: irr1_neq0.
-have Dphi_j i: '[phi, eta_ i j] = a i j.
- by rewrite Dphi cfdotDl proj_sum_eta o_sum_eta 1?eq_sym ?add0r.
-have Dphi_k i: '[phi, eta_ i k] = a i k.
- by rewrite Dphi cfdotDl proj_sum_eta o_sum_eta ?addr0.
-have Da_j i: a i j = a 0 j by rewrite -!Dphi_j.
-have{proj_phi0} Da_k i: a i k = a 0 k by rewrite -!Dphi_k.
-have oW1: #|W1| = #|Iirr W1|.
- by rewrite card_Iirr_cyclic //; have [[]] := prDade_prTI ddA.
-have{oW1}: `|a 0 j| ^+ 2 + `|a 0 k| ^+ 2 == 1.
- apply/eqP/(mulfI (neq0CG W1)); rewrite mulr1 {}[in LHS]oW1.
- transitivity '[phi]; last by rewrite Itau1 ?mem_zchar ?cfnorm_prTIred.
- rewrite {2}Dphi cfdotDr !cfdot_sumr mulrDr addrC !mulr_natl -!sumr_const.
- congr (_ + _); apply: eq_bigr => i _; rewrite cfdotZr mulrC normCK.
- by rewrite Dphi_k (Da_k i).
- by rewrite Dphi_j (Da_j i).
-have{Da0}[/pred2P[]Da0k /pred2P[]Da0j] := Da0; rewrite Da0k Da0j; last 2 first.
-- left; rewrite Dphi [sum_eta a j]big1 ?addr0 => [|i _]; last first.
- by rewrite Da_j Da0j scale0r.
- by rewrite scaler_sumr; apply: eq_bigr => i _; rewrite Da_k Da0k.
-- by rewrite normrN normr_sign expr1n (eqr_nat _ 2 1).
-- by rewrite normr0 expr0n add0r (eqr_nat _ 0 1).
-have{Dphi} Dphi: phi = - dk *: (\sum_i eta_ i j).
- rewrite Dphi [sum_eta a k]big1 ?add0r => [|i _]; last first.
- by rewrite Da_k Da0k scale0r.
- by rewrite raddf_sum; apply: eq_bigr => i _; rewrite Da_j Da0j.
-clear 1; right; split=> // l Sl deg_l; apply/pred2P.
-have [_ [tau2 Dtau2 [_ Dtau]]] := uniform_prTIred_coherent ddA nzk.
-have nz_l: l != 0 := nzSmu l Sl.
-have Tmukl: mu k - mu l \in 'Z[uniform_prTIred_seq ddA k, L^#].
- rewrite zcharD1E !cfunE deg_l subrr eqxx andbT.
- by rewrite rpredB ?mem_zchar ?image_f // !inE ?nzk ?nz_l ?deg_l eqxx.
-pose ak (_ : Iirr W1) (_ : Iirr W2) := dk.
-have: phi - tau1 (mu l) = sum_eta ak k - sum_eta ak l.
- rewrite -raddfB Dtau1; last first.
- by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE deg_l subrr.
- by rewrite -[tau _]Dtau // raddfB /= !Dtau2 2!raddf_sum.
-have [E /mem_subseq sER ->] := Dtau1S _ Sl.
-move/esym/(congr1 (cfdotr (eta_ 0 k))); apply: contra_eqT => /norP[k'l j'l] /=.
-rewrite !cfdotBl Dphi_k Da0k proj_sum_eta o_sum_eta // cfdot_suml.
-rewrite big_seq big1 ?subr0 ?signr_eq0 // => aa /sER; rewrite defR -map_comp.
-rewrite mem_cat => /orP[]/codomP[/= i ->]; rewrite -/(eta_ i _).
- by rewrite cfdotZl cfdot_cycTIiso (negPf k'l) andbF mulr0.
-rewrite cfdotNl cfdotZl cfdot_cycTIiso (inv_eq (@conjC_IirrK _ _)) -/j.
-by rewrite (negPf j'l) andbF mulr0 oppr0.
-Qed.
-
-Section DadeAut.
-
-Variables (L G : {group gT}) (A : {set gT}).
-Implicit Types K H M : {group gT}.
-Hypothesis ddA : Dade_hypothesis G L A.
-
-Local Notation tau := (Dade ddA).
-Local Notation "alpha ^\tau" := (tau alpha).
-
-Section DadeAutIrr.
-Variable u : {rmorphism algC -> algC}.
-Local Notation "alpha ^u" := (cfAut u alpha).
-
-(* This is Peterfalvi (5.9)(a), slightly reformulated to allow calS to also *)
-(* contain non-irreducible characters; for groups of odd order, the second *)
-(* assumption holds uniformly for all calS of the form seqIndD. *)
-(* We have stated the coherence assumption directly over L^#; this lets us *)
-(* drop the Z[S, A] = Z[S, L^#] assumption, and is more consistent with the *)
-(* rest of the proof. *)
-Lemma cfAut_Dade_coherent calS tau1 chi :
- coherent_with calS L^# tau tau1 ->
- (1 < #|[set i | 'chi_i \in calS]|)%N /\ cfAut_closed u calS ->
- chi \in irr L -> chi \in calS ->
- (tau1 chi)^u = tau1 (chi^u).
-Proof.
-case=> [[Itau1 Ztau1] tau1_tau] [irrS_gt1 sSuS] /irrP[i {chi}->] Schi.
-have sSZS: {subset calS <= 'Z[calS]} by move=> phi Sphi; apply: mem_zchar.
-pose mu j := 'chi_j 1%g *: 'chi_i - 'chi_i 1%g *: 'chi_j.
-have ZAmu j: 'chi_j \in calS -> mu j \in 'Z[calS, L^#].
- move=> Sxj; rewrite zcharD1E !cfunE mulrC subrr.
- by rewrite rpredB //= scale_zchar ?sSZS // ?Cint_Cnat ?Cnat_irr1.
-have Npsi j: 'chi_j \in calS -> '[tau1 'chi_j] = 1%:R.
- by move=> Sxj; rewrite Itau1 ?sSZS ?cfnorm_irr.
-have{Npsi} Dtau1 Sxj := vchar_norm1P (Ztau1 _ (sSZS _ Sxj)) (Npsi _ Sxj).
-have [e [r tau1_chi]] := Dtau1 _ Schi; set eps := (-1) ^+ e in tau1_chi.
-have{Dtau1} Dtau1 j: 'chi_j \in calS -> exists t, tau1 'chi_j = eps *: 'chi_t.
- move=> Sxj; suffices: 0 <= (eps *: tau1 'chi_j) 1%g.
- have [f [t ->]] := Dtau1 j Sxj.
- have [-> | neq_f_eps] := eqVneq f e; first by exists t.
- rewrite scalerA -signr_addb scaler_sign addbC -negb_eqb neq_f_eps.
- by rewrite cfunE oppr_ge0 ltr_geF ?irr1_gt0.
- rewrite -(pmulr_rge0 _ (irr1_gt0 i)) cfunE mulrCA.
- have: tau1 (mu j) 1%g == 0 by rewrite tau1_tau ?ZAmu ?Dade1.
- rewrite raddfB 2?raddfZ_Cnat ?Cnat_irr1 // !cfunE subr_eq0 => /eqP <-.
- by rewrite tau1_chi cfunE mulrCA signrMK mulr_ge0 ?Cnat_ge0 ?Cnat_irr1.
-have SuSirr j: 'chi_j \in calS -> 'chi_(aut_Iirr u j) \in calS.
- by rewrite aut_IirrE => /sSuS.
-have [j Sxj neq_ij]: exists2 j, 'chi_j \in calS & 'chi_i != 'chi_j.
- move: irrS_gt1; rewrite (cardsD1 i) inE Schi ltnS card_gt0 => /set0Pn[j].
- by rewrite !inE -(inj_eq irr_inj) eq_sym => /andP[]; exists j.
-have: (tau1 (mu j))^u == tau1 (mu j)^u.
- by rewrite !tau1_tau ?cfAut_zchar ?ZAmu ?Dade_aut.
-rewrite !raddfB [-%R]lock !raddfZ_Cnat ?Cnat_irr1 //= -lock -!aut_IirrE.
-have [/Dtau1[ru ->] /Dtau1[tu ->]] := (SuSirr i Schi, SuSirr j Sxj).
-have: (tau1 'chi_i)^u != (tau1 'chi_j)^u.
- apply: contraNneq neq_ij => /cfAut_inj/(isometry_raddf_inj Itau1)/eqP.
- by apply; rewrite ?sSZS //; apply: rpredB.
-have /Dtau1[t ->] := Sxj; rewrite tau1_chi !cfAutZ_Cint ?rpred_sign //.
-rewrite !scalerA -!(mulrC eps) -!scalerA -!scalerBr -!aut_IirrE.
-rewrite !(inj_eq (scalerI _)) ?signr_eq0 // (inj_eq irr_inj) => /negPf neq_urt.
-have [/CnatP[a ->] /CnatP[b xj1]] := (Cnat_irr1 i, Cnat_irr1 j).
-rewrite xj1 eq_subZnat_irr neq_urt orbF andbC => /andP[_].
-by rewrite eqn0Ngt -ltC_nat -xj1 irr1_gt0 /= => /eqP->.
-Qed.
-
-End DadeAutIrr.
-
-(* This covers all the uses of (5.9)(a) in the rest of Peterfalvi, except *)
-(* one instance in (6.8.2.1). *)
-Lemma cfConjC_Dade_coherent K H M (calS := seqIndD K L H M) tau1 chi :
- coherent_with calS L^# (Dade ddA) tau1 ->
- [/\ odd #|G|, K <| L & H \subset K] -> chi \in irr L -> chi \in calS ->
- (tau1 chi)^*%CF = tau1 chi^*%CF.
-Proof.
-move=> cohS [oddG nsKL sHK] irr_chi Schi.
-apply: (cfAut_Dade_coherent cohS) => //; split; last exact: cfAut_seqInd.
-have oddL: odd #|L| by apply: oddSg oddG; have [_] := ddA.
-exact: seqInd_nontrivial_irr Schi.
-Qed.
-
-(* This is Peterfalvi (5.9)(b). *)
-Lemma Dade_irr_sub_conjC chi (phi := chi - chi^*%CF) :
- chi \in irr L -> chi \in 'CF(L, 1%g |: A) ->
- exists t, phi^\tau = 'chi_t - ('chi_t)^*%CF.
-Proof.
-case/irrP=> i Dchi Achi; rewrite {chi}Dchi in phi Achi *.
-have [Rchi | notRchi] := eqVneq (conjC_Iirr i) i.
- by exists 0; rewrite irr0 cfConjC_cfun1 /phi -conjC_IirrE Rchi !subrr linear0.
-have Zphi: phi \in 'Z[irr L, A].
- have notA1: 1%g \notin A by have [] := ddA.
- by rewrite -(setU1K notA1) sub_conjC_vchar // zchar_split irr_vchar.
-have Zphi_tau: phi^\tau \in 'Z[irr G, G^#].
- by rewrite zchar_split Dade_cfun Dade_vchar ?Zphi.
-have norm_phi_tau : '[phi^\tau] = 2%:R.
- rewrite Dade_isometry ?(zchar_on Zphi) // cfnormB -conjC_IirrE.
- by rewrite !cfdot_irr !eqxx eq_sym (negPf notRchi) rmorph0 addr0 subr0.
-have [j [k ne_kj phi_tau]] := vchar_norm2 Zphi_tau norm_phi_tau.
-suffices def_k: conjC_Iirr j = k by exists j; rewrite -conjC_IirrE def_k.
-have/esym:= eq_subZnat_irr 1 1 k j (conjC_Iirr j) (conjC_Iirr k).
-rewrite (negPf ne_kj) orbF /= !scale1r !conjC_IirrE -rmorphB.
-rewrite -opprB -phi_tau /= -Dade_conjC // rmorphB /= cfConjCK.
-by rewrite -linearN opprB eqxx => /andP[/eqP->].
-Qed.
-
-End DadeAut.
-
-End Five.
-
-Arguments coherent_prDade_TIred
- [gT G H L K W W1 W2 S0 A A0 k tau1 defW]. \ No newline at end of file
diff --git a/mathcomp/odd_order/PFsection6.v b/mathcomp/odd_order/PFsection6.v
deleted file mode 100644
index 2add4af..0000000
--- a/mathcomp/odd_order/PFsection6.v
+++ /dev/null
@@ -1,1345 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime ssralg poly finset center.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action zmodp.
-From mathcomp
-Require Import gfunctor gproduct cyclic pgroup commutator gseries nilpotent.
-From mathcomp
-Require Import sylow abelian maximal hall frobenius.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation vector ssrnum algC algnum.
-From mathcomp
-Require Import classfun character inertia vcharacter integral_char.
-From mathcomp
-Require Import PFsection1 PFsection2 PFsection3 PFsection4 PFsection5.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 6: *)
-(* Some Coherence Theorems *)
-(* Defined here: *)
-(* odd_Frobenius_quotient K L M <-> *)
-(* L has odd order, M <| L, K with K / M nilpotent, and L / H1 is a *)
-(* Frobenius group with kernel K / H1, where H1 / M = (K / M)^(1). *)
-(* This is the statement of Peterfalvi, Hypothesis (6.4), except for *)
-(* the K <| L and subcoherence assumptions, to be required separately. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory Num.Theory.
-Local Open Scope ring_scope.
-
-(* The main section *)
-Section Six.
-
-Variables (gT : finGroupType) (G : {group gT}).
-Implicit Types H K L P M W Z : {group gT}.
-
-(* Grouping lemmas that assume Hypothesis (6.1). *)
-Section GeneralCoherence.
-
-Variables K L : {group gT}.
-Local Notation S M := (seqIndD K L K M).
-Local Notation calS := (S 1).
-
-Variables (R : 'CF(L) -> seq 'CF(G)) (tau : {linear 'CF(L) -> 'CF(G)}).
-
-(* These may need to be grouped, in order to make the proofs of 6.8, 10.10, *)
-(* and 12.6 more manageable. *)
-Hypotheses (nsKL : K <| L) (solK : solvable K).
-Hypothesis Itau : {in 'Z[calS, L^#] &, isometry tau}.
-Hypothesis scohS : subcoherent calS tau R.
-
-Let sKL : K \subset L. Proof. exact: normal_sub. Qed.
-Let nKL : L \subset 'N(K). Proof. exact: normal_norm. Qed.
-Let orthS: pairwise_orthogonal calS. Proof. by case: scohS. Qed.
-Let sSS M : {subset S M <= calS}. Proof. exact: seqInd_sub. Qed.
-Let ccS M : cfConjC_closed (S M). Proof. exact: cfAut_seqInd. Qed.
-Let uniqS M : uniq (S M). Proof. exact: seqInd_uniq. Qed.
-Let nrS : ~~ has cfReal calS. Proof. by case: scohS => [[]]. Qed.
-
-Lemma exists_linInd M :
- M \proper K -> M <| K -> exists2 phi, phi \in S M & phi 1%g = #|L : K|%:R.
-Proof.
-move=> ltMK nsMK; have [sMK nMK] := andP nsMK.
-have ntKM: (K / M)%g != 1%g by rewrite -subG1 quotient_sub1 // proper_subn.
-have [r lin_r ntr] := solvable_has_lin_char ntKM (quotient_sol M solK).
-pose i := mod_Iirr r; exists ('Ind[L] 'chi_i); last first.
- by rewrite cfInd1 ?mod_IirrE // cfMod1 lin_char1 ?mulr1.
-apply/seqIndP; exists i; rewrite // !inE subGcfker mod_IirrE ?cfker_mod //=.
-by rewrite mod_Iirr_eq0 // -irr_eq1 ntr.
-Qed.
-
-(* This is Peterfalvi (6.2). *)
-Lemma coherent_seqIndD_bound (A B C D : {group gT}) :
- [/\ A <| L, B <| L, C <| L & D <| L] ->
- (*a*) [/\ A \proper K, B \subset D, D \subset C, C \subset K
- & D / B \subset 'Z(C / B)]%g ->
- (*b*) coherent (S A) L^# tau -> \unless coherent (S B) L^# tau,
- #|K : A|%:R - 1 <= 2%:R * #|L : C|%:R * sqrtC #|C : D|%:R :> algC.
-Proof.
-move=> [nsAL nsBL nsCL nsDL] [ltAK sBD sDC sCK sDbZC] cohA.
-have sBC := subset_trans sBD sDC; have sBK := subset_trans sBC sCK.
-have [sAK nsBK] := (proper_sub ltAK, normalS sBK sKL nsBL).
-have{sBC} [nsAK nsBC] := (normalS sAK sKL nsAL, normalS sBC sCK nsBK).
-rewrite real_lerNgt ?rpredB ?ger0_real ?mulr_ge0 ?sqrtC_ge0 ?ler0n ?ler01 //.
-apply/unless_contra; rewrite negbK -(Lagrange_index sKL sCK) natrM => lb_KA.
-pose S2 : seq 'CF(L) := [::]; pose S1 := S2 ++ S A; rewrite -[S A]/S1 in cohA.
-have ccsS1S: cfConjC_subset S1 calS by apply: seqInd_conjC_subset1.
-move: {2}_.+1 (leq_addr (size S1) (size calS).+1) => n.
-elim: n => [|n IHn] in (S2) S1 ccsS1S cohA * => lb_n.
- by rewrite ltnNge uniq_leq_size // in lb_n; case: ccsS1S.
-without loss /allPn[psi /= SBpsi S1'psi]: / ~~ all (mem S1) (S B).
- by case: allP => [sAB1 _ | _]; [apply: subset_coherent cohA | apply].
-have [[_ sS1S _] Spsi] := (ccsS1S, sSS SBpsi).
-apply (IHn [:: psi, psi^* & S2]%CF); rewrite ?addnS 1?leqW {n lb_n IHn}//= -/S1.
- exact: extend_cfConjC_subset.
-have [phi SAphi phi1] := exists_linInd ltAK nsAK.
-have{SAphi} S1phi: phi \in S1 by rewrite mem_cat SAphi orbT.
-apply: (extend_coherent scohS) ccsS1S S1phi Spsi S1'psi _.
-have{SBpsi} /seqIndP[i /setDP[kBi _] {psi}->] := SBpsi; rewrite inE in kBi.
-rewrite {phi}phi1 cfInd1 // dvdC_mulr //; last by rewrite CintE Cnat_irr1.
-split; rewrite // big_cat sum_seqIndD_square // big_seq ltr_paddl //=.
- apply/sumr_ge0=> xi S2xi; rewrite divr_ge0 ?cfnorm_ge0 ?exprn_ge0 //.
- by rewrite Cnat_ge0 // (Cnat_seqInd1 (sS1S _ _)) // mem_cat S2xi.
-rewrite mulrC ltr_pmul2l ?gt0CiG //; apply: ler_lt_trans lb_KA.
-by rewrite -!mulrA !ler_wpmul2l ?ler0n // (irr1_bound_quo nsBC).
-Qed.
-
-(* This is Peterfalvi, Theorem (6.3). *)
-Theorem bounded_seqIndD_coherence M H H1 :
- [/\ M <| L, H <| L & H1 <| L] ->
- [/\ M \subset H1, H1 \subset H & H \subset K] ->
- (*a*) nilpotent (H / M) ->
- (*b*) coherent (S H1) L^# tau ->
- (*c*) (#|H : H1| > 4 * #|L : K| ^ 2 + 1)%N ->
- coherent (S M) L^# tau.
-Proof.
-move: H1 => A [nsML nsHL nsAL] [sMA sAH sHK] nilHb cohA lbHA.
-elim: {A}_.+1 {-2}A (ltnSn #|A|) => // m IHm A leAm in nsAL sMA sAH cohA lbHA *.
-have [/group_inj-> // | ltMA] := eqVproper sMA; have [sAL nAL] := andP nsAL.
-have{ltMA} [B maxB sMB]: {B : {group gT} | maxnormal B A L & M \subset B}.
- by apply: maxgroup_exists; rewrite ltMA normal_norm.
-have /andP[ltBA nBL] := maxgroupp maxB; have [sBA not_sAB] := andP ltBA.
-have [sBH sBL] := (subset_trans sBA sAH, subset_trans sBA sAL).
-have nsBL: B <| L by apply/andP.
-suffices{m IHm leAm} cohB: coherent (S B) L^# tau.
- apply: IHm cohB _ => //; first exact: leq_trans (proper_card ltBA) _.
- by rewrite (leq_trans lbHA) // dvdn_leq // indexgS.
-have /andP[sHL nHL] := nsHL.
-have sAbZH: (A / B \subset 'Z(H / B))%g.
- have nBA := subset_trans sAL nBL; have nsBA : B <| A by apply/andP.
- set Zbar := 'Z(H / B); set Abar := (A / B)%g; pose Lbar := (L / B)%g.
- have nZHbar: Lbar \subset 'N(Zbar) by rewrite gFnorm_trans ?quotient_norms.
- have /mingroupP[/andP[ntAbar nALbar] minBbar]: minnormal Abar Lbar.
- apply/mingroupP; split=> [|Dbar /andP[ntDbar nDLbar] sDAbar].
- by rewrite -subG1 quotient_sub1 // not_sAB quotient_norms.
- have: Dbar <| Lbar by rewrite /normal (subset_trans sDAbar) ?quotientS.
- case/(inv_quotientN nsBL)=> D defDbar sBD /andP[sDL nDL].
- apply: contraNeq ntDbar => neqDAbar; rewrite defDbar quotientS1 //.
- have [_ /(_ D) {1}<- //] := maxgroupP maxB.
- rewrite -(quotient_proper (normalS sBD sDL nsBL)) // -defDbar.
- by rewrite properEneq sDAbar neqDAbar.
- apply/setIidPl/minBbar; rewrite ?subsetIl {minBbar}//= andbC -/Abar -/Zbar.
- rewrite normsI ?meet_center_nil ?quotient_normal ?(normalS sAH sHL) //=.
- suffices /homgP[f /= <-]: (H / B)%g \homg (H / M)%g by rewrite morphim_nil.
- by apply: homg_quotientS; rewrite ?(subset_trans sHL) ?normal_norm.
-have ltAH: A \proper H.
- by rewrite properEneq sAH (contraTneq _ lbHA) // => ->; rewrite indexgg addn1.
-set x : algC := sqrtC #|H : A|%:R.
-have [nz_x x_gt0]: x != 0 /\ 0 < x by rewrite gtr_eqF sqrtC_gt0 gt0CiG.
-without loss{cohA} ubKA: / #|K : A|%:R - 1 <= 2%:R * #|L : H|%:R * x.
- have [sAK ltAK] := (subset_trans sAH sHK, proper_sub_trans ltAH sHK).
- exact: coherent_seqIndD_bound id.
-suffices{lbHA}: (x - x^-1) ^+ 2 <= (2 * #|L : K|)%:R ^+ 2.
- rewrite ltr_geF // sqrrB divff // sqrtCK ltr_spaddr ?exprn_gt0 ?invr_gt0 //.
- by rewrite ler_subr_addr -natrX -natrD ler_nat expnMn addnS lbHA.
-rewrite ler_pexpn2r ?unfold_in /= ?ler0n //; last first.
- by rewrite subr_ge0 -div1r ler_pdivr_mulr // -expr2 sqrtCK ler1n.
-rewrite -(ler_pmul2l x_gt0) -(ler_pmul2l (gt0CiG K H)) 2!mulrBr -expr2 sqrtCK.
-rewrite !mulrA mulfK // mulrAC natrM mulrCA -2!natrM [in _ * x]mulnC.
-by rewrite !Lagrange_index // (ler_trans _ ubKA) // ler_add2l ler_opp2 ler1n.
-Qed.
-
-(* This is the statement of Peterfalvi, Hypothesis (6.4). *)
-Definition odd_Frobenius_quotient M (H1 := K^`(1) <*> M) :=
- [/\ (*a*) odd #|L|,
- (*b*) [/\ M <| L, M \subset K & nilpotent (K / M)]
- & (*c*) [Frobenius L / H1 with kernel K / H1] ]%g.
-
-(* This is Peterfalvi (6.5). *)
-Lemma non_coherent_chief M (H1 := (K^`(1) <*> M)%G) :
- odd_Frobenius_quotient M -> \unless coherent (S M) L^# tau,
- [/\ (*a*) chief_factor L H1 K /\ (#|K : H1| <= 4 * #|L : K| ^ 2 + 1)%N
- & (*b*) exists2 p : nat, p.-group (K / M)%g /\ ~~ abelian (K / M)
- & (*c*) ~~ (#|L : K| %| p - 1)].
-Proof.
-case=> oddL [nsML sMK nilKM]; rewrite /= -(erefl (gval H1)) => frobLb.
-set e := #|L : K|; have odd_e: odd e := dvdn_odd (dvdn_indexg L K) oddL.
-have{odd_e} mod1e_lb m: odd m -> m == 1 %[mod e] -> (m > 1 -> 2 * e + 1 <= m)%N.
- move=> odd_m e_dv_m1 m_gt1; rewrite eqn_mod_dvd 1?ltnW // subn1 in e_dv_m1.
- by rewrite mul2n addn1 dvdn_double_ltn.
-have nsH1L: H1 <| L by rewrite normalY // gFnormal_trans.
-have nsH1K: H1 <| K by rewrite (normalS _ sKL nsH1L) // join_subG der_sub.
-have [sH1K nH1K] := andP nsH1K; have sMH1: M \subset H1 by apply: joing_subr.
-have cohH1: coherent (S H1) L^# tau.
- apply: uniform_degree_coherence (subset_subcoherent scohS _) _ => //.
- apply/(@all_pred1_constant _ e%:R)/allP=> _ /mapP[chi Schi ->] /=.
- have [i /setIdP[_]] := seqIndP Schi; rewrite inE join_subG -lin_irr_der1.
- by case/andP=> lin_chi _ ->; rewrite cfInd1 ?lin_char1 ?mulr1.
-apply/unlessP; have [/val_inj-> | ltMH1] := eqVproper sMH1; first by left.
-have [lbK|ubK] := ltnP; [by left; apply: bounded_seqIndD_coherence lbK | right].
-have{ubK} ubK: (#|K : H1| < (2 * e + 1) ^ 2)%N.
- apply: leq_ltn_trans ubK _; rewrite -subn_gt0 sqrnD expnMn addKn.
- by rewrite !muln_gt0 indexg_gt0.
-have{frobLb} [[E1b frobLb] [sH1L nH1L]] := (existsP frobLb, andP nsH1L).
-have [defLb ntKb _ _ /andP[sE1L _]] := Frobenius_context frobLb.
-have iH1_mod1e H2:
- H1 \subset H2 -> H2 \subset K -> L \subset 'N(H2) -> #|H2 : H1| == 1 %[mod e].
-- move=> sH12 sH2K nPL; have sH2L := subset_trans sH2K sKL.
- rewrite eqn_mod_dvd // subn1 -card_quotient ?(subset_trans sH2L) //.
- have [-> | ntH2b] := eqVneq (H2 / H1)%g 1%g; first by rewrite cards1.
- have ->: e = #|E1b|.
- by rewrite (index_sdprod defLb) index_quotient_eq ?(setIidPr sH1L).
- have /Frobenius_subl/Frobenius_dvd_ker1-> := frobLb; rewrite ?quotientS //.
- by rewrite (subset_trans sE1L) ?quotient_norms.
-have{iH1_mod1e} chiefH1: chief_factor L H1 K.
- have ltH1K: H1 \proper K by rewrite /proper sH1K -quotient_sub1 ?subG1.
- rewrite /chief_factor nsKL andbT; apply/maxgroupP; rewrite ltH1K.
- split=> // H2 /andP[ltH2K nH2L] sH12; have sH2K := proper_sub ltH2K.
- have /eqVproper[// | ltH21] := sH12; case/idPn: ubK; rewrite -leqNgt.
- have iKH1: (#|K : H2| * #|H2 : H1|)%N = #|K : H1| by apply: Lagrange_index.
- have iH21_mod1e: #|H2 : H1| == 1 %[mod e] by apply/iH1_mod1e.
- have iKH1_mod1e: #|K : H1| = 1 %[mod e] by apply/eqP/iH1_mod1e.
- have iKH2_mod1e: #|K : H2| == 1 %[mod e].
- by rewrite -iKH1_mod1e -iKH1 -modnMmr (eqP iH21_mod1e) modnMmr muln1.
- have odd_iK := dvdn_odd (dvdn_indexg _ _) (oddSg (subset_trans _ sKL) oddL).
- by rewrite -iKH1 leq_mul ?mod1e_lb ?odd_iK ?indexg_gt1 ?proper_subn.
-have nMK: K \subset 'N(M) := subset_trans sKL (normal_norm nsML).
-have nMK1: K^`(1)%g \subset 'N(M) by apply: gFsub_trans.
-have not_abKb: ~~ abelian (K / M).
- apply: contra (proper_subn ltMH1) => /derG1P/trivgP/=.
- by rewrite join_subG subxx andbT -quotient_der ?quotient_sub1.
-have /is_abelemP[p p_pr /and3P[pKb _ _]]: is_abelem (K / H1).
- have: solvable (K / H1)%g by apply: quotient_sol solK.
- by case/(minnormal_solvable (chief_factor_minnormal chiefH1)).
-have [[_ p_dv_Kb _] nsMK] := (pgroup_pdiv pKb ntKb, normalS sMK sKL nsML).
-have isoKb: K / M / (H1 / M) \isog K / H1 := third_isog sMH1 nsMK nsH1K.
-have{nilKM} pKM: p.-group (K / M)%g.
- pose Q := 'O_p^'(K / M); have defKM: _ \x Q = _ := nilpotent_pcoreC p nilKM.
- have nH1Q: Q \subset 'N(H1 / M) by rewrite gFsub_trans ?quotient_norms.
- have hallQb := quotient_pHall nH1Q (nilpotent_pcore_Hall p^' nilKM).
- have{nH1Q hallQb pKb} sQH1: (Q \subset H1 / M)%g.
- rewrite -quotient_sub1 // subG1 trivg_card1 /= (card_Hall hallQb).
- by rewrite partG_eq1 pgroupNK (isog_pgroup p isoKb).
- suffices Q_1: Q = 1%g by rewrite -defKM Q_1 dprodg1 pcore_pgroup.
- apply: contraTeq sQH1 => ntQ; rewrite quotientYidr ?quotient_der //.
- rewrite (sameP setIidPl eqP) -(dprod_modr (der_dprod 1 defKM)) ?gFsub //= -/Q.
- rewrite setIC coprime_TIg ?(coprimeSg (der_sub 1 _)) ?coprime_pcoreC //.
- by rewrite dprod1g proper_neq ?(sol_der1_proper (nilpotent_sol nilKM)) ?gFsub.
-split=> //; exists p => //; apply: contra not_abKb => e_dv_p1.
-rewrite cyclic_abelian // Phi_quotient_cyclic //.
-have /homgP[f <-]: (K / M / 'Phi(K / M) \homg K / H1)%g.
- apply: homg_trans (isog_hom isoKb).
- rewrite homg_quotientS ?gFnorm ?quotient_norms //= quotientYidr //.
- by rewrite quotient_der // (Phi_joing pKM) joing_subl.
-rewrite {f}morphim_cyclic // abelian_rank1_cyclic; last first.
- by rewrite sub_der1_abelian ?joing_subl.
-rewrite (rank_pgroup pKb) (leq_trans (p_rank_le_logn _ _)) //.
-rewrite -ltnS -(ltn_exp2l _ _ (prime_gt1 p_pr)) -p_part part_pnat_id //.
-rewrite card_quotient // (leq_trans ubK) // leq_exp2r //.
-have odd_p: odd p by rewrite (dvdn_odd p_dv_Kb) ?quotient_odd ?(oddSg sKL).
-by rewrite mod1e_lb ?eqn_mod_dvd ?prime_gt0 ?prime_gt1.
-Qed.
-
-(* This is Peterfalvi (6.6). *)
-Lemma seqIndD_irr_coherence Z (calX := seqIndD K L Z 1) :
- odd_Frobenius_quotient 1 ->
- [/\ Z <| L, Z :!=: 1 & Z \subset 'Z(K)]%g ->
- {subset calX <= irr L} ->
- calX =i [pred chi in irr L | ~~ (Z \subset cfker chi)]
- /\ coherent calX L^#tau.
-Proof.
-move=> Frob_quo1 [nsZL ntZ sZ_ZK] irrX; have [sZL nZL] := andP nsZL.
-have abZ: abelian Z by rewrite (abelianS sZ_ZK) ?center_abelian.
-have /andP[sZK nZK]: Z <| K := sub_center_normal sZ_ZK.
-split=> [chi|].
- apply/idP/andP=> [Xchi | [/irrP[r ->{chi}] nkerZr]].
- rewrite irrX //; case/seqIndP: Xchi => t /setIdP[nkerZt _] ->.
- by rewrite inE in nkerZt; rewrite sub_cfker_Ind_irr.
- have [t Res_r_t] := neq0_has_constt (Res_irr_neq0 K r).
- pose chi := 'Ind[L] 'chi_t; have chi_r: '[chi, 'chi_r] != 0.
- by rewrite -cfdot_Res_r cfdotC fmorph_eq0 -irr_consttE.
- have Xchi: chi \in calX.
- apply/seqIndP; exists t; rewrite // !inE sub1G andbT.
- rewrite -(sub_cfker_Ind_irr t sKL nZL).
- apply: contra nkerZr => /subset_trans-> //.
- by rewrite cfker_constt // cfInd_char ?irr_char //.
- case/irrX/irrP: Xchi chi_r (Xchi) => r' ->.
- by rewrite cfdot_irr pnatr_eq0 -lt0n; case: eqP => // ->.
-apply: non_coherent_chief (subset_coherent (seqInd_sub sZK)) _ => //= -[_ [p]].
-have [oddL _] := Frob_quo1; rewrite joingG1 -/calX => frobLb [].
-rewrite -(isog_pgroup p (quotient1_isog K)) => pK ab'K.
-set e := #|L : K| => not_e_dv_p1; have e_gt0: (e > 0)%N by apply: indexg_gt0.
-have ntK: K != 1%G by apply: contraNneq ab'K => ->; rewrite quotient1 abelian1.
-have{ab'K ntK} [p_pr p_dv_K _] := pgroup_pdiv pK ntK.
-set Y := calX; pose d (xi : 'CF(L)) := logn p (truncC (xi 1%g) %/ e).
-have: cfConjC_closed Y by apply: cfAut_seqInd.
-have: perm_eq (Y ++ [::]) calX by rewrite cats0.
-have: {in Y & [::], forall xi1 xi2, d xi1 <= d xi2}%N by [].
-elim: {Y}_.+1 {-2}Y [::] (ltnSn (size Y)) => // m IHm Y X' leYm leYX' defX ccY.
-have sYX: {subset Y <= calX}.
- by move=> xi Yxi; rewrite -(perm_eq_mem defX) mem_cat Yxi.
-have sX'X: {subset X' <= calX}.
- by move=> xi X'xi; rewrite -(perm_eq_mem defX) mem_cat X'xi orbT.
-have uniqY: uniq Y.
- have: uniq calX := seqInd_uniq L _.
- by rewrite -(perm_eq_uniq defX) cat_uniq => /and3P[].
-have sYS: {subset Y <= calS} by move=> xi /sYX/seqInd_sub->.
-case homoY: (constant [seq xi 1%g | xi : 'CF(L) <- Y]).
- exact: uniform_degree_coherence (subset_subcoherent scohS _) homoY.
-have Ndg: {in calX, forall xi : 'CF(L), xi 1%g = (e * p ^ d xi)%:R}.
- rewrite /d => _ /seqIndP[i _ ->]; rewrite cfInd1 // -/e.
- have:= dvd_irr1_cardG i; have /CnatP[n ->] := Cnat_irr1 i.
- rewrite -natrM natCK dvdC_nat mulKn // -p_part => dv_n_K.
- by rewrite part_pnat_id // (pnat_dvd dv_n_K).
-have [chi Ychi leYchi]: {chi | chi \in Y & {in Y, forall xi, d xi <= d chi}%N}.
- have [/eqP/nilP Y0 | ntY] := posnP (size Y); first by rewrite Y0 in homoY.
- pose i := [arg max_(i > Ordinal ntY) d Y`_i].
- exists Y`_i; [exact: mem_nth | rewrite {}/i; case: arg_maxP => //= i _ max_i].
- by move=> _ /(nthP 0)[j ltj <-]; apply: (max_i (Ordinal ltj)).
-have{homoY} /hasP[xi1 Yxi1 lt_xi1_chi]: has (fun xi => d xi < d chi)%N Y.
- apply: contraFT homoY => geYchi; apply: (@all_pred1_constant _ (chi 1%g)).
- rewrite all_map; apply/allP=> xi Yxi; rewrite /= !Ndg ?sYX // eqr_nat.
- rewrite eqn_pmul2l // eqn_exp2l ?prime_gt1 //.
- by rewrite eqn_leq leYchi //= leqNgt (hasPn geYchi).
-pose Y' := rem chi^*%CF (rem chi Y); pose X'' := [:: chi, chi^*%CF & X'].
-have ccY': cfConjC_closed Y'.
- move=> xi; rewrite !(inE, mem_rem_uniq) ?rem_uniq //.
- by rewrite !(inv_eq (@cfConjCK _ _)) cfConjCK => /and3P[-> -> /ccY->].
-have Xchi := sYX _ Ychi; have defY: perm_eq [:: chi, chi^*%CF & Y'] Y.
- rewrite (perm_eqrP (perm_to_rem Ychi)) perm_cons perm_eq_sym perm_to_rem //.
- by rewrite mem_rem_uniq ?inE ?ccY // (seqInd_conjC_neq _ _ _ Xchi).
-apply: perm_eq_coherent (defY) _.
-have d_chic: d chi^*%CF = d chi.
- by rewrite /d cfunE conj_Cnat // (Cnat_seqInd1 Xchi).
-have /and3P[uniqY' Y'xi1 notY'chi]: [&& uniq Y', xi1 \in Y' & chi \notin Y'].
- rewrite !(inE, mem_rem_uniq) ?rem_uniq // Yxi1 eqxx andbF !andbT -negb_or.
- by apply: contraL lt_xi1_chi => /pred2P[] ->; rewrite ?d_chic ltnn.
-have sY'Y: {subset Y' <= Y} by move=> xi /mem_rem/mem_rem.
-have sccY'S: cfConjC_subset Y' calS by split=> // xi /sY'Y/sYS.
-apply: (extend_coherent scohS _ Y'xi1); rewrite ?sYS {sccY'S notY'chi}//.
-have{defX} defX: perm_eq (Y' ++ X'') calX.
- by rewrite (perm_catCA Y' [::_; _]) catA -(perm_eqrP defX) perm_cat2r.
-have{d_chic} le_chi_X'': {in X'', forall xi, d chi <= d xi}%N.
- by move=> xi /or3P[/eqP-> | /eqP-> | /leYX'->] //; rewrite d_chic.
-rewrite !Ndg ?sYX // dvdC_nat dvdn_pmul2l // dvdn_exp2l 1?ltnW //; split=> //.
- apply: IHm defX ccY' => [|xi xi' /sY'Y/leYchi-le_xi_chi /le_chi_X''].
- by rewrite -ltnS // (leq_trans _ leYm) // -(perm_eq_size defY) ltnW.
- exact: leq_trans.
-have p_gt0 n: (0 < p ^ n)%N by rewrite expn_gt0 prime_gt0.
-rewrite -!natrM; apply: (@ltr_le_trans _ (e ^ 2 * (p ^ d chi) ^ 2)%:R).
- rewrite ltr_nat -expnMn -mulnn mulnAC !mulnA 2?ltn_pmul2r //.
- rewrite -mulnA mulnCA ltn_pmul2l // -(subnK lt_xi1_chi) addnS expnS.
- rewrite expnD mulnA ltn_pmul2r // -(muln1 3) leq_mul //.
- rewrite ltn_neqAle prime_gt1 // eq_sym (sameP eqP (prime_oddPn p_pr)).
- by rewrite (dvdn_odd p_dv_K) // (oddSg sKL).
-have [r] := seqIndP (sYX _ Ychi); rewrite !inE => /andP[nkerZr _] def_chi.
-have d_r: 'chi_r 1%g = (p ^ d chi)%:R.
- by apply: (mulfI (neq0CiG L K)); rewrite -cfInd1 // -def_chi -natrM Ndg.
-pose sum_p2d S := (\sum_(xi <- S) p ^ (d xi * 2))%N.
-pose sum_xi1 (S : seq 'CF(L)) := \sum_(xi <- S) xi 1%g ^+ 2 / '[xi].
-have def_sum_xi1 S: {subset S <= calX} -> sum_xi1 S = (e ^ 2 * sum_p2d S)%:R.
- move=> sSX; rewrite big_distrr natr_sum /=; apply: eq_big_seq => xi /sSX Xxi.
- rewrite expnM -expnMn natrX -Ndg //.
- by have /irrP[i ->] := irrX _ Xxi; rewrite cfnorm_irr divr1.
-rewrite -/(sum_xi1 _) def_sum_xi1 ?leC_nat 1?dvdn_leq => [|||_ /sY'Y/sYX] //.
- by rewrite muln_gt0 expn_gt0 e_gt0 [_ Y'](bigD1_seq xi1) //= addn_gt0 p_gt0.
-have coep: coprime e p.
- have:= Frobenius_ker_coprime frobLb; rewrite coprime_sym.
- have /andP[_ nK'L]: K^`(1) <| L by apply: gFnormal_trans.
- rewrite index_quotient_eq ?subIset ?der_sub ?orbT {nK'L}// -/e.
- have ntKb: (K / K^`(1))%g != 1%g by case/Frobenius_kerP: frobLb.
- have [_ _ [k ->]] := pgroup_pdiv (quotient_pgroup _ pK) ntKb.
- by rewrite coprime_pexpr.
-rewrite -expnM Gauss_dvd ?coprime_expl ?coprime_expr {coep}// dvdn_mulr //=.
-have /dvdn_addl <-: p ^ (d chi * 2) %| e ^ 2 * sum_p2d X''.
- rewrite big_distrr big_seq dvdn_sum //= => xi /le_chi_X'' le_chi_xi.
- by rewrite dvdn_mull // dvdn_exp2l ?leq_pmul2r.
-rewrite -mulnDr -big_cat (eq_big_perm _ defX) -(natCK (e ^ 2 * _)) /=.
-rewrite -def_sum_xi1 // /sum_xi1 sum_seqIndD_square ?normal1 ?sub1G //.
-rewrite indexg1 -(natrB _ (cardG_gt0 Z)) -natrM natCK.
-rewrite -(Lagrange_index sKL sZK) mulnAC dvdn_mull //.
-have /p_natP[k defKZ]: p.-nat #|K : Z| by rewrite (pnat_dvd (dvdn_indexg K Z)).
-rewrite defKZ dvdn_exp2l // -(leq_exp2l _ _ (prime_gt1 p_pr)) -{k}defKZ.
-rewrite -leC_nat expnM natrX -d_r ?(ler_trans (irr1_bound r).1) //.
-rewrite ler_nat dvdn_leq ?indexgS ?(subset_trans sZ_ZK) //=.
-by rewrite -cap_cfcenter_irr bigcap_inf.
-Qed.
-
-End GeneralCoherence.
-
-(* This is Peterfalvi (6.7). *)
-(* In (6.8) we only know initially the P group is Sylow in L; perhaps this *)
-(* lemma should be stated with this equivalent (but weaker) assumption. *)
-Lemma constant_irr_mod_TI_Sylow Z L P p i :
- p.-Sylow(G) P -> odd #|L| -> normedTI P^# G L ->
- [/\ Z <| L, Z :!=: 1%g & Z \subset 'Z(P)] ->
- {in Z^# &, forall x y, #|'C_L[x]| = #|'C_L[y]| } ->
- let phi := 'chi[G]_i in
- {in Z^# &, forall x y, phi x = phi y} ->
- {in Z^#, forall x, phi x \in Cint /\ (#|P| %| phi x - phi 1%g)%C}.
-Proof.
-move=> sylP oddL tiP [/andP[sZL nZL] ntZ sZ_ZP] prZL; move: i.
-pose a := @gring_classM_coef _ G; pose C (i : 'I_#|classes G|) := enum_val i.
-have [[sPG pP p'PiG] [sZP cPZ]] := (and3P sylP, subsetIP sZ_ZP).
-have [ntP sLG memJ_P1] := normedTI_memJ_P tiP; rewrite setD_eq0 subG1 in ntP.
-have nsPL: P <| L.
- by have [_ _ /eqP<-] := and3P tiP; rewrite normD1 normal_subnorm.
-have [p_pr _ [e oP]] := pgroup_pdiv pP ntP.
-have [sZG [sPL _]] := (subset_trans sZP sPG, andP nsPL).
-pose dC i (A : {set gT}) := [disjoint C i & A].
-have actsGC i: {acts G, on C i | 'J}.
- apply/actsP; rewrite astabsJ /C; have /imsetP[x _ ->] := enum_valP i.
- by apply/normsP; apply: classGidr.
-have{actsGC} PdvKa i j s:
- ~~ dC i Z^# -> ~~ dC j Z^# -> dC s Z -> (#|P| %| a i j s * #|C s|)%N.
-- pose Omega := [set uv in [predX C i & C j] | mulgm uv \in C s]%g.
- pose to_fn uv x := prod_curry (fun u v : gT => (u ^ x, v ^ x)%g) uv.
- have toAct: is_action setT to_fn.
- by apply: is_total_action => [[u v]|[u v] x y] /=; rewrite ?conjg1 ?conjgM.
- move=> Zi Zj Z's; pose to := Action toAct.
- have actsPO: [acts P, on Omega | to].
- apply/(subset_trans sPG)/subsetP=> x Gx; rewrite !inE.
- apply/subsetP=> [[u v] /setIdP[/andP/=[Ciu Cjv] Csuv]].
- by rewrite !inE /= -conjMg !actsGC // Ciu Cjv.
- have <-: #|Omega| = (a i j s * #|C s|)%N.
- have /repr_classesP[_ defCs] := enum_valP s; rewrite -/(C s) in defCs.
- rewrite -sum1_card mulnC -sum_nat_const.
- rewrite (partition_big mulgm (mem (C s))) => [|[u v] /setIdP[]//].
- apply: eq_bigr; rewrite /= defCs => _ /imsetP[z Gz ->].
- rewrite -[a i j s]sum1_card -!/(C _) (reindex_inj (act_inj to z)) /=.
- apply: eq_bigl => [[u v]]; rewrite !inE /= -conjMg (inj_eq (conjg_inj _)).
- by apply: andb_id2r => /eqP->; rewrite {2}defCs mem_imset ?andbT ?actsGC.
- suffices regPO: {in Omega, forall uv, 'C_P[uv | to] = 1%g}.
- rewrite -(acts_sum_card_orbit actsPO) dvdn_sum // => _ /imsetP[uv Ouv ->].
- by rewrite card_orbit regPO // indexg1.
- case=> u v /setIdP[/andP[/= Ciu Cjv] Csuv]; apply: contraTeq Z's.
- case/trivgPn=> x /setIP[Px /astab1P[/= cux cvx]] nt_x.
- suffices inZ k y: y \in C k -> ~~ dC k Z^# -> y ^ x = y -> y \in Z.
- apply/exists_inP; exists (u * v)%g => //=.
- by rewrite groupM // (inZ i u, inZ j v).
- rewrite /dC /C; have /imsetP[_ _ ->{k} /class_eqP <-] := enum_valP k.
- case/exists_inP=> _ /imsetP[g Gg ->] /setD1P[nt_yg Zyg] yx.
- have xy: (x ^ y = x)%g by rewrite /conjg (conjgCV x) -{2}yx conjgK mulKg.
- rewrite -(memJ_conjg _ g) (normsP nZL) //.
- rewrite -(memJ_P1 y) ?inE //=; first by rewrite nt_yg (subsetP sZP).
- rewrite -order_eq1 -(orderJ y g) order_eq1 nt_yg.
- rewrite (mem_normal_Hall (pHall_subl sPL sLG sylP)) //.
- by rewrite -(p_eltJ _ _ g) (mem_p_elt pP) ?(subsetP sZP).
- rewrite -(memJ_P1 x) // ?xy ?inE ?nt_x // -[y](conjgK g) groupJ ?groupV //.
- by rewrite (subsetP sZG).
-pose a2 i j := (\sum_(s | ~~ dC s Z^#) a i j s)%N.
-pose kerZ l := {in Z^# &, forall x y, 'chi[G]_l x = 'chi_l y}.
-move=> l phi kerZl z Z1z; move: l @phi {kerZl}(kerZl : kerZ l).
-have [ntz Zz] := setD1P Z1z.
-have [[Pz Lz] Gz] := (subsetP sZP z Zz, subsetP sZL z Zz, subsetP sZG z Zz).
-pose inC y Gy := enum_rank_in (@mem_classes _ y G Gy) (y ^: G).
-have CE y Gy: C (inC y Gy) = y ^: G by rewrite /C enum_rankK_in ?mem_classes.
-pose i0 := inC _ (group1 G); pose i1 := inC z Gz; pose i2 := inC _ (groupVr Gz).
-suffices Ea2 l (phi := 'chi[G]_l) (kerZphi : kerZ l):
- (phi z *+ a2 i1 i1 == phi 1%g + phi z *+ a2 i1 i2 %[mod #|P|])%A.
-- move=> l phi kerZphi.
- have Zphi1: phi 1%g \in Cint by rewrite irr1_degree rpred_nat.
- have chi0 x: x \in Z -> 'chi[G]_0 x = 1.
- by rewrite irr0 cfun1E => /(subsetP sZG) ->.
- have: kerZ 0 by move=> x y /setD1P[_ Zx] /setD1P[_ Zy]; rewrite !chi0.
- move/Ea2/(eqAmodMl (Aint_irr l z)); rewrite !{}chi0 // -/phi eqAmod_sym.
- rewrite mulrDr mulr1 !mulr_natr => /eqAmod_trans/(_ (Ea2 l kerZphi)).
- rewrite eqAmodDr -/phi eqAmod_rat ?rpred_nat ?(rpred_Cint _ Zphi1) //.
- move=> PdvDphi; split; rewrite // -[phi z](subrK (phi 1%g)) rpredD //.
- by have /dvdCP[b Zb ->] := PdvDphi; rewrite rpredM ?rpred_nat.
- have nz_Z1: #|Z^#|%:R != 0 :> algC.
- by rewrite pnatr_eq0 cards_eq0 setD_eq0 subG1.
- rewrite -[phi z](mulfK nz_Z1) rpred_div ?rpred_nat // mulr_natr.
- rewrite -(rpredDl _ (rpred_Cint _ Zphi1)) //.
- rewrite -[_ + _](mulVKf (neq0CG Z)) rpredM ?rpred_nat //.
- have: '['Res[Z] phi, 'chi_0] \in Crat.
- by rewrite rpred_Cnat ?Cnat_cfdot_char ?cfRes_char ?irr_char.
- rewrite irr0 cfdotE (big_setD1 _ (group1 Z)) cfun1E cfResE ?group1 //=.
- rewrite rmorph1 mulr1; congr (_ * (_ + _) \in Crat).
- rewrite -sumr_const; apply: eq_bigr => x Z1x; have [_ Zx] := setD1P Z1x.
- by rewrite cfun1E cfResE ?Zx // rmorph1 mulr1; apply: kerZphi.
-pose alpha := 'omega_l['K_i1]; pose phi1 := phi 1%g.
-have tiZG: {in Z^#, forall y, 'C_G[y] \subset L}.
- move=> y /setD1P[nty /(subsetP sZP)Py].
- apply/subsetP=> u /setIP[Gu /cent1P-cuy].
- by rewrite -(memJ_P1 y) // /conjg -?cuy ?mulKg !inE nty.
-have Dalpha s: ~~ dC s Z^# -> alpha = 'omega_l['K_s].
- case/exists_inP=> x /= /gring_mode_class_sum_eq-> Z1x.
- have Ci1z: z \in C i1 by rewrite CE class_refl.
- rewrite [alpha](gring_mode_class_sum_eq _ Ci1z) -/phi (kerZphi z x) //.
- have{tiZG} tiZG: {in Z^#, forall y, 'C_G[y] = 'C_L[y]}.
- by move=> y /tiZG/setIidPr; rewrite setIA (setIidPl sLG).
- by rewrite -!index_cent1 -!divgS ?subsetIl //= !tiZG ?(prZL z x).
-have Ci01: 1%g \in C i0 by rewrite CE class_refl.
-have rCi10: repr (C i0) = 1%g by rewrite CE class1G repr_set1.
-have Dalpha2 i j: ~~ dC i Z^# -> ~~ dC j Z^# ->
- (phi1 * alpha ^+ 2 == phi1 * ((a i j i0)%:R + alpha *+ a2 i j) %[mod #|P|])%A.
-- move=> Z1i Z1j.
- have ->: phi1 * alpha ^+ 2 = \sum_s (phi1 *+ a i j s) * 'omega_l['K_s].
- rewrite expr2 {1}(Dalpha i Z1i) (Dalpha j Z1j).
- rewrite -gring_irr_modeM ?gring_class_sum_central //.
- rewrite gring_classM_expansion raddf_sum mulr_sumr; apply: eq_bigr => s _.
- by rewrite scaler_nat raddfMn mulrnAl mulrnAr.
- rewrite (bigID (fun s => dC s Z^#)) (bigD1 i0) //=; last first.
- by rewrite [dC _ _]disjoints_subset CE class1G sub1set !inE eqxx.
- rewrite (gring_mode_class_sum_eq _ Ci01) mulfK ?irr1_neq0 //.
- rewrite class1G cards1 mulr1 mulrDr mulr_natr -addrA eqAmodDl.
- rewrite /eqAmod -addrA rpredD //; last first.
- rewrite -mulr_natr natr_sum !mulr_sumr -sumrB rpred_sum // => s Z1s.
- by rewrite -Dalpha // mulr_natr mulrnAl mulrnAr subrr rpred0.
- apply: rpred_sum => // s /andP[Z1'Cs ntCs]; rewrite mulrnAl mulrC.
- have /imsetP[x _ defCs] := enum_valP s.
- have Cs_x: x \in C s by rewrite /C defCs class_refl.
- rewrite (gring_mode_class_sum_eq _ Cs_x) divfK ?irr1_neq0 // -defCs -/(C s).
- rewrite -mulrnAl -mulrnA mulnC -[_%:R]subr0 mulrBl.
- apply: eqAmodMr; first exact: Aint_irr.
- rewrite eqAmod0_rat ?rpred_nat // dvdC_nat PdvKa //.
- rewrite -(setD1K (group1 Z)) [dC _ _]disjoint_sym disjoints_subset.
- rewrite subUset sub1set inE -disjoints_subset disjoint_sym.
- rewrite (contra _ ntCs) // [C s]defCs => /class_eqP.
- by rewrite -(inj_eq enum_val_inj) defCs -/(C _) CE => ->.
-have zG'z1: (z^-1 \notin z ^: G)%g.
- have genL2 y: y \in L -> <[y]> = <[y ^+ 2]>.
- move=> Ly; apply/eqP; rewrite [_ == _]generator_coprime.
- by rewrite coprime_sym prime_coprime // dvdn2 (oddSg _ oddL) ?cycle_subG.
- apply: contra (ntz) => /imsetP[y Gy zy].
- have cz_y2: (y ^+ 2 \in 'C[z])%g.
- by rewrite !inE conjg_set1 conjgM -zy conjVg -zy invgK.
- rewrite -cycle_eq1 genL2 // cycle_eq1 -eq_invg_mul zy (sameP eqP conjg_fixP).
- rewrite (sameP commgP cent1P) cent1C -cycle_subG genL2 ?cycle_subG //.
- by rewrite -(memJ_P1 z) -?zy ?in_setD ?groupV ?inE ?ntz.
-have a110: a i1 i1 i0 = 0%N.
- apply: contraNeq zG'z1 => /existsP[[u v] /setIdP[/andP[/=]]].
- rewrite rCi10 -!/(C _) !CE -eq_invg_mul => /imsetP[x Gx ->] /class_eqP <-.
- by move/eqP <-; rewrite -conjVg classGidl ?class_refl.
-have a120: a i1 i2 i0 = #|C i1|.
- rewrite -(card_imset _ (@can_inj _ _ (fun y => (y, y^-1)%g) (@fst _ _) _)) //.
- apply/eq_card=> [[u v]]; rewrite !inE rCi10 -eq_invg_mul -!/(C _) !CE -andbA.
- apply/and3P/imsetP=> /= [[zGu _ /eqP<-] | [y zGy [-> ->]]]; first by exists u.
- by rewrite classVg inE invgK.
-have Z1i1: ~~ dC i1 Z^#.
- by apply/exists_inP; exists z; rewrite //= CE class_refl.
-have Z1i2: ~~ dC i2 Z^#.
- apply/exists_inP; exists z^-1%g; first by rewrite /= CE class_refl.
- by rewrite /= in_setD !groupV !inE ntz.
-have{Dalpha2}: (phi1 * (alpha *+ a2 i1 i1)
- == phi1 * (#|C i1|%:R + alpha *+ a2 i1 i2) %[mod #|P|])%A.
-- rewrite -a120; apply: eqAmod_trans (Dalpha2 i1 i2 Z1i1 Z1i2).
- by have:= Dalpha2 _ _ Z1i1 Z1i1; rewrite a110 add0r eqAmod_sym.
-rewrite mulrDr !mulrnAr mulr1 -/phi1.
-have ->: phi1 * alpha = phi z *+ #|C i1|.
- have Ci1z: z \in C i1 by rewrite CE class_refl.
- rewrite [alpha](gring_mode_class_sum_eq _ Ci1z) mulrC divfK ?irr1_neq0 //.
- by rewrite mulr_natl CE.
-rewrite -!mulrnA !(mulnC #|C _|) !mulrnA -mulrnDl.
-have [|r _ /dvdnP[q Dqr]] := @Bezoutl #|C i1| #|P|.
- by rewrite CE -index_cent1.
-have Zq: q%:R \in Aint by apply: rpred_nat.
-move/(eqAmodMr Zq); rewrite ![_ *+ #|C _| * _]mulrnAl -!mulrnAr -mulrnA -Dqr.
-have /eqnP->: coprime #|C i1| #|P|.
- rewrite (p'nat_coprime _ pP) // (pnat_dvd _ p'PiG) // CE -index_cent1.
- by rewrite indexgS // subsetI sPG sub_cent1 (subsetP cPZ).
-rewrite add1n !mulrS !mulrDr !mulr1 natrM !mulrA.
-set u := _ * r%:R; set v := _ * r%:R; rewrite -[u](subrK v) mulrDl addrA.
-rewrite eqAmodDr; apply: eqAmod_trans; rewrite eqAmod_sym addrC.
-rewrite eqAmod_addl_mul // -mulrBl mulr_natr.
-by rewrite !(rpredB, rpredD, rpredMn, Aint_irr).
-Qed.
-
-(* This is Peterfalvi, Theorem (6.8). *)
-(* We omit the semi-direct structure of L in assumption (a), since it is *)
-(* implied by our statement of assumption (c). *)
-Theorem Sibley_coherence L H W1 :
- (*a*) [/\ odd #|L|, nilpotent H & normedTI H^# G L] ->
- (*b*) let calS := seqIndD H L H 1 in let tau := 'Ind[G, L] in
- (*c*) [\/ (*c1*) [Frobenius L = H ><| W1]
- | (*c2*) exists2 W2 : {group gT}, prime #|W2| /\ W2 \subset H^`(1)%G
- & exists A0, exists W : {group gT}, exists defW : W1 \x W2 = W,
- prime_Dade_hypothesis G L H H H^# A0 defW] ->
- coherent calS L^# tau.
-Proof.
-set case_c1 := [Frobenius L = H ><| W1]; pose case_c2 := ~~ case_c1.
-set A := H^#; set H' := H^`(1)%G => -[oddL nilH tiA] S tau hyp_c.
-have sLG: L \subset G by have [] := normedTI_memJ_P tiA.
-have ntH: H :!=: 1%g by have [] := normedTI_P tiA; rewrite setD_eq0 subG1.
-have [defL ntW1]: H ><| W1 = L /\ W1 :!=: 1%g.
- by have [/Frobenius_context[] | [? _ [? [? [? [_ [[]]]]]]]] := hyp_c.
-have [nsHL _ /mulG_sub[sHL sW1L] _ _] := sdprod_context defL.
-have [uccS nrS]: cfConjC_subset S S /\ ~~ has cfReal S.
- by do 2?split; rewrite ?seqInd_uniq ?seqInd_notReal //; apply: cfAut_seqInd.
-have defZS: 'Z[S, L^#] =i 'Z[S, A] by apply: zcharD1_seqInd.
-have c1_irrS: case_c1 -> {subset S <= irr L}.
- move/FrobeniusWker=> frobL _ /seqIndC1P[i nz_i ->].
- exact: irr_induced_Frobenius_ker.
-move defW2: 'C_H(W1)%G => W2; move defW: (W1 <*> W2)%G => W.
-have{defW} defW: W1 \x W2 = W.
- rewrite -defW dprodEY // -defW2 ?subsetIr // setICA setIA.
- by have [_ _ _ ->] := sdprodP defL; rewrite setI1g.
-pose V := cyclicTIset defW; pose A0 := A :|: class_support V L.
-pose ddA0hyp := prime_Dade_hypothesis G L H H A A0 defW.
-have c1W2: case_c1 -> W2 = 1%G by move/Frobenius_trivg_cent/group_inj <-.
-have{hyp_c} hyp_c2: case_c2 -> [/\ prime #|W2|, W2 \subset H' & ddA0hyp].
- case: hyp_c => [/idPn// | [W2_ [prW2_ sW2_H'] [A0_ [W_ [defW_ ddA0_]]]] _].
- have idW2_: W2_ = W2.
- have [[_ _ _ /cyclicP[x defW1]] [_ _ _ prW12] _] := prDade_prTI ddA0_.
- have W1x: x \in W1^# by rewrite !inE -cycle_eq1 -defW1 ntW1 defW1 cycle_id.
- by apply/group_inj; rewrite -defW2 /= defW1 cent_cycle prW12.
- have idW_: W_ = W by apply/group_inj; rewrite -defW_ idW2_.
- rewrite {}/ddA0hyp {}/A0 {}/V; rewrite -idW2_ -idW_ in defW *.
- by rewrite (eq_irrelevance defW defW_); have [_ _ <-] := prDade_def ddA0_.
-have{hyp_c2} [c2_prW2 c2_sW2H' c2_ddA0] := all_and3 hyp_c2.
-have c2_ptiL c2 := prDade_prTI (c2_ddA0 c2).
-have{c2_sW2H'} sW2H': W2 \subset H'.
- by have [/c1W2-> | /c2_sW2H'//] := boolP case_c1; apply: sub1G.
-pose sigma c2 := cyclicTIiso (c2_ddA0 c2).
-have [R scohS oRW]: exists2 R, subcoherent S tau R & forall c2 : case_c2,
- {in [predI S & irr L] & irr W, forall phi w, orthogonal (R phi) (sigma c2 w)}.
-- have sAG: A \subset G^# by rewrite setSD // (subset_trans sHL).
- have Itau: {in 'Z[S, L^#], isometry tau, to 'Z[irr G, G^#]}.
- split=> [xi1 xi2|xi]; first rewrite !defZS => /zchar_on-Axi1 /zchar_on-Axi2.
- exact: normedTI_isometry Axi1 Axi2.
- rewrite !zcharD1E cfInd1 // => /andP[Zxi /eqP->]; rewrite mulr0.
- by rewrite cfInd_vchar ?(zchar_trans_on _ Zxi) //=; apply: seqInd_vcharW.
- have [/= c1 | /c2_ddA0-ddA0] := boolP (idfun case_c1).
- suffices [R scohS]: {R | subcoherent S tau R} by exists R => // /negP[].
- by apply: irr_subcoherent; first have [[]] := (uccS, c1_irrS c1).
- have Dtau: {in 'CF(L, A), tau =1 Dade ddA0}.
- have nAL: L \subset 'N(A) by have [_ /subsetIP[]] := normedTI_P tiA.
- have sAA0: A \subset A0 by apply: subsetUl.
- by move=> phi Aphi /=; rewrite -(restr_DadeE _ sAA0) // [RHS]Dade_Ind.
- have [R [subcohR oRW _]] := prDade_subcoherent ddA0 uccS nrS.
- exists R => [|c2 phi w irrSphi irr_w]; last first.
- by rewrite /sigma -(cycTIiso_irrel ddA0) oRW.
- have [Sok _ oSS Rok oRR] := subcohR; split=> {Sok oSS oRR}// phi Sphi.
- have [ZR oNR <-] := Rok _ Sphi; split=> {ZR oNR}//.
- exact/Dtau/(zchar_on (seqInd_sub_aut_zchar _ _ Sphi)).
-have solH := nilpotent_sol nilH; have nsH'H: H' <| H := der_normal 1 H.
-have ltH'H: H' \proper H by rewrite (sol_der1_proper solH).
-have nsH'L: H' <| L by apply: gFnormal_trans.
-have [sH'H [sH'L nH'L]] := (normal_sub nsH'H, andP nsH'L).
-have coHW1: coprime #|H| #|W1|.
- suffices: Hall L W1 by rewrite (coprime_sdprod_Hall_r defL).
- by have [/Frobenius_compl_Hall | /c2_ddA0/prDade_prTI[[]]] := boolP case_c1.
-have oW1: #|W1| = #|L : H| by rewrite (index_sdprod defL).
-have frobL1: [Frobenius L / H' = (H / H') ><| (W1 / H')].
- apply: (Frobenius_coprime_quotient defL nsH'L) => //; split=> // x W1x.
- have [frobL | /c2_ptiL[_ [_ _ _ -> //]]] := boolP case_c1.
- by rewrite (Frobenius_reg_ker frobL) ?sub1G.
-have odd_frobL1: odd_Frobenius_quotient H L 1.
- split=> //=; last by rewrite joingG1 (FrobeniusWker frobL1).
- by rewrite normal1 sub1G quotient_nil.
-without loss [/p_groupP[p p_pr pH] not_cHH]: / p_group H /\ ~~ abelian H.
- apply: (non_coherent_chief _ _ scohS odd_frobL1) => // -[_ [p [pH ab'H] _]].
- have isoH := quotient1_isog H; rewrite -(isog_pgroup p isoH) in pH.
- by apply; rewrite (isog_abelian isoH) (pgroup_p pH).
-have sylH: p.-Sylow(G) H. (* required for (6.7) *)
- rewrite -Sylow_subnorm -normD1; have [_ _ /eqP->] := and3P tiA.
- by apply/and3P; rewrite -oW1 -pgroupE (coprime_p'group _ pH) // coprime_sym.
-pose caseA := 'Z(H) :&: W2 \subset [1]%g; pose caseB := ~~ caseA.
-have caseB_P: caseB -> [/\ case_c2, W2 :!=: 1%g & W2 \subset 'Z(H)].
- rewrite /caseB /caseA; have [->|] := eqP; first by rewrite subsetIr.
- rewrite /case_c2; have [/c1W2->// | /c2_prW2-prW2 _] := boolP case_c1.
- by rewrite setIC subG1 => /prime_meetG->.
-pose Z := (if caseA then 'Z(H) :&: H' else W2)%G.
-have /subsetIP[sZZH sZH']: Z \subset 'Z(H) :&: H'.
- by rewrite /Z; case: ifPn => // /caseB_P[_ _ sZZH]; apply/subsetIP.
-have caseB_sZZL: caseB -> Z \subset 'Z(L).
- move=> in_caseB; have [_ _ /subsetIP[sW2H cW2H]] := caseB_P in_caseB.
- rewrite /Z ifN // subsetI (subset_trans sW2H sHL).
- by rewrite -(sdprodW defL) centM subsetI cW2H -defW2 subsetIr.
-have nsZL: Z <| L; last have [sZL nZL] := andP nsZL.
- have [in_caseA | /caseB_sZZL/sub_center_normal//] := boolP caseA.
- by rewrite /Z in_caseA normalI ?gFnormal_trans.
-have ntZ: Z :!=: 1%g.
- rewrite /Z; case: ifPn => [_ | /caseB_P[] //].
- by rewrite /= setIC meet_center_nil // (sameP eqP derG1P).
-have nsZH: Z <| H := sub_center_normal sZZH; have [sZH nZH] := andP nsZH.
-have regZL: {in Z^# &, forall x y, #|'C_L[x]| = #|'C_L[y]| }.
- have [in_caseA | /caseB_sZZL/subsetIP[_ cZL]] := boolP caseA; last first.
- suffices defC x: x \in Z^# -> 'C_L[x] = L by move=> x y /defC-> /defC->.
- by case/setD1P=> _ /(subsetP cZL); rewrite -sub_cent1 => /setIidPl.
- suffices defC x: x \in Z^# -> 'C_L[x] = H by move=> x y /defC-> /defC->.
- case/setD1P=> ntx Zx; have /setIP[Hx cHx] := subsetP sZZH x Zx.
- have [_ <- _ _] := sdprodP defL; rewrite -group_modl ?sub_cent1 //=.
- suffices ->: 'C_W1[x] = 1%g by rewrite mulg1.
- have [/Frobenius_reg_compl-> // | c2] := boolP case_c1; first exact/setD1P.
- have [_ [_ _ _ regW1] _] := c2_ptiL c2.
- apply: contraTeq in_caseA => /trivgPn[y /setIP[W1y cxy] nty]; apply/subsetPn.
- by exists x; rewrite inE // -(regW1 y) 2!inE ?nty // Hx cHx cent1C.
-have{regZL} irrZmodH :=
- constant_irr_mod_TI_Sylow sylH oddL tiA (And3 nsZL ntZ sZZH) regZL.
-pose X := seqIndD H L Z 1; pose Y := seqIndD H L H H'.
-have ccsXS: cfConjC_subset X S by apply: seqInd_conjC_subset1.
-have ccsYS: cfConjC_subset Y S by apply: seqInd_conjC_subset1.
-have [[uX sXS ccX] [uY sYS ccY]] := (ccsXS, ccsYS).
-have X'Y: {subset Y <= [predC X]}.
- move=> _ /seqIndP[i /setIdP[_ kH'i] ->]; rewrite inE in kH'i.
- by rewrite !inE mem_seqInd ?normal1 // !inE (subset_trans sZH').
-have oXY: orthogonal X Y.
- apply/orthogonalP=> xi eta Xxi Yeta; apply: orthoPr xi Xxi.
- exact: (subset_ortho_subcoherent scohS sXS (sYS _ Yeta) (X'Y _ Yeta)).
-have irrY: {subset Y <= irr L}.
- move=> _ /seqIndP[i /setIdP[not_kHi kH'i] ->]; rewrite !inE in not_kHi kH'i.
- rewrite -(cfQuo_irr nsH'L) ?sub_cfker_Ind_irr -?cfIndQuo -?quo_IirrE //.
- apply: (irr_induced_Frobenius_ker (FrobeniusWker frobL1)).
- by rewrite quo_Iirr_eq0 -?subGcfker.
-have oY: orthonormal Y by apply: sub_orthonormal (irr_orthonormal L).
-have uniY: {in Y, forall phi : 'CF(L), phi 1%g = #|W1|%:R}.
- move=> _ /seqIndP[i /setIdP[_ kH'i] ->]; rewrite inE -lin_irr_der1 in kH'i.
- by rewrite cfInd1 // -divgS // -(sdprod_card defL) mulKn // lin_char1 ?mulr1.
-have scohY: subcoherent Y tau R by apply: (subset_subcoherent scohS).
-have [tau1 cohY]: coherent Y L^# tau.
- apply/(uniform_degree_coherence scohY)/(@all_pred1_constant _ #|W1|%:R).
- by apply/allP=> _ /mapP[phi Yphi ->]; rewrite /= uniY.
-have [[Itau1 Ztau1] Dtau1] := cohY.
-have oYtau: orthonormal (map tau1 Y) by apply: map_orthonormal.
-have [[_ oYY] [_ oYYt]] := (orthonormalP oY, orthonormalP oYtau).
-have [eta1 Yeta1]: {eta1 | eta1 \in Y} by apply: seqIndD_nonempty.
-pose m : algC := (size Y)%:R; pose m_ub2 a := (a - 1) ^+ 2 + (m - 1) * a ^+ 2.
-have m_ub2_lt2 a: a \in Cint -> m_ub2 a < 2%:R -> a = 0 \/ a = 1 /\ size Y = 2.
- move=> Za ub_a; have [|nza] := eqVneq a 0; [by left | right].
- have ntY: (1 < size Y)%N by apply: seqInd_nontrivial Yeta1.
- have m1_ge1: 1 <= m - 1 by rewrite ler_subr_addr (ler_nat _ 2).
- have a1: a = 1.
- apply: contraFeq (ltr_geF ub_a); rewrite -subr_eq0 /m_ub2 => nz_a1.
- by rewrite ler_add ?(mulr_ege1 m1_ge1) // sqr_Cint_ge1 ?rpredB.
- rewrite /m_ub2 a1 subrr expr0n add0r expr1n mulr1 in ub_a.
- rewrite ltr_subl_addr -mulrSr ltr_nat ltnS in ub_a.
- by split; last apply/anti_leq/andP.
-have{odd_frobL1} caseA_cohXY: caseA -> coherent (X ++ Y) L^# tau.
- move=> in_caseA.
- have scohX: subcoherent X tau R by apply: subset_subcoherent ccsXS.
- have irrX: {subset X <= irr L}.
- have [c1 | c2] := boolP case_c1; first by move=> phi /sXS/c1_irrS->.
- have ptiL := c2_ptiL c2; have [_ [ntW2 sW2H _ _] _] := ptiL.
- have{sW2H} isoW2: W2 / Z \isog W2.
- apply/isog_symr/quotient_isog; first exact: subset_trans sW2H nZH.
- exact/trivgP/(subset_trans _ in_caseA)/setSI.
- have{ntW2} ntW2bar: (W2 / Z != 1)%g by rewrite (isog_eq1 isoW2).
- have{ntW2bar} [defWbar ptiLZ] := primeTIhyp_quotient ptiL ntW2bar sZH nsZL.
- pose IchiZ := [set mod_Iirr (primeTI_Ires ptiLZ j) | j : Iirr (W2 / Z)].
- suffices /eqP-eq_Ichi: IchiZ == [set primeTI_Ires ptiL j | j : Iirr W2].
- move=> _ /seqIndP[k /setDP[_ kZ'k] ->].
- have [[j /irr_inj-Dk] | [] //] := prTIres_irr_cases ptiL k.
- have{j Dk} /imsetP[j _ Dk]: k \in IchiZ by rewrite eq_Ichi Dk mem_imset.
- by rewrite !inE Dk mod_IirrE ?cfker_mod in kZ'k.
- rewrite eqEcard !card_imset; last exact: prTIres_inj; first last.
- exact: inj_comp (morph_Iirr_inj _) (prTIres_inj _).
- apply/andP; split; last by rewrite !card_ord !NirrE (nclasses_isog isoW2).
- apply/subsetP=> k /imsetP[j _ Dk].
- have [[j1 /irr_inj->]|] := prTIres_irr_cases ptiL k; first exact: mem_imset.
- case=> /idPn[]; rewrite {k}Dk mod_IirrE ?cfIndMod ?cfMod_irr //.
- by rewrite cfInd_prTIres prTIred_not_irr.
- have [//|defX [tau2 cohX]]: X =i _ /\ coherent X L^# tau :=
- seqIndD_irr_coherence nsHL solH scohS odd_frobL1 _ irrX.
- have [[Itau2 Ztau2] Dtau2] := cohX.
- pose dvd_degrees_X (d : algC) := {in X, forall xi : 'CF(L), d %| xi 1%g}%C.
- have [xi1 Xxi1 dvd_xi1_1]: exists2 xi1, xi1 \in X & dvd_degrees_X (xi1 1%g).
- have /all_sig[e De] i: {e | 'chi[H]_i 1%g = (p ^ e)%:R}.
- have:= dvd_irr1_cardG i; rewrite irr1_degree dvdC_nat => dv_chi1_H.
- by have /p_natP[e ->] := pnat_dvd dv_chi1_H pH; exists e.
- have [_ /seqIndP[i0 IXi0 _]]: {phi | phi \in X}.
- by apply: seqIndD_nonempty; rewrite ?normal1 ?proper1G.
- pose xi1 := 'Ind[L] 'chi_[arg min_(i < i0 in Iirr_kerD H Z 1%G) e i].
- case: arg_minP => {i0 IXi0}//= i1 IXi1 min_i1 in xi1.
- exists xi1 => [|_ /seqIndP[i IXi ->]]; first by apply/seqIndP; exists i1.
- rewrite !cfInd1 // !De -!natrM dvdC_nat dvdn_pmul2l //.
- by rewrite dvdn_Pexp2l ?min_i1 ?prime_gt1.
- have nz_xi1_1: xi1 1%g != 0 by apply: seqInd1_neq0 Xxi1.
- pose d (xi : 'CF(L)) : algC := (truncC (xi 1%g / xi1 1%g))%:R.
- have{dvd_xi1_1} def_d xi: xi \in X -> xi 1%g = d xi * xi1 1%g.
- rewrite /d => Xxi; have Xge0 := Cnat_ge0 (Cnat_seqInd1 (_ : _ \in X)).
- by have /dvdCP_nat[||q ->] := dvd_xi1_1 xi Xxi; rewrite ?Xge0 ?mulfK ?natCK.
- have d_xi1: d xi1 = 1 by rewrite /d divff ?truncC1.
- have [_ [Itau /(_ _ _)/zcharW-Ztau] _ _ _] := scohS.
- have o_tauXY: orthogonal (map tau2 X) (map tau1 Y).
- exact: (coherent_ortho scohS).
- have [a Na xi1_1]: exists2 a, a \in Cnat & xi1 1%g = a * #|W1|%:R.
- have [i _ ->] := seqIndP Xxi1; rewrite cfInd1 // -oW1 mulrC.
- by exists ('chi_i 1%g); first apply: Cnat_irr1.
- pose psi1 := xi1 - a *: eta1.
- have Zpsi1: psi1 \in 'Z[S, L^#].
- rewrite zcharD1E !cfunE (uniY _ Yeta1) -xi1_1 subrr eqxx andbT.
- by rewrite rpredB ?rpredZ_Cnat ?mem_zchar ?(sXS _ Xxi1) // sYS.
- have [Y1 dY1 [X1 [dX1 _ oX1tauY]]] := orthogonal_split (map tau1 Y)(tau psi1).
- have{dX1 Y1 dY1 oYtau} [b Zb tau_psi1]: {b | b \in Cint &
- tau psi1 = X1 - a *: tau1 eta1 + b *: (\sum_(eta <- Y) tau1 eta)}.
- - exists ('[tau psi1, tau1 eta1] + a).
- by rewrite rpredD ?Cint_cfdot_vchar ?Cint_Cnat ?Ztau ?Ztau1 ?mem_zchar.
- rewrite [LHS]dX1 addrC -addrA; congr (_ + _).
- have{dY1} [_ -> ->] := orthonormal_span oYtau dY1.
- transitivity (\sum_(xi <- map tau1 Y) '[tau psi1, xi] *: xi).
- by apply/eq_big_seq=> xi ?; rewrite dX1 cfdotDl (orthoPl oX1tauY) ?addr0.
- rewrite big_map scaler_sumr !(big_rem eta1 Yeta1) /= addrCA addrA scalerDl.
- rewrite addrK; congr (_ + _); apply: eq_big_seq => eta.
- rewrite mem_rem_uniq // => /andP[eta1'eta /= Yeta]; congr (_ *: _).
- apply/(canRL (addNKr _)); rewrite addrC -2!raddfB /=.
- have Zeta: eta - eta1 \in 'Z[Y, L^#].
- by rewrite zcharD1E rpredB ?seqInd_zcharW //= !cfunE !uniY ?subrr.
- rewrite Dtau1 // Itau // ?(zchar_subset sYS) // cfdotBl cfdotZl.
- rewrite (span_orthogonal oXY) ?rpredB ?memv_span // add0r cfdotBr.
- by rewrite !oYY // !mulrb eqxx ifN_eqC // sub0r mulrN1 opprK.
- have oX: orthonormal X by apply: sub_orthonormal (irr_orthonormal L).
- have [_ oXX] := orthonormalP oX.
- have Zxi1Xd xi: xi \in X -> xi - d xi *: xi1 \in 'Z[X, L^#].
- move=> Xxi; rewrite zcharD1E !cfunE -def_d // subrr eqxx.
- by rewrite rpredB ?rpredZnat ?mem_zchar.
- pose psi := 'Res[L] (tau1 eta1); move Dc: '[psi, xi1] => c.
- have Zpsi: psi \in 'Z[irr L] by rewrite cfRes_vchar ?Ztau1 ?seqInd_zcharW.
- pose sumXd : 'CF(L) := \sum_(xi <- X) d xi *: xi.
- have{Dc} [xi2 Dpsi oxi2X]: {xi2 | psi = c *: sumXd + xi2 & orthogonal xi2 X}.
- exists (psi - c *: sumXd); first by rewrite addrC subrK.
- apply/orthoPl=> xi Xxi; rewrite cfdotBl cfdotZl cfproj_sum_orthonormal //.
- rewrite mulrC -[d xi]conjCK -Dc -cfdotZr -cfdotBr cfdot_Res_l -conjC0.
- rewrite -/tau rmorph_nat -Dtau2 ?Zxi1Xd // raddfB raddfZnat -/(d xi) cfdotC.
- by rewrite (span_orthogonal o_tauXY) ?rpredB ?rpredZ ?memv_span ?map_f.
- have Exi2 z: z \in Z -> xi2 z = xi2 1%g.
- rewrite [xi2]cfun_sum_constt => Zz; apply/cfker1; apply: subsetP z Zz.
- apply: subset_trans (cfker_sum _ _ _); rewrite subsetI sZL.
- apply/bigcapsP=> i; rewrite inE => xi2_i; rewrite cfker_scale_nz //.
- by apply: contraR xi2_i => X_i; rewrite (orthoPl oxi2X) // defX inE mem_irr.
- have Eba: '[psi, psi1] = b - a.
- rewrite cfdotC cfdot_Res_r -/tau tau_psi1 cfdotDl cfdotBl cfdotZl.
- rewrite (orthoPl oX1tauY) 1?oYYt ?map_f // eqxx sub0r addrC mulr1 rmorphB.
- by rewrite scaler_sumr cfproj_sum_orthonormal // aut_Cint // aut_Cnat.
- have{Eba oxi2X} Ebc: (a %| b - c)%C.
- rewrite -[b](subrK a) -Eba cfdotBr {1}Dpsi cfdotDl cfdotZl.
- rewrite cfproj_sum_orthonormal // (orthoPl oxi2X) // addr0 d_xi1 mulr1.
- rewrite addrC -addrA addKr addrC rpredB ?dvdC_refl //= cfdotZr aut_Cnat //.
- by rewrite dvdC_mulr // Cint_cfdot_vchar ?(seqInd_vcharW Yeta1).
- have DsumXd: sumXd = (xi1 1%g)^-1 *: (cfReg L - cfReg (L / Z) %% Z)%CF.
- apply/(canRL (scalerK nz_xi1_1))/(canRL (addrK _)); rewrite !cfReg_sum.
- pose kerZ := [pred i : Iirr L | Z \subset cfker 'chi_i].
- rewrite 2!linear_sum (bigID kerZ) (reindex _ (mod_Iirr_bij nsZL)) /= addrC.
- congr (_ + _).
- apply: eq_big => [i | i _]; first by rewrite mod_IirrE ?cfker_mod.
- by rewrite linearZ mod_IirrE // cfMod1.
- transitivity (\sum_(xi <- X) xi 1%g *: xi).
- by apply: eq_big_seq => xi Xxi; rewrite scalerA mulrC -def_d.
- rewrite (eq_big_perm [seq 'chi_i | i in [predC kerZ]]).
- by rewrite big_map big_filter.
- apply: uniq_perm_eq => // [|xi].
- by rewrite (map_inj_uniq irr_inj) ?enum_uniq.
- rewrite defX; apply/andP/imageP=> [[/irrP[i ->]] | [i]]; first by exists i.
- by move=> kerZ'i ->; rewrite mem_irr.
- have nz_a: a != 0 by have:= nz_xi1_1; rewrite xi1_1 mulf_eq0 => /norP[].
- have{psi Dpsi Zpsi xi2 Exi2 sumXd DsumXd} tau_eta1_Z z:
- z \in Z^# -> tau1 eta1 z - tau1 eta1 1%g = - c * #|H|%:R / a.
- - case/setD1P=> /negPf-ntz Zz; have Lz := subsetP sZL z Zz.
- transitivity (psi z - psi 1%g); first by rewrite !cfResE.
- rewrite Dpsi DsumXd !(cfRegE, cfunE) eqxx -opprB 2!mulrDr -[_ + xi2 _]addrA.
- rewrite Exi2 ?cfModE ?morph1 ?coset_id // ntz add0r addrK -mulNr mulrAC.
- by rewrite xi1_1 invfM -(sdprod_card defL) mulnC natrM !mulrA divfK ?neq0CG.
- have{tau_eta1_Z} dvH_cHa: (#|H| %| c * #|H|%:R / a)%C.
- have /dirrP[e [i /(canLR (signrZK e))Deta1]]: tau1 eta1 \in dirr G.
- by rewrite dirrE Ztau1 ?seqInd_zcharW //= oYYt ?map_f ?eqxx.
- have /set0Pn[z Zz]: Z^# != set0 by rewrite setD_eq0 subG1.
- have [z1 z2 Zz1 Zz2|_] := irrZmodH i _ z Zz.
- rewrite -Deta1 !cfunE; congr (_ * _); apply/(addIr (- tau1 eta1 1%g)).
- by rewrite !tau_eta1_Z.
- by rewrite -Deta1 !cfunE -mulrBr rpredMsign ?tau_eta1_Z ?mulNr ?rpredN.
- have{dvH_cHa} dv_ac: (a %| c)%C.
- by rewrite -(@dvdC_mul2r _ a) ?divfK // mulrC dvdC_mul2l ?neq0CG in dvH_cHa.
- have{c Ebc dv_ac} /dvdCP[q Zq Db]: (a %| b)%C by rewrite rpredBr in Ebc.
- have norm_psi1: '[psi1] = 1 + a ^+ 2.
- rewrite cfnormBd; last by rewrite cfdotZr (orthogonalP oXY) ?mulr0.
- by rewrite cfnormZ norm_Cnat // oXX // oYY // !eqxx mulr1.
- have{Zb oYYt} norm_tau_psi1: '[tau psi1] = '[X1] + a ^+ 2 * m_ub2 q.
- rewrite tau_psi1 -addrA cfnormDd /m_ub2; last first.
- rewrite addrC big_seq (span_orthogonal oX1tauY) ?memv_span1 //.
- by rewrite rpredB ?rpredZ ?rpred_sum // => *; rewrite memv_span ?map_f.
- congr (_ + _); transitivity (b ^+ 2 * m + a ^+ 2 - a * b *+ 2); last first.
- rewrite [RHS]mulrC [in RHS]addrC mulrBl sqrrB1 !addrA mulrDl !mul1r subrK.
- by rewrite mulrBl [m * _]mulrC mulrnAl mulrAC Db exprMn (mulrCA a) addrAC.
- rewrite addrC cfnormB !cfnormZ Cint_normK ?norm_Cnat // cfdotZr.
- rewrite cfnorm_map_orthonormal // -/m linear_sum cfproj_sum_orthonormal //.
- by rewrite oYYt ?map_f // eqxx mulr1 rmorphM conjCK aut_Cnat ?aut_Cint.
- have{norm_tau_psi1} mq2_lt2: m_ub2 q < 2%:R.
- suffices a2_gt1: a ^+ 2 > 1.
- have /ltr_pmul2l <-: a ^+ 2 > 0 by apply: ltr_trans a2_gt1.
- rewrite -(ltr_add2l '[X1]) -norm_tau_psi1 ltr_paddl ?cfnorm_ge0 //.
- by rewrite Itau // mulr_natr norm_psi1 ltr_add2r.
- suffices a_neq1: a != 1.
- rewrite expr_gt1 ?Cnat_ge0 // ltr_neqAle eq_sym a_neq1.
- by rewrite -(norm_Cnat Na) norm_Cint_ge1 ?Cint_Cnat.
- have /seqIndP[i1 /setDP[_ not_kerH'i1] Dxi1] := Xxi1.
- apply: contraNneq not_kerH'i1 => a_eq1; rewrite inE (subset_trans sZH') //.
- rewrite -lin_irr_der1 qualifE irr_char /= -(inj_eq (mulfI (neq0CiG L H))).
- by rewrite -cfInd1 // -Dxi1 xi1_1 a_eq1 mul1r mulr1 oW1.
- without loss{tau_psi1 Itau1 Ztau1 Dtau1 b q Db mq2_lt2 Zq} tau_psi1:
- tau1 cohY o_tauXY oX1tauY / tau psi1 = X1 - a *: tau1 eta1.
- - move=> IH; have [q0 | [q1 /eq_leq-szY2]] := m_ub2_lt2 q Zq mq2_lt2.
- by apply: (IH tau1) => //; rewrite tau_psi1 Db q0 mul0r scale0r addr0.
- have defY: perm_eq Y (eta1 :: eta1^*)%CF.
- have uYeta: uniq (eta1 :: eta1^*)%CF.
- by rewrite /= inE eq_sym (hasPn nrS) ?sYS.
- rewrite perm_eq_sym uniq_perm_eq //.
- have [|//]:= leq_size_perm uYeta _ szY2.
- by apply/allP; rewrite /= Yeta1 ccY.
- have memYtau1c: {subset [seq tau1 eta^* | eta <- Y]%CF <= map tau1 Y}.
- by move=> _ /mapP[eta Yeta ->]; rewrite /= map_f ?ccY.
- apply: IH (dual_coherence scohY cohY szY2) _ _ _.
- - rewrite (map_comp -%R) orthogonal_oppr.
- by apply/orthogonalP=> phi psi ? /memYtau1c; apply: (orthogonalP o_tauXY).
- - rewrite (map_comp -%R) orthogonal_oppr.
- by apply/orthoPl=> psi /memYtau1c; apply: (orthoPl oX1tauY).
- rewrite tau_psi1 (eq_big_perm _ defY) Db q1 /= mul1r big_cons big_seq1.
- by rewrite scalerDr addrA subrK -scalerN opprK.
- have [[Itau1 Ztau1] Dtau1] := cohY.
- have n1X1: '[X1] = 1.
- rewrite -(canLR (addrK _) norm_psi1) -Itau // tau_psi1.
- rewrite cfnormBd; last by rewrite cfdotZr (orthoPl oX1tauY) ?map_f ?mulr0.
- by rewrite cfnormZ norm_Cnat // Itau1 ?mem_zchar ?oYY // eqxx mulr1 addrK.
- without loss{Itau2 Ztau2 Dtau2} defX1: tau2 cohX o_tauXY / X1 = tau2 xi1.
- move=> IH; have ZX: {subset X <= 'Z[X]} by apply: seqInd_zcharW.
- have dirrXtau xi: xi \in X -> tau2 xi \in dirr G.
- by move=> Xxi; rewrite dirrE Ztau2 1?Itau2 ?ZX //= oXX ?eqxx.
- have dirrX1: X1 \in dirr G.
- rewrite dirrE n1X1 eqxx -(canLR (subrK _) tau_psi1).
- by rewrite rpredD ?rpredZ_Cnat ?(zcharW (Ztau _ _)) ?Ztau1 ?seqInd_zcharW.
- have{Zxi1Xd} oXdX1 xi: xi \in X -> xi != xi1 ->
- '[d xi *: tau2 xi1 - tau2 xi, X1] = d xi.
- - move=> Xxi xi1'xi; have ZXxi := Zxi1Xd xi Xxi.
- rewrite -(canLR (subrK _) tau_psi1) cfdotDr addrC.
- rewrite (span_orthogonal o_tauXY) ?rpredB ?rpredZ ?memv_span ?map_f //.
- rewrite add0r -opprB cfdotNl -{1}raddfZ_Cnat ?Cnat_nat // -raddfB.
- rewrite Dtau2 // Itau ?cfdotBr ?opprB //; last exact: zchar_subset ZXxi.
- rewrite (span_orthogonal oXY) ?rpredB ?rpredZ ?memv_span // sub0r.
- by rewrite cfdotBl cfdotZl opprB !oXX // eqxx mulr1 mulrb ifN ?subr0.
- pose xi3 := xi1^*%CF; have Xxi3: xi3 \in X by apply: ccX.
- have xi1'3: xi3 != xi1 by rewrite (hasPn nrS) ?sXS.
- have [| defX1]: X1 = tau2 xi1 \/ X1 = - tau2 xi3; first 2 [exact : IH].
- have d_xi3: d xi3 = 1 by rewrite /d cfunE conj_Cnat ?(Cnat_seqInd1 Xxi1).
- have:= oXdX1 xi3 Xxi3 xi1'3; rewrite d_xi3 scale1r.
- by apply: cfdot_add_dirr_eq1; rewrite // ?rpredN dirrXtau.
- have szX2: (size X <= 2)%N.
- apply: uniq_leq_size (xi1 :: xi3) uX _ => // xi4 Xxi4; rewrite !inE.
- apply: contraR (seqInd1_neq0 nsHL Xxi4) => /norP[xi1'4 xi3'4].
- rewrite def_d // -oXdX1 // defX1 cfdotNr cfdotBl cfdotZl opprB.
- by rewrite !Itau2 ?ZX ?oXX // !mulrb ifN ?ifN_eqC // mulr0 subr0 mul0r.
- apply: (IH _ (dual_coherence scohX cohX szX2)) defX1.
- apply/orthogonalP=> _ psi2 /mapP[xi Xxi -> /=] Ytau_psi2.
- by rewrite cfdotNl (orthogonalP o_tauXY) ?oppr0 // map_f ?ccX.
- rewrite -raddfZ_Cnat // defX1 in tau_psi1.
- apply: (bridge_coherent scohS ccsXS cohX ccsYS cohY X'Y) tau_psi1.
- by rewrite (zchar_on Zpsi1) rpredZ_Cnat ?mem_zchar.
-have{caseA_cohXY Itau1 Ztau1 Dtau1 oYYt} cohXY: coherent (X ++ Y) L^# tau.
- have [in_caseA | in_caseB] := boolP caseA; first exact: caseA_cohXY.
- have defZ: Z = W2 by rewrite /Z ifN.
- have /subsetIP[_ cZL] := caseB_sZZL in_caseB.
- have{in_caseB} [c2 _ _] := caseB_P in_caseB; move/(_ c2) in oRW.
- pose PtypeL := c2_ddA0 c2; pose w2 := #|W2|.
- have{c2_prW2} pr_w2: prime w2 := c2_prW2 c2.
- have /cyclicP[z0 cycZ]: cyclic Z by rewrite defZ prime_cyclic.
- have oz0: #[z0] = w2 by rewrite /w2 -defZ cycZ.
- have regYZ: {in Y & Z^#, forall (eta : 'CF(L)) x, tau1 eta x = tau1 eta z0}.
- rewrite cycZ => eta x Yeta /setD1P[ntx /cyclePmin[k lt_k_z0 Dx]].
- have{ntx} k_gt0: (0 < k)%N by case: (k) Dx ntx => // -> /eqP[].
- have{lt_k_z0} [cokw2 zz0_dv_w2]: coprime k w2 /\ #[z0] %| w2.
- by rewrite coprime_sym prime_coprime // -oz0 // gtnNdvd.
- have [u Du _]:= make_pi_cfAut G cokw2; rewrite Dx -Du ?Ztau1 ?mem_zchar //.
- have nAL: L \subset 'N(A) by have [_ /subsetIP[]] := normedTI_P tiA.
- pose ddA := restr_Dade_hyp PtypeL (subsetUl _ _) nAL.
- have{Dtau1} Dtau1: {in 'Z[Y, L^#], tau1 =1 Dade ddA}.
- by move=> phi Yphi/=; rewrite Dtau1 ?Dade_Ind ?(zcharD1_seqInd_on _ Yphi).
- have cohY_Dade: coherent_with Y L^# (Dade ddA) tau1 by [].
- rewrite (cfAut_Dade_coherent cohY_Dade) ?irrY //; last first.
- split; last exact: cfAut_seqInd.
- exact: seqInd_nontrivial_irr (irrY _ Yeta) (Yeta).
- rewrite -[cfAut u _](subrK eta) -opprB addrC raddfB !cfunE -[RHS]subr0.
- congr (_ - _); rewrite Dtau1 ?zcharD1_seqInd ?seqInd_sub_aut_zchar //.
- rewrite Dade_id; last by rewrite !inE -cycle_eq1 -cycle_subG -cycZ ntZ.
- rewrite !cfunE cfker1 ?aut_Cnat ?subrr ?(Cnat_seqInd1 Yeta) //.
- have [j /setDP[kerH'j _] Deta] := seqIndP Yeta; rewrite inE in kerH'j.
- by rewrite -cycle_subG -cycZ (subset_trans sZH') // Deta sub_cfker_Ind_irr.
- have [_ [Itau /(_ _ _)/zcharW-Ztau] oSS _ _] := scohS.
- pose gamma i : 'CF(L) := 'Ind[L] 'chi[Z]_i - #|H : Z|%:R *: eta1.
- have [Y1 tau_gamma defY1]: exists2 Y1 : 'CF(G), forall i : Iirr Z, i != 0 ->
- exists2 X1 : 'CF(G), orthogonal X1 (map tau1 Y)
- & tau (gamma i) = X1 - #|H : Z|%:R *: Y1
- & Y1 = tau1 eta1 \/ size Y = 2 /\ Y1 = dual_iso tau1 eta1.
- - pose psi1 := tau1 eta1; pose b := psi1 z0.
- pose a := (psi1 1%g - b) / #|Z|%:R.
- have sZG := subset_trans sZL sLG.
- have Dpsi1: 'Res[Z] psi1 = a *: cfReg Z + b%:A.
- apply/cfun_inP=> z Zz; rewrite cfResE // !(cfRegE, cfunE) cfun1E Zz mulr1.
- have [-> | ntz] := altP eqP; first by rewrite divfK ?neq0CG ?subrK.
- by rewrite mulr0 add0r regYZ // !inE ntz.
- have /dvdCP[x0 Zx0 Dx0]: (#|H : Z| %| a)%C.
- suffices dvH_p_psi1: (#|H| %| b - psi1 1%g)%C.
- rewrite -(@dvdC_mul2r _ #|Z|%:R) ?divfK ?neq0CG // -opprB rpredN /=.
- by rewrite -natrM mulnC Lagrange.
- have psi1Z z: z \in Z^# -> psi1 z = b by apply: regYZ.
- have /dirrP[e [i /(canLR (signrZK e))-Epsi1]]: psi1 \in dirr G.
- have [_ oYt] := orthonormalP oYtau.
- by rewrite dirrE oYt ?map_f // !eqxx Ztau1 ?seqInd_zcharW.
- have Zz: z0 \in Z^# by rewrite !inE -cycle_eq1 -cycle_subG -cycZ ntZ /=.
- have [z1 z2 Zz1 Zz2 |_] := irrZmodH i _ _ Zz.
- by rewrite -Epsi1 !cfunE !psi1Z.
- by rewrite -Epsi1 !cfunE -mulrBr rpredMsign psi1Z.
- pose x1 := '[eta1, 'Res psi1]; pose x := x0 + 1 - x1.
- have Zx: x \in Cint.
- rewrite rpredB ?rpredD // Cint_cfdot_vchar // ?(seqInd_vcharW Yeta1) //.
- by rewrite cfRes_vchar // Ztau1 ?seqInd_zcharW.
- pose Y1 := - \sum_(eta <- Y) (x - (eta == eta1)%:R) *: tau1 eta.
- have IndZfacts i: i != 0 ->
- [/\ 'chi_i 1%g = 1, 'Ind 'chi_i \in 'Z[X] & gamma i \in 'Z[S, L^#]].
- - move=> nzi; have /andP[_ /eqP-lin_i]: 'chi_i \is a linear_char.
- by rewrite lin_irr_der1 (derG1P _) ?sub1G // cycZ cycle_abelian.
- have Xchi: 'Ind 'chi_i \in 'Z[X].
- rewrite -(cfIndInd _ sHL) // ['Ind[H] _]cfun_sum_constt linear_sum.
- apply: rpred_sum => k k_i; rewrite linearZ rpredZ_Cint ?mem_zchar //=.
- by rewrite Cint_cfdot_vchar_irr // cfInd_vchar ?irr_vchar.
- rewrite mem_seqInd ?normal1 // !inE sub1G andbT.
- by rewrite -(sub_cfker_constt_Ind_irr k_i) // subGcfker.
- split=> //; rewrite zcharD1E !cfunE cfInd1 // uniY // lin_i mulr1.
- rewrite oW1 -natrM mulnC Lagrange_index // subrr eqxx andbT.
- by rewrite rpredB ?rpredZnat ?(zchar_subset sXS Xchi) ?mem_zchar ?sYS.
- have Dgamma (i : Iirr Z) (nzi : i != 0):
- exists2 X1 : 'CF(G), orthogonal X1 (map tau1 Y)
- & tau (gamma i) = X1 - #|H : Z|%:R *: Y1.
- - have [lin_i Xchi Zgamma] := IndZfacts i nzi.
- have Da: '[tau (gamma i), psi1] = a - #|H : Z|%:R * x1.
- rewrite !(=^~ cfdot_Res_r, cfdotBl) cfResRes // cfdotZl -/x1 Dpsi1.
- congr (_ - _); rewrite cfdotDr cfReg_sum cfdotC cfdotZl cfdotZr.
- rewrite -(big_tuple _ _ _ xpredT (fun xi : 'CF(Z) => xi 1%g *: xi)).
- rewrite cfproj_sum_orthonormal ?irr_orthonormal ?mem_irr // lin_i mulr1.
- rewrite -irr0 cfdot_irr (negPf nzi) mulr0 addr0.
- by rewrite aut_Cint // Dx0 rpredM ?rpred_nat.
- exists (tau (gamma i) + #|H : Z|%:R *: Y1); last by rewrite addrK.
- apply/orthoPl=> _ /mapP[eta Yeta ->].
- rewrite scalerN cfdotBl cfdotZl cfproj_sum_orthonormal // [x]addrAC.
- rewrite -addrA mulrDr mulrBr mulrC -Dx0 -Da opprD addrA -!raddfB /=.
- have Yeta_1: eta - eta1 \in 'Z[Y, L^#].
- by rewrite zcharD1E rpredB ?seqInd_zcharW //= !cfunE !uniY ?subrr.
- rewrite Dtau1 ?Itau // ?(zchar_subset sYS) // cfdotBl cfdotZl.
- rewrite (span_orthogonal oXY) ?(zchar_span Xchi) ?(zchar_span Yeta_1) //.
- by rewrite cfdotBr -mulrN opprB !oYY // eqxx eq_sym addrK.
- have [i0 nz_i0] := has_nonprincipal_irr ntZ.
- exists Y1 => //; have{Dgamma} [X1 oX1Y Dgamma] := Dgamma i0 nz_i0.
- have [lin_i Xchi Zgamma] := IndZfacts i0 nz_i0.
- have norm_gamma: '[tau (gamma i0)] = (#|L : Z| + #|H : Z| ^ 2)%:R.
- rewrite natrD Itau // cfnormBd; last first.
- rewrite (span_orthogonal oXY) ?(zchar_span Xchi) //.
- by rewrite memvZ ?memv_span.
- rewrite cfnorm_Ind_irr //; congr (#|_ : Z|%:R + _); last first.
- by rewrite cfnormZ oYY // eqxx mulr1 normCK rmorph_nat -natrM.
- by apply/setIidPl; rewrite (subset_trans _ (cent_sub_inertia _)) 1?centsC.
- have{norm_gamma} ub_norm_gamma: '[tau (gamma i0)] < (#|H : Z| ^ 2).*2%:R.
- rewrite norm_gamma -addnn ltr_nat ltn_add2r.
- rewrite -(Lagrange_index sHL) ?ltn_pmul2r // -[#|H : Z| ]prednK // ltnS.
- have frobL2: [Frobenius L / Z = (H / Z) ><| (W1 / Z)]%g.
- apply: (Frobenius_coprime_quotient defL nsZL) => //.
- split=> [|y W1y]; first exact: sub_proper_trans ltH'H.
- by rewrite defZ; have [/= ? [_ [_ _ _ ->]]] := PtypeL.
- have nZW1 := subset_trans sW1L nZL.
- have tiZW1: Z :&: W1 = 1%g by rewrite coprime_TIg ?(coprimeSg sZH).
- rewrite -oW1 (card_isog (quotient_isog nZW1 tiZW1)) -card_quotient //.
- rewrite dvdn_leq ?(Frobenius_dvd_ker1 frobL2) // -subn1 subn_gt0.
- by rewrite cardG_gt1; case/Frobenius_context: frobL2.
- have{ub_norm_gamma} ub_xm: m_ub2 x < 2%:R.
- have: '[Y1] < 2%:R.
- rewrite -2!(ltr_pmul2l (gt0CiG H Z)) -!natrM mulnA muln2.
- apply: ler_lt_trans ub_norm_gamma; rewrite Dgamma cfnormBd.
- by rewrite cfnormZ normCK rmorph_nat mulrA -subr_ge0 addrK cfnorm_ge0.
- rewrite (span_orthogonal oX1Y) ?memv_span1 ?rpredZ // rpredN big_seq.
- by apply/rpred_sum => eta Yeta; rewrite rpredZ ?memv_span ?map_f.
- rewrite cfnormN cfnorm_sum_orthonormal // (big_rem eta1) //= eqxx.
- congr (_ + _ < _); first by rewrite Cint_normK 1?rpredB ?rpred1.
- transitivity (\sum_(eta <- rem eta1 Y) x ^+ 2).
- rewrite rem_filter // !big_filter; apply/eq_bigr => eta /negPf->.
- by rewrite subr0 Cint_normK.
- rewrite big_const_seq count_predT // -Monoid.iteropE -[LHS]mulr_natl.
- by rewrite /m (perm_eq_size (perm_to_rem Yeta1)) /= mulrSr addrK.
- have [x_eq0 | [x_eq1 szY2]] := m_ub2_lt2 x Zx ub_xm.
- left; rewrite /Y1 x_eq0 (big_rem eta1) //= eqxx sub0r scaleN1r.
- rewrite big_seq big1 ?addr0 ?opprK => // eta.
- by rewrite mem_rem_uniq // => /andP[/negPf-> _]; rewrite subrr scale0r.
- have eta1'2: eta1^*%CF != eta1 by apply: seqInd_conjC_neq Yeta1.
- have defY: perm_eq Y (eta1 :: eta1^*%CF).
- have uY2: uniq (eta1 :: eta1^*%CF) by rewrite /= inE eq_sym eta1'2.
- rewrite perm_eq_sym uniq_perm_eq //.
- have sY2Y: {subset (eta1 :: eta1^*%CF) <= Y}.
- by apply/allP; rewrite /= cfAut_seqInd ?Yeta1.
- by have [|//]:= leq_size_perm uY2 sY2Y; rewrite szY2.
- right; split=> //; congr (- _); rewrite (eq_big_perm _ defY) /= x_eq1.
- rewrite big_cons big_seq1 eqxx (negPf eta1'2) subrr scale0r add0r subr0.
- by rewrite scale1r.
- have normY1: '[Y1] = 1.
- have [-> | [_ ->]] := defY1; first by rewrite oYYt ?eqxx ?map_f.
- by rewrite cfnormN oYYt ?eqxx ?map_f ?ccY.
- have YtauY1: Y1 \in 'Z[map tau1 Y].
- have [-> | [_ ->]] := defY1; first by rewrite mem_zchar ?map_f.
- by rewrite rpredN mem_zchar ?map_f ?ccY.
- have spanYtau1 := zchar_span YtauY1.
- have norm_eta1: '[eta1] = 1 by rewrite oYY ?eqxx.
- have /all_sig2[a Za Dxa] xi: {a | a \in Cnat
- & xi \in X -> xi 1%g = a * #|W1|%:R
- /\ (exists2 X1 : 'CF(G), orthogonal X1 (map tau1 Y)
- & tau (xi - a *: eta1) = X1 - a *: Y1)}.
- - case Xxi: (xi \in X); last by exists 0; rewrite ?rpred0.
- have /sig2_eqW[k /setDP[_ kerZ'k] def_xi] := seqIndP Xxi.
- rewrite inE in kerZ'k.
- pose a := 'chi_k 1%g; have Na: a \in Cnat by apply: Cnat_irr1.
- have Dxi1: xi 1%g = a * #|W1|%:R by rewrite mulrC oW1 def_xi cfInd1.
- exists a => // _; split=> //.
- have [i0 nzi0 Res_k]: exists2 i, i != 0 & 'Res[Z] 'chi_k = a *: 'chi_i.
- have [chi lin_chi defRkZ] := cfcenter_Res 'chi_k.
- have sZ_Zk: Z \subset 'Z('chi_k)%CF.
- by rewrite (subset_trans sZZH) // -cap_cfcenter_irr bigcap_inf.
- have{lin_chi} /irrP[i defRk]: 'Res chi \in irr Z.
- by rewrite lin_char_irr ?cfRes_lin_char.
- have{chi defRk defRkZ} defRk: 'Res[Z] 'chi_k = a *: 'chi_i.
- by rewrite -defRk -linearZ -defRkZ /= cfResRes ?cfcenter_sub.
- exists i => //; apply: contra kerZ'k => i_0; apply/constt0_Res_cfker=> //.
- by rewrite inE defRk cfdotZl cfdot_irr i_0 mulr1 irr1_neq0.
- set phi := 'chi_i0 in Res_k; pose a_ i := '['Ind[H] phi, 'chi_i].
- pose rp := irr_constt ('Ind[H] phi).
- have defIphi: 'Ind phi = \sum_(i in rp) a_ i *: 'chi_i.
- exact: cfun_sum_constt.
- have a_k: a_ k = a.
- by rewrite /a_ -cfdot_Res_r Res_k cfdotZr cfnorm_irr mulr1 conj_Cnat.
- have rp_k: k \in rp by rewrite inE ['[_, _]]a_k irr1_neq0.
- have resZr i: i \in rp -> 'Res[Z] 'chi_i = a_ i *: phi.
- rewrite constt_Ind_Res -/phi => /Clifford_Res_sum_cfclass-> //.
- have Na_i: a_ i \in Cnat by rewrite Cnat_cfdot_char ?cfInd_char ?irr_char.
- rewrite -/phi cfdot_Res_l cfdotC conj_Cnat {Na_i}//; congr (_ *: _).
- have <-: 'I_H['Res[Z] 'chi_k] = H.
- apply/eqP; rewrite eqEsubset subsetIl.
- by apply: subset_trans (sub_inertia_Res _ _); rewrite ?sub_Inertia.
- by rewrite Res_k inertia_scale_nz ?irr1_neq0 // cfclass_inertia big_seq1.
- have lin_phi: phi 1%g = 1.
- apply: (mulfI (irr1_neq0 k)); have /resZr/cfunP/(_ 1%g) := rp_k.
- by rewrite cfRes1 // cfunE mulr1 a_k.
- have Da_ i: i \in rp -> 'chi_i 1%g = a_ i.
- move/resZr/cfunP/(_ 1%g); rewrite cfRes1 // cfunE => ->.
- by rewrite lin_phi mulr1.
- pose chi i := 'Ind[L] 'chi[H]_i; pose alpha i := chi i - a_ i *: eta1.
- have Aalpha i: i \in rp -> alpha i \in 'CF(L, A).
- move=> r_i; rewrite cfun_onD1 !cfunE cfInd1 // (uniY _ Yeta1) -oW1.
- rewrite Da_ // mulrC subrr eqxx.
- by rewrite memvB ?cfInd_normal ?memvZ // (seqInd_on _ Yeta1).
- have [sum_alpha sum_a2]: gamma i0 = \sum_(i in rp) a_ i *: alpha i
- /\ \sum_(i in rp) a_ i ^+ 2 = #|H : Z|%:R.
- + set lhs1 := LHS; set lhs2 := (lhs in _ /\ lhs = _).
- set rhs1 := RHS; set rhs2 := (rhs in _ /\ _ = rhs).
- have eq_diff: lhs1 - rhs1 = (lhs2 - rhs2) *: eta1.
- rewrite scalerBl addrAC; congr (_ - _).
- rewrite -(cfIndInd _ sHL sZH) defIphi linear_sum -sumrB scaler_suml.
- apply: eq_bigr => i rp_i; rewrite linearZ scalerBr opprD addNKr.
- by rewrite opprK scalerA.
- have: (lhs1 - rhs1) 1%g == 0.
- rewrite !cfunE -(cfIndInd _ sHL sZH) !cfInd1 // lin_phi mulr1.
- rewrite -divgS // -(sdprod_card defL) mulKn // mulrC uniY // subrr.
- rewrite sum_cfunE big1 ?subrr // => i rp_i.
- by rewrite cfunE (cfun_on0 (Aalpha i rp_i)) ?mulr0 // !inE eqxx.
- rewrite eq_diff cfunE mulf_eq0 subr_eq0 (negPf (seqInd1_neq0 _ Yeta1)) //.
- rewrite orbF => /eqP-sum_a2; split=> //; apply/eqP; rewrite -subr_eq0.
- by rewrite eq_diff sum_a2 subrr scale0r.
- have Xchi i: i \in rp -> chi i \in X.
- move=> rp_i; apply/seqIndP; exists i => //; rewrite !inE sub1G andbT.
- apply: contra rp_i => kerZi; rewrite -cfdot_Res_r cfRes_sub_ker //.
- by rewrite cfdotZr -irr0 cfdot_irr (negPf nzi0) mulr0.
- have oRY i: i \in rp -> orthogonal (R (chi i)) (map tau1 Y).
- move/Xchi=> Xchi_i; rewrite orthogonal_sym.
- by rewrite (coherent_ortho_supp scohS) // ?sXS // (contraL (X'Y _)).
- have Za_ i: a_ i \in Cint.
- by rewrite Cint_cfdot_vchar_irr // cfInd_vchar ?irr_vchar.
- have Zeta1: eta1 \in 'Z[irr L] := seqInd_vcharW Yeta1.
- have Ztau_alpha i: tau (alpha i) \in 'Z[irr G].
- by rewrite !(cfInd_vchar, rpredB) ?irr_vchar ?rpredZ_Cint.
- have /all_tag2[X1 R_X1 /all_tag2[b Rb /all_sig2[Z1 oZ1R]]] i:
- {X1 : 'CF(G) & i \in rp -> X1 \in 'Z[R (chi i)]
- & {b : algC & i \in rp -> b \is Creal
- & {Z1 : 'CF(G) | i \in rp -> orthogonal Z1 (R (chi i))
- & tau (alpha i) = X1 - b *: Y1 + Z1 /\ '[Z1, Y1] = 0}}}.
- + have [X1 dX1 [YZ1 [dXYZ _ oYZ1R]]] :=
- orthogonal_split (R (chi i)) (tau (alpha i)).
- exists X1.
- have [_ _ _ Rok _] := scohS => /Xchi/sXS/Rok[ZR oRR _].
- have [_ -> ->] := orthonormal_span oRR dX1.
- rewrite big_seq rpred_sum // => aa Raa.
- rewrite rpredZ_Cint ?mem_zchar // -(canLR (addrK _) dXYZ) cfdotBl.
- by rewrite (orthoPl oYZ1R) // subr0 Cint_cfdot_vchar ?(ZR aa).
- pose b := - '[YZ1, Y1]; exists b => [rp_i|].
- rewrite Creal_Cint // rpredN -(canLR (addKr _) dXYZ) cfdotDl.
- rewrite (span_orthogonal (oRY i rp_i)) ?rpredN ?(zchar_span YtauY1) //.
- rewrite add0r Cint_cfdot_vchar // (zchar_trans_on _ YtauY1) //.
- by move=> _ /mapP[eta Yeta ->]; rewrite Ztau1 ?mem_zchar.
- exists (YZ1 + b *: Y1) => [/oRY-oRiY|]; last first.
- by rewrite addrCA subrK addrC cfdotDl cfdotZl normY1 mulr1 addrN.
- apply/orthoPl=> aa Raa; rewrite cfdotDl (orthoPl oYZ1R) // add0r.
- by rewrite cfdotC (span_orthogonal oRiY) ?conjC0 ?rpredZ // memv_span.
- case/all_and2=> defXbZ oZY1; have spanR_X1 := zchar_span (R_X1 _ _).
- have ub_alpha i: i \in rp ->
- [/\ '[chi i] <= '[X1 i]
- & '[a_ i *: eta1] <= '[b i *: Y1 - Z1 i] ->
- [/\ '[X1 i] = '[chi i], '[b i *: Y1 - Z1 i] = '[a_ i *: eta1]
- & exists2 E, subseq E (R (chi i)) & X1 i = \sum_(aa <- E) aa]].
- + move=> rp_i; apply: (subcoherent_norm scohS) (erefl _) _.
- * rewrite sXS ?Xchi ?rpredZ_Cint /orthogonal //; split=> //=.
- by rewrite !cfdotZr !(orthogonalP oXY) ?mulr0 ?eqxx ?ccX // Xchi.
- * have [[/(_ _ _)/char_vchar-Z_S _ _] IZtau _ _ _] := scohS.
- apply: sub_iso_to IZtau; [apply: zchar_trans_on | exact: zcharW].
- apply/allP; rewrite /= zchar_split (cfun_onS (setSD _ sHL)) ?Aalpha //.
- rewrite rpredB ?rpredZ_Cint ?mem_zchar ?(sYS eta1) // ?sXS ?Xchi //=.
- by rewrite sub_aut_zchar ?zchar_onG ?mem_zchar ?sXS ?ccX ?Xchi.
- suffices oYZ_R: orthogonal (b i *: Y1 - Z1 i) (R (chi i)).
- rewrite opprD opprK addrA -defXbZ cfdotC.
- by rewrite (span_orthogonal oYZ_R) ?memv_span1 ?spanR_X1 ?conjC0.
- apply/orthoPl=> aa Raa; rewrite cfdotBl (orthoPl (oZ1R i _)) // cfdotC.
- by rewrite subr0 (span_orthogonal (oRY i _)) ?conjC0 ?rpredZ // memv_span.
- have leba i: i \in rp -> b i <= a_ i.
- move=> rp_i; have ai_gt0: a_ i > 0 by rewrite -Da_ ?irr1_gt0.
- rewrite (ler_trans (real_ler_norm (Rb i _))) //.
- rewrite -(@ler_pexpn2r _ 2) ?qualifE ?(ltrW ai_gt0) ?norm_ger0 //.
- apply: ler_trans (_ : '[b i *: Y1 - Z1 i] <= _).
- rewrite cfnormBd; last by rewrite cfdotZl cfdotC oZY1 ?conjC0 ?mulr0.
- by rewrite cfnormZ normY1 mulr1 ler_addl cfnorm_ge0.
- rewrite -(ler_add2l '[X1 i]) -cfnormBd; last first.
- rewrite cfdotBr cfdotZr (span_orthogonal (oRY i _)) ?spanR_X1 //.
- rewrite mulr0 sub0r cfdotC.
- by rewrite (span_orthogonal (oZ1R i _)) ?raddf0 ?memv_span1 ?spanR_X1.
- have Salpha: alpha i \in 'Z[S, L^#].
- rewrite zcharD1_seqInd // zchar_split Aalpha // andbT.
- by rewrite rpredB ?rpredZ_Cint ?mem_zchar ?(sYS eta1) ?sXS ?Xchi.
- rewrite opprD opprK addrA -defXbZ ?Itau //.
- rewrite cfnormBd; last by rewrite cfdotZr (orthogonalP oXY) ?mulr0 ?Xchi.
- rewrite cfnormZ Cint_normK ?(oYY eta1) // eqxx mulr1 ler_add2r.
- by have lbX1i: '[chi i] <= '[X1 i] by have [] := ub_alpha i rp_i.
- have{leba} eq_ab: {in rp, a_ =1 b}.
- move=> i rp_i; apply/eqP; rewrite -subr_eq0; apply/eqP.
- apply: (mulfI (irr1_neq0 i)); rewrite mulr0 Da_ // mulrBr.
- move: i rp_i; apply: psumr_eq0P => [i rp_i | ].
- by rewrite subr_ge0 ler_pmul2l ?leba // -Da_ ?irr1_gt0.
- have [X2 oX2Y /(congr1 (cfdotr Y1))] := tau_gamma i0 nzi0.
- rewrite sumrB sum_a2 sum_alpha /tau linear_sum /= cfdot_suml cfdotBl.
- rewrite (span_orthogonal oX2Y) ?memv_span1 ?(zchar_span YtauY1) // add0r.
- rewrite cfdotZl normY1 mulr1 => /(canLR (@opprK _)) <-.
- rewrite -opprD -big_split big1 ?oppr0 //= => i rp_i.
- rewrite linearZ cfdotZl /= -/tau defXbZ addrC cfdotDl oZY1 addr0.
- rewrite cfdotBl cfdotZl normY1 mulr1 mulrBr addrC subrK.
- by rewrite (span_orthogonal (oRY i _)) ?spanR_X1 ?mulr0.
- exists (X1 k).
- apply/orthoPl=> psi /memv_span Ypsi.
- by rewrite (span_orthogonal (oRY k _)) // (zchar_span (R_X1 k rp_k)).
- apply/eqP; rewrite -/a def_xi -a_k defXbZ addrC -subr_eq0 eq_ab // addrK.
- rewrite -cfnorm_eq0 -(inj_eq (addrI '[b k *: Y1])).
- have [_ [|_]] := ub_alpha k rp_k.
- rewrite cfnormBd; last by rewrite cfdotZl cfdotC oZY1 conjC0 mulr0.
- by rewrite addrC !cfnormZ eq_ab // normY1 norm_eta1 ler_addr cfnorm_ge0.
- rewrite cfnormBd; last by rewrite cfdotZl cfdotC oZY1 conjC0 mulr0.
- by move=> -> _; rewrite addr0 !cfnormZ eq_ab // normY1 norm_eta1.
- have scohXY: subcoherent (X ++ Y) tau R.
- apply/(subset_subcoherent scohS).
- split; first by rewrite cat_uniq uX uY andbT; apply/hasPn.
- by move=> xi; rewrite mem_cat => /orP[/sXS | /sYS].
- by move=> xi; rewrite !mem_cat => /orP[/ccX-> | /ccY->]; rewrite ?orbT.
- have XYeta1: eta1 \in X ++ Y by rewrite mem_cat Yeta1 orbT.
- have Z_Y1: Y1 \in 'Z[irr G].
- by case: defY1 => [|[_]] ->; rewrite ?rpredN Ztau1 ?mem_zchar ?ccY.
- apply: pivot_coherence scohXY XYeta1 Z_Y1 _ _; rewrite norm_eta1 //.
- move=> xi /andP[eta1'xi]; rewrite /= mem_cat => /orP[Xxi | Yxi].
- have [Da1 [X1 oX1Y tauX1]] := Dxa _ Xxi.
- exists (a xi); first by rewrite (uniY _ Yeta1).
- rewrite -/tau {}tauX1 cfdotBl cfdotZl normY1 !mulr1.
- by rewrite (span_orthogonal oX1Y) ?add0r ?memv_span1.
- exists 1; first by rewrite rpred1 mul1r !uniY.
- rewrite scale1r mulr1 -/tau -Dtau1 ?raddfB ?cfdotBl; last first.
- by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE !uniY ?subrr.
- have [-> | [szY2 ->]] := defY1; rewrite ?cfdotNr !Itau1 ?mem_zchar ?ccY //.
- by rewrite !oYY // eqxx (negPf eta1'xi) add0r.
- pose Y2 := eta1 :: eta1^*%CF; suffices: xi \in Y2.
- rewrite opprK !inE (negPf eta1'xi) /= => /eqP->.
- by rewrite !oYY ?ccY // !mulrb eqxx ifN_eqC ?(hasPn nrS) ?sYS ?addr0.
- have /leq_size_perm: {subset Y2 <= Y} by apply/allP; rewrite /= Yeta1 ccY.
- by case=> [||->]; rewrite ?szY2 //= inE eq_sym (hasPn nrS) ?sYS.
-pose S1 := [::] ++ X ++ Y; set S2 := [::] in S1; rewrite -[X ++ Y]/S1 in cohXY.
-have ccsS1S: cfConjC_subset S1 S.
- rewrite /S1 /=; split; first by rewrite cat_uniq uX uY andbT; apply/hasPn.
- by apply/allP; rewrite all_cat !(introT allP).
- by move=> xi; rewrite !mem_cat => /orP[/ccX|/ccY]->; rewrite ?orbT.
-move: {2}_.+1 (leq_addr (size S1) (size S).+1) => n.
-elim: n => // [|n IHn] in (S2) S1 ccsS1S cohXY * => lb_n.
- by rewrite ltnNge ?uniq_leq_size // in lb_n; have [] := ccsS1S.
-have sXYS1: {subset X ++ Y <= S1} by apply/mem_subseq/suffix_subseq.
-without loss /allPn[psi /= Spsi notS1psi]: / ~~ all (mem S1) S.
- by case: allP => [/subset_coherent-cohS _ | _ cohS]; apply: cohS.
-apply: (IHn [:: psi, psi^* & S2]%CF) => [|{lb_n}|]; last by rewrite !addnS leqW.
- by have [_ _ ccS] := uccS; apply: extend_cfConjC_subset.
-have /seqIndC1P[i nzi Dpsi] := Spsi.
-have ltZH': Z \proper H'.
- rewrite properEneq (contraNneq _ notS1psi) // => eqZH'; apply: sXYS1.
- rewrite mem_cat Dpsi !mem_seqInd ?normal1 //.
- by rewrite !inE sub1G andbT subGcfker nzi eqZH' orNb.
-have Seta1: eta1 \in S1 by rewrite !mem_cat Yeta1 !orbT.
-apply: (extend_coherent scohS ccsS1S Seta1) => {Seta1}//; split=> //.
- rewrite (uniY _ Yeta1) Dpsi cfInd1 // oW1 dvdC_mulr //.
- by rewrite Cint_Cnat ?Cnat_irr1.
-rewrite !big_cat /= addrCA sum_seqIndD_square ?normal1 ?sub1G // ltr_spaddr //.
- have /irrY/irrP[j Deta1] := Yeta1; have [_ sS1S _] := ccsS1S.
- rewrite (big_rem eta1 Yeta1) addrCA -big_cat big_seq ltr_spaddl //=.
- by rewrite Deta1 cfnorm_irr divr1 exprn_gt0 ?irr1_gt0.
- apply/sumr_ge0=> phi YS2phi; rewrite divr_ge0 ?cfnorm_ge0 ?exprn_ge0 //.
- rewrite char1_ge0 ?(seqInd_char (sS1S _ _)) //.
- by move: YS2phi; rewrite !mem_cat => /orP[-> | /mem_rem->]; rewrite ?orbT.
-rewrite indexg1 -(Lagrange_index sHL sZH) -oW1 natrM mulrC -mulrA.
-rewrite uniY ?ler_wpmul2l ?ler0n -?(@natrB _ _ 1) // -natrM.
-suffices ubW1: (#|W1|.*2 ^ 2 <= #|H : Z| * (#|Z| - 1) ^ 2)%N.
- have chi1_ge0: 0 <= 'chi_i 1%g by rewrite char1_ge0 ?irr_char.
- rewrite Dpsi cfInd1 // -oW1 -(@ler_pexpn2r _ 2) ?rpredM ?rpred_nat //.
- rewrite -natrX expnMn mulnAC natrM mulrA -natrM exprMn -natrX mul2n.
- rewrite ler_pmul ?ler0n ?exprn_ge0 ?(ler_trans (irr1_bound i)) ?ler_nat //.
- rewrite dvdn_leq ?indexgS ?(subset_trans sZZH) //=.
- by rewrite -cap_cfcenter_irr bigcap_inf.
-have nZW1 := subset_trans sW1L nZL.
-have tiZW1: Z :&: W1 = 1%g by rewrite coprime_TIg ?(coprimeSg sZH).
-have [in_caseA | in_caseB] := boolP caseA.
- rewrite (leq_trans _ (leq_pmull _ _)) ?leq_exp2r // subn1 -ltnS prednK //.
- suffices frobZW1: [Frobenius Z <*> W1 = Z ><| W1].
- by apply: ltn_odd_Frobenius_ker frobZW1 (oddSg _ oddL); apply/joing_subP.
- have [|/c2_ptiL[_ _ prW1H _]] := boolP case_c1; first exact: Frobenius_subl.
- apply/Frobenius_semiregularP; rewrite ?sdprodEY // => x W1x; apply/trivgP.
- by rewrite /= -(setIidPl sZH) -setIA -(trivgP in_caseA) prW1H ?setSI.
-rewrite (leq_trans _ (leq_pmulr _ _)) ?expn_gt0 ?orbF ?subn_gt0 ?cardG_gt1 //.
-rewrite -(Lagrange_index sH'H sZH') leq_mul // ltnW //.
- have tiH'W1: H' :&: W1 = 1%g by rewrite coprime_TIg ?(coprimeSg sH'H).
- rewrite (card_isog (quotient_isog (subset_trans sW1L nH'L) tiH'W1)).
- rewrite -card_quotient ?gFnorm // (ltn_odd_Frobenius_ker frobL1) //.
- exact: quotient_odd.
-suffices frobHW1Z: [Frobenius (H' / Z) <*> (W1 / Z) = (H' / Z) ><| (W1 / Z)].
- rewrite (card_isog (quotient_isog nZW1 tiZW1)).
- rewrite -card_quotient ?(subset_trans sH'H) //.
- apply: ltn_odd_Frobenius_ker frobHW1Z (oddSg _ (quotient_odd Z oddL)).
- by rewrite join_subG !quotientS.
-suffices: [Frobenius (L / Z) = (H / Z) ><| (W1 / Z)].
- apply: Frobenius_subl (quotientS Z sH'H) _.
- by rewrite quotient_neq1 // (normalS sZH' sH'H).
- by rewrite quotient_norms ?(subset_trans sW1L).
-apply: (Frobenius_coprime_quotient defL nsZL) => //.
-split=> [|x W1x]; first exact: sub_proper_trans sZH' ltH'H.
-by rewrite /Z ifN //; have /caseB_P[/c2_ptiL[_ _ ->]] := in_caseB.
-Qed.
-
-End Six.
-
-
diff --git a/mathcomp/odd_order/PFsection7.v b/mathcomp/odd_order/PFsection7.v
deleted file mode 100644
index 559ed7c..0000000
--- a/mathcomp/odd_order/PFsection7.v
+++ /dev/null
@@ -1,828 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime ssralg poly finset center.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action zmodp.
-From mathcomp
-Require Import gfunctor gproduct cyclic pgroup commutator nilpotent frobenius.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation BGsection3 vector.
-From mathcomp
-Require Import ssrnum algC classfun character inertia vcharacter.
-From mathcomp
-Require Import PFsection1 PFsection2 PFsection4 PFsection5 PFsection6.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 7: *)
-(* Non-existence of a Certain Type of Group of Odd Order *)
-(* Defined here: *)
-(* inDade ddA == the right inverse to the Dade isometry with respect to G, *)
-(* L, A, given ddA : Dade_hypothesis G L A. *)
-(* phi^\rho == locally-bindable Notation for invDade ddA phi. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory Num.Theory.
-Local Open Scope ring_scope.
-
-Reserved Notation "alpha ^\rho" (at level 2, format "alpha ^\rho").
-
-Section Seven.
-
-Variables (gT : finGroupType) (G : {group gT}).
-Implicit Types (L H P : {group gT}) (DH : gT -> {group gT}).
-
-(* Properties of the inverse to the Dade isometry (Peterfalvi (7.1) to (7.3). *)
-Section InverseDade.
-
-Variables (A : {set gT}) (L : {group gT}).
-Hypothesis ddA : Dade_hypothesis G L A.
-
-Local Notation "alpha ^\tau" := (Dade ddA alpha).
-Local Notation Atau := (Dade_support ddA).
-Local Notation H := (Dade_signalizer ddA).
-
-Let nsAL : A <| L. Proof. by have [] := ddA. Qed.
-Let sAL : A \subset L. Proof. exact: normal_sub nsAL. Qed.
-Let nAL : L \subset 'N(A). Proof. exact: normal_norm nsAL. Qed.
-Let sLG : L \subset G. Proof. by have [] := ddA. Qed.
-
-(* This is the Definition embedded in Peterfalvi, Hypothesis (7.1). *)
-Fact invDade_subproof (chi : 'CF(G)) :
- is_class_fun <<L>>
- [ffun a => #|H a|%:R^-1 * (\sum_(x in H a) chi (x * a)%g) *+ (a \in A)].
-Proof.
-rewrite genGid; apply: intro_class_fun => [x y Lx Ly | x notLx]; last first.
- by rewrite (contraNF (subsetP sAL x)).
-rewrite memJ_norm ?(subsetP nAL) // !mulrb; case: ifP => // Ax.
-rewrite (DadeJ ddA) // cardJg; congr (_ * _).
-rewrite big_imset /= => [|z y0 _ _ /=]; last exact: conjg_inj.
-by apply: eq_bigr => u Hu; rewrite -conjMg cfunJ // (subsetP sLG).
-Qed.
-Definition invDade alpha := Cfun 1 (invDade_subproof alpha).
-
-Local Notation "alpha ^\rho" := (invDade alpha).
-
-Fact invDade_is_linear : linear invDade.
-Proof.
-move=> mu alpha beta; apply/cfunP=> a; rewrite !cfunElock.
-rewrite mulrnAr -mulrnDl mulrCA -mulrDr; congr (_ * _ *+ _).
-by rewrite big_distrr -big_split; apply: eq_bigr => x _; rewrite !cfunE.
-Qed.
-Canonical invDade_linear := Linear invDade_is_linear.
-Canonical invDade_additive := Additive invDade_is_linear.
-
-Lemma invDade_on chi : chi^\rho \in 'CF(L, A).
-Proof. by apply/cfun_onP=> x notAx; rewrite cfunElock (negPf notAx). Qed.
-
-Lemma invDade_cfun1 : 1^\rho = '1_A.
-Proof.
-apply/cfunP=> x; rewrite cfuniE // cfunElock mulrb; case: ifP => //= Ax.
-apply: canLR (mulKf (neq0CG _)) _; rewrite mulr1 -sumr_const.
-apply: eq_bigr => u Hu; rewrite cfun1E (subsetP (subsetIl G 'C[x])) //.
-have /sdprodP[_ <- _ _] := Dade_sdprod ddA Ax.
-by rewrite mem_mulg // inE cent1id (subsetP sAL).
-Qed.
-
-(* This is Peterfalvi (2.7), restated using invDade. *)
-Lemma invDade_reciprocity chi alpha :
- alpha \in 'CF(L, A) -> '[alpha^\tau, chi] = '[alpha, chi^\rho].
-Proof.
-move=> Aalpha; apply: general_Dade_reciprocity => //= a Aa.
-by rewrite cfunElock Aa.
-Qed.
-
-(* This is Peterfalvi (7.2)(a). *)
-Lemma DadeK alpha : alpha \in 'CF(L, A) -> (alpha^\tau)^\rho = alpha.
-Proof.
-move=> Aalpha; apply/cfunP=> a; rewrite cfunElock mulrb.
-case: ifPn => [Aa | /cfun_on0-> //]; apply: canLR (mulKf (neq0CG _)) _.
-rewrite mulr_natl -sumr_const; apply: eq_bigr => x Hx.
-by rewrite (DadeE _ Aa) ?mem_class_support // mem_mulg ?set11.
-Qed.
-
-(* This is Peterfalvi (7.2)(b); note that by (7.2)(a) chi is in the image of *)
-(* tau iff chi = (chi^\rho)^\tau, and this condition is easier to write. *)
-Lemma leC_norm_invDade chi :
- '[chi^\rho] <= '[chi] ?= iff (chi == (chi^\rho)^\tau).
-Proof.
-have Achi_rho := invDade_on chi; rewrite -(Dade_isometry ddA) //.
-set chi1 := _^\tau; rewrite -subr_eq0 -cfnorm_eq0; set mu := chi - chi1.
-have owv: '[chi1, mu] = 0.
- by rewrite invDade_reciprocity ?raddfB //= DadeK ?subrr.
-rewrite -(subrK chi1 chi) -/mu addrC cfnormD owv conjC0 !addr0.
-split; first by rewrite -subr_ge0 addrC addKr cfnorm_ge0.
-by rewrite eq_sym addrC -subr_eq0 addrK.
-Qed.
-
-(* This is Peterfalvi (7.3). *)
-Lemma leC_cfnorm_invDade_support chi :
- '[chi^\rho] <= #|G|%:R^-1 * (\sum_(g in Atau) `|chi g| ^+ 2)
- ?= iff [forall a in A, forall u in H a, chi (u * a)%g == chi a].
-Proof.
-have nsAtauG: Atau <| G := Dade_support_normal ddA.
-pose chi1 := chi * '1_Atau; set RHS := _ * _.
-have inA1 a x: a \in A -> x \in H a -> (x * a)%g \in Dade_support1 ddA a.
- by move=> Aa Hx; rewrite mem_class_support ?mem_mulg ?set11.
-have chi1E a x: a \in A -> x \in H a -> chi1 (x * a)%g = chi (x * a)%g.
- move=> Aa Hx; rewrite cfunE cfuniE // mulr_natr mulrb.
- by case: bigcupP => // [[]]; exists a; rewrite ?inA1.
-have ->: chi^\rho = chi1^\rho.
- apply/cfunP => a; rewrite !cfunElock !mulrb; case: ifP => // Aa.
- by congr (_ * _); apply: eq_bigr => x /chi1E->.
-have Achi1: chi1 \in 'CF(G, Atau).
- by apply/cfun_onP=> x ?; rewrite cfunE (cfun_onP (cfuni_on _ _)) ?mulr0.
-have{Achi1 RHS} <-: '[chi1] = RHS.
- rewrite (cfnormE Achi1); congr (_ * _).
- by apply: eq_bigr => x Atau_x; rewrite cfunE cfuniE // Atau_x mulr1.
-congr (_ <= _ ?= iff _): (leC_norm_invDade chi1).
-apply/eqP/forall_inP=> [chi1_id a Aa | chi_id].
- apply/forall_inP => x Ha_x; rewrite -{2}[a]mul1g -!chi1E // chi1_id mul1g.
- by rewrite (DadeE _ Aa) ?inA1 ?Dade_id.
-apply/cfunP => g; rewrite cfunE cfuniE // mulr_natr mulrb.
-case: ifPn => [/bigcupP[a Aa] | /(cfun_onP (Dade_cfunS _ _))-> //].
-case/imset2P=> _ z /rcosetP[x Hx ->] Gz ->{g}; rewrite !cfunJ {z Gz}//.
-have{chi_id} chi_id := eqP (forall_inP (chi_id a Aa) _ _).
-rewrite chi_id // (DadeE _ Aa) ?inA1 {x Hx}// cfunElock mulrb Aa.
-apply: canRL (mulKf (neq0CG _)) _; rewrite mulr_natl -sumr_const.
-by apply: eq_bigr => x Hx; rewrite chi1E ?chi_id.
-Qed.
-
-(* This is the norm expansion embedded in Peterfalvi (7.3). *)
-Lemma cfnormE_invDade chi :
- '[chi^\rho] = #|L|%:R^-1 * (\sum_(a in A) `|chi^\rho a| ^+ 2).
-Proof. by apply: cfnormE; apply: invDade_on. Qed.
-
-End InverseDade.
-
-(* Hypothesis (7.4) and Lemma (7.5). *)
-Section DadeCoverInequality.
-
-(* These declarations correspond to Peterfalvi, Hypothesis (7.4); as it is *)
-(* only instantiated twice after this section we leave it unbundled. *)
-Variables (I : finType) (L : I -> {group gT}) (A : I -> {set gT}).
-Hypothesis ddA : forall i : I, Dade_hypothesis G (L i) (A i).
-
-Local Notation Atau i := (Dade_support (ddA i)).
-Local Notation "alpha ^\rho" := (invDade (ddA _) alpha).
-Hypothesis disjointA : forall i j, i != j -> [disjoint Atau i & Atau j].
-
-(* This is Peterfalvi (7.5), generalised to all class functions of norm 1. *)
-Lemma Dade_cover_inequality (chi : 'CF(G)) (G0 := G :\: \bigcup_i Atau i) :
- '[chi] = 1 ->
- #|G|%:R^-1 * (\sum_(g in G0) `|chi g| ^+ 2 - #|G0|%:R)
- + \sum_i ('[chi^\rho]_(L i) - #|A i|%:R / #|L i|%:R) <= 0.
-Proof.
-move=> Nchi1; set vG := _^-1; rewrite sumrB /= addrCA mulrBr -addrA.
-pose F (xi : 'CF(G)) (B : {set gT}) := vG * \sum_(g in B) `|xi g| ^+ 2.
-have sumF xi: F xi G0 + \sum_i F xi (Atau i) = '[xi].
- rewrite (cfnormE (cfun_onG _)) -mulr_sumr -mulrDr; congr (_ * _).
- rewrite -partition_disjoint_bigcup //=; set U_A := \bigcup_i _.
- have sUG: U_A \subset G by apply/bigcupsP=> i _; apply: Dade_support_sub.
- by rewrite -(setIidPr sUG) addrC -big_setID.
-have ->: \sum_i #|A i|%:R / #|L i|%:R = \sum_i F 1 (Atau i).
- apply: eq_bigr => i _; apply/eqP; rewrite /F.
- have [[/andP[sAL nAL] _ _ _ _] sHG] := (ddA i, Dade_signalizer_sub (ddA i)).
- rewrite -{1}[A i]setIid -cfdot_cfuni /normal ?sAL // -(invDade_cfun1 (ddA i)).
- rewrite leC_cfnorm_invDade_support; apply/forall_inP=> a Aa.
- by apply/forall_inP=> x Hx; rewrite !cfun1E groupMl // (subsetP (sHG a)).
-have ->: vG * #|G0|%:R = F 1 G0.
- congr (_ * _); rewrite -sumr_const; apply: eq_bigr => x /setDP[Gx _].
- by rewrite cfun1E Gx normr1 expr1n.
-rewrite -opprD sumF cfnorm1 -Nchi1 -sumF opprD addNKr -oppr_ge0 opprB -sumrB.
-by rewrite sumr_ge0 // => i _; rewrite subr_ge0 leC_cfnorm_invDade_support.
-Qed.
-
-(*
-set vG := _^-1; rewrite sumrB /= addrCA mulrBr -addrA.
-pose F t (B : {set gT}) := vG * \sum_(g in B) `|'chi[G]_t g| ^+ 2.
-have sumF t: F t G0 + \sum_i F t (Atau i) = 1.
- rewrite -(cfnorm_irr t) (cfnormE (cfun_onG _)) -mulr_sumr -mulrDr.
- congr (_ * _); rewrite -partition_disjoint_bigcup //=; set U_A := \bigcup_i _.
- have sUG: U_A \subset G by apply/bigcupsP=> i _; apply: Dade_support_sub.
- by rewrite -(setIidPr sUG) addrC -big_setID.
-have ->: \sum_i #|A i|%:R / #|L i|%:R = \sum_i F 0 (Atau i).
- apply: eq_bigr => i _; apply/eqP; rewrite /F irr0.
- have [[/andP[sAL nAL] _ _ _ _] sHG] := (ddA i, Dade_signalizer_sub (ddA i)).
- rewrite -{1}[A i]setIid -cfdot_cfuni /normal ?sAL // -(invDade_cfun1 (ddA i)).
- rewrite leC_cfnorm_invDade_support; apply/forall_inP=> a Aa.
- by apply/forall_inP=> x Hx; rewrite !cfun1E groupMl // (subsetP (sHG a)).
-have ->: vG * #|G0|%:R = F 0 G0.
- congr (_ * _); rewrite -sumr_const; apply: eq_bigr => x /setDP[Gx _].
- by rewrite irr0 cfun1E Gx normr1 expr1n.
-rewrite -opprD sumF -(sumF r) opprD addNKr -oppr_ge0 opprB -sumrB.
-by rewrite sumr_ge0 // => i _; rewrite subr_ge0 leC_cfnorm_invDade_support.
-Qed.
-*)
-
-End DadeCoverInequality.
-
-(* Hypothesis (7.6), and Lemmas (7.7) and (7.8) *)
-Section Dade_seqIndC1.
-
-(* In this section, A = H^# with H <| L. *)
-Variables L H : {group gT}.
-Let A := H^#.
-Hypothesis ddA : Dade_hypothesis G L A.
-
-Local Notation Atau := (Dade_support ddA).
-Local Notation "alpha ^\tau" := (Dade ddA alpha).
-Local Notation "alpha ^\rho" := (invDade ddA alpha).
-
-Let calT := seqIndT H L.
-Local Notation calS := (seqIndD H L H 1).
-Local Notation Ind1H := ('Ind[gval L, gval H] 1).
-Let uniqS : uniq calS := seqInd_uniq _ _.
-
-Let h := #|H|%:R : algC.
-Let e := #|L : H|%:R : algC.
-
-Let nsAL : A <| L. Proof. by have [] := ddA. Qed.
-Let sLG : L \subset G. Proof. by have [] := ddA. Qed.
-Let nsHL : H <| L. Proof. by rewrite -normalD1. Qed.
-Let sHL := normal_sub nsHL.
-Let nHL := normal_norm nsHL.
-
-Let nzh : h != 0 := neq0CG H.
-Let nze : e != 0 := neq0CiG L H.
-Let nzL : #|L|%:R != 0 := neq0CG L.
-
-Let eh : e * h = #|L|%:R. Proof. by rewrite -natrM mulnC Lagrange. Qed.
-
-Section InvDadeSeqInd.
-
-Variables (xi0 : 'CF(L)) (S : seq 'CF(L)) (chi : 'CF(G)).
-Implicit Types xi mu : 'CF(L).
-
-Let d xi := xi 1%g / xi0 1%g.
-Let psi xi := xi - d xi *: xi0.
-Let c xi := '[(psi xi)^\tau, chi].
-
-Let uc c xi mu := (c xi)^* * c mu / ('[xi] * '[mu]).
-Let u c xi mu := uc c xi mu * ('[xi, mu] - xi 1%g * mu 1%g / (e * h)).
-
-(* This is Peterfalvi (7.7); it is stated using a bespoke concrete Prop so as *)
-(* to encapsulate the coefficient definitions given above. *)
-CoInductive is_invDade_seqInd_sum : Prop :=
- InvDadeSeqIndSum (c := c) (u := u c) of
- (*a*) {in A, forall x, (chi^\rho) x = \sum_(xi <- S) (c xi)^* / '[xi] * xi x}
- & (*b*) '[chi^\rho] = \sum_(xi <- S) \sum_(mu <- S) u xi mu.
-
-Lemma invDade_seqInd_sum : perm_eq calT (xi0 :: S) -> is_invDade_seqInd_sum.
-Proof.
-move=> defT; pose chi0 := \sum_(xi <- S) (c xi)^* / '[xi] *: xi.
-have Txi0: xi0 \in calT by rewrite (perm_eq_mem defT) mem_head.
-have sST : {subset S <= calT}.
- by move=> xi Sxi; rewrite (perm_eq_mem defT) mem_behead.
-have nz_xi01 : xi0 1%g != 0 by apply: seqInd1_neq0 Txi0.
-have part_a: {in A, chi^\rho =1 chi0}.
- pose phi := (chi^\rho - chi0) * '1_A.
- have Aphi : phi \in 'CF(L, A) := mul_cfuni_on A _.
- suffices: '[phi, chi^\rho - chi0] == 0; last clearbody phi.
- rewrite -(eq_cfdotr Aphi (eq_mul_cfuni _ nsAL)) cfnorm_eq0 => /eqP phi0.
- by move=> x Ax; rewrite -[chi0]add0r -phi0 cfunE eq_mul_cfuni ?cfunE ?subrK.
- have{Aphi} [Hphi phi1]: phi \in 'CF(L, H) /\ phi 1%g = 0.
- by move: Aphi; rewrite cfun_onD1 => /andP[-> /eqP].
- have{Hphi} def_phi: phi = e^-1 *: 'Ind ('Res[H] phi).
- apply/cfunP=> y; have [Hy | notHy] := boolP (y \in H); last first.
- by rewrite cfunE !(cfun_on0 _ notHy) ?mulr0 ?cfInd_normal.
- rewrite cfunE cfIndE // mulrA -invfM eh.
- apply: (canRL (mulKf nzL)); rewrite mulr_natl -sumr_const.
- by apply: eq_bigr => z Lz; rewrite cfResE ?memJ_norm ?cfunJ ?(subsetP nHL).
- have{def_phi} Tphi: phi \in <<calT>>%VS.
- rewrite def_phi memvZ // ['Res _]cfun_sum_cfdot linear_sum.
- apply: memv_suml => i _; rewrite linearZ memvZ ?memv_span //=.
- by apply/seqIndP; exists i; rewrite ?inE.
- have{Tphi} [z def_phi _] := free_span (seqInd_free nsHL _) Tphi.
- have {phi def_phi phi1} ->: phi = \sum_(xi <- S) z xi *: psi xi.
- rewrite def_phi (eq_big_perm _ defT) !big_cons /= 2!cfunE in phi1 *.
- rewrite (canRL (mulfK nz_xi01) (canRL (addrK _) phi1)) add0r addrC mulNr.
- rewrite sum_cfunE mulr_suml scaleNr scaler_suml -sumrB.
- by apply: eq_bigr => xi _; rewrite cfunE -mulrA -scalerA -scalerBr.
- rewrite cfdot_suml big1_seq //= => xi Sxi; have Txi := sST xi Sxi.
- rewrite cfdotZl cfdotBr -invDade_reciprocity -/(c xi); last first.
- rewrite cfun_onD1 !cfunE divfK // subrr eqxx andbT.
- by rewrite memvB ?memvZ //= ((seqInd_on _) setT).
- have [oSS /orthoPl o_xi0S]: pairwise_orthogonal S /\ orthogonal xi0 S.
- have:= seqInd_orthogonal nsHL setT; rewrite (eq_pairwise_orthogonal defT).
- by rewrite /= -cat1s pairwise_orthogonal_cat => /and3P[].
- rewrite cfdotBl cfdotC cfproj_sum_orthogonal {oSS}// cfdotZl cfdot_sumr.
- rewrite big1_seq ?mulr0 => [|mu Smu]; last by rewrite cfdotZr o_xi0S ?mulr0.
- by rewrite subr0 divfK ?(cfnorm_seqInd_neq0 _ Txi) // conjCK subrr mulr0.
-split=> [x /part_a-> | ].
- by rewrite sum_cfunE; apply: eq_bigr => ?; rewrite cfunE.
-rewrite (cfdotEl _ (invDade_on ddA _)) mulrC mulr_suml.
-pose F xi mu x := uc c xi mu * (xi x * (mu x)^*) / #|L|%:R.
-transitivity (\sum_(x in A) \sum_(xi <- S) \sum_(mu <- S) F xi mu x).
- apply: eq_bigr => x Ax; rewrite part_a // sum_cfunE -mulrA mulr_suml.
- apply: eq_bigr => xi _; rewrite mulrA -mulr_suml rmorph_sum; congr (_ * _).
- rewrite mulr_sumr; apply: eq_bigr => mu _; rewrite !cfunE (cfdotC mu).
- rewrite -{1}[mu x]conjCK -fmorph_div -rmorphM conjCK -3!mulrA 2!(mulrCA _^-1).
- by rewrite (mulrA _^-1) -invfM 2!(mulrCA (xi x)) mulrA 2!(mulrA _^*).
-rewrite exchange_big; apply: eq_bigr => xi _; rewrite exchange_big /=.
-apply: eq_big_seq => mu Smu; have Tmu := sST mu Smu.
-rewrite /u eh (cfdotEr _ (seqInd_on nsHL Tmu)) (mulrC _^-1) -mulrBl mulrA.
-rewrite -mulr_suml -mulr_sumr (big_setD1 1%g (group1 H)) /=; congr (_ * _ * _).
-by rewrite addrC conj_Cnat ?addKr // (Cnat_seqInd1 Tmu).
-Qed.
-
-End InvDadeSeqInd.
-
-Notation "1" := (1 : 'CF(_)) : classfun_scope.
-
-(* This is Peterfalvi (7.8). *)
-(* Our version is slightly stronger because we state the nontriviality of S *)
-(* directly than through the coherence premise (see the discussion of (5.2)). *)
-Lemma Dade_Ind1_sub_lin (nu : {additive 'CF(L) -> 'CF(G)}) zeta :
- coherent_with calS L^# (Dade ddA) nu -> (1 < size calS)%N ->
- zeta \in irr L -> zeta \in calS -> zeta 1%g = e ->
- let beta := (Ind1H - zeta)^\tau in let calSnu := map nu calS in
- let sumSnu := \sum_(xi <- calS) xi 1%g / e / '[xi] *: nu xi in
- [/\ (*a1*) [/\ orthogonal calSnu 1%CF, '[beta, 1] = 1 & beta \in 'Z[irr G]],
- exists2 Gamma : 'CF(G),
- (*a2*) [/\ orthogonal calSnu Gamma, '[Gamma, 1] = 0
- & exists2 a, a \in Cint & beta = 1 - nu zeta + a *: sumSnu + Gamma]
- & (*b*) e <= (h - 1) / 2%:R ->
- '[(nu zeta)^\rho] >= 1 - e / h /\ '[Gamma] <= e - 1
- & (*c*) {in irr G, forall chi : 'CF(G), orthogonal calSnu chi ->
- [/\ {in A, forall x, chi^\rho x = '[beta, chi]}
- & '[chi^\rho] = #|A|%:R / #|L|%:R * '[beta, chi] ^+ 2]}].
-Proof.
-move=> [[Inu Znu] nu_tau] nt_calS /irrWnorm Nzeta1 Szeta zeta1.
-set mu := _ - _ => beta calSnu sumSnu; pose S1 := rem zeta calS.
-have defS: perm_eq calS (zeta :: S1) := perm_to_rem Szeta.
-have defZS: 'Z[calS, L^#] =i 'Z[calS, A] by apply: zcharD1_seqInd.
-have S1P xi: xi \in S1 -> xi != zeta /\ xi \in calS.
- by rewrite mem_rem_uniq // => /andP[].
-have defT: perm_eql calT [:: Ind1H, zeta & S1].
- apply/perm_eqlP; have Tind1: Ind1H \in calT := seqIndT_Ind1 H L.
- by rewrite (perm_eqlP (perm_to_rem Tind1)) perm_cons -seqIndC1_rem.
-have mu_vchar: mu \in 'Z[irr L, A] := cfInd1_sub_lin_vchar nsHL Szeta zeta1.
-have beta_vchar: beta \in 'Z[irr G] by apply: Dade_vchar.
-have [mu_on beta_on] := (zchar_on mu_vchar, zchar_on beta_vchar).
-have{nt_calS} ntS1: (size S1 > 0)%N by rewrite size_rem // -subn1 subn_gt0.
-case defS1: S1 ntS1 => // [phi S2] _.
-have /S1P[neq_phi Sphi]: phi \in S1 by rewrite defS1 mem_head.
-have nz_phi1: phi 1%g != 0 by rewrite (seqInd1_neq0 nsHL Sphi).
-have NatS1e xi (Sxi : xi \in calS) := dvd_index_seqInd1 nsHL Sxi.
-have oS1: {in calS, forall psi, '[psi, 1] = 0} by apply: seqInd_ortho_1.
-have oS1H: {in calS, forall psi, '[psi, Ind1H] = 0} by apply: seqInd_ortho_Ind1.
-have InuS: {in calS &, isometry nu} by apply: sub_in2 Inu; apply: seqInd_zcharW.
-have ZnuS xi (Sxi : xi \in calS) := Znu xi (seqInd_zcharW Sxi).
-have S_Se xi (Sxi : xi \in calS) := seqInd_sub_lin_vchar nsHL Szeta zeta1 Sxi.
-have oSnu1: orthogonal calSnu 1%CF.
- have dotSnu1 psi : psi \in calS -> '[nu psi, 1] = psi 1%g / e * '[nu zeta, 1].
- move=> Spsi; apply/eqP; rewrite -subr_eq0 -cfdotZl -cfdotBl.
- rewrite -raddfZ_Cnat ?NatS1e // -raddfB; have Spi := S_Se _ Spsi.
- rewrite nu_tau ?defZS // invDade_reciprocity ?(zchar_on Spi) //.
- rewrite invDade_cfun1 (eq_cfdotr (zchar_on Spi) (eq_cfuni nsAL)).
- by rewrite cfdotBl cfdotZl !oS1 // mulr0 subr0.
- suffices oz1: '[nu zeta, 1] = 0.
- by apply/orthoPr=> _ /mapP[psi Spsi ->]; rewrite dotSnu1 // oz1 mulr0.
- have norm_nu_zeta : '[nu zeta] = 1 by rewrite InuS // irrWnorm.
- have [et [t defz]] := vchar_norm1P (ZnuS _ Szeta) norm_nu_zeta.
- rewrite defz cfdotZl -{1}irr0 cfdot_irr mulr_natr mulrb; case: eqP => // t0.
- have /eqP/idPn[] := seqInd_ortho nsHL Sphi Szeta neq_phi.
- rewrite -InuS // defz t0 cfdotZr irr0 dotSnu1 // mulrCA -irr0 -t0.
- by rewrite -cfdotZr -defz norm_nu_zeta mulr1 mulf_neq0 ?invr_eq0.
-have dot_beta_1: '[beta, 1] = 1.
- rewrite invDade_reciprocity // invDade_cfun1 (eq_cfdotr _ (eq_cfuni nsAL)) //.
- by rewrite cfdotBl -Frobenius_reciprocity cfRes_cfun1 ?cfnorm1 ?oS1 ?subr0.
-have o_beta1: '[beta - 1, 1] = 0 by rewrite cfdotBl dot_beta_1 cfnorm1 subrr.
-have [X SnuX [Gamma [def_beta1 _ oSnuG]]]:= orthogonal_split calSnu (beta - 1).
-have oG1: '[Gamma, 1] = 0.
- rewrite -(addKr X Gamma) -def_beta1 addrC cfdotBl o_beta1.
- by rewrite (span_orthogonal oSnu1) ?subr0 // memv_span ?mem_head.
-have oSS: pairwise_orthogonal calS by apply: seqInd_orthogonal.
-have oSnuS: pairwise_orthogonal calSnu by apply: map_pairwise_orthogonal.
-have [a_ def_a defX] := orthogonal_span oSnuS SnuX.
-have{def_a} def_a: {in calS, forall xi, a_ (nu xi) = '[beta, nu xi] / '[xi]}.
- move=> xi Sxi; rewrite (canRL (subrK 1) def_beta1) !cfdotDl def_a InuS //.
- by rewrite (cfdotC 1) (orthoPl oSnuG) ?(orthoPr oSnu1) ?map_f ?conjC0 ?addr0.
-pose a := '[beta, nu zeta] + 1; have Z1 := Cint1.
-have{Z1} Za: a \in Cint by rewrite rpredD ?Cint_cfdot_vchar // ZnuS.
-have {a_ def_a defX} defX: X = - nu zeta + a *: sumSnu.
- rewrite linear_sum defX big_map !(eq_big_perm _ defS) !big_cons /= addrCA.
- rewrite def_a // Nzeta1 !divr1 zeta1 divff // scalerDl !scale1r addrA.
- rewrite addrK; congr (_ + _); apply: eq_big_seq => xi /S1P[neq_xi Sxi].
- rewrite def_a // scalerA mulrA mulrDl mul1r; congr (_ / _ *: _).
- rewrite mulrC -(conj_Cnat (NatS1e _ Sxi)) -cfdotZr -raddfZ_Cnat ?NatS1e //.
- rewrite addrC; apply: canRL (subrK _) _; rewrite -!raddfB /= -/e.
- have Spi := S_Se xi Sxi; rewrite nu_tau ?defZS //.
- rewrite Dade_isometry ?(zchar_on Spi) // cfdotC cfdotBl cfdotZl !cfdotBr.
- by rewrite !oS1H ?(seqInd_ortho _ Sxi) // Nzeta1 subr0 !add0r mulrN1 opprK.
-have Ind1H1: Ind1H 1%g = e by rewrite cfInd1 // cfun11 mulr1.
-split=> // [ | chi /irrP[t def_chi] o_chiSnu].
- rewrite (canRL (subrK 1) def_beta1) defX addrC 2!addrA.
- exists Gamma; first by rewrite orthogonal_sym; split; last exists a.
- move=> lt_e_h2; pose v := h^-1; pose u := e^-1 * (1 - v); set w := 1 - e / h.
- have hu: h * u = e^-1 * (h - 1) by rewrite mulrCA (mulrBr h) mulr1 divff.
- have ->: '[(nu zeta)^\rho] = u * a ^+ 2 - v * a *+ 2 + w.
- have defT1: perm_eq calT [:: phi, Ind1H, zeta & S2].
- by rewrite defT defS1 (perm_catCA [:: _; _] phi).
- have [c ua _ ->] := invDade_seqInd_sum (nu zeta) defT1.
- have def_c xi: xi \in calS -> c xi = '[xi, zeta].
- move=> S2xi; rewrite /c mulrC -{1}[xi]scale1r -(mulVf nz_phi1) -!scalerA.
- rewrite -scalerBr linearZ cfdotZl /=; set pi := _ - _.
- have Spi: pi \in 'Z[calS, A] by apply: sub_seqInd_zchar.
- rewrite -nu_tau ?defZS // Inu ?(zcharW Spi) ?seqInd_zcharW //.
- by rewrite cfdotBl !cfdotZl (seqInd_ortho _ Sphi) // mulr0 subr0 mulKf.
- have c2: c zeta = 1 by rewrite def_c.
- have c1: c Ind1H = a.
- by rewrite /a -c2 -cfdotDl -linearD !addrA subrK zeta1 -Ind1H1.
- have{def_c} c3 xi: xi \in S2 -> c xi = 0.
- move=> S2xi; have /S1P[neq_xi Sxi]: xi \in S1 by rewrite defS1 mem_behead.
- by rewrite def_c // (seqInd_ortho _ Sxi).
- rewrite !big_cons; have kill0 := (mul0r, mulr0, big1, conjC0).
- rewrite !big1_seq /ua; try by move=> psi /c3->; do 2?rewrite ?kill0 => *.
- rewrite !addr0 c1 c2 Nzeta1 cfnorm_Ind_cfun1 // -/e Ind1H1 zeta1 conjC1.
- rewrite cfdotC (seqInd_ortho_Ind1 _ _ Szeta) // !kill0 sub0r !mulrN !mulr1.
- rewrite divr1 !mul1r !invfM mulrBr !mulrA !mulfK ?divfK // -/w.
- rewrite aut_Cint // -[_ / h]mulrA -{1}[e^-1]mulr1 -2!mulrBr -/u -/v.
- by rewrite mulrC mulrA addrA (mulrC v) -[_ - _]addrA -opprD.
- have ->: '[Gamma] = e - 1 - h * (u * a ^+ 2 - v * a *+ 2).
- have /(canLR (addrK 1)) <-: '[beta] = e + 1.
- rewrite Dade_isometry // cfnormBd ?cfnorm_Ind_cfun1 ?Nzeta1 //.
- by rewrite cfdotC (seqInd_ortho_Ind1 _ _ Szeta) ?conjC0.
- rewrite -[beta](subrK 1) cfnormDd; last first.
- by rewrite cfdotBl dot_beta_1 cfnorm1 subrr.
- rewrite cfnorm1 addrK def_beta1 (addrC X) cfnormDd; last first.
- by rewrite (span_orthogonal oSnuG) // memv_span ?mem_head.
- do 2!apply: canRL (addrK _) _; rewrite -addrA; congr (_ + _).
- rewrite defX (addrC (- nu _)) cfnormB cfnormZ Cint_normK // InuS //.
- rewrite cfdotZl cfproj_sum_orthogonal // Nzeta1 zeta1 divff // divr1.
- rewrite !mulr1 aut_Cint // mulrBr mulrDr mulVKf // addrAC.
- rewrite mulrA mulrC hu -[e^-1](divfK nze) -expr2; congr (_ * _ - _ + 1).
- rewrite -mulrA -sum_seqIndC1_square // mulr_sumr cfnorm_sum_orthogonal //.
- apply: eq_big_seq => xi Sxi.
- have [nz_xi Nxi1] := (cfnorm_seqInd_neq0 nsHL Sxi, Cnat_seqInd1 Sxi).
- rewrite (normr_idP _) ?mulr_ge0 ?invr_ge0 ?ler0n ?cfnorm_ge0 ?Cnat_ge0 //.
- by rewrite mulrCA !exprMn ['[xi]]lock !mulrA divfK // -lock.
- apply/andP; rewrite -subr_ge0 addrK andbC -subr_ge0 addrC opprB subrK.
- rewrite pmulr_rge0 ?gt0CG // andbb -mulr_natr (mulrAC v).
- have v_ge0: 0 <= v by [rewrite invr_ge0 ler0n]; have L_gt0 := gt0CG L.
- have Lu: #|L|%:R * u = h - 1 by rewrite -eh -mulrA hu mulVKf.
- have h1ge0: 0 <= h - 1 by rewrite subr_ge0 ler1n cardG_gt0.
- have{h1ge0} u_ge0: 0 <= u by rewrite -Lu pmulr_rge0 in h1ge0.
- have [a_le0 | ] := boolP (a <= 0).
- by rewrite -mulrN -sqrrN addr_ge0 ?(u_ge0, mulr_ge0) ?oppr_ge0 ?ler0n.
- rewrite -real_ltrNge ?Creal_Cint // ltr_def => /andP[].
- move/(norm_Cint_ge1 Za)=> a_ge1 a_ge0; rewrite mulrA -mulrBl.
- rewrite (normr_idP _) // -(@mulVf _ 2%:R) ?pnatr_eq0 // in a_ge1.
- rewrite mulr_ge0 // subr_ge0 (ler_trans _ (ler_wpmul2l u_ge0 a_ge1)) // mulrA.
- by rewrite ler_wpmul2r ?ler0n // -(ler_pmul2l L_gt0) mulrA Lu -eh mulfK.
-have Zchi: chi \in 'Z[irr G] by rewrite def_chi irr_vchar.
-have def_chi0: {in A, chi^\rho =1 (fun _ => '[beta, chi])}.
- have defT1: perm_eq calT [:: zeta, Ind1H & S1].
- by rewrite defT (perm_catCA Ind1H zeta).
- move=> x Ax; have [_ Hx] := setD1P Ax.
- have [c _ -> // _] := invDade_seqInd_sum chi defT1.
- rewrite big_cons big1_seq ?addr0 /c => [|xi /S1P[neq_xi /= Sxi]]; last first.
- rewrite zeta1 -nu_tau ?defZS ?S_Se // raddfB cfdotBl raddfZ_Cnat ?NatS1e //.
- by rewrite cfdotZl !(orthoPr o_chiSnu) ?map_f // mulr0 subr0 conjC0 !mul0r.
- rewrite Ind1H1 zeta1 divff // scale1r -/beta aut_Cint ?Cint_cfdot_vchar //.
- by rewrite cfnorm_Ind_cfun1 ?cfInd_cfun1 // cfunE cfuniE // Hx mulr1 divfK.
-split=> //; rewrite -mulrA mulrCA cfnormE_invDade; congr (_ * _).
-rewrite mulr_natl -sumr_const; apply: eq_bigr => _ /def_chi0->.
-by rewrite Cint_normK ?Cint_cfdot_vchar.
-Qed.
-
-End Dade_seqIndC1.
-
-(* The other results of the section are specific to groups of odd order. *)
-Hypothesis oddG : odd #|G|.
-
-(* We explicitly factor out several intermediate results from the proof of *)
-(* (7.9) that are reused throughout the proof (including in (7.10) below). *)
-
-Import ssrint.
-Lemma cfdot_real_vchar_even phi psi :
- phi \in 'Z[irr G] /\ cfReal phi -> psi \in 'Z[irr G] /\ cfReal psi ->
- (2 %| '[phi, psi])%C = (2 %| '[phi, 1])%C || (2 %| '[psi, 1])%C.
-Proof.
-move=> [Zphi Rphi] [Zpsi Rpsi]; rewrite cfdot_vchar_r // (bigD1 (0 : 'I__)) //=.
-rewrite addrC -irr0 (bigID [pred i | conjC_Iirr i < i]%N) /=.
-set a1 := \sum_(i | _) _; set a2 := \sum_(i | _) _; suffices ->: a1 = a2.
- rewrite -mulr2n -mulr_natr (rpredDl _ (dvdC_mull _ _)) //; last first.
- by rewrite rpred_sum // => i; rewrite rpredM ?Cint_cfdot_vchar_irr.
- have /CintP[m1 ->] := Cint_cfdot_vchar_irr 0 Zphi.
- have /CintP[m2 ->] := Cint_cfdot_vchar_irr 0 Zpsi.
- rewrite [m1]intEsign [m2]intEsign !rmorphMsign mulrACA -!mulrA !rpredMsign.
- by rewrite -natrM !(dvdC_nat 2) Euclid_dvdM.
-rewrite /a2 (reindex_inj (inv_inj (@conjC_IirrK _ _))) /=.
-apply: eq_big => [t | t _]; last first.
- by rewrite !conjC_IirrE !cfdot_real_conjC ?aut_Cint ?Cint_cfdot_vchar_irr.
-rewrite (inv_eq (@conjC_IirrK _ _)) conjC_IirrK -leqNgt ltn_neqAle val_eqE.
-rewrite -!(inj_eq irr_inj) !conjC_IirrE irr0 cfConjC_cfun1 odd_eq_conj_irr1 //.
-by rewrite andbA andbb.
-Qed.
-
-Section DisjointDadeOrtho.
-
-Variables (L1 L2 H1 H2 : {group gT}).
-Let A1 := H1^#.
-Let A2 := H2^#.
-
-Hypothesis ddA1 : Dade_hypothesis G L1 A1.
-Hypothesis ddA2 : Dade_hypothesis G L2 A2.
-Let Atau1 := Dade_support ddA1.
-Let tau1 := Dade ddA1.
-Let Atau2 := Dade_support ddA2.
-Let tau2 := Dade ddA2.
-
-Hypothesis disjointA : [disjoint Atau1 & Atau2].
-
-Lemma disjoint_Dade_ortho phi psi : '[tau1 phi, tau2 psi] = 0.
-Proof.
-rewrite (cfdot_complement (Dade_cfunS _ _)) ?(cfun_onS _ (Dade_cfunS _ _)) //.
-by rewrite subsetD disjoint_sym Dade_support_sub.
-Qed.
-
-Let odd_Dade_context L H : Dade_hypothesis G L H^# -> H <| L /\ odd #|L|.
-Proof. by case=> nsAL sLG _ _ _; rewrite -normalD1 (oddSg sLG). Qed.
-
-(* This lemma encapsulates uses of lemma (4.1) in sections 7 and 14. *)
-Lemma disjoint_coherent_ortho nu1 nu2 chi1 chi2 :
- let S1 := seqIndD H1 L1 H1 1 in coherent_with S1 L1^# tau1 nu1 ->
- let S2 := seqIndD H2 L2 H2 1 in coherent_with S2 L2^# tau2 nu2 ->
- chi1 \in irr L1 -> chi1 \in S1 -> chi2 \in irr L2 -> chi2 \in S2 ->
- '[nu1 chi1, nu2 chi2] = 0.
-Proof.
-move=> S1 cohS1 S2 cohS2 /irrP[i1 ->] Schi1 /irrP[i2 ->] Schi2.
-have [[nsHL1 oddL1] [[Inu1 Znu1] nu1tau]] := (odd_Dade_context ddA1, cohS1).
-have [[nsHL2 oddL2] [[Inu2 Znu2] nu2tau]] := (odd_Dade_context ddA2, cohS2).
-pose nu_chiC L (nu : 'CF(L) -> 'CF(G)) i := map nu ('chi_i :: ('chi_i)^*)%CF.
-have: orthonormal (nu_chiC L1 nu1 i1) && orthonormal (nu_chiC L2 nu2 i2).
- rewrite /orthonormal /= !andbT !Inu1 ?Inu2 ?seqInd_zcharW ?cfAut_seqInd //=.
- rewrite !cfnorm_conjC !cfnorm_irr (seqInd_conjC_ortho _ _ _ Schi1) ?eqxx //=.
- by rewrite (seqInd_conjC_ortho _ _ _ Schi2).
-move/orthonormal_vchar_diff_ortho=> -> //.
- by split; apply/allP; rewrite /= !(Znu1, Znu2) ?seqInd_zcharW ?cfAut_seqInd.
-rewrite -!raddfB !(nu1tau, nu2tau) ?zcharD1_seqInd ?seqInd_sub_aut_zchar //.
-by rewrite !Dade1 disjoint_Dade_ortho !eqxx.
-Qed.
-
-(* This is Peterfalvi (7.9). *)
-(* We have inlined Hypothesis (7.4) because although it is readily available *)
-(* for the proof of (7.10), it would be inconvenient to establish in (14.4). *)
-(* Note that our Delta corresponds to Delta - 1 in the Peterfalvi proof. *)
-Let beta L H ddA zeta := @Dade _ G L H^# ddA ('Ind[L, H] 1 - zeta).
-Lemma Dade_sub_lin_nonorthogonal nu1 nu2 zeta1 zeta2 :
- let S1 := seqIndD H1 L1 H1 1 in coherent_with S1 L1^# tau1 nu1 ->
- let S2 := seqIndD H2 L2 H2 1 in coherent_with S2 L2^# tau2 nu2 ->
- zeta1 \in irr L1 -> zeta1 \in S1 -> zeta1 1%g = #|L1 : H1|%:R ->
- zeta2 \in irr L2 -> zeta2 \in S2 -> zeta2 1%g = #|L2 : H2|%:R ->
- '[beta ddA1 zeta1, nu2 zeta2] != 0 \/ '[beta ddA2 zeta2, nu1 zeta1] != 0.
-Proof.
-move=> S1 cohS1 S2 cohS2 irr_zeta1 Szeta1 zeta1_1 irr_zeta2 Szeta2 zeta2_1.
-apply/nandP; pose Delta ddA nu zeta := beta ddA zeta + nu zeta.
-have Delta_context L H (A := H^#) ddA (tau := Dade ddA) nu zeta :
- let S := seqIndD H L H 1 in coherent_with S L^# tau nu ->
- zeta \in irr L -> zeta \in S -> zeta 1%g = #|L : H|%:R ->
- let D := Delta L H ddA nu zeta in '[D, 1] = 1 /\ D \in 'Z[irr G] /\ cfReal D.
-- move=> S cohS irr_zeta Szeta zeta_1 D.
- have [[nsHL oddL] [[_ Znu] nu_tau]] := (odd_Dade_context ddA, cohS).
- have ntS: (size S > 1)%N by apply: seqInd_nontrivial Szeta.
- have [[nuS1_0 beta1_1 Zbeta] _ _] :=
- Dade_Ind1_sub_lin cohS ntS irr_zeta Szeta zeta_1.
- rewrite cfdotDl {}beta1_1 {nuS1_0}(orthoPr nuS1_0) ?map_f // addr0.
- rewrite rpredD ?{}Znu ?seqInd_zcharW {Zbeta}// /cfReal; do !split=> //.
- rewrite rmorphD /= -subr_eq0 opprD addrAC addrA -addrA addr_eq0 opprD.
- rewrite (cfConjC_Dade_coherent cohS) // opprK -Dade_conjC -!raddfB /=.
- rewrite nu_tau ?zcharD1_seqInd ?seqInd_sub_aut_zchar //=.
- by rewrite rmorphB /= conj_cfInd cfConjC_cfun1 opprB addrC addrA subrK.
-have: ~~ (2 %| '[Delta L1 H1 ddA1 nu1 zeta1, Delta L2 H2 ddA2 nu2 zeta2])%C.
- have /Delta_context/(_ irr_zeta1 Szeta1 zeta1_1)[Delta1_1 ZR_Delta1] := cohS1.
- have /Delta_context/(_ irr_zeta2 Szeta2 zeta2_1)[Delta2_1 ZR_Delta2] := cohS2.
- by rewrite cfdot_real_vchar_even // Delta1_1 Delta2_1 (dvdC_nat 2 1).
-rewrite cfdotDl !cfdotDr disjoint_Dade_ortho // add0r addrC cfdotC.
-apply: contra => /andP[/eqP-> /eqP->]; rewrite conjC0 add0r addr0.
-by rewrite (disjoint_coherent_ortho cohS1 cohS2) ?dvdC0.
-Qed.
-
-End DisjointDadeOrtho.
-
-(* A numerical fact used in Sections 7 and 14. *)
-Lemma odd_Frobenius_index_ler (R : numFieldType) (K L : {group gT}) :
- odd #|L| -> [Frobenius L with kernel K] ->
- #|L : K|%:R <= (#|K|%:R - 1) / 2%:R :> R.
-Proof.
-move=> oddL /existsP[H frobL]; rewrite ler_pdivl_mulr ?ltr0n // ler_subr_addl.
-have ->: #|L : K| = #|H| by have [/index_sdprod] := Frobenius_context frobL.
-by rewrite -natrM -mulrS ler_nat muln2 (ltn_odd_Frobenius_ker frobL).
-Qed.
-
-(* This final section factors the assumptions common to (7.10) and (7.11). *)
-(* We add solvability of the Frobenius groups, so as not to rely on the *)
-(* theorem of Thompson asserting the nilpotence of Frobenius kernels. *)
-
-Section CoherentFrobeniusPartition.
-
-Variables (k : nat) (L H E : 'I_k -> {group gT}).
-
-Local Notation A i := (gval (H i))^#.
-Let h_ i : algC := #|H i|%:R.
-Let e_ i : algC := #|L i : H i|%:R.
-Let G0 := G :\: \bigcup_(i < k) class_support (H i)^# G.
-
-Hypothesis k_ge2: (k >= 2)%N.
-
-(*a*) Hypothesis frobeniusL_G :
- forall i, [/\ L i \subset G, solvable (L i) & [Frobenius L i = H i ><| E i]].
-
-(*b*) Hypothesis normedTI_A : forall i, normedTI (A i) G (L i).
-
-(*c*) Hypothesis card_coprime : forall i j, i != j -> coprime #|H i| #|H j|.
-
-(* A numerical fact that is used in both (7.10) and (7.11) *)
-Let e_bounds i : 1 < e_ i /\ e_ i <= (h_ i - 1) / 2%:R.
-Proof.
-have [/oddSg/(_ oddG)oddL _ frobL] := frobeniusL_G i.
-rewrite ltr1n odd_Frobenius_index_ler ?(FrobeniusWker frobL) //.
-by have [/index_sdprod <-] := Frobenius_context frobL; rewrite cardG_gt1.
-Qed.
-
-(* This is Peterfalvi (7.10). *)
-Lemma coherent_Frobenius_bound : exists i, let e := e_ i in let h := h_ i in
- (e - 1) * ((h - 2%:R * e - 1) / (e * h) + 2%:R / (h * (h + 2%:R)))
- <= (#|G0|%:R - 1) / #|G|%:R.
-Proof.
-have [sLG solL frobL] := all_and3 frobeniusL_G.
-have oddL i := oddSg (sLG i) oddG.
-have /all_and2[nsHL ntH] i: H i <| L i /\ H i :!=: 1%g.
- by case/Frobenius_context: (frobL i) => /sdprod_context[].
-have sHL i: H i \subset L i by case/andP: (nsHL i).
-pose DH i := @Dade_signalizer gT G (L i) (A i).
-have /fin_all_exists[ddA DH1] i: exists dd, {in A i, forall a, DH i dd a = 1%G}.
- have /Dade_normedTI_P[|ddAi _] := normedTI_A i; last by exists ddAi.
- by apply: normedTI_Dade => //; rewrite setSD // (subset_trans (sHL i)).
-pose tau i := Dade (ddA i); pose rho i := invDade (ddA i).
-pose Atau i := Dade_support (ddA i).
-have defAtau i: Atau i = class_support (A i) G.
- rewrite class_supportEl; apply: eq_bigr => x Ax.
- by rewrite /Dade_support1 -/(DH i) DH1 // mul1g class_support_set1l.
-have disjoint_Atau i j : i != j -> [disjoint Atau i & Atau j].
- move=> neq_ij; rewrite !defAtau !class_supportEr -setI_eq0 big_distrlr /=.
- rewrite pair_big big1 // => [[x y] _] /=; apply/eqP.
- by rewrite !conjD1g -setDIl setD_eq0 coprime_TIg // !cardJg card_coprime.
-have{defAtau} defG0: G0 = G :\: \bigcup_i Atau i.
- by congr (_ :\: _); apply: eq_bigr => i; rewrite defAtau.
-pose S i := seqIndD (H i) (L i) (H i) 1.
-have irrS i: {subset S i <= irr (L i)}.
- move=> _ /seqIndC1P[t nz_t ->]; rewrite irr_induced_Frobenius_ker //.
- exact: FrobeniusWker (frobL i).
-have /fin_all_exists[r lin_r] i: exists r, 'chi_r \in S i /\ 'chi_r 1%g = e_ i.
- have lt1Hi: [1] \proper H i by rewrite proper1G.
- have solHi := solvableS (sHL i) (solL i).
- have [xi Sxi lin_xi] := exists_linInd (nsHL i) solHi lt1Hi (normal1 _).
- by have /irrP[r def_xi] := irrS i xi Sxi; exists r; rewrite -def_xi.
-have{lin_r} [Sr r1] := all_and2 lin_r.
-have ntS i: (size (S i) > 1)%N by apply: seqInd_nontrivial (Sr i).
-have /fin_all_exists[nu cohS] i: coherent (S i) (L i)^# 'Ind[G, L i].
- have [[[frobLi tiAiL] sLiG] oddLi] := (frobL i, normedTI_A i, sLG i, oddL i).
- have [defLi ntHi ntEi _ _] := Frobenius_context frobLi.
- have{ntEi} nilHi: nilpotent (H i) by apply: (Frobenius_sol_kernel_nil frobLi).
- exact: Sibley_coherence (or_introl _ frobLi).
-have{cohS} [/all_and2[Inu Znu] nu_Ind] := all_and2 cohS.
-have{DH DH1 nu_Ind} cohS i: coherent_with (S i) (L i)^# (tau i) (nu i).
- split=> // phi Sphi; rewrite /tau nu_Ind ?Dade_Ind //.
- by rewrite (@zchar_on _ _ (S i)) -?zcharD1_seqInd.
-have n1S i xi: xi \in S i -> '[xi] = 1.
- by case/irrS/irrP=> t ->; rewrite cfnorm_irr.
-have n1Snu i xi: xi \in S i -> '[nu i xi] = 1.
- by move=> Sxi; rewrite Inu ?n1S ?seqInd_zcharW.
-have o_nu i j: i != j -> {in S i & S j, forall xi xj, '[nu i xi, nu j xj] = 0}.
- move/disjoint_Atau/disjoint_coherent_ortho=> o_ij xi xj Sxi Sxj.
- by rewrite o_ij ?irrS //; apply: cohS.
-have /all_and2[nze nzh] i: e_ i != 0 /\ h_ i != 0 by rewrite neq0CiG neq0CG.
-have h_gt1 i: 1 < h_ i by rewrite ltr1n cardG_gt1.
-have eh i: e_ i * h_ i = #|L i|%:R by rewrite -natrM mulnC Lagrange.
-have def_h1 i: h_ i - 1 = #|A i|%:R.
- by rewrite /h_ (cardsD1 1%g) group1 addnC natrD addrK.
-have [i1 min_i1]: {i1 | forall i, i != i1 -> h_ i1 + 2%:R <= h_ i}.
- exists [arg min_(i < Ordinal k_ge2) #|H i|]; case: arg_minP => // i1 _ min_i1.
- have oddH i: #|H i| = #|H i|./2.*2.+1.
- by rewrite -{1}[#|H i|]odd_double_half (oddSg (sHL i)).
- move=> i neq_i; rewrite -natrD ler_nat (oddH i) oddH addn2 -doubleS ltnS.
- rewrite leq_double ltn_neqAle andbC half_leq ?min_i1 //=.
- apply: contraTneq (card_coprime neq_i) => eqHii1.
- by rewrite oddH -eqHii1 -oddH /coprime gcdnn -trivg_card1.
-exists i1 => e h; set lhs := (e - 1) * _.
-have nzh2: h + 2%:R != 0 by rewrite -natrD addnC pnatr_eq0.
-have{lhs} ->: lhs = 1 - e / h - (h - 1) / (e * h) - (e - 1) / (h + 2%:R).
- rewrite {}/lhs -{2}(addrK h 2%:R) !invfM (mulrBl _ _ h) mulVKf ?nzh //.
- rewrite addrCA (addrC _ h) mulrCA mulrA addrA mulrBr; congr (_ - _).
- rewrite mulfK // mulrDr addrAC addrC mulrC mulrBl -mulrA mulVKf ?nze //.
- rewrite mulrC mulrBr mulrBl mul1r addrAC addrC addrA; congr (_ - _).
- rewrite mulrCA mulVKf ?nze // addrCA mulrCA mulr_natl opprD addNKr.
- by rewrite !mulrBl opprB addrA subrK divff ?nzh.
-pose beta i := tau i ('Ind[L i, H i] 1 - 'chi_(r i)).
-have betaP i := Dade_Ind1_sub_lin (cohS i) (ntS i) (mem_irr _) (Sr i) (r1 i).
-pose chi i := nu i 'chi_(r i); pose c i j := '[beta i, chi j].
-have:= betaP i1; rewrite -/(S _) -/(tau _) -/(beta _) -/(chi _) -/(e_ _) -/e.
-move=> [[oSnu1 o_beta1 Zbeta1] [Gamma [oSnuGamma oGamma1] [a Za def_beta1]]].
-have [_ lt_e_h2] := e_bounds i1; rewrite -/(rho _) -/(h_ _) -/h.
-case/(_ lt_e_h2)=> min_rho1 maxGamma _ {lt_e_h2}.
-pose calB := [set i | (i != i1) && (c i i1 == 0)].
-pose sumB := \sum_(i in calB) (h_ i - 1) / (e_ i * h_ i).
-suffices{min_rho1} sumB_max: sumB <= (e - 1) / (h + 2%:R).
- rewrite -subr_ge0 opprB addrCA -opprB subr_ge0; apply: ler_trans sumB_max.
- rewrite -subr_ge0 opprB addrCA -(opprB _ sumB) subr_ge0.
- have Zchi1: chi i1 \in 'Z[irr G] by rewrite Znu ?seqInd_zcharW ?Sr.
- have [eps [t def_chi1]] := vchar_norm1P Zchi1 (n1Snu i1 'chi_(r i1) (Sr i1)).
- pose sumG0 := \sum_(g in G0) `|'chi_t g| ^+ 2.
- apply: (@ler_trans _ ((#|G0|%:R - sumG0) / #|G|%:R)); last first.
- rewrite ler_pmul2r ?invr_gt0 ?gt0CG // ler_add2l ler_opp2.
- rewrite [sumG0](bigD1 1%g) /=; last first.
- rewrite !inE group1 andbT; apply/bigcupP=> [[i _]].
- by rewrite class_supportEr => /bigcupP[x _]; rewrite conjD1g !inE eqxx.
- rewrite -[1]addr0 ler_add ?sumr_ge0 // => [|x _]; last first.
- by rewrite -normrX normr_ge0.
- have Zchit1: 'chi_t 1%g \in Cint by rewrite CintE Cnat_irr1.
- by rewrite expr_ge1 ?normr_ge0 // norm_Cint_ge1 ?irr1_neq0.
- pose ea i : algC := #|(H i)^#|%:R / #|L i|%:R.
- apply: (@ler_trans _ (\sum_i ('[rho i 'chi_t] - ea i))); last first.
- rewrite -subr_ge0 -opprB oppr_ge0 -mulNr opprB addrC mulrC.
- by rewrite /sumG0 defG0 Dade_cover_inequality ?cfnorm_irr.
- rewrite (bigID (mem calB)) /= addrC ler_add //.
- rewrite -subr_ge0 opprK -big_split sumr_ge0 //= => i _.
- by rewrite def_h1 eh subrK cfnorm_ge0.
- rewrite (bigD1 i1) ?inE ?eqxx ?andbF //= -ler_subl_addl (@ler_trans _ 0) //.
- rewrite opprB /ea -def_h1 -eh -/h -/e addrA subrK subr_le0.
- by rewrite -(cfnorm_sign eps) -linearZ -def_chi1.
- rewrite sumr_ge0 // => i; rewrite inE /c andbC => /andP[neq_i].
- rewrite neq_i subr_ge0 def_chi1 cfdotZr mulf_eq0 => /norP[_ not_o_beta_chi].
- have [[_ _ Zbeta_i] _ /(_ _ (mem_irr t))[|_ ->]] := betaP i.
- apply/orthoPr=> _ /mapP[xi Sxi ->]; rewrite -['chi_t](signrZK eps).
- by rewrite -def_chi1 cfdotZr o_nu ?mulr0 ?Sr.
- rewrite -[ea i]mulr1 /ea ler_wpmul2l ?mulr_ge0 ?invr_ge0 ?ler0n //.
- by rewrite -/(tau i) -/(beta i) sqr_Cint_ge1 ?Cint_cfdot_vchar_irr.
-rewrite -(mulfK nzh2 sumB) -{2 3}natrD ler_wpmul2r ?invr_ge0 ?ler0n //.
-apply: ler_trans maxGamma; rewrite mulr_suml.
-pose phi i : 'CF(G) := \sum_(xi <- S i) xi 1%g / e_ i / '[xi] *: nu i xi.
-have o_phi_nu i j xi: i != j -> xi \in S j -> '[phi i, nu j xi] = 0.
- move/o_nu=> o_ij Sxi; rewrite cfdot_suml big1_seq //= => pi Spi.
- by rewrite cfdotZl o_ij ?mulr0.
-have o_phi i j: i != j -> '[phi i, phi j] = 0.
- move/o_phi_nu=> o_ij; rewrite cfdot_sumr big1_seq // => xi Sxi.
- by rewrite cfdotZr o_ij ?mulr0.
-pose X : 'CF(G) := \sum_(i in calB) c i1 i *: phi i; pose Gamma1 := Gamma - X.
-have ->: Gamma = Gamma1 + X by rewrite subrK.
-have{betaP def_beta1} /cfnormDd->: '[Gamma1, X] = 0.
- rewrite cfdot_sumr big1 // => i Bi; have [neq_i _] := setIdP Bi.
- rewrite cfdotZr cfdot_sumr big1_seq ?mulr0 //= => xi Sxi.
- apply/eqP; rewrite cfdotZr cfdotBl mulf_eq0; apply/pred2P; right.
- rewrite cfdot_suml (bigD1 i) ?big1 //= => [|j /andP[_ neq_j]]; last first.
- by rewrite cfdotZl o_phi_nu ?mulr0.
- rewrite cfdotZl cfproj_sum_orthogonal ?seqInd_orthogonal //; last exact: Inu.
- rewrite n1S // divr1 mulr1 addr0 mulrC -(canLR (addKr _) def_beta1).
- rewrite !(cfdotDl, cfdotNl) cfdotZl o_nu ?o_phi_nu ?Sr 1?eq_sym // mulr0.
- have[[/orthoPr oSnui_1 _ _] _ _] := betaP i; rewrite -/(S i) in oSnui_1.
- rewrite cfdotC oSnui_1 ?map_f // conjC0 !(add0r, oppr0).
- have Nxie: xi 1%g / e_ i \in Cnat by apply: dvd_index_seqInd1 _ Sxi.
- rewrite -(conj_Cnat Nxie) // -cfdotZr -raddfZ_Cnat // -!raddfB /=.
- have [_ Dnu] := cohS i.
- rewrite Dnu ?zcharD1_seqInd ?seqInd_sub_lin_vchar ?Sr ?r1 //.
- by rewrite disjoint_Dade_ortho ?disjoint_Atau 1?eq_sym.
-rewrite -subr_ge0 cfdot_sumr -addrA -sumrB addr_ge0 ?cfnorm_ge0 //.
-rewrite sumr_ge0 // => i Bi; have [neq_i ci1_0] := setIdP Bi.
-have n_phi: '[phi i] = (h_ i - 1) / e_ i.
- rewrite cfnorm_sum_orthogonal ?seqInd_orthogonal //; last exact: Inu.
- rewrite -[_ - 1](mulKf (nze i)) -sum_seqIndC1_square // -/(S i) mulrAC.
- rewrite -invfM mulrC mulr_suml; apply: eq_big_seq => _ /irrS/irrP[t ->].
- rewrite cfnorm_irr !divr1 mulr1 -expr2 -exprVn -exprMn.
- by rewrite (normr_idP _) // mulr_ge0 ?invr_ge0 ?ler0n // ltrW ?irr1_gt0.
-rewrite subr_ge0 cfdotZr cfdot_suml (bigD1 i) //=.
-rewrite big1 ?addr0 => [|j /andP[_ ne_j]]; last by rewrite cfdotZl o_phi ?mulr0.
-rewrite cfdotZl invfM 2!mulrA -n_phi -[_ * _]mulrA mulrC.
-rewrite ler_wpmul2r ?cfnorm_ge0 // (@ler_trans _ 1) //.
- by rewrite -{2}(mulVf (nzh i)) ler_wpmul2l ?invr_ge0 ?ler0n ?min_i1.
-rewrite mulrC -normCK expr_ge1 ?normr_ge0 // norm_Cint_ge1 //.
- rewrite Cint_cfdot_vchar ?Znu ?seqInd_zcharW ?Sr //.
-suffices []: c i i1 != 0 \/ c i1 i != 0 by rewrite ?ci1_0.
-apply/Dade_sub_lin_nonorthogonal; rewrite ?mem_irr ?Sr ?r1 //; try exact: cohS.
-exact: disjoint_Atau.
-Qed.
-
-(* This is Peterfalvi (7.11). *)
-Theorem no_coherent_Frobenius_partition : G0 != 1%G.
-Proof.
-have [i] := coherent_Frobenius_bound; apply: contraTneq => ->.
-have [] := e_bounds i; set e := e_ i; set h := h_ i => e_gt1 le_e_h2.
-rewrite cards1 subrr mul0r ltr_geF // pmulr_rgt0 ?subr_gt0 // ltr_paddl //.
- rewrite ?(mulr_ge0, invr_ge0) ?ler0n // addrAC subr_ge0.
- by rewrite -[_ - 1](@divfK _ 2%:R) ?pnatr_eq0 // mulrC ler_wpmul2r ?ler0n.
-by rewrite -natrD addnC ?(pmulr_rgt0, invr_gt0) ?ltr0n.
-Qed.
-
-End CoherentFrobeniusPartition.
-
-End Seven.
-
diff --git a/mathcomp/odd_order/PFsection8.v b/mathcomp/odd_order/PFsection8.v
deleted file mode 100644
index 2770369..0000000
--- a/mathcomp/odd_order/PFsection8.v
+++ /dev/null
@@ -1,1141 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime ssralg poly finset center.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action finalg zmodp.
-From mathcomp
-Require Import gfunctor gproduct cyclic commutator nilpotent pgroup.
-From mathcomp
-Require Import sylow hall abelian maximal frobenius.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation vector.
-From mathcomp
-Require Import BGsection1 BGsection3 BGsection7 BGsection10.
-From mathcomp
-Require Import BGsection14 BGsection15 BGsection16.
-From mathcomp
-Require ssrnum.
-From mathcomp
-Require Import algC classfun character inertia vcharacter.
-From mathcomp
-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' => _ <- _ _; apply: 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 gFsub (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); apply: (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; apply/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_eqP/idPn => not_HG_M.
- have /negP[]: ~~ [disjoint 'A1~(M) & 'A1~(H)].
- rewrite eq_MH -setI_eq0 setIid -defDsup //.
- by apply: contraNneq not_PG_set0 => <-; apply: 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_transl _ (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)->; apply: 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; apply/andP.
- exists x; rewrite (subsetP (FTsupp1_sub maxS)) //=.
- by apply/andP/part_a2=> //; apply/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_transl _ (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_transl _ (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_transl _ (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)).
-
diff --git a/mathcomp/odd_order/PFsection9.v b/mathcomp/odd_order/PFsection9.v
deleted file mode 100644
index d8ec417..0000000
--- a/mathcomp/odd_order/PFsection9.v
+++ /dev/null
@@ -1,2211 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div choice.
-From mathcomp
-Require Import fintype tuple finfun bigop prime binomial ssralg poly finset.
-From mathcomp
-Require Import fingroup morphism perm automorphism quotient action finalg zmodp.
-From mathcomp
-Require Import gfunctor gproduct cyclic commutator center gseries nilpotent.
-From mathcomp
-Require Import pgroup sylow hall abelian maximal frobenius.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation mxabelem vector.
-From mathcomp
-Require Import BGsection1 BGsection3 BGsection7 BGsection15 BGsection16.
-From mathcomp
-Require Import algC classfun character inertia vcharacter.
-From mathcomp
-Require Import PFsection1 PFsection2 PFsection3 PFsection4.
-From mathcomp
-Require Import PFsection5 PFsection6 PFsection8.
-
-(******************************************************************************)
-(* This file covers Peterfalvi, Section 9: On the maximal subgroups of Types *)
-(* II, III and IV. For defW : W1 \x W2 = W, MtypeP : of_typeP M U defW, and *)
-(* H := M`_\F we define : *)
-(* Ptype_Fcore_kernel MtypeP == a maximal normal subgroup of M contained *)
-(* (locally) H0 in H and containing 'C_H(U), provided M is *)
-(* not a maximal subgroup of type V. *)
-(* Ptype_Fcore_kernel MtypeP == the stabiliser of Hbar := H / H0 in U; this *)
-(* (locally to this file) C is locked for performance reasons. *)
-(* typeP_Galois MtypeP <=> U acts irreducibly on Hbar; this implies *)
-(* that M / H0C is isomorphic to a Galois group *)
-(* acting on the semidirect product of the *)
-(* additive group of a finite field with a *)
-(* a subgroup of its multiplicative group. *)
-(* --> This predicate reflects alternative (b) in Peterfalvi (9.7). *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Import GroupScope GRing.Theory FinRing.Theory.
-
-Section Nine.
-
-Variable gT : minSimpleOddGroupType.
-Local Notation G := (TheMinSimpleOddGroup gT).
-Implicit Types (p q : nat) (x y z : gT).
-Implicit Types H K L N P Q R S T U V W : {group gT}.
-
-(* Peterfalvi (9.1) is covered by BGsection3.Frobenius_Wielandt_fixpoint. *)
-
-(* These assumptions correspond to Peterfalvi, Hypothesis (9.2). *)
-
-Variables M U W W1 W2 : {group gT}.
-Hypotheses (maxM : M \in 'M) (defW : W1 \x W2 = W) (MtypeP: of_typeP M U defW).
-Hypothesis notMtype5 : FTtype M != 5.
-
-Local Notation "` 'M'" := (gval M) (at level 0, only parsing) : group_scope.
-Local Notation "` 'U'" := (gval U) (at level 0, only parsing) : group_scope.
-Local Notation "` 'W1'" := (gval W1) (at level 0, only parsing) : group_scope.
-Local Notation H := `M`_\F%G.
-Local Notation "` 'H'" := `M`_\F (at level 0) : group_scope.
-Local Notation "` 'W2'" := (gval W2) (at level 0, only parsing) : group_scope.
-Local Notation HU := M^`(1)%G.
-Local Notation "` 'HU'" := `M^`(1) (at level 0) : group_scope.
-Local Notation U' := U^`(1)%G.
-Local Notation "` 'U''" := `U^`(1) (at level 0) : group_scope.
-
-Let q := #|W1|.
-
-Let defM : HU ><| W1 = M. Proof. by have [[]] := MtypeP. Qed.
-Let defHU : H ><| U = HU. Proof. by have [_ []] := MtypeP. Qed.
-Let nUW1 : W1 \subset 'N(U). Proof. by have [_ []] := MtypeP. Qed.
-Let cHU' : U' \subset 'C(H). Proof. by have [_ []] := typeP_context MtypeP. Qed.
-
-Let notMtype1 : FTtype M != 1%N. Proof. exact: FTtypeP_neq1 MtypeP. Qed.
-
-Local Notation Mtype24 := (compl_of_typeII_IV maxM MtypeP notMtype5).
-Let ntU : U :!=: 1. Proof. by have [] := Mtype24. Qed.
-Let pr_q : prime q. Proof. by have [] := Mtype24. Qed.
-Let ntW2 : W2 :!=: 1. Proof. by have [_ _ _ []] := MtypeP. Qed.
-Let sW2H : W2 \subset H. Proof. by have [_ _ _ []] := MtypeP. Qed.
-Let defW2 : 'C_H(W1) = W2. Proof. exact: typeP_cent_core_compl MtypeP. Qed.
-
-Lemma Ptype_Fcore_sdprod : H ><| (U <*> W1) = M.
-Proof.
-have [_ /= sW1M mulHUW1 _ tiHUW1] := sdprod_context defM.
-have [/= /andP[sHHU _] sUHU mulHU nHU tiHU] := sdprod_context defHU.
-rewrite sdprodE /= norm_joinEr // ?mulgA ?mulHU //.
- by rewrite mulG_subG nHU (subset_trans sW1M) ?gFnorm.
-rewrite setIC -(setIidPr sHHU) setIA -group_modl //.
-by rewrite (setIC W1) tiHUW1 mulg1 setIC tiHU.
-Qed.
-Local Notation defHUW1 := Ptype_Fcore_sdprod.
-
-Lemma Ptype_Fcore_coprime : coprime #|H| #|U <*> W1|.
-Proof.
-by rewrite (coprime_sdprod_Hall_l defHUW1) ?(pHall_Hall (Fcore_Hall M)).
-Qed.
-Let coH_UW1 := Ptype_Fcore_coprime.
-Let coHU : coprime #|H| #|U|.
-Proof. exact: coprimegS (joing_subl U W1) coH_UW1. Qed.
-
-Let not_cHU : ~~ (U \subset 'C(H)).
-Proof. by have [_ [_ ->]] := typeP_context MtypeP. Qed.
-
-Lemma Ptype_compl_Frobenius : [Frobenius U <*> W1 = U ><| W1].
-Proof.
-have [[_ _ ntW1 _] _ _ [_ _ _ _ prHU_W1] _] := MtypeP.
-have [[_ _ _ tiHUW1] [_ sUHU _ _ tiHU]] := (sdprodP defM, sdprod_context defHU).
-apply/Frobenius_semiregularP=> // [|x /prHU_W1 defCx].
- by rewrite sdprodEY //; apply/trivgP; rewrite -tiHUW1 setSI.
-by apply/trivgP; rewrite -tiHU /= -{1}(setIidPr sUHU) setIAC defCx setSI.
-Qed.
-Local Notation frobUW1 := Ptype_compl_Frobenius.
-
-Let nilH : nilpotent H. Proof. exact: Fcore_nil. Qed.
-Let solH : solvable H. Proof. exact: nilpotent_sol. Qed.
-
-(* This is Peterfalvi (9.3). *)
-Lemma typeII_IV_core (p := #|W2|) :
- if FTtype M == 2 then 'C_H(U) = 1 /\ #|H| = (#|W2| ^ q)%N
- else [/\ prime p, 'C_H(U <*> W1) = 1 & #|H| = (p ^ q * #|'C_H(U)|)%N].
-Proof.
-have [_ _ nHUW1 _] := sdprodP defHUW1.
-have /= [oH _ oH1] := Frobenius_Wielandt_fixpoint frobUW1 nHUW1 coH_UW1 solH.
-have [Mtype2 {oH}| notMtype2 {oH1}] := boolP (FTtype M == 2).
- suffices regHU: 'C_H(U) = 1 by rewrite -defW2 oH1.
- have [_ _ _ HUtypeF defHUF] := compl_of_typeII maxM MtypeP Mtype2.
- have [_ _ [U0 [sU0U _]]] := HUtypeF; rewrite {}defHUF => frobHU0.
- have /set0Pn[x U0x]: U0^# != set0.
- by rewrite setD_eq0 subG1; case/Frobenius_context: frobHU0.
- apply/trivgP; rewrite -(Frobenius_reg_ker frobHU0 U0x) setIS // -cent_cycle.
- by rewrite centS // cycle_subG (subsetP sU0U) //; case/setD1P: U0x.
-have p_pr: prime p.
- have [S pairMS [xdefW [U_S StypeP]]] := FTtypeP_pair_witness maxM MtypeP.
- have [[_ _ maxS] _] := pairMS; rewrite {1}(negPf notMtype2) /= => Stype2 _ _.
- by have [[]] := compl_of_typeII maxS StypeP Stype2.
-rewrite -/q -/p centY setICA defW2 setIC in oH *.
-suffices regW2U: 'C_W2(U) = 1 by rewrite -oH regW2U cards1 exp1n mul1n.
-apply: prime_TIg => //=; apply: contra not_cHU => /setIidPl cUW2.
-rewrite centsC (sameP setIidPl eqP) eqEcard subsetIl.
-by rewrite -(@leq_pmul2l (p ^ q)) -?oH ?cUW2 //= expn_gt0 cardG_gt0.
-Qed.
-
-(* Existential witnesses for Peterfalvi (9.4). *)
-Definition Ptype_Fcore_kernel of of_typeP M U defW :=
- odflt 1%G [pick H0 : {group gT} | chief_factor M H0 H & 'C_H(U) \subset H0].
-Let H0 := (Ptype_Fcore_kernel MtypeP).
-Local Notation "` 'H0'" := (gval H0) (at level 0, only parsing) : group_scope.
-Local Notation Hbar := (H / `H0)%G.
-Local Notation "` 'Hbar'" := (`H / `H0)%g (at level 0) : group_scope.
-Let p := pdiv #|Hbar|.
-
-(* This corresponds to Peterfalvi (9.4). *)
-Lemma Ptype_Fcore_kernel_exists : chief_factor M H0 H /\ 'C_H(U) \subset H0.
-Proof.
-pose S := <<class_support 'C_H(U) H>> .
-suffices [H1 maxH sCH1]: {H1 : {group gT} | maxnormal H1 H M & S \subset H1}.
- apply/andP; rewrite /H0 /Ptype_Fcore_kernel; case: pickP => // /(_ H1)/idP[].
- rewrite /chief_factor maxH Fcore_normal (subset_trans _ sCH1) ?sub_gen //.
- exact: sub_class_support.
-apply/maxgroup_exists/andP; split.
- have snCH: 'C_H(U) <|<| H by rewrite nilpotent_subnormal ?subsetIl.
- by have [/setIidPl/idPn[] | // ] := subnormalEsupport snCH; rewrite centsC.
-have [_ {3}<- nHUW1 _] := (sdprodP defHUW1).
-rewrite norms_gen // mulG_subG class_support_norm norms_class_support //.
-by rewrite normsI ?norms_cent // join_subG normG.
-Qed.
-
-Let chiefH0 : chief_factor M H0 H.
-Proof. by have [] := Ptype_Fcore_kernel_exists. Qed.
-Let ltH0H : H0 \proper H.
-Proof. by case/andP: chiefH0 => /maxgroupp/andP[]. Qed.
-Let nH0M : M \subset 'N(H0).
-Proof. by case/andP: chiefH0 => /maxgroupp/andP[]. Qed.
-Let sH0H : H0 \subset H. Proof. exact: proper_sub ltH0H. Qed.
-Let nsH0M : H0 <| M. Proof. by rewrite /normal (subset_trans sH0H) ?gFsub. Qed.
-Let nsH0H : H0 <| H. Proof. by rewrite (normalS _ (Fcore_sub _)). Qed.
-Let minHbar : minnormal Hbar (M / H0).
-Proof. exact: chief_factor_minnormal. Qed.
-Let ntHbar : Hbar :!=: 1. Proof. by case/mingroupp/andP: minHbar. Qed.
-Let solHbar: solvable Hbar. Proof. by rewrite quotient_sol. Qed.
-Let abelHbar : p.-abelem Hbar.
-Proof. by have [] := minnormal_solvable minHbar _ solHbar. Qed.
-Let p_pr : prime p. Proof. by have [/pgroup_pdiv[]] := and3P abelHbar. Qed.
-Let abHbar : abelian Hbar. Proof. exact: abelem_abelian abelHbar. Qed.
-
-(* This is Peterfalvi, Hypothesis (9.5). *)
-Fact Ptype_Fcompl_kernel_key : unit. Proof. by []. Qed.
-Definition Ptype_Fcompl_kernel :=
- locked_with Ptype_Fcompl_kernel_key 'C_U(Hbar | 'Q)%G.
-Local Notation C := Ptype_Fcompl_kernel.
-Local Notation "` 'C'" := (gval C) (at level 0, only parsing) : group_scope.
-Local Notation Ubar := (U / `C)%G.
-Local Notation "` 'Ubar'" := (`U / `C)%g (at level 0) : group_scope.
-Local Notation W1bar := (W1 / `H0)%G.
-Local Notation "` 'W1bar'" := (`W1 / `H0)%g (at level 0) : group_scope.
-Local Notation W2bar := 'C_Hbar(`W1bar)%G.
-Local Notation "` 'W2bar'" := 'C_`Hbar(`W1bar) (at level 0) : group_scope.
-Let c := #|C|.
-Let u := #|Ubar|.
-Local Notation tau := (FT_Dade0 maxM).
-Local Notation "chi ^\tau" := (tau chi).
-Let calX := Iirr_kerD M^`(1) H 1.
-Let calS := seqIndD M^`(1) M M`_\F 1.
-Let X_ Y := Iirr_kerD M^`(1) H Y.
-Let S_ Y := seqIndD M^`(1) M M`_\F Y.
-
-Local Notation inMb := (coset (gval H0)).
-
-Local Notation H0C := (`H0 <*> `C)%G.
-Local Notation "` 'H0C'" := (`H0 <*> `C) (at level 0) : group_scope.
-Local Notation HC := (`H <*> `C)%G.
-Local Notation "` 'HC'" := (`H <*> `C) (at level 0) : group_scope.
-Local Notation H0U' := (`H0 <*> `U')%G.
-Local Notation "` 'H0U''" := (gval H0 <*> `U')%G (at level 0) : group_scope.
-Local Notation H0C' := (`H0 <*> `C^`(1)%g)%G.
-Local Notation "` 'H0C''" := (`H0 <*> `C^`(1)) (at level 0) : group_scope.
-
-Let defW2bar : W2bar :=: W2 / H0.
-Proof.
-rewrite -defW2 coprime_quotient_cent ?(subset_trans _ nH0M) //.
- by have [_ /mulG_sub[]] := sdprodP defM.
-exact: coprimegS (joing_subr _ _) coH_UW1.
-Qed.
-
-Let sCU : C \subset U. Proof. by rewrite [C]unlock subsetIl. Qed.
-
-Let nsCUW1 : C <| U <*> W1.
-Proof.
-have [_ sUW1M _ nHUW1 _] := sdprod_context defHUW1.
-rewrite /normal [C]unlock subIset ?joing_subl // normsI //.
- by rewrite join_subG normG.
-rewrite /= astabQ norm_quotient_pre ?norms_cent ?quotient_norms //.
-exact: subset_trans sUW1M nH0M.
-Qed.
-
-Lemma Ptype_Fcore_extensions_normal :
- [/\ H0C <| M, HC <| M, H0U' <| M & H0C' <| M].
-Proof.
-have [nsHUM sW1M /mulG_sub[sHUM _] nHUW1 tiHUW1] := sdprod_context defM.
-have [nsHHU sUHU /mulG_sub[sHHU _] nHU tiHU] := sdprod_context defHU.
-have [sHM sUM] := (subset_trans sHHU sHUM, subset_trans sUHU sHUM).
-have sCM: C \subset M := subset_trans sCU sUM.
-have sH0C_M: H0C \subset M by rewrite /normal join_subG (subset_trans sH0H).
-have [nH0C nH0_H0C] := (subset_trans sCM nH0M, subset_trans sH0C_M nH0M).
-have nsH0C: H0C <| M.
- rewrite /normal sH0C_M -{1}defM sdprodEY //= -defHU sdprodEY //= -joingA.
- rewrite join_subG andbC normsY ?(normal_norm nsCUW1) //=; last first.
- by rewrite (subset_trans _ nH0M) // join_subG sUM.
- rewrite -quotientYK // -{1}(quotientGK nsH0H) morphpre_norms //= [C]unlock.
- by rewrite cents_norm // centsC -quotient_astabQ quotientS ?subsetIr.
-split=> //; first by rewrite /= -{1}(joing_idPl sH0H) -joingA normalY ?gFnormal.
- rewrite normalY // /normal gFsub_trans //=.
- rewrite -defM sdprodEY //= -defHU sdprodEY //=.
- by rewrite !join_subG gFnorm cents_norm ?gFnorm_trans // centsC.
-suffices ->: H0C' :=: H0 <*> H0C^`(1) by rewrite normalY ?gFnormal_trans.
-by rewrite /= -!quotientYK ?gFsub_trans ?quotient_der ?subsetIl //= cosetpreK.
-Qed.
-Local Notation nsH0xx_M := Ptype_Fcore_extensions_normal.
-
-Let Du : u = #|HU : HC|.
-Proof.
-have nCU := subset_trans (joing_subl U W1) (normal_norm nsCUW1).
-by rewrite -(index_sdprodr defHU) -?card_quotient.
-Qed.
-
-(* This is Peterfalvi (9.6). *)
-Lemma Ptype_Fcore_factor_facts :
- [/\ C :!=: U, #|W2bar| = p & #|Hbar| = p ^ q]%N.
-Proof.
-have [defUW1 _ ntW1 _ _] := Frobenius_context Ptype_compl_Frobenius.
-have coHW1: coprime #|H| #|W1| := coprimegS (joing_subr U W1) coH_UW1.
-have [_ sUW1M _ nHUW1 _] := sdprod_context defHUW1.
-have nH0UW1 := subset_trans sUW1M nH0M; have [nH0U nH0W1] := joing_subP nH0UW1.
-have regUHb: 'C_Hbar(U / H0) = 1.
- have [_ sCH0] := Ptype_Fcore_kernel_exists.
- by rewrite -coprime_quotient_cent ?(nilpotent_sol nilH) ?quotientS1.
-have ->: C != U.
- apply: contraNneq ntHbar => defU; rewrite -subG1 -regUHb subsetIidl centsC.
- by rewrite -defU [C]unlock -quotient_astabQ quotientS ?subsetIr.
-have frobUW1b: [Frobenius U <*> W1 / H0 = (U / H0) ><| W1bar].
- have tiH0UW1 := coprime_TIg (coprimeSg sH0H coH_UW1).
- have /isomP[inj_f im_f] := quotient_isom nH0UW1 tiH0UW1.
- have:= injm_Frobenius (subxx _) inj_f frobUW1.
- by rewrite im_f !morphim_restrm !(setIidPr _) ?joing_subl ?joing_subr.
-have{frobUW1b} oHbar: #|Hbar| = (#|W2bar| ^ q)%N.
- have nHbUW1 : U <*> W1 / H0 \subset 'N(Hbar) := quotient_norms H0 nHUW1.
- have coHbUW1 : coprime #|Hbar| #|U <*> W1 / H0| by apply: coprime_morph.
- have [//|_ _ -> //] := Frobenius_Wielandt_fixpoint frobUW1b nHbUW1 coHbUW1 _.
- by rewrite -(card_isog (quotient_isog _ _)) // coprime_TIg ?(coprimeSg sH0H).
-have abelW2bar: p.-abelem W2bar := abelemS (subsetIl _ _) abelHbar.
-rewrite -(part_pnat_id (abelem_pgroup abelW2bar)) p_part in oHbar *.
-suffices /eqP cycW2bar: logn p #|W2bar| == 1%N by rewrite oHbar cycW2bar.
-have cycW2: cyclic W2 by have [_ _ _ []] := MtypeP.
-rewrite eqn_leq -abelem_cyclic //= -/W2bar {1}defW2bar quotient_cyclic //=.
-rewrite lt0n; apply: contraNneq ntHbar => W2bar1.
-by rewrite trivg_card1 oHbar W2bar1 exp1n.
-Qed.
-
-Lemma def_Ptype_factor_prime : prime #|W2| -> p = #|W2|.
-Proof.
-move=> prW2; suffices: p \in \pi(W2) by rewrite !(primes_prime, inE) // => /eqP.
-rewrite mem_primes p_pr cardG_gt0; have [_ <- _] := Ptype_Fcore_factor_facts.
-by rewrite defW2bar dvdn_quotient.
-Qed.
-
-(* The first assertion of (9.4)(b) (the rest is subsumed by (9.6)). *)
-Lemma typeIII_IV_core_prime : FTtype M != 2 -> p = #|W2|.
-Proof.
-by have:= typeII_IV_core => /=; case: ifP => // _ [/def_Ptype_factor_prime].
-Qed.
-
-Let frobUW1c : [Frobenius U <*> W1 / C = Ubar ><| W1 / C].
-Proof.
-apply: Frobenius_quotient frobUW1 _ nsCUW1 _.
- by apply: nilpotent_sol; have [_ []] := MtypeP.
-by have [] := Ptype_Fcore_factor_facts; rewrite eqEsubset sCU.
-Qed.
-
-Definition typeP_Galois := acts_irreducibly U Hbar 'Q.
-
-(* This is Peterfalvi (9.7)(a). *)
-Lemma typeP_Galois_Pn :
- ~~ typeP_Galois ->
- {H1 : {group coset_of H0} |
- [/\ #|H1| = p, U / H0 \subset 'N(H1), [acts U, on H1 | 'Q],
- \big[dprod/1]_(w in W1bar) H1 :^ w = Hbar
- & let a := #|U : 'C_U(H1 | 'Q)| in
- [/\ a > 1, a %| p.-1, cyclic (U / 'C_U(H1 | 'Q))
- & exists V : {group 'rV['Z_a]_q.-1}, Ubar \isog V]]}.
-Proof.
-have [_ sUW1M defHUW1 nHUW1 _] := sdprod_context defHUW1.
-have [nHU nHW1] := joing_subP nHUW1.
-have nH0UW1 := subset_trans sUW1M nH0M; have [nH0U nH0W1] := joing_subP nH0UW1.
-rewrite /typeP_Galois acts_irrQ //= => not_minHbarU.
-have [H1 minH1 sH1Hb]: {H1 | minnormal (gval H1) (U / H0) & H1 \subset Hbar}.
- by apply: mingroup_exists; rewrite ntHbar quotient_norms.
-exists H1; have [defH1 | ltH1H] := eqVproper sH1Hb.
- by rewrite -defH1 minH1 in not_minHbarU.
-have [/andP[ntH1 nH1U] _] := mingroupP minH1.
-have actsUH1: [acts U, on H1 | 'Q].
- by rewrite -(cosetpreK H1) actsQ ?norm_quotient_pre.
-have [nH0H [neqCU _ oHbar]] := (normal_norm nsH0H, Ptype_Fcore_factor_facts).
-have nUW1b: W1bar \subset 'N(U / H0) by apply: quotient_norms.
-have oW1b: #|W1bar| = q.
- rewrite -(card_isog (quotient_isog _ _)) // coprime_TIg //.
- by rewrite (coprimeSg sH0H) // (coprimegS (joing_subr U W1)).
-have [oH1 defHbar]: #|H1| = p /\ \big[dprod/1]_(w in W1bar) H1 :^ w = Hbar.
- have nHbUW1: U <*> W1 / H0 \subset 'N(Hbar) by apply: quotient_norms.
- pose rUW1 := abelem_repr abelHbar ntHbar nHbUW1.
- have irrUW1: mx_irreducible rUW1.
- apply/abelem_mx_irrP/mingroupP; split=> [|H2]; first by rewrite ntHbar.
- case/andP=> ntH2 nH2UW1 sH2H; case/mingroupP: minHbar => _; apply=> //.
- by rewrite ntH2 -defHUW1 quotientMl // mulG_subG sub_abelian_norm.
- have nsUUW1: U / H0 <| U <*> W1 / H0 by rewrite quotient_normal // normalYl.
- pose rU := subg_repr rUW1 (normal_sub nsUUW1).
- pose V1 := rowg_mx (abelem_rV abelHbar ntHbar @* H1).
- have simV1: mxsimple rU V1 by apply/mxsimple_abelem_subg/mxsimple_abelemGP.
- have [W0 /subsetP sW01 [sumW0 dxW0]] := Clifford_basis irrUW1 simV1.
- have def_q: q = (#|W0| * \rank V1)%N.
- transitivity (\rank (\sum_(w in W0) V1 *m rUW1 w))%R.
- by rewrite sumW0 mxrank1 /= (dim_abelemE abelHbar) // oHbar pfactorK.
- rewrite (mxdirectP dxW0) -sum_nat_const; apply: eq_bigr => x /sW01/= Wx.
- by rewrite mxrankMfree ?row_free_unit ?repr_mx_unit.
- have oH1: #|H1| = (p ^ \rank V1)%N.
- by rewrite -{1}(card_Fp p_pr) -card_rowg rowg_mxK card_injm ?abelem_rV_injm.
- have oW0: #|W0| = q.
- apply/prime_nt_dvdP=> //; last by rewrite def_q dvdn_mulr.
- apply: contraTneq (proper_card ltH1H) => trivW0.
- by rewrite oHbar def_q trivW0 mul1n -oH1 ltnn.
- have q_gt0 := prime_gt0 pr_q.
- rewrite oH1 -(mulKn (\rank V1) q_gt0) -{1}oW0 -def_q divnn q_gt0.
- have defHbar: \big[dprod/1]_(w in W0) H1 :^ w = Hbar.
- have inj_rV_Hbar := rVabelem_injm abelHbar ntHbar.
- have/(injm_bigdprod _ inj_rV_Hbar)/= := bigdprod_rowg sumW0 dxW0.
- rewrite sub_im_abelem_rV rowg1 im_rVabelem => <- //=; apply: eq_bigr => w.
- by move/sW01=> Ww; rewrite abelem_rowgJ ?rowg_mxK ?abelem_rV_mK.
- have injW0: {in W0 &, injective (fun w => H1 :^ w)}.
- move=> x y Wx Wy /= eq_Hxy; apply: contraNeq ntH1 => neq_xy.
- rewrite -(conjsg_eq1 _ x) -[H1 :^ x]setIid {1}eq_Hxy; apply/eqP.
- rewrite (bigD1 y) // (bigD1 x) /= ?Wx // dprodA in defHbar.
- by case/dprodP: defHbar => [[_ _ /dprodP[_ _ _ ->] _]].
- have defH1W0: [set H1 :^ w | w in W0] = [set H1 :^ w | w in W1 / H0].
- apply/eqP; rewrite eqEcard (card_in_imset injW0) oW0 -oW1b leq_imset_card.
- rewrite andbT; apply/subsetP=> _ /imsetP[w /sW01/= Ww ->].
- move: Ww; rewrite norm_joinEr ?quotientMl // => /mulsgP[x w1 Ux Ww1 ->].
- by rewrite conjsgM (normsP nH1U) // mem_imset.
- have injW1: {in W1 / H0 &, injective (fun w => H1 :^ w)}.
- by apply/imset_injP; rewrite -defH1W0 (card_in_imset injW0) oW0 oW1b.
- by rewrite -(big_imset id injW1) -defH1W0 big_imset.
-split=> //; set a := #|_ : _|; pose q1 := #|(W1 / H0)^#|.
-have a_gt1: a > 1.
- rewrite indexg_gt1 subsetIidl /= astabQ -sub_quotient_pre //.
- apply: contra neqCU => cH1U; rewrite [C]unlock (sameP eqP setIidPl) /= astabQ.
- rewrite -sub_quotient_pre // -(bigdprodWY defHbar) cent_gen centsC.
- by apply/bigcupsP=> w Ww; rewrite centsC centJ -(normsP nUW1b w) ?conjSg.
-have Wb1: 1 \in W1bar := group1 _.
-have ->: q.-1 = q1 by rewrite -oW1b (cardsD1 1) Wb1.
-have /cyclicP[h defH1]: cyclic H1 by rewrite prime_cyclic ?oH1.
-have o_h: #[h] = p by rewrite defH1 in oH1.
-have inj_Zp_h w := injm_Zp_unitm (h ^ w).
-pose phi w := invm (inj_Zp_h w) \o restr_perm <[h ^ w]> \o actperm 'Q.
-have dU w: w \in W1bar -> {subset U <= 'dom (phi w)}.
- move=> Ww x Ux; have Qx := subsetP (acts_dom actsUH1) x Ux.
- rewrite inE Qx /= im_Zp_unitm inE mem_morphpre //=; last first.
- by apply: Aut_restr_perm (actperm_Aut 'Q _); rewrite //= quotientT.
- rewrite cycleJ -defH1 !inE /=; apply/subsetP=> z H1w_z; rewrite inE actpermK.
- rewrite qactJ (subsetP nH0U) ?memJ_norm // normJ mem_conjg.
- by rewrite (subsetP nH1U) // -mem_conjg (normsP nUW1b) ?mem_quotient.
-have sUD := introT subsetP (dU _ _).
-have Kphi w: 'ker (phi w) = 'C(H1 :^ w | 'Q).
- rewrite !ker_comp ker_invm -kerE ker_restr_perm defH1 -cycleJ.
- apply/setP=> x; rewrite !inE; congr (_ && _) => /=.
- by apply: eq_subset_r => h1; rewrite !inE actpermK.
-have o_phiU w: w \in W1bar -> #|phi w @* U| = a.
- move=> Ww; have [w1 Nw1 Ww1 def_w] := morphimP Ww.
- rewrite card_morphim Kphi (setIidPr _) ?sUD // /a indexgI /= !astabQ.
- by rewrite centJ def_w morphpreJ // -{1}(normsP nUW1 w1 Ww1) indexJg.
-have a_dv_p1: a %| p.-1.
- rewrite -(o_phiU 1) // (dvdn_trans (cardSg (subsetT _))) // card_units_Zp //.
- by rewrite conjg1 o_h (@totient_pfactor p 1) ?muln1.
-have cycZhw w: cyclic (units_Zp #[h ^ w]).
- rewrite -(injm_cyclic (inj_Zp_h w)) // im_Zp_unitm Aut_prime_cyclic //=.
- by rewrite -orderE orderJ o_h.
-have cyc_phi1U: cyclic (phi 1 @* U) := cyclicS (subsetT _) (cycZhw 1).
-split=> //; last have{cyc_phi1U a_dv_p1} [z def_z] := cyclicP cyc_phi1U.
- by rewrite -(conjsg1 H1) -Kphi (isog_cyclic (first_isog_loc _ _)) ?sUD.
-have o_hw w: #[h ^ w] = #[h ^ 1] by rewrite !orderJ.
-pose phi1 w x := eq_rect _ (fun m => {unit 'Z_m}) (phi w x) _ (o_hw w).
-have val_phi1 w x: val (phi1 w x) = val (phi w x) :> nat.
- by rewrite /phi1; case: _ / (o_hw _).
-have mem_phi1 w x: w \in W1bar -> x \in U -> phi1 w x \in <[z]>%G.
- move=> Ww Ux; have: #|<[z]>%G| = a by rewrite /= -def_z o_phiU.
- rewrite /phi1; case: _ / (o_hw w) <[z]>%G => A oA /=.
- suffices <-: phi w @* U = A by rewrite mem_morphim // dU.
- by apply/eqP; rewrite (eq_subG_cyclic (cycZhw w)) ?subsetT // oA o_phiU.
-have o_z: #[z] = a by rewrite orderE -def_z o_phiU.
-pose phi0 w x := ecast m 'Z_m o_z (invm (injm_Zpm z) (phi1 w x)).
-pose psi x := (\row_(i < q1) (phi0 (enum_val i) x * (phi0 1 x)^-1)%g)%R.
-have psiM: {in U &, {morph psi: x y / x * y}}.
- have phi0M w: w \in W1bar -> {in U &, {morph phi0 w: x y / x * y}}.
- move=> Ww x y Ux Uy; rewrite /phi0; case: (a) / (o_z) => /=.
- rewrite -morphM; first 1 [congr (invm _ _)] || by rewrite im_Zpm mem_phi1.
- by rewrite /phi1; case: _ / (o_hw w); rewrite /= -morphM ?dU.
- move=> x y Ux Uy; apply/rowP=> i; have /setD1P[_ Ww] := enum_valP i.
- by rewrite !{1}mxE !{1}phi0M // addrCA -addrA -opprD addrCA addrA.
-suffices Kpsi: 'ker (Morphism psiM) = C.
- by exists [group of Morphism psiM @* U]; rewrite /Ubar -Kpsi first_isog.
-apply/esym/eqP; rewrite eqEsubset; apply/andP; split.
- rewrite [C]unlock -(bigdprodWY defHbar); apply/subsetP=> x /setIP[Ux cHx].
- suffices phi0x1 w: w \in W1bar -> phi0 w x = 1.
- rewrite !inE Ux; apply/eqP/rowP=> i; have /setD1P[_ Ww] := enum_valP i.
- by rewrite !mxE !phi0x1 ?mulgV.
- move=> Ww; apply: val_inj; rewrite /phi0; case: (a) / (o_z); congr (val _).
- suffices /eqP->: phi1 w x == 1 by rewrite morph1.
- rewrite -2!val_eqE [val _]val_phi1 -(o_hw w) [phi _ _]mker // Kphi.
- by apply: subsetP (astabS _ _) _ cHx; rewrite sub_gen // (bigcup_sup w).
-have sKU: 'ker (Morphism psiM) \subset U by apply: subsetIl.
-rewrite -quotient_sub1 -?(Frobenius_trivg_cent frobUW1c); last first.
- by apply: subset_trans (normal_norm nsCUW1); rewrite subIset ?joing_subl.
-rewrite subsetI quotientS //= quotient_cents2r // [C]unlock subsetI.
-rewrite (subset_trans (commSg W1 sKU)) ?commg_subl //= astabQ gen_subG /=.
-apply/subsetP=> _ /imset2P[x w1 Kx Ww1 ->].
-have:= Kx; rewrite -groupV 2!inE groupV => /andP[Ux /set1P/rowP psi_x'0].
-have [nH0x Ux'] := (subsetP nH0U x Ux, groupVr Ux); pose x'b := (inMb x)^-1.
-rewrite mem_morphpre ?groupR ?morphR //= ?(subsetP nH0W1) //.
-have conj_x'b w: w \in W1bar -> (h ^ w) ^ x'b = (h ^ w) ^+ val (phi 1 x^-1).
- move=> Ww; transitivity (Zp_unitm (phi w x^-1) (h ^ w)).
- have /morphpreP[_ /morphpreP[Px' Rx']] := dU w Ww x^-1 Ux'.
- rewrite invmK ?restr_permE ?cycle_id //.
- by rewrite actpermE qactJ groupV nH0x morphV.
- have:= Ww; rewrite -(setD1K Wb1) autE ?cycle_id // => /setU1P[-> // | W'w].
- have /eqP := psi_x'0 (enum_rank_in W'w w); rewrite 2!mxE enum_rankK_in //.
- rewrite -eq_mulgV1 -val_eqE /phi0; case: (a) / (o_z); rewrite /= val_eqE.
- rewrite (inj_in_eq (injmP (injm_invm _))) /= ?im_Zpm ?mem_phi1 //.
- by rewrite -2!val_eqE /= !val_phi1 // => /eqP->.
-rewrite -sub_cent1 -(bigdprodWY defHbar) gen_subG; apply/bigcupsP=> w2 Ww2.
-rewrite defH1 -cycleJ cycle_subG cent1C inE conjg_set1 !conjgM // conj_x'b //.
-rewrite conjXg -!conjgM -conj_x'b ?groupM ?groupV ?mem_quotient //.
-by rewrite !conjgM !conjgKV.
-Qed.
-
-(* This is Peterfalvi (9.7)(b). *)
-(* Note that part of this statement feeds directly into the final chapter of *)
-(* the proof (PFsection14 and BGappendixC) and is not used before; we have *)
-(* thus chosen to formulate the statement of (9.7)(b) accordingly. *)
-(* For example, we supply separately the three component of the semi-direct *)
-(* product isomorphism, because no use is made of the global isomorphism. We *)
-(* also state explicitly that the image of W2bar is Fp because this is the *)
-(* fact used in B & G, Appendix C, it is readily available during the proof, *)
-(* whereas it can only be derived from the original statement of (9.7)(b) by *)
-(* using Galois theory. Indeed the Galois part of the isomorphism is only *)
-(* needed for this -- so with the formulation below it will not be used. *)
-(* In order to avoid the use of the Wedderburn theorem on finite division *)
-(* rings we build the field F from the enveloping algebra of the *)
-(* representation of U rather than its endomorphism ring: then the fact that *)
-(* Ubar is abelian yields commutativity directly. *)
-Lemma typeP_Galois_P :
- typeP_Galois ->
- {F : finFieldType & {phi : {morphism Hbar >-> F}
- & {psi : {morphism U >-> {unit F}} & {eta : {morphism W1 >-> {perm F}}
- & forall alpha : {perm F}, reflect (rmorphism alpha) (alpha \in eta @* W1)
- & [/\ 'injm eta, {in Hbar & W1, morph_act 'Q 'P phi eta}
- & {in U & W1, forall x w, val (psi (x ^ w)) = eta w (val (psi x))}]}
- & 'ker psi = C /\ {in Hbar & U, morph_act 'Q 'U phi psi}}
- & [/\ #|F| = (p ^ q)%N, isom Hbar [set: F] phi & phi @* W2bar = <[1%R : F]>]}
- & [/\ cyclic Ubar, coprime u p.-1 & u %| (p ^ q).-1 %/ p.-1]}.
-Proof.
-move=> irrU; have [_ sUW1M _ /joing_subP[nHU nHW1] _] := sdprod_context defHUW1.
-have [nHbU nHbW1] := (quotient_norms H0 nHU, quotient_norms H0 nHW1).
-have{sUW1M} /joing_subP[nH0U nH0W1] := subset_trans sUW1M nH0M.
-have [ltCU oW2b oHb] := Ptype_Fcore_factor_facts.
-pose rU := abelem_repr abelHbar ntHbar nHbU.
-pose inHb := rVabelem abelHbar ntHbar; pose outHb := abelem_rV abelHbar ntHbar.
-have{irrU} irrU: mx_irreducible rU by apply/abelem_mx_irrP; rewrite -acts_irrQ.
-pose E_U := [pred A | (A \in enveloping_algebra_mx rU)%MS].
-have cEE A: A \in E_U -> centgmx rU A.
- case/envelop_mxP=> z_ ->{A}; rewrite -memmx_cent_envelop linear_sum.
- rewrite summx_sub // => x Ux; rewrite linearZ scalemx_sub {z_}//=.
- rewrite memmx_cent_envelop; apply/centgmxP=> y Uy.
- rewrite -repr_mxM // commgC 2?repr_mxM ?(groupR, groupM) // -/rU.
- apply/row_matrixP=> i; rewrite row_mul; move: (row i _) => h.
- have cHbH': (U / H0)^`(1) \subset 'C(Hbar).
- by rewrite -quotient_der ?quotient_cents.
- apply: rVabelem_inj; rewrite rVabelemJ ?groupR //.
- by apply: (canLR (mulKg _)); rewrite -(centsP cHbH') ?mem_commg ?mem_rVabelem.
-have{cEE} [F [outF [inF outFK inFK] E_F]]:
- {F : finFieldType & {outF : {rmorphism F -> 'M(Hbar)%Mg}
- & {inF : {additive _} | cancel outF inF & {in E_U, cancel inF outF}}
- & forall a, outF a \in E_U}}%R.
-- pose B := row_base (enveloping_algebra_mx rU).
- have freeB: row_free B by apply: row_base_free.
- pose outF := [additive of vec_mx \o mulmxr B].
- pose inF := [additive of mulmxr (pinvmx B) \o mxvec].
- have E_F a: outF a \in E_U by rewrite !inE vec_mxK mulmx_sub ?eq_row_base.
- have inK: {in E_U, cancel inF outF}.
- by move=> A E_A; rewrite /= mulmxKpV ?mxvecK ?eq_row_base.
- have outI: injective outF := inj_comp (can_inj vec_mxK) (row_free_inj freeB).
- have outK: cancel outF inF by move=> a; apply: outI; rewrite inK ?E_F.
- pose one := inF 1%R; pose mul a b := inF (outF a * outF b)%R.
- have outM: {morph outF: a b / mul a b >-> a * b}%R.
- by move=> a b; rewrite inK //; apply: envelop_mxM; apply: E_F.
- have out0: outF 0%R = 0%R by apply: raddf0.
- have out1: outF one = 1%R by rewrite inK //; apply: envelop_mx1.
- have nzFone: one != 0%R by rewrite -(inj_eq outI) out1 out0 oner_eq0.
- have mulA: associative mul by move=> *; apply: outI; rewrite !{1}outM mulrA.
- have mulC: commutative mul.
- move=> a b; apply: outI; rewrite !{1}outM.
- by apply: cent_mxP (E_F a); rewrite memmx_cent_envelop cEE ?E_F.
- have mul1F: left_id one mul by move=> a; apply: outI; rewrite outM out1 mul1r.
- have mulD: left_distributive mul +%R%R.
- by move=> a1 a2 b; apply: canLR outK _; rewrite !raddfD mulrDl -!{1}outM.
- pose Fring_NC := RingType 'rV__ (ComRingMixin mulA mulC mul1F mulD nzFone).
- pose Fring := ComRingType Fring_NC mulC.
- have outRM: multiplicative (outF : Fring -> _) by [].
- have mulI (nza : {a | a != 0%R :> Fring}): GRing.rreg (val nza).
- case: nza => a /=; rewrite -(inj_eq outI) out0 => nzA b1 b2 /(congr1 outF).
- rewrite !{1}outM => /row_free_inj eqB12; apply/outI/eqB12.
- by rewrite row_free_unit (mx_Schur irrU) ?cEE ?E_F.
- pose inv (a : Fring) := oapp (fun nza => invF (mulI nza) one) a (insub a).
- have inv0: (inv 0 = 0)%R by rewrite /inv insubF ?eqxx.
- have mulV: GRing.Field.axiom inv.
- by move=> a nz_a; rewrite /inv insubT /= (f_invF (mulI (exist _ _ _))).
- pose Funit := FieldUnitMixin mulV inv0.
- pose FringUcl := @GRing.ComUnitRing.Class _ (GRing.ComRing.class Fring) Funit.
- have Ffield := @FieldMixin (GRing.ComUnitRing.Pack FringUcl nat) _ mulV inv0.
- pose F := FieldType (IdomainType _ (FieldIdomainMixin Ffield)) Ffield.
- by exists [finFieldType of F], (AddRMorphism outRM); first exists inF.
-pose in_uF (a : F) : {unit F} := insubd (1 : {unit F}) a.
-have in_uF_E a: a != 1 -> val (in_uF a) = a.
- by move=> nt_a; rewrite insubdK /= ?unitfE.
-have [psi psiK]: {psi : {morphism U >-> {unit F}}
- | {in U, forall x, outF (val (psi x)) = rU (inMb x)}}.
-- pose psi x := in_uF (inF (rU (inMb x))).
- have psiK x: x \in U -> outF (val (psi x)) = rU (inMb x).
- move/(mem_quotient H0)=> Ux; have EUx := envelop_mx_id rU Ux.
- rewrite in_uF_E ?inFK //; apply: contraTneq (repr_mx_unitr rU Ux).
- by move/(canRL_in inFK EUx)->; rewrite rmorph0 unitr0.
- suffices psiM: {in U &, {morph psi: x y / x * y}} by exists (Morphism psiM).
- move=> x y Ux Uy /=; apply/val_inj/(can_inj outFK); rewrite rmorphM //.
- by rewrite !{1}psiK ?groupM // morphM ?(subsetP nH0U) ?repr_mxM ?mem_quotient.
-have /trivgPn/sig2W[s W2s nts]: W2bar != 1%G.
- by rewrite -cardG_gt1 oW2b prime_gt1.
-pose sb := outHb s; have [Hs cW1s] := setIP W2s.
-have nz_sb: sb != 0%R by rewrite morph_injm_eq1 ?abelem_rV_injm.
-pose phi' a : coset_of H0 := inHb (sb *m outF a)%R.
-have Hphi' a: phi' a \in Hbar by apply: mem_rVabelem.
-have phi'D: {in setT &, {morph phi' : a b / a * b}}.
- by move=> a b _ _; rewrite /phi' !raddfD [inHb _]morphM ?mem_im_abelem_rV.
-have inj_phi': injective phi'.
- move=> a b /rVabelem_inj eq_sab; apply: contraNeq nz_sb.
- rewrite -[sb]mulmx1 idmxE -(rmorph1 outF) -subr_eq0 => /divff <-.
- by rewrite rmorphM mulmxA !raddfB /= eq_sab subrr mul0mx.
-have injm_phi': 'injm (Morphism phi'D) by apply/injmP; apply: in2W.
-have Dphi: 'dom (invm injm_phi') = Hbar.
- apply/setP=> h; apply/morphimP/idP=> [[a _ _ ->] // | Hh].
- have /cyclic_mxP[A E_A def_h]: (outHb h <= cyclic_mx rU sb)%MS.
- by rewrite -(mxsimple_cyclic irrU) ?submx1.
- by exists (inF A); rewrite ?inE //= /phi' inFK // -def_h [inHb _]abelem_rV_K.
-have [phi [def_phi Kphi _ im_phi]] := domP _ Dphi.
-have{Kphi} inj_phi: 'injm phi by rewrite Kphi injm_invm.
-have{im_phi} im_phi: phi @* Hbar = setT by rewrite im_phi -Dphi im_invm.
-have phiK: {in Hbar, cancel phi phi'} by rewrite def_phi -Dphi; apply: invmK.
-have{def_phi Dphi injm_phi'} phi'K: cancel phi' phi.
- by move=> a; rewrite def_phi /= invmE ?inE.
-have phi'1: phi' 1%R = s by rewrite /phi' rmorph1 mulmx1 [inHb _]abelem_rV_K.
-have phi_s: phi s = 1%R by rewrite -phi'1 phi'K.
-have phiJ: {in Hbar & U, forall h x, phi (h ^ inMb x) = phi h * val (psi x)}%R.
- move=> h x Hh Ux; have Uxb := mem_quotient H0 Ux.
- apply: inj_phi'; rewrite phiK ?memJ_norm ?(subsetP nHbU) // /phi' rmorphM.
- by rewrite psiK // mulmxA [inHb _]rVabelemJ // -/inHb [inHb _]phiK.
-have Kpsi: 'ker psi = C.
- apply/setP=> x; rewrite [C]unlock 2!in_setI /= astabQ; apply: andb_id2l => Ux.
- have Ubx := mem_quotient H0 Ux; rewrite 3!inE (subsetP nH0U) //= inE.
- apply/eqP/centP=> [psi_x1 h Hh | cHx]; last first.
- by apply/val_inj; rewrite -[val _]mul1r -phi_s -phiJ // conjgE -cHx ?mulKg.
- red; rewrite (conjgC h) -[h ^ _]phiK ?memJ_norm ?(subsetP nHbU) ?phiJ //.
- by rewrite psi_x1 mulr1 phiK.
-have etaP (w : subg_of W1): injective (fun a => phi (phi' a ^ inMb (val w))).
- case: w => w /=/(mem_quotient H0)/(subsetP nHbW1) => nHw a b eq_ab.
- apply/inj_phi'/(conjg_inj (inMb w)).
- by apply: (injmP inj_phi) eq_ab; rewrite memJ_norm ?mem_rVabelem.
-pose eta w : {perm F} := perm (etaP (subg W1 w)).
-have etaK: {in Hbar & W1, forall h w, eta w (phi h) = phi (h ^ inMb w)}.
- by move=> h w Hh Ww; rewrite /= permE subgK ?phiK.
-have eta1 w: w \in W1 -> eta w 1%R = 1%R.
- move=> Ww; rewrite -phi_s etaK //.
- by rewrite conjgE (centP cW1s) ?mulKg ?mem_quotient.
-have etaM: {in W1 &, {morph eta: w1 w2 / w1 * w2}}.
- move=> w1 w2 Ww1 Ww2; apply/permP=> a; rewrite -[a]phi'K permM.
- rewrite !etaK ?memJ_norm ?groupM ?(subsetP nHbW1) ?mem_quotient //.
- by rewrite -conjgM -morphM ?(subsetP nH0W1).
-have etaMpsi a: {in U & W1, forall x w,
- eta w (a * val (psi x)) = eta w a * val (psi (x ^ w)%g)}%R.
-- move=> x w Ux Ww; rewrite -[a]phi'K (etaK _ w (Hphi' a) Ww).
- rewrite -!phiJ // ?memJ_norm ?(subsetP nHbW1, subsetP nUW1) ?mem_quotient //.
- rewrite etaK ?memJ_norm ?(subsetP nHbU) ?mem_quotient // -!conjgM.
- by rewrite conjgC -morphJ ?(subsetP nH0U x Ux, subsetP nH0W1 w Ww).
-have psiJ: {in U & W1, forall x w, val (psi (x ^ w)) = eta w (val (psi x))}.
- by move=> x w Ux Ww /=; rewrite -[val _]mul1r -(eta1 w Ww) -etaMpsi ?mul1r.
-have etaRM w: w \in W1 -> rmorphism (eta w).
- move=> Ww; have nUw := subsetP nHbW1 _ (mem_quotient _ Ww).
- have etaD: additive (eta w).
- move=> a b; rewrite -[a]phi'K -[b]phi'K -!zmodMgE -!zmodVgE.
- rewrite -morphV // -morphM ?{1}etaK ?groupM ?groupV // conjMg conjVg.
- by rewrite morphM 1?morphV ?groupV // memJ_norm.
- do 2![split=> //] => [a b|]; last exact: eta1.
- rewrite -[a]outFK; have /envelop_mxP[d ->] := E_F a.
- rewrite raddf_sum mulr_suml ![eta w _](raddf_sum (Additive etaD)) mulr_suml.
- apply: eq_bigr => _ /morphimP[x Nx Ux ->]; move: {d}(d _) => dx.
- rewrite -[dx]natr_Zp scaler_nat !(mulrnAl, raddfMn); congr (_ *+ dx)%R.
- by rewrite -psiK //= outFK mulrC etaMpsi // mulrC psiJ.
-have oF: #|F| = (p ^ q)%N by rewrite -cardsT -im_phi card_injm.
-pose nF := <[1%R : F]>; have o_nF: #|nF| = p.
- by rewrite -orderE -phi_s (order_injm inj_phi) // (abelem_order_p abelHbar).
-have cyc_uF := @field_unit_group_cyclic F.
-exists F.
- exists phi; last first.
- split=> //; first exact/isomP; apply/esym/eqP; rewrite eqEcard o_nF -phi_s.
- by rewrite (@cycle_subG F) mem_morphim //= card_injm ?subsetIl ?oW2b.
- exists psi => //; last first.
- by split=> // h x Hh Ux; rewrite qactJ (subsetP nH0U) ?phiJ.
- have inj_eta: 'injm (Morphism etaM).
- have /properP[_ [h Hh notW2h]]: W2bar \proper Hbar.
- by rewrite properEcard subsetIl oW2b oHb (ltn_exp2l 1) prime_gt1.
- apply/subsetP=> w /morphpreP[Ww /set1P/permP/(_ (phi h))].
- rewrite etaK // permE => /(injmP inj_phi) => chw.
- rewrite -(@prime_TIg _ W1 <[w]>) //; first by rewrite inE Ww cycle_id.
- rewrite proper_subn // properEneq cycle_subG Ww andbT.
- apply: contraNneq notW2h => defW1; rewrite inE Hh /= -defW1.
- rewrite quotient_cycle ?(subsetP nH0W1) // cent_cycle cent1C inE.
- by rewrite conjg_set1 chw ?memJ_norm // (subsetP nHbW1) ?mem_quotient.
- exists (Morphism etaM) => [alpha |]; last first.
- by split=> // h w Hh Ww /=; rewrite qactJ (subsetP nH0W1) -?etaK.
- pose autF (f : {perm F}) := rmorphism f. (* Bits of Galois theory... *)
- have [r prim_r]: {r : F | forall f g, autF f -> autF g -> f r = g r -> f = g}.
- have /cyclicP/sig_eqW[r def_uF] := cyc_uF [set: {unit F}]%G.
- exists (val r) => f g fRM gRM eq_fgr; apply/permP=> a.
- rewrite (_ : f =1 RMorphism fRM) // (_ : g =1 RMorphism gRM) //.
- have [-> | /in_uF_E <-] := eqVneq a 0%R; first by rewrite !rmorph0.
- have /cycleP[m ->]: in_uF a \in <[r]> by rewrite -def_uF inE.
- by rewrite val_unitX !rmorphX /= eq_fgr.
- have /sigW[P /and3P[Pr0 nP lePq]]:
- exists P: {poly F}, [&& root P r, all (mem nF) P & #|root P| <= q].
- - pose Mr := (\matrix_(i < q.+1) (sb *m outF (r ^+ i)))%R.
- have /rowV0Pn[v /sub_kermxP vMr0 nz_v]: kermx Mr != 0%R.
- rewrite kermx_eq0 neq_ltn ltnS (leq_trans (rank_leq_col Mr)) //.
- by rewrite (dim_abelemE abelHbar) // oHb pfactorK.
- pose P : {poly F} := (\poly_(i < q.+1) (v 0 (inord i))%:R)%R.
- have szP: size P <= q.+1 by apply: size_poly.
- exists P; apply/and3P; split.
- + apply/eqP/inj_phi'; congr (inHb _); rewrite rmorph0 mulmx0 -vMr0.
- rewrite horner_poly !raddf_sum mulmx_sum_row; apply: eq_bigr => i _.
- rewrite rowK inord_val //= mulr_natl rmorphMn -scaler_nat scalemxAr.
- by rewrite natr_Zp.
- + apply/(all_nthP 0%R)=> i /leq_trans/(_ szP) le_i_q.
- by rewrite coef_poly /= le_i_q mem_cycle.
- rewrite cardE -ltnS (leq_trans _ szP) //.
- rewrite max_poly_roots ?enum_uniq //; last first.
- by apply/allP=> r'; rewrite mem_enum.
- apply: contraNneq nz_v => /polyP P0; apply/eqP/rowP=> i; apply/eqP.
- have /eqP := P0 i; rewrite mxE coef0 coef_poly ltn_ord inord_val.
- have charF: p \in [char F]%R by rewrite !inE p_pr -order_dvdn -o_nF /=.
- by rewrite -(dvdn_charf charF) (dvdn_charf (char_Fp p_pr)) natr_Zp.
- have{Pr0 nP} fPr0 f: autF f -> root P (f r).
- move=> fRM; suff <-: map_poly (RMorphism fRM) P = P by apply: rmorph_root.
- apply/polyP=> i; rewrite coef_map.
- have [/(nth_default _)-> | lt_i_P] := leqP (size P) i; first exact: rmorph0.
- by have /cycleP[n ->] := all_nthP 0%R nP i lt_i_P; apply: rmorph_nat.
- apply: (iffP morphimP) => [[w _ Ww ->] | alphaRM]; first exact: etaRM.
- suffices /setP/(_ (alpha r)): [set (eta w) r | w in W1] = [set t | root P t].
- rewrite inE fPr0 // => /imsetP[w Ww def_wr]; exists w => //.
- by apply: prim_r => //; apply: etaRM.
- apply/eqP; rewrite eqEcard; apply/andP; split.
- by apply/subsetP=> _ /imsetP[w Ww ->]; rewrite inE fPr0 //; apply: etaRM.
- rewrite (@cardsE F) card_in_imset // => w1 w2 Ww1 Ww2 /= /prim_r eq_w12.
- by apply: (injmP inj_eta) => //; apply: eq_w12; apply: etaRM.
-have isoUb: isog Ubar (psi @* U) by rewrite /Ubar -Kpsi first_isog.
-pose unF := [set in_uF a | a in nF^#].
-have unF_E: {in nF^#, cancel in_uF val} by move=> a /setD1P[/in_uF_E].
-have unFg: group_set unF.
- apply/group_setP; split=> [|_ _ /imsetP[a nFa ->] /imsetP[b nFb ->]].
- have nF1: 1%R \in nF^# by rewrite !inE cycle_id oner_eq0.
- by apply/imsetP; exists 1%R => //; apply: val_inj; rewrite unF_E.
- have nFab: (a * b)%R \in nF^#.
- rewrite !inE mulf_eq0 negb_or.
- have [[-> /cycleP[m ->]] [-> /cycleP[n ->]]] := (setD1P nFa, setD1P nFb).
- by rewrite -natrM mem_cycle.
- by apply/imsetP; exists (a * b)%R => //; apply: val_inj; rewrite /= !unF_E.
-have <-: #|Group unFg| = p.-1.
- by rewrite -o_nF (cardsD1 1 nF) group1 (card_in_imset (can_in_inj unF_E)).
-have <-: #|[set: {unit F}]| = (p ^ q).-1.
- rewrite -oF -(cardC1 1) cardsT card_sub; apply: eq_card => a /=.
- by rewrite !inE unitfE.
-rewrite /u (isog_cyclic isoUb) (card_isog isoUb) cyc_uF.
-suffices co_u_p1: coprime #|psi @* U| #|Group unFg|.
- by rewrite -(Gauss_dvdr _ co_u_p1) mulnC divnK ?cardSg ?subsetT.
-rewrite -(cyclic_dprod (dprodEY _ _)) ?cyc_uF //.
- by rewrite (sub_abelian_cent2 (cyclic_abelian (cyc_uF [set:_]%G))) ?subsetT.
-apply/trivgP/subsetP=> _ /setIP[/morphimP[x Nx Ux ->] /imsetP[a nFa /eqP]].
-have nCx: x \in 'N(C) by rewrite -Kpsi (subsetP (ker_norm _)).
-rewrite -val_eqE (unF_E a) //; case/setD1P: nFa => _ /cycleP[n {a}->].
-rewrite zmodXgE => /eqP def_psi_x; rewrite mker ?set11 // Kpsi coset_idr //.
-apply/set1P; rewrite -set1gE -(Frobenius_trivg_cent frobUW1c) /= -/C.
-rewrite inE mem_quotient //= -sub1set -quotient_set1 ?quotient_cents2r //.
-rewrite gen_subG /= -/C -Kpsi; apply/subsetP=> _ /imset2P[_ w /set1P-> Ww ->].
-have Uxw: x ^ w \in U by rewrite memJ_norm ?(subsetP nUW1).
-apply/kerP; rewrite (morphM, groupM) ?morphV ?groupV //.
-apply/(canLR (mulKg _))/val_inj; rewrite psiJ // mulg1 def_psi_x.
-exact: (rmorph_nat (RMorphism (etaRM w Ww))).
-Qed.
-
-Local Open Scope ring_scope.
-
-Let redM := [predC irr M].
-Let mu_ := filter redM (S_ H0).
-
-(* This subproof is shared between (9.8)(b) and (9.9)(b). *)
-Let nb_redM_H0 : size mu_ = p.-1 /\ {subset mu_ <= S_ H0C}.
-Proof.
-have pddM := FT_prDade_hypF maxM MtypeP; pose ptiWM := prDade_prTI pddM.
-have [nsHUM sW1M /mulG_sub[sHUM _] nHUW1 tiHUW1] := sdprod_context defM.
-have [nsHHU sUHU /mulG_sub[sHHU _] nHU tiHU] := sdprod_context defHU.
-have nb_redM K:
- K <| M -> K \subset HU -> K :&: H = H0 -> count redM (S_ K) = p.-1.
-- move=> nsKM sKHU tiKHbar; have [sKM nKM] := andP nsKM; pose b L := (L / K)%G.
- have [nsKHU [_ [_ sW2HU cycW2 _] _]] := (normalS sKHU sHUM nsKM, ptiWM).
- have nKW2 := subset_trans sW2HU (normal_norm nsKHU).
- have oW2b: #|b W2| = p.
- have [_ <- _] := Ptype_Fcore_factor_facts; rewrite defW2bar.
- rewrite !card_quotient ?(subset_trans (subset_trans sW2HU sHUM)) //.
- by rewrite -indexgI -{2}(setIidPl sW2H) setIAC -setIA tiKHbar indexgI.
- have{cycW2} cycW2b: cyclic (b W2) by apply: quotient_cyclic.
- have ntW2b: (W2 / K != 1)%g by rewrite -cardG_gt1 oW2b prime_gt1.
- have{ntW2b} [defWb ptiWMb]:= primeTIhyp_quotient ptiWM ntW2b sKHU nsKM.
- pose muK j := (primeTIred ptiWMb j %% K)%CF.
- apply/eqP; have <-: size (image muK (predC1 0)) = p.-1.
- by rewrite size_map -cardE cardC1 card_Iirr_cyclic ?oW2b.
- rewrite -size_filter -uniq_size_uniq ?filter_uniq ?seqInd_uniq // => [|phi].
- by apply/dinjectiveP=> j1 j2 _ _ /(can_inj (cfModK nsKM))/prTIred_inj.
- rewrite mem_filter; apply/imageP/andP=> [[j nz_j ->] | [red_phi]]; last first.
- case/seqIndP=> s /setDP[kerK ker'H] Dphi; rewrite !inE in kerK ker'H.
- pose s1 := quo_Iirr K s; have Ds: s = mod_Iirr s1 by rewrite quo_IirrK.
- rewrite {phi}Dphi Ds mod_IirrE ?cfIndMod // in kerK ker'H red_phi *.
- have{red_phi} red_s1: 'Ind 'chi_s1 \notin irr (M / K) by rewrite -cfMod_irr.
- have [[j Ds1] | [/idPn//]] := prTIres_irr_cases ptiWMb s1.
- rewrite Ds1 cfInd_prTIres -/(muK j) in ker'H *; exists j => //.
- by apply: contraNneq ker'H => ->; rewrite prTIres0 rmorph1 cfker_cfun1.
- have red_j: redM (muK j) by rewrite /redM /= cfMod_irr // prTIred_not_irr.
- have [s DmuKj]: exists s, muK j = 'Ind[M, HU] 'chi_s.
- exists (mod_Iirr (primeTI_Ires ptiWMb j)).
- by rewrite mod_IirrE // cfIndMod // cfInd_prTIres.
- split=> //; apply/seqIndP; exists s; rewrite // !inE andbC.
- rewrite -(@sub_cfker_Ind_irr _ M) ?gFnorm // -DmuKj cfker_mod //=.
- have [[j1 Ds] | [/idPn]] := prTIres_irr_cases ptiWM s; last by rewrite -DmuKj.
- rewrite Ds cfker_prTIres //; apply: contraNneq nz_j => j1_0.
- apply/eqP/(prTIred_inj ptiWMb)/(can_inj (cfModK nsKM)); rewrite -{1}/(muK j).
- by rewrite DmuKj Ds j1_0 -cfInd_prTIres !prTIres0 -cfIndMod ?rmorph1.
-have [sH0HU sH0M] := (subset_trans sH0H sHHU, subset_trans sH0H (gFsub _ _)).
-have sz_mu: size mu_ = p.-1.
- by rewrite size_filter nb_redM ?(setIidPl sH0H) // /normal sH0M.
-have s_muC_mu: {subset filter redM (S_ H0C) <= mu_}.
- move=> phi; rewrite /= !mem_filter => /andP[->]; apply: seqIndS.
- by rewrite setSD // Iirr_kerS ?joing_subl.
-have UmuC: uniq (filter redM (S_ H0C)) by rewrite filter_uniq ?seqInd_uniq.
-have [|Dmu _] := leq_size_perm UmuC s_muC_mu; last first.
- by split=> // phi; rewrite -Dmu mem_filter => /andP[].
-have [nsH0C_M _ _ _] := nsH0xx_M.
-have sCHU := subset_trans sCU sUHU; have sCM := subset_trans sCHU sHUM.
-have sHOC_HU: H0C \subset HU by apply/joing_subP.
-rewrite sz_mu size_filter nb_redM //= norm_joinEr ?(subset_trans sCM) //.
-by rewrite -group_modl //= setIC [C]unlock setIA tiHU setI1g mulg1.
-Qed.
-
-Let isIndHC (zeta : 'CF(M)) :=
- [/\ zeta 1%g = (q * u)%:R, zeta \in S_ H0C
- & exists2 xi : 'CF(HC), xi \is a linear_char & zeta = 'Ind xi].
-
-(* This is Peterfalvi (9.8). *)
-Lemma typeP_nonGalois_characters (not_Galois : ~~ typeP_Galois) :
- let a := #|U : 'C_U(sval (typeP_Galois_Pn not_Galois) | 'Q)| in
- [/\ (*a*) {in X_ H0, forall s, (a %| 'chi_s 1%g)%C},
- (*b*) size mu_ = p.-1 /\ {in mu_, forall mu_j, isIndHC mu_j},
- (*c*) exists t, isIndHC 'chi_t
- & (*d*) let irr_qa := [pred zeta in irr M | zeta 1%g == (q * a)%:R] in
- let lb_n := (p.-1 * #|U|)%N in let lb_d := (a ^ 2 * #|U'|)%N in
- (lb_d %| lb_n /\ lb_n %/ lb_d <= count irr_qa (S_ H0U'))%N].
-Proof.
-case: (typeP_Galois_Pn _) => H1 [oH1 nH1U nH1Uq defHbar aP]; rewrite [sval _]/=.
-move=> a; case: aP; rewrite -/a => a_gt1 a_dv_p1 cycUb1 isoUb.
-set part_a := ({in _, _}); pose HCbar := (HC / H0)%G.
-have [_ /mulG_sub[sHUM sW1M] nHUW1 tiHUW1] := sdprodP defM.
-have [nsHHU _ /mulG_sub[sHHU sUHU] nHU tiHU] := sdprod_context defHU.
-have [nH0H nHHU] := (normal_norm nsH0H, normal_norm nsHHU).
-have sHHC: H \subset HC by rewrite joing_subl.
-have [nH0HU sCHU] := (subset_trans sHUM nH0M, subset_trans sCU sUHU).
-have nsH0_HU: H0 <| HU by rewrite /normal (subset_trans sH0H).
-have nH0C := subset_trans sCHU nH0HU.
-have [nsH0C_M nsHC_M nsH0U'_M _] := nsH0xx_M; have [sHC_M _] := andP nsHC_M.
-have nsH0HC: H0 <| HC := normalS (subset_trans sH0H sHHC) sHC_M nsH0M.
-have defHCbar: Hbar \x (C / H0) = HCbar.
- rewrite /= quotientY // [C]unlock /= astabQ quotient_setIpre.
- by rewrite dprodEY ?subsetIr // setIA -quotientGI // tiHU quotient1 setI1g.
-have sHC_HU: HC \subset HU by rewrite join_subG sHHU.
-have nsHC_HU: HC <| HU := normalS sHC_HU sHUM nsHC_M.
-have defHb1 := defHbar; rewrite (big_setD1 1%g) ?group1 ?conjsg1 //= in defHb1.
-have [[_ H1c _ defH1c] _ _ _] := dprodP defHb1; rewrite defH1c in defHb1.
-have [nsH1H _] := dprod_normal2 defHb1; have [sH1H nH1H] := andP nsH1H.
-have nHW1: W1 \subset 'N(H) := subset_trans sW1M (gFnorm _ _).
-have nHbW1: W1bar \subset 'N(Hbar) by rewrite quotient_norms.
-have sH1wH w: w \in W1bar -> H1 :^ w \subset Hbar.
- by move/(normsP nHbW1) <-; rewrite conjSg.
-have nsH1wHUb w: w \in W1bar -> H1 :^ w <| HU / H0.
- move=> W1w; rewrite -(normsP (quotient_norms _ nHUW1) w W1w) normalJ.
- rewrite /normal (subset_trans sH1H) ?quotientS //.
- by rewrite -defHU sdprodE // quotientMl // mulG_subG nH1H.
-have nH1wHUb := normal_norm (nsH1wHUb _ _).
-have Part_a: part_a.
- move=> s; rewrite !inE => /andP[kers'H kersH0].
- have [t sHt] := constt_cfRes_irr H s; pose theta := ('chi_t / H0)%CF.
- have{kers'H} t_neq0: t != 0.
- by rewrite -subGcfker (sub_cfker_constt_Res_irr sHt).
- have{kersH0} kertH0: H0 \subset cfker 'chi_t.
- by rewrite (sub_cfker_constt_Res_irr sHt).
- have Ltheta: theta \is a linear_char.
- by rewrite /theta -quo_IirrE // (char_abelianP _ _).
- have Dtheta : _ = theta := cfBigdprod_Res_lin defHbar Ltheta.
- set T := 'I_HU['chi_t]; have sHT: H \subset T by rewrite sub_Inertia.
- have sTHU: T \subset HU by rewrite Inertia_sub.
- suffices{s sHt} a_dv_iTHU: a %| #|HU : T|.
- have [_ defInd_t _ imInd_t _] := cfInd_sum_Inertia t nsHHU.
- have /imsetP[r tTr ->]: s \in Ind_Iirr HU @: irr_constt ('Ind[T] 'chi_t).
- by rewrite imInd_t constt_Ind_Res.
- by rewrite defInd_t ?cfInd1 // dvdC_mulr ?dvdC_nat // Cint_Cnat ?Cnat_irr1.
- have /exists_inP[w W1w nt_t_w]: [exists w in W1bar, 'Res[H1 :^ w] theta != 1].
- rewrite -negb_forall_in; apply: contra t_neq0 => /forall_inP=> tH1w1.
- rewrite -irr_eq1 -(cfQuoK nsH0H kertH0) -/theta -Dtheta.
- rewrite [cfBigdprod _ _]big1 ?rmorph1 // => w /tH1w1/eqP->.
- by rewrite /cfBigdprodi rmorph1.
- have defT: H ><| (U :&: T) = T.
- by rewrite (sdprod_modl defHU) // (setIidPr sTHU).
- have /irrP[k Dk]: 'Res theta \in irr (H1 :^ w).
- by rewrite lin_char_irr ?cfRes_lin_char.
- rewrite -divgS // -(sdprod_card defHU) -(sdprod_card defT) divnMl // divgI.
- rewrite -indexgI; have ->: a = #|U : 'C_U(H1 :^ w | 'Q)|.
- have [w1 nH0w1 W1w1 ->] := morphimP W1w; rewrite astabQ centJ morphpreJ //.
- by rewrite -astabQ indexgI -(normsP nUW1 _ W1w1) indexJg -indexgI.
- rewrite indexgS ?setIS // sub_astabQ ?(subset_trans sTHU) //= -inertia_quo //.
- apply: subset_trans (sub_inertia_Res _ (nH1wHUb w W1w)) _.
- by rewrite Dk (inertia_irr_prime _ p_pr) ?subsetIr ?cardJg // -irr_eq1 -Dk.
-pose isoJ := conj_isom H1; pose cfJ w i := 'chi_(isom_Iirr (isoJ w) i).
-pose thetaH (f : {ffun _}) := cfBigdprod defHbar (fun w => cfJ w (f w)).
-pose theta f := cfDprodl defHCbar (thetaH f).
-have abH1: abelian H1 by rewrite cyclic_abelian ?prime_cyclic ?oH1.
-have linH1 i: 'chi[H1]_i \is a linear_char by apply/char_abelianP.
-have lin_thetaH f: thetaH f \is a linear_char.
- by apply: cfBigdprod_lin_char => w _; rewrite /cfJ isom_IirrE cfIsom_lin_char.
-have nz_thetaH f: thetaH f 1%g != 0 by rewrite lin_char_neq0.
-have Dtheta f: {in W1bar & H1, forall w xb, theta f (xb ^ w) = 'chi_(f w) xb}.
- move=> w xb W1w H1xb /=; have sHHCb := quotientS H0 sHHC.
- transitivity ('Res[H1 :^ w] ('Res[Hbar] (theta f)) (xb ^ w)); last first.
- by rewrite cfDprodlK cfBigdprodKabelian // isom_IirrE cfIsomE.
- by rewrite cfResRes ?sH1wH // cfResE ?memJ_conjg ?(subset_trans (sH1wH w _)).
-have lin_theta f: theta f \is a linear_char by rewrite cfDprodl_lin_char.
-pose Ftheta := pffun_on (0 : Iirr H1) W1bar (predC1 0).
-have inj_theta: {in Ftheta &, injective theta}.
- move=> f1 f2 /pffun_onP[/supportP W1f1 _] /pffun_onP[/supportP W1f2 _] eq_f12.
- apply/ffunP=> w.
- have [W1w | W1'w] := boolP (w \in W1bar); last by rewrite W1f1 ?W1f2.
- by apply/irr_inj/cfun_inP=> x H1x; rewrite -!Dtheta ?eq_f12.
-have irr_thetaH0 f: (theta f %% H0)%CF \in irr HC.
- by rewrite cfMod_irr ?lin_char_irr.
-have def_Itheta f: f \in Ftheta -> 'I_HU[theta f %% H0]%CF = HC.
- case/pffun_onP=> _ nz_fW1; apply/eqP; rewrite eqEsubset sub_Inertia //.
- rewrite inertia_mod_pre //= -{1}(sdprodW defHU) -group_modl; last first.
- rewrite (subset_trans sHHC) // -sub_quotient_pre ?normal_norm //.
- by rewrite sub_Inertia ?quotientS.
- rewrite -gen_subG genM_join genS ?setUS //= {2}[C]unlock setIS //= astabQ.
- rewrite morphpreS // centsC -{1}(bigdprodWY defHbar) gen_subG.
- apply/bigcupsP=> w W1w; rewrite centsC.
- apply: subset_trans (sub_inertia_Res _ (quotient_norms _ nHHU)) _.
- rewrite cfDprodlK inertia_bigdprod_irr // subIset // orbC (bigcap_min w) //.
- rewrite (inertia_irr_prime _ p_pr) ?cardJg ?subsetIr // isom_Iirr_eq0.
- by apply: nz_fW1; apply: image_f.
-have irrXtheta f: f \in Ftheta -> 'Ind (theta f %% H0)%CF \in irr HU.
- move/def_Itheta; rewrite -(cfIirrE (irr_thetaH0 f)) => I_f_HC.
- by rewrite inertia_Ind_irr ?I_f_HC //.
-pose Mtheta := [set cfIirr (theta f %% H0)%CF | f in Ftheta].
-pose Xtheta := [set cfIirr ('Ind[HU] 'chi_t) | t in Mtheta].
-have oXtheta: (u * #|Xtheta| = p.-1 ^ q)%N.
- transitivity #|Ftheta|; last first.
- rewrite card_pffun_on cardC1 card_Iirr_abelian // oH1.
- rewrite -(card_isog (quotient_isog _ _)) ?oW1 ?(subset_trans sW1M) //.
- by apply/trivgP; rewrite -tiHUW1 setSI ?(subset_trans sH0H).
- rewrite Du -card_imset_Ind_irr ?card_in_imset //.
- - move=> f1 f2 Df1 Df2 /(congr1 (tnth (irr HC))); rewrite !{1}cfIirrE //.
- by move/(can_inj (cfModK nsH0HC)); apply: inj_theta.
- - by move=> _ /imsetP[f Df ->]; rewrite cfIirrE ?irrXtheta.
- move=> _ y /imsetP[f /familyP Ff ->] HUy; apply/imsetP.
- pose yb := inMb y; have HUyb: yb \in (HU / H0)%g by apply: mem_quotient.
- have nHb_y: inMb y \in 'N(Hbar) by rewrite (subsetP (quotient_norms _ nHHU)).
- have nH1b_y := subsetP (nH1wHUb _ _) yb HUyb.
- exists [ffun w => conjg_Iirr (f w) (inMb y ^ w^-1)].
- apply/familyP=> w; rewrite ffunE.
- by case: ifP (Ff w) => _; rewrite !inE conjg_Iirr_eq0.
- apply: irr_inj; rewrite !(cfIirrE, conjg_IirrE) // (cfConjgMod _ nsHC_HU) //.
- rewrite cfConjgDprodl //; first congr (cfDprodl _ _ %% H0)%CF; last first.
- rewrite /= -quotientYidl // (subsetP _ _ HUyb) ?quotient_norms //.
- by rewrite (subset_trans sHUM) ?normal_norm.
- rewrite cfConjgBigdprod //; apply: eq_bigr => w W1w; congr (cfBigdprodi _ _).
- rewrite ffunE /cfJ !isom_IirrE conjg_IirrE.
- apply/cfun_inP=> _ /imsetP[x Hx ->]; rewrite cfIsomE // cfConjgE ?nH1b_y //.
- rewrite -conjgM conjgCV conjVg conjgM cfIsomE //; last first.
- by rewrite -mem_conjg (normP _) // -mem_conjg -normJ ?nH1b_y.
- by rewrite cfConjgE // -mem_conjg -normJ ?nH1b_y.
-have sXthXH0C: Xtheta \subset X_ H0C.
- apply/subsetP=> _ /imsetP[t Mt ->]; have{Mt} [f Ff Dt] := imsetP Mt.
- rewrite !inE cfIirrE; last by rewrite Dt cfIirrE ?irrXtheta.
- rewrite !sub_cfker_Ind_irr ?(subset_trans sHUM) ?normal_norm ?gFnormal //.
- rewrite {t}Dt cfIirrE // join_subG andbCA {1}cfker_mod //.
- rewrite !{1}sub_cfker_mod //= andbC {1}cfker_sdprod /=.
- apply: contraL (familyP Ff 1%g) => kerHb; rewrite group1 negbK.
- have:= sub_cfker_Res (subxx _) kerHb; rewrite cfDprodlK.
- move/(subset_trans (sH1wH _ (group1 _)))/(sub_cfker_Res (subxx _)).
- rewrite cfBigdprodKabelian // isom_IirrE cfker_isom morphim_conj /=.
- by rewrite !conjsg1 subsetIidl subGcfker.
-pose mu_f (i : Iirr H1) := [ffun w => if w \in W1bar then i else 0].
-have Fmu_f (i : Iirr H1): i != 0 -> mu_f i \in Ftheta.
- by move=> nz_i; apply/familyP=> w; rewrite ffunE; case: ifP; rewrite !inE.
-pose mk_mu i := 'Ind[HU] (theta (mu_f i) %% H0)%CF.
-have sW1_Imu i: W1 \subset 'I[theta (mu_f i) %% H0]%CF.
- apply/subsetP=> w W1w; have Mw := subsetP sW1M w W1w.
- have nHC_W1 := subset_trans sW1M (normal_norm nsHC_M).
- rewrite inE (subsetP nHC_W1) ?(cfConjgMod _ nsHC_M) //; apply/eqP.
- have W1wb: inMb w \in W1bar by rewrite mem_quotient.
- rewrite cfConjgDprodl ?(subsetP _ _ W1wb) ?quotient_norms //; last first.
- by rewrite (subset_trans (joing_subr U W1)) ?normal_norm.
- congr (cfDprodl _ _ %% H0)%CF.
- apply/cfun_inP=> _ /(mem_bigdprod defHbar)[x [H1x -> _]].
- have Hx w1: w1 \in W1bar -> x w1 \in Hbar.
- by move=> W1w1; rewrite (subsetP (sH1wH w1 _)) ?H1x.
- rewrite !lin_char_prod ?cfConjg_lin_char //; apply/eq_bigr=> w1 W1w1.
- rewrite cfConjgE ?(subsetP nHbW1) //.
- have W1w1w: (w1 * (inMb w)^-1)%g \in W1bar by rewrite !in_group.
- rewrite -(cfResE _ (sH1wH _ W1w1w)) -?mem_conjg -?conjsgM ?mulgKV ?H1x //.
- rewrite -(cfResE _ (sH1wH _ W1w1)) ?H1x ?cfBigdprodKabelian //.
- rewrite !ffunE W1w1 W1w1w -[x w1](conjgKV w1) -conjgM !isom_IirrE.
- by rewrite !cfIsomE -?mem_conjg ?H1x.
-have inj_mu: {in predC1 0 &, injective (fun i => cfIirr (mk_mu i))}.
- move=> i1 i2 nz_i1 nz_i2 /(congr1 (tnth (irr HU))).
- rewrite !{1}cfIirrE ?irrXtheta ?Fmu_f // /mk_mu.
- do 2![move/esym; rewrite -{1}(cfIirrE (irr_thetaH0 _))].
- move/(cfclass_Ind_irrP _ _ nsHC_HU); rewrite !{1}cfIirrE //.
- case/cfclassP=> _ /(mem_sdprod defHU)[x [y [Hx Uy -> _]]].
- rewrite (cfConjgM _ nsHC_HU) ?(subsetP sHHU x) ?(subsetP sUHU) //.
- rewrite {x Hx}(cfConjg_id _ (subsetP sHHC x Hx)) => Dth1.
- suffices /setIP[_ /inertiaJ]: y \in 'I_HU[theta (mu_f i2) %% H0]%CF.
- rewrite -Dth1 => /(can_inj (cfModK nsH0HC))/inj_theta/ffunP/(_ 1%g).
- by rewrite !ffunE group1 => -> //; apply: Fmu_f.
- rewrite def_Itheta ?Fmu_f //= (subsetP (joing_subr _ _)) //.
- have nCy: y \in 'N(C).
- by rewrite (subsetP (normal_norm nsCUW1)) ?mem_gen ?inE ?Uy.
- have [_ _ /trivgPn[wb W1wb ntwb] _ _] := Frobenius_context frobUW1c.
- have /morphimP[w nCw W1w Dw] := W1wb; have Mw := subsetP sW1M w W1w.
- rewrite coset_idr //; apply/set1P; rewrite -set1gE; apply: wlog_neg => nty.
- rewrite -((Frobenius_reg_ker frobUW1c) wb); last by rewrite !inE ntwb.
- rewrite inE mem_quotient //=; apply/cent1P/commgP.
- rewrite Dw -morphR //= coset_id //.
- suffices: [~ y, w] \in U :&: HC.
- rewrite /= norm_joinEr ?(subset_trans sCU) // -group_modr ?subsetIl //=.
- by rewrite setIC tiHU mul1g.
- have Uyw: [~ y, w] \in U; last rewrite inE Uyw.
- by rewrite {1}commgEl groupMl ?groupV // memJ_norm ?(subsetP nUW1) // Uy.
- rewrite -(def_Itheta _ (Fmu_f _ nz_i1)) 2!inE /= andbA -in_setI.
- rewrite (setIidPl (normal_norm nsHC_HU)) (subsetP sUHU) //=.
- rewrite Dth1 -(cfConjgM _ nsHC_HU) ?(subsetP sUHU) //.
- have My: y \in M := subsetP (subset_trans sUHU sHUM) y Uy.
- rewrite mulKVg (cfConjgM _ nsHC_M) ?in_group //.
- have /inertiaJ-> := subsetP (sW1_Imu i2) _ (groupVr W1w).
- rewrite (cfConjgM _ nsHC_M) // -Dth1.
- by have /inertiaJ-> := subsetP (sW1_Imu i1) w W1w.
-pose Xmu := [set cfIirr (mk_mu i) | i in predC1 0].
-have def_IXmu: {in Xmu, forall s, 'I_M['chi_s] = M}.
- move=> _ /imsetP[i nz_i ->]; apply/setIidPl.
- rewrite -subsetIidl -{1}(sdprodW defM) mulG_subG sub_Inertia //.
- rewrite !cfIirrE ?irrXtheta ?Fmu_f //=.
- apply: subset_trans (sub_inertia_Ind _ (der_norm 1 M)).
- by rewrite subsetI sW1M /=.
-pose Smu := [seq 'Ind[M] 'chi_s | s in Xmu].
-have sSmu_mu: {subset Smu <= mu_}.
- move=> _ /imageP[s Xmu_s ->]; rewrite mem_filter /=.
- rewrite irrEchar cfnorm_Ind_irr ?gFnormal // def_IXmu //.
- rewrite -(index_sdprod defM) (eqC_nat _ 1) gtn_eqF ?prime_gt1 // andbF.
- rewrite mem_seqInd ?gFnormal /normal ?(subset_trans sH0H) ?gFsub //=.
- suffices /(subsetP sXthXH0C): s \in Xtheta.
- by apply: subsetP; rewrite setSD // Iirr_kerS ?joing_subl.
- have /imsetP[i nz_i ->] := Xmu_s; rewrite /Xtheta -imset_comp.
- by apply/imsetP; exists (mu_f i); rewrite /= ?cfIirrE ?Fmu_f.
-have ResIndXmu: {in Xmu, forall s, 'Res ('Ind[M] 'chi_s) = q%:R *: 'chi_s}.
- move=> s /def_IXmu Imu_s; rewrite cfResInd_sum_cfclass ?gFnormal ?Imu_s //.
- by rewrite -(index_sdprod defM) -Imu_s cfclass_inertia big_seq1.
-have uSmu: uniq Smu.
- apply/dinjectiveP=> s1 s2 Xs1 Xs2 /(congr1 'Res[HU]); rewrite !ResIndXmu //.
- by move/(can_inj (scalerK (neq0CG W1)))/irr_inj.
-have sz_Smu: size Smu = p.-1.
- by rewrite size_map -cardE card_in_imset // cardC1 card_Iirr_abelian ?oH1.
-have [sz_mu s_mu_H0C] := nb_redM_H0.
-have Dmu: Smu =i mu_.
- by have [|//] := leq_size_perm uSmu sSmu_mu; rewrite sz_mu sz_Smu.
-split=> {Part_a part_a}//.
-- split=> // phi mu_phi; have S_HOC_phi := s_mu_H0C _ mu_phi.
- move: mu_phi; rewrite -Dmu => /imageP[_ /imsetP[i nz_i ->]].
- rewrite cfIirrE ?irrXtheta ?Fmu_f // => Dphi.
- split=> //; rewrite Dphi ?cfInd1 ?cfIndInd //.
- rewrite -(index_sdprod defM) -/q -Du mulrA -natrM.
- by rewrite lin_char1 1?cfMod_lin_char ?mulr1.
- by exists (theta (mu_f i) %% H0)%CF; rewrite 1?cfMod_lin_char.
-- have /eqVproper: Xmu \subset Xtheta.
- apply/subsetP=> _ /imsetP[i nz_i ->]; rewrite -[Xtheta]imset_comp /=.
- by apply/imsetP; exists (mu_f i); rewrite /= ?cfIirrE ?Fmu_f.
- case=> [defXmu | /andP[_ /subsetPn[s theta_s Xmu'_s]]]; last first.
- have [_ /imsetP[f Dth_f ->] Ds] := imsetP theta_s; rewrite cfIirrE // in Ds.
- have /irrP[t Dt]: 'Ind 'chi_s \in irr M; last 1 [exists t; rewrite -{t}Dt].
- apply: contraR Xmu'_s => red_Ind_s.
- have: 'Ind 'chi_s \in mu_.
- rewrite mem_filter /= red_Ind_s mem_seqInd ?gFnormal //=.
- apply: subsetP theta_s; rewrite (subset_trans sXthXH0C) ?setSD //.
- by rewrite Iirr_kerS ?joing_subl.
- rewrite -Dmu => /imageP[s1 Xmu_s1] /(congr1 (cfdot ('Ind 'chi_s1)))/eqP.
- rewrite cfnorm_Ind_irr ?gFnormal // eq_sym -cfdot_Res_l.
- rewrite ResIndXmu // cfdotZl cfdot_irr -natrM mulnC.
- by case: (s1 =P s) => [<- // | _] /idPn[]; apply: neq0CiG.
- split; first 2 [by rewrite mem_seqInd ?gFnormal ?(subsetP sXthXH0C)].
- rewrite Ds cfIirrE ?irrXtheta ?cfInd1 // -Du -(index_sdprod defM) -/q.
- by rewrite mulrA -natrM lin_char1 ?cfMod_lin_char ?mulr1.
- exists (theta f %% H0)%CF; first by rewrite cfMod_lin_char.
- by rewrite Ds cfIirrE ?irrXtheta //= cfIndInd.
- suffices /(congr1 odd): u = (p.-1 ^ q.-1)%N.
- rewrite odd_exp -(subnKC (prime_gt1 pr_q)) /= -subn1 odd_sub ?prime_gt0 //.
- by rewrite -oH1 (oddSg sH1H) ?quotient_odd // mFT_odd.
- have p1_gt0: (0 < p.-1)%N by rewrite -(subnKC (prime_gt1 p_pr)).
- apply/eqP; rewrite -(eqn_pmul2r p1_gt0) -expnSr prednK ?prime_gt0 //.
- by rewrite -oXtheta -defXmu card_in_imset // cardC1 card_Iirr_abelian ?oH1.
-clear Xmu def_IXmu Smu sSmu_mu ResIndXmu uSmu sz_Smu sz_mu s_mu_H0C Dmu.
-clear Mtheta Xtheta irrXtheta oXtheta sXthXH0C mu_f Fmu_f mk_mu sW1_Imu inj_mu.
-clear nz_thetaH lin_thetaH lin_theta Ftheta inj_theta irr_thetaH0 def_Itheta.
-clear theta Dtheta => irr_qa lb_n lb_d.
-have sU'U: U' \subset U := der_sub 1 U.
-have nH0U := subset_trans sUHU nH0HU; have nH0U' := subset_trans sU'U nH0U.
-have sU'CH1: U' \subset 'C_U(H1 | 'Q).
- by rewrite subsetI sU'U sub_astabQ nH0U' (centsS sH1H) ?quotient_cents.
-have sCH1_U: 'C_U(H1 | 'Q) \subset U := subsetIl U _.
-have dvd_lb: lb_d %| lb_n.
- rewrite -[lb_d]mulnA dvdn_mul // -(Lagrange sCH1_U).
- by rewrite mulnC dvdn_pmul2r ?cardSg ?indexg_gt0.
-split; rewrite ?leq_divLR // /lb_n -(Lagrange sCH1_U) -/a -(Lagrange sU'CH1).
-rewrite mulnCA -mulnA mulnC !mulnA !leq_pmul2r ?cardG_gt0 ?indexg_gt0 // mulnC.
-pose H1CH1 := (H1 <*> 'C_(U / H0)(H1))%G; pose HCH1 := (H <*> 'C_U(H1 | 'Q))%G.
-have defH1CH1: H1 \x 'C_(U / H0)(H1) = H1CH1.
- rewrite dprodEY ?subsetIr ?coprime_TIg ?(coprimeSg sH1H) //.
- by rewrite (coprimegS (subsetIl _ _)) ?coprime_morph.
-have sHCH1_HU: HCH1 \subset HU by rewrite join_subG sHHU (subset_trans sCH1_U).
-have nsHCH1_HU: HCH1 <| HU.
- rewrite /normal sHCH1_HU -(sdprodW defHU) mulG_subG normsG ?joing_subl //=.
- by rewrite normsY // sub_der1_norm.
-have nsH0_HCH1: H0 <| HCH1.
- by rewrite (normalS _ sHCH1_HU) // (subset_trans sH0H) ?joing_subl.
-have nsH1cHU: H1c <| HU / H0.
- rewrite -(bigdprodWY defH1c) /normal gen_subG norms_gen ?andbT //.
- by apply/bigcupsP=> w /setD1P[_ /nsH1wHUb/andP[]].
- by apply/norms_bigcup/bigcapsP=> w /setD1P[_ /nH1wHUb].
-have defHCH1: H1c ><| H1CH1 = (HCH1 / H0)%G.
- have /sdprodP[_ /mulG_sub[sH1cH _] nH1cH1 tiH1cH1] := dprodWsdC defHb1.
- rewrite sdprodE /= -(dprodW defH1CH1).
- - rewrite mulgA (dprodWC defHb1) -morphim_setIpre -astabQ -quotientMl //.
- by rewrite norm_joinEr // (subset_trans sCH1_U).
- - rewrite mul_subG ?subIset // (subset_trans (quotientS _ sUHU)) //.
- exact: normal_norm nsH1cHU.
- rewrite -(setIidPl sH1cH) setIAC -setIA -group_modl // coprime_TIg ?mulg1 //.
- by rewrite coprime_sym (coprimegS (subsetIl _ _)) ?coprime_morph.
-have [nsH1cHCH1 sH1CH1_HCH1 _ nH1cH1C _] := sdprod_context defHCH1.
-pose Clam := ('C_(U / H0)(H1) / (U' / H0))%G.
-pose lam (j : Iirr Clam) := 'chi_(mod_Iirr j).
-pose theta i j := cfSdprod defHCH1 (cfDprod defH1CH1 'chi_i (lam j)).
-have nsU'CH1: U' <| 'C_U(H1 | 'Q) by rewrite (normalS _ sCH1_U) ?gFnormal.
-have nsU'CH1b: U' / H0 <| 'C_(U / H0)(H1).
- by rewrite -morphim_setIpre -astabQ quotient_normal.
-have abClam: abelian Clam.
- by rewrite sub_der1_abelian //= quotient_der ?dergS ?subsetIl.
-have lam_lin j: lam j \is a linear_char.
- by rewrite /lam mod_IirrE ?cfMod_lin_char //; apply/char_abelianP.
-have theta_lin i j: theta i j \is a linear_char.
- by rewrite cfSdprod_lin_char ?cfDprod_lin_char.
-have <-: #|Clam| = #|'C_U(H1 | 'Q) : U'|.
- rewrite -card_quotient ?normal_norm //= /= -morphim_setIpre -astabQ.
- have nsU'U : U' <| U by apply: der_normal.
- rewrite -(restrmEsub _ _ sCH1_U) -(restrm_quotientE _ sU'U) -morphim_quotm.
- rewrite card_injm ?quotientS ?injm_quotm ?(isom_inj (quotient_isom _ _)) //.
- by rewrite coprime_TIg ?(coprimeSg sH0H).
-pose Mtheta := [set mod_Iirr (cfIirr (theta i j)) | i in [set~ 0], j in setT].
-have ->: (p.-1 * #|Clam|)%N = #|Mtheta|.
- rewrite [Mtheta]curry_imset2X card_imset ?cardsX => [|[i1 j1] [i2 j2] /=/eqP].
- by rewrite cardsC1 cardsT !card_Iirr_abelian ?(abelianS sH1H) ?oH1.
- rewrite (can_eq (mod_IirrK _)) // -(inj_eq irr_inj) !cfIirrE ?lin_char_irr //.
- rewrite (can_eq (cfSdprodK _)) -!dprod_IirrE (inj_eq irr_inj).
- by rewrite (can_eq (dprod_IirrK _)) => /eqP[->] /(can_inj (mod_IirrK _))->.
-have{lam_lin} thetaH1 i j: 'Res[H1] (theta i j) = 'chi_i.
- rewrite -(cfResRes _ _ sH1CH1_HCH1) ?joing_subl // cfSdprodK cfDprodKl //.
- exact: lin_char1.
-have Itheta r: r \in Mtheta -> 'I_HU['chi_r]%CF = HCH1.
- case/imset2P=> i j; rewrite /= in_setC1 => nz_i _ Dr; apply/eqP.
- rewrite eqEsubset sub_Inertia //= Dr mod_IirrE // cfIirrE ?lin_char_irr //.
- rewrite andbT -(quotientSGK _ (normal_sub nsH0_HCH1)) ?subIset ?nH0HU //.
- rewrite inertia_mod_quo //.
- apply: subset_trans (sub_inertia_Res _ (nH1wHUb _ (group1 _))) _.
- rewrite /= conjsg1 thetaH1 (inertia_irr_prime _ p_pr) //.
- rewrite -quotient_setIpre -astabQ quotientS // -{1}(sdprodW defHU).
- by rewrite -genM_join sub_gen // group_modl // sub_astabQ nH0H (centsS sH1H).
-have irr_Xtheta: {in Mtheta, forall r, 'Ind[HU] 'chi_r \in irr HU}.
- by move=> r Mr; rewrite /= inertia_Ind_irr ?Itheta.
-pose Xtheta := [set cfIirr ('Ind[HU] 'chi_r) | r in Mtheta].
-have Da: a = #|HU : HCH1| by rewrite -(index_sdprodr defHU).
-have Xtheta_1: {in Xtheta, forall s, 'chi_s 1%g = a%:R}.
- move=> _ /imsetP[r Mr ->]; have /imset2P[i j _ _ Dr] := Mr.
- rewrite cfIirrE ?irr_Xtheta ?cfInd1 //= -Da lin_char1 ?mulr1 //.
- by rewrite Dr mod_IirrE ?cfMod_lin_char // cfIirrE ?lin_char_irr.
-have nsH0U'HU: H0U' <| HU.
- by apply: normalS nsH0U'_M; rewrite // -(sdprodWY defHU) genS ?setUSS.
-have sXthetaXH0U': Xtheta \subset X_ H0U'.
- apply/subsetP=> _ /imsetP[r Mr ->]; have [i j nz_i _ Dr] := imset2P Mr.
- rewrite !inE cfIirrE ?irr_Xtheta ?sub_cfker_Ind_irr //= ?normal_norm //.
- rewrite Dr mod_IirrE // cfIirrE ?lin_char_irr // join_subG andbCA.
- rewrite {1}cfker_mod //= !{1}sub_cfker_mod //; apply/andP; split; last first.
- rewrite -(sdprodWY (sdprod_cfker _ _)) sub_gen ?subsetU // orbC.
- rewrite (subset_trans _ (cfker_dprod _ _ _)) // sub_gen ?subsetU // orbC.
- by rewrite /lam mod_IirrE ?cfker_mod.
- apply: contraL nz_i => /(subset_trans sH1H); rewrite !inE negbK.
- by move/(sub_cfker_Res (subxx _)); rewrite thetaH1 subGcfker.
-have nsCH1_U: 'C_U(H1 | 'Q) <| U by rewrite sub_der1_normal.
-have nH1cU: (U / H0)%g \subset 'N(H1c).
- rewrite -(bigdprodWY defH1c) norms_gen ?norms_bigcup //.
- apply/bigcapsP=> w /setD1P[_ W1w].
- by rewrite normJ -sub_conjgV (normsP (quotient_norms H0 nUW1)) ?groupV.
-have ->: #|Mtheta| = (#|Xtheta| * a)%N.
- rewrite Da mulnC -card_imset_Ind_irr // => _ xy /imset2P[i j nz_i _ ->].
- case/(mem_sdprod defHU)=> x [y [Hx Uy -> _]]; have HUy := subsetP sUHU y Uy.
- pose yb := inMb y; have Uyb: yb \in (U / H0)%g by rewrite mem_quotient.
- pose iy := conjg_Iirr i yb; pose jy := conjg_Iirr j (coset (U' / H0)%g yb).
- apply/imset2P; exists iy jy; rewrite !inE ?conjg_Iirr_eq0 // in nz_i *.
- apply: irr_inj; have HCH1x: x \in HCH1 by rewrite mem_gen ?inE ?Hx.
- rewrite conjg_IirrE (cfConjgM _ nsHCH1_HU) ?(subsetP sHHU x) {Hx}//.
- rewrite {x HCH1x}(cfConjg_id _ HCH1x) !{1}mod_IirrE //.
- rewrite !{1}cfIirrE ?lin_char_irr //.
- rewrite cfConjgMod_norm ?(subsetP nH0U) ?(subsetP (normal_norm nsHCH1_HU)) //.
- have nCH1_Ub: (U / H0)%g \subset 'N('C_(U / H0)(H1)).
- by rewrite normsI ?normG ?norms_cent.
- rewrite cfConjgSdprod ?cfConjgDprod ?(subsetP _ _ Uyb) ?normsY //.
- rewrite /theta /lam !{1}mod_IirrE // !{1}conjg_IirrE.
- by rewrite cfConjgMod_norm ?(subsetP _ _ Uyb) // quotient_norms ?gFnorm.
-rewrite leq_pmul2r ?indexg_gt0 // cardE -(size_map (fun s => 'Ind[M] 'chi_s)).
-have kerH1c s: s \in Xtheta -> H1c \subset (cfker 'chi_s / H0)%g.
- case/imsetP=> r Mr {s}->; have [i j _ _ Dr] := imset2P Mr.
- rewrite -(setIidPr (normal_sub nsH1cHCH1)) -morphim_setIpre quotientS //.
- rewrite cfIirrE ?irr_Xtheta ?sub_cfker_Ind_irr //; last first.
- by rewrite normsI ?normal_norm // -(quotientGK nsH0_HU) cosetpre_normal.
- rewrite Dr mod_IirrE // cfker_morph ?normal_norm // cfIirrE ?lin_char_irr //.
- by rewrite setIS ?joing_subl ?morphpreS // cfker_sdprod.
-have injXtheta:
- {in M & Xtheta &, forall w s1 s2, 'chi_s1 = 'chi_s2 ^ w -> w \in HU}%CF.
-- move=> _ s1 s2 /(mem_sdprod defM)[y [w [HUy W1w -> _]]] Xs1 Xs2.
- rewrite groupMl // cfConjgMnorm ?(subsetP (normG _) y) ?(subsetP nHUW1) //.
- rewrite {y HUy}(cfConjg_id _ HUy) => Ds1.
- have nH0w: w \in 'N(H0) by rewrite ?(subsetP nH0M) ?(subsetP sW1M).
- rewrite (subsetP (normal_sub nsH0_HU)) // coset_idr //.
- have /setDP[]:= subsetP sXthetaXH0U' s1 Xs1; rewrite !inE join_subG /=.
- case/andP=> kerH0s1 _; apply: contraNeq; rewrite -eq_invg1 => ntw.
- rewrite -(quotientSGK nH0H) // -(dprodW defHb1) mul_subG ?kerH1c //=.
- rewrite Ds1 cfker_conjg ?(subsetP nHUW1) // quotientJ // -sub_conjgV.
- rewrite (subset_trans _ (kerH1c s2 Xs2)) // -(bigdprodWY defH1c) sub_gen //.
- by rewrite (bigcup_max (inMb w)^-1%g) // !inE ntw groupV mem_quotient.
-rewrite -size_filter uniq_leq_size //.
- apply/dinjectiveP=> s1 s2 Xs1 Xs2.
- case/(cfclass_Ind_irrP _ _ (der_normal 1 M))/cfclassP=> y My Ds2.
- by apply: irr_inj; rewrite Ds2 cfConjg_id ?(injXtheta y s1 s2).
-move=> _ /imageP[s Xs ->]; rewrite mem_filter /= cfInd1 // -(index_sdprod defM).
-rewrite Xtheta_1 // -natrM eqxx mem_seqInd ?gFnormal //.
-rewrite (subsetP sXthetaXH0U') // !andbT inertia_Ind_irr ?gFnormal //.
-by apply/subsetP=> y /setIP[My /inertiaJ/esym/injXtheta->].
-Qed.
-
-Import ssrnum Num.Theory.
-
-(* This is Peterfalvi (9.9); we have exported the fact that HU / H0 is a *)
-(* Frobenius group in case (c), as this is directly used in (9.10). *)
-Lemma typeP_Galois_characters (is_Galois : typeP_Galois) :
- [/\ (*a*) {in X_ H0, forall s, (u %| 'chi_s 1%g)%Cx},
- {in X_ H0C', forall s, 'chi_s 1%g = u%:R /\
- (exists2 xi : 'CF(HC), xi \is a linear_char & 'chi_s = 'Ind xi)},
- (*b*) size mu_ = p.-1 /\ {in mu_, forall mu_j, isIndHC mu_j}
- & (*c*) all redM (S_ H0C') ->
- [/\ C :=: 1%g, u = (p ^ q).-1 %/ p.-1
- & [Frobenius HU / H0 = Hbar ><| (U / H0)]]].
-Proof.
-have [F [phi [psi _ [Kpsi phiJ]]]] := typeP_Galois_P is_Galois.
-case=> [oF /isomP[inj_phi im_phi] phiW2] [cycUbar co_u_p1 u_dv_pq1].
-have [nsHUM sW1M /mulG_sub[sHUM _] nHUW1 tiHUW1] := sdprod_context defM.
-have [nsHHU sUHU /mulG_sub[sHHU _] nHU tiHU] := sdprod_context defHU.
-have [nsH0C_M nsHC_M _ nsH0C'_M] := nsH0xx_M; have nH0H := normal_norm nsH0H.
-have nsH0HU: H0 <| HU := normalS (subset_trans sH0H sHHU) sHUM nsH0M.
-have nH0U: U \subset 'N(H0) := subset_trans sUHU (normal_norm nsH0HU).
-have nH0C := subset_trans sCU nH0U.
-have sH0C_HU: H0C \subset HU by rewrite -(sdprodWY defHU) genS ?setUSS.
-have nsH0C_HU: H0C <| HU := normalS sH0C_HU sHUM nsH0C_M.
-have nH0C_HU := normal_norm nsH0C_HU.
-have [coH0U coHC] := (coprimeSg sH0H coHU, coprimegS sCU coHU).
-have [nH0C_H nH0C_U] := (subset_trans sHHU nH0C_HU, subset_trans sUHU nH0C_HU).
-have tiHOC_H: H0C :&: H = H0.
- by rewrite /= norm_joinEr // -group_modl // setIC coprime_TIg ?mulg1.
-have{coH0U} tiHOC_U: H0C :&: U = C.
- by rewrite /= norm_joinEr // setIC -group_modr // setIC coprime_TIg ?mul1g.
-have isoHbar: Hbar \isog H / H0C.
- by have:= second_isog nH0C_H; rewrite tiHOC_H.
-have isoUbar: Ubar \isog U / H0C.
- by have:= second_isog nH0C_U; rewrite tiHOC_U.
-have frobHU: [Frobenius HU / H0C = (H / H0C) ><| (U / H0C)].
- have defHUbar: (H / H0C) ><| (U / H0C) = (HU / H0C)%g.
- exact: quotient_coprime_sdprod.
- apply/Frobenius_semiregularP=> //; first by rewrite -(isog_eq1 isoHbar).
- by rewrite -(isog_eq1 isoUbar); have [] := Frobenius_context frobUW1c.
- move=> yb /setD1P[ntyb /morphimP[y nH0Cy Uy] Dyb] /=; rewrite Dyb.
- apply/trivgP/subsetP=> _ /setIP[/morphimP[/= x nHOCx Hx ->] /cent1P/commgP].
- rewrite -morphR //; set xy := [~ x, y] => /eqP/coset_idr/=H0Cxy.
- have [nH0x nH0y] := (subsetP nH0H x Hx, subsetP nH0U y Uy).
- rewrite inE coset_id ?mem_gen // inE coset_idr //; apply: contraNeq ntyb.
- rewrite -(morph_injm_eq1 inj_phi) ?mem_quotient // => nz_x.
- rewrite {yb}Dyb /= coset_id ?mem_gen // -Kpsi !inE Uy orbC /= -val_eqE.
- rewrite -(inj_eq (mulfI nz_x)) mulr1 -[_ * _]phiJ ?mem_quotient // qactJ nH0y.
- rewrite -morphJ // conjg_mulR -/xy mkerr ?eqxx // ker_coset -tiHOC_H inE.
- by rewrite andbC groupM ?groupV ?memJ_norm ?(subsetP nHU) //= H0Cxy ?groupR.
-have{coHC} tiHbC: (Hbar :&: C / H0 = 1)%g by rewrite coprime_TIg ?coprime_morph.
-have{tiHbC} defHCbar: Hbar \x (C / H0) = (HC / H0)%g.
- by rewrite dprodEY ?quotientY // [C]unlock/= astabQ quotient_setIpre subsetIr.
-have sHCHU: HC \subset HU by rewrite -(sdprodWY defHU) genS ?setUS.
-have nsHCHU: HC <| HU := normalS sHCHU sHUM nsHC_M.
-have sH0HC: H0 \subset HC := subset_trans sH0H (joing_subl H C).
-have nsH0HC: H0 <| HC := normalS sH0HC sHCHU nsH0HU.
-have nsHHUb: Hbar <| HU / H0 by rewrite quotient_normal.
-have I_XH0_C i: i != 0 -> 'I_HU['chi[Hbar]_i %% H0]%CF = HC.
- move=> /= nz_i; apply/esym/eqP.
- have nsCHUb: C / H0 <| HU / H0 by rewrite -quotientYidl ?quotient_normal.
- have sH0C_HC: H0C \subset HC by rewrite genS ?setSU.
- have nsH0C_HC: H0C <| HC := normalS sH0C_HC sHCHU nsH0C_HU.
- have [j Dj]: exists j, 'chi_j = (cfDprodl defHCbar 'chi_i %% H0)%CF.
- by rewrite -dprodl_IirrE -mod_IirrE //; set j := mod_Iirr _; exists j.
- have kerH0Cj: H0C \subset cfker 'chi_j.
- by rewrite Dj sub_cfker_mod ?join_subG ?normG // quotientYidl ?cfker_sdprod.
- rewrite inertia_mod_pre // -(inertia_dprodl defHCbar) ?normal_norm //.
- rewrite -inertia_mod_pre // -Dj eqEsubset sub_Inertia //=.
- rewrite -(quotientSGK _ sH0C_HC) ?subIset ?nH0C_HU -?inertia_quo //.
- rewrite -(quotientYidr nH0C_H) joingA (joing_idPl sH0H) in frobHU.
- rewrite -?quo_IirrE ?(inertia_Frobenius_ker (FrobeniusWker frobHU)) //.
- by rewrite quo_Iirr_eq0 // -irr_eq1 Dj cfMod_eq1 // cfDprodl_eq1 irr_eq1.
-have{I_XH0_C} irr_IndHC r: r \in Iirr_kerD HC H H0 -> 'Ind 'chi_r \in irr HU.
- rewrite !inE => /andP[ker'H kerH0]; apply: inertia_Ind_irr => //.
- apply: subset_trans (sub_inertia_Res _ (normal_norm nsHHU)) _.
- rewrite -{kerH0}(quo_IirrK _ kerH0) // mod_IirrE // in ker'H *.
- have /codomP[[i j] Dr] := dprod_Iirr_onto defHCbar (quo_Iirr H0 r).
- rewrite {r}Dr dprod_IirrE cfResMod ?joing_subl ?sub_cfker_mod //= in ker'H *.
- rewrite cfDprod_Resl linearZ inertia_scale_nz ?irr1_neq0 ?I_XH0_C //.
- by apply: contraNneq ker'H => ->; rewrite irr0 cfDprod_cfun1l cfker_sdprod.
-have [nb_mu H0C_mu] := nb_redM_H0; set part_a' := ({in X_ H0C', _}).
-have Part_a s: s \in X_ H0 -> exists r, 'chi_s = 'Ind[HU, HC] 'chi_r.
- rewrite !inE => /andP[Ks'H KsH0]; have [r sHCr] := constt_cfRes_irr HC s.
- have{KsH0} KrH0: H0 \subset cfker 'chi_r.
- by rewrite (sub_cfker_constt_Res_irr sHCr) // ?normal_norm.
- have{Ks'H} Kr'H: ~~ (H \subset cfker 'chi_r).
- by rewrite (sub_cfker_constt_Res_irr sHCr) ?joing_subl // ?normal_norm.
- have [|s1 Ds1] := irrP _ (irr_IndHC r _); first by rewrite !inE Kr'H.
- rewrite -constt_Ind_Res Ds1 constt_irr inE in sHCr.
- by rewrite (eqP sHCr) -Ds1; exists r.
-have [nH0HC nH0C'] := (normal_norm nsH0HC, subset_trans (der_sub 1 _) nH0C).
-have Part_a': part_a'.
- move=> s /setDP[KsH0C' Ks'H]; have [|r Ds] := Part_a s.
- by rewrite inE Ks'H (subsetP (Iirr_kerS _ _) _ KsH0C') ?joing_subl.
- suffices lin_r: 'chi_r \is a linear_char.
- by split; [rewrite Du Ds cfInd1 ?lin_char1 ?mulr1 | exists 'chi_r].
- have KrH0C': H0C' \subset cfker 'chi_r.
- rewrite inE Ds sub_cfker_Ind_irr // in KsH0C'.
- by rewrite (subset_trans sHUM) ?normal_norm.
- rewrite lin_irr_der1 (subset_trans _ KrH0C') //= (norm_joinEr nH0C').
- rewrite -quotientSK ?gFsub_trans ?quotient_der //= -/C.
- by rewrite -(der_dprod 1 defHCbar) (derG1P abHbar) dprod1g.
-split=> // [s /Part_a[r ->] | | {Part_a' part_a'}red_H0C'].
-- by rewrite Du cfInd1 // dvdC_mulr // Cint_Cnat ?Cnat_irr1.
-- split=> // mu_j /H0C_mu H0C_mu_j; have [s XH0Cs Dmuj] := seqIndP H0C_mu_j.
- have [|s1u [xi lin_xi Ds]] := Part_a' s.
- by rewrite (subsetP _ _ XH0Cs) ?Iirr_kerDS // genS ?setUS ?der_sub.
- split=> //; first by rewrite Dmuj cfInd1 // s1u -natrM -(index_sdprod defM).
- by rewrite Dmuj Ds cfIndInd //; exists xi.
-have C1: C :=: 1%g.
- apply: contraTeq red_H0C' => ntC; apply/allPn.
- have sCM: C \subset M := subset_trans sCU (subset_trans sUHU sHUM).
- have{sCM} solCbar: solvable (C / H0).
- by rewrite quotient_sol ?(solvableS sCM) ?mmax_sol.
- have [|{ntC solCbar} j lin_j nz_j] := solvable_has_lin_char _ solCbar.
- rewrite -(isog_eq1 (quotient_isog _ _)) ?(subset_trans sCU) //.
- by rewrite coprime_TIg ?(coprimegS sCU) ?(coprimeSg sH0H).
- have [i lin_i nz_i] := solvable_has_lin_char ntHbar solHbar.
- pose r := mod_Iirr (dprod_Iirr defHCbar (i, j)).
- have KrH0: H0 \subset cfker 'chi_r by rewrite mod_IirrE ?cfker_mod.
- have Kr'H: ~~ (H \subset cfker 'chi_r).
- rewrite -subsetIidl -cfker_Res ?joing_subl ?irr_char // mod_IirrE //.
- rewrite cfResMod ?joing_subl // sub_cfker_mod // dprod_IirrE.
- by rewrite cfDprodKl ?lin_char1 // subGcfker -irr_eq1.
- have [|s Ds] := irrP _ (irr_IndHC r _); first by rewrite !inE Kr'H.
- have Ks'H: s \notin Iirr_ker HU H.
- by rewrite inE -Ds sub_cfker_Ind_irr ?normal_norm.
- exists ('Ind 'chi_s).
- rewrite mem_seqInd ?gFnormal // inE Ks'H inE -Ds.
- rewrite sub_cfker_Ind_irr // ?(subset_trans sHUM) ?normal_norm //=.
- rewrite mod_IirrE // join_subG cfker_mod // sub_cfker_mod ?quotient_der //.
- apply: subset_trans (dergS 1 (quotientS H0 (joing_subr H C))) _.
- by rewrite -lin_irr_der1 dprod_IirrE cfDprod_lin_char.
- apply: contra nz_j => red_j; have /implyP := H0C_mu ('Ind 'chi_s).
- rewrite mem_filter red_j !mem_seqInd ?gFnormal // !in_setD Ks'H !inE -Ds.
- rewrite irr_eq1 !sub_cfker_Ind_irr ?(normal_norm nsH0HU) //.
- rewrite mod_IirrE // join_subG cfker_mod //= sub_cfker_mod // dprod_IirrE.
- by move/(sub_cfker_Res (subxx _)); rewrite cfDprodKr ?lin_char1 ?subGcfker.
-rewrite /= -/C C1 joingG1 in frobHU; split=> //; move/FrobeniusWker in frobHU.
-have nsHbHU: Hbar <| (HU / H0) by rewrite quotient_normal.
-have ->: (p ^ q).-1 = (#|X_ H0| * u)%N.
- rewrite -oF -cardsT -im_phi card_injm // -(card_Iirr_abelian abHbar).
- rewrite -(cardsC1 0) (card_imset_Ind_irr nsHbHU) => [|i|i y]; last first.
- - by rewrite !inE conjg_Iirr_eq0.
- - by rewrite !inE => nz_i; rewrite inertia_Ind_irr ?inertia_Frobenius_ker.
- rewrite index_quotient_eq ?(subset_trans sHUM) ?subIset ?sH0H ?orbT //.
- apply/eqP; rewrite Du /= C1 joingG1 mulnC eqn_pmul2r //.
- rewrite -(card_imset _ (can_inj (mod_IirrK _))) // -imset_comp.
- apply/eqP/eq_card=> s; apply/imsetP/idP=> [[i nz_i -> /=] | Xs].
- rewrite !inE mod_IirrE 1?{1}cfker_mod // andbT in nz_i *.
- rewrite cfIirrE ?inertia_Ind_irr ?inertia_Frobenius_ker // sub_cfker_mod //.
- by rewrite sub_cfker_Ind_irr ?quotientS ?normal_norm // subGcfker.
- have [[]] := (Part_a s Xs, setDP Xs).
- rewrite /= C1 joingG1 !inE => r Ds [kerH0s].
- have:= kerH0s; rewrite Ds !sub_cfker_Ind_irr ?normal_norm // => kerH0 ker'H.
- exists (quo_Iirr H0 r).
- by rewrite !inE -subGcfker quo_IirrE // cfker_quo ?quotientSGK.
- by rewrite quo_IirrE // cfIndQuo // -Ds -quo_IirrE // irrK quo_IirrK.
-suffices ->: #|X_ H0| = p.-1 by rewrite -(subnKC (prime_gt1 p_pr)) mulKn.
-rewrite -nb_mu (size_red_subseq_seqInd_typeP MtypeP _ H0C_mu) //; last first.
-- exact/allP/filter_all.
-- by rewrite filter_uniq ?seqInd_uniq.
-apply/esym/eq_card => i; rewrite inE mem_filter mem_seqInd ?gFnormal //.
-rewrite andb_idl // => Xi; rewrite (allP red_H0C') //.
-by rewrite mem_seqInd ?gFnormal //= C1 (trivgP (der_sub 1 _)) joingG1.
-Qed.
-
-(* This combination of (9.8)(b) and (9.9)(b) covers most uses of these lemmas *)
-(* in sections 10-14. *)
-Lemma typeP_reducible_core_Ind (ptiWM := FT_primeTI_hyp MtypeP) :
- [/\ size mu_ = p.-1, has predT mu_,
- {subset mu_ <= [seq primeTIred ptiWM j | j in predC1 0]}
- & {in mu_, forall mu_j, isIndHC mu_j}].
-Proof.
-have [[sz_mu _] /mulG_sub[sHHU _]] := (nb_redM_H0, sdprodW defHU).
-rewrite has_predT sz_mu -subn1 subn_gt0 prime_gt1 //; split=> // [mu_j|].
- rewrite mem_filter => /andP[red_chi /seqIndP[s /setDP[_ kerH's] Dchi]].
- have [[j Ds] | [/idPn[]]] := prTIres_irr_cases ptiWM s; last by rewrite -Dchi.
- rewrite Dchi Ds cfInd_prTIres image_f ?inE //=.
- by apply: contraNneq kerH's => j0; rewrite inE Ds j0 prTIres0 cfker_cfun1.
-have[/typeP_Galois_characters[_ _ []] // | Gal'M] := boolP typeP_Galois.
-by have [_ []] := typeP_nonGalois_characters Gal'M.
-Qed.
-
-(* This is Peterfalvi (9.10), formulated as a constructive alternative. *)
-Lemma typeP_reducible_core_cases :
- {t : Iirr M & 'chi_t \in S_ H0C' /\ 'chi_t 1%g = (q * u)%:R
- & {xi | xi \is a linear_char & 'chi_t = 'Ind[M, HC] xi}}
- + [/\ typeP_Galois, [Frobenius HU / H0 = Hbar ><| (U / H0)],
- cyclic U, #|U| = (p ^ q).-1 %/ p.-1
- & FTtype M == 2 -> [Frobenius HU = H ><| U]].
-Proof.
-have [GalM | Gal'M] := boolP typeP_Galois; last first.
- pose eqInHCb nu r := ('chi_r \is a linear_char) && (nu == 'Ind[M, HC] 'chi_r).
- pose isIndHCb (nu : 'CF(M)) :=
- (nu 1%g == (q * u)%:R) && [exists r, eqInHCb nu r].
- suffices /sig2W[t H0C't]: exists2 t, 'chi_t \in S_ H0C' & isIndHCb 'chi_t.
- case/andP=> /eqP t1qu /exists_inP/sig2W[r lin_r /eqP def_t].
- by left; exists t => //; exists 'chi_r.
- have [_ _ [t [t1qu H0Ct IndHCt]] _] := typeP_nonGalois_characters Gal'M.
- exists t; first by rewrite (seqIndS _ H0Ct) ?Iirr_kerDS ?genS ?setUS ?der_sub.
- rewrite /isIndHCb t1qu eqxx; have [xi lin_xi ->] := IndHCt.
- by apply/exists_inP; exists (cfIirr xi); rewrite cfIirrE ?lin_char_irr.
-have [_ IndHC_SH0C' _] := typeP_Galois_characters GalM; rewrite all_predC.
-case: hasP => [/sig2W[eta H0C'eta /irrP/sig_eqW[t Dt]] _ | _ [//|C1 <- frobHU]].
- have /sig2_eqW[s /IndHC_SH0C'[s1u IndHCs] Deta] := seqIndP H0C'eta.
- have [joinHU [xi lin_xi Ds]] := (sdprodWY defHU, sig2_eqW IndHCs).
- left; exists t; first split; rewrite -Dt // Deta.
- by rewrite cfInd1 ?der_sub // -(index_sdprod defM) s1u -natrM.
- by exists xi; rewrite ?Ds ?cfIndInd ?der_sub // -joinHU genS ?setUS ?subsetIl.
-have cycU: cyclic U.
- rewrite (isog_cyclic (quotient1_isog _)) -C1.
- by have [_ _ []] := typeP_Galois_P GalM.
-right; split=> //; first by rewrite /u /Ubar C1 -(card_isog (quotient1_isog _)).
-case/(compl_of_typeII maxM MtypeP) => /= _ _ _ UtypeF <-.
-have [_ -> _] := typeF_context UtypeF.
-by apply/forall_inP=> S /and3P[_ /cyclicS->].
-Qed.
-
-Import ssrint.
-
-(* This is Peterfalvi (9.11) *)
-(* We had to cover a small gap in step (9.11.4) of the proof, which starts by *)
-(* proving that U1 \subset {1} u A(M), then asserts this obviously implies *)
-(* HU1 \subset {1} u A(M). It is not, as while {1} u A(M) does contain H, it *)
-(* is not (necessarily) a subgroup. We had to use the solvability of HU1 in a *)
-(* significant way (using Philip Hall's theorems) to bridge the gap; it's *)
-(* also possible to exploit lemma (2.1) (partition_cent_rcoset in PFsection1) *)
-(* in a slightly different argument, but the inference is nontrivial in *)
-(* either case. *)
-Lemma Ptype_core_coherence : coherent (S_ H0C') M^# tau.
-Proof.
-have [nsHUM sW1M /mulG_sub[sHUM _] nHUW1 tiHUW1] := sdprod_context defM.
-have [nsHHU sUHU /mulG_sub[sHHU _] nHU tiHU] := sdprod_context defHU.
-have nsCU: C <| U := normalS sCU (joing_subl _ _) nsCUW1.
-have [_ nCU] := andP nsCU; have sC'C: C^`(1)%g \subset C := der_sub 1 _.
-have coHC := coprimegS sCU coHU; have coH0C := coprimeSg sH0H coHC.
-have [nsH0C_M nsHC_M nsH0U'_M nsH0C'_M] := nsH0xx_M; have [_ nH0H]:= andP nsH0H.
-have nH0HU := subset_trans sHUM nH0M; have nH0U := subset_trans sUHU nH0HU.
-have nH0C := subset_trans sCU nH0U; have nH0C' := subset_trans sC'C nH0C.
-have sHCHU: HC \subset HU by rewrite join_subG sHHU (subset_trans sCU).
-have [nsHCHU nHC] := (normalS sHCHU sHUM nsHC_M, subset_trans sCU nHU).
-have tiHCbar: Hbar :&: (C / H0)%g = 1%g by rewrite coprime_TIg ?coprime_morph.
-have defHCbar: Hbar \x (C / H0) = (HC / H0)%g.
- by rewrite dprodEY ?quotientY // [C]unlock/= astabQ quotient_setIpre subsetIr.
-have{tiHCbar} defHC'bar: (HC / H0)^`(1)%g = (C^`(1) / H0)%g.
- by rewrite -(der_dprod 1 defHCbar) (derG1P abHbar) dprod1g quotient_der.
-have sU'U := der_sub 1 U; have nH0U' := subset_trans sU'U nH0U.
-have sU'C: U' \subset C.
- by rewrite [C]unlock subsetI sub_astabQ sU'U nH0U' quotient_cents.
-have uS0: uniq (S_ H0C') by apply: seqInd_uniq.
-have [rmR scohS0]: exists R : 'CF(M) -> seq 'CF(G), subcoherent (S_ H0C') tau R.
- move: (FTtypeP_coh_base _ _) (FTtypeP_subcoherent maxM MtypeP) => R scohR.
- exists R; apply: (subset_subcoherent scohR).
- split=> //; last exact: cfAut_seqInd.
- by apply: seqIndS; rewrite Iirr_kerDS ?sub1G ?Fcore_sub_FTcore.
-have [GalM | Gal'M] := boolP typeP_Galois.
- have [_ XOC'u _ _] := typeP_Galois_characters GalM.
- apply: uniform_degree_coherence scohS0 _.
- apply: all_pred1_constant (#|M : HU| * u)%:R _ _; rewrite all_map.
- by apply/allP=> _ /seqIndP[s /XOC'u[s1u _] ->] /=; rewrite natrM cfInd1 ?s1u.
-have:= typeP_nonGalois_characters Gal'M.
-set U1 := 'C_U(_ | _); set a := #|_ : _|.
-case: (_ Gal'M) => /= H1 [oH1 nH1U _ defHbar aP] in U1 a *.
-rewrite -/U1 -/a in aP; case: aP => a_gt1 a_dv_p1 cycU1 _.
-case=> [a_dv_XH0 [nb_mu IndHCmu] has_irrHC lb_Sqa]; rewrite -[S_ _]/(S_ H0C').
-have defHb1 := defHbar; rewrite (big_setD1 1%g) ?group1 ?conjsg1 //= in defHb1.
-have [[_ H1c _ defH1c] _ _ _] := dprodP defHb1; rewrite defH1c in defHb1.
-have [nsH1H _] := dprod_normal2 defHb1; have [sH1H _] := andP nsH1H.
-have nsU1U: U1 <| U; last have [sU1U nU1U] := andP nsU1U.
- by rewrite norm_normalI // astabQ norm_quotient_pre ?norms_cent.
-have Da: a = #|HU : H <*> U1|.
- rewrite /a -!divgS /= ?join_subG ?sHHU ?norm_joinEr ?(subset_trans sU1U) //=.
- by rewrite -(sdprod_card defHU) coprime_cardMg ?(coprimegS sU1U) ?divnMl.
-have sCU1: C \subset U1 by rewrite [C]unlock setIS ?astabS.
-have a_dv_u: a %| u by rewrite Da Du indexgS ?genS ?setUS.
-have [a_gt0 q_gt0 u_gt0 p1_gt0]: [/\ 0 < a, 0 < q, 0 < u & 0 < p.-1]%N.
- rewrite !cardG_gt0 ltnW // -subn1 subn_gt0 prime_gt1 //.
-have [odd_p odd_q odd_a]: [/\ odd p, odd q & odd a].
- by rewrite mFT_odd -oH1 (oddSg sH1H) ?(dvdn_odd a_dv_u) ?mFT_quo_odd.
-have Dp: p = (2 * p.-1./2 + 1)%N.
- by rewrite mul2n -[p]odd_double_half odd_p half_double addn1.
-(* Start of main proof. *)
-pose S1 := filter [pred zeta : 'CF(M) | zeta 1%g == (q * a)%:R] (S_ H0C').
-have ntS1: (0 < size S1)%N.
- have [lb_dv lbS1] := lb_Sqa; apply: leq_trans (leq_trans lbS1 _).
- by rewrite ltn_divRL // mul0n muln_gt0 p1_gt0 cardG_gt0.
- rewrite -size_filter uniq_leq_size ?filter_uniq ?seqInd_uniq // => chi.
- rewrite !mem_filter -andbA /= => /and3P[_ ->].
- by apply: seqIndS; rewrite Iirr_kerDS // genS ?setUS ?dergS ?subsetIl.
-have sS10: cfConjC_subset S1 (S_ H0C').
- split=> [||chi]; first by rewrite filter_uniq.
- by apply: mem_subseq; apply: filter_subseq.
- rewrite !mem_filter !inE cfunE => /andP[/eqP <- S0chi].
- by rewrite cfAut_seqInd // andbT conj_Cnat ?(Cnat_seqInd1 S0chi).
-have cohS1: coherent S1 M^# tau.
- apply: uniform_degree_coherence (subset_subcoherent scohS0 sS10) _.
- by apply: all_pred1_constant (q * a)%:R _ _; rewrite all_map filter_all.
-pose S3 := filter [predC S1] (S_ H0C'); move: {2}_.+1 (ltnSn (size S3)) => nS.
-move: @S3 (sS10) (cohS1); have: {subset S1 <= S1} by [].
-elim: nS {-1}S1 => // nS IHnS S2 => sS12 S3 sS20 cohS2; rewrite ltnS => leS3nS.
-have [ntS3|] := boolP (size S3 > 0)%N; last first.
- rewrite size_filter -has_count has_predC negbK => /allP sS02.
- exact: subset_coherent sS02 cohS2.
-(* Ultimateley we'll contradict the maximality of S2 in (9.11.1) & (9.11.8). *)
-suff [chi]: exists2 chi, chi \in S3 & coherent (chi :: chi^* :: S2)%CF M^# tau.
- rewrite mem_filter => /andP[/= S2'chi S0chi]; have [uS2 sS2S0 ccS2] := sS20.
- move/IHnS; apply=> [psi /sS12 S1psi||]; first by rewrite 2?mem_behead.
- split.
- - rewrite /= !inE negb_or S2'chi (contra (ccS2 _)) ?cfConjCK // eq_sym.
- by rewrite (seqInd_conjC_neq _ _ _ S0chi) ?mFT_odd.
- - by apply/allP; rewrite /= S0chi cfAut_seqInd //=; apply/allP.
- apply/allP; rewrite /= !inE cfConjCK !eqxx orbT /=.
- by apply/allP=> psi /ccS2; rewrite !inE orbA orbC => ->.
- apply: leq_trans leS3nS; rewrite ltnNge; apply: contra S2'chi.
- case/leq_size_perm=> [|psi|/(_ chi)]; first by rewrite filter_uniq.
- by rewrite !mem_filter !inE orbA negb_or -andbA => /andP[].
- by rewrite !mem_filter !inE eqxx S0chi !andbT => /esym/negbFE.
-(* This is step (9.11.1). *) clear nS IHnS leS3nS.
-without loss [[eqS12 irrS1 H0C_S1] [Da_p defC] [S3qu ne_qa_qu] [oS1 oS1ua]]:
- / [/\ [/\ S1 =i S2, {subset S1 <= irr M} & {subset S1 <= S_ H0C}],
- a = p.-1./2 /\ C :=: U',
- (forall chi, chi \in S3 -> chi 1%g == (q * u)%:R) /\ (q * u != q * a)%N
- & size S1 = (p.-1 * u %/ a ^ 2)%N /\ size S1 = (2 * u %/ a)%N].
-- move=> IHwlog; have{sS20} [[uS2 sS20 ccS2] [uS1 _ _]] := (sS20, sS10).
- pose is_qu := [pred chi : 'CF(M) | chi 1%g == (q * u)%:R].
- pose isn't_qu := [pred chi | is_qu chi ==> all is_qu S3].
- have /hasP[chi S3chi qu'chi]: has isn't_qu S3.
- rewrite /isn't_qu; have [_|] := boolP (all _ _); last by rewrite has_predC.
- by rewrite (eq_has (fun _ => implybT _)) has_predT.
- have [S2'chi S0chi]: chi \notin S2 /\ chi \in S_ H0C'.
- by apply/andP; rewrite mem_filter in S3chi.
- have [s X0C's Dchi] := seqIndP S0chi.
- have Dchi1: chi 1%g = q%:R * 'chi_s 1%g.
- by rewrite Dchi cfInd1 // -(index_sdprod defM).
- (* We'll show lb0 <= lb1 <= lb <= lb3 <= sumnS S1' <= sumnS S2 <= lb0, *)
- (* with equality under conditions that imply the conclusion of (9.11.1). *)
- pose lb0 := (2 * q * a)%:R * chi 1%g.
- pose lb1 : algC := (2 * a * q ^ 2 * u)%:R.
- pose lb2 : algC := (p.-1 * q ^ 2 * u)%:R.
- pose lb3 : algC := (p.-1 * q ^ 2 * #|U : U'|)%:R.
- pose S1' := filter [predI irr M & S_ H0U'] S1.
- pose szS1' := ((p.-1 * #|U : U'|) %/ a ^ 2)%N; set lbS1' := _ %/ _ in lb_Sqa.
- pose Snorm (psi : 'CF(M)) := psi 1%g ^+ 2 / '[psi].
- pose sumnS Si := \sum_(psi <- Si) Snorm psi.
- have lb01: lb0 <= lb1 ?= iff (chi 1%g == (q * u)%:R).
- rewrite /lb1 mulnA -mulnA natrM /lb0 mulnAC mono_lerif; last first.
- by apply: ler_pmul2l; rewrite ltr0n !muln_gt0 a_gt0.
- apply: lerif_eq; rewrite Dchi1 natrM ler_pmul2l ?gt0CG //.
- have [KsH0C' _] := setDP X0C's; rewrite inE in KsH0C'.
- have [t sHCt] := constt_cfRes_irr HC s.
- have KtH0C': H0C' \subset cfker 'chi_t.
- apply: subset_trans (cfker_constt (cfRes_char _ (irr_char s)) sHCt).
- by rewrite cfker_Res ?irr_char // subsetI genS ?setUSS.
- rewrite -constt_Ind_Res in sHCt.
- apply: ler_trans (char1_ge_constt (cfInd_char _ (irr_char t)) sHCt) _.
- rewrite cfInd1 // -Du lin_char1 ?mulr1 // lin_irr_der1.
- apply: subset_trans KtH0C'; rewrite /= (norm_joinEr nH0C') /= -/C.
- rewrite -quotientSK ?(subset_trans (der_sub _ _)) ?(subset_trans sHCHU) //.
- by rewrite -defHC'bar quotient_der ?(subset_trans sHCHU).
- have lb12: lb1 <= lb2 ?= iff (a == p.-1./2).
- rewrite -(@eqn_pmul2l 2) // -(canLR (addnK 1) Dp) subn1 lerif_nat.
- rewrite !(mono_leqif (fun _ _ => leq_pmul2r _)) ?expn_gt0 ?q_gt0 //.
- apply: leqif_eq; rewrite dvdn_leq // Gauss_dvd //.
- by rewrite {1}Dp addn1 dvdn_mulr.
- by rewrite prime_coprime ?dvdn2 ?negbK.
- have lb23: lb2 <= lb3 ?= iff (C :==: U') :> algC.
- rewrite lerif_nat [u]card_quotient //.
- rewrite (mono_leqif (fun _ _ => leq_pmul2l _)) ?muln_gt0 ?p1_gt0 ?q_gt0 //.
- rewrite -(mono_leqif (fun _ _ => leq_pmul2l (cardG_gt0 C))) Lagrange //.
- rewrite -(Lagrange sU'U) (mono_leqif (fun _ _ => leq_pmul2r _)) //.
- by rewrite eq_sym; apply: subset_leqif_cards.
- have lb3S1': lb3 <= sumnS S1' ?= iff (size S1' == szS1').
- rewrite /szS1' -(divnMr (cardG_gt0 U')) mulnAC -mulnA Lagrange // -/lbS1'.
- have{lb_Sqa} [dv_lb lbSqa] := lb_Sqa; rewrite [sumnS S1']big_seq.
- rewrite (eq_bigr (fun _ => ((q * a) ^ 2)%:R)) => [|psi]; last first.
- rewrite !mem_filter -!andbA => /and4P[/irrP[r ->] _ /=/eqP r1qa _].
- by rewrite /Snorm cfnorm_irr divr1 r1qa natrX.
- rewrite -big_seq (big_nth 0) -natr_sum sum_nat_const_nat subn0.
- rewrite mulnC natrM [*%R]lock /lb3 natrM natf_indexg ?der_sub // mulrA.
- rewrite -natrM mulnAC -(divnK dv_lb) mulnAC mulnA natrM mulfK ?neq0CG //.
- rewrite -/lbS1' -mulnA -expnMn natrM mulrC -lock mono_lerif; last first.
- by apply: ler_pmul2l; rewrite ltr0n !muln_gt0 a_gt0 q_gt0.
- rewrite eq_sym lerif_nat; apply: leqif_eq; rewrite (leq_trans lbSqa) //.
- rewrite -size_filter uniq_leq_size ?filter_uniq ?seqInd_uniq // => psi.
- rewrite !mem_filter -!andbA /= => /and3P[-> -> S0psi]; rewrite S0psi.
- by apply: seqIndS S0psi; rewrite Iirr_kerDS //= genS ?setUS ?dergS.
- have lbS1'2: sumnS S1' <= sumnS S2 ?= iff ~~ has [predC S1'] S2.
- have Ds2: perm_eq S2 (S1' ++ filter [predC S1'] S2).
- rewrite -(perm_filterC (mem S1')) perm_cat2r.
- rewrite uniq_perm_eq ?filter_uniq // => psi.
- by rewrite mem_filter andb_idr //= mem_filter => /andP[_ /sS12].
- rewrite [sumnS S2](eq_big_perm _ Ds2) big_cat /= -/(sumnS S1') big_filter.
- rewrite -all_predC -big_all_cond !(big_tnth _ _ S2) big_andE.
- rewrite -{1}[_ S1']addr0 mono_lerif; last exact: ler_add2l.
- set sumS2' := \sum_(i | _) _; rewrite -[0]/(sumS2' *+ 0) -sumrMnl.
- apply: lerif_sum => i _; apply/lerifP; rewrite lt0r !mulf_eq0 invr_eq0.
- set psi := tnth _ i; have Spsi := sS20 psi (mem_tnth _ _).
- rewrite !negb_or (seqInd1_neq0 _ Spsi) //= (cfnorm_seqInd_neq0 _ Spsi) //=.
- by rewrite divr_ge0 ?exprn_ge0 ?cfnorm_ge0 ?Cnat_ge0 ?(Cnat_seqInd1 Spsi).
- have [lb0S2 | ] := boolP (lb0 < sumnS S2).
- exists chi => //; have /hasP[xi S1xi _]: has predT S1 by rewrite has_predT.
- have xi1: xi 1%g = (q * a)%:R.
- by rewrite mem_filter in S1xi; have [/eqP] := andP S1xi.
- apply: (extend_coherent scohS0 _ (sS12 _ S1xi)) => //.
- split=> //; last by rewrite mulrAC xi1 -natrM mulnA.
- rewrite xi1 Dchi1 irr1_degree -natrM dvdC_nat dvdn_pmul2l ?cardG_gt0 //.
- rewrite -dvdC_nat /= !nCdivE -irr1_degree a_dv_XH0 //.
- by rewrite (subsetP (Iirr_kerDS _ _ _) _ X0C's) ?joing_subl.
- have lb1S2 := lerif_trans lb12 (lerif_trans lb23 (lerif_trans lb3S1' lbS1'2)).
- rewrite ltr_neqAle !(lerif_trans lb01 lb1S2) andbT has_predC !negbK.
- case/and5P=> /eqP-chi1qu /eqP-Da_p /eqP-defC /eqP-sz_S1' /allP/=sS21'.
- have defS1': S1' = S1.
- apply/eqP; rewrite -(geq_leqif (size_subseq_leqif (filter_subseq _ S1))).
- by rewrite uniq_leq_size // => psi /sS12/sS21'.
- apply: IHwlog; split=> //.
- + split=> psi; do 1?[rewrite -defS1' mem_filter andbC => /and3P[_ _] //=].
- by apply/idP/idP=> [/sS12 | /sS21']; rewrite ?defS1'.
- by congr (_ \in S_ _); apply/group_inj; rewrite /= defC.
- + split; first by apply/allP; apply: contraLR qu'chi; rewrite /= chi1qu eqxx.
- rewrite -eqC_nat -chi1qu; apply: contra S2'chi => chi1qa.
- by rewrite sS12 // mem_filter /= chi1qa.
- rewrite -defS1' sz_S1' /szS1' -defC -card_quotient // -/u.
- by split=> //; rewrite -mulnn {1}Dp addn1 -Da_p mulnAC divnMr.
-have nCW1: W1 \subset 'N(C).
- by rewrite (subset_trans (joing_subr U W1)) ?normal_norm.
-(* This is step (9.11.2). *) clear sS20 cohS2 sS12 has_irrHC lb_Sqa sU'C.
-have [tiU1 le_u_a2]: {in W1^#, forall w, U1 :&: U1 :^ w = C} /\ (u <= a ^ 2)%N.
- have tiU1 w: w \in W1^# -> U1 :&: U1 :^ w = C; last split => //.
- case/setD1P=> ntw W1w; have nH0w := subsetP (subset_trans sW1M nH0M) w W1w.
- pose wb := coset H0 w; have W1wb: wb \in W1bar^#.
- rewrite !inE mem_quotient ?(contraNneq _ ntw) // => /coset_idr H0w.
- rewrite -in_set1 -set1gE -tiHUW1 inE (subsetP sHHU) // (subsetP sH0H) //.
- by rewrite H0w.
- have ntH1 w1: H1 :^ w1 :!=: 1%g by rewrite -cardG_gt1 cardJg oH1 prime_gt1.
- pose t_ w1 :=
- if pred2 1%g wb w1 then sval (has_nonprincipal_irr (ntH1 w1)) else 0.
- pose theta :=
- cfDprodl defHCbar (cfBigdprod defHbar (fun w1 => 'chi_(t_ w1))).
- have lin_theta : theta \is a linear_char.
- rewrite cfDprodl_lin_char ?cfBigdprod_lin_char // => w1 _.
- by rewrite irr_prime_lin ?cardJg ?oH1.
- have nsH0HC: H0 <| HC.
- by rewrite /normal join_subG nH0H sub_gen ?subsetU ?sH0H.
- move defK: H0C => K. (* to avoid divergence in Coq kernel *)
- have kerK: K \subset cfker (theta %% H0).
- rewrite -defK sub_cfker_mod ?join_subG ?normG ?quotientYidl //.
- exact: cfker_sdprod.
- have sKHC: K \subset HC by rewrite -defK genS ?setSU.
- have nsKHC: K <| HC by rewrite (normalS sKHC (normal_sub nsHC_M)) -?defK.
- have sH0K: H0 \subset K by rewrite -defK joing_subl.
- have nsKHU: K <| HU.
- by rewrite (normalS (subset_trans sKHC sHCHU) sHUM) -?defK.
- have [t2 Dt2]: {t2 : Iirr (HC / K) | 'chi_t2 %% K = theta %% H0}%CF.
- exists (cfIirr ((theta %% H0) / K)).
- by rewrite cfIirrE ?cfQuoK ?cfQuo_irr ?cfMod_irr ?lin_char_irr.
- have nsHChatHU: HC / K <| HU / K by rewrite quotient_normal.
- have sHChatHU := normal_sub nsHChatHU.
- pose That := 'I_(HU / K)['chi_t2]%G.
- have sThatHU: That \subset (HU / K)%G := Inertia_sub _ _.
- have abThatHC: abelian (That / (HC / K)).
- rewrite (abelianS (quotientS _ sThatHU)) //.
- rewrite (isog_abelian (third_isog _ _ _)) // defC.
- rewrite -(isog_abelian (quotient_sdprodr_isog defHU _)) ?gFnormal //.
- by rewrite sub_der1_abelian.
- have hallHChat: Hall That (HC / K).
- rewrite /Hall -(card_isog (third_isog sH0K nsH0HC nsKHC)) /=.
- rewrite sub_Inertia // -[in #|_|]defK /= quotientYidl //.
- rewrite -(card_isog (sdprod_isog (dprodWsdC defHCbar))).
- apply: coprime_dvdr (indexSg (sub_Inertia _ sHChatHU) sThatHU) _.
- apply: coprime_dvdr (index_quotient _) _.
- by rewrite subIset // normal_norm.
- by rewrite -Du coprime_morphl // coprime_morphr.
- have [s t2HUs] := constt_cfInd_irr t2 sHChatHU.
- have s_1: ('chi_s %% K)%CF 1%g = #|U : U1 :&: U1 :^ w|%:R.
- rewrite cfMod1.
- have [||_ _ ->] // := cfInd_Hall_central_Inertia _ abThatHC.
- rewrite -cfMod1 Dt2 cfMod1 lin_char1 //= mulr1 -inertia_mod_quo // Dt2.
- rewrite index_quotient_eq ?normal_norm ?Inertia_sub ?setIS //; last first.
- by rewrite (subset_trans sKHC) ?sub_inertia.
- rewrite /= inertia_morph_pre //= -quotientE inertia_dprodl; first 1 last.
- - by rewrite quotient_norms ?normal_norm.
- - rewrite /= -(quotientYidl nH0C) quotient_norms ?normal_norm //.
- by rewrite -defK in nsKHU.
- have nH1wHU w1: w1 \in (W1 / H0)%g -> (HU / H0)%g \subset 'N(H1 :^ w1).
- move=> W1w1; rewrite -(normsP (quotient_norms H0 nHUW1) _ W1w1) normJ.
- rewrite conjSg /= -(sdprodW defHU) quotientMl ?mul_subG //.
- exact: normal_norm.
- rewrite indexgI /= inertia_bigdprod_irr // (big_setD1 1%g) ?group1 //=.
- rewrite 2!{1}setIA setIid (bigD1 wb) //= {1 2}/t_ /= !eqxx ?orbT /=.
- rewrite !(inertia_irr_prime _ p_pr) ?cardJg //=;
- try by case: (has_nonprincipal_irr _).
- rewrite conjsg1 centJ setIA -setIIr /=.
- elim/big_rec: _ => [|w1 Uk /andP[/setD1P[ntw1 Ww1] w'w1] IHk]; last first.
- rewrite /t_ -if_neg negb_or ntw1 w'w1 irr0 Inertia1 -?setIIr 1?setIA //.
- rewrite /normal nH1wHU //= -(normsP (quotient_norms H0 nHUW1) _ Ww1).
- by rewrite conjSg (subset_trans sH1H) ?quotientS.
- rewrite setIT !morphpreI morphpreJ ?(subsetP nH0W1) //= -astabQ.
- rewrite quotientGK //; last by rewrite /normal (subset_trans sH0H).
- rewrite -(sdprodWY (sdprod_modl defHU _)); last first.
- rewrite subsetI -sub_conjgV.
- rewrite (normsP (gFnorm _ _)) ?groupV ?(subsetP sW1M) //= andbb.
- by rewrite sub_astabQ nH0H sub_abelian_cent.
- rewrite -(index_sdprodr defHU) ?subsetIl // conjIg (normsP nUW1) //.
- by rewrite -setIIr.
- apply/esym/eqP; rewrite eqEcard subsetI -sub_conjgV.
- rewrite (normsP _ _ (groupVr W1w)) ?sCU1 /=; last first.
- by rewrite (subset_trans (joing_subr U W1)) ?normal_norm.
- have{s_1} : pred2 u a #|U : U1 :&: U1 :^ w|.
- rewrite /= -!eqC_nat -{}s_1 -mod_IirrE //.
- pose phi := 'Ind[M] 'chi_(mod_Iirr s).
- have Sphi: phi \in S_ H0C'.
- rewrite mem_seqInd ?gFnormal // !inE mod_IirrE //.
- rewrite andbC (subset_trans _ (cfker_mod _ _)) //=; last first.
- by rewrite -defK genS ?setUS ?der_sub.
- rewrite sub_cfker_mod ?(subset_trans sHHU) ?normal_norm //.
- have sHHC: H \subset HC by rewrite joing_subl.
- rewrite -(sub_cfker_constt_Ind_irr t2HUs) ?quotientS //; last first.
- by rewrite quotient_norms ?normal_norm.
- rewrite -sub_cfker_mod ?(subset_trans sHHU (normal_norm nsKHU)) //.
- rewrite Dt2 sub_cfker_mod //.
- apply: contra (valP (has_nonprincipal_irr (ntH1 1%g))).
- move/eq_cfker_Res; rewrite cfDprodlK => kerHbar.
- have:= sH1H; rewrite -{1}(conjsg1 H1) -kerHbar => /eq_cfker_Res.
- by rewrite cfBigdprodKabelian ?group1 // /t_ /= eqxx -subGcfker => ->.
- have [/S3qu | ] := boolP (phi \in S3).
- rewrite cfInd1 // natrM -(index_sdprod defM).
- by rewrite (inj_eq (mulfI (neq0CG _))) => ->.
- rewrite mem_filter Sphi andbT negbK /= -eqS12 mem_filter Sphi andbT /=.
- rewrite cfInd1 // natrM -(index_sdprod defM) (inj_eq (mulfI (neq0CG _))).
- by rewrite orbC => ->.
- case/pred2P=> [iUCu | iUCa].
- rewrite -(leq_pmul2r u_gt0) -{1}iUCu /u card_quotient ?Lagrange //.
- by rewrite /= -setIA subsetIl.
- rewrite subset_leq_card // subIset // [C]unlock subsetI subsetIl sub_astabQ.
- rewrite subIset ?nH0U //= centsC -(bigdprodWY defHbar) gen_subG.
- apply/orP; left; apply/bigcupsP=> w1 Ww1; rewrite centsC centJ -sub_conjgV.
- rewrite (normsP _ _ (groupVr Ww1)) ?quotient_norms //.
- by rewrite /U1 astabQ quotient_setIpre subsetIr.
- rewrite prime_meetG //; apply/trivgPn; exists w; rewrite // !inE W1w.
- rewrite (sameP setIidPr eqP) eqEcard subsetIr /= cardJg.
- by rewrite -(leq_pmul2r a_gt0) -{2}iUCa !Lagrange //= -setIA subsetIl.
- have /trivgPn[w W1w ntw]: W1 :!=: 1%g by rewrite -cardG_gt1 prime_gt1.
- rewrite -(leq_pmul2l u_gt0) mulnn.
- have nCU1 := subset_trans sU1U nCU.
- have {1}->: u = (#|(U1 / C)%g| * a)%N.
- by rewrite mulnC /u !card_quotient // Lagrange_index.
- rewrite expnMn leq_pmul2r ?expn_gt0 ?orbF // -mulnn.
- rewrite -{2}[U1](conjsgK w) quotientJ ?groupV ?(subsetP nCW1) //.
- rewrite cardJg -TI_cardMg /= -/U1 ?subset_leq_card //.
- rewrite mul_subG ?quotientS ?subsetIl //.
- by rewrite -(normsP nUW1 w W1w) conjSg subsetIl.
- by rewrite -quotientGI // tiU1 ?trivg_quotient // !inE ntw.
-pose S4 := filter [predD S_ H0C & redM] S3.
-have sS43: {subset S4 <= S3} by apply: mem_subseq; apply: filter_subseq.
-(* This is step (9.11.3). *)
-have nsHM: H <| M by apply: gFnormal.
-have oS4: (q * u * size S4 + p.-1 * (q + u))%N = (p ^ q).-1.
- rewrite mulnAC {1}[q](index_sdprod defM) -[S4]filter_predI.
- rewrite (size_irr_subseq_seqInd _ (filter_subseq _ _)) //; last first.
- by move=> xi; rewrite mem_filter -!andbA negbK => /andP[].
- set Xn := finset _; pose sumH0C := \sum_(s in X_ H0C) 'chi_s 1%g ^+ 2.
- have /eqP: sumH0C = (q * size S1 * a ^ 2 + (#|Xn| + p.-1) * u ^ 2)%:R.
- rewrite [q](index_sdprod defM) natrD natrM natrX.
- rewrite (size_irr_subseq_seqInd _ (filter_subseq _ _)) //= -/S1.
- have sH0CC': {subset S_ H0C <= S_ H0C'}.
- by apply: seqIndS; rewrite Iirr_kerDS // genS ?setUS ?der_sub.
- rewrite [sumH0C](big_setID [set s | 'Ind 'chi_s \in S1]) /=; congr (_ + _).
- rewrite mulr_natl -[rhs in _ = rhs]sumr_const; apply: eq_big => s.
- by rewrite in_setI inE andb_idl // => /H0C_S1; rewrite mem_seqInd.
- rewrite 2!inE mem_filter andbCA /= cfInd1 // -(index_sdprod defM) natrM.
- by case/andP=> /eqP/(mulfI (neq0CG _))->.
- rewrite (eq_bigr (fun _ => u%:R ^+ 2)) => [|s]; last first.
- rewrite 2!inE eqS12 => /andP[S2's H0Cs]; congr (_ ^+ 2).
- have /S3qu/eqP: 'Ind 'chi_s \in S3.
- by rewrite mem_filter /= S2's sH0CC' ?mem_seqInd.
- by rewrite natrM cfInd1 // -(index_sdprod defM) => /(mulfI (neq0CG _)).
- rewrite sumr_const -mulr_natl natrM natrX -nb_mu; congr (_%:R * _).
- have [_ s_mu_H0C] := nb_redM_H0.
- rewrite (size_red_subseq_seqInd_typeP MtypeP _ s_mu_H0C); last first.
- - by apply/allP; apply: filter_all.
- - by rewrite filter_uniq ?seqInd_uniq.
- rewrite -/mu_ -[#|_|](cardsID Xn) (setIidPr _); last first.
- apply/subsetP=> s; rewrite inE in_setD mem_filter /= -!andbA -eqS12.
- rewrite mem_seqInd ?gFnormal // => /and4P[_ -> S1'xi _].
- by rewrite inE S1'xi.
- congr (_ + _)%N; apply: eq_card => i; rewrite inE -/mu_ 2!inE.
- rewrite -[seqInd M _]/(S_ H0C') mem_filter /= andbC 2!inE eqS12 -!andbA.
- rewrite -(mem_seqInd nsHUM) // -/(S_ H0C); set xi := 'Ind _.
- apply/idP/idP=> [/and3P[-> H0Cxi] | mu_xi].
- rewrite H0Cxi sH0CC' //= andbT negbK mem_filter unfold_in => ->.
- by rewrite (seqIndS _ H0Cxi) // Iirr_kerDS ?joing_subl.
- have [xi1u H0Cxi _] := IndHCmu _ mu_xi.
- rewrite H0Cxi -eqS12 mem_filter sH0CC' //= !andbT xi1u eqC_nat ne_qa_qu.
- by rewrite andbT negbK mem_filter in mu_xi *; case/andP: mu_xi.
- rewrite oS1 -mulnA divnK ?dvdn_mul // !mulnA -mulnDl mulnC natrM {}/sumH0C.
- rewrite /X_ -Iirr_kerDY joingC joingA (joing_idPl sH0H) /=.
- rewrite sum_Iirr_kerD_square ?genS ?setSU //; last first.
- by apply: normalS nsH0C_M; rewrite // -(sdprodWY defHU) genS ?setUSS.
- rewrite -Du (inj_eq (mulfI (neq0CG _))) -(prednK (indexg_gt0 _ _)).
- rewrite mulrSr addrK eqC_nat addnC mulnDl addnAC (mulnC q) -addnA -mulnDr.
- move/eqP <-; congr _.-1.
- have nH0HC: HC \subset 'N(H0) by rewrite join_subG nH0H.
- rewrite -(index_quotient_eq _ _ nH0HC) ?genS ?setSU //; last first.
- by rewrite setIC subIset ?joing_subl.
- rewrite quotientYidl // -(index_sdprod (dprodWsdC defHCbar)).
- by case: Ptype_Fcore_factor_facts.
-have /hasP[psi1 S1psi1 _]: has predT S1 by rewrite has_predT.
-pose gamma := 'Ind[M, H <*> U1] 1; pose alpha := gamma - psi1.
-(* This is step (9.11.4). *)
-pose nm_alpha : algC := a%:R + 1 + (q.-1 * a ^ 2)%:R / u%:R.
-have [Aalpha Nalpha]: alpha \in 'CF(M, 'A(M)) /\ '[alpha] = nm_alpha.
- have sHU1_HU: H <*> U1 \subset HU by rewrite -(sdprodWY defHU) genS ?setUS.
- have sHU1_M := subset_trans sHU1_HU sHUM.
- have sHU1_A1: H <*> U1 \subset 1%g |: 'A(M).
- pose pi := \pi(H); rewrite -subDset; apply/subsetP=> y /setD1P[nty HU1y].
- apply/bigcupP; rewrite notMtype1 /=; have sHMs := Fcore_sub_FTcore maxM.
- have defHU1: H ><| U1 = H <*> U1 := sdprod_subr defHU sU1U.
- have nsH_HU1: H <| H <*> U1 by have [] := sdprod_context defHU1.
- have [HUy [_ nH_HU1]] := (subsetP sHU1_HU y HU1y, normalP nsH_HU1).
- have hallH: pi.-Hall(H <*> U1) H.
- by rewrite Hall_pi // -(coprime_sdprod_Hall_l defHU1) (coprimegS sU1U).
- have hallU1: pi^'.-Hall(H <*> U1) U1.
- by rewrite -(compl_pHall _ hallH) sdprod_compl.
- have [pi'y | pi_y] := boolP (pi^'.-elt y); last first.
- exists y.`_pi; last by rewrite 3!inE nty HUy cent1C groupX ?cent1id.
- rewrite !inE (sameP eqP constt1P) pi_y (subsetP sHMs) //.
- by rewrite (mem_normal_Hall hallH) ?groupX ?p_elt_constt.
- have solHU1: solvable (H <*> U1) by rewrite (solvableS sHU1_M) ?mmax_sol.
- have [||z HU1z U1yz] := Hall_Jsub _ hallU1 _ pi'y; rewrite ?cycle_subG //.
- have /trivgPn[x /setIP[Hx cxyz] ntx]: 'C_H[y ^ z] != 1%g.
- apply: contraTneq (prime_gt1 p_pr) => regHy; rewrite -oH1 cardG_gt1 negbK.
- move: U1yz; rewrite -cycleJ subsetI sub_astabQ => /and3P[sYU nHY cH1Y].
- rewrite centsC in cH1Y; rewrite -(setIidPl cH1Y) -(setIidPl sH1H) -setIA.
- rewrite -coprime_quotient_cent ?(coprimegS sYU) // cent_cycle regHy.
- by rewrite quotient1 setIg1.
- exists (x ^ z^-1)%g; last by rewrite 3!inE nty HUy cent1J mem_conjgV cent1C.
- by rewrite 2!inE conjg_eq1 ntx (subsetP sHMs) // -mem_conjg nH_HU1.
- have{sHU1_A1} Aalpha: alpha \in 'CF(M, 'A(M)).
- have A'1: 1%g \notin 'A(M) by have /subsetD1P[] := FTsupp_sub M.
- rewrite -['A(M)](setU1K A'1) cfun_onD1 !cfunE subr_eq0 cfInd1 // cfun11.
- rewrite mulr1 -(Lagrange_index sHUM) // -(index_sdprod defM) -/q.
- rewrite -(index_sdprodr defHU) ?subsetIl // -/a eq_sym andbC.
- have:= S1psi1; rewrite mem_filter /= => /andP[-> _] /=.
- rewrite rpredB //.
- apply: cfun_onS (cfInd_on sHU1_M (cfun_onG _)).
- rewrite class_supportEr; apply/bigcupsP=> w Mw.
- by rewrite sub_conjg conjUg conjs1g (normsP (FTsupp_norm M)) ?groupV.
- have /seqIndP[s /setDP[_ ker'H ] ->] := H0C_S1 _ S1psi1.
- rewrite (prDade_Ind_irr_on (FT_prDade_hypF maxM MtypeP)) //.
- by rewrite inE in ker'H.
- have ->: '[alpha] = '[gamma] + 1.
- have /irrP[t Dt] := irrS1 _ S1psi1.
- rewrite cfnormBd; first by rewrite Dt cfnorm_irr.
- have /seqIndP[s /setDP[_ ker'H ] Dpsi1] := H0C_S1 _ S1psi1.
- apply: contraNeq ker'H; rewrite Dt /gamma -irr0 -irr_consttE => tHU1_0.
- rewrite inE -(sub_cfker_Ind_irr _ sHUM) ?gFnorm // -Dpsi1 Dt.
- rewrite -(sub_cfker_constt_Ind_irr tHU1_0) ?gFnorm ?joing_subl //.
- by rewrite irr0 cfker_cfun1 joing_subl.
- split=> //; rewrite /nm_alpha addrAC natrM mulrAC mulrC; congr (_ + 1).
- rewrite -{1}(mulnK a a_gt0) natf_div ?dvdn_mull // -mulrDr mulnn natrX.
- have /sdprod_isom[nH_UW1 isomMH]: H ><| (U <*> W1) = M.
- rewrite sdprodEY ?join_subG ?nHU ?(subset_trans sW1M) ?gFnorm //.
- by rewrite joingA (sdprodWY defHU) (sdprodWY defM).
- rewrite /= -(setIidPl sHHU) norm_joinEr // setIAC -setIA -group_modl //.
- by rewrite (setIC W1) tiHUW1 mulg1.
- have sU1_UW1: U1 \subset U <*> W1 by rewrite subIset ?joing_subl.
- rewrite /gamma -(cfMod_cfun1 _ H) cfIndMod ?joing_subl //.
- rewrite cfMod_iso //= quotientYidl ?(subset_trans sU1_UW1) //.
- rewrite -(restrm_quotientE _ sU1_UW1) -(cfIsom_cfun1 (restr_isom _ isomMH)).
- rewrite (cfIndIsom isomMH) // {nH_UW1 isomMH}cfIsom_iso.
- rewrite -(cfIndInd _ (joing_subl U W1)) // cfInd_cfun1 //= -/U1 -/a.
- rewrite linearZ cfnormZ normr_nat /=; congr (_ * _).
- have defUW1: U ><| W1 = U <*> W1.
- by rewrite sdprodEY // -(setIidPl sUHU) -setIA tiHUW1 setIg1.
- apply: canLR (mulKf (neq0CG _)) _; rewrite -(sdprod_card defUW1) natrM -/q.
- rewrite mulrAC mulrDr mulrCA -{1}(Lagrange sU1U) /= -/U1 -/a -(Lagrange sCU).
- rewrite -card_quotient // !natrM !mulfK ?neq0CiG ?neq0CG //.
- transitivity (\sum_(x in U <*> W1) \sum_(w1 in W1) \sum_(w2 in W1)
- (x ^ w1 \in U1 :&: U1 :^ w2)%g%:R : algC).
- - apply: eq_bigr => x _; rewrite (cfIndEsdprod _ _ defUW1) mulr_suml.
- apply: eq_bigr => w1 W1w1; rewrite rmorph_sum mulr_sumr.
- rewrite (reindex_inj invg_inj) (eq_bigl _ _ (groupV W1)) /=.
- rewrite (reindex_acts 'R _ (groupVr W1w1)) ?astabsR //=.
- apply: eq_bigr => w2 _; rewrite inE !cfuniE // rmorph_nat -natrM mulnb.
- by congr (_ && _)%:R; rewrite invMg invgK conjgM -mem_conjg.
- rewrite exchange_big /= mulr_natr -sumr_const; apply: eq_bigr => w1 W1w1.
- transitivity (\sum_(w in W1) #|U1 :&: U1 :^ w|%:R : algC).
- rewrite exchange_big /=; apply: eq_bigr => w W1w.
- rewrite (reindex_acts 'J _ (groupVr W1w1)) ?astabsJ ?normsG ?joing_subr //=.
- symmetry; rewrite big_mkcond -sumr_const /= big_mkcond /=.
- apply: eq_bigr => x _; rewrite conjgKV.
- by case: setIP => [[/(subsetP sU1_UW1)-> //] | _]; rewrite if_same.
- rewrite (big_setD1 1%g) //= conjsg1 setIid; congr (_ + _).
- rewrite [q](cardsD1 1%g) group1 /= mulr_natl -sumr_const.
- by apply: eq_bigr => w W1w; rewrite tiU1.
-(* This is step (9.11.5). *)
-have [gtS4alpha s4gt0]: (size S4)%:R > '[alpha] /\ (size S4 > 0)%N.
- suffices gtS4alpha: (size S4)%:R > '[alpha].
- by split=> //; rewrite -ltC_nat (ler_lt_trans (cfnorm_ge0 alpha)).
- rewrite Nalpha -(@ltr_pmul2r _ u%:R) ?ltr0n // mulrDl divfK ?neq0CG //.
- rewrite -(ltr_pmul2l (gt0CG W1)) -/q -mulrSr -!(natrM, natrD) ltC_nat.
- rewrite mulnA mulnAC -(ltn_add2r (p.-1 * (q + u))) oS4 {1}Dp addn1 -Da_p /=.
- apply: leq_ltn_trans (_ : q.+2 * a ^ 3 + q ^ 2 * a ^ 2 + 2 * q * a < _)%N.
- rewrite (addnC q) 2!mulnDr addnA (mulnAC _ a q) leq_add2r.
- rewrite mulnA addnAC -mulnDl mulnS -addnA -mulnDl addn2 mulnCA -mulnA.
- rewrite -[q in (_ <= _ + q * _)%N](prednK q_gt0) (mulSn q.-1) addnA.
- by rewrite leq_add2r mulnA -mulnDl addnC leq_mul.
- have q_gt2: (2 < q)%N.
- by rewrite ltn_neqAle prime_gt1 ?(contraTneq _ odd_q) => // <-.
- apply: leq_trans (_ : a.*2 ^ q + 'C(q, 2) * a.*2 ^ 2 + q * a.*2 <= _)%N.
- rewrite -mul2n (mulnCA q) (mulnA 2) ltn_add2r !expnMn -addSn leq_add //.
- apply: leq_ltn_trans (_ : q.-1.*2.+1 * a ^ q < _)%N.
- rewrite leq_mul ?leq_pexp2l //.
- by rewrite -(subnKC q_gt2) -addnn !addnS !ltnS leq_addl.
- rewrite ltn_pmul2r ?expn_gt0 ?a_gt0 // -doubleS.
- by rewrite -(prednK q_gt0) expnS mul2n leq_double ltn_expl.
- rewrite mulnA leq_pmul2r ?expn_gt0 ?a_gt0 // -(subnKC q_gt2).
- rewrite mulnCA mulnA addSn -mul_bin_diag bin1 -mulnA leq_pmul2l //.
- by rewrite mulnS -addSnnS leq_addr.
- rewrite Dp -Da_p mul2n (addnC a.*2) expnDn -(subnKC q_gt2) !addSn add0n.
- rewrite 3!big_ord_recl big_ord_recr /= !exp1n /= bin1 binn !mul1n /bump /=.
- by do 2!rewrite addnC leq_add2l; apply: leq_addl.
-have{cohS1} [tau1 cohS1] := cohS1; have [[Itau1 Ztau1] Dtau1] := cohS1.
-have sS30: cfConjC_subset S3 (S_ H0C').
- split=> [|chi|chi]; first by rewrite filter_uniq ?seqInd_uniq.
- by rewrite mem_filter => /andP[].
- rewrite !mem_filter /= -!eqS12 => /andP[S1'chi S_chi].
- rewrite cfAut_seqInd // (contra _ S1'chi) //.
- by have [_ _ ccS1] := sS10; move/ccS1; rewrite cfConjCK.
-have scohS3: subcoherent S3 tau rmR := subset_subcoherent scohS0 sS30.
-have [tau3 cohS3]: coherent S3 M^# tau.
- apply: uniform_degree_coherence scohS3 _.
- apply: all_pred1_constant (q * u)%:R _ _.
- by rewrite all_map; apply/allP=> chi /S3qu.
-have [IZtau3 Dtau3] := cohS3; have [Itau3 Ztau3] := IZtau3.
-have notA1: 1%g \notin 'A(M) by have /subsetD1P[] := FTsupp_sub M.
-have sS0_1A: {subset S_ H0C' <= 'CF(M, 1%g |: 'A(M))}.
- move=> _ /seqIndP[s /setDP[_ ker'H] ->]; rewrite inE in ker'H.
- by rewrite (prDade_Ind_irr_on (FT_prDade_hypF maxM MtypeP)).
-have sS0A: {subset 'Z[S_ H0C', M^#] <= 'Z[irr M, 'A(M)]}.
- move=> chi; rewrite (zcharD1_seqInd_Dade _ notA1) //.
- by apply: zchar_sub_irr; apply: seqInd_vcharW.
-have Zalpha: alpha \in 'Z[irr M].
- rewrite rpredB ?char_vchar ?cfInd_char ?rpred1 //.
- exact: seqInd_char (H0C_S1 _ S1psi1).
-have ZAalpha: alpha \in 'Z[irr M, 'A(M)] by rewrite zchar_split Zalpha.
-have [Itau Ztau]: {in 'Z[irr M, 'A(M)], isometry tau, to 'Z[irr G]}.
- apply: sub_iso_to (Dade_Zisometry _); last exact: zcharW.
- by apply: zchar_onS; apply: FTsupp_sub0.
-have oSgamma: {in S_ H0C', forall lam, '[gamma, lam] = 0}.
- move=> _ /seqIndP[s /setDP[_ ker'H ] ->].
- rewrite ['Ind _]cfun_sum_constt cfdot_sumr big1 // => t sMt.
- rewrite cfdotZr [gamma]cfun_sum_constt cfdot_suml big1 ?mulr0 // => t0 gMt0.
- rewrite cfdotZl cfdot_irr (negPf (contraNneq _ ker'H)) ?mulr0 // => Dt0.
- rewrite inE (sub_cfker_constt_Ind_irr sMt) ?gFnorm // -Dt0.
- rewrite /gamma -irr0 in gMt0.
- rewrite -(sub_cfker_constt_Ind_irr gMt0) ?gFnorm ?joing_subl //.
- by rewrite irr0 cfker_cfun1 joing_subl.
- by rewrite (subset_trans _ sHUM) // join_subG sHHU subIset ?sUHU.
-(* This is step (9.11.6). *)
-have [/eqP psi1qa Spsi1]: psi1 1%g == (q * a)%:R /\ psi1 \in S_ H0C'.
- by move: S1psi1; rewrite mem_filter => /andP[].
-have o_alpha_S3: orthogonal alpha^\tau (map tau3 S3).
- rewrite /orthogonal /= andbT all_map.
- apply: contraFT (ltr_geF gtS4alpha) => /allPn[lam0 S3lam0 /= alpha_lam0].
- set ca := '[_, _] in alpha_lam0; pose al0 := (-1) ^+ (ca < 0)%R *: alpha.
- have{alpha_lam0} al0_lam0: '[al0^\tau, tau3 lam0] > 0.
- have Zca: ca \in Cint by rewrite Cint_cfdot_vchar ?Ztau // Ztau3 ?mem_zchar.
- by rewrite linearZ cfdotZl (canLR (signrMK _) (CintEsign Zca)) normr_gt0.
- rewrite -Itau // -(cfnorm_sign (ca < 0)%R) -linearZ /= -/al0.
- have S4_dIirrK: {in map tau3 S4, cancel (dirr_dIirr id) (@dchi _ _)}.
- apply: dirr_dIirrPE => _ /mapP[lam S4lam ->].
- rewrite mem_filter -andbA negbK in S4lam.
- have [/irrP[i Dlam] _ S3lam] := and3P S4lam.
- by rewrite dirrE Itau3 ?Ztau3 ?mem_zchar //= Dlam cfnorm_irr.
- rewrite -(size_map tau3) -(size_map (dirr_dIirr id)).
- rewrite -(card_uniqP _); last first.
- rewrite !map_inj_in_uniq ?filter_uniq ?seqInd_uniq //.
- apply: sub_in2 (Zisometry_inj Itau3) => lam.
- by rewrite mem_filter => /andP[_ /mem_zchar->].
- exact: can_in_inj S4_dIirrK.
- apply: ler_trans (_ : #|dirr_constt al0^\tau|%:R <= _); last first.
- have Zal0: al0^\tau \in 'Z[irr G] by rewrite Ztau ?rpredZsign.
- rewrite cnorm_dconstt // -sumr_const ler_sum // => i al0_i.
- by rewrite sqr_Cint_ge1 ?gtr_eqF -?dirr_consttE // Cint_Cnat ?Cnat_dirr.
- rewrite leC_nat subset_leq_card //; apply/subsetP=> _ /mapP[nu S4nu ->].
- rewrite dirr_consttE S4_dIirrK //; congr (_ > 0): al0_lam0.
- rewrite {al0}linearZ !cfdotZl /=; congr (_ * _) => {ca}; apply/eqP.
- have{nu S4nu} [lam S4lam ->] := mapP S4nu.
- rewrite mem_filter in S4lam; have{S4lam} [_ S3lam] := andP S4lam.
- have Zdlam: lam0 - lam \in 'Z[S3, M^#].
- rewrite zcharD1E rpredB ?mem_zchar //= !cfunE subr_eq0.
- by have [/eqP->] := (S3qu _ S3lam, S3qu _ S3lam0).
- rewrite -subr_eq0 -cfdotBr -raddfB Dtau3 //.
- rewrite Itau // ?sS0A //; last exact: zchar_filter Zdlam.
- suffices{lam S3lam Zdlam} oS3a: {in S3, forall lam, '[alpha, lam] = 0}.
- by rewrite cfdotBr subr_eq0 !oS3a.
- move=> lam; rewrite mem_filter /= -eqS12 => /andP[S1'lam H0C'lam].
- by rewrite cfdotBl oSgamma // (seqInd_ortho _ Spsi1) ?(memPn S1'lam) // subr0.
-have{s4gt0 gtS4alpha} /hasP[lam1 S4lam1 _]: has predT S4 by rewrite has_predT.
-have [/irrP[l1 Dl1] S3lam1]: lam1 \in irr M /\ lam1 \in S3.
- by move: S4lam1; rewrite mem_filter -andbA negbK => /and3P[].
-have [S1'lam1 Slam1]: lam1 \notin S1 /\ lam1 \in S_ H0C'.
- by move: S3lam1; rewrite mem_filter eqS12 => /andP[].
-have S3lam1s: lam1^*%CF \in S3 by have [[_ _ ->]] := scohS3.
-have ZS3dlam1: lam1 - lam1^*%CF \in 'Z[S3, M^#].
- rewrite zcharD1E rpredB ?mem_zchar //.
- by have:= seqInd_sub_aut_zchar nsHUM conjC Slam1; rewrite zcharD1 => /andP[].
-have ZAdlam1: lam1 - lam1^*%CF \in 'Z[irr M, 'A(M)].
- rewrite sS0A // zchar_split rpredB ?mem_zchar ?cfAut_seqInd //.
- by rewrite (zchar_on ZS3dlam1).
-pose beta := lam1 - (u %/ a)%:R *: psi1.
-have ZAbeta: beta \in 'Z[irr M, 'A(M)].
- apply: sS0A; rewrite zcharD1E rpredB ?scaler_nat ?rpredMn ?mem_zchar //=.
- by rewrite !cfunE subr_eq0 psi1qa -natrM mulnCA divnK // S3qu.
-have [_ _ poSS _ _] := scohS0; have [_ oSS] := pairwise_orthogonalP poSS.
-have o1S1: orthonormal S1.
- rewrite orthonormalE filter_pairwise_orthogonal // andbT.
- by apply/allP=> _ /irrS1/irrP[t ->]; rewrite /= cfnorm_irr.
-have o1S4: orthonormal S4.
- rewrite orthonormalE !filter_pairwise_orthogonal // andbT.
- apply/allP=> nu; rewrite mem_filter /= -andbA negbK.
- by case/andP=> /irrP[t ->]; rewrite cfnorm_irr.
-have n1psi1: '[psi1] = 1 by have [_ -> //] := orthonormalP o1S1; rewrite eqxx.
-have n1lam1: '[lam1] = 1 by have [_ -> //] := orthonormalP o1S4; rewrite eqxx.
-have oS14tau: orthogonal (map tau1 S1) (map tau3 S4).
- apply/orthogonalP=> psi _ S1psi /mapP[lam /sS43 S3lam ->].
- apply: {psi lam S3lam}orthogonalP S1psi (map_f tau3 S3lam).
- apply: (coherent_ortho scohS0 sS10 cohS1 sS30 cohS3) => psi /=.
- by rewrite mem_filter !inE eqS12 => /andP[-> _].
-have [Gamma [S4_Gamma normGamma [b Dbeta]]]:
- exists Gamma, [/\ Gamma \in 'Z[map tau3 S4], '[Gamma] = 1
- & exists b : bool, beta^\tau
- = Gamma - (u %/ a)%:R *: tau1 psi1 + b%:R *: \sum_(psi <- S1) tau1 psi].
-- have [G S4G [G' [Dbeta _ oG'4]]] := orthogonal_split (map tau3 S4) beta^\tau.
- have [B S1B [Delta [dG' _ oD1]]] := orthogonal_split (map tau1 S1) G'.
- have sZS43: {subset 'Z[S4] <= 'Z[S3]} := zchar_subset sS43.
- have [Itau34 Ztau34] := sub_iso_to sZS43 sub_refl IZtau3.
- have Z_G: G \in 'Z[map tau3 S4].
- have [_ -> ->] := orthonormal_span (map_orthonormal Itau34 o1S4) S4G.
- rewrite big_seq rpred_sum // => xi S4xi; rewrite rpredZ_Cint ?mem_zchar //.
- rewrite -(addrK G' G) -Dbeta cfdotBl (orthoPl oG'4) // subr0.
- rewrite Cint_cfdot_vchar ?Ztau //.
- by have{xi S4xi} [xi S4xi ->] := mapP S4xi; rewrite Ztau34 ?mem_zchar.
- have oD4: orthogonal Delta (map tau3 S4).
- apply/orthoPl=> xi S4xi; rewrite -(addKr B Delta) addrC -dG' cfdotBl.
- by rewrite (orthoPl oG'4) // (span_orthogonal oS14tau) ?subrr // memv_span.
- have [_ -> dB] := orthonormal_span (map_orthonormal Itau1 o1S1) S1B.
- pose b := (u %/ a)%:R + '[B, tau1 psi1].
- have betaS1_B: {in S1, forall psi, '[beta^\tau, tau1 psi] = '[B, tau1 psi]}.
- move=> psi S1psi; rewrite Dbeta dG' !cfdotDl (orthoPl oD1) ?map_f // addr0.
- rewrite cfdotC (span_orthogonal oS14tau) ?rmorph0 ?add0r //.
- by rewrite memv_span ?map_f.
- have Zb: b \in Cint.
- rewrite rpredD ?rpred_nat // -betaS1_B // Cint_cfdot_vchar ?Ztau //.
- by rewrite Ztau1 ?mem_zchar.
- have{dB} dB: B = - (u %/ a)%:R *: tau1 psi1 + b *: \sum_(psi <- S1) tau1 psi.
- rewrite dB big_map !(big_rem _ S1psi1) /= scalerDr addrA -scalerDl addKr.
- rewrite scaler_sumr; congr (_ + _); apply: eq_big_seq => psi.
- rewrite mem_rem_uniq ?filter_uniq ?seqInd_uniq // => /andP[/= psi_1' S1psi].
- apply/esym/eqP; rewrite -subr_eq0 -scalerBl -addrA -!betaS1_B // -cfdotBr.
- have [/eqP psi_qa Spsi]: psi 1%g == (q * a)%:R /\ psi \in S_ H0C'.
- by move: S1psi; rewrite mem_filter => /andP[].
- have Z1dpsi: psi1 - psi \in 'Z[S1, M^#].
- by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE psi1qa psi_qa subrr.
- rewrite -raddfB Dtau1 // Itau //; last first.
- by rewrite sS0A // zchar_split rpredB ?mem_zchar ?(zchar_on Z1dpsi).
- rewrite cfdotC cfdotBr cfdotZr !cfdotBl 2?oSS ?(memPn S1'lam1) // subrr.
- by rewrite add0r n1psi1 oSS // subr0 mulr1 rmorphN conjCK subrr scale0r.
- have Gge1: 1 <= '[G] ?= iff ('[G] == 1).
- rewrite eq_sym; apply: lerif_eq.
- have N_G: '[G] \in Cnat.
- apply: Cnat_cfnorm_vchar; apply: zchar_sub_irr Z_G => _ /mapP[nu S4nu ->].
- by rewrite Ztau34 ?mem_zchar.
- rewrite -(truncCK N_G) ler1n lt0n -eqC_nat truncCK {N_G}// cfnorm_eq0.
- have: '[beta^\tau, (lam1 - lam1^*%CF)^\tau] != 0.
- rewrite Itau // cfdotBl cfdotZl !cfdotBr n1lam1.
- rewrite (seqInd_conjC_ortho _ _ _ Slam1) ?mFT_odd // subr0.
- rewrite !oSS ?cfAut_seqInd -?(inv_eq (@cfConjCK _ _)) ?(memPn S1'lam1) //.
- by rewrite !(subr0, mulr0) oner_eq0.
- by have [_ _ ->] := sS10.
- rewrite Dbeta -Dtau3 //; apply: contraNneq => ->.
- rewrite add0r raddfB cfdotBr !(orthoPl oG'4) ?map_f ?subr0 //.
- move: S4lam1; rewrite ![_ \in S4]mem_filter /= !negbK /= cfAut_irr S3lam1s.
- by case/andP=> /andP[-> /cfAut_seqInd->].
- have ubG: '[G] + (b ^+ 2 - b) * (u %/ a).*2%:R + '[Delta] = 1.
- apply: (addrI ((u %/ a) ^ 2)%:R); transitivity '[beta^\tau].
- rewrite -!addrA addrCA Dbeta cfnormDd; last first.
- by rewrite cfdotC (span_orthogonal oG'4) ?rmorph0 // memv_span ?inE.
- congr (_ + _); rewrite !addrA dG' cfnormDd; last first.
- by rewrite cfdotC (span_orthogonal oD1) ?rmorph0 // memv_span ?inE.
- congr (_ + _); rewrite dB scaleNr [- _ + _]addrC cfnormB !cfnormZ.
- rewrite normr_nat Cint_normK // scaler_sumr cfdotZr rmorph_nat.
- rewrite cfnorm_map_orthonormal // cfproj_sum_orthonormal //.
- rewrite Itau1 ?mem_zchar // n1psi1 mulr1 rmorphM rmorph_nat conj_Cint //.
- rewrite -mulr2n oS1ua -muln_divA // mul2n -addrA addrCA -natrX mulrBl.
- by congr (_ + (_ - _)); rewrite -mulrnAl -mulrnA muln2 mulrC.
- rewrite Itau // cfnormBd; last first.
- by rewrite cfdotZr oSS ?mulr0 // (memPnC S1'lam1).
- by rewrite cfnormZ normr_nat n1psi1 n1lam1 mulr1 addrC -natrX.
- have ubDelta: '[G] <= '[G] + '[Delta] ?= iff (Delta == 0).
- rewrite addrC -lerif_subLR subrr -cfnorm_eq0 eq_sym.
- by apply: lerif_eq; apply: cfnorm_ge0.
- have{ubG} ubDeltaG: '[G] + '[Delta] <= 1 ?= iff pred2 0 1 b.
- rewrite -{1}ubG addrAC [_ + _ + _] addrC -lerif_subLR subrr /=.
- set n := _%:R; rewrite mulrC -{1}(mulr0 n) mono_lerif; last first.
- by apply: ler_pmul2l; rewrite ltr0n double_gt0 divn_gt0 // dvdn_leq.
- rewrite /= -(subr_eq0 b 1) -mulf_eq0 mulrBr mulr1 eq_sym.
- apply: lerif_eq; rewrite subr_ge0.
- have [-> | nz_b] := eqVneq b 0; first by rewrite expr2 mul0r.
- rewrite (ler_trans (real_ler_norm _)) ?Creal_Cint // -[`|b|]mulr1.
- by rewrite -Cint_normK // ler_pmul2l ?normr_gt0 // norm_Cint_ge1.
- have [_ /esym] := lerif_trans Gge1 (lerif_trans ubDelta ubDeltaG).
- rewrite eqxx => /and3P[/eqP normG1 /eqP Delta0 /pred2P b01].
- exists G; split=> //; exists (b != 0).
- rewrite Dbeta dG' Delta0 addr0 dB scaleNr addrA; congr (_ + _ *: _).
- by case: b01 => ->; rewrite ?eqxx ?oner_eq0.
-(* Final step (9.11.8). *)
-have alpha_beta: '[alpha^\tau, beta^\tau] = (u %/ a)%:R.
- rewrite Itau // cfdotBr cfdotZr rmorph_nat !cfdotBl !oSgamma // !sub0r.
- by rewrite n1psi1 mulrN opprK mulr1 addrC oSS ?subr0 // (memPn S1'lam1).
-have [X S1X [Delta [Dalpha _ oD1]]]:= orthogonal_split (map tau1 S1) alpha^\tau.
-pose x := 1 + '[X, tau1 psi1].
-have alphaS1_X: {in S1, forall psi, '[alpha^\tau, tau1 psi] = '[X, tau1 psi]}.
- by move=> psi S1psi; rewrite Dalpha cfdotDl (orthoPl oD1) ?map_f // addr0.
-have Zx: x \in Cint.
- rewrite rpredD ?rpred1 // -alphaS1_X // Cint_cfdot_vchar ?Ztau //.
- by rewrite Ztau1 ?mem_zchar.
-have{alphaS1_X S1X} defX: X = x *: (\sum_(psi <- S1) tau1 psi) - tau1 psi1.
- have [_ -> ->] := orthonormal_span (map_orthonormal Itau1 o1S1) S1X.
- rewrite addrC -scaleN1r big_map !(big_rem _ S1psi1) /= scalerDr addrA.
- rewrite -scalerDl addKr scaler_sumr; congr (_ + _); apply: eq_big_seq => psi.
- rewrite mem_rem_uniq ?filter_uniq ?seqInd_uniq // => /andP[/= psi_1' S1psi].
- apply/esym/eqP; rewrite -subr_eq0 -scalerBl -addrA -!alphaS1_X // -cfdotBr.
- have [/eqP psi_qa Spsi]: psi 1%g == (q * a)%:R /\ psi \in S_ H0C'.
- by move: S1psi; rewrite mem_filter => /andP[].
- have Z1dpsi: psi1 - psi \in 'Z[S1, M^#].
- by rewrite zcharD1E rpredB ?mem_zchar //= !cfunE psi1qa psi_qa subrr.
- rewrite -raddfB Dtau1 // Itau //; last first.
- by rewrite sS0A // zchar_split rpredB ?mem_zchar ?(zchar_on Z1dpsi).
- rewrite cfdotBr !cfdotBl !oSgamma // n1psi1 cfdotC oSS // rmorph0.
- by rewrite !subr0 add0r subrr scale0r.
-have{x Zx X defX Delta Dalpha oD1} b_mod_ua: (b == 0 %[mod u %/ a])%C.
- rewrite -oppr0 -eqCmodN (eqCmod_trans _ (eqCmodm0 _)) // {2}nCdivE.
- rewrite -alpha_beta Dbeta -addrA cfdotDr.
- rewrite (span_orthogonal o_alpha_S3) ?add0r; first 1 last.
- - by rewrite memv_span ?inE.
- - apply: subvP (zchar_span S4_Gamma); apply: sub_span; apply: mem_subseq.
- by rewrite map_subseq ?filter_subseq.
- rewrite Dalpha addrC cfdotDl (span_orthogonal oD1); first 1 last.
- - by rewrite memv_span ?inE.
- - rewrite addrC rpredB ?rpredZ //; last by rewrite memv_span ?map_f.
- by rewrite big_seq rpred_sum // => psi S1psi; rewrite memv_span ?map_f.
- rewrite add0r addrC defX cfdotBr cfdotBl cfdotZl cfdotZr !scaler_sumr.
- rewrite cfdotZr !rmorph_nat cfdotBl Itau1 ?mem_zchar // n1psi1.
- rewrite cfnorm_map_orthonormal // cfdotC !cfproj_sum_orthonormal //.
- rewrite rmorph_nat oS1ua -muln_divA // natrM !mulrA addrC mulrC addrA.
- rewrite -mulNr -mulrDl eqCmod_sym eqCmod_addl_mul // addrC !rpredB ?rpred1 //.
- by rewrite !rpredM ?rpred_nat.
-have{b_mod_ua alpha_beta} b0: b = 0%N :> nat.
- have:= b_mod_ua; rewrite /eqCmod subr0 dvdC_nat => /eqnP.
- rewrite modn_small // (leq_ltn_trans (leq_b1 b)) // ltn_divRL // mul1n.
- by rewrite ltn_neqAle -(eqn_pmul2l q_gt0) eq_sym ne_qa_qu dvdn_leq.
-exists lam1 => //; suffices: coherent (lam1 :: lam1^* :: S1)%CF M^# tau.
- by apply: subset_coherent => phi; rewrite !inE eqS12.
-move: Dbeta; rewrite b0 scale0r addr0.
-apply: (extend_coherent_with scohS0 sS10 cohS1); first by [].
-rewrite rpred_nat psi1qa -natrM mulnCA (eqP (S3qu _ S3lam1)) divnK //.
-rewrite cfdotC (span_orthogonal oS14tau) ?(zchar_span S4_Gamma) ?conjC0 //.
-by rewrite rpredZ ?memv_span ?map_f.
-Qed.
-
-End Nine.
diff --git a/mathcomp/odd_order/README b/mathcomp/odd_order/README
deleted file mode 120000
index e4e30e8..0000000
--- a/mathcomp/odd_order/README
+++ /dev/null
@@ -1 +0,0 @@
-../../etc/README \ No newline at end of file
diff --git a/mathcomp/odd_order/descr b/mathcomp/odd_order/descr
deleted file mode 100644
index ee393a9..0000000
--- a/mathcomp/odd_order/descr
+++ /dev/null
@@ -1,6 +0,0 @@
-Odd Order Theorem
-
-This library contains the complete formal proof of the Odd Order
-Theorem (aka Feit Thompson Theorem).
-The file stripped_odd_order_theorem.v contains a proof of a self
-contained statement of the odd order. \ No newline at end of file
diff --git a/mathcomp/odd_order/opam b/mathcomp/odd_order/opam
deleted file mode 100644
index f745e77..0000000
--- a/mathcomp/odd_order/opam
+++ /dev/null
@@ -1,16 +0,0 @@
-opam-version: "1.2"
-name: "coq-mathcomp-odd_order"
-version: "dev"
-maintainer: "Mathematical Components <mathcomp-dev@sympa.inria.fr>"
-
-homepage: "http://math-comp.github.io/math-comp/"
-bug-reports: "Mathematical Components <mathcomp-dev@sympa.inria.fr>"
-license: "CeCILL-B"
-
-build: [ make "-j" "%{jobs}%" ]
-install: [ make "install" ]
-remove: [ "sh" "-c" "rm -rf '%{lib}%/coq/user-contrib/mathcomp/odd_order'" ]
-depends: [ "coq-mathcomp-character" { = "dev" } ]
-
-tags: [ "keyword:Feit Thompson theorem" "keyword:small scale reflection" "keyword:mathematical components" "keyword:odd order theorem" ]
-authors: [ "Jeremy Avigad <>" "Andrea Asperti <>" "Stephane Le Roux <>" "Yves Bertot <>" "Laurence Rideau <>" "Enrico Tassi <>" "Ioana Pasca <>" "Georges Gonthier <>" "Sidi Ould Biha <>" "Cyril Cohen <>" "Francois Garillot <>" "Alexey Solovyev <>" "Russell O'Connor <>" "Laurent Théry <>" "Assia Mahboubi <>" ]
diff --git a/mathcomp/odd_order/stripped_odd_order_theorem.v b/mathcomp/odd_order/stripped_odd_order_theorem.v
deleted file mode 100644
index 19b9d0b..0000000
--- a/mathcomp/odd_order/stripped_odd_order_theorem.v
+++ /dev/null
@@ -1,209 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require ssrbool ssrfun eqtype ssrnat fintype finset fingroup.
-From mathcomp
-Require morphism quotient action gfunctor gproduct commutator gseries nilpotent.
-From mathcomp
-Require PFsection14.
-
-(******************************************************************************)
-(* This file contains a minimal, self-contained reformulation of the Odd *)
-(* Order theorem, using only the bare Coq logic, and avoiding any use of *)
-(* extra-logical features such as notation, coercion or implicit arguments. *)
-(* This stripped theorem would hardly be usable, however; it just provides *)
-(* evidence for the sceptics. *)
-(******************************************************************************)
-
-(* Equivalence and equality *)
-
-Inductive equivalent P Q := Equivalent (P_to_Q : P -> Q) (Q_to_P : Q -> P).
-
-Inductive equal T (x : T) : T -> Type := Equal : equal T x x.
-
-(* Arithmetic *)
-
-Inductive natural := Zero | Add_1_to (n : natural).
-
-Fixpoint add (m n : natural) : natural :=
- match m with Zero => n | Add_1_to m_minus_1 => add m_minus_1 (Add_1_to n) end.
-
-Definition double (n : natural) : natural := add n n.
-
-Inductive odd (n : natural) :=
- Odd (half : natural)
- (n_odd : equal natural n (Add_1_to (double half))).
-
-Inductive less_than (m n : natural) :=
- LessThan (diff : natural)
- (m_lt_n : equal natural n (Add_1_to (add m diff))).
-
-(* Finite subsets *)
-
-Definition injective_in T R (D : T -> Type) (f : T -> R) :=
- forall x y, D x -> D y -> equal R (f x) (f y) -> equal T x y.
-
-Inductive in_image T R (D : T -> Type) (f : T -> R) (a : R) :=
- InImage (x : T) (x_in_D : D x) (a_is_fx : equal R a (f x)).
-
-Inductive finite_of_order T (D : T -> Type) (n : natural) :=
- FiniteOfOrder (rank : T -> natural)
- (rank_injective : injective_in T natural D rank)
- (rank_onto :
- forall i, equivalent (less_than i n) (in_image T natural D rank i)).
-
-(* Elementary group theory *)
-
-Inductive group_axioms T (mul : T -> T -> T) (one : T) (inv : T -> T) :=
- GroupAxioms
- (associativity : forall x y z, equal T (mul x (mul y z)) (mul (mul x y) z))
- (left_identity : forall x, equal T (mul one x) x)
- (left_inverse : forall x, equal T (mul (inv x) x) one).
-
-Inductive group T mul one inv (G : T -> Type) :=
- Group
- (G_closed_under_mul : forall x y, G x -> G y -> G (mul x y))
- (one_in_G : G one)
- (G_closed_under_inv : forall x, G x -> G (inv x)).
-
-Inductive subgroup T mul one inv (H G : T -> Type) :=
- Subgroup
- (H_group : group T mul one inv H)
- (H_subset_G : forall x, H x -> G x).
-
-Inductive normal_subgroup T mul one inv (H G : T -> Type) :=
- NormalSubgroup
- (H_subgroup_G : subgroup T mul one inv H G)
- (H_is_G_invariant : forall x y, H x -> G y -> H (mul (inv y) (mul x y))).
-
-Inductive commute_mod T mul (x y : T) (H : T -> Type) :=
- CommuteMod (z : T)
- (z_in_H : H z)
- (xy_eq_zyx : equal T (mul x y) (mul z (mul y x))).
-
-Inductive abelian_factor T mul one inv (G H : T -> Type) :=
- AbelianFactor
- (G_group : group T mul one inv G)
- (H_normal_in_G : normal_subgroup T mul one inv H G)
- (G_on_H_abelian : forall x y, G x -> G y -> commute_mod T mul x y H).
-
-Inductive solvable_group T mul one inv (G : T -> Type) :=
-| TrivialGroupSolvable
- (G_trivial : forall x, equivalent (G x) (equal T x one))
-| AbelianExtensionSolvable (H : T -> Type)
- (H_solvable : solvable_group T mul one inv H)
- (G_on_H_abelian : abelian_factor T mul one inv G H).
-
-(* begin hide *)
-Module InternalSkepticOddOrderProof.
-
-Local Notation Aeq := (equal _).
-Local Notation Aadd := add.
-Local Notation Adouble := double.
-Local Notation Aodd := odd.
-Local Notation Alt := less_than.
-Local Notation Agroup := group.
-Local Notation Asubgroup := subgroup.
-Local Notation Anormal := normal_subgroup.
-Local Notation Aabel_quo := abelian_factor.
-Local Notation Asol := solvable_group.
-
-Import Prelude ssreflect ssrbool ssrfun eqtype ssrnat fintype finset fingroup.
-Import morphism quotient action gfunctor gproduct commutator gseries nilpotent.
-Import GroupScope.
-
-Lemma main T mul one inv G nn :
- group_axioms T mul one inv -> Agroup T mul one inv G ->
- finite_of_order T G nn -> Aodd nn ->
- Asol T mul one inv G.
-Proof.
-pose fix natN n := if n is n1.+1 then Add_1_to (natN n1) else Zero.
-pose fix Nnat mm := if mm is Add_1_to mm1 then (Nnat mm1).+1 else 0.
-have natN_K: cancel natN Nnat by elim=> //= n ->.
-have NnatK: cancel Nnat natN by elim=> //= mm ->.
-have AaddE nn1 nn2: Nnat (Aadd nn1 nn2) = Nnat nn1 + Nnat nn2.
- by elim: nn1 nn2 => //= nn1 IHnn nn2; rewrite IHnn addnS.
-have AltE m n: Alt (natN m) (natN n) -> m < n.
- by rewrite -{2}[n]natN_K => [[dd ->]]; rewrite /= ltnS AaddE natN_K leq_addr.
-have AltI m n: m < n -> Alt (natN m) (natN n).
- move/subnKC <-; exists (natN (n - m.+1)).
- by rewrite -[Add_1_to _]NnatK /= AaddE !natN_K.
-have AoddE n: Aodd (natN n) -> odd n.
- by rewrite -{2}[n]natN_K => [[hh ->]]; rewrite /= AaddE addnn odd_double.
-case=> mulA mul1T mulVT [mulG oneG invG] [rG inj_rG im_rG] odd_nn.
-pose n := Nnat nn; have{odd_nn} odd_n: odd n by rewrite AoddE ?NnatK.
-have{rG inj_rG im_rG} [gT o_gT [f [g Gf [fK gK]] [fM f1 fV]]]:
- {gT : finGroupType & #|gT| = n & {f : gT -> T
- & {g : _ & forall a, G (f a) & cancel f g /\ forall x, G x -> f (g x) = x}
- & [/\ {morph f : a b / a * b >-> mul a b}, f 1 = one
- & {morph f : a / a^-1 >-> inv a}]}}.
-- pose gT := 'I_n.-1.+1; pose g x : gT := inord (Nnat (rG x)).
- have ub_rG x: G x -> Nnat (rG x) < n.
- move=> Gx; rewrite AltE ?NnatK //.
- by have [_] := im_rG (rG x); apply; exists x.
- have Dn: n.-1.+1 = n := ltn_predK (ub_rG one oneG).
- have fP a: {x : T & G x * (g x = a)}%type.
- have a_lt_n: Alt (natN a) nn by rewrite -(canLR NnatK Dn); apply: AltI.
- have [/(_ a_lt_n)[x Gx rGx] _] := im_rG (natN a).
- by exists x; split; rewrite // /g -rGx natN_K inord_val.
- pose f a := tag (fP a); have Gf a: G (f a) by rewrite /f; case: (fP) => x [].
- have fK: cancel f g by rewrite /f => a; case: (fP a) => x [].
- have Ng x & G x: natN (g x) = rG x by rewrite inordK ?Dn ?ub_rG ?NnatK.
- have{Ng} gK x: G x -> f (g x) = x.
- by move=> Gx; rewrite (inj_rG (f (g x)) x) // -!Ng ?fK.
- pose m a b := g (mul (f a) (f b)).
- pose o := g one; pose v a := g (inv (f a)).
- have fM: {morph f: a b / m a b >-> mul a b} by move=> a b; apply/gK/mulG.
- have f1: f o = one by apply: gK.
- have fV: {morph f: a / v a >-> inv a} by move=> a; apply/gK/invG.
- have mA: associative m by move=> a b c; apply: canLR fK _; rewrite !fM mulA.
- have m1: left_id o m by move=> a; apply: canLR fK _; rewrite f1 mul1T.
- have mV: left_inverse o v m.
- by move=> a; apply: canLR fK _; rewrite fV f1 mulVT.
- pose bT := BaseFinGroupType _ (FinGroup.Mixin mA m1 mV).
- exists (@FinGroupType bT mV); first by rewrite card_ord Dn.
- by exists f; first exists g.
-pose im (H : {group gT}) x := (G x * (g x \in H))%type.
-have imG H : Agroup T mul one inv (im H).
- split=> [x y [Gx Hx] [Gy Hy] | | x [Gx Hx]]; first 1 last.
- - by split; rewrite // -(canRL fK f1).
- - by split; [auto | rewrite -(gK x Gx) -fV fK groupV].
- by split; [auto | rewrite -(gK x Gx) -(gK y Gy) -fM fK groupM].
-pose G0 := [set: gT]%G.
-have sGG0 x: G x -> im G0 x by split; rewrite ?inE.
-have mulVV1 x: mul (inv (inv x)) one = x by rewrite -(mulVT x) mulA mulVT mul1T.
-have{mulVV1} mulT1 x: mul x one = x by rewrite -[x]mulVV1 -mulA mul1T.
-pose comm x y := mul (mul x y) (inv (mul y x)).
-suffices solH: Asol T mul one inv (im G0).
- right with (im G0) => //; split=> // [|x y Gx Gy].
- by split=> // [|x y [Gx _] Gy]; [split=> // x [] | apply: sGG0; auto].
- by exists (comm x y); [rewrite /comm; auto | rewrite -mulA mulVT -mulA mulT1].
-have solG0: solvable G0 by rewrite PFsection14.Feit_Thompson ?cardsT ?o_gT.
-elim: _.+1 {-2}G0 (ltnSn #|G0|) => // m IHm H; rewrite ltnS => leHm.
-have [-> | ntH] := eqVneq H 1%G.
- left=> // x; split=> [[Gx /set1P] | ->].
- by rewrite -f1 => <-; rewrite gK.
- by split; rewrite // -f1 fK.
-have ltH'H: H^`(1) \proper H := sol_der1_proper solG0 (subsetT H) ntH.
-right with (im H^`(1)%G); first exact: IHm (leq_trans (proper_card _) leHm).
-have /andP[/subsetP sH'H /subsetP nH'H]: H^`(1) <| H := der_normal 1 H.
-split=> // [|x y [Gx Hx] [Gy Hy]].
- split=> // [|x y [Gx H'x] [Gy Hy]]; first by split=> // x [Gx /sH'H].
- split; first by [auto]; rewrite -(gK x Gx) -(gK y Gy) -!(fM, fV) !fK.
- by rewrite memJ_norm ?nH'H.
-exists (comm x y); last by rewrite -mulA mulVT -mulA mulT1.
-rewrite /comm; split; first by [auto]; rewrite -(gK x Gx) -(gK y Gy).
-by rewrite -!(fM, fV) fK -[g x * g y]invgK !invMg -mulgA mem_commg ?groupV.
-Qed.
-
-End InternalSkepticOddOrderProof.
-(* end hide *)
-
-(* The Odd Order theorem *)
-
-Theorem stripped_Odd_Order T mul one inv (G : T -> Type) (n : natural) :
- group_axioms T mul one inv -> group T mul one inv G ->
- finite_of_order T G n -> odd n ->
- solvable_group T mul one inv G.
-Proof. exact (InternalSkepticOddOrderProof.main T mul one inv G n). Qed.
diff --git a/mathcomp/odd_order/wielandt_fixpoint.v b/mathcomp/odd_order/wielandt_fixpoint.v
deleted file mode 100644
index e5d8ad4..0000000
--- a/mathcomp/odd_order/wielandt_fixpoint.v
+++ /dev/null
@@ -1,659 +0,0 @@
-(* (c) Copyright 2006-2016 Microsoft Corporation and Inria. *)
-(* Distributed under the terms of CeCILL-B. *)
-Require Import mathcomp.ssreflect.ssreflect.
-From mathcomp
-Require Import ssrbool ssrfun eqtype ssrnat seq path div.
-From mathcomp
-Require Import fintype bigop prime binomial finset ssralg fingroup finalg.
-From mathcomp
-Require Import morphism perm automorphism quotient action gfunctor commutator.
-From mathcomp
-Require Import gproduct zmodp cyclic center pgroup gseries nilpotent sylow.
-From mathcomp
-Require Import finalg finmodule abelian frobenius maximal extremal hall.
-From mathcomp
-Require Import matrix mxalgebra mxrepresentation mxabelem BGsection1.
-
-(******************************************************************************)
-(* This file provides the proof of the Wielandt fixpoint order formula, *)
-(* which is a prerequisite for B & G, Section 3 and Peterfalvi, Section 9. *)
-(******************************************************************************)
-
-Set Implicit Arguments.
-Unset Strict Implicit.
-Unset Printing Implicit Defensive.
-
-Local Open Scope ring_scope.
-Import GroupScope GRing.Theory.
-Import FinRing.Theory.
-
-Implicit Types (gT wT : finGroupType) (m n p q : nat).
-
-Lemma coprime_act_abelian_pgroup_structure gT p (A X : {group gT}) :
- abelian A -> p.-group A -> p^'.-group X -> X \subset 'N(A) ->
- exists2 s : {set {group gT}},
- \big[dprod/1]_(B in s) B = A
- & {in s, forall B : {group gT},
- [/\ homocyclic B, X \subset 'N(B)
- & acts_irreducibly X (B / 'Phi(B)) 'Q]}.
-Proof.
-move: {2}_.+1 (ltnSn #|A|) => m.
-elim: m => // m IHm in gT A X *; rewrite ltnS => leAm cAA pA p'X nAX.
-have [n1 eA]: {n | exponent A = p ^ n}%N by apply p_natP; rewrite pnat_exponent.
-have [-> | ntA] := eqsVneq A 1.
- by exists set0 => [|B]; rewrite ?big_set0 ?inE.
-have [p_pr _ _] := pgroup_pdiv pA ntA; have p_gt1 := prime_gt1 p_pr.
-case: n1 => [|n] in eA; first by rewrite trivg_exponent eA in ntA.
-have nA1X: X \subset 'N('Ohm_1(A)) := gFnorm_trans _ nAX.
-have sAnA1: 'Mho^n(A) \subset 'Ohm_1(A).
- rewrite (MhoE n pA) (OhmE 1 pA) genS //.
- apply/subsetP=> _ /imsetP[x Ax ->]; rewrite !inE groupX //.
- by rewrite -expgM -expnSr -eA -order_dvdn dvdn_exponent.
-have nAnX: X \subset 'N('Mho^n(A)) := gFnorm_trans _ nAX.
-have [B minB sBAn]: {B : {group gT} | minnormal B X & B \subset 'Mho^n(A)}.
- apply: mingroup_exists; rewrite nAnX andbT; apply/trivgPn.
- have [x Ax ox] := exponent_witness (abelian_nil cAA).
- exists (x ^+ (p ^ n)); first by rewrite Mho_p_elt ?(mem_p_elt pA).
- by rewrite -order_dvdn -ox eA dvdn_Pexp2l ?ltnn.
-have abelA1: p.-abelem 'Ohm_1(A) by rewrite Ohm1_abelem.
-have sBA1: B \subset 'Ohm_1(A) := subset_trans sBAn sAnA1.
-have{minB} [/andP[ntB nBX] minB] := mingroupP minB.
-have{nBX sBA1} [U defA1 nUX] := Maschke_abelem abelA1 p'X sBA1 nA1X nBX.
-have [_ mulBU _ tiBU] := dprodP defA1; have{mulBU} [_ sUA1] := mulG_sub mulBU.
-have sUA: U \subset A := subset_trans sUA1 (Ohm_sub 1 _).
-have [U1 | {defA1 minB}ntU] := eqsVneq U 1.
- rewrite U1 dprodg1 /= in defA1.
- have homoA: homocyclic A.
- apply/(Ohm1_homocyclicP pA cAA); rewrite eA pfactorK //=.
- by apply/eqP; rewrite eqEsubset sAnA1 -defA1 sBAn.
- exists [set A]; rewrite ?big_set1 // => G; move/set1P->; split=> //.
- have OhmMho: forall k, 'Ohm_k(A) = 'Mho^(n.+1 - k)(A).
- by move=> k; rewrite (homocyclic_Ohm_Mho k pA) // eA pfactorK.
- have fM: {in A &, {morph (fun x => x ^+ (p ^ n)) : x y / x * y >-> x * y}}.
- by move=> x y Ax Ay /=; rewrite expgMn // /commute -(centsP cAA).
- pose f := Morphism fM; have ker_f: 'ker f = 'Phi(A).
- apply/setP=> z; rewrite (Phi_Mho pA cAA) -(subSnn n) -OhmMho.
- by rewrite (OhmEabelian pA) ?(abelianS (Ohm_sub n A)) ?inE.
- have [g injg def_g] := first_isom f; rewrite /= {}ker_f in g injg def_g.
- have{f def_g} def_g: forall H, gval H \subset A -> g @* (H / _) = 'Mho^n(H).
- move=> H sHA; rewrite def_g morphimEsub //.
- by rewrite (MhoEabelian n (pgroupS sHA pA) (abelianS sHA cAA)).
- have im_g: g @* (A / 'Phi(A)) = B by rewrite def_g // defA1 OhmMho subn1.
- have defAb: A / 'Phi(A) = g @*^-1 B by rewrite -im_g injmK.
- have nsPhiA: 'Phi(A) <| A := Phi_normal A.
- have nPhiX: X \subset 'N('Phi(A)) := gFnorm_trans _ nAX.
- rewrite defAb; apply/mingroupP; split=> [|Hb].
- by rewrite -(morphim_injm_eq1 injg) ?morphpreK /= -?defAb ?im_g ?ntB ?actsQ.
- case/andP=> ntHb actsXHb /= sgHbB; have [sHbA _] := subsetIP sgHbB.
- rewrite -sub_morphim_pre // in sgHbB; rewrite -(minB _ _ sgHbB) ?injmK //.
- rewrite morphim_injm_eq1 // {}ntHb {actsXHb}(subset_trans actsXHb) //=.
- have{sHbA} [H defHb sPhiH sHA] := inv_quotientS nsPhiA sHbA.
- rewrite defHb def_g // gFnorm_trans //=.
- by rewrite astabsQ ?subsetIr ?(normalS sPhiH sHA).
-have nsUA: U <| A by rewrite -sub_abelian_normal.
-have nUA: A \subset 'N(U) by case/andP: nsUA.
-have Au_lt_m: #|A / U| < m := leq_trans (ltn_quotient ntU sUA) leAm.
-have cAuAu: abelian (A / U) := quotient_abelian _ cAA.
-have pAu: p.-group (A / U) := quotient_pgroup _ pA.
-have p'Xu: p^'.-group (X / U) := quotient_pgroup _ p'X.
-have nXAu: X / U \subset 'N(A / U) := quotient_norms _ nAX.
-have{Au_lt_m p'Xu nXAu} [S defAu simS] := IHm _ _ _ Au_lt_m cAuAu pAu p'Xu nXAu.
-have sSAu: forall Ku, Ku \in S -> Ku \subset A / U.
- by move=> Ku S_Ku; rewrite -(bigdprodWY defAu) sub_gen // (bigcup_max Ku).
-have{B ntB sBAn tiBU} [Ku S_Ku eKu]: exists2 Ku, Ku \in S & exponent Ku == (p ^ n.+1)%N.
- apply/exists_inP; apply: contraR ntB; rewrite negb_exists_in -subG1 -tiBU.
- move/forall_inP=> expSpn; apply/subsetP=> x Ux; rewrite inE Ux coset_idr //.
- by rewrite (subsetP nUA) // (subsetP (Mho_sub n A)) // (subsetP sBAn).
- have [y Ay ->]: exists2 y, y \in A & x = y ^+ (p ^ n).
- by apply/imsetP; rewrite -MhoEabelian ?(subsetP sBAn).
- rewrite morphX ?(subsetP nUA) // (exponentP _ _ (mem_quotient _ Ay)) //.
- rewrite -sub_Ldiv -OhmEabelian ?(abelianS (Ohm_sub n _)) //=.
- rewrite (OhmE n pAu) /= -(bigdprodWY defAu) genS // subsetI sub_gen //=.
- apply/bigcupsP=> Ku S_Ku; rewrite sub_LdivT.
- have: exponent Ku %| p ^ n.+1.
- by rewrite (dvdn_trans (exponentS (sSAu _ S_Ku))) // -eA exponent_quotient.
- case/dvdn_pfactor=> // k le_k_n1 expKu; rewrite expKu dvdn_exp2l //.
- by rewrite -ltnS ltn_neqAle le_k_n1 -(eqn_exp2l _ _ p_gt1) -expKu expSpn.
-have{sSAu} [sKuA [homoKu nKuX minKu]] := (sSAu Ku S_Ku, simS Ku S_Ku).
-have [K defKu sUK sKA] := inv_quotientS nsUA sKuA.
-have [cKK cKuKu] := (abelianS sKA cAA, abelianS sKuA cAuAu).
-have [pK pKu] := (pgroupS sKA pA, pgroupS sKuA pAu).
-have nsUK: U <| K := normalS sUK sKA nsUA; have [_ nUK] := andP nsUK.
-have nKX: X \subset 'N(K).
- by rewrite -(quotientSGK nUX) ?normsG ?quotient_normG // -defKu.
-pose K1 := 'Mho^1(K); have nsK1K: K1 <| K := Mho_normal 1 K.
-have nXKb: X / K1 \subset 'N(K / K1) by apply: quotient_norms.
-pose K'u := \big[dprod/1]_(Bu in S :\ Ku) Bu.
-have{S_Ku} defAu_K: K / U \x K'u = A / U by rewrite -defKu -big_setD1.
-have [[_ Pu _ defK'u]] := dprodP defAu_K; rewrite defK'u => mulKPu _ tiKPu.
-have [_ sPuA] := mulG_sub mulKPu.
-have [P defPu sUP sPA] := inv_quotientS nsUA sPuA.
-have{simS defK'u} nPX: X \subset 'N(P).
- rewrite -(quotientSGK nUX) ?normsG // quotient_normG ?(normalS sUP sPA) //.
- rewrite -defPu -(bigdprodWY defK'u) norms_gen ?norms_bigcup //.
- by apply/bigcapsP=> Bu; case/setD1P=> _; case/simS.
-have abelKb: p.-abelem (K / K1).
- by rewrite -[K1](Phi_Mho pK) ?Phi_quotient_abelem.
-have p'Xb: p^'.-group (X / K1) := quotient_pgroup _ p'X.
-have sUKb: U / K1 \subset K / K1 := quotientS _ sUK.
-have nUXb: X / K1 \subset 'N(U / K1) := quotient_norms _ nUX.
-have tiUK1: U :&: K1 = 1.
- apply/trivgP; apply/subsetP=> xp; case/setIP=> Uxp K1xp.
- have{K1xp} [x Kx def_xp]: exists2 x, x \in K & xp = x ^+ p.
- by apply/imsetP; rewrite -(MhoEabelian 1).
- suffices A1x: x \in 'Ohm_1(A).
- by rewrite def_xp inE; case/abelemP: abelA1 => // _ ->.
- have nUx: x \in 'N(U) := subsetP nUK x Kx.
- rewrite -sub1set -(quotientSGK _ sUA1) ?quotient_set1 ?sub1set //.
- apply: (subsetP (quotientS U (subset_trans (MhoS n sKA) sAnA1))).
- rewrite quotientE morphim_Mho //= -quotientE -defKu.
- have ->: 'Mho^n(Ku) = 'Ohm_1(Ku).
- by rewrite (homocyclic_Ohm_Mho 1 pKu) // (eqP eKu) pfactorK ?subn1.
- rewrite (OhmE 1 pKu) ?mem_gen // !inE defKu mem_quotient //=.
- by rewrite -morphX //= -def_xp coset_id.
-have [Db defKb nDXb] := Maschke_abelem abelKb p'Xb sUKb nXKb nUXb.
-have [_ mulUDb _ tiUDb] := dprodP defKb; have [_ sDKb] := mulG_sub mulUDb.
-have [D defDb sK1D sDK] := inv_quotientS (Mho_normal 1 K) sDKb.
-have nK1X: X \subset 'N(K1) := gFnorm_trans _ nKX.
-have [cDU [sK1K nK1K]] := (centSS sUK sDK cKK, andP nsK1K).
-have nDX: X \subset 'N(D).
- rewrite -(quotientSGK nK1X) ?normsG // quotient_normG ?(normalS _ sDK) //.
- by rewrite -defDb.
-have{mulUDb} mulUD: U * D = K.
- rewrite (centC cDU) -(mulSGid sK1D) -mulgA -(centC cDU).
- rewrite -quotientK ?quotientMr ?(subset_trans _ nK1K) ?mul_subG // -defDb.
- by rewrite mulUDb quotientGK.
-have cKP: P \subset 'C(K) := centSS sPA sKA cAA.
-have mulKP: K * P = A.
- rewrite -(mulSGid sUK) -mulgA -(quotientGK nsUA) -mulKPu defPu.
- by rewrite -quotientK ?quotientMr ?mul_subG ?(subset_trans _ nUA).
-have defKP: K :&: P = U.
- apply/eqP; rewrite eqEsubset subsetI sUK sUP !andbT.
- by rewrite -quotient_sub1 ?subIset ?nUK // -tiKPu defPu quotientI.
-have tiUD: U :&: D = 1.
- apply/trivgP; rewrite -tiUK1 subsetI subsetIl.
- rewrite -quotient_sub1; last by rewrite subIset ?(subset_trans sUK).
- by rewrite -tiUDb defDb quotientI.
-have tiDP: D :&: P = 1 by rewrite -(setIidPl sDK) -setIA defKP setIC.
-have mulDP: D * P = A by rewrite -(mulSGid sUP) mulgA -(centC cDU) mulUD.
-have sDA := subset_trans sDK sKA.
-have defA: D \x P = A by rewrite dprodE // (centSS sPA sDA).
-have ntD: D :!=: 1.
- apply: contraNneq ntA => D1; rewrite trivg_exponent eA -(eqP eKu).
- rewrite -trivg_exponent -subG1 -tiKPu defKu subsetIidl defPu quotientS //.
- by rewrite -(mul1g P) -D1 mulDP.
-have ltPm: #|P| < m.
- by rewrite (leq_trans _ leAm) // -(dprod_card defA) ltn_Pmull ?cardG_gt1.
-have [cPP pP] := (abelianS sPA cAA, pgroupS sPA pA).
-have{S defAu K'u defAu_K} [S defP simS] := IHm _ _ _ ltPm cPP pP p'X nPX.
-exists (D |: S) => [ | {defP}B].
- rewrite big_setU1 ?defP //=; apply: contra ntD => S_D.
- by rewrite -subG1 -tiDP subsetIidl -(bigdprodWY defP) sub_gen ?(bigcup_max D).
-case/setU1P=> [-> {B S simS} | ]; last exact: simS.
-have [[pD cDD] nUD] := (pgroupS sDA pA, abelianS sDA cAA, subset_trans sDA nUA).
-have isoD: D \isog Ku by rewrite defKu -mulUD quotientMidl quotient_isog.
-rewrite {isoD}(isog_homocyclic isoD); split=> //.
-have nPhiDX: X \subset 'N('Phi(D)) := gFnorm_trans _ nDX.
-have [f [injf im_f act_f]]:
- exists f : {morphism D / 'Phi(D) >-> coset_of 'Phi(Ku)},
- [/\ 'injm f, f @* (D / 'Phi(D)) = Ku / 'Phi(Ku)
- & {in D / 'Phi(D) & X, morph_act 'Q 'Q f (coset U)}].
-- have [/= injf im_f] := isomP (quotient_isom nUD tiUD).
- set f := restrm nUD (coset U) in injf im_f.
- rewrite -quotientMidl mulUD -defKu in im_f.
- have fPhiD: f @* 'Phi(D) = 'Phi(Ku) by rewrite -im_f (morphim_Phi _ pD).
- rewrite -['Phi(Ku)]/(gval 'Phi(Ku)%G) -(group_inj fPhiD).
- exists (quotm_morphism [morphism of f] (Phi_normal _)).
- rewrite (injm_quotm _ injf) morphim_quotm /= -/f im_f.
- split=> // yb x; case/morphimP=> y Ny Dy ->{yb} Xx.
- have [nPhiDx nUx] := (subsetP nPhiDX x Xx, subsetP nUX x Xx).
- have Dyx: y ^ x \in D by rewrite memJ_norm // (subsetP nDX).
- rewrite quotmE // !qactE ?qact_domE ?subsetT ?astabsJ ?quotmE //=.
- - by congr (coset _ _); rewrite /f /restrm morphJ // (subsetP nUD).
- - by rewrite (subsetP (morphim_norm _ _)) ?mem_morphim.
- rewrite morphim_restrm (setIidPr (Phi_sub _)).
- by rewrite (subsetP (morphim_norm _ _)) ?mem_quotient.
-apply/mingroupP; split=> [|Y /andP[ntY actsXY] sYD].
- rewrite -subG1 quotient_sub1 ?gFnorm //.
- by rewrite proper_subn ?Phi_proper // actsQ.
-have{minKu} [_ minKu] := mingroupP minKu.
-apply: (injm_morphim_inj injf); rewrite // im_f.
-apply: minKu; last by rewrite /= -im_f morphimS.
-rewrite morphim_injm_eq1 // ntY.
-apply/subsetP=> _ /morphimP[x Nx Xx ->].
-rewrite 2!inE /= qact_domE ?subsetT // astabsJ.
-rewrite (subsetP (gFnorm_trans _ nKuX)) ?mem_quotient //=.
-apply/subsetP=> _ /morphimP[y Dy Yy ->].
-by rewrite inE /= -act_f // morphimEsub // mem_imset // (acts_act actsXY).
-Qed.
-
-CoInductive is_iso_quotient_homocyclic_sdprod gT (V G : {group gT}) m : Prop :=
- IsoQuotientHomocyclicSdprod wT (W D G1 : {group wT}) (f : {morphism D >-> gT})
- of homocyclic W & #|W| = (#|V| ^ m)%N
- & 'ker f = 'Mho^1(W) & f @* W = V & f @* G1 = G & W ><| G1 = D.
-
-Lemma iso_quotient_homocyclic_sdprod gT (V G : {group gT}) p m :
- minnormal V G -> coprime p #|G| -> p.-abelem V -> m > 0 ->
- is_iso_quotient_homocyclic_sdprod V G m.
-Proof.
-move=> minV copG abelV m_gt0; pose q := (p ^ m)%N.
-have [ntV nVG] := andP (mingroupp minV).
-have [p_pr pVdvdn [n Vpexpn]] := pgroup_pdiv (abelem_pgroup abelV) ntV.
-move/(abelem_mx_irrP abelV ntV nVG): (minV) => mx_irrV.
-have dim_lt0 : 'dim V > 0 by rewrite (dim_abelemE abelV) // Vpexpn pfactorK.
-have q_gt1: q > 1 by rewrite (ltn_exp2l 0) // prime_gt1.
-have p_q: p.-nat q by rewrite pnat_exp pnat_id.
-have p_dv_q: p %| q := dvdn_exp2l p m_gt0.
-pose rG := regular_repr [comUnitRingType of 'Z_q] G; pose MR_G := ('MR rG)%gact.
-have [wT [fL injL [fX injX fJ]]]: exists wT : finGroupType,
- exists2 fL : {morphism setT >-> wT}, 'injm fL &
- exists2 fX : {morphism G >-> wT}, 'injm fX &
- {in setT & G, morph_act MR_G 'J fL fX}.
-- exists (sdprod_groupType MR_G).
- exists (sdpair1_morphism MR_G); first exact: injm_sdpair1.
- by exists (sdpair2_morphism MR_G); [apply: injm_sdpair2 | apply: sdpair_act].
-move imfL: (fL @* [set: _])%G => L; move imfX: (fX @* G)%G => X.
-have cLL: abelian L by rewrite -imfL morphim_abelian // zmod_abelian.
-have pL: p.-group L.
- by rewrite -imfL morphim_pgroup -?pnat_exponent ?exponent_mx_group.
-have tiVG: V :&: G = 1 by rewrite coprime_TIg // Vpexpn coprime_pexpl.
-have{copG} p'G: p^'.-group G by rewrite /pgroup p'natE // -prime_coprime.
-have p'X: p^'.-group X by rewrite -imfX morphim_pgroup.
-have nXL: X \subset 'N(L).
- rewrite -imfX -imfL; apply/subsetP=> _ /morphimP[x Gx _ ->]; rewrite inE.
- apply/subsetP=> _ /imsetP[_ /morphimP[v rVv _ ->] ->].
- by rewrite -fJ // mem_morphim ?in_setT.
-have [/= S defL im_S] := coprime_act_abelian_pgroup_structure cLL pL p'X nXL.
-pose gi (z : 'Z_q) := z%:R : 'F_p.
-have giM: rmorphism gi.
- split=> [z1 z2|]; last split=> // z1 z2.
- apply: canRL (addrK _) _; apply: val_inj.
- by rewrite -{2}(subrK z2 z1) -natrD /= !val_Fp_nat ?modn_dvdm // Zp_cast.
- by apply: val_inj; rewrite -natrM /= !val_Fp_nat ?modn_dvdm // Zp_cast.
-have [gL [DgL _ _ _]] := domP (invm_morphism injL) (congr_group imfL).
-pose g u := map_mx (RMorphism giM) (gL u).
-have gM: {in L &, {morph g : u v / u * v}}.
- by move=> u v Lu Lv /=; rewrite {1}/g morphM // map_mxD.
-have kerg: 'ker (Morphism gM) = 'Phi(L).
- rewrite (Phi_Mho pL cLL) (MhoEabelian 1 pL cLL).
- apply/setP=> u; apply/idP/imsetP=> [ | [v Lv ->{u}]]; last first.
- rewrite !inE groupX //=; apply/eqP/rowP=> i; apply: val_inj.
- rewrite !mxE morphX // mulmxnE Zp_mulrn /= val_Fp_nat //=.
- by move: {i}(_ i); rewrite Zp_cast // => vi; rewrite modn_dvdm // modnMl.
- case/morphpreP; rewrite -{1}imfL => /morphimP[v rVv _ ->{u}] /set1P /=.
- rewrite /g DgL /= invmE // => /rowP vp0.
- pose x := fL (map_mx (fun t : 'Z_q => (t %/ p)%:R) v).
- exists x; first by rewrite -imfL mem_morphim ?inE.
- rewrite -morphX ?in_setT //; congr (fL _); apply/rowP=> i.
- rewrite mulmxnE -{1}(natr_Zp (v 0 i)) {1}(divn_eq (v 0 i) p) addnC.
- by have:= congr1 val (vp0 i); rewrite !mxE -mulrnA /= val_Fp_nat // => ->.
-have [gX [DgX KgX _ imgX]] := domP (invm_morphism injX) (congr_group imfX).
-pose aG := regular_repr [fieldType of 'F_p] G.
-have GgX: {in X, forall x, gX x \in G}.
- by rewrite DgX -imfX => _ /morphimP[x Gx _ ->]; rewrite /= invmE.
-have XfX: {in G, forall x, fX x \in X}.
- by move=> x Gx; rewrite -imfX mem_morphim.
-have gJ: {in L & X, forall u x, g (u ^ x) = g u *m aG (gX x)}.
- rewrite -{1}imfL -{1}imfX => _ _ /morphimP[u rVu _ ->] /morphimP[x Gx _ ->].
- rewrite -fJ // /g DgL DgX /= !invmE // mx_repr_actE ?inE //.
- by rewrite (map_mxM (RMorphism giM)) map_regular_mx.
-pose gMx U := rowg_mx (Morphism gM @* U).
-have simS: forall U, U \in S -> mxsimple aG (gMx U).
- move=> U S_U; have [_ nUX irrU] := im_S U S_U.
- have{irrU} [modU irrU] := mingroupP irrU; have{modU} [ntU _] := andP modU.
- have sUL: U \subset L by rewrite -(bigdprodWY defL) sub_gen // (bigcup_max U).
- split=> [||U2 modU2].
- - rewrite (eqmx_module _ (genmxE _)); apply/mxmoduleP=> x Gx.
- apply/row_subP=> i; rewrite row_mul rowK.
- have [u Lu Uu def_u] := morphimP (enum_valP i).
- rewrite -(invmE injX Gx) -DgX def_u -gJ ?XfX //.
- set ux := u ^ _; apply: eq_row_sub (gring_index _ (g ux)) _.
- have Uux: ux \in U by rewrite memJ_norm // (subsetP nUX) ?XfX.
- by rewrite rowK gring_indexK //; apply: mem_morphim; rewrite ?(subsetP sUL).
- - apply: contra ntU; rewrite rowg_mx_eq0.
- rewrite -subG1 sub_morphim_pre // -kerE kerg => sU_Phi.
- rewrite /= quotientS1 //=; rewrite (big_setD1 U) //= in defL.
- have{defL} [[_ U' _ ->] defUU' cUU' tiUU'] := dprodP defL.
- have defL: U \* U' = L by rewrite cprodE.
- have:= cprod_modl (Phi_cprod pL defL) (Phi_sub U).
- rewrite -(setIidPl (Phi_sub U')) setIAC -setIA tiUU' setIg1 cprodg1 => ->.
- by rewrite subsetIidr.
- rewrite -!rowgS stable_rowg_mxK /= => [sU2gU nzU2|]; last first.
- apply/subsetP=> z _; rewrite !inE /=; apply/subsetP=> u gUu.
- by rewrite inE /= /scale_act -[val z]natr_Zp scaler_nat groupX.
- rewrite sub_morphim_pre // -subsetIidl.
- rewrite -(quotientSGK (normal_norm (Phi_normal U))) //=; last first.
- rewrite subsetI Phi_sub (subset_trans (PhiS pL sUL)) //.
- by rewrite -kerg ker_sub_pre.
- rewrite [(U :&: _) / _]irrU //; last by rewrite quotientS ?subsetIl.
- rewrite (contra _ nzU2) /=; last first.
- rewrite -subG1 quotient_sub1; last first.
- by rewrite subIset // normal_norm // Phi_normal.
- rewrite /= -(morphpre_restrm sUL).
- move/(morphimS (restrm_morphism sUL (Morphism gM))).
- rewrite morphpreK ?im_restrm // morphim_restrm => s_U2_1.
- rewrite -trivg_rowg -subG1 (subset_trans s_U2_1) //.
- rewrite -(morphim_ker (Morphism gM)) morphimS // kerg.
- by rewrite subIset ?(PhiS pL) ?orbT.
- rewrite actsQ //; first by rewrite gFnorm_trans.
- rewrite normsI //; apply/subsetP=> x Xx; rewrite inE.
- apply/subsetP=> _ /imsetP[u g'U2u ->].
- have [Lu U2gu] := morphpreP g'U2u; rewrite mem_rowg in U2gu.
- rewrite inE memJ_norm ?(subsetP nXL) // Lu /= inE gJ //.
- by rewrite mem_rowg (mxmodule_trans modU2) ?GgX.
-have im_g: Morphism gM @* L = [set: 'rV_#|G|].
- apply/eqP; rewrite eqEcard subsetT cardsT card_matrix card_Fp //= mul1n.
- rewrite card_morphim kerg setIid (Phi_Mho pL cLL) -divgS ?Mho_sub //.
- rewrite -(mul_card_Ohm_Mho_abelian 1 cLL) mulnK ?cardG_gt0 //.
- rewrite (card_pgroup (pgroupS (Ohm_sub 1 L) pL)) -rank_abelian_pgroup //.
- by rewrite -imfL (injm_rank injL) //= rank_mx_group mul1n.
-have sumS: (\sum_(U in S) gMx U :=: 1%:M)%MS.
- apply/eqmxP; rewrite submx1; apply/rV_subP=> v _.
- have: v \in Morphism gM @* L by rewrite im_g inE.
- case/morphimP=> u Lu _ ->{v}.
- rewrite -mem_rowg -sub1set -morphim_set1 // sub_morphim_pre ?sub1set //.
- have [c [Uc -> _]] := mem_bigdprod defL Lu; rewrite group_prod //= => U S_U.
- have sUL: U \subset L by rewrite -(bigdprodWY defL) sub_gen // (bigcup_max U).
- rewrite inE (subsetP sUL) ?Uc // inE mem_rowg (sumsmx_sup U) // -mem_rowg.
- by rewrite (subsetP (sub_rowg_mx _)) // mem_morphim ?(subsetP sUL) ?Uc.
-have Fp'G: [char 'F_p]^'.-group G.
- by rewrite (eq_p'group _ (charf_eq (char_Fp p_pr))).
-have [VK [modVK defVK]] := rsim_regular_submod mx_irrV Fp'G.
-have [U S_U isoUV]: {U | U \in S & mx_iso (regular_repr _ G) (gMx U) VK}.
- apply: hom_mxsemisimple_iso (scalar_mx_hom _ 1 _) _ => [|U S_U _|]; auto.
- by apply/(submod_mx_irr modVK); apply: (mx_rsim_irr defVK).
- by rewrite mulmx1 sumS submx1.
-have simU := simS U S_U; have [modU _ _] := simU.
-pose rV := abelem_repr abelV ntV nVG.
-have{VK modVK defVK isoUV} [h dimU h_free hJ]: mx_rsim (submod_repr modU) rV.
- by apply: mx_rsim_trans (mx_rsim_sym defVK); apply/mx_rsim_iso.
-have sUL : U \subset L.
- by move: defL; rewrite (big_setD1 U) //= => /dprodP[[_ U1 _ ->] /mulG_sub[]].
-pose W := [set: 'rV['Z_(p ^ m)](V)]%G.
-have [homU nUX _] := im_S U S_U; have [cUU _] := andP homU.
-have atypeU: abelian_type U == nseq ('dim V) (p ^ m)%N.
- rewrite (big_setD1 U) //= in defL.
- have [[_ U' _ defU'] defUU' _ tiUU'] := dprodP defL.
- rewrite defU' in defL defUU' tiUU'.
- have ->: 'dim V = 'r(U).
- apply/eqP; rewrite -dimU -(eqn_exp2l _ _ (prime_gt1 p_pr)).
- rewrite (rank_abelian_pgroup (pgroupS sUL pL) cUU).
- rewrite -(card_pgroup (pgroupS (Ohm_sub 1 U) (pgroupS sUL pL))).
- rewrite -{1}(card_Fp p_pr) -card_rowg stable_rowg_mxK; last first.
- apply/subsetP=> z _; rewrite !inE; apply/subsetP=> v gUv.
- by rewrite inE /= /scale_act -(natr_Zp (val z)) scaler_nat groupX.
- rewrite card_morphim kerg (Phi_Mho pL cLL) (setIidPr sUL) -divgI setIC.
- rewrite -(dprod_modl (Mho_dprod 1 defL) (Mho_sub 1 U)).
- rewrite [_ :&: _](trivgP _); last by rewrite -tiUU' setIC setSI ?Mho_sub.
- by rewrite dprodg1 -(mul_card_Ohm_Mho_abelian 1 cUU) mulnK ?cardG_gt0.
- have isoL: isog L [set: 'rV['Z_q]_#|G|] by rewrite -imfL isog_sym sub_isog.
- have homL: homocyclic L by rewrite (isog_homocyclic isoL) mx_group_homocyclic.
- have [-> _] := abelian_type_dprod_homocyclic defL pL homL.
- by rewrite (exponent_isog isoL) // exponent_mx_group.
-have pU: p.-group U by rewrite (pgroupS sUL).
-have isoWU: isog U W.
- by rewrite eq_abelian_type_isog ?zmod_abelian // abelian_type_mx_group ?mul1n.
-have {cUU atypeU} cardU : #|U| = (#|V| ^ m)%N.
- rewrite card_homocyclic // (exponent_isog isoWU) exponent_mx_group //.
- rewrite -size_abelian_type // (eqP atypeU) size_nseq.
- by rewrite (dim_abelemE abelV) // Vpexpn pfactorK // expnAC.
-pose f3 w := rVabelem abelV ntV (in_submod _ (g w) *m h).
-have f3M: {in U &, {morph f3: w1 w2 / w1 * w2}}.
- move=> w1 w2 Uw1 Uw2 /=; rewrite {1}/f3.
- rewrite gM ?(subsetP sUL) // linearD mulmxDl.
- by rewrite morphM ?mem_im_abelem_rV.
-have Ugw w : w \in U -> (g w <= gMx U)%MS.
- move=> Uw; rewrite -mem_rowg (subsetP (sub_rowg_mx _)) //.
- by rewrite (mem_morphim (Morphism gM)) ?(subsetP sUL).
-have KgU: 'ker_U (Morphism gM) = 'Mho^1(U).
- rewrite kerg (Phi_Mho pL cLL); rewrite (big_setD1 U) //= in defL.
- have [[_ U' _ defU'] _ _ tiUU'] := dprodP defL; rewrite defU' in defL tiUU'.
- rewrite setIC -(dprod_modl (Mho_dprod 1 defL) (Mho_sub 1 U)).
- by rewrite [_ :&: _](trivgP _) ?dprodg1 // -tiUU' setIC setSI ?Mho_sub.
-have{KgU} Kf3: 'ker (Morphism f3M) = 'Mho^1(U).
- apply/setP=> w; rewrite !inE /=.
- rewrite morph_injm_eq1 ?rVabelem_injm ?mem_im_abelem_rV //=.
- rewrite -[1](mul0mx _ h) (inj_eq (row_free_inj h_free)) in_submod_eq0.
- case Uw: (w \in U) => /=; last first.
- by apply/sym_eq; apply: contraFF Uw; apply: (subsetP (Mho_sub _ _)).
- rewrite -[(_ <= _)%MS]andTb -(Ugw _ Uw) -sub_capmx capmx_compl submx0.
- by rewrite -KgU !inE Uw (subsetP sUL).
-have cUU: abelian U := abelianS sUL cLL.
-have im_f3: Morphism f3M @* U = V.
- apply/eqP; rewrite eqEcard card_morphim setIid Kf3; apply/andP; split.
- by apply/subsetP=> _ /morphimP[w _ _ ->]; apply: mem_rVabelem.
- rewrite -divgS ?Mho_sub // -(mul_card_Ohm_Mho_abelian 1 cUU).
- rewrite mulnK ?cardG_gt0 // (card_pgroup (pgroupS (Ohm_sub 1 U) pU)).
- rewrite -rank_abelian_pgroup // (isog_rank isoWU) /W.
- by rewrite (dim_abelemE abelV) // rank_mx_group mul1n Vpexpn pfactorK.
-have f3J: {in U & X, morph_act 'J 'J (Morphism f3M) gX}.
- move=> u x Uu Xx; rewrite /f3 /= gJ ?(subsetP sUL) // in_submodJ ?Ugw //.
- by rewrite -mulmxA hJ ?GgX // mulmxA rVabelemJ ?GgX.
-have defUX: U ><| X = U <*> X.
- rewrite norm_joinEr; last by case: (im_S _ S_U).
- by rewrite sdprodE ?coprime_TIg ?(pnat_coprime pU).
-pose f := sdprodm defUX f3J.
-have{im_f3} fU_V: f @* U = V by rewrite morphim_sdprodml.
-have fX_G: f @* X = G by rewrite morphim_sdprodmr // imgX -imfX im_invm.
-suffices: 'ker f = 'Mho^1(U) by exists wT U (U <*> X)%G X [morphism of f].
-rewrite -Kf3; apply/setP=> y; apply/idP/idP; last first.
- move=> /morphpreP[/= Uy /set1P f3y].
- by rewrite !inE /= sdprodmEl //= f3y (subsetP (joing_subl _ X)) /=.
-rewrite ker_sdprodm => /imset2P[u t Uu /setIdP[Xt /eqP/= fu] ->{y}].
-have: f3 u \in V :&: G.
- by rewrite inE -fU_V morphim_sdprodml //= mem_imset ?setIid // fu GgX.
-rewrite tiVG in_set1 fu morph_injm_eq1 ?KgX ?injm_invm // => /eqP t1.
-by rewrite t1 invg1 mulg1 !inE Uu /= fu t1 morph1.
-Qed.
-
-Theorem solvable_Wielandt_fixpoint (I : finType) gT (A : I -> {group gT})
- (n m : I -> nat) (G V : {group gT}) :
- (forall i, m i + n i > 0 -> A i \subset G) ->
- G \subset 'N(V) -> coprime #|V| #|G| -> solvable V ->
- {in G, forall a, \sum_(i | a \in A i) m i = \sum_(i | a \in A i) n i}%N ->
- (\prod_i #|'C_V(A i)| ^ (m i * #|A i|)
- = \prod_i #|'C_V(A i)| ^ (n i * #|A i|))%N.
-Proof.
-move: {2}_.+1 (ltnSn #|V|) => c leVc sA_G nVG coVG solV partG; move: leVc.
-pose nz_k i := (0 < m i + n i)%N; rewrite !(bigID nz_k xpredT) /= {2 4}/nz_k.
-rewrite !(big1 _ (predC _)) /= => [|i|i]; try by case: (m i) (n i) => [[]|].
-pose sum_k A_ a k := (\sum_(i | (a \in (A_ i : {set _})) && nz_k i) k i)%N.
-have{partG} partG: {in G, forall a, sum_k _ A a m = sum_k _ A a n}.
- move=> a /partG; rewrite !(bigID nz_k (fun i => a \in _)) -!/(sum_k _ A a _).
- by rewrite /= !big1 ?addn0 /nz_k // => i /andP[_]; case: (m i) (n i) => [[]|].
-rewrite !muln1; elim: c => // c IHc in gT G A V nVG coVG solV partG sA_G *.
-rewrite ltnS => leVc; have [-> | ntV] := eqsVneq V 1.
- by rewrite !big1 // => i _; rewrite setI1g cards1 exp1n.
-have nsVVG: V <| V <*> G by rewrite normalYl.
-without loss{c leVc IHc} minV: / minnormal V (V <*> G).
- have [B minB sBV]: {B : {group gT} | minnormal B (V <*> G) & B \subset V}.
- by apply: mingroup_exists; rewrite ntV normal_norm.
- have [nBVG ntB abB] := minnormal_solvable minB sBV solV.
- have [nBV nBG] := joing_subP nBVG; have solB := solvableS sBV solV.
- have [{1}<- -> // | ltBV _] := eqVproper sBV.
- have ltBc: #|B| < c := leq_trans (proper_card ltBV) leVc.
- have coBG: coprime #|B| #|G| := coprimeSg sBV coVG.
- have factorCA_B k i: nz_k i ->
- (#|'C_B(A i)| ^ (k i * #|A i|) * #|'C_(V / B)(A i / B)| ^ (k i * #|A i / B|)
- = #|'C_V(A i)| ^ (k i * #|A i|))%N.
- - move/sA_G => sAiG; have nBAi := subset_trans sAiG nBG.
- have [coVAi coBAi] := (coprimegS sAiG coVG, coprimegS sAiG coBG).
- rewrite -(card_isog (quotient_isog _ _)) ?(coprime_TIg coBAi) // -expnMn.
- rewrite -coprime_quotient_cent // -{1}(setIidPr sBV) setIAC.
- by rewrite card_quotient ?LagrangeI // subIset ?nBV.
- rewrite -!{1}(eq_bigr _ (factorCA_B _)) {factorCA_B} !big_split /=.
- pose A_B i := A i / B; congr (_ * _)%N; first exact: (IHc _ G).
- have: #|V / B| < c by apply: leq_trans leVc; rewrite ltn_quotient.
- have (i): nz_k i -> A i / B \subset G / B by move/sA_G/quotientS->.
- apply: IHc; rewrite ?morphim_sol ?coprime_morph ?quotient_norms //.
- move=> _ /morphimP[a Na Ga ->].
- suffices eqAB: sum_k _ A_B (coset B a) =1 sum_k _ A a by rewrite !eqAB partG.
- move=> k; apply: eq_bigl => i; apply: andb_id2r => /sA_G sAiG.
- rewrite -sub1set -quotient_set1 // quotientSK ?sub1set //.
- by rewrite -{2}(mul1g (A i)) -(coprime_TIg coBG) setIC group_modr // inE Ga.
-have /is_abelemP[p p_pr abelV] := minnormal_solvable_abelem minV solV.
-have [p_gt1 [pV cVV _]] := (prime_gt1 p_pr, and3P abelV).
-have{minV} minV: minnormal V G.
- apply/mingroupP; split=> [|B nBG sBV]; first by rewrite ntV nVG.
- by case/mingroupP: minV => _ -> //; rewrite join_subG (sub_abelian_norm cVV).
-have co_pG: coprime p #|G|.
- by have [_ _ [e oV]] := pgroup_pdiv pV ntV; rewrite oV coprime_pexpl in coVG.
-have p'G: p^'.-group G by rewrite pgroupE p'natE -?prime_coprime.
-pose rC i := logn p #|'C_V(A i)|.
-have ErC k i: (#|'C_V(A i)| ^ (k i * #|A i|) = p ^ (rC i * k i * #|A i|))%N.
- suffices /card_pgroup->: p.-group 'C_V(A i) by rewrite -expnM mulnA.
- by rewrite (pgroupS (subsetIl _ _)).
-rewrite !{1}(eq_bigr _ (fun i _ => ErC _ i)) {ErC} -!expn_sum; congr (_ ^ _)%N.
-have eqmodX x y: (forall e, x = y %[mod p ^ e]) -> x = y.
- pose e := maxn x y; move/(_ e); have:= ltn_expl e p_gt1.
- by rewrite gtn_max /= => /andP[x_ltq y_ltq]; rewrite !modn_small.
-apply: eqmodX => e; have [-> | e_gt0] := posnP e; first by rewrite !modn1.
-set q := (p ^ e)%N; have q_gt1: q > 1 by rewrite -(exp1n e) ltn_exp2r.
-have{e_gt0 co_pG} [wT W D G1 f homoW oW kerf imfW imfG1 defD] :=
- iso_quotient_homocyclic_sdprod minV co_pG abelV e_gt0.
-have [[cWW _] [_ /mulG_sub[sWD sG1D] nWG1 tiWG1]] := (andP homoW, sdprodP defD).
-have pW: p.-group W by rewrite /pgroup oW pnat_exp [p.-nat _]pV.
-have rW_V: 'r(W) = 'dim V.
- rewrite (rank_abelian_pgroup pW cWW) -(mulnK #|_| (cardG_gt0 'Mho^1(W))).
- rewrite mul_card_Ohm_Mho_abelian // divg_normal ?Mho_normal //=.
- rewrite -(setIidPr (Mho_sub 1 W)) -kerf.
- by rewrite (card_isog (first_isog_loc _ _)) //= imfW (dim_abelemE abelV).
-have expW: exponent W = q.
- apply/eqP; rewrite -(@eqn_exp2r _ _ ('dim V)) // -{1}rW_V -expnM mulnC expnM.
- by rewrite (dim_abelemE abelV) -?card_pgroup // -oW eq_sym max_card_abelian.
-have{rW_V} /isogP[fW injfW im_fW]: [set: 'rV['Z_q](V)] \isog W.
- rewrite eq_abelian_type_isog ?zmod_abelian // abelian_type_mx_group ?mul1n //.
- by rewrite abelian_type_homocyclic // rW_V expW.
-have WfW u: fW u \in W by rewrite -im_fW mem_morphim ?inE.
-have [fW' [DfW' KfW' _ _]] := domP (invm_morphism injfW) im_fW.
-have{KfW'} injfW': 'injm fW' by rewrite KfW' injm_invm.
-have fW'K: {in W, cancel fW' fW} by move=> w Ww; rewrite DfW' invmK //= im_fW.
-have toWlin a1: linear (fun u => fW' (fW u ^ val (subg G1 a1))).
- move=> z /= x y; rewrite (morphM fW) /= ?in_setT // conjMg /=.
- rewrite morphM ?memJ_norm ?(subsetP nWG1) ?subgP //=; congr (_ * _).
- rewrite -(natr_Zp z) !scaler_nat morphX ?in_setT // conjXg morphX //.
- by rewrite memJ_norm // (subsetP nWG1) ?subgP.
-pose rW a1 := lin1_mx (Linear (toWlin a1)).
-pose fG := restrm sG1D f; have im_fG : fG @* G1 = G by rewrite im_restrm.
-have injfG: 'injm fG by rewrite -tiWG1 setIC ker_restrm kerf setIS ?Mho_sub.
-pose fG' := invm injfG; have im_fG': fG' @* G = G1 by rewrite -im_fG im_invm.
-pose gamma i := \sum_(a in A i) rW (fG' a).
-suffices{sum_k partG} tr_rW_Ai i: nz_k i -> \tr (gamma i) = (rC i * #|A i|)%:R.
- have Dtr k i: nz_k i -> (rC i * k i * #|A i|)%:R = \tr (gamma i *+ k i).
- by rewrite mulnAC natrM raddfMn mulr_natr /= => /tr_rW_Ai->.
- rewrite -!val_Zp_nat // !natr_sum !{1}(eq_bigr _ (Dtr _)){Dtr}; congr (val _).
- rewrite -!raddf_sum -!(eq_bigr _ (fun i _ => sumrMnl _ _ _ _)); congr (\tr _).
- have sA_GP i a nz_i := subsetP (sA_G i nz_i) a.
- rewrite !(exchange_big_dep (mem G)) {sA_GP}//=; apply: eq_bigr => a Ga.
- by rewrite !sumrMnr !(big_andbC _ _ _ nz_k) -!/(sum_k _ A a _) partG.
-move/sA_G=> {sA_G} sAiG; pose Ai1 := fG' @* A i; pose rR := 'r([~: W, Ai1]).
-have sAiG1: Ai1 \subset G1 by rewrite -im_fG' morphimS.
-have AfG' a: a \in A i -> fG' a \in Ai1.
- by move=> Aa; rewrite mem_morphim //= im_restrm imfG1 ?(subsetP sAiG).
-have coWAi1: coprime #|W| #|Ai1|.
- by rewrite coprime_morphr ?(coprimegS sAiG) ?(pnat_coprime pW).
-suffices [Pl [Pr [Pu [Pd [PlrudK ErC ErR]]]]]:
- exists Pl, exists Pr, exists Pu, exists Pd,
- [/\ row_mx Pl Pr *m col_mx Pu Pd = 1%R,
- {in A i, forall a, Pd *m (rW (fG' a) *m Pr) = 1%:M :> 'M_(rC i)}
- & \sum_(a in A i) Pu *m (rW (fG' a) *m Pl) = 0 :> 'M_rR].
-- rewrite -(mulmx1 (gamma i)) idmxE -PlrudK mulmxA mxtrace_mulC mul_mx_row.
- rewrite mul_col_row mxtrace_block !mulmx_suml !mulmx_sumr ErR mxtrace0 add0r.
- by rewrite (eq_bigr _ ErC) sumr_const raddfMn /= mxtrace1 natrM mulr_natr.
-have defW: [~: W, Ai1] \x 'C_W(Ai1) = W.
- by rewrite coprime_abelian_cent_dprod ?(subset_trans sAiG1).
-have [_ mulRCW _ tiRCW] := dprodP defW; have [sRW sCW] := mulG_sub mulRCW.
-have [homoRW homoCW] := dprod_homocyclic defW pW homoW.
-have [] := abelian_type_dprod_homocyclic defW pW homoW.
-rewrite expW -/rR => atypeRW atypeCW.
-have [[cRR _] [cCC _]] := (andP homoRW, andP homoCW).
-have{cRR atypeRW} /isogP[hR injhR im_hR]: [~: W, Ai1] \isog [set: 'rV['Z_q]_rR].
- rewrite eq_abelian_type_isog ?zmod_abelian ?atypeRW //.
- by rewrite abelian_type_mx_group // mul1n eqxx.
-have{tiRCW} rCW : 'r('C_W(Ai1)) = rC i.
- rewrite -['r(_)]rank_Ohm1; have /rank_abelem ->: p.-abelem 'Ohm_1('C_W(Ai1)).
- by rewrite Ohm1_abelem ?(pgroupS (subsetIl _ _)).
- congr (logn p _); transitivity #|'C_W(Ai1) : 'Mho^1('C_W(Ai1))|.
- by rewrite -divgS ?Mho_sub // -(mul_card_Ohm_Mho_abelian 1 cCC) mulnK.
- transitivity #|'C_W(Ai1) : 'Mho^1(W)|.
- symmetry; have /dprodP[_ /= defW1 _ _] := Mho_dprod 1 defW.
- rewrite -indexgI; congr #|_ : _|; rewrite /= -defW1 -group_modr ?Mho_sub //.
- by rewrite [_ :&: _](trivgP _) ?mul1g //= setIC -tiRCW setSI ?Mho_sub.
- suffices /card_isog ->: 'C_V(A i) \isog 'C_W(Ai1) / 'Mho^1(W).
- by rewrite card_quotient // subIset // normal_norm ?Mho_normal.
- rewrite coprime_quotient_cent ?Mho_sub ?abelian_sol //= -/Ai1; last first.
- by rewrite (subset_trans sAiG1) // gFnorm_trans.
- have ->: A i :=: fG @* Ai1.
- by rewrite /Ai1 morphim_invmE morphpreK // im_restrm imfG1.
- rewrite -imfW morphim_restrm (setIidPr sAiG1).
- have [f1 injf1 im_f1] := first_isom f.
- rewrite -!im_f1 -injm_subcent ?quotientS ?(subset_trans sAiG1) //.
- by rewrite -kerf isog_sym sub_isog // subIset ?quotientS.
-have{atypeCW} /isogP[hC injhC im_hC]: 'C_W(Ai1) \isog [set: 'rV['Z_q]_(rC i)].
- rewrite eq_abelian_type_isog ?zmod_abelian // atypeCW rCW.
- by rewrite abelian_type_mx_group ?mul1n.
-have mkMx m1 m2 (U : {group 'rV['Z_q]_m1}) (g : {morphism U >-> 'rV['Z_q]_m2}):
- setT \subset 'dom g -> {Mg | mulmx^~ Mg =1 g}.
-- move/subsetP=> allU; suffices lin_g: linear g.
- by exists (lin1_mx (Linear lin_g)) => u; rewrite mul_rV_lin1.
- move=> z u v; rewrite morphM ?allU ?in_setT //.
- by rewrite -(natr_Zp z) !scaler_nat -zmodXgE morphX ?allU ?in_setT.
-have /mkMx[Pu defPu]: setT \subset 'dom (invm injfW \o invm injhR).
- by rewrite -sub_morphim_pre -im_hR // im_invm //= im_fW.
-have /mkMx[Pd defPd]: setT \subset 'dom (invm injfW \o invm injhC).
- by rewrite -sub_morphim_pre -im_hC //= im_fW im_invm subsetIl.
-pose fUl := pairg1 [finGroupType of 'rV['Z_q]_(rC i)] \o hR.
-pose fUr := @pair1g [finGroupType of 'rV['Z_q]_rR] _ \o hC.
-have cRCW: fUr @* 'C_W(Ai1) \subset 'C(fUl @* [~: W, Ai1]).
- rewrite !morphim_comp morphim_pair1g morphim_pairg1.
- set UR := hR @* _; set UC := hC @* _.
- by have/dprodP[] : _ = setX UR UC := setX_dprod _ _.
-have /domP[fUr' [DfUr' _ _ im_fUr']]: 'dom fUr = 'C_W(Ai1).
- by rewrite /dom -im_hC injmK.
-have /domP[fUl' [DfUl' _ _ im_fUl']]: 'dom fUl = [~: W, Ai1].
- by rewrite /dom -im_hR injmK.
-rewrite -{}im_fUr' -{}im_fUl' in cRCW; pose hW := dprodm defW cRCW.
-pose fPl := @fst _ _ \o (hW \o fW); pose fPr := @snd _ _ \o (hW \o fW).
-have /mkMx[/= Pl defPl]: setT \subset 'dom fPl.
- by rewrite -!sub_morphim_pre ?subsetT ?im_fW.
-have /mkMx[/= Pr defPr]: setT \subset 'dom fPr.
- by rewrite -!sub_morphim_pre ?subsetT ?im_fW.
-exists Pl, Pr, Pu, Pd; split.
-- apply/row_matrixP=> j; rewrite rowE -row1 mul_row_col mulmxDr !mulmxA.
- apply: (injmP injfW); rewrite ?in_setT // morphM ?in_setT //.
- rewrite defPl defPr defPu defPd -/hW [hW]lock /= -lock.
- have /(mem_dprod defW)[jR [jC [RjR CjC -> _]]]:= WfW (row j 1).
- rewrite [hW _]dprodmE // DfUl' DfUr' /= mulg1 mul1g !invmE // -DfW'.
- by rewrite !fW'K ?(subsetP sRW jR) ?(subsetP sCW).
-- move=> a Aa; apply/row_matrixP=> j; pose jC := invm injhC (row j 1%:M).
- rewrite rowE -row1 !mulmxA defPd defPr -/hW [hW]lock /= mul_rV_lin1 /= -lock.
- have CjC: jC \in 'C_W(Ai1).
- by rewrite -(im_invm injhC) mem_morphim /= ?im_hC ?inE.
- have [[/fW'K id_jC /centP cA1jC] A1a] := (setIP CjC, AfG' a Aa).
- rewrite -DfW' id_jC subgK ?(subsetP sAiG1) // /conjg cA1jC // mulKg id_jC.
- by rewrite [hW _]dprodmEr ?DfUr' //= invmK ?im_hC ?inE.
-apply/row_matrixP=> j; pose jR := invm injhR (row j 1%:M).
-have RjR: jR \in [~: W, Ai1].
- by rewrite -(im_invm injhR) mem_morphim /= ?im_hR ?inE.
-rewrite rowE -row1 mulmx_sumr raddf0 -/jR.
-have /subsetP nRA1: Ai1 \subset 'N([~: W, Ai1]) by rewrite commg_normr.
-transitivity (\sum_(a1 in Ai1) hR (jR ^ a1)).
- rewrite {1}[Ai1 in rhs in _ = rhs]morphimEsub /= ?im_restrm ?imfG1 //.
- rewrite big_imset /=; last first.
- apply: sub_in2 (injmP (injm_invm injfG)); apply/subsetP.
- by rewrite /= im_restrm imfG1.
- apply: eq_bigr => a /AfG' A1a.
- have RjRa: jR ^ fG' a \in [~: W, Ai1] by rewrite memJ_norm ?nRA1.
- rewrite !mulmxA defPu defPl mul_rV_lin1 -/hW [hW]lock /= -lock.
- rewrite subgK ?(subsetP sAiG1) // -DfW' !fW'K ?(subsetP sRW) //.
- by rewrite [hW _]dprodmEl // DfUl'.
-have [nf [fj Rfj ->]] := gen_prodgP RjR.
-transitivity (\sum_(a1 in Ai1) (\prod_i1 hR (fj i1 ^ a1))%g).
- apply: eq_bigr => a1 Aa1; rewrite conjg_prod morph_prod // => i1 _.
- by rewrite memJ_norm ?mem_gen ?nRA1.
-rewrite exchange_big big1 //= => i1 _; have /imset2P[w a1 Ww Aa1 ->] := Rfj i1.
-apply: (addrI (\sum_(a2 in Ai1) hR [~ w, a2])).
-rewrite addr0 {2}(reindex_inj (mulgI a1)) -big_split /=.
-apply: eq_big => [a2 | a2 Aa2]; first by rewrite groupMl.
-by rewrite commgMJ [rhs in _ = rhs]morphM ?memJ_norm ?nRA1 ?mem_commg ?groupM.
-Qed.